diff --git a/.circleci/config.yml b/.circleci/config.yml index a2f3ab460f9..29b4187c24a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -323,18 +323,9 @@ jobs: - run: name: 'Deploy - Web Client - Terraform' command: docker run -e "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}" -e "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}" -e "EFCMS_DOMAIN=${EFCMS_DOMAIN}" -e "DYNAMSOFT_S3_ZIP_PATH=${DYNAMSOFT_S3_ZIP_PATH}" -e "DYNAMSOFT_URL=${DYNAMSOFT_URL}" -e "DYNAMSOFT_PRODUCT_KEYS=${DYNAMSOFT_PRODUCT_KEYS}" -e "IS_DYNAMSOFT_ENABLED=${IS_DYNAMSOFT_ENABLED}" --rm efcms /bin/sh -c "cd web-client/terraform/main && ../bin/deploy-app.sh $ENV" - - run: - name: 'Setup SNS Subscription' - command: docker run -e "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}" -e "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}" -e "COGNITO_SUFFIX=${COGNITO_SUFFIX}" -e "AWS_ACCOUNT_ID=${AWS_ACCOUNT_ID}" -e "EFCMS_DOMAIN=${EFCMS_DOMAIN}" -e "SES_DMARC_EMAIL=${SES_DMARC_EMAIL}" -e "ES_INSTANCE_COUNT=${ES_INSTANCE_COUNT}" --rm efcms /bin/sh -c "cd web-api && ./setup-sns-subscriptions.sh ${ENV}" - run: name: Setup Elasticsearch Index Settings command: docker run -e "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}" -e "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}" -e "EFCMS_DOMAIN=${EFCMS_DOMAIN}" --rm efcms /bin/sh -c "./web-api/setup-elasticsearch-index.sh ${ENV}" - - run: - name: 'Deploy - Web API - Serverless - Notifications - us-east-1' - command: docker run -e "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}" -e "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}" -e "EFCMS_DOMAIN=${EFCMS_DOMAIN}" -e "CIRCLE_HONEYBADGER_API_KEY=${CIRCLE_HONEYBADGER_API_KEY}" -e "IRS_SUPERUSER_EMAIL=${IRS_SUPERUSER_EMAIL}" -v $(pwd)/.cache:/home/app/.cache --rm efcms /bin/sh -c "./web-api/run-serverless-notifications.sh ${ENV} us-east-1" - - run: - name: 'Deploy - Web API - Serverless - Notifications - us-west-1' - command: docker run -e "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}" -e "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}" -e "EFCMS_DOMAIN=${EFCMS_DOMAIN}" -e "CIRCLE_HONEYBADGER_API_KEY=${CIRCLE_HONEYBADGER_API_KEY}" -e "IRS_SUPERUSER_EMAIL=${IRS_SUPERUSER_EMAIL}" -v $(pwd)/.cache:/home/app/.cache --rm efcms /bin/sh -c "./web-api/run-serverless-notifications.sh ${ENV} us-west-1" # - run: # name: 'Deploy - Switch environment color' # command: docker run -e "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}" -e "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}" -e "EFCMS_DOMAIN=${EFCMS_DOMAIN}" --rm efcms /bin/sh -c "cd web-api && ./switch-environment-color.sh ${ENV}" @@ -344,9 +335,6 @@ jobs: - run: name: 'Deploy - Public Web Client - S3' command: docker run -e "ENV=${ENV}" -e "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}" -e "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}" -e "EFCMS_DOMAIN=${EFCMS_DOMAIN}" -e "COGNITO_SUFFIX=${COGNITO_SUFFIX}" -e "CIRCLE_SHA1=${CIRCLE_SHA1}" --rm efcms /bin/sh -c "./web-client/build-dist-public.sh $ENV && aws s3 sync dist-public s3://ui-public-${ENV}.${EFCMS_DOMAIN} --delete && aws s3 cp s3://ui-public-${ENV}.${EFCMS_DOMAIN}/index.html s3://ui-public-${ENV}.${EFCMS_DOMAIN}/index.html --metadata-directive REPLACE --cache-control max-age=0 && aws s3 sync dist-public s3://failover-ui-public-${ENV}.${EFCMS_DOMAIN} --delete --cache-control no-cache && aws s3 cp s3://failover-ui-public-${ENV}.${EFCMS_DOMAIN}/index.html s3://failover-ui-public-${ENV}.${EFCMS_DOMAIN}/index.html --metadata-directive REPLACE --cache-control max-age=0" - - run: - name: 'Deploy - Web WS - Route53' - command: docker run -e "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}" -e "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}" -e "EFCMS_DOMAIN=${EFCMS_DOMAIN}" --rm efcms /bin/sh -c "cd web-api && ./setup-regional-route53-ws.sh ${ENV}" - run: name: 'Deploy - Web API - Global Tables' command: docker run -e "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}" -e "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}" --rm efcms /bin/sh -c "cd web-api && node setup-global-tables.js efcms-${ENV} us-east-1,us-west-1" @@ -412,9 +400,6 @@ jobs: else echo "skipping…" fi - # - run: - # name: 'Deploy - Cognito Authorizer Check' - # command: docker run -e "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}" -e "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}" -e "EFCMS_DOMAIN=${EFCMS_DOMAIN}" --rm efcms /bin/sh -c "find web-api/*.yml | ENV=${ENV} xargs node web-api/verify-authorizers.js" - store_artifacts: path: /home/app/cypress-smoketests/videos/ diff --git a/cypress-smoketests/fixtures/example.json b/cypress-smoketests/fixtures/example.json new file mode 100644 index 00000000000..da18d9352a1 --- /dev/null +++ b/cypress-smoketests/fixtures/example.json @@ -0,0 +1,5 @@ +{ + "name": "Using fixtures to represent data", + "email": "hello@cypress.io", + "body": "Fixtures are a great way to mock data for responses to routes" +} \ No newline at end of file diff --git a/cypress-smoketests/fixtures/sample.pdf b/cypress-smoketests/fixtures/sample.pdf new file mode 100644 index 00000000000..e69de29bb2d diff --git a/cypress-smoketests/fixtures/w3-dummy.pdf b/cypress-smoketests/fixtures/w3-dummy.pdf new file mode 100644 index 00000000000..774c2ea70c5 Binary files /dev/null and b/cypress-smoketests/fixtures/w3-dummy.pdf differ diff --git a/cypress-smoketests/integration/case-creation.spec.js b/cypress-smoketests/integration/case-creation.spec.js new file mode 100644 index 00000000000..ff6cce43a02 --- /dev/null +++ b/cypress-smoketests/integration/case-creation.spec.js @@ -0,0 +1,121 @@ +const { + closeScannerSetupDialog, + goToCreateCase, + goToReviewCase, + saveCaseForLater, + serveCaseToIrs, +} = require('../support/pages/create-paper-case'); +const { + completeWizardStep1, + completeWizardStep2, + completeWizardStep3, + completeWizardStep4, + filingTypes, + goToDashboard, + goToStartCreatePetition, + goToWizardStep1, + goToWizardStep2, + goToWizardStep3, + goToWizardStep4, + goToWizardStep5, + hasIrsNotice, + submitPetition, +} = require('../support/pages/create-electronic-petition'); +const { + fillInCreateCaseFromPaperForm, +} = require('../../cypress/support/pages/create-paper-petition'); +const { getUserToken, login } = require('../support/pages/login'); +const { goToMyDocumentQC } = require('../support/pages/document-qc'); + +let token = null; + +describe('Petitioner', () => { + before(async () => { + const results = await getUserToken( + 'petitioner1@example.com', + 'Testing1234$', + ); + token = results.AuthenticationResult.IdToken; + }); + + it('should be able to login', () => { + login(token); + }); + + it('should be able to create a case', () => { + goToStartCreatePetition(); + goToWizardStep1(); + completeWizardStep1(); + goToWizardStep2(); + completeWizardStep2(hasIrsNotice.NO, 'Innocent Spouse'); + goToWizardStep3(); + completeWizardStep3(filingTypes.INDIVIDUAL, 'Petitioner'); + goToWizardStep4(); + completeWizardStep4(); + goToWizardStep5(); + submitPetition(); + goToDashboard(); + }); +}); + +describe('Private practitioner', () => { + before(async () => { + const results = await getUserToken( + 'privatePractitioner1@example.com', + 'Testing1234$', + ); + token = results.AuthenticationResult.IdToken; + }); + + it('should be able to login', () => { + login(token); + }); + + it('should be able to create a case', () => { + goToStartCreatePetition(); + completeWizardStep1(); + goToWizardStep2(); + completeWizardStep2(hasIrsNotice.YES, 'Notice of Deficiency'); + goToWizardStep3(); + completeWizardStep3( + filingTypes.PETITIONER_AND_SPOUSE, + 'Private practitioner', + ); + goToWizardStep4(); + completeWizardStep4(); + goToWizardStep5(); + submitPetition(); + goToDashboard(); + }); +}); + +describe('Petitions clerk', () => { + before(async () => { + const results = await getUserToken( + 'petitionsclerk1@example.com', + 'Testing1234$', + ); + token = results.AuthenticationResult.IdToken; + }); + + it('should be able to login', () => { + login(token); + }); + + it('should be able to create a case and save for later', () => { + goToMyDocumentQC(); + goToCreateCase(); + closeScannerSetupDialog(); + fillInCreateCaseFromPaperForm(); + goToReviewCase(); + saveCaseForLater(); + }); + + it('should be able to create a case and serve to IRS', () => { + goToMyDocumentQC(); + goToCreateCase(); + fillInCreateCaseFromPaperForm(); + goToReviewCase(); + serveCaseToIrs(); + }); +}); diff --git a/cypress-smoketests/integration/filings-and-qc.spec.js b/cypress-smoketests/integration/filings-and-qc.spec.js new file mode 100644 index 00000000000..2b3cd70def6 --- /dev/null +++ b/cypress-smoketests/integration/filings-and-qc.spec.js @@ -0,0 +1,103 @@ +const { + addStatistic, + confirmServePetition, + goToMyDocumentQC, + goToPetitionNeedingQC, + goToPetitionNeedingQCByCaseTitle, + goToReviewPetition, + goToSectionDocumentQC, + savePetitionForLater, + selectCaseType, + selectTab, + servePetition, +} = require('../support/pages/document-qc'); +const { + goToCaseDetail, + goToFileADocument, + goToFileYourDocument, + goToReviewDocument, + goToSelectDocumentType, + selectDocumentType, + submitDocument, + uploadDocumentFile, +} = require('../support/pages/petitioner-dashboard'); +const { getUserToken, login } = require('../support/pages/login'); + +let token = null; + +describe.skip('Petitions clerk', () => { + before(async () => { + const results = await getUserToken( + 'petitionsclerk1@example.com', + 'Testing1234$', + ); + token = results.AuthenticationResult.IdToken; + }); + + it('should be able to login', () => { + login(token); + }); + + it('should be able to QC a petition and save for later', () => { + goToMyDocumentQC(); + goToSectionDocumentQC(); + goToPetitionNeedingQC(); + goToReviewPetition(); + savePetitionForLater(); + }); + + it('should be able to QC a petition, add statistics, and serve to IRS', () => { + goToMyDocumentQC(); + goToSectionDocumentQC(); + goToPetitionNeedingQCByCaseTitle('Petitioner'); + selectTab('irs-notice'); + // radio button not selected - bug? + cy.get('#has-irs-verified-notice-yes').click(); + selectCaseType('Deficiency'); + addStatistic('2020', '1000', '10'); + goToReviewPetition(); + servePetition(); + confirmServePetition(); + }); +}); + +describe.skip('Petitioner', () => { + before(async () => { + const results = await getUserToken( + 'petitioner1@example.com', + 'Testing1234$', + ); + token = results.AuthenticationResult.IdToken; + }); + + it('should be able to login', () => { + login(token); + }); + + it('should be able to file a document', () => { + goToCaseDetail('Petitioner'); + goToFileADocument(); + goToSelectDocumentType(); + selectDocumentType('Administrative Record'); + goToFileYourDocument(); + uploadDocumentFile(); + goToReviewDocument(); + submitDocument(); + }); +}); + +describe.skip('Private practitioner', () => { + before(async () => { + const results = await getUserToken( + 'petitioner1@example.com', + 'Testing1234$', + ); + token = results.AuthenticationResult.IdToken; + }); + + it('should be able to login', () => { + login(token); + }); + + it('should be able to file a document', () => {}); +}); diff --git a/cypress-smoketests/support/commands.js b/cypress-smoketests/support/commands.js index c42c3a29a3a..0bfb3a7bac5 100644 --- a/cypress-smoketests/support/commands.js +++ b/cypress-smoketests/support/commands.js @@ -1,3 +1,5 @@ +/* eslint-disable jsdoc/require-returns */ +/* eslint-disable promise/no-nesting */ // *********************************************** // This example commands.js shows you how to // create various custom commands and overwrite @@ -26,3 +28,47 @@ // https://github.com/cypress-io/cypress/issues/170 // Usage: cy.upload_file('building.jpg', '#building [type="file"]'); +Cypress.Commands.add('upload_file', (fileName, selector, contentType) => { + cy.get(selector).then(subject => { + cy.fixture(fileName, 'base64').then(content => { + cy.window().then(win => { + const el = subject[0]; + const blob = b64toBlob(content, contentType); + const testFile = new win.File([blob], fileName, { + type: contentType, + }); + const dataTransfer = new DataTransfer(); + dataTransfer.items.add(testFile); + el.files = dataTransfer.files; + if (subject.is(':visible')) { + return cy.wrap(subject).trigger('change', { force: true }); + } else { + return cy.wrap(subject); + } + }); + }); + }); +}); + +/** + * @param b64Data + * @param contentType + * @param sliceSize + */ +function b64toBlob(b64Data, contentType, sliceSize) { + contentType = contentType || ''; + sliceSize = sliceSize || 512; + const byteCharacters = atob(b64Data); + const byteArrays = []; + for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) { + const slice = byteCharacters.slice(offset, offset + sliceSize); + const byteNumbers = new Array(slice.length); + for (let i = 0; i < slice.length; i++) { + byteNumbers[i] = slice.charCodeAt(i); + } + byteArrays.push(new Uint8Array(byteNumbers)); + } + const blob = new Blob(byteArrays, { type: contentType }); + blob.lastModifiedDate = new Date(); + return blob; +} diff --git a/cypress-smoketests/support/pages/create-electronic-petition.js b/cypress-smoketests/support/pages/create-electronic-petition.js new file mode 100644 index 00000000000..578c484b9dc --- /dev/null +++ b/cypress-smoketests/support/pages/create-electronic-petition.js @@ -0,0 +1,90 @@ +exports.hasIrsNotice = { + NO: 1, + YES: 0, +}; + +exports.filingTypes = { + BUSINESS: 2, + INDIVIDUAL: 0, + OTHER: 3, + PETITIONER_AND_SPOUSE: 1, +}; + +exports.goToStartCreatePetition = () => { + cy.get('a#file-a-petition').click(); +}; + +exports.goToWizardStep1 = () => { + cy.get('a[href*="file-a-petition/step-1"]').click(); + cy.url().should('contain', '/file-a-petition/step-1'); +}; + +exports.goToWizardStep2 = () => { + cy.get('button#submit-case').click(); + cy.url().should('contain', '/file-a-petition/step-2'); +}; + +exports.goToWizardStep3 = () => { + cy.get('button#submit-case').click(); + cy.url().should('contain', '/file-a-petition/step-3'); +}; + +exports.goToWizardStep4 = () => { + cy.get('button#submit-case').click(); + cy.url().should('contain', '/file-a-petition/step-4'); +}; + +exports.goToWizardStep5 = () => { + cy.get('button#submit-case').click(); + cy.url().should('contain', '/file-a-petition/step-5'); +}; + +exports.submitPetition = () => { + cy.get('button#submit-case').scrollIntoView().click(); +}; + +exports.goToDashboard = () => { + cy.get('a#button-back-to-dashboard').click(); +}; + +exports.completeWizardStep1 = () => { + cy.upload_file('w3-dummy.pdf', 'input#stin-file'); +}; + +exports.completeWizardStep2 = (hasIrsNotice, caseType) => { + cy.screenshot(); + cy.upload_file('w3-dummy.pdf', 'input#petition-file'); + cy.get('#irs-notice-radios').scrollIntoView(); + cy.get(`label#hasIrsNotice-${hasIrsNotice}`).click(); + cy.get('#case-type').scrollIntoView().select(caseType); +}; + +exports.completeWizardStep3 = (filingType, petitionerName) => { + cy.get(`label#filing-type-${filingType}`).scrollIntoView().click(); + + if (filingType === this.filingTypes.PETITIONER_AND_SPOUSE) { + cy.get('label#is-spouse-deceased-0').click(); + cy.get('input#use-same-address-above') + .scrollIntoView() + .check({ force: true }); + + cy.get('input#secondaryName').type('Annalise'); + cy.get('input#secondaryInCareOf').type('Sam'); + } + + cy.get('input#name').scrollIntoView().type(petitionerName); + cy.get('input[name="contactPrimary.address1"]') + .scrollIntoView() + .type('111 South West St.'); + cy.get('input[name="contactPrimary.city"]').scrollIntoView().type('Orlando'); + cy.get('select[name="contactPrimary.state"]').scrollIntoView().select('AL'); + cy.get('input[name="contactPrimary.postalCode"]') + .scrollIntoView() + .type('12345'); + cy.get('input#phone').scrollIntoView().type('1111111111'); +}; + +exports.completeWizardStep4 = () => { + cy.get('label#procedure-type-0').scrollIntoView().click(); + cy.get('#preferred-trial-city').scrollIntoView().select('Mobile, Alabama'); +}; diff --git a/cypress-smoketests/support/pages/create-paper-case.js b/cypress-smoketests/support/pages/create-paper-case.js new file mode 100644 index 00000000000..14c3eb51010 --- /dev/null +++ b/cypress-smoketests/support/pages/create-paper-case.js @@ -0,0 +1,24 @@ +exports.goToCreateCase = () => { + cy.get('a#file-a-petition').click(); +}; + +exports.goToReviewCase = () => { + cy.get('button#submit-case').scrollIntoView().click(); +}; + +exports.saveCaseForLater = () => { + cy.get('button:contains("Save for Later")').click(); +}; + +exports.serveCaseToIrs = () => { + cy.get('#ustc-start-a-case-form button#submit-case').scrollIntoView().click(); + cy.get('button#confirm').scrollIntoView().click(); +}; + +exports.closeScannerSetupDialog = () => { + cy.get('div.dynamsoft-backdrop').should('exist'); + + cy.get('div.dynamsoft-dialog-close').click(); + + cy.get('div.dynamsoft-backdrop').should('not.exist'); +}; diff --git a/cypress-smoketests/support/pages/document-qc.js b/cypress-smoketests/support/pages/document-qc.js new file mode 100644 index 00000000000..a1388b347da --- /dev/null +++ b/cypress-smoketests/support/pages/document-qc.js @@ -0,0 +1,53 @@ +exports.goToMyDocumentQC = () => { + cy.get('a[href*="document-qc/my/inbox"]').click(); +}; + +exports.goToSectionDocumentQC = () => { + cy.get('button:contains("Switch to Section Document QC")').click(); +}; + +exports.goToPetitionNeedingQC = () => { + cy.get('a[href*="petition-qc"]').first().click(); +}; + +exports.goToPetitionNeedingQCByCaseTitle = caseTitle => { + cy.get(`td:contains(${caseTitle})`) + .first() + .parent() + .find('a[href*="petition-qc"]') + .click(); +}; + +exports.goToReviewPetition = () => { + cy.get('button#submit-case').click(); +}; + +exports.savePetitionForLater = () => { + cy.get('button:contains("Save for Later")').click(); + + cy.get('div.usa-alert--success').should('exist'); +}; + +exports.selectTab = tabName => { + cy.get(`button#tab-${tabName}`).click(); +}; + +exports.selectCaseType = caseType => { + cy.get('#case-type').scrollIntoView().select(caseType); +}; + +exports.addStatistic = (year, deficiencyAmount, totalPenalties) => { + cy.get('input[id^=year-]').last().type(year); + cy.get('input[id^=deficiency-amount-]').last().type(deficiencyAmount); + cy.get('input[id^=total-penalties-]').last().type(totalPenalties); +}; + +exports.servePetition = () => { + cy.get('#ustc-start-a-case-form button#submit-case').scrollIntoView().click(); +}; + +exports.confirmServePetition = () => { + cy.get('button#confirm').click(); + + cy.get('div.usa-alert--success').should('exist'); +}; diff --git a/cypress-smoketests/integration/petitionsclerk-can-login.spec.js b/cypress-smoketests/support/pages/login.js similarity index 60% rename from cypress-smoketests/integration/petitionsclerk-can-login.spec.js rename to cypress-smoketests/support/pages/login.js index ae9ae3b9814..bddb6b45205 100644 --- a/cypress-smoketests/integration/petitionsclerk-can-login.spec.js +++ b/cypress-smoketests/support/pages/login.js @@ -34,7 +34,7 @@ const getUserPoolId = async () => { return userPoolId; }; -const getUserToken = async (username, password) => { +exports.getUserToken = async (username, password) => { const userPoolId = await getUserPoolId(); const clientId = await getClientId(userPoolId); @@ -51,27 +51,8 @@ const getUserToken = async (username, password) => { .promise(); }; -let token = null; +exports.login = token => { + cy.visit(`/log-in?token=${token}`); -describe('petitionsclerk can login', () => { - before(async () => { - const results = await getUserToken( - 'petitionsclerk1@example.com', - 'Testing1234$', - ); - token = results.AuthenticationResult.IdToken; - }); - - it('views the section inbox', () => { - cy.visit(`/log-in?token=${token}`); - cy.get('.button-switch-box').should('exist'); - }); - - it('should verify advanced search works', () => { - cy.visit(`/log-in?token=${token}&path=/search`); - cy.get('#advanced-search-button').should('exist'); - cy.get('#petitioner-name').type('THISNAMESHOULDNEVEREXIST'); - cy.get('#advanced-search-button').click(); - cy.get('#no-search-results').should('exist'); - }); -}); + cy.get('.progress-indicator').should('not.exist'); +}; diff --git a/cypress-smoketests/support/pages/petitioner-dashboard.js b/cypress-smoketests/support/pages/petitioner-dashboard.js new file mode 100644 index 00000000000..f10281c143b --- /dev/null +++ b/cypress-smoketests/support/pages/petitioner-dashboard.js @@ -0,0 +1,39 @@ +exports.goToCaseDetail = caseTitle => { + cy.get(`td:contains(${caseTitle})`) + .first() + .parent() + .find('a[href*="case-detail/"]') + .first() + .click(); +}; + +exports.goToFileADocument = () => { + cy.get('a#button-file-document').click(); +}; + +exports.goToSelectDocumentType = () => { + cy.get('a[href*="/file-a-document"]').scrollIntoView().click(); +}; + +exports.goToFileYourDocument = () => { + cy.get('button#submit-document').click(); +}; +exports.goToReviewDocument = this.goToFileYourDocument; + +exports.selectDocumentType = documentType => { + cy.get('#document-type').children().first().click(); + cy.get('div.select-react-element__menu-list') + .find('div') + .contains(documentType) + .click(); +}; + +exports.uploadDocumentFile = () => { + cy.upload_file('w3-dummy.pdf', 'input#primary-document'); +}; + +exports.submitDocument = () => { + cy.get('button#submit-document').click(); + + cy.get('div.usa-alert--success').should('exist'); +}; diff --git a/cypress/integration/petitions-clerk-views-case-detail.spec.js b/cypress/integration/petitions-clerk-views-case-detail.spec.js new file mode 100644 index 00000000000..ec1e618ad9d --- /dev/null +++ b/cypress/integration/petitions-clerk-views-case-detail.spec.js @@ -0,0 +1,22 @@ +describe('Petitions clerk views case detail', function () { + before(() => { + cy.login('petitionsclerk'); + }); + + describe('case information tab', () => { + it('should display a card for other petitioners in the petitioner tab', () => { + cy.visit('/case-detail/101-20'); + + cy.get('button#tab-case-information').click(); + + cy.get('button#tab-petitioner').click(); + + cy.get('div#other-petitioners-label').should('exist'); + cy.get('button#view-additional-petitioners-button') + .scrollIntoView() + .click(); + + cy.get('div.other-petitioners-information').should('have.length', 7); + }); + }); +}); diff --git a/cypress/support/pages/create-paper-petition.js b/cypress/support/pages/create-paper-petition.js index 8d542e01f1c..9fcde5abf5a 100644 --- a/cypress/support/pages/create-paper-petition.js +++ b/cypress/support/pages/create-paper-petition.js @@ -12,7 +12,6 @@ exports.fillInCreateCaseFromPaperForm = () => { cy.get('#date-received-day').type('01'); cy.get('#date-received-year').type('2020'); cy.get('#mailing-date').type('01/01/2020'); - cy.get('#mailing-date').type('01/01/2020'); cy.get('#procedure-type-0').click(); cy.get('#preferred-trial-city') .scrollIntoView() diff --git a/docs/MANUAL_TESTING.md b/docs/MANUAL_TESTING.md new file mode 100644 index 00000000000..c581d10ba0f --- /dev/null +++ b/docs/MANUAL_TESTING.md @@ -0,0 +1,29 @@ + + +## Manual End of Sprint QA +At the end of a sprint PR, we'd like to run manual smoke tests over our system in an attempt to reduce bugs sent to the court's system. The following manual tests can be ran by following the steps provided: + +#### Verify Cognito Registration +- go to the cognito UI +- create a new user with your email, i.e. cseibert+petitioner1@flexion.us +- verify you received a verify email +- login to your petitioner account + +#### Verify Email Notifications +- If you already have a petitioner account, login and create a case +- keep track of that docket number +- login as a petitions clerk +- upload a pdf to the case created by your petitioner +- sign the pdf +- add a docket entry +- serve +- verify the petitioner got an email notificaton + +#### Verify Web Sockets - Batch Download Case as Judge + +- If you already created that case above, you should be able to just add it to a trial session +- login as a docketclerk +- navigate to case created above, or a case with an electronic service party +- manually add the case to a trial session +- this should make a request to the websocket endpoint +- if web sockets fail, you will see it in the console diff --git a/docs/entities/Case.md b/docs/entities/Case.md index b70a4934847..9deb5ec337d 100644 --- a/docs/entities/Case.md +++ b/docs/entities/Case.md @@ -23,7 +23,11 @@ presence: "optional" description: "Temporarily blocked from trial due to a pending item or due date." automaticBlockedDate: - type: "any" + type: "date" + flags: + format: + - "YYYY-MM-DDTHH:mm:ss.SSSZ" + - "YYYY-MM-DD" whens: - ref: @@ -39,11 +43,8 @@ override: true - true then: - type: "date" + type: "any" flags: - format: - - "YYYY-MM-DDTHH:mm:ss.SSSZ" - - "YYYY-MM-DD" presence: "required" otherwise: type: "any" @@ -52,7 +53,14 @@ allow: - null automaticBlockedReason: - type: "any" + type: "string" + flags: + only: true + description: "The reason the case was automatically blocked from trial." + allow: + - "Due Date" + - "Pending Item" + - "Pending Item and Due Date" whens: - ref: @@ -68,15 +76,9 @@ override: true - true then: - type: "string" + type: "any" flags: - only: true presence: "required" - description: "The reason the case was automatically blocked from trial." - allow: - - "Due Date" - - "Pending Item" - - "Pending Item and Due Date" otherwise: type: "any" flags: @@ -93,7 +95,11 @@ tags: - "Restricted" blockedDate: - type: "any" + type: "date" + flags: + format: + - "YYYY-MM-DDTHH:mm:ss.SSSZ" + - "YYYY-MM-DD" metas: - tags: @@ -113,11 +119,8 @@ override: true - true then: - type: "date" + type: "any" flags: - format: - - "YYYY-MM-DDTHH:mm:ss.SSSZ" - - "YYYY-MM-DD" presence: "required" otherwise: type: "any" @@ -126,7 +129,14 @@ allow: - null blockedReason: - type: "any" + type: "string" + flags: + description: "Open text field for describing reason for blocking this case from trial." + rules: + - + name: "max" + args: + limit: 250 metas: - tags: @@ -146,15 +156,9 @@ override: true - true then: - type: "string" + type: "any" flags: presence: "required" - description: "Open text field for describing reason for blocking this case from trial." - rules: - - - name: "max" - args: - limit: 250 otherwise: type: "any" flags: @@ -341,7 +345,12 @@ tags: - "Restricted" highPriorityReason: - type: "any" + type: "string" + rules: + - + name: "max" + args: + limit: 250 metas: - tags: @@ -361,14 +370,9 @@ override: true - true then: - type: "string" + type: "any" flags: presence: "required" - rules: - - - name: "max" - args: - limit: 250 otherwise: type: "any" flags: @@ -447,9 +451,14 @@ allow: - null mailingDate: - type: "any" + type: "string" flags: description: "Date that petition was mailed to the court." + rules: + - + name: "max" + args: + limit: 25 whens: - ref: @@ -465,23 +474,13 @@ override: true - true then: - type: "string" + type: "any" flags: presence: "required" - rules: - - - name: "max" - args: - limit: 25 otherwise: - type: "string" + type: "any" flags: presence: "optional" - rules: - - - name: "max" - args: - limit: 25 allow: - null noticeOfAttachments: @@ -537,6 +536,16 @@ flags: presence: "optional" description: "Reminder for clerks to review the Order to Show Cause." + otherPetitioners: + type: "array" + flags: + description: "List of OtherPetitionerContact Entities for the case." + items: + - + type: "object" + metas: + - + entityName: "OtherPetitionerContact" partyType: type: "string" flags: @@ -573,8 +582,11 @@ - "Not Paid" - "Waived" petitionPaymentDate: - type: "any" + type: "date" flags: + format: + - "YYYY-MM-DDTHH:mm:ss.SSSZ" + - "YYYY-MM-DD" description: "When the petitioner paid the case fee." whens: - @@ -591,25 +603,24 @@ override: true - "Paid" then: - type: "date" + type: "any" flags: - format: - - "YYYY-MM-DDTHH:mm:ss.SSSZ" - - "YYYY-MM-DD" presence: "required" otherwise: - type: "date" + type: "any" flags: - format: - - "YYYY-MM-DDTHH:mm:ss.SSSZ" - - "YYYY-MM-DD" presence: "optional" allow: - null petitionPaymentMethod: - type: "any" + type: "string" flags: description: "How the petitioner paid the case fee." + rules: + - + name: "max" + args: + limit: 50 whens: - ref: @@ -625,23 +636,21 @@ override: true - "Paid" then: - type: "string" + type: "any" flags: presence: "required" - rules: - - - name: "max" - args: - limit: 50 otherwise: - type: "string" + type: "any" flags: presence: "optional" allow: - null petitionPaymentWaivedDate: - type: "any" + type: "date" flags: + format: + - "YYYY-MM-DDTHH:mm:ss.SSSZ" + - "YYYY-MM-DD" description: "When the case fee was waived." whens: - @@ -658,18 +667,12 @@ override: true - "Waived" then: - type: "date" + type: "any" flags: - format: - - "YYYY-MM-DDTHH:mm:ss.SSSZ" - - "YYYY-MM-DD" presence: "required" otherwise: - type: "date" + type: "any" flags: - format: - - "YYYY-MM-DDTHH:mm:ss.SSSZ" - - "YYYY-MM-DD" presence: "optional" allow: - null @@ -815,7 +818,7 @@ presence: "required" description: "A sortable representation of the docket number (auto-generated by constructor)." statistics: - type: "any" + type: "array" flags: description: "List of Statistic Entities for the case." whens: @@ -857,32 +860,20 @@ name: "min" args: limit: 1 - items: - - - type: "object" - metas: - - - entityName: "Statistic" otherwise: - type: "array" + type: "any" flags: presence: "optional" - items: - - - type: "object" - metas: - - - entityName: "Statistic" otherwise: - type: "array" + type: "any" flags: presence: "optional" - items: - - - type: "object" - metas: - - - entityName: "Statistic" + items: + - + type: "object" + metas: + - + entityName: "Statistic" status: type: "string" flags: @@ -907,7 +898,11 @@ tags: - "Restricted" closedDate: - type: "any" + type: "date" + flags: + format: + - "YYYY-MM-DDTHH:mm:ss.SSSZ" + - "YYYY-MM-DD" whens: - ref: @@ -923,11 +918,8 @@ override: true - "Closed" then: - type: "date" + type: "any" flags: - format: - - "YYYY-MM-DDTHH:mm:ss.SSSZ" - - "YYYY-MM-DD" presence: "required" otherwise: type: "any" diff --git a/docs/entities/CaseMessage.md b/docs/entities/CaseMessage.md index 2887b90d361..3bbeeb10514 100644 --- a/docs/entities/CaseMessage.md +++ b/docs/entities/CaseMessage.md @@ -24,7 +24,7 @@ type: "string" flags: only: true - presence: "optional" + presence: "required" description: "The status of the associated case." allow: - "Assigned - Case" @@ -39,6 +39,23 @@ - "On Appeal" - "Rule 155" - "Submitted" + caseTitle: + type: "string" + flags: + presence: "required" + description: "The case title for the associated cases." + completedMessage: + type: "string" + flags: + presence: "optional" + description: "The message entered when completing the message thread." + rules: + - + name: "max" + args: + limit: 500 + allow: + - null createdAt: type: "date" flags: @@ -142,6 +159,183 @@ options: version: - "uuidv4" + isCompleted: + type: "boolean" + flags: + presence: "required" + description: "Whether the message thread has been completed." + completedAt: + type: "date" + flags: + format: + - "YYYY-MM-DDTHH:mm:ss.SSSZ" + - "YYYY-MM-DD" + description: "When the message was marked as completed." + whens: + - + ref: + path: + - "isCompleted" + is: + type: "any" + flags: + only: true + presence: "required" + allow: + - + override: true + - true + then: + type: "any" + flags: + presence: "required" + otherwise: + type: "any" + flags: + presence: "optional" + allow: + - null + completedBy: + type: "string" + flags: + description: "The name of the user who completed the message thread" + rules: + - + name: "max" + args: + limit: 500 + whens: + - + ref: + path: + - "isCompleted" + is: + type: "any" + flags: + only: true + presence: "required" + allow: + - + override: true + - true + then: + type: "any" + flags: + presence: "required" + otherwise: + type: "any" + flags: + presence: "optional" + allow: + - null + completedBySection: + type: "string" + flags: + only: true + description: "The section of the user who completed the message thread" + allow: + - "adc" + - "admissions" + - "chambers" + - "clerkofcourt" + - "docket" + - "petitions" + - "trialClerks" + - "armensChambers" + - "ashfordsChambers" + - "buchsChambers" + - "carluzzosChambers" + - "cohensChambers" + - "colvinsChambers" + - "copelandsChambers" + - "foleysChambers" + - "galesChambers" + - "gerbersChambers" + - "goekesChambers" + - "gustafsonsChambers" + - "guysChambers" + - "halpernsChambers" + - "holmesChambers" + - "jacobsChambers" + - "jonesChambers" + - "kerrigansChambers" + - "laubersChambers" + - "leydensChambers" + - "marvelsChambers" + - "morrisonsChambers" + - "negasChambers" + - "panuthosChambers" + - "parisChambers" + - "pughsChambers" + - "ruwesChambers" + - "thorntonsChambers" + - "urdasChambers" + - "vasquezsChambers" + - "wellsChambers" + whens: + - + ref: + path: + - "isCompleted" + is: + type: "any" + flags: + only: true + presence: "required" + allow: + - + override: true + - true + then: + type: "any" + flags: + presence: "required" + otherwise: + type: "any" + flags: + presence: "optional" + allow: + - null + completedByUserId: + type: "string" + flags: + description: "The ID of the user who completed the message thread" + rules: + - + name: "guid" + args: + options: + version: + - "uuidv4" + whens: + - + ref: + path: + - "isCompleted" + is: + type: "any" + flags: + only: true + presence: "required" + allow: + - + override: true + - true + then: + type: "any" + flags: + presence: "required" + otherwise: + type: "any" + flags: + presence: "optional" + allow: + - null + isRepliedTo: + type: "boolean" + flags: + presence: "required" + description: "Whether the message has been replied to or forwarded." message: type: "string" flags: @@ -164,6 +358,18 @@ options: version: - "uuidv4" + parentMessageId: + type: "string" + flags: + presence: "required" + description: "The ID of the initial message in the thread." + rules: + - + name: "guid" + args: + options: + version: + - "uuidv4" subject: type: "string" flags: diff --git a/docs/entities/Document.md b/docs/entities/Document.md index 6d6e6f98d45..06166267da4 100644 --- a/docs/entities/Document.md +++ b/docs/entities/Document.md @@ -35,7 +35,11 @@ flags: presence: "optional" certificateOfServiceDate: - type: "any" + type: "date" + flags: + format: + - "YYYY-MM-DDTHH:mm:ss.SSSZ" + - "YYYY-MM-DD" whens: - ref: @@ -51,16 +55,15 @@ override: true - true then: - type: "date" + type: "any" flags: - format: - - "YYYY-MM-DDTHH:mm:ss.SSSZ" - - "YYYY-MM-DD" presence: "required" otherwise: type: "any" flags: presence: "optional" + allow: + - null createdAt: type: "date" flags: @@ -72,7 +75,9 @@ date: type: "date" flags: - format: "iso" + format: + - "YYYY-MM-DDTHH:mm:ss.SSSZ" + - "YYYY-MM-DD" presence: "optional" description: "An optional date used when generating a fully concatenated document title." allow: @@ -501,7 +506,351 @@ eventCode: type: "string" flags: + only: true presence: "optional" + allow: + - "A" + - "AAAP" + - "AAPN" + - "AATP" + - "AATS" + - "AATT" + - "ACED" + - "ADMR" + - "ADMT" + - "AFE" + - "AFF" + - "AFP" + - "AMAT" + - "AMDC" + - "APA" + - "APLD" + - "APPL" + - "APPW" + - "APW" + - "ASAP" + - "ASUP" + - "ATAP" + - "ATSP" + - "BND" + - "BRF" + - "CERT" + - "CIVP" + - "COED" + - "CS" + - "CTRA" + - "DCL" + - "DEC" + - "DISC" + - "DSC" + - "EA" + - "ES" + - "EVID" + - "EXH" + - "FEE" + - "FEEW" + - "FTRL" + - "HE" + - "HEAR" + - "LTR" + - "M000" + - "M001" + - "M002" + - "M003" + - "M004" + - "M005" + - "M006" + - "M007" + - "M008" + - "M009" + - "M010" + - "M011" + - "M012" + - "M013" + - "M014" + - "M015" + - "M016" + - "M017" + - "M018" + - "M019" + - "M020" + - "M021" + - "M022" + - "M023" + - "M024" + - "M026" + - "M027" + - "M028" + - "M029" + - "M030" + - "M031" + - "M032" + - "M033" + - "M034" + - "M035" + - "M036" + - "M037" + - "M038" + - "M039" + - "M040" + - "M041" + - "M042" + - "M043" + - "M044" + - "M045" + - "M046" + - "M047" + - "M048" + - "M049" + - "M050" + - "M051" + - "M052" + - "M053" + - "M054" + - "M055" + - "M056" + - "M057" + - "M058" + - "M059" + - "M060" + - "M061" + - "M062" + - "M063" + - "M064" + - "M065" + - "M066" + - "M067" + - "M068" + - "M069" + - "M070" + - "M071" + - "M072" + - "M073" + - "M074" + - "M075" + - "M076" + - "M077" + - "M078" + - "M079" + - "M080" + - "M081" + - "M082" + - "M083" + - "M084" + - "M085" + - "M086" + - "M087" + - "M088" + - "M089" + - "M090" + - "M091" + - "M092" + - "M093" + - "M094" + - "M095" + - "M096" + - "M097" + - "M098" + - "M099" + - "M100" + - "M101" + - "M102" + - "M103" + - "M104" + - "M105" + - "M106" + - "M107" + - "M108" + - "M109" + - "M110" + - "M111" + - "M112" + - "M113" + - "M114" + - "M115" + - "M116" + - "M117" + - "M118" + - "M119" + - "M120" + - "M121" + - "M122" + - "M123" + - "M124" + - "M125" + - "M126" + - "M129" + - "M130" + - "M131" + - "M132" + - "M133" + - "M134" + - "M135" + - "M136" + - "M218" + - "MEMO" + - "MGRTED" + - "MINC" + - "MIND" + - "MISC" + - "MISCL" + - "MISL" + - "MISP" + - "MOP" + - "NAJA" + - "NCA" + - "NCAG" + - "NCAP" + - "NCNP" + - "NCON" + - "NCP" + - "NCTP" + - "NDC" + - "NDT" + - "NFAR" + - "NIFL" + - "NINF" + - "NIS" + - "NITM" + - "NJAR" + - "NNOB" + - "NOA" + - "NOB" + - "NODC" + - "NOEI" + - "NOEP" + - "NOI" + - "NOST" + - "NOT" + - "NOU" + - "NPB" + - "NPJR" + - "NRJD" + - "NRJR" + - "NSA" + - "NSTE" + - "NTA" + - "NTD" + - "NTN" + - "O" + - "OAD" + - "OAJ" + - "OAL" + - "OAP" + - "OAPF" + - "OAR" + - "OAS" + - "OASL" + - "OAW" + - "OAX" + - "OBJ" + - "OBJE" + - "OBJN" + - "OCA" + - "OD" + - "ODD" + - "ODJ" + - "ODL" + - "ODP" + - "ODR" + - "ODS" + - "ODSL" + - "ODW" + - "ODX" + - "OF" + - "OFAB" + - "OFFX" + - "OFWD" + - "OFX" + - "OIP" + - "OJR" + - "OODS" + - "OP" + - "OPFX" + - "OPPO" + - "OPX" + - "ORAP" + - "OROP" + - "OSC" + - "OSCP" + - "OST" + - "OSUB" + - "P" + - "PARD" + - "PHM" + - "PMT" + - "PSDE" + - "PTFR" + - "PTRL" + - "RAT" + - "RATF" + - "RCOM" + - "REDC" + - "REPL" + - "REQ" + - "REQA" + - "RESP" + - "RFPC" + - "RJN" + - "RLRI" + - "RM" + - "ROA" + - "RPT" + - "RQT" + - "RSP" + - "RTP" + - "RTRA" + - "S212" + - "SADM" + - "SAMB" + - "SATL" + - "SDEC" + - "SEAB" + - "SEOB" + - "SERB" + - "SESB" + - "SIAB" + - "SIAM" + - "SIMB" + - "SIML" + - "SIOB" + - "SIOM" + - "SIRB" + - "SISB" + - "SOC" + - "SOMB" + - "SOP" + - "SORI" + - "SPAR" + - "SPD" + - "SPML" + - "SPMT" + - "SPTN" + - "SPTO" + - "SRMB" + - "SSB" + - "SSRB" + - "SSRM" + - "SSTP" + - "STAR" + - "STAT" + - "STBB" + - "STIN" + - "STIP" + - "STP" + - "STPD" + - "STS" + - "STST" + - "SUPM" + - "SURP" + - "TCOP" + - "TE" + - "TRAN" + - "TRL" + - "USCA" + - "USDL" + - "WRIT" + - null filedBy: type: "string" flags: @@ -559,10 +908,30 @@ judge: type: "string" flags: - presence: "optional" description: "The judge associated with the document." allow: - null + whens: + - + ref: + path: + - "documentType" + is: + type: "string" + flags: + only: true + allow: + - "MOP - Memorandum Opinion" + - "Summary Opinion" + - "TCOP - T.C. Opinion" + then: + type: "any" + flags: + presence: "required" + otherwise: + type: "any" + flags: + presence: "optional" lodged: type: "boolean" flags: @@ -745,33 +1114,146 @@ flags: presence: "optional" signedAt: - type: "date" - flags: - format: - - "YYYY-MM-DDTHH:mm:ss.SSSZ" - - "YYYY-MM-DD" - presence: "optional" - allow: - - null - signedByUserId: type: "string" flags: - presence: "optional" - rules: + description: "The time at which the document was signed." + whens: - - name: "guid" - args: - options: - version: - - "uuidv4" - allow: - - null + ref: + path: + - "draftState" + is: + type: "any" + flags: + presence: "required" + invalid: + - null + then: + type: "any" + flags: + presence: "optional" + allow: + - null + otherwise: + type: "any" + whens: + - + ref: + path: + - "documentType" + is: + type: "any" + flags: + only: true + allow: + - "Order" + - "Order of Dismissal for Lack of Jurisdiction" + - "Order of Dismissal" + - "Order of Dismissal and Decision" + - "Order to Show Cause" + - "Order and Decision" + - "Decision" + - "Notice" + then: + type: "any" + flags: + presence: "required" + otherwise: + type: "any" + flags: + presence: "optional" + allow: + - null signedJudgeName: - type: "string" + type: "any" flags: - presence: "optional" - allow: - - null + description: "The judge who signed the document." + whens: + - + ref: + path: + - "draftState" + is: + type: "any" + flags: + presence: "required" + invalid: + - null + then: + type: "string" + flags: + presence: "optional" + allow: + - null + otherwise: + type: "any" + whens: + - + ref: + path: + - "documentType" + is: + type: "string" + flags: + only: true + allow: + - "Order" + - "Order of Dismissal for Lack of Jurisdiction" + - "Order of Dismissal" + - "Order of Dismissal and Decision" + - "Order to Show Cause" + - "Order and Decision" + - "Decision" + - "Notice" + then: + type: "string" + flags: + presence: "required" + otherwise: + type: "string" + flags: + presence: "optional" + allow: + - null + signedByUserId: + type: "any" + flags: + description: "The id of the user who applied the signature." + whens: + - + ref: + path: + - "signedJudgeName" + is: + type: "any" + flags: + presence: "required" + invalid: + - null + then: + type: "string" + flags: + presence: "required" + rules: + - + name: "guid" + args: + options: + version: + - "uuidv4" + otherwise: + type: "string" + flags: + presence: "optional" + rules: + - + name: "guid" + args: + options: + version: + - "uuidv4" + allow: + - null supportingDocument: type: "string" flags: diff --git a/docs/entities/IrsPractitioner.md b/docs/entities/IrsPractitioner.md index ec6cf19287c..6a0c263f43f 100644 --- a/docs/entities/IrsPractitioner.md +++ b/docs/entities/IrsPractitioner.md @@ -63,7 +63,7 @@ - "domestic" - "international" country: - type: "any" + type: "string" whens: - ref: @@ -79,11 +79,11 @@ override: true - "international" then: - type: "string" + type: "any" flags: presence: "required" otherwise: - type: "string" + type: "any" flags: presence: "optional" allow: @@ -132,7 +132,72 @@ args: regex: "/^(\\d{5}|\\d{5}-\\d{4})$/" state: - type: "any" + type: "string" + flags: + only: true + allow: + - "AK" + - "AL" + - "AR" + - "AZ" + - "CA" + - "CO" + - "CT" + - "DC" + - "DE" + - "FL" + - "GA" + - "HI" + - "IA" + - "ID" + - "IL" + - "IN" + - "KS" + - "KY" + - "LA" + - "MA" + - "MD" + - "ME" + - "MI" + - "MN" + - "MO" + - "MS" + - "MT" + - "NC" + - "ND" + - "NE" + - "NH" + - "NJ" + - "NM" + - "NV" + - "NY" + - "OH" + - "OK" + - "OR" + - "PA" + - "RI" + - "SC" + - "SD" + - "TN" + - "TX" + - "UT" + - "VA" + - "VT" + - "WA" + - "WI" + - "WV" + - "WY" + - "AA" + - "AE" + - "AP" + - "AS" + - "FM" + - "GU" + - "MH" + - "MP" + - "PR" + - "PW" + - "VI" whens: - ref: @@ -148,20 +213,15 @@ override: true - "international" then: - type: "string" + type: "any" flags: presence: "optional" allow: - null otherwise: - type: "string" + type: "any" flags: presence: "required" - rules: - - - name: "max" - args: - limit: 100 email: type: "string" flags: @@ -214,7 +274,12 @@ allow: - "irsPractitioner" judgeFullName: - type: "any" + type: "string" + rules: + - + name: "max" + args: + limit: 100 whens: - ref: @@ -230,14 +295,9 @@ override: true - "judge" then: - type: "string" + type: "any" flags: presence: "optional" - rules: - - - name: "max" - args: - limit: 100 otherwise: type: "any" flags: @@ -245,7 +305,12 @@ allow: - null judgeTitle: - type: "any" + type: "string" + rules: + - + name: "max" + args: + limit: 100 whens: - ref: @@ -261,14 +326,9 @@ override: true - "judge" then: - type: "string" + type: "any" flags: presence: "optional" - rules: - - - name: "max" - args: - limit: 100 otherwise: type: "any" flags: diff --git a/docs/entities/NewPractitioner.md b/docs/entities/NewPractitioner.md index c11a5684f2f..2f1cc4e270c 100644 --- a/docs/entities/NewPractitioner.md +++ b/docs/entities/NewPractitioner.md @@ -63,7 +63,7 @@ - "domestic" - "international" country: - type: "any" + type: "string" whens: - ref: @@ -79,11 +79,11 @@ override: true - "international" then: - type: "string" + type: "any" flags: presence: "required" otherwise: - type: "string" + type: "any" flags: presence: "optional" allow: @@ -132,7 +132,72 @@ args: regex: "/^(\\d{5}|\\d{5}-\\d{4})$/" state: - type: "any" + type: "string" + flags: + only: true + allow: + - "AK" + - "AL" + - "AR" + - "AZ" + - "CA" + - "CO" + - "CT" + - "DC" + - "DE" + - "FL" + - "GA" + - "HI" + - "IA" + - "ID" + - "IL" + - "IN" + - "KS" + - "KY" + - "LA" + - "MA" + - "MD" + - "ME" + - "MI" + - "MN" + - "MO" + - "MS" + - "MT" + - "NC" + - "ND" + - "NE" + - "NH" + - "NJ" + - "NM" + - "NV" + - "NY" + - "OH" + - "OK" + - "OR" + - "PA" + - "RI" + - "SC" + - "SD" + - "TN" + - "TX" + - "UT" + - "VA" + - "VT" + - "WA" + - "WI" + - "WV" + - "WY" + - "AA" + - "AE" + - "AP" + - "AS" + - "FM" + - "GU" + - "MH" + - "MP" + - "PR" + - "PW" + - "VI" whens: - ref: @@ -148,20 +213,15 @@ override: true - "international" then: - type: "string" + type: "any" flags: presence: "optional" allow: - null otherwise: - type: "string" + type: "any" flags: presence: "required" - rules: - - - name: "max" - args: - limit: 100 email: type: "string" flags: @@ -203,7 +263,12 @@ allow: - null judgeFullName: - type: "any" + type: "string" + rules: + - + name: "max" + args: + limit: 100 whens: - ref: @@ -219,14 +284,9 @@ override: true - "judge" then: - type: "string" + type: "any" flags: presence: "optional" - rules: - - - name: "max" - args: - limit: 100 otherwise: type: "any" flags: @@ -234,7 +294,12 @@ allow: - null judgeTitle: - type: "any" + type: "string" + rules: + - + name: "max" + args: + limit: 100 whens: - ref: @@ -250,14 +315,9 @@ override: true - "judge" then: - type: "string" + type: "any" flags: presence: "optional" - rules: - - - name: "max" - args: - limit: 100 otherwise: type: "any" flags: diff --git a/docs/entities/Order.md b/docs/entities/Order.md index a4e5f62d935..cbe62e1b79f 100644 --- a/docs/entities/Order.md +++ b/docs/entities/Order.md @@ -15,11 +15,703 @@ documentType: type: "string" flags: + only: true presence: "required" + allow: + - "Application for Waiver of Filing Fee" + - "Ownership Disclosure Statement" + - "Petition" + - "Request for Place of Trial" + - "Statement of Taxpayer Identification" + - "Entry of Appearance" + - "Substitution of Counsel" + - "Answer" + - "Answer to Amended Petition" + - "Answer to Amended Petition, as Amended" + - "Answer to Amendment to Amended Petition" + - "Answer to Amendment to Petition" + - "Answer to Petition, as Amended" + - "Answer to Second Amended Petition" + - "Answer to Second Amendment to Petition" + - "Answer to Supplement to Petition" + - "Answer to Third Amended Petition" + - "Answer to Third Amendment to Petition" + - "Designation of Counsel to Receive Service" + - "Motion to Withdraw as Counsel" + - "Motion to Withdraw Counsel (filed by petitioner)" + - "Application for Waiver of Filing Fee and Affidavit" + - "Application to Take Deposition" + - "Agreed Computation for Entry of Decision" + - "Computation for Entry of Decision" + - "Proposed Stipulated Decision" + - "Revised Computation" + - "Administrative Record" + - "Amended" + - "Amended Certificate of Service" + - "Amendment [anything]" + - "Certificate as to the Genuineness of the Administrative Record" + - "Certificate of Service" + - "Civil Penalty Approval Form" + - "Exhibit(s)" + - "Memorandum" + - "Partial Administrative Record" + - "Ratification" + - "Redacted" + - "Report" + - "Status Report" + - "Motion for Continuance" + - "Motion for Extension of Time" + - "Motion to Dismiss for Lack of Jurisdiction" + - "Motion to Dismiss for Lack of Prosecution" + - "Motion for Summary Judgment" + - "Motion to Change or Correct Caption" + - "Motion for a New Trial" + - "Motion for an Order under Federal Rule of Evidence 502(d)" + - "Motion for an Order under Model Rule of Professional Conduct 4.2" + - "Motion for Appointment of Mediator" + - "Motion for Assignment of Judge" + - "Motion for Audio of Trial Proceeding(s)" + - "Motion for Certification of an Interlocutory Order to Permit Immediate Appeal" + - "Motion for Default and Dismissal" + - "Motion for Entry of Decision" + - "Motion for Entry of Order that Undenied Allegations be Deemed Admitted Pursuant to Rule 37(c)" + - "Motion for Estate Tax Deduction Developing at or after Trial Pursuant to Rule 156" + - "Motion for in Camera Review" + - "Motion for International Judicial Assistance" + - "Motion for Judgment on the Pleadings" + - "Motion for Leave to Conduct Discovery Pursuant to Rule 70(a)(2)" + - "Motion for Leave to File" + - "Motion for Leave to File Out of Time" + - "Motion for Leave to Serve Additional Interrogatories" + - "Motion for Leave to Use Electronic Equipment" + - "Motion for More Definite Statement Pursuant to Rule 51" + - "Motion for Non-Binding Mediation" + - "Motion for Oral Argument" + - "Motion for Order Fixing Amount of an Appeal Bond" + - "Motion for Order to Release the Amount of an Appeal Bond" + - "Motion for Order to Show Cause Why Case Should Not Be Sumitted on the Basis of the Administrative Record" + - "Motion for Order to Show Cause Why Judgment Should Not be Entered on the Basis of a Previously Decided Case" + - "Motion for Order to Show Cause Why Proposed Facts and Evidence Should Not be Accepted as Established Pursuant to Rule 91(f)" + - "Motion for Partial Summary Judgment" + - "Motion for Pretrial Conference" + - "Motion for Protective Order Pursuant to Rule 103" + - "Motion for Reasonable Litigation or Administrative Costs" + - "Motion for Reconsideration of Findings or Opinion Pursuant to Rule 161" + - "Motion for Reconsideration of Order" + - "Motion for Recusal of Judge" + - "Motion for Review of Jeopardy Assessment or Jeopardy Levy Pursuant to Rule 56" + - "Motion for the Court to Pay the Expenses of a Transcript" + - "Motion for the Court to Pay the Expenses of an Interpreter" + - "Motion for Voluntary Binding Arbitration" + - "Motion for Writ of Habeas Corpus Ad Testificandum" + - "Motion in Limine" + - "Motion to Add Lien or Levy Designation" + - "Motion to Add Small Tax case Designation" + - "Motion to Amend Order" + - "Motion to Appoint an Interpreter Pursuant to Rule 143(f)" + - "Motion to Appoint New Tax Matters Partner" + - "Motion to Appoint Tax Matters Partner" + - "Motion to Authorize Proposed Sale of Seized Property" + - "Motion to Be Excused from Appearing at the Trial Session" + - "Motion to Be Recognized as Next Friend" + - "Motion to Bifurcate" + - "Motion to Calendar" + - "Motion to Calendar and Consolidate" + - "Motion to Calendar in the Electronic (North) Courtroom" + - "Motion to Certify for Interlocutory Appeal" + - "Motion to Change or Correct Docket Entry" + - "Motion to Change Place of Submission of Declaratory Judgment Case" + - "Motion to Change Place of Trial" + - "Motion to Change Service Method" + - "Motion to Clarify Order" + - "Motion to Close on Ground of Duplication" + - "Motion to Compel Discovery" + - "Motion to Compel Production of Documents" + - "Motion to Compel Responses to Interrogatories" + - "Motion to Compel the Taking of Deposition" + - "Motion to Conform the Pleadings to the Proof" + - "Motion to Consolidate" + - "Motion to Correct and Certify Record on Appeal" + - "Motion to Correct Clerical Order" + - "Motion to Correct Transcript" + - "Motion to Depose Pursuant to Rule 74" + - "Motion to Determine the Tax Matters Partner" + - "Motion to Dismiss" + - "Motion to Dismiss for Failure to Properly Prosecute" + - "Motion to Dismiss for Failure to State a Claim upon Which Relief Can Be Granted" + - "Motion to Dismiss for Lack of Jurisdiction as to [person, notice, or year]" + - "Motion to Dismiss on Grounds of Mootness" + - "Motion to Disqualify Counsel" + - "Motion to Enforce a Refund of Overpayment Pursuant to Rule 260" + - "Motion to Enforce Subpoena" + - "Motion to Extend Time to Move or File Answer" + - "Motion to Impose a Penalty" + - "Motion to Impose Sanctions" + - "Motion to Modify Decision in Estate Tax Case Pursuant to Rule 262" + - "Motion to Modify Order" + - "Motion to Permit Expert Witness to Testify without a Written Report Regarding Industry Practice Pursuant to Rule 143(g)(3)" + - "Motion to Permit Levy" + - "Motion to Preclude" + - "Motion to Quash or Modify Subpoena" + - "Motion to Redetermine Interest Pursuant to Rule 261" + - "Motion to Remand" + - "Motion to Remove Lien/Levy Designation" + - "Motion to Remove Small Tax Case Designation" + - "Motion to Remove Tax Matters Partner" + - "Motion to Reopen the Record" + - "Motion to Require Petitioner to File a Reply in a Small Tax Case Pursuant to Rule 173(c)" + - "Motion to Restore Case to the General Docket" + - "Motion to Restrain Assessment or Collection or to Order Refund of Amount Collected" + - "Motion to Retain File in Estate Tax Case Involving § 6166 Election Pursuant to Rule 157" + - "Motion to Review the Sufficiency of Answers or Objections to Request for Admissions" + - "Motion to Seal" + - "Motion to Set for a Time & Date Certain" + - "Motion to Set Pretrial Scheduling Order" + - "Motion to Sever" + - "Motion to Shift the Burden of Proof" + - "Motion to Shorten the Time" + - "Motion to Stay Proceedings" + - "Motion to Stay Proposed Sale of Seized Property" + - "Motion to Strike" + - "Motion to Submit Case Pursuant to Rule 122" + - "Motion to Substitute Parties and Change Caption" + - "Motion to Substitute Trial Exhibit(s)" + - "Motion to Supplement the Record" + - "Motion to Suppress Evidence" + - "Motion to Take Deposition Pursuant to Rule 74(c)(3)" + - "Motion to Take Judicial Notice" + - "Motion to Vacate" + - "Motion to Vacate or Revise Pursuant to Rule 162" + - "Motion to Withdraw" + - "Motion to Withdraw or Modify the Deemed Admitted Admissions Pursuant to Rule 90(f)" + - "Notice of Abatement of Jeopardy Assessment" + - "Notice of Appeal" + - "Notice of Change of Address" + - "Notice of Change of Address and Telephone Number" + - "Notice of Change of Telephone Number" + - "Notice of Clarification of Tax Matters Partner" + - "Notice of Concession" + - "Notice of Consistent Agreement Pursuant to Rule 248(c)(1)" + - "Notice of Death of Counsel" + - "Notice of Filing of Petition and Right to Intervene" + - "Notice of Filing of the Administrative Record" + - "Notice of Identification of Tax Matters Partner" + - "Notice of Intent Not to File" + - "Notice of Issue Concerning Foreign Law" + - "Notice of Jeopardy Assessment" + - "Notice of Judicial Ruling" + - "Notice of No Objection" + - "Notice of Objection" + - "Notice of Partial Abatement of Jeopardy Assessment" + - "Notice of Proceeding in Bankruptcy" + - "Notice of Relevant Judicial Decisions" + - "Notice of Settlement Agreement Pursuant to Rule 248(c)(1)" + - "Notice of Small Tax Case Election" + - "Notice of Supplemental Authority" + - "Notice of Telephone Number" + - "Notice of Termination Assessment" + - "Notice of Unavailability" + - "Redacted Petition Filed" + - "Prehearing Memorandum" + - "Pretrial Memorandum" + - "Reply" + - "Sur-Reply" + - "Request for Admissions" + - "Request for Judicial Notice" + - "Request for Pretrial Conference" + - "No Objection" + - "Objection" + - "Opposition" + - "Response" + - "Seriatim Answering Brief" + - "Seriatim Answering Memorandum Brief" + - "Seriatim Opening Brief" + - "Seriatim Opening Memorandum Brief" + - "Seriatim Reply Brief" + - "Seriatim Reply Memorandum Brief" + - "Seriatim Sur-Reply Brief" + - "Seriatim Sur-Reply Memorandum Brief" + - "Simultaneous Answering Brief" + - "Simultaneous Answering Memoranda of Law" + - "Simultaneous Answering Memorandum Brief" + - "Simultaneous Memoranda of Law" + - "Simultaneous Opening Brief" + - "Simultaneous Opening Memorandum Brief" + - "Simultaneous Reply Brief" + - "Simultaneous Supplemental Brief" + - "Simultaneous Sur-Reply Brief" + - "Simultaneous Sur-Reply Memorandum Brief" + - "Statement" + - "Statement of Redacted Information" + - "Statement under Rule 212" + - "Statement under Rule 50(c)" + - "Settlement Stipulation" + - "Stipulation" + - "Stipulation as to the Administrative Record" + - "Stipulation as to the Partial Administrative Record" + - "Stipulation of Facts" + - "Stipulation of Pretrial Deadlines" + - "Stipulation of Settled Issues" + - "Stipulation of Settlement" + - "Stipulation to Be Bound" + - "Stipulation to Take Deposition" + - "Supplement" + - "Supplemental" + - "Affidavit in Support" + - "Brief in Support" + - "Declaration in Support" + - "Memorandum in Support" + - "Unsworn Declaration under Penalty of Perjury in Support" + - "Application" + - "Application for Examination Pursuant to Rule 73" + - "Amended [Document Name]" + - "Appellate Filing Fee Received" + - "Bond" + - "Bounced Electronic Service" + - "Evidence" + - "Hearing Exhibits" + - "Letter" + - "Miscellaneous" + - "Miscellaneous (Lodged)" + - "Reference List of Redacted Information" + - "Returned Mail" + - "Trial Exhibits" + - "U.S.C.A. [Anything]" + - "Motion" + - "Motion for Review By the Full Court" + - "Motion for Review En Banc" + - "Motion to Be Exempt from E-Filing" + - "Motion to Change Place of Hearing of Disclosure Case" + - "Motion to File Document Under Seal" + - "Motion to Intervene" + - "Motion to Proceed Anonymously" + - "Notice" + - "Notice of Change of Counsel for Non-Party" + - "Notice of Election to Intervene" + - "Notice of Election to Participate" + - "Notice of Intervention" + - "Ratification of Petition" + - "Request" + - "Objection [anything]" + - "Opposition [anything]" + - "Response [anything]" + - "Supplement To [anything]" + - "Supplemental [anything]" + - "Order" + - "Order of Dismissal for Lack of Jurisdiction" + - "Order of Dismissal" + - "Order of Dismissal and Decision" + - "Order to Show Cause" + - "Order and Decision" + - "Decision" + - "O - Order" + - "OAJ - Order that case is assigned" + - "OAL - Order that the letter \"L\" is added to Docket number" + - "OAP - Order for Amended Petition" + - "OAPF - Order for Amended Petition and Filing Fee" + - "OAR - Order that the letter \"R\" is added to the Docket number" + - "OAS - Order that the letter \"S\" is added to the Docket number" + - "OASL - Order that the letters \"SL\" are added to the Docket number" + - "OAW - Order that the letter \"W\" is added to the Docket number" + - "OAX - Order that the letter \"X\" is added to the Docket number" + - "OCA - Order that caption of case is amended" + - "OD - Order of Dismissal Entered" + - "ODD - Order of Dismissal and Decision Entered" + - "ODL - Order that the letter \"L\" is deleted from the Docket number" + - "ODP - Order that the letter \"P\" is deleted from the Docket number" + - "ODR - Order that the letter \"R\" is deleted from the Docket number" + - "ODS - Order that the letter \"S\" is deleted from the Docket number" + - "ODSL - Order that the letters \"SL\" are deleted from the Docket number" + - "ODW - Order that the letter \"W\" is deleted from the Docket number" + - "ODX - Order that the letter \"X\" is deleted from the Docket number" + - "OF - Order for Filing Fee" + - "OFAB - Order fixing amount of bond" + - "OFFX - Order time is extended for petr(s) to pay the filing fee" + - "OFWD - Order for Filing Fee. Application waiver of Filing Fee is denied." + - "OFX - Order time is extended for petr(s) to pay filing fee or submit an Application for Waiver of Filing fee" + - "OIP - Order that the letter \"P\" is added to the Docket number" + - "OJR - Order that jurisdiction is retained" + - "OODS - Order for Ownership Disclosure Statement" + - "OPFX - Order time is extended for petr(s) to file Amended Petition and pay the Filing Fee or submit an Application for Waiver of Filing Fee" + - "OPX - Order time is extended for petr(s) to file Amended Petition" + - "ORAP - Order for Amendment to Petition" + - "OROP - Order for Ratification of Petition" + - "OSC - Order" + - "OSCP - Order petr(s) to show cause why \"S\" should not be removed" + - "OST - Order of Service of Transcript (Bench Opinion)" + - "OSUB - Order that case is submitted" + - "DEC - Decision Entered" + - "OAD - Order and Decision Entered" + - "ODJ - Order of Dismissal for Lack of Jurisdiction Entered" + - "SDEC - Stipulated Decision Entered" + - "MOP - Memorandum Opinion" + - "NOT - Notice" + - "Summary Opinion" + - "Writ of Habeas Corpus Ad Testificandum" + - "CTRA - Corrected Transcript" + - "FTRL - Further Trial before ..." + - "HEAR - Hearing before ..." + - "NTD - Notice of Trial" + - "PTRL - Partial Trial before ..." + - "TRL - Trial before ..." + - "ROA - Record on Appeal" + - "TCOP - T.C. Opinion" + - "RTRA - Revised Transcript" + - "TRAN - Transcript" + - "SPTO - Standing Pre-Trial Order" + - "MISC - Miscellaneous" + - "Stipulated Decision" + - "Notice of Docket Change" + - "Notice of Trial" + - "Standing Pretrial Notice" + - "Standing Pretrial Order" eventCode: type: "string" flags: + only: true presence: "optional" + allow: + - "A" + - "AAAP" + - "AAPN" + - "AATP" + - "AATS" + - "AATT" + - "ACED" + - "ADMR" + - "ADMT" + - "AFE" + - "AFF" + - "AFP" + - "AMAT" + - "AMDC" + - "APA" + - "APLD" + - "APPL" + - "APPW" + - "APW" + - "ASAP" + - "ASUP" + - "ATAP" + - "ATSP" + - "BND" + - "BRF" + - "CERT" + - "CIVP" + - "COED" + - "CS" + - "CTRA" + - "DCL" + - "DEC" + - "DISC" + - "DSC" + - "EA" + - "ES" + - "EVID" + - "EXH" + - "FEE" + - "FEEW" + - "FTRL" + - "HE" + - "HEAR" + - "LTR" + - "M000" + - "M001" + - "M002" + - "M003" + - "M004" + - "M005" + - "M006" + - "M007" + - "M008" + - "M009" + - "M010" + - "M011" + - "M012" + - "M013" + - "M014" + - "M015" + - "M016" + - "M017" + - "M018" + - "M019" + - "M020" + - "M021" + - "M022" + - "M023" + - "M024" + - "M026" + - "M027" + - "M028" + - "M029" + - "M030" + - "M031" + - "M032" + - "M033" + - "M034" + - "M035" + - "M036" + - "M037" + - "M038" + - "M039" + - "M040" + - "M041" + - "M042" + - "M043" + - "M044" + - "M045" + - "M046" + - "M047" + - "M048" + - "M049" + - "M050" + - "M051" + - "M052" + - "M053" + - "M054" + - "M055" + - "M056" + - "M057" + - "M058" + - "M059" + - "M060" + - "M061" + - "M062" + - "M063" + - "M064" + - "M065" + - "M066" + - "M067" + - "M068" + - "M069" + - "M070" + - "M071" + - "M072" + - "M073" + - "M074" + - "M075" + - "M076" + - "M077" + - "M078" + - "M079" + - "M080" + - "M081" + - "M082" + - "M083" + - "M084" + - "M085" + - "M086" + - "M087" + - "M088" + - "M089" + - "M090" + - "M091" + - "M092" + - "M093" + - "M094" + - "M095" + - "M096" + - "M097" + - "M098" + - "M099" + - "M100" + - "M101" + - "M102" + - "M103" + - "M104" + - "M105" + - "M106" + - "M107" + - "M108" + - "M109" + - "M110" + - "M111" + - "M112" + - "M113" + - "M114" + - "M115" + - "M116" + - "M117" + - "M118" + - "M119" + - "M120" + - "M121" + - "M122" + - "M123" + - "M124" + - "M125" + - "M126" + - "M129" + - "M130" + - "M131" + - "M132" + - "M133" + - "M134" + - "M135" + - "M136" + - "M218" + - "MEMO" + - "MGRTED" + - "MINC" + - "MIND" + - "MISC" + - "MISCL" + - "MISL" + - "MISP" + - "MOP" + - "NAJA" + - "NCA" + - "NCAG" + - "NCAP" + - "NCNP" + - "NCON" + - "NCP" + - "NCTP" + - "NDC" + - "NDT" + - "NFAR" + - "NIFL" + - "NINF" + - "NIS" + - "NITM" + - "NJAR" + - "NNOB" + - "NOA" + - "NOB" + - "NODC" + - "NOEI" + - "NOEP" + - "NOI" + - "NOST" + - "NOT" + - "NOU" + - "NPB" + - "NPJR" + - "NRJD" + - "NRJR" + - "NSA" + - "NSTE" + - "NTA" + - "NTD" + - "NTN" + - "O" + - "OAD" + - "OAJ" + - "OAL" + - "OAP" + - "OAPF" + - "OAR" + - "OAS" + - "OASL" + - "OAW" + - "OAX" + - "OBJ" + - "OBJE" + - "OBJN" + - "OCA" + - "OD" + - "ODD" + - "ODJ" + - "ODL" + - "ODP" + - "ODR" + - "ODS" + - "ODSL" + - "ODW" + - "ODX" + - "OF" + - "OFAB" + - "OFFX" + - "OFWD" + - "OFX" + - "OIP" + - "OJR" + - "OODS" + - "OP" + - "OPFX" + - "OPPO" + - "OPX" + - "ORAP" + - "OROP" + - "OSC" + - "OSCP" + - "OST" + - "OSUB" + - "P" + - "PARD" + - "PHM" + - "PMT" + - "PSDE" + - "PTFR" + - "PTRL" + - "RAT" + - "RATF" + - "RCOM" + - "REDC" + - "REPL" + - "REQ" + - "REQA" + - "RESP" + - "RFPC" + - "RJN" + - "RLRI" + - "RM" + - "ROA" + - "RPT" + - "RQT" + - "RSP" + - "RTP" + - "RTRA" + - "S212" + - "SADM" + - "SAMB" + - "SATL" + - "SDEC" + - "SEAB" + - "SEOB" + - "SERB" + - "SESB" + - "SIAB" + - "SIAM" + - "SIMB" + - "SIML" + - "SIOB" + - "SIOM" + - "SIRB" + - "SISB" + - "SOC" + - "SOMB" + - "SOP" + - "SORI" + - "SPAR" + - "SPD" + - "SPML" + - "SPMT" + - "SPTN" + - "SPTO" + - "SRMB" + - "SSB" + - "SSRB" + - "SSRM" + - "SSTP" + - "STAR" + - "STAT" + - "STBB" + - "STIN" + - "STIP" + - "STP" + - "STPD" + - "STS" + - "STST" + - "SUPM" + - "SURP" + - "TCOP" + - "TE" + - "TRAN" + - "TRL" + - "USCA" + - "USDL" + - "WRIT" orderBody: type: "string" flags: diff --git a/docs/entities/OrderWithoutBody.md b/docs/entities/OrderWithoutBody.md index 603ebcb8622..b7d5698d1ee 100644 --- a/docs/entities/OrderWithoutBody.md +++ b/docs/entities/OrderWithoutBody.md @@ -7,13 +7,710 @@ type: "string" flags: presence: "required" + rules: + - + name: "max" + args: + limit: 100 documentType: type: "string" flags: + only: true presence: "required" + allow: + - "Application for Waiver of Filing Fee" + - "Ownership Disclosure Statement" + - "Petition" + - "Request for Place of Trial" + - "Statement of Taxpayer Identification" + - "Entry of Appearance" + - "Substitution of Counsel" + - "Answer" + - "Answer to Amended Petition" + - "Answer to Amended Petition, as Amended" + - "Answer to Amendment to Amended Petition" + - "Answer to Amendment to Petition" + - "Answer to Petition, as Amended" + - "Answer to Second Amended Petition" + - "Answer to Second Amendment to Petition" + - "Answer to Supplement to Petition" + - "Answer to Third Amended Petition" + - "Answer to Third Amendment to Petition" + - "Designation of Counsel to Receive Service" + - "Motion to Withdraw as Counsel" + - "Motion to Withdraw Counsel (filed by petitioner)" + - "Application for Waiver of Filing Fee and Affidavit" + - "Application to Take Deposition" + - "Agreed Computation for Entry of Decision" + - "Computation for Entry of Decision" + - "Proposed Stipulated Decision" + - "Revised Computation" + - "Administrative Record" + - "Amended" + - "Amended Certificate of Service" + - "Amendment [anything]" + - "Certificate as to the Genuineness of the Administrative Record" + - "Certificate of Service" + - "Civil Penalty Approval Form" + - "Exhibit(s)" + - "Memorandum" + - "Partial Administrative Record" + - "Ratification" + - "Redacted" + - "Report" + - "Status Report" + - "Motion for Continuance" + - "Motion for Extension of Time" + - "Motion to Dismiss for Lack of Jurisdiction" + - "Motion to Dismiss for Lack of Prosecution" + - "Motion for Summary Judgment" + - "Motion to Change or Correct Caption" + - "Motion for a New Trial" + - "Motion for an Order under Federal Rule of Evidence 502(d)" + - "Motion for an Order under Model Rule of Professional Conduct 4.2" + - "Motion for Appointment of Mediator" + - "Motion for Assignment of Judge" + - "Motion for Audio of Trial Proceeding(s)" + - "Motion for Certification of an Interlocutory Order to Permit Immediate Appeal" + - "Motion for Default and Dismissal" + - "Motion for Entry of Decision" + - "Motion for Entry of Order that Undenied Allegations be Deemed Admitted Pursuant to Rule 37(c)" + - "Motion for Estate Tax Deduction Developing at or after Trial Pursuant to Rule 156" + - "Motion for in Camera Review" + - "Motion for International Judicial Assistance" + - "Motion for Judgment on the Pleadings" + - "Motion for Leave to Conduct Discovery Pursuant to Rule 70(a)(2)" + - "Motion for Leave to File" + - "Motion for Leave to File Out of Time" + - "Motion for Leave to Serve Additional Interrogatories" + - "Motion for Leave to Use Electronic Equipment" + - "Motion for More Definite Statement Pursuant to Rule 51" + - "Motion for Non-Binding Mediation" + - "Motion for Oral Argument" + - "Motion for Order Fixing Amount of an Appeal Bond" + - "Motion for Order to Release the Amount of an Appeal Bond" + - "Motion for Order to Show Cause Why Case Should Not Be Sumitted on the Basis of the Administrative Record" + - "Motion for Order to Show Cause Why Judgment Should Not be Entered on the Basis of a Previously Decided Case" + - "Motion for Order to Show Cause Why Proposed Facts and Evidence Should Not be Accepted as Established Pursuant to Rule 91(f)" + - "Motion for Partial Summary Judgment" + - "Motion for Pretrial Conference" + - "Motion for Protective Order Pursuant to Rule 103" + - "Motion for Reasonable Litigation or Administrative Costs" + - "Motion for Reconsideration of Findings or Opinion Pursuant to Rule 161" + - "Motion for Reconsideration of Order" + - "Motion for Recusal of Judge" + - "Motion for Review of Jeopardy Assessment or Jeopardy Levy Pursuant to Rule 56" + - "Motion for the Court to Pay the Expenses of a Transcript" + - "Motion for the Court to Pay the Expenses of an Interpreter" + - "Motion for Voluntary Binding Arbitration" + - "Motion for Writ of Habeas Corpus Ad Testificandum" + - "Motion in Limine" + - "Motion to Add Lien or Levy Designation" + - "Motion to Add Small Tax case Designation" + - "Motion to Amend Order" + - "Motion to Appoint an Interpreter Pursuant to Rule 143(f)" + - "Motion to Appoint New Tax Matters Partner" + - "Motion to Appoint Tax Matters Partner" + - "Motion to Authorize Proposed Sale of Seized Property" + - "Motion to Be Excused from Appearing at the Trial Session" + - "Motion to Be Recognized as Next Friend" + - "Motion to Bifurcate" + - "Motion to Calendar" + - "Motion to Calendar and Consolidate" + - "Motion to Calendar in the Electronic (North) Courtroom" + - "Motion to Certify for Interlocutory Appeal" + - "Motion to Change or Correct Docket Entry" + - "Motion to Change Place of Submission of Declaratory Judgment Case" + - "Motion to Change Place of Trial" + - "Motion to Change Service Method" + - "Motion to Clarify Order" + - "Motion to Close on Ground of Duplication" + - "Motion to Compel Discovery" + - "Motion to Compel Production of Documents" + - "Motion to Compel Responses to Interrogatories" + - "Motion to Compel the Taking of Deposition" + - "Motion to Conform the Pleadings to the Proof" + - "Motion to Consolidate" + - "Motion to Correct and Certify Record on Appeal" + - "Motion to Correct Clerical Order" + - "Motion to Correct Transcript" + - "Motion to Depose Pursuant to Rule 74" + - "Motion to Determine the Tax Matters Partner" + - "Motion to Dismiss" + - "Motion to Dismiss for Failure to Properly Prosecute" + - "Motion to Dismiss for Failure to State a Claim upon Which Relief Can Be Granted" + - "Motion to Dismiss for Lack of Jurisdiction as to [person, notice, or year]" + - "Motion to Dismiss on Grounds of Mootness" + - "Motion to Disqualify Counsel" + - "Motion to Enforce a Refund of Overpayment Pursuant to Rule 260" + - "Motion to Enforce Subpoena" + - "Motion to Extend Time to Move or File Answer" + - "Motion to Impose a Penalty" + - "Motion to Impose Sanctions" + - "Motion to Modify Decision in Estate Tax Case Pursuant to Rule 262" + - "Motion to Modify Order" + - "Motion to Permit Expert Witness to Testify without a Written Report Regarding Industry Practice Pursuant to Rule 143(g)(3)" + - "Motion to Permit Levy" + - "Motion to Preclude" + - "Motion to Quash or Modify Subpoena" + - "Motion to Redetermine Interest Pursuant to Rule 261" + - "Motion to Remand" + - "Motion to Remove Lien/Levy Designation" + - "Motion to Remove Small Tax Case Designation" + - "Motion to Remove Tax Matters Partner" + - "Motion to Reopen the Record" + - "Motion to Require Petitioner to File a Reply in a Small Tax Case Pursuant to Rule 173(c)" + - "Motion to Restore Case to the General Docket" + - "Motion to Restrain Assessment or Collection or to Order Refund of Amount Collected" + - "Motion to Retain File in Estate Tax Case Involving § 6166 Election Pursuant to Rule 157" + - "Motion to Review the Sufficiency of Answers or Objections to Request for Admissions" + - "Motion to Seal" + - "Motion to Set for a Time & Date Certain" + - "Motion to Set Pretrial Scheduling Order" + - "Motion to Sever" + - "Motion to Shift the Burden of Proof" + - "Motion to Shorten the Time" + - "Motion to Stay Proceedings" + - "Motion to Stay Proposed Sale of Seized Property" + - "Motion to Strike" + - "Motion to Submit Case Pursuant to Rule 122" + - "Motion to Substitute Parties and Change Caption" + - "Motion to Substitute Trial Exhibit(s)" + - "Motion to Supplement the Record" + - "Motion to Suppress Evidence" + - "Motion to Take Deposition Pursuant to Rule 74(c)(3)" + - "Motion to Take Judicial Notice" + - "Motion to Vacate" + - "Motion to Vacate or Revise Pursuant to Rule 162" + - "Motion to Withdraw" + - "Motion to Withdraw or Modify the Deemed Admitted Admissions Pursuant to Rule 90(f)" + - "Notice of Abatement of Jeopardy Assessment" + - "Notice of Appeal" + - "Notice of Change of Address" + - "Notice of Change of Address and Telephone Number" + - "Notice of Change of Telephone Number" + - "Notice of Clarification of Tax Matters Partner" + - "Notice of Concession" + - "Notice of Consistent Agreement Pursuant to Rule 248(c)(1)" + - "Notice of Death of Counsel" + - "Notice of Filing of Petition and Right to Intervene" + - "Notice of Filing of the Administrative Record" + - "Notice of Identification of Tax Matters Partner" + - "Notice of Intent Not to File" + - "Notice of Issue Concerning Foreign Law" + - "Notice of Jeopardy Assessment" + - "Notice of Judicial Ruling" + - "Notice of No Objection" + - "Notice of Objection" + - "Notice of Partial Abatement of Jeopardy Assessment" + - "Notice of Proceeding in Bankruptcy" + - "Notice of Relevant Judicial Decisions" + - "Notice of Settlement Agreement Pursuant to Rule 248(c)(1)" + - "Notice of Small Tax Case Election" + - "Notice of Supplemental Authority" + - "Notice of Telephone Number" + - "Notice of Termination Assessment" + - "Notice of Unavailability" + - "Redacted Petition Filed" + - "Prehearing Memorandum" + - "Pretrial Memorandum" + - "Reply" + - "Sur-Reply" + - "Request for Admissions" + - "Request for Judicial Notice" + - "Request for Pretrial Conference" + - "No Objection" + - "Objection" + - "Opposition" + - "Response" + - "Seriatim Answering Brief" + - "Seriatim Answering Memorandum Brief" + - "Seriatim Opening Brief" + - "Seriatim Opening Memorandum Brief" + - "Seriatim Reply Brief" + - "Seriatim Reply Memorandum Brief" + - "Seriatim Sur-Reply Brief" + - "Seriatim Sur-Reply Memorandum Brief" + - "Simultaneous Answering Brief" + - "Simultaneous Answering Memoranda of Law" + - "Simultaneous Answering Memorandum Brief" + - "Simultaneous Memoranda of Law" + - "Simultaneous Opening Brief" + - "Simultaneous Opening Memorandum Brief" + - "Simultaneous Reply Brief" + - "Simultaneous Supplemental Brief" + - "Simultaneous Sur-Reply Brief" + - "Simultaneous Sur-Reply Memorandum Brief" + - "Statement" + - "Statement of Redacted Information" + - "Statement under Rule 212" + - "Statement under Rule 50(c)" + - "Settlement Stipulation" + - "Stipulation" + - "Stipulation as to the Administrative Record" + - "Stipulation as to the Partial Administrative Record" + - "Stipulation of Facts" + - "Stipulation of Pretrial Deadlines" + - "Stipulation of Settled Issues" + - "Stipulation of Settlement" + - "Stipulation to Be Bound" + - "Stipulation to Take Deposition" + - "Supplement" + - "Supplemental" + - "Affidavit in Support" + - "Brief in Support" + - "Declaration in Support" + - "Memorandum in Support" + - "Unsworn Declaration under Penalty of Perjury in Support" + - "Application" + - "Application for Examination Pursuant to Rule 73" + - "Amended [Document Name]" + - "Appellate Filing Fee Received" + - "Bond" + - "Bounced Electronic Service" + - "Evidence" + - "Hearing Exhibits" + - "Letter" + - "Miscellaneous" + - "Miscellaneous (Lodged)" + - "Reference List of Redacted Information" + - "Returned Mail" + - "Trial Exhibits" + - "U.S.C.A. [Anything]" + - "Motion" + - "Motion for Review By the Full Court" + - "Motion for Review En Banc" + - "Motion to Be Exempt from E-Filing" + - "Motion to Change Place of Hearing of Disclosure Case" + - "Motion to File Document Under Seal" + - "Motion to Intervene" + - "Motion to Proceed Anonymously" + - "Notice" + - "Notice of Change of Counsel for Non-Party" + - "Notice of Election to Intervene" + - "Notice of Election to Participate" + - "Notice of Intervention" + - "Ratification of Petition" + - "Request" + - "Objection [anything]" + - "Opposition [anything]" + - "Response [anything]" + - "Supplement To [anything]" + - "Supplemental [anything]" + - "Order" + - "Order of Dismissal for Lack of Jurisdiction" + - "Order of Dismissal" + - "Order of Dismissal and Decision" + - "Order to Show Cause" + - "Order and Decision" + - "Decision" + - "O - Order" + - "OAJ - Order that case is assigned" + - "OAL - Order that the letter \"L\" is added to Docket number" + - "OAP - Order for Amended Petition" + - "OAPF - Order for Amended Petition and Filing Fee" + - "OAR - Order that the letter \"R\" is added to the Docket number" + - "OAS - Order that the letter \"S\" is added to the Docket number" + - "OASL - Order that the letters \"SL\" are added to the Docket number" + - "OAW - Order that the letter \"W\" is added to the Docket number" + - "OAX - Order that the letter \"X\" is added to the Docket number" + - "OCA - Order that caption of case is amended" + - "OD - Order of Dismissal Entered" + - "ODD - Order of Dismissal and Decision Entered" + - "ODL - Order that the letter \"L\" is deleted from the Docket number" + - "ODP - Order that the letter \"P\" is deleted from the Docket number" + - "ODR - Order that the letter \"R\" is deleted from the Docket number" + - "ODS - Order that the letter \"S\" is deleted from the Docket number" + - "ODSL - Order that the letters \"SL\" are deleted from the Docket number" + - "ODW - Order that the letter \"W\" is deleted from the Docket number" + - "ODX - Order that the letter \"X\" is deleted from the Docket number" + - "OF - Order for Filing Fee" + - "OFAB - Order fixing amount of bond" + - "OFFX - Order time is extended for petr(s) to pay the filing fee" + - "OFWD - Order for Filing Fee. Application waiver of Filing Fee is denied." + - "OFX - Order time is extended for petr(s) to pay filing fee or submit an Application for Waiver of Filing fee" + - "OIP - Order that the letter \"P\" is added to the Docket number" + - "OJR - Order that jurisdiction is retained" + - "OODS - Order for Ownership Disclosure Statement" + - "OPFX - Order time is extended for petr(s) to file Amended Petition and pay the Filing Fee or submit an Application for Waiver of Filing Fee" + - "OPX - Order time is extended for petr(s) to file Amended Petition" + - "ORAP - Order for Amendment to Petition" + - "OROP - Order for Ratification of Petition" + - "OSC - Order" + - "OSCP - Order petr(s) to show cause why \"S\" should not be removed" + - "OST - Order of Service of Transcript (Bench Opinion)" + - "OSUB - Order that case is submitted" + - "DEC - Decision Entered" + - "OAD - Order and Decision Entered" + - "ODJ - Order of Dismissal for Lack of Jurisdiction Entered" + - "SDEC - Stipulated Decision Entered" + - "MOP - Memorandum Opinion" + - "NOT - Notice" + - "Summary Opinion" + - "Writ of Habeas Corpus Ad Testificandum" + - "CTRA - Corrected Transcript" + - "FTRL - Further Trial before ..." + - "HEAR - Hearing before ..." + - "NTD - Notice of Trial" + - "PTRL - Partial Trial before ..." + - "TRL - Trial before ..." + - "ROA - Record on Appeal" + - "TCOP - T.C. Opinion" + - "RTRA - Revised Transcript" + - "TRAN - Transcript" + - "SPTO - Standing Pre-Trial Order" + - "MISC - Miscellaneous" + - "Stipulated Decision" + - "Notice of Docket Change" + - "Notice of Trial" + - "Standing Pretrial Notice" + - "Standing Pretrial Order" eventCode: type: "string" flags: + only: true presence: "required" + allow: + - "A" + - "AAAP" + - "AAPN" + - "AATP" + - "AATS" + - "AATT" + - "ACED" + - "ADMR" + - "ADMT" + - "AFE" + - "AFF" + - "AFP" + - "AMAT" + - "AMDC" + - "APA" + - "APLD" + - "APPL" + - "APPW" + - "APW" + - "ASAP" + - "ASUP" + - "ATAP" + - "ATSP" + - "BND" + - "BRF" + - "CERT" + - "CIVP" + - "COED" + - "CS" + - "CTRA" + - "DCL" + - "DEC" + - "DISC" + - "DSC" + - "EA" + - "ES" + - "EVID" + - "EXH" + - "FEE" + - "FEEW" + - "FTRL" + - "HE" + - "HEAR" + - "LTR" + - "M000" + - "M001" + - "M002" + - "M003" + - "M004" + - "M005" + - "M006" + - "M007" + - "M008" + - "M009" + - "M010" + - "M011" + - "M012" + - "M013" + - "M014" + - "M015" + - "M016" + - "M017" + - "M018" + - "M019" + - "M020" + - "M021" + - "M022" + - "M023" + - "M024" + - "M026" + - "M027" + - "M028" + - "M029" + - "M030" + - "M031" + - "M032" + - "M033" + - "M034" + - "M035" + - "M036" + - "M037" + - "M038" + - "M039" + - "M040" + - "M041" + - "M042" + - "M043" + - "M044" + - "M045" + - "M046" + - "M047" + - "M048" + - "M049" + - "M050" + - "M051" + - "M052" + - "M053" + - "M054" + - "M055" + - "M056" + - "M057" + - "M058" + - "M059" + - "M060" + - "M061" + - "M062" + - "M063" + - "M064" + - "M065" + - "M066" + - "M067" + - "M068" + - "M069" + - "M070" + - "M071" + - "M072" + - "M073" + - "M074" + - "M075" + - "M076" + - "M077" + - "M078" + - "M079" + - "M080" + - "M081" + - "M082" + - "M083" + - "M084" + - "M085" + - "M086" + - "M087" + - "M088" + - "M089" + - "M090" + - "M091" + - "M092" + - "M093" + - "M094" + - "M095" + - "M096" + - "M097" + - "M098" + - "M099" + - "M100" + - "M101" + - "M102" + - "M103" + - "M104" + - "M105" + - "M106" + - "M107" + - "M108" + - "M109" + - "M110" + - "M111" + - "M112" + - "M113" + - "M114" + - "M115" + - "M116" + - "M117" + - "M118" + - "M119" + - "M120" + - "M121" + - "M122" + - "M123" + - "M124" + - "M125" + - "M126" + - "M129" + - "M130" + - "M131" + - "M132" + - "M133" + - "M134" + - "M135" + - "M136" + - "M218" + - "MEMO" + - "MGRTED" + - "MINC" + - "MIND" + - "MISC" + - "MISCL" + - "MISL" + - "MISP" + - "MOP" + - "NAJA" + - "NCA" + - "NCAG" + - "NCAP" + - "NCNP" + - "NCON" + - "NCP" + - "NCTP" + - "NDC" + - "NDT" + - "NFAR" + - "NIFL" + - "NINF" + - "NIS" + - "NITM" + - "NJAR" + - "NNOB" + - "NOA" + - "NOB" + - "NODC" + - "NOEI" + - "NOEP" + - "NOI" + - "NOST" + - "NOT" + - "NOU" + - "NPB" + - "NPJR" + - "NRJD" + - "NRJR" + - "NSA" + - "NSTE" + - "NTA" + - "NTD" + - "NTN" + - "O" + - "OAD" + - "OAJ" + - "OAL" + - "OAP" + - "OAPF" + - "OAR" + - "OAS" + - "OASL" + - "OAW" + - "OAX" + - "OBJ" + - "OBJE" + - "OBJN" + - "OCA" + - "OD" + - "ODD" + - "ODJ" + - "ODL" + - "ODP" + - "ODR" + - "ODS" + - "ODSL" + - "ODW" + - "ODX" + - "OF" + - "OFAB" + - "OFFX" + - "OFWD" + - "OFX" + - "OIP" + - "OJR" + - "OODS" + - "OP" + - "OPFX" + - "OPPO" + - "OPX" + - "ORAP" + - "OROP" + - "OSC" + - "OSCP" + - "OST" + - "OSUB" + - "P" + - "PARD" + - "PHM" + - "PMT" + - "PSDE" + - "PTFR" + - "PTRL" + - "RAT" + - "RATF" + - "RCOM" + - "REDC" + - "REPL" + - "REQ" + - "REQA" + - "RESP" + - "RFPC" + - "RJN" + - "RLRI" + - "RM" + - "ROA" + - "RPT" + - "RQT" + - "RSP" + - "RTP" + - "RTRA" + - "S212" + - "SADM" + - "SAMB" + - "SATL" + - "SDEC" + - "SEAB" + - "SEOB" + - "SERB" + - "SESB" + - "SIAB" + - "SIAM" + - "SIMB" + - "SIML" + - "SIOB" + - "SIOM" + - "SIRB" + - "SISB" + - "SOC" + - "SOMB" + - "SOP" + - "SORI" + - "SPAR" + - "SPD" + - "SPML" + - "SPMT" + - "SPTN" + - "SPTO" + - "SRMB" + - "SSB" + - "SSRB" + - "SSRM" + - "SSTP" + - "STAR" + - "STAT" + - "STBB" + - "STIN" + - "STIP" + - "STP" + - "STPD" + - "STS" + - "STST" + - "SUPM" + - "SURP" + - "TCOP" + - "TE" + - "TRAN" + - "TRL" + - "USCA" + - "USDL" + - "WRIT" ``` diff --git a/docs/entities/Practitioner.md b/docs/entities/Practitioner.md index f777ee6bf1b..1d34e7b940d 100644 --- a/docs/entities/Practitioner.md +++ b/docs/entities/Practitioner.md @@ -67,7 +67,7 @@ - "domestic" - "international" country: - type: "any" + type: "string" whens: - ref: @@ -83,11 +83,11 @@ override: true - "international" then: - type: "string" + type: "any" flags: presence: "required" otherwise: - type: "string" + type: "any" flags: presence: "optional" allow: @@ -136,7 +136,72 @@ args: regex: "/^(\\d{5}|\\d{5}-\\d{4})$/" state: - type: "any" + type: "string" + flags: + only: true + allow: + - "AK" + - "AL" + - "AR" + - "AZ" + - "CA" + - "CO" + - "CT" + - "DC" + - "DE" + - "FL" + - "GA" + - "HI" + - "IA" + - "ID" + - "IL" + - "IN" + - "KS" + - "KY" + - "LA" + - "MA" + - "MD" + - "ME" + - "MI" + - "MN" + - "MO" + - "MS" + - "MT" + - "NC" + - "ND" + - "NE" + - "NH" + - "NJ" + - "NM" + - "NV" + - "NY" + - "OH" + - "OK" + - "OR" + - "PA" + - "RI" + - "SC" + - "SD" + - "TN" + - "TX" + - "UT" + - "VA" + - "VT" + - "WA" + - "WI" + - "WV" + - "WY" + - "AA" + - "AE" + - "AP" + - "AS" + - "FM" + - "GU" + - "MH" + - "MP" + - "PR" + - "PW" + - "VI" whens: - ref: @@ -152,20 +217,15 @@ override: true - "international" then: - type: "string" + type: "any" flags: presence: "optional" allow: - null otherwise: - type: "string" + type: "any" flags: presence: "required" - rules: - - - name: "max" - args: - limit: 100 email: type: "string" flags: @@ -239,7 +299,12 @@ allow: - "inactivePractitioner" judgeFullName: - type: "any" + type: "string" + rules: + - + name: "max" + args: + limit: 100 whens: - ref: @@ -255,14 +320,9 @@ override: true - "judge" then: - type: "string" + type: "any" flags: presence: "optional" - rules: - - - name: "max" - args: - limit: 100 otherwise: type: "any" flags: @@ -270,7 +330,12 @@ allow: - null judgeTitle: - type: "any" + type: "string" + rules: + - + name: "max" + args: + limit: 100 whens: - ref: @@ -286,14 +351,9 @@ override: true - "judge" then: - type: "string" + type: "any" flags: presence: "optional" - rules: - - - name: "max" - args: - limit: 100 otherwise: type: "any" flags: diff --git a/docs/entities/PrivatePractitioner.md b/docs/entities/PrivatePractitioner.md index 4a7fa446fbc..a80135ee384 100644 --- a/docs/entities/PrivatePractitioner.md +++ b/docs/entities/PrivatePractitioner.md @@ -63,7 +63,7 @@ - "domestic" - "international" country: - type: "any" + type: "string" whens: - ref: @@ -79,11 +79,11 @@ override: true - "international" then: - type: "string" + type: "any" flags: presence: "required" otherwise: - type: "string" + type: "any" flags: presence: "optional" allow: @@ -132,7 +132,72 @@ args: regex: "/^(\\d{5}|\\d{5}-\\d{4})$/" state: - type: "any" + type: "string" + flags: + only: true + allow: + - "AK" + - "AL" + - "AR" + - "AZ" + - "CA" + - "CO" + - "CT" + - "DC" + - "DE" + - "FL" + - "GA" + - "HI" + - "IA" + - "ID" + - "IL" + - "IN" + - "KS" + - "KY" + - "LA" + - "MA" + - "MD" + - "ME" + - "MI" + - "MN" + - "MO" + - "MS" + - "MT" + - "NC" + - "ND" + - "NE" + - "NH" + - "NJ" + - "NM" + - "NV" + - "NY" + - "OH" + - "OK" + - "OR" + - "PA" + - "RI" + - "SC" + - "SD" + - "TN" + - "TX" + - "UT" + - "VA" + - "VT" + - "WA" + - "WI" + - "WV" + - "WY" + - "AA" + - "AE" + - "AP" + - "AS" + - "FM" + - "GU" + - "MH" + - "MP" + - "PR" + - "PW" + - "VI" whens: - ref: @@ -148,20 +213,15 @@ override: true - "international" then: - type: "string" + type: "any" flags: presence: "optional" allow: - null otherwise: - type: "string" + type: "any" flags: presence: "required" - rules: - - - name: "max" - args: - limit: 100 email: type: "string" flags: @@ -214,7 +274,12 @@ allow: - "privatePractitioner" judgeFullName: - type: "any" + type: "string" + rules: + - + name: "max" + args: + limit: 100 whens: - ref: @@ -230,14 +295,9 @@ override: true - "judge" then: - type: "string" + type: "any" flags: presence: "optional" - rules: - - - name: "max" - args: - limit: 100 otherwise: type: "any" flags: @@ -245,7 +305,12 @@ allow: - null judgeTitle: - type: "any" + type: "string" + rules: + - + name: "max" + args: + limit: 100 whens: - ref: @@ -261,14 +326,9 @@ override: true - "judge" then: - type: "string" + type: "any" flags: presence: "optional" - rules: - - - name: "max" - args: - limit: 100 otherwise: type: "any" flags: diff --git a/docs/entities/PublicUser.md b/docs/entities/PublicUser.md index 75616048dcf..a929848a15a 100644 --- a/docs/entities/PublicUser.md +++ b/docs/entities/PublicUser.md @@ -34,7 +34,12 @@ - "privatePractitioner" - "trialclerk" judgeFullName: - type: "any" + type: "string" + rules: + - + name: "max" + args: + limit: 100 whens: - ref: @@ -50,14 +55,9 @@ override: true - "judge" then: - type: "string" + type: "any" flags: presence: "optional" - rules: - - - name: "max" - args: - limit: 100 otherwise: type: "any" flags: @@ -65,7 +65,12 @@ allow: - null judgeTitle: - type: "any" + type: "string" + rules: + - + name: "max" + args: + limit: 100 whens: - ref: @@ -81,14 +86,9 @@ override: true - "judge" then: - type: "string" + type: "any" flags: presence: "optional" - rules: - - - name: "max" - args: - limit: 100 otherwise: type: "any" flags: diff --git a/docs/entities/Statistic.md b/docs/entities/Statistic.md index 220a0037686..51bf74fd6a9 100644 --- a/docs/entities/Statistic.md +++ b/docs/entities/Statistic.md @@ -92,9 +92,17 @@ - "Year" - "Period" lastDateOfPeriod: - type: "any" + type: "date" flags: + format: + - "YYYY-MM-DDTHH:mm:ss.SSSZ" + - "YYYY-MM-DD" description: "Last date of the statistics period." + rules: + - + name: "max" + args: + date: "now" whens: - ref: @@ -110,17 +118,9 @@ override: true - "Period" then: - type: "date" + type: "any" flags: - format: - - "YYYY-MM-DDTHH:mm:ss.SSSZ" - - "YYYY-MM-DD" presence: "required" - rules: - - - name: "max" - args: - date: "now" otherwise: type: "any" flags: @@ -128,9 +128,20 @@ allow: - null year: - type: "any" + type: "number" flags: description: "The year of the statistics period." + rules: + - + name: "integer" + - + name: "min" + args: + limit: 1900 + - + name: "max" + args: + limit: 2020 whens: - ref: @@ -146,20 +157,9 @@ override: true - "Year" then: - type: "number" + type: "any" flags: presence: "required" - rules: - - - name: "integer" - - - name: "min" - args: - limit: 1900 - - - name: "max" - args: - limit: 2020 otherwise: type: "any" flags: diff --git a/docs/entities/User.md b/docs/entities/User.md index ae9319383af..300c1b347e7 100644 --- a/docs/entities/User.md +++ b/docs/entities/User.md @@ -63,7 +63,7 @@ - "domestic" - "international" country: - type: "any" + type: "string" whens: - ref: @@ -79,11 +79,11 @@ override: true - "international" then: - type: "string" + type: "any" flags: presence: "required" otherwise: - type: "string" + type: "any" flags: presence: "optional" allow: @@ -132,7 +132,72 @@ args: regex: "/^(\\d{5}|\\d{5}-\\d{4})$/" state: - type: "any" + type: "string" + flags: + only: true + allow: + - "AK" + - "AL" + - "AR" + - "AZ" + - "CA" + - "CO" + - "CT" + - "DC" + - "DE" + - "FL" + - "GA" + - "HI" + - "IA" + - "ID" + - "IL" + - "IN" + - "KS" + - "KY" + - "LA" + - "MA" + - "MD" + - "ME" + - "MI" + - "MN" + - "MO" + - "MS" + - "MT" + - "NC" + - "ND" + - "NE" + - "NH" + - "NJ" + - "NM" + - "NV" + - "NY" + - "OH" + - "OK" + - "OR" + - "PA" + - "RI" + - "SC" + - "SD" + - "TN" + - "TX" + - "UT" + - "VA" + - "VT" + - "WA" + - "WI" + - "WV" + - "WY" + - "AA" + - "AE" + - "AP" + - "AS" + - "FM" + - "GU" + - "MH" + - "MP" + - "PR" + - "PW" + - "VI" whens: - ref: @@ -148,20 +213,15 @@ override: true - "international" then: - type: "string" + type: "any" flags: presence: "optional" allow: - null otherwise: - type: "string" + type: "any" flags: presence: "required" - rules: - - - name: "max" - args: - limit: 100 email: type: "string" flags: @@ -228,7 +288,12 @@ - "privatePractitioner" - "trialclerk" judgeFullName: - type: "any" + type: "string" + rules: + - + name: "max" + args: + limit: 100 whens: - ref: @@ -244,14 +309,9 @@ override: true - "judge" then: - type: "string" + type: "any" flags: presence: "optional" - rules: - - - name: "max" - args: - limit: 100 otherwise: type: "any" flags: @@ -259,7 +319,12 @@ allow: - null judgeTitle: - type: "any" + type: "string" + rules: + - + name: "max" + args: + limit: 100 whens: - ref: @@ -275,14 +340,9 @@ override: true - "judge" then: - type: "string" + type: "any" flags: presence: "optional" - rules: - - - name: "max" - args: - limit: 100 otherwise: type: "any" flags: diff --git a/docs/entities/contacts/NextFriendForIncompetentPersonContact.md b/docs/entities/contacts/NextFriendForIncompetentPersonContact.md index 99a19db087b..3523357d770 100644 --- a/docs/entities/contacts/NextFriendForIncompetentPersonContact.md +++ b/docs/entities/contacts/NextFriendForIncompetentPersonContact.md @@ -166,6 +166,17 @@ - "WI" - "WV" - "WY" + - "AA" + - "AE" + - "AP" + - "AS" + - "FM" + - "GU" + - "MH" + - "MP" + - "PR" + - "PW" + - "VI" postalCode: type: "string" flags: diff --git a/docs/entities/contacts/NextFriendForMinorContact.md b/docs/entities/contacts/NextFriendForMinorContact.md index c53fc41eda2..ad856029acc 100644 --- a/docs/entities/contacts/NextFriendForMinorContact.md +++ b/docs/entities/contacts/NextFriendForMinorContact.md @@ -166,6 +166,17 @@ - "WI" - "WV" - "WY" + - "AA" + - "AE" + - "AP" + - "AS" + - "FM" + - "GU" + - "MH" + - "MP" + - "PR" + - "PW" + - "VI" postalCode: type: "string" flags: diff --git a/docs/entities/contacts/PartnershipAsTaxMattersPartnerContact.md b/docs/entities/contacts/PartnershipAsTaxMattersPartnerContact.md index 007554df05d..368cf84cd6e 100644 --- a/docs/entities/contacts/PartnershipAsTaxMattersPartnerContact.md +++ b/docs/entities/contacts/PartnershipAsTaxMattersPartnerContact.md @@ -166,6 +166,17 @@ - "WI" - "WV" - "WY" + - "AA" + - "AE" + - "AP" + - "AS" + - "FM" + - "GU" + - "MH" + - "MP" + - "PR" + - "PW" + - "VI" postalCode: type: "string" flags: diff --git a/docs/entities/contacts/PartnershipBBAPrimaryContact.md b/docs/entities/contacts/PartnershipBBAPrimaryContact.md index 226cbd611bc..e02abd4a4fd 100644 --- a/docs/entities/contacts/PartnershipBBAPrimaryContact.md +++ b/docs/entities/contacts/PartnershipBBAPrimaryContact.md @@ -166,6 +166,17 @@ - "WI" - "WV" - "WY" + - "AA" + - "AE" + - "AP" + - "AS" + - "FM" + - "GU" + - "MH" + - "MP" + - "PR" + - "PW" + - "VI" postalCode: type: "string" flags: diff --git a/docs/entities/contacts/PartnershipOtherThanTaxMattersPrimaryContact.md b/docs/entities/contacts/PartnershipOtherThanTaxMattersPrimaryContact.md index 55279b6309c..69e4dd4528a 100644 --- a/docs/entities/contacts/PartnershipOtherThanTaxMattersPrimaryContact.md +++ b/docs/entities/contacts/PartnershipOtherThanTaxMattersPrimaryContact.md @@ -166,6 +166,17 @@ - "WI" - "WV" - "WY" + - "AA" + - "AE" + - "AP" + - "AS" + - "FM" + - "GU" + - "MH" + - "MP" + - "PR" + - "PW" + - "VI" postalCode: type: "string" flags: diff --git a/docs/entities/contacts/PetitionerConservatorContact.md b/docs/entities/contacts/PetitionerConservatorContact.md index 757721a03a9..3f756fedaa3 100644 --- a/docs/entities/contacts/PetitionerConservatorContact.md +++ b/docs/entities/contacts/PetitionerConservatorContact.md @@ -166,6 +166,17 @@ - "WI" - "WV" - "WY" + - "AA" + - "AE" + - "AP" + - "AS" + - "FM" + - "GU" + - "MH" + - "MP" + - "PR" + - "PW" + - "VI" postalCode: type: "string" flags: diff --git a/docs/entities/contacts/PetitionerCorporationContact.md b/docs/entities/contacts/PetitionerCorporationContact.md index 04704e6c6d7..e1a2e612027 100644 --- a/docs/entities/contacts/PetitionerCorporationContact.md +++ b/docs/entities/contacts/PetitionerCorporationContact.md @@ -166,6 +166,17 @@ - "WI" - "WV" - "WY" + - "AA" + - "AE" + - "AP" + - "AS" + - "FM" + - "GU" + - "MH" + - "MP" + - "PR" + - "PW" + - "VI" postalCode: type: "string" flags: diff --git a/docs/entities/contacts/PetitionerCustodianContact.md b/docs/entities/contacts/PetitionerCustodianContact.md index 363b3e5c14b..0c82587d702 100644 --- a/docs/entities/contacts/PetitionerCustodianContact.md +++ b/docs/entities/contacts/PetitionerCustodianContact.md @@ -166,6 +166,17 @@ - "WI" - "WV" - "WY" + - "AA" + - "AE" + - "AP" + - "AS" + - "FM" + - "GU" + - "MH" + - "MP" + - "PR" + - "PW" + - "VI" postalCode: type: "string" flags: diff --git a/docs/entities/contacts/PetitionerDeceasedSpouseContact.md b/docs/entities/contacts/PetitionerDeceasedSpouseContact.md index 42d4558e772..a3ba8c242d3 100644 --- a/docs/entities/contacts/PetitionerDeceasedSpouseContact.md +++ b/docs/entities/contacts/PetitionerDeceasedSpouseContact.md @@ -168,6 +168,17 @@ - "WI" - "WV" - "WY" + - "AA" + - "AE" + - "AP" + - "AS" + - "FM" + - "GU" + - "MH" + - "MP" + - "PR" + - "PW" + - "VI" postalCode: type: "string" flags: diff --git a/docs/entities/contacts/PetitionerEstateWithExecutorPrimaryContact.md b/docs/entities/contacts/PetitionerEstateWithExecutorPrimaryContact.md index e7603866a36..8491e4b3b91 100644 --- a/docs/entities/contacts/PetitionerEstateWithExecutorPrimaryContact.md +++ b/docs/entities/contacts/PetitionerEstateWithExecutorPrimaryContact.md @@ -166,6 +166,17 @@ - "WI" - "WV" - "WY" + - "AA" + - "AE" + - "AP" + - "AS" + - "FM" + - "GU" + - "MH" + - "MP" + - "PR" + - "PW" + - "VI" postalCode: type: "string" flags: diff --git a/docs/entities/contacts/PetitionerGuardianContact.md b/docs/entities/contacts/PetitionerGuardianContact.md index e27c1ff37ca..c09f678e13f 100644 --- a/docs/entities/contacts/PetitionerGuardianContact.md +++ b/docs/entities/contacts/PetitionerGuardianContact.md @@ -166,6 +166,17 @@ - "WI" - "WV" - "WY" + - "AA" + - "AE" + - "AP" + - "AS" + - "FM" + - "GU" + - "MH" + - "MP" + - "PR" + - "PW" + - "VI" postalCode: type: "string" flags: diff --git a/docs/entities/contacts/PetitionerIntermediaryContact.md b/docs/entities/contacts/PetitionerIntermediaryContact.md index c61f022ead6..27937f360cd 100644 --- a/docs/entities/contacts/PetitionerIntermediaryContact.md +++ b/docs/entities/contacts/PetitionerIntermediaryContact.md @@ -166,6 +166,17 @@ - "WI" - "WV" - "WY" + - "AA" + - "AE" + - "AP" + - "AS" + - "FM" + - "GU" + - "MH" + - "MP" + - "PR" + - "PW" + - "VI" postalCode: type: "string" flags: diff --git a/docs/entities/contacts/PetitionerPrimaryContact.md b/docs/entities/contacts/PetitionerPrimaryContact.md index 2ef2fcdd612..6c6a8f999d0 100644 --- a/docs/entities/contacts/PetitionerPrimaryContact.md +++ b/docs/entities/contacts/PetitionerPrimaryContact.md @@ -166,6 +166,17 @@ - "WI" - "WV" - "WY" + - "AA" + - "AE" + - "AP" + - "AS" + - "FM" + - "GU" + - "MH" + - "MP" + - "PR" + - "PW" + - "VI" postalCode: type: "string" flags: diff --git a/docs/entities/contacts/PetitionerSpouseContact.md b/docs/entities/contacts/PetitionerSpouseContact.md index 85bbe1ef4ea..274f707f4f7 100644 --- a/docs/entities/contacts/PetitionerSpouseContact.md +++ b/docs/entities/contacts/PetitionerSpouseContact.md @@ -166,6 +166,17 @@ - "WI" - "WV" - "WY" + - "AA" + - "AE" + - "AP" + - "AS" + - "FM" + - "GU" + - "MH" + - "MP" + - "PR" + - "PW" + - "VI" postalCode: type: "string" flags: diff --git a/docs/entities/contacts/PetitionerTrustContact.md b/docs/entities/contacts/PetitionerTrustContact.md index 8243fe6fa9c..6c5caf45e60 100644 --- a/docs/entities/contacts/PetitionerTrustContact.md +++ b/docs/entities/contacts/PetitionerTrustContact.md @@ -166,6 +166,17 @@ - "WI" - "WV" - "WY" + - "AA" + - "AE" + - "AP" + - "AS" + - "FM" + - "GU" + - "MH" + - "MP" + - "PR" + - "PW" + - "VI" postalCode: type: "string" flags: diff --git a/docs/entities/contacts/SurvivingSpouseContact.md b/docs/entities/contacts/SurvivingSpouseContact.md index b073f63b437..cf08fe2c28d 100644 --- a/docs/entities/contacts/SurvivingSpouseContact.md +++ b/docs/entities/contacts/SurvivingSpouseContact.md @@ -166,6 +166,17 @@ - "WI" - "WV" - "WY" + - "AA" + - "AE" + - "AP" + - "AS" + - "FM" + - "GU" + - "MH" + - "MP" + - "PR" + - "PW" + - "VI" postalCode: type: "string" flags: diff --git a/graph-generators/index.js b/graph-generators/index.js index 4fc83840bff..98ed2850259 100644 --- a/graph-generators/index.js +++ b/graph-generators/index.js @@ -6,15 +6,7 @@ const madge = require('madge'); const clientDependencies = await madge('./web-client/src/app.jsx'); await clientDependencies.image('./graph-generators/client-dependencies.jpg'); - const serverDependencies = await madge([ - './web-api/src/apiHandlers.js', - './web-api/src/casesHandlers.js', - './web-api/src/documentsHandlers.js', - './web-api/src/sectionsHandlers.js', - './web-api/src/trialSessionsHandlers.js', - './web-api/src/usersHandlers.js', - './web-api/src/workItemsHandlers.js', - ]); + const serverDependencies = await madge(['./web-api/src/app.js']); await serverDependencies.image('./graph-generators/server-dependencies.jpg'); await imagemin(['./graph-generators/*.jpg'], { diff --git a/package-lock.json b/package-lock.json index c5bf5616092..710255ebc54 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,16 +4,6 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "2-thenable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/2-thenable/-/2-thenable-1.0.0.tgz", - "integrity": "sha512-HqiDzaLDFCXkcCO/SwoyhRwqYtINFHF7t9BDRq4x90TOKNAJpiqUt9X5lQ08bwxYzc067HUywDjGySpebHcUpw==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.47" - } - }, "@apidevtools/json-schema-ref-parser": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-8.0.0.tgz", @@ -53,9 +43,9 @@ } }, "@babel/cli": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.10.1.tgz", - "integrity": "sha512-cVB+dXeGhMOqViIaZs3A9OUAe4pKw4SBNdMw6yHJMYR7s4TB+Cei7ThquV/84O19PdIFWuwe03vxxES0BHUm5g==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.10.3.tgz", + "integrity": "sha512-lWB3yH5/fWY8pi2Kj5/fA+17guJ9feSBw5DNjTju3/nRi9sXnl1JPh7aKQOSvdNbiDbkzzoGYtsr46M8dGmXDQ==", "dev": true, "requires": { "chokidar": "^2.1.8", @@ -70,18 +60,18 @@ } }, "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz", + "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==", "dev": true, "requires": { - "@babel/highlight": "^7.10.1" + "@babel/highlight": "^7.10.3" } }, "@babel/compat-data": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.1.tgz", - "integrity": "sha512-CHvCj7So7iCkGKPRFUfryXIkU2gSBw7VSZFYLsqVhrS47269VK2Hfi9S/YcublPMW8k1u2bQBlbDruoQEm4fgw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.3.tgz", + "integrity": "sha512-BDIfJ9uNZuI0LajPfoYV28lX8kyCPMHY6uY4WH1lJdcicmAfxCK5ASzaeV0D/wsUaRH/cLk+amuxtC37sZ8TUg==", "dev": true, "requires": { "browserslist": "^4.12.0", @@ -90,19 +80,19 @@ } }, "@babel/core": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.2.tgz", - "integrity": "sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.3.tgz", + "integrity": "sha512-5YqWxYE3pyhIi84L84YcwjeEgS+fa7ZjK6IBVGTjDVfm64njkR2lfDhVR5OudLk8x2GK59YoSyVv+L/03k1q9w==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.2", + "@babel/code-frame": "^7.10.3", + "@babel/generator": "^7.10.3", "@babel/helper-module-transforms": "^7.10.1", "@babel/helpers": "^7.10.1", - "@babel/parser": "^7.10.2", - "@babel/template": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.2", + "@babel/parser": "^7.10.3", + "@babel/template": "^7.10.3", + "@babel/traverse": "^7.10.3", + "@babel/types": "^7.10.3", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", @@ -131,12 +121,12 @@ } }, "@babel/generator": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", - "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.3.tgz", + "integrity": "sha512-drt8MUHbEqRzNR0xnF8nMehbY11b1SDkRw03PSNH/3Rb2Z35oxkddVSi3rcaak0YJQ86PCuE7Qx1jSFhbLNBMA==", "dev": true, "requires": { - "@babel/types": "^7.10.2", + "@babel/types": "^7.10.3", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" @@ -152,23 +142,23 @@ } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.1.tgz", - "integrity": "sha512-cQpVq48EkYxUU0xozpGCLla3wlkdRRqLWu1ksFMXA9CM5KQmyyRpSEsYXbao7JUkOw/tAaYKCaYyZq6HOFYtyw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.3.tgz", + "integrity": "sha512-lo4XXRnBlU6eRM92FkiZxpo1xFLmv3VsPFk61zJKMm7XYJfwqXHsYJTY6agoc4a3L8QPw1HqWehO18coZgbT6A==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-explode-assignable-expression": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/helper-builder-react-jsx": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.1.tgz", - "integrity": "sha512-KXzzpyWhXgzjXIlJU1ZjIXzUPdej1suE6vzqgImZ/cpAsR/CC8gUcX4EWRmDfWz/cs6HOCPMBIJ3nKoXt3BFuw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.3.tgz", + "integrity": "sha512-vkxmuFvmovtqTZknyMGj9+uQAZzz5Z9mrbnkJnPkaYGfKTaSsYcjQdXP0lgrWLVh8wU6bCjOmXOpx+kqUi+S5Q==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.3" } }, "@babel/helper-builder-react-jsx-experimental": { @@ -196,15 +186,15 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.2.tgz", - "integrity": "sha512-5C/QhkGFh1vqcziq1vAL6SI9ymzUp8BCYjFpvYVhWP4DlATIb3u5q3iUd35mvlyGs8fO7hckkW7i0tmH+5+bvQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.3.tgz", + "integrity": "sha512-iRT9VwqtdFmv7UheJWthGc/h2s7MqoweBF9RUj77NFZsg9VfISvBTum3k6coAhJ8RWv2tj3yUjA03HxPd0vfpQ==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-member-expression-to-functions": "^7.10.1", - "@babel/helper-optimise-call-expression": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-function-name": "^7.10.3", + "@babel/helper-member-expression-to-functions": "^7.10.3", + "@babel/helper-optimise-call-expression": "^7.10.3", + "@babel/helper-plugin-utils": "^7.10.3", "@babel/helper-replace-supers": "^7.10.1", "@babel/helper-split-export-declaration": "^7.10.1" } @@ -221,71 +211,71 @@ } }, "@babel/helper-define-map": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.1.tgz", - "integrity": "sha512-+5odWpX+OnvkD0Zmq7panrMuAGQBu6aPUgvMzuMGo4R+jUOvealEj2hiqI6WhxgKrTpFoFj0+VdsuA8KDxHBDg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.3.tgz", + "integrity": "sha512-bxRzDi4Sin/k0drWCczppOhov1sBSdBvXJObM1NLHQzjhXhwRtn7aRWGvLJWCYbuu2qUk3EKs6Ci9C9ps8XokQ==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/helper-function-name": "^7.10.3", + "@babel/types": "^7.10.3", "lodash": "^4.17.13" } }, "@babel/helper-explode-assignable-expression": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.1.tgz", - "integrity": "sha512-vcUJ3cDjLjvkKzt6rHrl767FeE7pMEYfPanq5L16GRtrXIoznc0HykNW2aEYkcnP76P0isoqJ34dDMFZwzEpJg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.3.tgz", + "integrity": "sha512-0nKcR64XrOC3lsl+uhD15cwxPvaB6QKUDlD84OT9C3myRbhJqTMYir69/RWItUvHpharv0eJ/wk7fl34ONSwZw==", "dev": true, "requires": { - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/traverse": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.3.tgz", + "integrity": "sha512-FvSj2aiOd8zbeqijjgqdMDSyxsGHaMt5Tr0XjQsGKHD3/1FP3wksjnLAWzxw7lvXiej8W1Jt47SKTZ6upQNiRw==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-get-function-arity": "^7.10.3", + "@babel/template": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.3.tgz", + "integrity": "sha512-iUD/gFsR+M6uiy69JA6fzM5seno8oE85IYZdbVVEuQaZlEzMO2MXblh+KSPJgsZAUx0EEbWXU0yJaW7C9CdAVg==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.3" } }, "@babel/helper-hoist-variables": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.1.tgz", - "integrity": "sha512-vLm5srkU8rI6X3+aQ1rQJyfjvCBLXP8cAGeuw04zeAM2ItKb1e7pmVmLyHb4sDaAYnLL13RHOZPLEtcGZ5xvjg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.3.tgz", + "integrity": "sha512-9JyafKoBt5h20Yv1+BXQMdcXXavozI1vt401KBiRc2qzUepbVnd7ogVNymY1xkQN9fekGwfxtotH2Yf5xsGzgg==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.3" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", - "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.3.tgz", + "integrity": "sha512-q7+37c4EPLSjNb2NmWOjNwj0+BOyYlssuQ58kHEWk1Z78K5i8vTUsteq78HMieRPQSl/NtpQyJfdjt3qZ5V2vw==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.3" } }, "@babel/helper-module-imports": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", - "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.3.tgz", + "integrity": "sha512-Jtqw5M9pahLSUWA+76nhK9OG8nwYXzhQzVIGFoNaHnXF/r4l7kz4Fl0UAW7B6mqC5myoJiBP5/YQlXQTMfHI9w==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.3" } }, "@babel/helper-module-transforms": { @@ -304,18 +294,18 @@ } }, "@babel/helper-optimise-call-expression": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", - "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.3.tgz", + "integrity": "sha512-kT2R3VBH/cnSz+yChKpaKRJQJWxdGoc6SjioRId2wkeV3bK0wLLioFpJROrX0U4xr/NmxSSAWT/9Ih5snwIIzg==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.3" } }, "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==", "dev": true }, "@babel/helper-regex": { @@ -328,16 +318,16 @@ } }, "@babel/helper-remap-async-to-generator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.1.tgz", - "integrity": "sha512-RfX1P8HqsfgmJ6CwaXGKMAqbYdlleqglvVtht0HGPMSsy2V6MqLlOJVF/0Qyb/m2ZCi2z3q3+s6Pv7R/dQuZ6A==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.3.tgz", + "integrity": "sha512-sLB7666ARbJUGDO60ZormmhQOyqMX/shKBXZ7fy937s+3ID8gSrneMvKSSb+8xIM5V7Vn6uNVtOY1vIm26XLtA==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.1", "@babel/helper-wrap-function": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/template": "^7.10.3", + "@babel/traverse": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/helper-replace-supers": { @@ -372,9 +362,9 @@ } }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz", + "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==", "dev": true }, "@babel/helper-wrap-function": { @@ -401,30 +391,30 @@ } }, "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz", + "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", - "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.3.tgz", + "integrity": "sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA==", "dev": true }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.1.tgz", - "integrity": "sha512-vzZE12ZTdB336POZjmpblWfNNRpMSua45EYnRigE2XsZxcXcIyly2ixnTJasJE4Zq3U7t2d8rRF7XRUuzHxbOw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.3.tgz", + "integrity": "sha512-WUUWM7YTOudF4jZBAJIW9D7aViYC/Fn0Pln4RIHlQALyno3sXSjqmTA4Zy1TKC2D49RCR8Y/Pn4OIUtEypK3CA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/helper-remap-async-to-generator": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.3", + "@babel/helper-remap-async-to-generator": "^7.10.3", "@babel/plugin-syntax-async-generators": "^7.8.0" } }, @@ -479,12 +469,12 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.1.tgz", - "integrity": "sha512-Z+Qri55KiQkHh7Fc4BW6o+QBuTagbOp9txE+4U1i79u9oWlf2npkiDx+Rf3iK3lbcHBuNy9UOkwuR5wOMH3LIQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.3.tgz", + "integrity": "sha512-ZZh5leCIlH9lni5bU/wB/UcjtcVLgR8gc+FAgW2OOY+m9h1II3ItTO1/cewNUcsIDZSYcSaz/rYVls+Fb0ExVQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.3", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", "@babel/plugin-transform-parameters": "^7.10.1" } @@ -500,12 +490,12 @@ } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.1.tgz", - "integrity": "sha512-dqQj475q8+/avvok72CF3AOSV/SGEcH29zT5hhohqqvvZ2+boQoOr7iGldBG5YXTO2qgCgc2B3WvVLUdbeMlGA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.3.tgz", + "integrity": "sha512-yyG3n9dJ1vZ6v5sfmIlMMZ8azQoqx/5/nZTSWX1td6L1H1bsjzA8TInDChpafCZiJkeOFzp/PtrfigAQXxI1Ng==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.3", "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, @@ -704,28 +694,28 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.1.tgz", - "integrity": "sha512-P9V0YIh+ln/B3RStPoXpEQ/CoAxQIhRSUn7aXqQ+FZJ2u8+oCtjIXR3+X0vsSD8zv+mb56K7wZW1XiDTDGiDRQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.3.tgz", + "integrity": "sha512-irEX0ChJLaZVC7FvvRoSIxJlmk0IczFLcwaRXUArBKYHCHbOhe57aG8q3uw/fJsoSXvZhjRX960hyeAGlVBXZw==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.1", - "@babel/helper-define-map": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-optimise-call-expression": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-define-map": "^7.10.3", + "@babel/helper-function-name": "^7.10.3", + "@babel/helper-optimise-call-expression": "^7.10.3", + "@babel/helper-plugin-utils": "^7.10.3", "@babel/helper-replace-supers": "^7.10.1", "@babel/helper-split-export-declaration": "^7.10.1", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.1.tgz", - "integrity": "sha512-mqSrGjp3IefMsXIenBfGcPXxJxweQe2hEIwMQvjtiDQ9b1IBvDUjkAtV/HMXX47/vXf14qDNedXsIiNd1FmkaQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.3.tgz", + "integrity": "sha512-GWzhaBOsdbjVFav96drOz7FzrcEW6AP5nax0gLIpstiFaI3LOb2tAg06TimaWU6YKOfUACK3FVrxPJ4GSc5TgA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.3" } }, "@babel/plugin-transform-destructuring": { @@ -837,14 +827,14 @@ } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.1.tgz", - "integrity": "sha512-ewNKcj1TQZDL3YnO85qh9zo1YF1CHgmSTlRQgHqe63oTrMI85cthKtZjAiZSsSNjPQ5NCaYo5QkbYqEw1ZBgZA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.3.tgz", + "integrity": "sha512-GWXWQMmE1GH4ALc7YXW56BTh/AlzvDWhUNn9ArFF0+Cz5G8esYlVbXfdyHa1xaD1j+GnBoCeoQNlwtZTVdiG/A==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.10.1", + "@babel/helper-hoist-variables": "^7.10.3", "@babel/helper-module-transforms": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.3", "babel-plugin-dynamic-import-node": "^2.3.3" } }, @@ -859,9 +849,9 @@ } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", - "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.3.tgz", + "integrity": "sha512-I3EH+RMFyVi8Iy/LekQm948Z4Lz4yKT7rK+vuCAeRm0kTa6Z5W7xuhRxDNJv0FPya/her6AUgrDITb70YHtTvA==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.8.3" @@ -906,23 +896,23 @@ } }, "@babel/plugin-transform-react-display-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.1.tgz", - "integrity": "sha512-rBjKcVwjk26H3VX8pavMxGf33LNlbocMHdSeldIEswtQ/hrjyTG8fKKILW1cSkODyRovckN/uZlGb2+sAV9JUQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.3.tgz", + "integrity": "sha512-dOV44bnSW5KZ6kYF6xSHBth7TFiHHZReYXH/JH3XnFNV+soEL1F5d8JT7AJ3ZBncd19Qul7SN4YpBnyWOnQ8KA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.3" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.1.tgz", - "integrity": "sha512-MBVworWiSRBap3Vs39eHt+6pJuLUAaK4oxGc8g+wY+vuSJvLiEQjW1LSTqKb8OUPtDvHCkdPhk7d6sjC19xyFw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.3.tgz", + "integrity": "sha512-Y21E3rZmWICRJnvbGVmDLDZ8HfNDIwjGF3DXYHx1le0v0mIHCs0Gv5SavyW5Z/jgAHLaAoJPiwt+Dr7/zZKcOQ==", "dev": true, "requires": { - "@babel/helper-builder-react-jsx": "^7.10.1", + "@babel/helper-builder-react-jsx": "^7.10.3", "@babel/helper-builder-react-jsx-experimental": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.3", "@babel/plugin-syntax-jsx": "^7.10.1" } }, @@ -958,19 +948,19 @@ } }, "@babel/plugin-transform-react-pure-annotations": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.1.tgz", - "integrity": "sha512-mfhoiai083AkeewsBHUpaS/FM1dmUENHBMpS/tugSJ7VXqXO5dCN1Gkint2YvM1Cdv1uhmAKt1ZOuAjceKmlLA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.3.tgz", + "integrity": "sha512-n/fWYGqvTl7OLZs/QcWaKMFdADPvC3V6jYuEOpPyvz97onsW9TXn196fHnHW1ZgkO20/rxLOgKnEtN1q9jkgqA==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.3" } }, "@babel/plugin-transform-regenerator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.1.tgz", - "integrity": "sha512-B3+Y2prScgJ2Bh/2l9LJxKbb8C8kRfsG4AdPT+n7ixBHIxJaIG8bi8tgjxUMege1+WqSJ+7gu1YeoMVO3gPWzw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.3.tgz", + "integrity": "sha512-H5kNeW0u8mbk0qa1jVIVTeJJL6/TJ81ltD4oyPx0P499DhMJrTmmIFCmJ3QloGpQG8K9symccB7S7SJpCKLwtw==", "dev": true, "requires": { "regenerator-transform": "^0.14.2" @@ -1014,13 +1004,13 @@ } }, "@babel/plugin-transform-template-literals": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.1.tgz", - "integrity": "sha512-t7B/3MQf5M1T9hPCRG28DNGZUuxAuDqLYS03rJrIk2prj/UV7Z6FOneijhQhnv/Xa039vidXeVbvjK2SK5f7Gg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.3.tgz", + "integrity": "sha512-yaBn9OpxQra/bk0/CaA4wr41O0/Whkg6nqjqApcinxM7pro51ojhX6fv1pimAnVjVfDy14K0ULoRL70CA9jWWA==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.3" } }, "@babel/plugin-transform-typeof-symbol": { @@ -1052,24 +1042,24 @@ } }, "@babel/preset-env": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.10.2.tgz", - "integrity": "sha512-MjqhX0RZaEgK/KueRzh+3yPSk30oqDKJ5HP5tqTSB1e2gzGS3PLy7K0BIpnp78+0anFuSwOeuCf1zZO7RzRvEA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.10.3.tgz", + "integrity": "sha512-jHaSUgiewTmly88bJtMHbOd1bJf2ocYxb5BWKSDQIP5tmgFuS/n0gl+nhSrYDhT33m0vPxp+rP8oYYgPgMNQlg==", "dev": true, "requires": { - "@babel/compat-data": "^7.10.1", + "@babel/compat-data": "^7.10.3", "@babel/helper-compilation-targets": "^7.10.2", - "@babel/helper-module-imports": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-proposal-async-generator-functions": "^7.10.1", + "@babel/helper-module-imports": "^7.10.3", + "@babel/helper-plugin-utils": "^7.10.3", + "@babel/plugin-proposal-async-generator-functions": "^7.10.3", "@babel/plugin-proposal-class-properties": "^7.10.1", "@babel/plugin-proposal-dynamic-import": "^7.10.1", "@babel/plugin-proposal-json-strings": "^7.10.1", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.1", "@babel/plugin-proposal-numeric-separator": "^7.10.1", - "@babel/plugin-proposal-object-rest-spread": "^7.10.1", + "@babel/plugin-proposal-object-rest-spread": "^7.10.3", "@babel/plugin-proposal-optional-catch-binding": "^7.10.1", - "@babel/plugin-proposal-optional-chaining": "^7.10.1", + "@babel/plugin-proposal-optional-chaining": "^7.10.3", "@babel/plugin-proposal-private-methods": "^7.10.1", "@babel/plugin-proposal-unicode-property-regex": "^7.10.1", "@babel/plugin-syntax-async-generators": "^7.8.0", @@ -1086,8 +1076,8 @@ "@babel/plugin-transform-async-to-generator": "^7.10.1", "@babel/plugin-transform-block-scoped-functions": "^7.10.1", "@babel/plugin-transform-block-scoping": "^7.10.1", - "@babel/plugin-transform-classes": "^7.10.1", - "@babel/plugin-transform-computed-properties": "^7.10.1", + "@babel/plugin-transform-classes": "^7.10.3", + "@babel/plugin-transform-computed-properties": "^7.10.3", "@babel/plugin-transform-destructuring": "^7.10.1", "@babel/plugin-transform-dotall-regex": "^7.10.1", "@babel/plugin-transform-duplicate-keys": "^7.10.1", @@ -1098,24 +1088,24 @@ "@babel/plugin-transform-member-expression-literals": "^7.10.1", "@babel/plugin-transform-modules-amd": "^7.10.1", "@babel/plugin-transform-modules-commonjs": "^7.10.1", - "@babel/plugin-transform-modules-systemjs": "^7.10.1", + "@babel/plugin-transform-modules-systemjs": "^7.10.3", "@babel/plugin-transform-modules-umd": "^7.10.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.3", "@babel/plugin-transform-new-target": "^7.10.1", "@babel/plugin-transform-object-super": "^7.10.1", "@babel/plugin-transform-parameters": "^7.10.1", "@babel/plugin-transform-property-literals": "^7.10.1", - "@babel/plugin-transform-regenerator": "^7.10.1", + "@babel/plugin-transform-regenerator": "^7.10.3", "@babel/plugin-transform-reserved-words": "^7.10.1", "@babel/plugin-transform-shorthand-properties": "^7.10.1", "@babel/plugin-transform-spread": "^7.10.1", "@babel/plugin-transform-sticky-regex": "^7.10.1", - "@babel/plugin-transform-template-literals": "^7.10.1", + "@babel/plugin-transform-template-literals": "^7.10.3", "@babel/plugin-transform-typeof-symbol": "^7.10.1", "@babel/plugin-transform-unicode-escapes": "^7.10.1", "@babel/plugin-transform-unicode-regex": "^7.10.1", "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.10.2", + "@babel/types": "^7.10.3", "browserslist": "^4.12.0", "core-js-compat": "^3.6.2", "invariant": "^2.2.2", @@ -1152,9 +1142,9 @@ } }, "@babel/register": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.10.1.tgz", - "integrity": "sha512-sl96+kB3IA2B9EzpwwBmYadOT14vw3KaXOknGDbJaZCOj52GDA4Tivudq9doCJcB+bEIKCEARZYwRgBBsCGXyg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.10.3.tgz", + "integrity": "sha512-s1il0vdd02HCGwV1iocGJEzcbTNouZqMolSXKXFAiTNJSudPas9jdLQwyPPyAJxdNL6KGJ8pwWIOpKmgO/JWqg==", "dev": true, "requires": { "find-cache-dir": "^2.0.0", @@ -1165,18 +1155,18 @@ } }, "@babel/runtime": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz", - "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.3.tgz", + "integrity": "sha512-RzGO0RLSdokm9Ipe/YD+7ww8X2Ro79qiXZF3HU9ljrM+qnJmH1Vqth+hbiQZy761LnMJTMitHDuKVYTk3k4dLw==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/runtime-corejs3": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.10.2.tgz", - "integrity": "sha512-+a2M/u7r15o3dV1NEizr9bRi+KUVnrs/qYxF0Z06DAPx/4VCWaz1WA7EcbE+uqGgt39lp5akWGmHsTseIkHkHg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.10.3.tgz", + "integrity": "sha512-HA7RPj5xvJxQl429r5Cxr2trJwOfPjKiqhCXcdQPSqO2G0RHPZpXu4fkYmBaTKCp2c/jRaMK9GB/lN+7zvvFPw==", "dev": true, "requires": { "core-js-pure": "^3.0.0", @@ -1184,28 +1174,28 @@ } }, "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz", + "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/code-frame": "^7.10.3", + "@babel/parser": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/traverse": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", - "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.3.tgz", + "integrity": "sha512-qO6623eBFhuPm0TmmrUFMT1FulCmsSeJuVGhiLodk2raUDFhhTECLd9E9jC4LBIWziqt4wgF6KuXE4d+Jz9yug==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", + "@babel/code-frame": "^7.10.3", + "@babel/generator": "^7.10.3", + "@babel/helper-function-name": "^7.10.3", "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/parser": "^7.10.3", + "@babel/types": "^7.10.3", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" @@ -1229,12 +1219,12 @@ } }, "@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.3.tgz", + "integrity": "sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -1484,65 +1474,47 @@ "dev": true }, "@fortawesome/fontawesome-common-types": { - "version": "0.2.28", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.28.tgz", - "integrity": "sha512-gtis2/5yLdfI6n0ia0jH7NJs5i/Z/8M/ZbQL6jXQhCthEOe5Cr5NcQPhgTvFxNOtURE03/ZqUcEskdn2M+QaBg==", + "version": "0.2.29", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.29.tgz", + "integrity": "sha512-cY+QfDTbZ7XVxzx7jxbC98Oxr/zc7R2QpTLqTxqlfyXDrAJjzi/xUIqAUsygELB62JIrbsWxtSRhayKFkGI7MA==", "dev": true }, "@fortawesome/fontawesome-svg-core": { - "version": "1.2.28", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.28.tgz", - "integrity": "sha512-4LeaNHWvrneoU0i8b5RTOJHKx7E+y7jYejplR7uSVB34+mp3Veg7cbKk7NBCLiI4TyoWS1wh9ZdoyLJR8wSAdg==", + "version": "1.2.29", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.29.tgz", + "integrity": "sha512-xmPmP2t8qrdo8RyKihTkGb09RnZoc+7HFBCnr0/6ZhStdGDSLeEd7ajV181+2W29NWIFfylO13rU+s3fpy3cnA==", "dev": true, "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.28" + "@fortawesome/fontawesome-common-types": "^0.2.29" } }, "@fortawesome/free-regular-svg-icons": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.13.0.tgz", - "integrity": "sha512-70FAyiS5j+ANYD4dh9NGowTorNDnyvQHHpCM7FpnF7GxtDjBUCKdrFqCPzesEIpNDFNd+La3vex+jDk4nnUfpA==", + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.13.1.tgz", + "integrity": "sha512-sSeaqqmv2ovA5LKcrbh3VnEDZHVhaxijWKm4R0AdT0eG21pgxNsJbStD8lW9z6bgSuWXRNHhbhOmARuRCLS8tw==", "dev": true, "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.28" + "@fortawesome/fontawesome-common-types": "^0.2.29" } }, "@fortawesome/free-solid-svg-icons": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.13.0.tgz", - "integrity": "sha512-IHUgDJdomv6YtG4p3zl1B5wWf9ffinHIvebqQOmV3U+3SLw4fC+LUCCgwfETkbTtjy5/Qws2VoVf6z/ETQpFpg==", + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.13.1.tgz", + "integrity": "sha512-LQH/0L1p4+rqtoSHa9qFYR84hpuRZKqaQ41cfBQx8b68p21zoWSekTAeA54I/2x9VlCHDLFlG74Nmdg4iTPQOg==", "dev": true, "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.28" + "@fortawesome/fontawesome-common-types": "^0.2.29" } }, "@fortawesome/react-fontawesome": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.10.tgz", - "integrity": "sha512-UGdpJiLBIqR/8xcLrCarf2pChqQFKjDTD02C7ZS/odpOVVl2YuHYRCLEOQ0GpfOk6jtYhmouSFOFoC8qNCe5cg==", + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.11.tgz", + "integrity": "sha512-sClfojasRifQKI0OPqTy8Ln8iIhnxR/Pv/hukBhWnBz9kQRmqi6JSH3nghlhAY7SUeIIM7B5/D2G8WjX0iepVg==", "dev": true, "requires": { "prop-types": "^15.7.2" } }, - "@hapi/accept": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@hapi/accept/-/accept-3.2.4.tgz", - "integrity": "sha512-soThGB+QMgfxlh0Vzhzlf3ZOEOPk5biEwcOXhkF0Eedqx8VnhGiggL9UYHrIsOb1rUg3Be3K8kp0iDL2wbVSOQ==", - "dev": true, - "requires": { - "@hapi/boom": "7.x.x", - "@hapi/hoek": "8.x.x" - }, - "dependencies": { - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", - "dev": true - } - } - }, "@hapi/address": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@hapi/address/-/address-4.0.1.tgz", @@ -1552,867 +1524,593 @@ "@hapi/hoek": "^9.0.0" } }, - "@hapi/ammo": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@hapi/ammo/-/ammo-3.1.2.tgz", - "integrity": "sha512-ej9OtFmiZv1qr45g1bxEZNGyaR4jRpyMxU6VhbxjaYThymvOwsyIsUKMZnP5Qw2tfYFuwqCJuIBHGpeIbdX9gQ==", - "dev": true, - "requires": { - "@hapi/hoek": "8.x.x" - }, - "dependencies": { - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", - "dev": true - } - } + "@hapi/formula": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-2.0.0.tgz", + "integrity": "sha512-V87P8fv7PI0LH7LiVi8Lkf3x+KCO7pQozXRssAHNXXL9L1K+uyu4XypLXwxqVDKgyQai6qj3/KteNlrqDx4W5A==", + "dev": true }, - "@hapi/b64": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-4.2.1.tgz", - "integrity": "sha512-zqHpQuH5CBMw6hADzKfU/IGNrxq1Q+/wTYV+OiZRQN9F3tMyk+9BUMeBvFRMamduuqL8iSp62QAnJ+7ATiYLWA==", - "dev": true, - "requires": { - "@hapi/hoek": "8.x.x" - }, - "dependencies": { - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", - "dev": true - } - } + "@hapi/hoek": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.0.4.tgz", + "integrity": "sha512-EwaJS7RjoXUZ2cXXKZZxZqieGtc7RbvQhUy8FwDoMQtxWVi14tFjeFCYPZAM1mBCpOpiBpyaZbb9NeHc7eGKgw==", + "dev": true }, - "@hapi/boom": { - "version": "7.4.11", - "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-7.4.11.tgz", - "integrity": "sha512-VSU/Cnj1DXouukYxxkes4nNJonCnlogHvIff1v1RVoN4xzkKhMXX+GRmb3NyH1iar10I9WFPDv2JPwfH3GaV0A==", + "@hapi/joi": { + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-17.1.1.tgz", + "integrity": "sha512-p4DKeZAoeZW4g3u7ZeRo+vCDuSDgSvtsB/NpfjXEHTUjSeINAi/RrVOWiVQ1isaoLzMvFEhe8n5065mQq1AdQg==", "dev": true, "requires": { - "@hapi/hoek": "8.x.x" - }, - "dependencies": { - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", - "dev": true - } + "@hapi/address": "^4.0.1", + "@hapi/formula": "^2.0.0", + "@hapi/hoek": "^9.0.0", + "@hapi/pinpoint": "^2.0.0", + "@hapi/topo": "^5.0.0" } }, - "@hapi/bounce": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@hapi/bounce/-/bounce-1.3.2.tgz", - "integrity": "sha512-3bnb1AlcEByFZnpDIidxQyw1Gds81z/1rSqlx4bIEE+wUN0ATj0D49B5cE1wGocy90Rp/de4tv7GjsKd5RQeew==", + "@hapi/joi-date": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@hapi/joi-date/-/joi-date-2.0.1.tgz", + "integrity": "sha512-8be8JUEC8Wm1Do3ryJy+TXmkAL13b2JwXn7gILBoor8LopY/M+hJskodzOOxfJdckkfWnbmbnMEyJW3d/gZMfA==", "dev": true, "requires": { - "@hapi/boom": "7.x.x", - "@hapi/hoek": "^8.3.1" - }, - "dependencies": { - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", - "dev": true - } + "moment": "2.x.x" } }, - "@hapi/bourne": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", - "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "@hapi/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-vzXR5MY7n4XeIvLpfl3HtE3coZYO4raKXW766R6DZw/6aLqR26iuZ109K7a0NtF2Db0jxqh7xz2AxkUwpUFybw==", "dev": true }, - "@hapi/call": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@hapi/call/-/call-5.1.3.tgz", - "integrity": "sha512-5DfWpMk7qZiYhvBhM5oUiT4GQ/O8a2rFR121/PdwA/eZ2C1EsuD547ZggMKAR5bZ+FtxOf0fdM20zzcXzq2mZA==", + "@hapi/topo": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz", + "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==", "dev": true, "requires": { - "@hapi/boom": "7.x.x", - "@hapi/hoek": "8.x.x" - }, - "dependencies": { - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", - "dev": true - } + "@hapi/hoek": "^9.0.0" } }, - "@hapi/catbox": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/@hapi/catbox/-/catbox-10.2.3.tgz", - "integrity": "sha512-kN9hXO4NYyOHW09CXiuj5qW1syc/0XeVOBsNNk0Tz89wWNQE5h21WF+VsfAw3uFR8swn/Wj3YEVBnWqo82m/JQ==", + "@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", + "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": { - "@hapi/boom": "7.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/joi": "16.x.x", - "@hapi/podium": "3.x.x" + "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": { - "@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", - "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", - "dev": true - }, - "@hapi/formula": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-1.2.0.tgz", - "integrity": "sha512-UFbtbGPjstz0eWHb+ga/GM3Z9EzqKXFWIbSOFURU0A/Gku0Bky4bCk9/h//K2Xr3IrCfjFNhMm4jyZ5dbCewGA==", - "dev": true - }, - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", - "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" + } }, - "@hapi/joi": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-16.1.8.tgz", - "integrity": "sha512-wAsVvTPe+FwSrsAurNt5vkg3zo+TblvC5Bb1zMVK6SJzZqw9UrJnexxR+76cpePmtUZKHAPxcQ2Bf7oVHyahhg==", + "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": { - "@hapi/address": "^2.1.2", - "@hapi/formula": "^1.2.0", - "@hapi/hoek": "^8.2.4", - "@hapi/pinpoint": "^1.0.2", - "@hapi/topo": "^3.1.3" + "p-locate": "^4.1.0" } }, - "@hapi/pinpoint": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-1.0.2.tgz", - "integrity": "sha512-dtXC/WkZBfC5vxscazuiJ6iq4j9oNx1SHknmIr8hofarpKUZKmlUVYVIhNVzIEgK5Wrc4GMHL5lZtt1uS2flmQ==", - "dev": true + "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" + } }, - "@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", - "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "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": { - "@hapi/hoek": "^8.3.0" + "p-limit": "^2.2.0" } - } - } - }, - "@hapi/catbox-memory": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@hapi/catbox-memory/-/catbox-memory-4.1.1.tgz", - "integrity": "sha512-T6Hdy8DExzG0jY7C8yYWZB4XHfc0v+p1EGkwxl2HoaPYAmW7I3E59M/IvmSVpis8RPcIoBp41ZpO2aZPBpM2Ww==", - "dev": true, - "requires": { - "@hapi/boom": "7.x.x", - "@hapi/hoek": "8.x.x" - }, - "dependencies": { - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + }, + "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 + }, + "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 } } }, - "@hapi/content": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@hapi/content/-/content-4.1.1.tgz", - "integrity": "sha512-3TWvmwpVPxFSF3KBjKZ8yDqIKKZZIm7VurDSweYpXYENZrJH3C1hd1+qEQW9wQaUaI76pPBLGrXl6I3B7i3ipA==", - "dev": true, - "requires": { - "@hapi/boom": "7.x.x" - } - }, - "@hapi/cryptiles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@hapi/cryptiles/-/cryptiles-4.2.1.tgz", - "integrity": "sha512-XoqgKsHK0l/VpqPs+tr6j6vE+VQ3+2bkF2stvttmc7xAOf1oSAwHcJ0tlp/6MxMysktt1IEY0Csy3khKaP9/uQ==", - "dev": true, - "requires": { - "@hapi/boom": "7.x.x" - } - }, - "@hapi/file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@hapi/file/-/file-1.0.0.tgz", - "integrity": "sha512-Bsfp/+1Gyf70eGtnIgmScvrH8sSypO3TcK3Zf0QdHnzn/ACnAkI6KLtGACmNRPEzzIy+W7aJX5E+1fc9GwIABQ==", - "dev": true - }, - "@hapi/formula": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-2.0.0.tgz", - "integrity": "sha512-V87P8fv7PI0LH7LiVi8Lkf3x+KCO7pQozXRssAHNXXL9L1K+uyu4XypLXwxqVDKgyQai6qj3/KteNlrqDx4W5A==", + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", "dev": true }, - "@hapi/h2o2": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@hapi/h2o2/-/h2o2-8.3.2.tgz", - "integrity": "sha512-2WkZq+QAkvYHWGqnUuG0stcVeGyv9T7bopBYnCJSUEuvBZlUf2BTX2JCVSKxsnTLOxCYwoC/aI4Rr0ZSRd2oVg==", + "@jest/console": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.0.1.tgz", + "integrity": "sha512-9t1KUe/93coV1rBSxMmBAOIK3/HVpwxArCA1CxskKyRiv6o8J70V8C/V3OJminVCTa2M0hQI9AWRd5wxu2dAHw==", "dev": true, "requires": { - "@hapi/boom": "7.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/joi": "16.x.x", - "@hapi/wreck": "15.x.x" - }, - "dependencies": { - "@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", - "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", - "dev": true - }, - "@hapi/formula": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-1.2.0.tgz", - "integrity": "sha512-UFbtbGPjstz0eWHb+ga/GM3Z9EzqKXFWIbSOFURU0A/Gku0Bky4bCk9/h//K2Xr3IrCfjFNhMm4jyZ5dbCewGA==", - "dev": true + "@jest/types": "^26.0.1", + "chalk": "^4.0.0", + "jest-message-util": "^26.0.1", + "jest-util": "^26.0.1", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } }, - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", - "dev": true + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } }, - "@hapi/joi": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-16.1.8.tgz", - "integrity": "sha512-wAsVvTPe+FwSrsAurNt5vkg3zo+TblvC5Bb1zMVK6SJzZqw9UrJnexxR+76cpePmtUZKHAPxcQ2Bf7oVHyahhg==", + "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": { - "@hapi/address": "^2.1.2", - "@hapi/formula": "^1.2.0", - "@hapi/hoek": "^8.2.4", - "@hapi/pinpoint": "^1.0.2", - "@hapi/topo": "^3.1.3" + "color-name": "~1.1.4" } }, - "@hapi/pinpoint": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-1.0.2.tgz", - "integrity": "sha512-dtXC/WkZBfC5vxscazuiJ6iq4j9oNx1SHknmIr8hofarpKUZKmlUVYVIhNVzIEgK5Wrc4GMHL5lZtt1uS2flmQ==", + "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 + }, + "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 + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", - "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "@hapi/hoek": "^8.3.0" + "has-flag": "^4.0.0" } } } }, - "@hapi/hapi": { - "version": "18.4.1", - "resolved": "https://registry.npmjs.org/@hapi/hapi/-/hapi-18.4.1.tgz", - "integrity": "sha512-9HjVGa0Z4Qv9jk9AVoUdJMQLA+KuZ+liKWyEEkVBx3e3H1F0JM6aGbPkY9jRfwsITBWGBU2iXazn65SFKSi/tg==", + "@jest/core": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.0.1.tgz", + "integrity": "sha512-Xq3eqYnxsG9SjDC+WLeIgf7/8KU6rddBxH+SCt18gEpOhAGYC/Mq+YbtlNcIdwjnnT+wDseXSbU0e5X84Y4jTQ==", "dev": true, "requires": { - "@hapi/accept": "^3.2.4", - "@hapi/ammo": "^3.1.2", - "@hapi/boom": "7.x.x", - "@hapi/bounce": "1.x.x", - "@hapi/call": "^5.1.3", - "@hapi/catbox": "10.x.x", - "@hapi/catbox-memory": "4.x.x", - "@hapi/heavy": "6.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/joi": "15.x.x", - "@hapi/mimos": "4.x.x", - "@hapi/podium": "3.x.x", - "@hapi/shot": "4.x.x", - "@hapi/somever": "2.x.x", - "@hapi/statehood": "6.x.x", - "@hapi/subtext": "^6.1.3", - "@hapi/teamwork": "3.x.x", - "@hapi/topo": "3.x.x" + "@jest/console": "^26.0.1", + "@jest/reporters": "^26.0.1", + "@jest/test-result": "^26.0.1", + "@jest/transform": "^26.0.1", + "@jest/types": "^26.0.1", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.0.1", + "jest-config": "^26.0.1", + "jest-haste-map": "^26.0.1", + "jest-message-util": "^26.0.1", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.0.1", + "jest-resolve-dependencies": "^26.0.1", + "jest-runner": "^26.0.1", + "jest-runtime": "^26.0.1", + "jest-snapshot": "^26.0.1", + "jest-util": "^26.0.1", + "jest-validate": "^26.0.1", + "jest-watcher": "^26.0.1", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" }, "dependencies": { - "@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", - "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", - "dev": true + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } }, - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, - "@hapi/joi": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", - "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, "requires": { - "@hapi/address": "2.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/topo": "3.x.x" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", - "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "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": { - "@hapi/hoek": "^8.3.0" + "fill-range": "^7.0.1" } - } - } - }, - "@hapi/heavy": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/@hapi/heavy/-/heavy-6.2.2.tgz", - "integrity": "sha512-PY1dCCO6dsze7RlafIRhTaGeyTgVe49A/lSkxbhKGjQ7x46o/OFf7hLiRqTCDh3atcEKf6362EaB3+kTUbCsVA==", - "dev": true, - "requires": { - "@hapi/boom": "7.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/joi": "16.x.x" - }, - "dependencies": { - "@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", - "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 }, - "@hapi/formula": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-1.2.0.tgz", - "integrity": "sha512-UFbtbGPjstz0eWHb+ga/GM3Z9EzqKXFWIbSOFURU0A/Gku0Bky4bCk9/h//K2Xr3IrCfjFNhMm4jyZ5dbCewGA==", + "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" + } + }, + "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 }, - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "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 }, - "@hapi/joi": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-16.1.8.tgz", - "integrity": "sha512-wAsVvTPe+FwSrsAurNt5vkg3zo+TblvC5Bb1zMVK6SJzZqw9UrJnexxR+76cpePmtUZKHAPxcQ2Bf7oVHyahhg==", + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "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": { - "@hapi/address": "^2.1.2", - "@hapi/formula": "^1.2.0", - "@hapi/hoek": "^8.2.4", - "@hapi/pinpoint": "^1.0.2", - "@hapi/topo": "^3.1.3" + "glob": "^7.1.3" } }, - "@hapi/pinpoint": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-1.0.2.tgz", - "integrity": "sha512-dtXC/WkZBfC5vxscazuiJ6iq4j9oNx1SHknmIr8hofarpKUZKmlUVYVIhNVzIEgK5Wrc4GMHL5lZtt1uS2flmQ==", + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", - "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "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": { - "@hapi/hoek": "^8.3.0" + "is-number": "^7.0.0" } + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true } } }, - "@hapi/hoek": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.0.4.tgz", - "integrity": "sha512-EwaJS7RjoXUZ2cXXKZZxZqieGtc7RbvQhUy8FwDoMQtxWVi14tFjeFCYPZAM1mBCpOpiBpyaZbb9NeHc7eGKgw==", - "dev": true - }, - "@hapi/iron": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@hapi/iron/-/iron-5.1.4.tgz", - "integrity": "sha512-+ElC+OCiwWLjlJBmm8ZEWjlfzTMQTdgPnU/TsoU5QsktspIWmWi9IU4kU83nH+X/SSya8TP8h8P11Wr5L7dkQQ==", + "@jest/environment": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.0.1.tgz", + "integrity": "sha512-xBDxPe8/nx251u0VJ2dFAFz2H23Y98qdIaNwnMK6dFQr05jc+Ne/2np73lOAx+5mSBO/yuQldRrQOf6hP1h92g==", "dev": true, "requires": { - "@hapi/b64": "4.x.x", - "@hapi/boom": "7.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/cryptiles": "4.x.x", - "@hapi/hoek": "8.x.x" - }, - "dependencies": { - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", - "dev": true - } + "@jest/fake-timers": "^26.0.1", + "@jest/types": "^26.0.1", + "jest-mock": "^26.0.1" } }, - "@hapi/joi": { - "version": "17.1.1", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-17.1.1.tgz", - "integrity": "sha512-p4DKeZAoeZW4g3u7ZeRo+vCDuSDgSvtsB/NpfjXEHTUjSeINAi/RrVOWiVQ1isaoLzMvFEhe8n5065mQq1AdQg==", + "@jest/fake-timers": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.0.1.tgz", + "integrity": "sha512-Oj/kCBnTKhm7CR+OJSjZty6N1bRDr9pgiYQr4wY221azLz5PHi08x/U+9+QpceAYOWheauLP8MhtSVFrqXQfhg==", "dev": true, "requires": { - "@hapi/address": "^4.0.1", - "@hapi/formula": "^2.0.0", - "@hapi/hoek": "^9.0.0", - "@hapi/pinpoint": "^2.0.0", - "@hapi/topo": "^5.0.0" + "@jest/types": "^26.0.1", + "@sinonjs/fake-timers": "^6.0.1", + "jest-message-util": "^26.0.1", + "jest-mock": "^26.0.1", + "jest-util": "^26.0.1" } }, - "@hapi/joi-date": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@hapi/joi-date/-/joi-date-2.0.1.tgz", - "integrity": "sha512-8be8JUEC8Wm1Do3ryJy+TXmkAL13b2JwXn7gILBoor8LopY/M+hJskodzOOxfJdckkfWnbmbnMEyJW3d/gZMfA==", + "@jest/globals": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.0.1.tgz", + "integrity": "sha512-iuucxOYB7BRCvT+TYBzUqUNuxFX1hqaR6G6IcGgEqkJ5x4htNKo1r7jk1ji9Zj8ZMiMw0oB5NaA7k5Tx6MVssA==", "dev": true, "requires": { - "moment": "2.x.x" + "@jest/environment": "^26.0.1", + "@jest/types": "^26.0.1", + "expect": "^26.0.1" } }, - "@hapi/mimos": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@hapi/mimos/-/mimos-4.1.1.tgz", - "integrity": "sha512-CXoi/zfcTWfKYX756eEea8rXJRIb9sR4d7VwyAH9d3BkDyNgAesZxvqIdm55npQc6S9mU3FExinMAQVlIkz0eA==", - "dev": true, - "requires": { - "@hapi/hoek": "8.x.x", - "mime-db": "1.x.x" - }, - "dependencies": { - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", - "dev": true - } - } - }, - "@hapi/nigel": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@hapi/nigel/-/nigel-3.1.1.tgz", - "integrity": "sha512-R9YWx4S8yu0gcCBrMUDCiEFm1SQT895dMlYoeNBp8I6YhF1BFF1iYPueKA2Kkp9BvyHdjmvrxCOns7GMmpl+Fw==", - "dev": true, - "requires": { - "@hapi/hoek": "8.x.x", - "@hapi/vise": "3.x.x" - }, - "dependencies": { - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", - "dev": true - } - } - }, - "@hapi/pez": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@hapi/pez/-/pez-4.1.2.tgz", - "integrity": "sha512-8zSdJ8cZrJLFldTgwjU9Fb1JebID+aBCrCsycgqKYe0OZtM2r3Yv3aAwW5z97VsZWCROC1Vx6Mdn4rujh5Ktcg==", - "dev": true, - "requires": { - "@hapi/b64": "4.x.x", - "@hapi/boom": "7.x.x", - "@hapi/content": "^4.1.1", - "@hapi/hoek": "8.x.x", - "@hapi/nigel": "3.x.x" - }, - "dependencies": { - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", - "dev": true - } - } - }, - "@hapi/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-vzXR5MY7n4XeIvLpfl3HtE3coZYO4raKXW766R6DZw/6aLqR26iuZ109K7a0NtF2Db0jxqh7xz2AxkUwpUFybw==", - "dev": true - }, - "@hapi/podium": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@hapi/podium/-/podium-3.4.3.tgz", - "integrity": "sha512-QJlnYLEYZWlKQ9fSOtuUcpANyoVGwT68GA9P0iQQCAetBK0fI+nbRBt58+aMixoifczWZUthuGkNjqKxgPh/CQ==", + "@jest/reporters": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.0.1.tgz", + "integrity": "sha512-NWWy9KwRtE1iyG/m7huiFVF9YsYv/e+mbflKRV84WDoJfBqUrNRyDbL/vFxQcYLl8IRqI4P3MgPn386x76Gf2g==", "dev": true, "requires": { - "@hapi/hoek": "8.x.x", - "@hapi/joi": "16.x.x" + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.0.1", + "@jest/test-result": "^26.0.1", + "@jest/transform": "^26.0.1", + "@jest/types": "^26.0.1", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.0.1", + "jest-resolve": "^26.0.1", + "jest-util": "^26.0.1", + "jest-worker": "^26.0.0", + "node-notifier": "^7.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^4.1.3" }, "dependencies": { - "@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", - "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", - "dev": true - }, - "@hapi/formula": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-1.2.0.tgz", - "integrity": "sha512-UFbtbGPjstz0eWHb+ga/GM3Z9EzqKXFWIbSOFURU0A/Gku0Bky4bCk9/h//K2Xr3IrCfjFNhMm4jyZ5dbCewGA==", - "dev": true - }, - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", - "dev": true - }, - "@hapi/joi": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-16.1.8.tgz", - "integrity": "sha512-wAsVvTPe+FwSrsAurNt5vkg3zo+TblvC5Bb1zMVK6SJzZqw9UrJnexxR+76cpePmtUZKHAPxcQ2Bf7oVHyahhg==", + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, "requires": { - "@hapi/address": "^2.1.2", - "@hapi/formula": "^1.2.0", - "@hapi/hoek": "^8.2.4", - "@hapi/pinpoint": "^1.0.2", - "@hapi/topo": "^3.1.3" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "@hapi/pinpoint": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-1.0.2.tgz", - "integrity": "sha512-dtXC/WkZBfC5vxscazuiJ6iq4j9oNx1SHknmIr8hofarpKUZKmlUVYVIhNVzIEgK5Wrc4GMHL5lZtt1uS2flmQ==", - "dev": true - }, - "@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", - "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { - "@hapi/hoek": "^8.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } - } - } - }, - "@hapi/shot": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@hapi/shot/-/shot-4.1.2.tgz", - "integrity": "sha512-6LeHLjvsq/bQ0R+fhEyr7mqExRGguNTrxFZf5DyKe3CK6pNabiGgYO4JVFaRrLZ3JyuhkS0fo8iiRE2Ql2oA/A==", - "dev": true, - "requires": { - "@hapi/hoek": "8.x.x", - "@hapi/joi": "16.x.x" - }, - "dependencies": { - "@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", - "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", - "dev": true - }, - "@hapi/formula": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-1.2.0.tgz", - "integrity": "sha512-UFbtbGPjstz0eWHb+ga/GM3Z9EzqKXFWIbSOFURU0A/Gku0Bky4bCk9/h//K2Xr3IrCfjFNhMm4jyZ5dbCewGA==", - "dev": true - }, - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", - "dev": true }, - "@hapi/joi": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-16.1.8.tgz", - "integrity": "sha512-wAsVvTPe+FwSrsAurNt5vkg3zo+TblvC5Bb1zMVK6SJzZqw9UrJnexxR+76cpePmtUZKHAPxcQ2Bf7oVHyahhg==", + "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": { - "@hapi/address": "^2.1.2", - "@hapi/formula": "^1.2.0", - "@hapi/hoek": "^8.2.4", - "@hapi/pinpoint": "^1.0.2", - "@hapi/topo": "^3.1.3" + "color-name": "~1.1.4" } }, - "@hapi/pinpoint": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-1.0.2.tgz", - "integrity": "sha512-dtXC/WkZBfC5vxscazuiJ6iq4j9oNx1SHknmIr8hofarpKUZKmlUVYVIhNVzIEgK5Wrc4GMHL5lZtt1uS2flmQ==", - "dev": true - }, - "@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", - "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", - "dev": true, - "requires": { - "@hapi/hoek": "^8.3.0" - } - } - } - }, - "@hapi/somever": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@hapi/somever/-/somever-2.1.1.tgz", - "integrity": "sha512-cic5Sto4KGd9B0oQSdKTokju+rYhCbdpzbMb0EBnrH5Oc1z048hY8PaZ1lx2vBD7I/XIfTQVQetBH57fU51XRA==", - "dev": true, - "requires": { - "@hapi/bounce": "1.x.x", - "@hapi/hoek": "8.x.x" - }, - "dependencies": { - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", - "dev": true - } - } - }, - "@hapi/statehood": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@hapi/statehood/-/statehood-6.1.2.tgz", - "integrity": "sha512-pYXw1x6npz/UfmtcpUhuMvdK5kuOGTKcJNfLqdNptzietK2UZH5RzNJSlv5bDHeSmordFM3kGItcuQWX2lj2nQ==", - "dev": true, - "requires": { - "@hapi/boom": "7.x.x", - "@hapi/bounce": "1.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/cryptiles": "4.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/iron": "5.x.x", - "@hapi/joi": "16.x.x" - }, - "dependencies": { - "@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", - "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + "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 }, - "@hapi/formula": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-1.2.0.tgz", - "integrity": "sha512-UFbtbGPjstz0eWHb+ga/GM3Z9EzqKXFWIbSOFURU0A/Gku0Bky4bCk9/h//K2Xr3IrCfjFNhMm4jyZ5dbCewGA==", + "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 }, - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "@hapi/joi": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-16.1.8.tgz", - "integrity": "sha512-wAsVvTPe+FwSrsAurNt5vkg3zo+TblvC5Bb1zMVK6SJzZqw9UrJnexxR+76cpePmtUZKHAPxcQ2Bf7oVHyahhg==", - "dev": true, - "requires": { - "@hapi/address": "^2.1.2", - "@hapi/formula": "^1.2.0", - "@hapi/hoek": "^8.2.4", - "@hapi/pinpoint": "^1.0.2", - "@hapi/topo": "^3.1.3" - } - }, - "@hapi/pinpoint": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-1.0.2.tgz", - "integrity": "sha512-dtXC/WkZBfC5vxscazuiJ6iq4j9oNx1SHknmIr8hofarpKUZKmlUVYVIhNVzIEgK5Wrc4GMHL5lZtt1uS2flmQ==", + "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 }, - "@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", - "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "@hapi/hoek": "^8.3.0" + "has-flag": "^4.0.0" } } } }, - "@hapi/subtext": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@hapi/subtext/-/subtext-6.1.3.tgz", - "integrity": "sha512-qWN6NbiHNzohVcJMeAlpku/vzbyH4zIpnnMPMPioQMwIxbPFKeNViDCNI6fVBbMPBiw/xB4FjqiJkRG5P9eWWg==", + "@jest/source-map": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.0.0.tgz", + "integrity": "sha512-S2Z+Aj/7KOSU2TfW0dyzBze7xr95bkm5YXNUqqCek+HE0VbNNSNzrRwfIi5lf7wvzDTSS0/ib8XQ1krFNyYgbQ==", "dev": true, "requires": { - "@hapi/boom": "7.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/content": "^4.1.1", - "@hapi/file": "1.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/pez": "^4.1.2", - "@hapi/wreck": "15.x.x" + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" }, "dependencies": { - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "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 } } }, - "@hapi/teamwork": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@hapi/teamwork/-/teamwork-3.3.1.tgz", - "integrity": "sha512-61tiqWCYvMKP7fCTXy0M4VE6uNIwA0qvgFoiDubgfj7uqJ0fdHJFQNnVPGrxhLWlwz0uBPWrQlBH7r8y9vFITQ==", - "dev": true - }, - "@hapi/topo": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz", - "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==", - "dev": true, - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@hapi/vise": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@hapi/vise/-/vise-3.1.1.tgz", - "integrity": "sha512-OXarbiCSadvtg+bSdVPqu31Z1JoBL+FwNYz3cYoBKQ5xq1/Cr4A3IkGpAZbAuxU5y4NL5pZFZG3d2a3ZGm/dOQ==", + "@jest/test-result": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.0.1.tgz", + "integrity": "sha512-oKwHvOI73ICSYRPe8WwyYPTtiuOAkLSbY8/MfWF3qDEd/sa8EDyZzin3BaXTqufir/O/Gzea4E8Zl14XU4Mlyg==", "dev": true, "requires": { - "@hapi/hoek": "8.x.x" - }, - "dependencies": { - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", - "dev": true - } + "@jest/console": "^26.0.1", + "@jest/types": "^26.0.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" } }, - "@hapi/wreck": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/@hapi/wreck/-/wreck-15.1.0.tgz", - "integrity": "sha512-tQczYRTTeYBmvhsek/D49En/5khcShaBEmzrAaDjMrFXKJRuF8xA8+tlq1ETLBFwGd6Do6g2OC74rt11kzawzg==", + "@jest/test-sequencer": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.0.1.tgz", + "integrity": "sha512-ssga8XlwfP8YjbDcmVhwNlrmblddMfgUeAkWIXts1V22equp2GMIHxm7cyeD5Q/B0ZgKPK/tngt45sH99yLLGg==", "dev": true, "requires": { - "@hapi/boom": "7.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/hoek": "8.x.x" - }, - "dependencies": { - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", - "dev": true - } + "@jest/test-result": "^26.0.1", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.0.1", + "jest-runner": "^26.0.1", + "jest-runtime": "^26.0.1" } }, - "@iarna/toml": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", - "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", - "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==", + "@jest/transform": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.0.1.tgz", + "integrity": "sha512-pPRkVkAQ91drKGbzCfDOoHN838+FSbYaEAvBXvKuWeeRRUD8FjwXkqfUNUZL6Ke48aA/1cqq/Ni7kVMCoqagWA==", "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" + "@babel/core": "^7.1.0", + "@jest/types": "^26.0.1", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.0.1", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.0.1", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.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==", + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "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": { - "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" - } - }, - "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 - }, - "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 - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", - "dev": true - }, - "@jest/console": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.0.1.tgz", - "integrity": "sha512-9t1KUe/93coV1rBSxMmBAOIK3/HVpwxArCA1CxskKyRiv6o8J70V8C/V3OJminVCTa2M0hQI9AWRd5wxu2dAHw==", - "dev": true, - "requires": { - "@jest/types": "^26.0.1", - "chalk": "^4.0.0", - "jest-message-util": "^26.0.1", - "jest-util": "^26.0.1", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" + "fill-range": "^7.0.1" } }, "chalk": { @@ -2440,18 +2138,49 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "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" + } + }, "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 }, + "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 + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, "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 + }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", @@ -2460,59 +2189,30 @@ "requires": { "has-flag": "^4.0.0" } + }, + "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" + } } } }, - "@jest/core": { + "@jest/types": { "version": "26.0.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.0.1.tgz", - "integrity": "sha512-Xq3eqYnxsG9SjDC+WLeIgf7/8KU6rddBxH+SCt18gEpOhAGYC/Mq+YbtlNcIdwjnnT+wDseXSbU0e5X84Y4jTQ==", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.0.1.tgz", + "integrity": "sha512-IbtjvqI9+eS1qFnOIEL7ggWmT+iK/U+Vde9cGWtYb/b6XgKb3X44ZAe/z9YZzoAAZ/E92m0DqrilF934IGNnQA==", "dev": true, "requires": { - "@jest/console": "^26.0.1", - "@jest/reporters": "^26.0.1", - "@jest/test-result": "^26.0.1", - "@jest/transform": "^26.0.1", - "@jest/types": "^26.0.1", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.0.1", - "jest-config": "^26.0.1", - "jest-haste-map": "^26.0.1", - "jest-message-util": "^26.0.1", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.0.1", - "jest-resolve-dependencies": "^26.0.1", - "jest-runner": "^26.0.1", - "jest-runtime": "^26.0.1", - "jest-snapshot": "^26.0.1", - "jest-util": "^26.0.1", - "jest-validate": "^26.0.1", - "jest-watcher": "^26.0.1", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" }, "dependencies": { - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "dev": true, - "requires": { - "type-fest": "^0.11.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, "ansi-styles": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", @@ -2523,15 +2223,6 @@ "color-convert": "^2.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" - } - }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", @@ -2557,61 +2248,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "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" - } - }, "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 }, - "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 - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "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" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", @@ -2620,3836 +2262,2008 @@ "requires": { "has-flag": "^4.0.0" } - }, - "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" - } - }, - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true } } }, - "@jest/environment": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.0.1.tgz", - "integrity": "sha512-xBDxPe8/nx251u0VJ2dFAFz2H23Y98qdIaNwnMK6dFQr05jc+Ne/2np73lOAx+5mSBO/yuQldRrQOf6hP1h92g==", - "dev": true, - "requires": { - "@jest/fake-timers": "^26.0.1", - "@jest/types": "^26.0.1", - "jest-mock": "^26.0.1" - } + "@jsdevtools/ono": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.2.tgz", + "integrity": "sha512-qS/a24RA5FEoiJS9wiv6Pwg2c/kiUo3IVUQcfeM9JvsR6pM8Yx+yl/6xWYLckZCT5jpLNhslgjiA8p/XcGyMRQ==", + "dev": true }, - "@jest/fake-timers": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.0.1.tgz", - "integrity": "sha512-Oj/kCBnTKhm7CR+OJSjZty6N1bRDr9pgiYQr4wY221azLz5PHi08x/U+9+QpceAYOWheauLP8MhtSVFrqXQfhg==", + "@koa/router": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@koa/router/-/router-9.0.1.tgz", + "integrity": "sha512-OI+OU49CJV4px0WkIMmayBeqVXB/JS1ZMq7UoGlTZt6Y7ijK7kdeQ18+SEHHJPytmtI1y6Hf8XLrpxva3mhv5Q==", "dev": true, "requires": { - "@jest/types": "^26.0.1", - "@sinonjs/fake-timers": "^6.0.1", - "jest-message-util": "^26.0.1", - "jest-mock": "^26.0.1", - "jest-util": "^26.0.1" - } - }, - "@jest/globals": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.0.1.tgz", - "integrity": "sha512-iuucxOYB7BRCvT+TYBzUqUNuxFX1hqaR6G6IcGgEqkJ5x4htNKo1r7jk1ji9Zj8ZMiMw0oB5NaA7k5Tx6MVssA==", - "dev": true, - "requires": { - "@jest/environment": "^26.0.1", - "@jest/types": "^26.0.1", - "expect": "^26.0.1" - } - }, - "@jest/reporters": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.0.1.tgz", - "integrity": "sha512-NWWy9KwRtE1iyG/m7huiFVF9YsYv/e+mbflKRV84WDoJfBqUrNRyDbL/vFxQcYLl8IRqI4P3MgPn386x76Gf2g==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.0.1", - "@jest/test-result": "^26.0.1", - "@jest/transform": "^26.0.1", - "@jest/types": "^26.0.1", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.0.1", - "jest-resolve": "^26.0.1", - "jest-util": "^26.0.1", - "jest-worker": "^26.0.0", - "node-notifier": "^7.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^4.1.3" + "debug": "^4.1.1", + "http-errors": "^1.7.3", + "koa-compose": "^4.1.0", + "methods": "^1.1.2", + "path-to-regexp": "^6.1.0" }, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ms": "^2.1.1" } }, - "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==", + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", "dev": true, "requires": { - "color-name": "~1.1.4" + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" } }, - "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 - }, - "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 - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "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 }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "path-to-regexp": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.1.0.tgz", + "integrity": "sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==", "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, - "@jest/source-map": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.0.0.tgz", - "integrity": "sha512-S2Z+Aj/7KOSU2TfW0dyzBze7xr95bkm5YXNUqqCek+HE0VbNNSNzrRwfIi5lf7wvzDTSS0/ib8XQ1krFNyYgbQ==", + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", "dev": true, "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - }, - "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 - } + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" } }, - "@jest/test-result": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.0.1.tgz", - "integrity": "sha512-oKwHvOI73ICSYRPe8WwyYPTtiuOAkLSbY8/MfWF3qDEd/sa8EDyZzin3BaXTqufir/O/Gzea4E8Zl14XU4Mlyg==", + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", "dev": true, "requires": { - "@jest/console": "^26.0.1", - "@jest/types": "^26.0.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" } }, - "@jest/test-sequencer": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.0.1.tgz", - "integrity": "sha512-ssga8XlwfP8YjbDcmVhwNlrmblddMfgUeAkWIXts1V22equp2GMIHxm7cyeD5Q/B0ZgKPK/tngt45sH99yLLGg==", + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", "dev": true, "requires": { - "@jest/test-result": "^26.0.1", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.0.1", - "jest-runner": "^26.0.1", - "jest-runtime": "^26.0.1" + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" } }, - "@jest/transform": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.0.1.tgz", - "integrity": "sha512-pPRkVkAQ91drKGbzCfDOoHN838+FSbYaEAvBXvKuWeeRRUD8FjwXkqfUNUZL6Ke48aA/1cqq/Ni7kVMCoqagWA==", + "@parcel/fs": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-1.11.0.tgz", + "integrity": "sha512-86RyEqULbbVoeo8OLcv+LQ1Vq2PKBAvWTU9fCgALxuCTbbs5Ppcvll4Vr+Ko1AnmMzja/k++SzNAwJfeQXVlpA==", "dev": true, "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.0.1", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.0.1", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.0.1", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" + "@parcel/utils": "^1.11.0", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.2" + } + }, + "@parcel/logger": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-1.11.1.tgz", + "integrity": "sha512-9NF3M6UVeP2udOBDILuoEHd8VrF4vQqoWHEafymO1pfSoOMfxrSJZw1MfyAAIUN/IFp9qjcpDCUbDZB+ioVevA==", + "dev": true, + "requires": { + "@parcel/workers": "^1.11.0", + "chalk": "^2.1.0", + "grapheme-breaker": "^0.3.2", + "ora": "^2.1.0", + "strip-ansi": "^4.0.0" }, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" + "restore-cursor": "^2.0.0" } }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "cli-spinners": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz", + "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "chalk": "^2.0.1" } }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "mimic-fn": "^1.0.0" } }, - "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==", + "ora": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-2.1.0.tgz", + "integrity": "sha512-hNNlAd3gfv/iPmsNxYoAPLvxg7HuPozww7fFonMZvL84tP6Ox5igfk5j/+a9rtJJwqMgKK+JgWsAQik5o0HTLA==", "dev": true, "requires": { - "color-name": "~1.1.4" + "chalk": "^2.3.1", + "cli-cursor": "^2.1.0", + "cli-spinners": "^1.1.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^4.0.0", + "wcwidth": "^1.0.1" } }, - "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 - }, - "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==", + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { - "to-regex-range": "^5.0.1" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, - "has-flag": { + "strip-ansi": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "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 - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "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 - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "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==", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "is-number": "^7.0.0" + "ansi-regex": "^3.0.0" } } } }, - "@jest/types": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.0.1.tgz", - "integrity": "sha512-IbtjvqI9+eS1qFnOIEL7ggWmT+iK/U+Vde9cGWtYb/b6XgKb3X44ZAe/z9YZzoAAZ/E92m0DqrilF934IGNnQA==", + "@parcel/utils": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-1.11.0.tgz", + "integrity": "sha512-cA3p4jTlaMeOtAKR/6AadanOPvKeg8VwgnHhOyfi0yClD0TZS/hi9xu12w4EzA/8NtHu0g6o4RDfcNjqN8l1AQ==", + "dev": true + }, + "@parcel/watcher": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-1.12.1.tgz", + "integrity": "sha512-od+uCtCxC/KoNQAIE1vWx1YTyKYY+7CTrxBJPRh3cDWw/C0tCtlBMVlrbplscGoEpt6B27KhJDCv82PBxOERNA==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" + "@parcel/utils": "^1.11.0", + "chokidar": "^2.1.5" + } + }, + "@parcel/workers": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-1.11.0.tgz", + "integrity": "sha512-USSjRAAQYsZFlv43FUPdD+jEGML5/8oLF0rUzPQTtK4q9kvaXr49F5ZplyLz5lox78cLZ0TxN2bIDQ1xhOkulQ==", + "dev": true, + "requires": { + "@parcel/utils": "^1.11.0", + "physical-cpu-count": "^2.0.0" + } + }, + "@pdf-lib/standard-fonts": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-0.0.4.tgz", + "integrity": "sha512-2pg8hXnChVAF6aSFraXtwB0cx/AgE15FvuLJbdPJSq9LYp1xMp0lapH4+t1HsdD9cA05rnWYLqlEBwS4YK1jLg==", + "dev": true, + "requires": { + "base64-arraybuffer": "^0.1.5", + "pako": "^1.0.6" }, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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 - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, - "@jsdevtools/ono": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.2.tgz", - "integrity": "sha512-qS/a24RA5FEoiJS9wiv6Pwg2c/kiUo3IVUQcfeM9JvsR6pM8Yx+yl/6xWYLckZCT5jpLNhslgjiA8p/XcGyMRQ==", - "dev": true - }, - "@koa/router": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@koa/router/-/router-9.0.1.tgz", - "integrity": "sha512-OI+OU49CJV4px0WkIMmayBeqVXB/JS1ZMq7UoGlTZt6Y7ijK7kdeQ18+SEHHJPytmtI1y6Hf8XLrpxva3mhv5Q==", + "@pdf-lib/upng": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz", + "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==", "dev": true, "requires": { - "debug": "^4.1.1", - "http-errors": "^1.7.3", - "koa-compose": "^4.1.0", - "methods": "^1.1.2", - "path-to-regexp": "^6.1.0" + "pako": "^1.0.10" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "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 - }, - "path-to-regexp": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.1.0.tgz", - "integrity": "sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==", + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true } } }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "@samverschueren/stream-to-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", + "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==", "dev": true, "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" + "any-observable": "^0.3.0" } }, - "@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", + "dev": true + }, + "@sinonjs/commons": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.0.tgz", + "integrity": "sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q==", "dev": true, "requires": { - "@nodelib/fs.stat": "2.0.3", - "run-parallel": "^1.1.9" + "type-detect": "4.0.8" } }, - "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", "dev": true, "requires": { - "@nodelib/fs.scandir": "2.1.3", - "fastq": "^1.6.0" + "@sinonjs/commons": "^1.7.0" } }, - "@parcel/fs": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-1.11.0.tgz", - "integrity": "sha512-86RyEqULbbVoeo8OLcv+LQ1Vq2PKBAvWTU9fCgALxuCTbbs5Ppcvll4Vr+Ko1AnmMzja/k++SzNAwJfeQXVlpA==", + "@sinonjs/formatio": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-5.0.1.tgz", + "integrity": "sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ==", "dev": true, "requires": { - "@parcel/utils": "^1.11.0", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.2" + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^5.0.2" } }, - "@parcel/logger": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-1.11.1.tgz", - "integrity": "sha512-9NF3M6UVeP2udOBDILuoEHd8VrF4vQqoWHEafymO1pfSoOMfxrSJZw1MfyAAIUN/IFp9qjcpDCUbDZB+ioVevA==", + "@sinonjs/samsam": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.0.3.tgz", + "integrity": "sha512-QucHkc2uMJ0pFGjJUDP3F9dq5dx8QIaqISl9QgwLOh6P9yv877uONPGXh/OH/0zmM3tW1JjuJltAZV2l7zU+uQ==", "dev": true, "requires": { - "@parcel/workers": "^1.11.0", - "chalk": "^2.1.0", - "grapheme-breaker": "^0.3.2", - "ora": "^2.1.0", - "strip-ansi": "^4.0.0" - }, - "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 - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-spinners": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz", - "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==", - "dev": true - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "ora": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-2.1.0.tgz", - "integrity": "sha512-hNNlAd3gfv/iPmsNxYoAPLvxg7HuPozww7fFonMZvL84tP6Ox5igfk5j/+a9rtJJwqMgKK+JgWsAQik5o0HTLA==", - "dev": true, - "requires": { - "chalk": "^2.3.1", - "cli-cursor": "^2.1.0", - "cli-spinners": "^1.1.0", - "log-symbols": "^2.2.0", - "strip-ansi": "^4.0.0", - "wcwidth": "^1.0.1" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "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" - } - } + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" } }, - "@parcel/utils": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-1.11.0.tgz", - "integrity": "sha512-cA3p4jTlaMeOtAKR/6AadanOPvKeg8VwgnHhOyfi0yClD0TZS/hi9xu12w4EzA/8NtHu0g6o4RDfcNjqN8l1AQ==", + "@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 }, - "@parcel/watcher": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-1.12.1.tgz", - "integrity": "sha512-od+uCtCxC/KoNQAIE1vWx1YTyKYY+7CTrxBJPRh3cDWw/C0tCtlBMVlrbplscGoEpt6B27KhJDCv82PBxOERNA==", + "@stylelint/postcss-css-in-js": { + "version": "0.37.1", + "resolved": "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.1.tgz", + "integrity": "sha512-UMf2Rni3JGKi3ZwYRGMYJ5ipOA5ENJSKMtYA/pE1ZLURwdh7B5+z2r73RmWvub+N0UuH1Lo+TGfCgYwPvqpXNw==", "dev": true, "requires": { - "@parcel/utils": "^1.11.0", - "chokidar": "^2.1.5" + "@babel/core": ">=7.9.0" } }, - "@parcel/workers": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-1.11.0.tgz", - "integrity": "sha512-USSjRAAQYsZFlv43FUPdD+jEGML5/8oLF0rUzPQTtK4q9kvaXr49F5ZplyLz5lox78cLZ0TxN2bIDQ1xhOkulQ==", + "@stylelint/postcss-markdown": { + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.1.tgz", + "integrity": "sha512-iDxMBWk9nB2BPi1VFQ+Dc5+XpvODBHw2n3tYpaBZuEAFQlbtF9If0Qh5LTTwSi/XwdbJ2jt+0dis3i8omyggpw==", "dev": true, "requires": { - "@parcel/utils": "^1.11.0", - "physical-cpu-count": "^2.0.0" + "remark": "^12.0.0", + "unist-util-find-all-after": "^3.0.1" } }, - "@pdf-lib/standard-fonts": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-0.0.4.tgz", - "integrity": "sha512-2pg8hXnChVAF6aSFraXtwB0cx/AgE15FvuLJbdPJSq9LYp1xMp0lapH4+t1HsdD9cA05rnWYLqlEBwS4YK1jLg==", + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", "dev": true, "requires": { - "base64-arraybuffer": "^0.1.5", - "pako": "^1.0.6" - }, - "dependencies": { - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - } + "defer-to-connect": "^1.0.1" } }, - "@pdf-lib/upng": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz", - "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==", + "@types/babel__core": { + "version": "7.1.9", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.9.tgz", + "integrity": "sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw==", "dev": true, "requires": { - "pako": "^1.0.10" - }, - "dependencies": { - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - } + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "@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=", + "@types/babel__generator": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", + "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", "dev": true, "requires": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" + "@babel/types": "^7.0.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 + "@types/babel__template": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", + "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } }, - "@samverschueren/stream-to-observable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", - "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==", + "@types/babel__traverse": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.12.tgz", + "integrity": "sha512-t4CoEokHTfcyfb4hUaF9oOHu9RmmNWnm1CP0YmMqOOfClKascOmvlEM736vlqeScuGvBDsHkf8R2INd4DWreQA==", "dev": true, "requires": { - "any-observable": "^0.3.0" + "@babel/types": "^7.3.0" } }, - "@serverless/cli": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@serverless/cli/-/cli-1.5.0.tgz", - "integrity": "sha512-hGYbsI/Gf9RFTTZS4yXvufDAv/lk6ae8PGBbjZySEtlx/zqA31PgNaWBqWjCo3+KMfpcq8abDaxiJbsu4OfWew==", + "@types/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", "dev": true, "requires": { - "@serverless/core": "^1.1.2", - "@serverless/template": "^1.1.3", - "@serverless/utils": "^1.1.0", - "ansi-escapes": "^4.3.1", - "chalk": "^2.4.2", - "chokidar": "^3.4.0", - "dotenv": "^8.2.0", - "figures": "^3.2.0", - "minimist": "^1.2.5", - "prettyoutput": "^1.2.0", - "strip-ansi": "^5.2.0" - }, - "dependencies": { - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "dev": true, - "requires": { - "type-fest": "^0.11.0" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", - "dev": true - }, - "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" - } - }, - "chokidar": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", - "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - } - }, - "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", - "dev": true - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "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" - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.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-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "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" - } - }, - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true - } + "@types/connect": "*", + "@types/node": "*" } }, - "@serverless/component-metrics": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@serverless/component-metrics/-/component-metrics-1.0.8.tgz", - "integrity": "sha512-lOUyRopNTKJYVEU9T6stp2irwlTDsYMmUKBOUjnMcwGveuUfIJqrCOtFLtIPPj3XJlbZy5F68l4KP9rZ8Ipang==", + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/connect": { + "version": "3.4.33", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", + "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", "dev": true, "requires": { - "node-fetch": "^2.6.0", - "shortid": "^2.2.14" - }, - "dependencies": { - "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", - "dev": true - } + "@types/node": "*" } }, - "@serverless/core": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@serverless/core/-/core-1.1.2.tgz", - "integrity": "sha512-PY7gH+7aQ+MltcUD7SRDuQODJ9Sav9HhFJsgOiyf8IVo7XVD6FxZIsSnpMI6paSkptOB7n+0Jz03gNlEkKetQQ==", + "@types/continuation-local-storage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/continuation-local-storage/-/continuation-local-storage-3.2.2.tgz", + "integrity": "sha512-aItm+aYPJ4rT1cHmAxO+OdWjSviQ9iB5UKb5f0Uvgln0N4hS2mcDodHtPiqicYBXViUYhqyBjhA5uyOcT+S34Q==", "dev": true, "requires": { - "fs-extra": "^7.0.1", - "js-yaml": "^3.13.1", - "package-json": "^6.3.0", - "ramda": "^0.26.1", - "semver": "^6.1.1" - }, - "dependencies": { - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "@types/node": "*" } }, - "@serverless/enterprise-plugin": { - "version": "3.6.13", - "resolved": "https://registry.npmjs.org/@serverless/enterprise-plugin/-/enterprise-plugin-3.6.13.tgz", - "integrity": "sha512-L7DOqo7LviAbYIySV5n+sURwyI5rf6IfVKRzFF3CK/EtbHUBJn7gEdHNo86Xmsm4I251ZggGSsorQvSIzT2VUQ==", + "@types/express": { + "version": "4.17.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.6.tgz", + "integrity": "sha512-n/mr9tZI83kd4azlPG5y997C/M4DNABK9yErhFM6hKdym4kkmd9j0vtsJyjFIwfRBxtrxZtAfGZCNRIBMFLK5w==", "dev": true, "requires": { - "@serverless/event-mocks": "^1.1.1", - "@serverless/platform-client": "^0.25.14", - "@serverless/platform-sdk": "^2.3.1", - "chalk": "^2.4.2", - "child-process-ext": "^2.1.1", - "chokidar": "^3.4.0", - "cli-color": "^2.0.0", - "dependency-tree": "^7.2.1", - "find-process": "^1.4.3", - "flat": "^5.0.0", - "fs-extra": "^8.1.0", - "iso8601-duration": "^1.2.0", - "isomorphic-fetch": "^2.2.1", - "js-yaml": "^3.14.0", - "jsonata": "^1.8.3", - "jszip": "^3.4.0", - "lodash": "^4.17.15", - "memoizee": "^0.4.14", - "moment": "^2.26.0", - "node-dir": "^0.1.17", - "node-fetch": "^2.6.0", - "regenerator-runtime": "^0.13.5", - "semver": "^6.3.0", - "simple-git": "^1.132.0", - "source-map-support": "^0.5.19", - "update-notifier": "^2.5.0", - "uuid": "^3.4.0", - "yamljs": "^0.3.0" - }, - "dependencies": { - "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", - "dev": true, - "requires": { - "string-width": "^2.0.0" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", - "dev": true - }, - "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "dev": true, - "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" - } - }, - "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" - } - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "chokidar": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", - "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - } - }, - "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", - "dev": true - }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", - "dev": true - }, - "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", - "dev": true, - "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", - "dev": true - }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "dev": true, - "requires": { - "is-obj": "^1.0.0" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^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" - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "dev": true, - "requires": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" - } - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", - "dev": true, - "requires": { - "ci-info": "^1.5.0" - } - }, - "is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", - "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 - }, - "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", - "dev": true, - "requires": { - "package-json": "^4.0.0" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", - "dev": true - }, - "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "dev": true, - "requires": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "registry-auth-token": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", - "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", - "dev": true, - "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "dev": true, - "requires": { - "rc": "^1.0.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "dev": true, - "requires": { - "semver": "^5.0.3" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "dev": true, - "requires": { - "execa": "^0.7.0" - } - }, - "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" - } - }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "dev": true, - "requires": { - "crypto-random-string": "^1.0.0" - } - }, - "update-notifier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", - "dev": true, - "requires": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", - "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", - "dev": true, - "requires": { - "string-width": "^2.1.1" - } - }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", - "dev": true - }, - "yamljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz", - "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "glob": "^7.0.5" - } - } + "@types/body-parser": "*", + "@types/express-serve-static-core": "*", + "@types/qs": "*", + "@types/serve-static": "*" } }, - "@serverless/event-mocks": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@serverless/event-mocks/-/event-mocks-1.1.1.tgz", - "integrity": "sha512-YAV5V/y+XIOfd+HEVeXfPWZb8C6QLruFk9tBivoX2roQLWVq145s4uxf8D0QioCueuRzkukHUS4JIj+KVoS34A==", + "@types/express-serve-static-core": { + "version": "4.17.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.7.tgz", + "integrity": "sha512-EMgTj/DF9qpgLXyc+Btimg+XoH7A2liE8uKul8qSmMTHCeNYzydDKFdsJskDvw42UsesCnhO63dO0Grbj8J4Dw==", "dev": true, "requires": { - "@types/lodash": "^4.14.123", - "lodash": "^4.17.11" + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" } }, - "@serverless/inquirer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@serverless/inquirer/-/inquirer-1.1.2.tgz", - "integrity": "sha512-2c5A6HSWwXluknPNJ2s+Z4WfBwP7Kn6kgsEKD+5xlXpDpBFsRku/xJyO9eqRCwxTM41stgHNC6TRsZ03+wH/rw==", + "@types/glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-VgNIkxK+j7Nz5P7jvUZlRvhuPSmsEfS03b0alKcq5V/STUKAa3Plemsn5mrQUO7am6OErJ4rhGEGJbACclrtRA==", "dev": true, "requires": { - "chalk": "^2.0.1", - "inquirer": "^6.5.2", - "ncjsm": "^4.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - } - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "@types/minimatch": "*", + "@types/node": "*" } }, - "@serverless/platform-client": { - "version": "0.25.14", - "resolved": "https://registry.npmjs.org/@serverless/platform-client/-/platform-client-0.25.14.tgz", - "integrity": "sha512-ww5GBt5QEHYppLH8X+gEFiuMoFu9xdXK0bEROYbuxUliiB0IfXTXLzWR5whhi/S94R7pTnJ4O+WUiFj0PcV/tQ==", + "@types/graceful-fs": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz", + "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==", "dev": true, "requires": { - "adm-zip": "^0.4.13", - "axios": "^0.19.2", - "https-proxy-agent": "^5.0.0", - "isomorphic-ws": "^4.0.1", - "js-yaml": "^3.13.1", - "jwt-decode": "^2.2.0", - "minimatch": "^3.0.4", - "querystring": "^0.2.0", - "traverse": "^0.6.6", - "ws": "^7.2.1" - }, - "dependencies": { - "agent-base": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", - "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "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" - } - }, - "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 - }, - "ws": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", - "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==", - "dev": true - } + "@types/node": "*" } }, - "@serverless/platform-client-china": { - "version": "1.0.18", - "resolved": "https://registry.npmjs.org/@serverless/platform-client-china/-/platform-client-china-1.0.18.tgz", - "integrity": "sha512-M6bucQXgnHF6M+4D4Wt8KCz1bUxpMtG8CPS/WiOhzwwTdG79aYwNIOIC1xo0wtDmrlTwh8ECD8WclAWSHmfaqg==", + "@types/http-proxy": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.4.tgz", + "integrity": "sha512-IrSHl2u6AWXduUaDLqYpt45tLVCtYv7o4Z0s1KghBCDgIIS9oW5K1H8mZG/A2CfeLdEa7rTd1ACOiHBc1EMT2Q==", "dev": true, "requires": { - "@serverless/utils-china": "^0.1.13", - "archiver": "^4.0.1", - "dotenv": "^8.2.0", - "fs-extra": "^8.1.0", - "https-proxy-agent": "^5.0.0", - "isomorphic-ws": "^4.0.1", - "js-yaml": "^3.14.0", - "jwt-decode": "^2.2.0", - "minimatch": "^3.0.4", - "pify": "^5.0.0", - "querystring": "^0.2.0", - "stream.pipeline-shim": "^1.1.0", - "traverse": "^0.6.6", - "urlencode": "^1.1.0", - "ws": "^7.3.0" - }, - "dependencies": { - "agent-base": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", - "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "archiver": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-4.0.1.tgz", - "integrity": "sha512-/YV1pU4Nhpf/rJArM23W6GTUjT0l++VbjykrCRua1TSXrn+yM8Qs7XvtwSiRse0iCe49EPNf7ktXnPsWuSb91Q==", - "dev": true, - "requires": { - "archiver-utils": "^2.1.0", - "async": "^2.6.3", - "buffer-crc32": "^0.2.1", - "glob": "^7.1.6", - "readable-stream": "^3.6.0", - "tar-stream": "^2.1.2", - "zip-stream": "^3.0.1" - } - }, - "compress-commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-3.0.0.tgz", - "integrity": "sha512-FyDqr8TKX5/X0qo+aVfaZ+PVmNJHJeckFBlq8jZGSJOgnynhfifoyl24qaqdUdDIBe0EVTHByN6NAkqYvE/2Xg==", - "dev": true, - "requires": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^3.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^2.3.7" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - } - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", - "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" - } - }, - "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 - }, - "pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "dev": true - }, - "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" - } - }, - "ws": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", - "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==", - "dev": true - }, - "zip-stream": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-3.0.1.tgz", - "integrity": "sha512-r+JdDipt93ttDjsOVPU5zaq5bAyY+3H19bDrThkvuVxC0xMQzU1PJcS6D+KrP3u96gH9XLomcHPb+2skoDjulQ==", - "dev": true, - "requires": { - "archiver-utils": "^2.1.0", - "compress-commons": "^3.0.0", - "readable-stream": "^3.6.0" - } - } + "@types/node": "*" } }, - "@serverless/platform-sdk": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@serverless/platform-sdk/-/platform-sdk-2.3.1.tgz", - "integrity": "sha512-EiSizya9bK0+5uae3GH9uXuWAchZplkLO0tWOAXtnU5QWSg5zicANL9jKCw0dyhjUOvbcO0ddhFlG8EGYvJFSA==", + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "dev": true, "requires": { - "chalk": "^2.4.1", - "https-proxy-agent": "^4.0.0", - "is-docker": "^1.1.0", - "isomorphic-fetch": "^2.2.1", - "jwt-decode": "^2.2.0", - "opn": "^5.5.0", - "querystring": "^0.2.0", - "ramda": "^0.25.0", - "rc": "^1.2.8", - "regenerator-runtime": "^0.13.1", - "source-map-support": "^0.5.12", - "uuid": "^3.3.2", - "write-file-atomic": "^2.4.2", - "ws": "<7.0.0" - }, - "dependencies": { - "agent-base": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", - "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "https-proxy-agent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", - "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", - "dev": true, - "requires": { - "agent-base": "5", - "debug": "4" - } - }, - "is-docker": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-1.1.0.tgz", - "integrity": "sha1-8EN01O7lMQ6ajhE78UlUEeRhdqE=", - "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 - }, - "ramda": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", - "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - } + "@types/istanbul-lib-coverage": "*" } }, - "@serverless/template": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@serverless/template/-/template-1.1.3.tgz", - "integrity": "sha512-hcMiX523rkp6kHeKnM1x6/dXEY+d1UFSr901yVKeeCgpFy4u33UI9vlKaPweAZCF6Ahzqywf01IsFTuBVadCrQ==", + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", "dev": true, "requires": { - "@serverless/component-metrics": "^1.0.8", - "@serverless/core": "^1.0.0", - "graphlib": "^2.1.7", - "traverse": "^0.6.6" + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" } }, - "@serverless/utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@serverless/utils/-/utils-1.1.0.tgz", - "integrity": "sha512-MZBLphb8Dz9/mGclFQ53INznSFHZAwS2z4H8RZb6UPCqcRhW0SRrdLwLmn9JIqLWH4Zn95LbNsAjmzJ4Dl3CPQ==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "lodash": "^4.17.15", - "rc": "^1.2.8", - "type": "^2.0.0", - "uuid": "^3.4.0", - "write-file-atomic": "^2.4.3" - }, - "dependencies": { - "type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", - "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - } - } + "@types/json-schema": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", + "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", + "dev": true }, - "@serverless/utils-china": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/@serverless/utils-china/-/utils-china-0.1.14.tgz", - "integrity": "sha512-M1/bvs/ZhqPfj1yqdsyxu4yIWtCXHd+a5Av/ZXef1deTn1zJHO+ZJdOtvFzWHb0Sr7sX4p2ZHD/vGj0Rve/Pzg==", - "dev": true, - "requires": { - "@tencent-sdk/capi": "0.2.15-alpha.0", - "dijkstrajs": "^1.0.1", - "dot-qs": "0.2.0", - "duplexify": "^4.1.1", - "end-of-stream": "^1.4.4", - "https-proxy-agent": "^5.0.0", - "object-assign": "^4.1.1", - "protobufjs": "^6.9.0", - "socket.io-client": "^2.3.0", - "socket.io-stream": "^0.9.1", - "winston": "^3.2.1" - }, - "dependencies": { - "agent-base": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", - "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "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" - } - }, - "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 - }, - "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" - } - }, - "winston": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz", - "integrity": "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw==", - "dev": true, - "requires": { - "async": "^2.6.1", - "diagnostics": "^1.1.1", - "is-stream": "^1.1.0", - "logform": "^2.1.1", - "one-time": "0.0.4", - "readable-stream": "^3.1.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.3.0" - } - } - } + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true }, - "@sindresorhus/is": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", - "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", + "@types/mime": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.2.tgz", + "integrity": "sha512-4kPlzbljFcsttWEq6aBW0OZe6BDajAmyvr2xknBG92tejQnvdGtT9+kXSZ580DqpxY9qG2xeQVF9Dq0ymUTo5Q==", "dev": true }, - "@sinonjs/commons": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.0.tgz", - "integrity": "sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true }, - "@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "@types/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=", + "dev": true + }, + "@types/mysql": { + "version": "2.15.14", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.14.tgz", + "integrity": "sha512-YyNcxZZ4qlb9v41lu8Qfo+quX8eUqz4mr/6Nx7sclc2pUemOvjU7xrpuVave0/sR/VdtDPTXZOWQLC/kthxrHg==", "dev": true, "requires": { - "@sinonjs/commons": "^1.7.0" + "@types/node": "*" } }, - "@sinonjs/formatio": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-5.0.1.tgz", - "integrity": "sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ==", + "@types/node": { + "version": "14.0.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.13.tgz", + "integrity": "sha512-rouEWBImiRaSJsVA+ITTFM6ZxibuAlTuNOCyxVbwreu6k6+ujs7DfnU9o+PShFhET78pMBl3eH+AGSI5eOTkPA==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/pg": { + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-7.14.3.tgz", + "integrity": "sha512-go5zddQ1FrUQHeBvqPzQ1svKo4KKucSwvqLsvwc/EIuQ9sxDA21b68xc/RwhzAK5pPCnez8NrkYatFIGdJBVvA==", "dev": true, "requires": { - "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^5.0.2" + "@types/node": "*", + "@types/pg-types": "*" } }, - "@sinonjs/samsam": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.0.3.tgz", - "integrity": "sha512-QucHkc2uMJ0pFGjJUDP3F9dq5dx8QIaqISl9QgwLOh6P9yv877uONPGXh/OH/0zmM3tW1JjuJltAZV2l7zU+uQ==", + "@types/pg-types": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@types/pg-types/-/pg-types-1.11.5.tgz", + "integrity": "sha512-L8ogeT6vDzT1vxlW3KITTCt+BVXXVkLXfZ/XNm6UqbcJgxf+KPO7yjWx7dQQE8RW07KopL10x2gNMs41+IkMGQ==", + "dev": true + }, + "@types/prettier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.0.1.tgz", + "integrity": "sha512-boy4xPNEtiw6N3abRhBi/e7hNvy3Tt8E9ZRAQrwAGzoCGZS/1wjo9KY7JHhnfnEsG5wSjDbymCozUM9a3ea7OQ==", + "dev": true + }, + "@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", + "dev": true + }, + "@types/qs": { + "version": "6.9.3", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.3.tgz", + "integrity": "sha512-7s9EQWupR1fTc2pSMtXRQ9w9gLOcrJn+h7HOXw4evxyvVqMi4f+q7d2tnFe3ng3SNHjtK+0EzGMGFUQX4/AQRA==", + "dev": true + }, + "@types/quill": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@types/quill/-/quill-1.3.10.tgz", + "integrity": "sha512-IhW3fPW+bkt9MLNlycw8u8fWb7oO7W5URC9MfZYHBlA24rex9rs23D5DETChu1zvgVdc5ka64ICjJOgQMr6Shw==", "dev": true, "requires": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" + "parchment": "^1.1.2" } }, - "@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==", + "@types/range-parser": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", + "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", "dev": true }, - "@stylelint/postcss-css-in-js": { - "version": "0.37.1", - "resolved": "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.1.tgz", - "integrity": "sha512-UMf2Rni3JGKi3ZwYRGMYJ5ipOA5ENJSKMtYA/pE1ZLURwdh7B5+z2r73RmWvub+N0UuH1Lo+TGfCgYwPvqpXNw==", + "@types/serve-static": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.4.tgz", + "integrity": "sha512-jTDt0o/YbpNwZbQmE/+2e+lfjJEJJR0I3OFaKQKPWkASkCoW3i6fsUnqudSMcNAfbtmADGu8f4MV4q+GqULmug==", "dev": true, "requires": { - "@babel/core": ">=7.9.0" + "@types/express-serve-static-core": "*", + "@types/mime": "*" } }, - "@stylelint/postcss-markdown": { - "version": "0.36.1", - "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.1.tgz", - "integrity": "sha512-iDxMBWk9nB2BPi1VFQ+Dc5+XpvODBHw2n3tYpaBZuEAFQlbtF9If0Qh5LTTwSi/XwdbJ2jt+0dis3i8omyggpw==", + "@types/sinonjs__fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.1.tgz", + "integrity": "sha512-yYezQwGWty8ziyYLdZjwxyMb0CZR49h8JALHGrxjQHWlqGgc8kLdHEgWrgL0uZ29DMvEVBDnHU2Wg36zKSIUtA==", + "dev": true + }, + "@types/sizzle": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz", + "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==", + "dev": true + }, + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "dev": true + }, + "@types/unist": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", + "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==", + "dev": true + }, + "@types/yargs": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", + "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", "dev": true, "requires": { - "remark": "^12.0.0", - "unist-util-find-all-after": "^3.0.1" + "@types/yargs-parser": "*" } }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", + "dev": true + }, + "@typescript-eslint/experimental-utils": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", + "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", "dev": true, "requires": { - "defer-to-connect": "^1.0.1" + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.34.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" } }, - "@tencent-sdk/capi": { - "version": "0.2.15-alpha.0", - "resolved": "https://registry.npmjs.org/@tencent-sdk/capi/-/capi-0.2.15-alpha.0.tgz", - "integrity": "sha512-1P3tlXJgQaQIqphh1jVeyXDOajFUFIU4J7MoU3Pwxdx58dOwS59/suTq4El0Fe12pc3Gmhw+eDeQc35GaHYViw==", + "@typescript-eslint/typescript-estree": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", + "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", "dev": true, "requires": { - "chalk": "^3.0.0", - "moment": "^2.24.0", - "object-assign": "^4.1.1", - "querystring": "^0.2.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.8" + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" }, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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==", + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "color-name": "~1.1.4" + "ms": "^2.1.1" } }, - "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==", + "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 }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, - "@types/babel-types": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.7.tgz", - "integrity": "sha512-dBtBbrc+qTHy1WdfHYjBwRln4+LWqASWakLHsWHR2NWHIFkv4W3O070IGoGLEBrJBvct3r0L1BUPuvURi7kYUQ==", - "dev": true - }, - "@types/babel__core": { - "version": "7.1.8", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.8.tgz", - "integrity": "sha512-KXBiQG2OXvaPWFPDS1rD8yV9vO0OuWIqAEqLsbfX0oU2REN5KuoMnZ1gClWcBhO5I3n6oTVAmrMufOvRqdmFTQ==", + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", "dev": true, "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" } }, - "@types/babel__generator": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", - "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@webassemblyjs/wast-printer": "1.9.0" } }, - "@types/babel__template": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", - "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", "dev": true, "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "@webassemblyjs/ast": "1.9.0" } }, - "@types/babel__traverse": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.12.tgz", - "integrity": "sha512-t4CoEokHTfcyfb4hUaF9oOHu9RmmNWnm1CP0YmMqOOfClKascOmvlEM736vlqeScuGvBDsHkf8R2INd4DWreQA==", + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", "dev": true, "requires": { - "@babel/types": "^7.3.0" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" } }, - "@types/babylon": { - "version": "6.16.5", - "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.5.tgz", - "integrity": "sha512-xH2e58elpj1X4ynnKp9qSnWlsRTIs6n3tgLGNfwAGHwePw0mulHQllV34n0T25uYSu1k0hRKkWXF890B1yS47w==", + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", "dev": true, "requires": { - "@types/babel-types": "*" + "@xtuc/ieee754": "^1.2.0" } }, - "@types/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", "dev": true, "requires": { - "@types/connect": "*", - "@types/node": "*" + "@xtuc/long": "4.2.2" } }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", "dev": true }, - "@types/connect": { - "version": "3.4.33", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", - "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/continuation-local-storage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@types/continuation-local-storage/-/continuation-local-storage-3.2.2.tgz", - "integrity": "sha512-aItm+aYPJ4rT1cHmAxO+OdWjSviQ9iB5UKb5f0Uvgln0N4hS2mcDodHtPiqicYBXViUYhqyBjhA5uyOcT+S34Q==", + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", "dev": true, "requires": { - "@types/node": "*" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" } }, - "@types/express": { - "version": "4.17.6", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.6.tgz", - "integrity": "sha512-n/mr9tZI83kd4azlPG5y997C/M4DNABK9yErhFM6hKdym4kkmd9j0vtsJyjFIwfRBxtrxZtAfGZCNRIBMFLK5w==", + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", "dev": true, "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "*", - "@types/qs": "*", - "@types/serve-static": "*" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" } }, - "@types/express-serve-static-core": { - "version": "4.17.7", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.7.tgz", - "integrity": "sha512-EMgTj/DF9qpgLXyc+Btimg+XoH7A2liE8uKul8qSmMTHCeNYzydDKFdsJskDvw42UsesCnhO63dO0Grbj8J4Dw==", + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", "dev": true, "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" } }, - "@types/glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-VgNIkxK+j7Nz5P7jvUZlRvhuPSmsEfS03b0alKcq5V/STUKAa3Plemsn5mrQUO7am6OErJ4rhGEGJbACclrtRA==", + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", "dev": true, "requires": { - "@types/minimatch": "*", - "@types/node": "*" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" } }, - "@types/graceful-fs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz", - "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==", + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", "dev": true, "requires": { - "@types/node": "*" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" } }, - "@types/http-proxy": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.4.tgz", - "integrity": "sha512-IrSHl2u6AWXduUaDLqYpt45tLVCtYv7o4Z0s1KghBCDgIIS9oW5K1H8mZG/A2CfeLdEa7rTd1ACOiHBc1EMT2Q==", + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", "dev": true, "requires": { - "@types/node": "*" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" } }, - "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "@types/json-schema": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", - "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true - }, - "@types/lodash": { - "version": "4.14.155", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.155.tgz", - "integrity": "sha512-vEcX7S7aPhsBCivxMwAANQburHBtfN9RdyXFk84IJmu2Z4Hkg1tOFgaslRiEqqvoLtbCBi6ika1EMspE+NZ9Lg==", + "@wojtekmaj/date-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@wojtekmaj/date-utils/-/date-utils-1.0.2.tgz", + "integrity": "sha512-sOu+uH3jzsECLg3YGH++/pLWs8S4eKiXMwMIcotE62CO9AB/HRyhZ0ISwann/30DLnfCw4skvr8h9gF3aafhPA==", "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==", + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true }, - "@types/mime": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.2.tgz", - "integrity": "sha512-4kPlzbljFcsttWEq6aBW0OZe6BDajAmyvr2xknBG92tejQnvdGtT9+kXSZ580DqpxY9qG2xeQVF9Dq0ymUTo5Q==", + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "abab": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", + "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", "dev": true }, - "@types/minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=", + "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 }, - "@types/mysql": { - "version": "2.15.13", - "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.13.tgz", - "integrity": "sha512-9hlUjghm0EeLndks56bH6NDcA52ozGcLXr8etlJVuoYXHa2M+neR2XpGekrulln5LsZg8ZRp8/Z0qKGb9Mpjbw==", + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "dev": true, "requires": { - "@types/node": "*" + "mime-types": "~2.1.24", + "negotiator": "0.6.2" } }, - "@types/node": { - "version": "14.0.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.13.tgz", - "integrity": "sha512-rouEWBImiRaSJsVA+ITTFM6ZxibuAlTuNOCyxVbwreu6k6+ujs7DfnU9o+PShFhET78pMBl3eH+AGSI5eOTkPA==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "acorn": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", + "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", "dev": true }, - "@types/pg": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-7.14.3.tgz", - "integrity": "sha512-go5zddQ1FrUQHeBvqPzQ1svKo4KKucSwvqLsvwc/EIuQ9sxDA21b68xc/RwhzAK5pPCnez8NrkYatFIGdJBVvA==", + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "dev": true, "requires": { - "@types/node": "*", - "@types/pg-types": "*" + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" } }, - "@types/pg-types": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@types/pg-types/-/pg-types-1.11.5.tgz", - "integrity": "sha512-L8ogeT6vDzT1vxlW3KITTCt+BVXXVkLXfZ/XNm6UqbcJgxf+KPO7yjWx7dQQE8RW07KopL10x2gNMs41+IkMGQ==", - "dev": true - }, - "@types/prettier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.0.1.tgz", - "integrity": "sha512-boy4xPNEtiw6N3abRhBi/e7hNvy3Tt8E9ZRAQrwAGzoCGZS/1wjo9KY7JHhnfnEsG5wSjDbymCozUM9a3ea7OQ==", - "dev": true - }, - "@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", "dev": true }, - "@types/qs": { - "version": "6.9.3", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.3.tgz", - "integrity": "sha512-7s9EQWupR1fTc2pSMtXRQ9w9gLOcrJn+h7HOXw4evxyvVqMi4f+q7d2tnFe3ng3SNHjtK+0EzGMGFUQX4/AQRA==", + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true }, - "@types/quill": { - "version": "1.3.10", - "resolved": "https://registry.npmjs.org/@types/quill/-/quill-1.3.10.tgz", - "integrity": "sha512-IhW3fPW+bkt9MLNlycw8u8fWb7oO7W5URC9MfZYHBlA24rex9rs23D5DETChu1zvgVdc5ka64ICjJOgQMr6Shw==", + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", "dev": true, "requires": { - "parchment": "^1.1.2" + "es6-promisify": "^5.0.0" } }, - "@types/range-parser": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", - "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", - "dev": true + "agentkeepalive": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "dev": true, + "requires": { + "humanize-ms": "^1.2.1" + } }, - "@types/serve-static": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.4.tgz", - "integrity": "sha512-jTDt0o/YbpNwZbQmE/+2e+lfjJEJJR0I3OFaKQKPWkASkCoW3i6fsUnqudSMcNAfbtmADGu8f4MV4q+GqULmug==", + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", "dev": true, "requires": { - "@types/express-serve-static-core": "*", - "@types/mime": "*" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "dependencies": { + "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 + } } }, - "@types/sinonjs__fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.1.tgz", - "integrity": "sha512-yYezQwGWty8ziyYLdZjwxyMb0CZR49h8JALHGrxjQHWlqGgc8kLdHEgWrgL0uZ29DMvEVBDnHU2Wg36zKSIUtA==", - "dev": true + "airbnb-prop-types": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.15.0.tgz", + "integrity": "sha512-jUh2/hfKsRjNFC4XONQrxo/n/3GG4Tn6Hl0WlFQN5PY9OMC9loSCoAYKnZsWaP8wEfd5xcrPloK0Zg6iS1xwVA==", + "dev": true, + "requires": { + "array.prototype.find": "^2.1.0", + "function.prototype.name": "^1.1.1", + "has": "^1.0.3", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object.assign": "^4.1.0", + "object.entries": "^1.1.0", + "prop-types": "^15.7.2", + "prop-types-exact": "^1.2.0", + "react-is": "^16.9.0" + } }, - "@types/sizzle": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz", - "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==", - "dev": true + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "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" + } }, - "@types/stack-utils": { + "ajv-errors": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", "dev": true }, - "@types/unist": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", - "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==", + "ajv-keywords": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.0.tgz", + "integrity": "sha512-eyoaac3btgU8eJlvh01En8OCKzRqlLe2G5jDsCr3RiE2uLGMEEB1aaGwVVpwR8M95956tGH6R+9edC++OvzaVw==", "dev": true }, - "@types/yargs": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", - "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true }, - "@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true }, - "@typescript-eslint/experimental-utils": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", - "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", + "ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", "dev": true, "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - } - }, - "@typescript-eslint/typescript-estree": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", - "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "string-width": "^3.0.0" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { - "ms": "^2.1.1" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } }, - "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 - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } } } }, - "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", "dev": true }, - "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true }, - "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "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": { - "@webassemblyjs/wast-printer": "1.9.0" + "color-convert": "^1.9.0" } }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "ansi-to-html": { + "version": "0.6.14", + "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.6.14.tgz", + "integrity": "sha512-7ZslfB1+EnFSDO5Ju+ue5Y6It19DRnZXWv8jrGHgIlPna5Mh4jz7BV5jCbQneXNFurQcKoolaaAjHtgSBfOIuA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0" + "entities": "^1.1.2" } }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "any-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", + "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", "dev": true }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" - } + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true }, - "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "@xtuc/ieee754": "^1.2.0" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } } }, - "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } + "app-module-path": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", + "integrity": "sha1-ZBqlXft9am8KgUHEucCqULbCTdU=", + "dev": true }, - "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, - "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "arch": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz", + "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==", + "dev": true + }, + "archive-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", + "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" + "file-type": "^4.2.0" + }, + "dependencies": { + "file-type": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", + "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=", + "dev": true + } } }, - "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "archiver": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-3.1.1.tgz", + "integrity": "sha512-5Hxxcig7gw5Jod/8Gq0OneVgLYET+oNHcxgWItq4TbhOzRLKNAFUb9edAftiMKXvXfCB0vbGrJdZDNq0dWMsxg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "archiver-utils": "^2.1.0", + "async": "^2.6.3", + "buffer-crc32": "^0.2.1", + "glob": "^7.1.4", + "readable-stream": "^3.4.0", + "tar-stream": "^2.1.0", + "zip-stream": "^2.1.2" + }, + "dependencies": { + "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" + } + } } }, - "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "requires": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" } }, - "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" + "sprintf-js": "~1.0.2" } }, - "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" } }, - "@wojtekmaj/date-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@wojtekmaj/date-utils/-/date-utils-1.0.2.tgz", - "integrity": "sha512-sOu+uH3jzsECLg3YGH++/pLWs8S4eKiXMwMIcotE62CO9AB/HRyhZ0ISwann/30DLnfCw4skvr8h9gF3aafhPA==", + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, - "abab": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", - "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, - "abbrev": { + "array-filter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", + "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-flatten": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", "dev": true }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", "dev": true, "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" } }, - "acorn": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", - "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", + "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 }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true }, - "acorn-jsx": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", - "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "acorn-node": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-2.0.1.tgz", - "integrity": "sha512-VLR5sHqjk+8c5hrKeP2fWaIHb8eewsoxnZ8r2qpwRHXMHuC7KyOPflnOx9dLssVQUurzJ7rO0OzIFjHcndafWw==", + "array.prototype.find": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.1.tgz", + "integrity": "sha512-mi+MYNJYLTx2eNYy+Yh6raoQacCsNeeMUaspFPh9Y141lFSsWxxB8V9mM2ye+eqiRs917J6/pJ4M9ZPzenWckA==", "dev": true, "requires": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.4" } }, - "acorn-walk": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz", - "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==", - "dev": true + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } }, - "adm-zip": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.14.tgz", - "integrity": "sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g==", + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "dev": true }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", "dev": true }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "dev": true, "requires": { - "es6-promisify": "^5.0.0" + "safer-buffer": "~2.1.0" } }, - "agentkeepalive": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", - "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "dev": true, "requires": { - "humanize-ms": "^1.2.1" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" } }, - "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "dev": true, "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "object-assign": "^4.1.1", + "util": "0.10.3" }, "dependencies": { - "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==", + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } } } }, - "airbnb-prop-types": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.15.0.tgz", - "integrity": "sha512-jUh2/hfKsRjNFC4XONQrxo/n/3GG4Tn6Hl0WlFQN5PY9OMC9loSCoAYKnZsWaP8wEfd5xcrPloK0Zg6iS1xwVA==", - "dev": true, - "requires": { - "array.prototype.find": "^2.1.0", - "function.prototype.name": "^1.1.1", - "has": "^1.0.3", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object.assign": "^4.1.0", - "object.entries": "^1.1.0", - "prop-types": "^15.7.2", - "prop-types-exact": "^1.2.0", - "react-is": "^16.9.0" - } + "assert-never": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", + "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==", + "dev": true }, - "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", - "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" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } + "ast-module-types": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-2.6.0.tgz", + "integrity": "sha512-zXSoVaMrf2R+r+ISid5/9a8SXm1LLdkhHzh6pSRhj9jklzruOOl1hva1YmFT33wAstg/f9ZndJAlq1BSrFLSGA==", + "dev": true }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", "dev": true }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, - "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "dev": true, "requires": { - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "lodash": "^4.17.14" } }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", "dev": true }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true }, - "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==", + "async-listener": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz", + "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "semver": "^5.3.0", + "shimmer": "^1.1.0" } }, - "ansi-to-html": { - "version": "0.6.14", - "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.6.14.tgz", - "integrity": "sha512-7ZslfB1+EnFSDO5Ju+ue5Y6It19DRnZXWv8jrGHgIlPna5Mh4jz7BV5jCbQneXNFurQcKoolaaAjHtgSBfOIuA==", - "dev": true, - "requires": { - "entities": "^1.1.2" - } + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true }, - "any-observable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", - "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "atomic-batcher": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/atomic-batcher/-/atomic-batcher-1.0.2.tgz", + "integrity": "sha1-0WkB0QzOxZUWwZe5zNiTBom4E7Q=", "dev": true }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "autoprefixer": { + "version": "9.8.2", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.2.tgz", + "integrity": "sha512-9UwMMU8Rg7Fj0c55mbOpXrr/2WrRqoOwOlLNTyyYt+nhiyQdIBWipp5XWzt+Lge8r3DK5y+EHMc1OBf8VpZA6Q==", "dev": true, "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001084", + "kleur": "^4.0.1", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + } + }, + "aws-sdk": { + "version": "2.702.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.702.0.tgz", + "integrity": "sha512-FKRve3NOKeUKxFXeD6VfiIhXpIhym/yFdy7higxUObmsj2ssM/e7Iud79gUHRAKJW5fzusdtkBCAVBjotRGxew==", + "dev": true, + "requires": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.15.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "uuid": "3.3.2", + "xml2js": "0.4.19" }, "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", "dev": true, "requires": { - "remove-trailing-separator": "^1.0.1" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true } } }, - "app-module-path": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", - "integrity": "sha1-ZBqlXft9am8KgUHEucCqULbCTdU=", - "dev": true - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "arch": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz", - "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==", - "dev": true - }, - "archive-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", - "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=", + "aws-sdk-mock": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/aws-sdk-mock/-/aws-sdk-mock-5.1.0.tgz", + "integrity": "sha512-Wa5eCSo8HX0Snqb7FdBylaXMmfrAWoWZ+d7MFhiYsgHPvNvMEGjV945FF2qqE1U0Tolr1ALzik1fcwgaOhqUWQ==", "dev": true, "requires": { - "file-type": "^4.2.0" - }, - "dependencies": { - "file-type": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", - "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=", - "dev": true - } + "aws-sdk": "^2.637.0", + "sinon": "^9.0.1", + "traverse": "^0.6.6" } }, - "archiver": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-3.1.1.tgz", - "integrity": "sha512-5Hxxcig7gw5Jod/8Gq0OneVgLYET+oNHcxgWItq4TbhOzRLKNAFUb9edAftiMKXvXfCB0vbGrJdZDNq0dWMsxg==", + "aws-serverless-express": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/aws-serverless-express/-/aws-serverless-express-3.3.8.tgz", + "integrity": "sha512-2TQdF5EhxnAtGeEi+wSi2M3xCfpiemuImnpU7HKih3onH0izJ/G2tkM+gwcGHZEsW/gLWFl/JjQAYGa3fILfvw==", "dev": true, "requires": { - "archiver-utils": "^2.1.0", - "async": "^2.6.3", - "buffer-crc32": "^0.2.1", - "glob": "^7.1.4", - "readable-stream": "^3.4.0", - "tar-stream": "^2.1.0", - "zip-stream": "^2.1.2" - }, - "dependencies": { - "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" - } - } + "binary-case": "^1.0.0", + "type-is": "^1.6.16" } }, - "archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "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=", + "dev": true + }, + "aws-xray-sdk": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/aws-xray-sdk/-/aws-xray-sdk-2.5.0.tgz", + "integrity": "sha512-KBTF9QUq0zu24t+gFh3VATYDNx295VzZUUjpZ1OmIEbcs3Zqmox5L6VAqjCgGfJeLaCUAWPLkduxau3LuDpqcw==", "dev": true, "requires": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" + "aws-xray-sdk-core": "^2.5.0", + "aws-xray-sdk-express": "^2.5.0", + "aws-xray-sdk-mysql": "^2.5.0", + "aws-xray-sdk-postgres": "^2.5.0", + "pkginfo": "^0.4.0" } }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "aws-xray-sdk-core": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/aws-xray-sdk-core/-/aws-xray-sdk-core-2.5.0.tgz", + "integrity": "sha512-qe60bv0kn5KY6gAIF88TPCOIdu/A3dTmcKISj+kE4OH02eF6kMm1ctL7OgoBAasnsDNSn0VMLhIaA1izgoWuxA==", "dev": true, "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "@types/continuation-local-storage": "*", + "atomic-batcher": "^1.0.2", + "aws-sdk": "^2.304.0", + "continuation-local-storage": "^3.2.0", + "date-fns": "^1.29.0", + "pkginfo": "^0.4.0", + "semver": "^5.3.0", + "winston": "^2.4.4" } }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "aws-xray-sdk-express": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/aws-xray-sdk-express/-/aws-xray-sdk-express-2.5.0.tgz", + "integrity": "sha512-VfUXlxFlI+gr6ImMF+3000fqPRTBS9MbAywdtC8dt/U57WQbLFDjPW+V6oJowTwrkgKwpOKSXncQDfBs8QHvIw==", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "@types/express": "*" } }, - "aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", + "aws-xray-sdk-mysql": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/aws-xray-sdk-mysql/-/aws-xray-sdk-mysql-2.5.0.tgz", + "integrity": "sha512-OI3cDkVcKTiWytwoOE1Oj0D2UbchOVHkiQNXWktDk9QYzqbOz+GNEwD5QneqyxFu0z0bQieClBM+0okUprFBXQ==", "dev": true, "requires": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } + "@types/mysql": "*" } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", - "dev": true - }, - "array-filter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", - "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "array-includes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", - "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "aws-xray-sdk-postgres": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/aws-xray-sdk-postgres/-/aws-xray-sdk-postgres-2.5.0.tgz", + "integrity": "sha512-8LcXTjr272gKMSg9a+QSGQPjAabQb87SA0c4ZlVcPqzoG7nAd3pULR6/HDtujeukbRAb6rEoxzKvPX0s18NyFw==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", - "is-string": "^1.0.5" + "@types/pg": "*" } }, - "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 - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "aws4": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", + "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", "dev": true }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "axe-core": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-3.5.5.tgz", + "integrity": "sha512-5P0QZ6J5xGikH780pghEdbEKijCTrruK9KxtPZCFWUpef0f6GipO+xEZ5GKCb020mmqgbiNO6TcA55CriL784Q==", "dev": true }, - "array.prototype.find": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.1.tgz", - "integrity": "sha512-mi+MYNJYLTx2eNYy+Yh6raoQacCsNeeMUaspFPh9Y141lFSsWxxB8V9mM2ye+eqiRs917J6/pJ4M9ZPzenWckA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.4" - } - }, - "array.prototype.flat": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", - "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "axios": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "follow-redirects": "1.5.10" } }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", - "dev": true - }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", "dev": true }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.3.0.tgz", - "integrity": "sha512-WHnQJFcOrIWT1RLOkFFBQkFVvyt9BPOOrH+Dp152Zk4R993rSzXUGPmkybIcUFhHE2d/iHH+nCaOWVCDbO8fgA==", + "babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", "dev": true, "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" } }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "babel-jest": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.0.1.tgz", + "integrity": "sha512-Z4GGmSNQ8pX3WS1O+6v3fo41YItJJZsVxG5gIQ+HuB/iuAQBJxMTHTwz292vuYws1LnHfwSRgoqI+nxdy/pcvw==", "dev": true, "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" + "@jest/transform": "^26.0.1", + "@jest/types": "^26.0.1", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" }, "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, "requires": { - "inherits": "2.0.1" - } + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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 + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "ast-module-types": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-2.6.0.tgz", - "integrity": "sha512-zXSoVaMrf2R+r+ISid5/9a8SXm1LLdkhHzh6pSRhj9jklzruOOl1hva1YmFT33wAstg/f9ZndJAlq1BSrFLSGA==", - "dev": true - }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "babel-plugin-cerebral": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-cerebral/-/babel-plugin-cerebral-1.0.1.tgz", + "integrity": "sha512-j5FIMZVJjmI+EFcsWdZU83rWLHq0PyN8+ANsMT8oJJ6I0i6FzBBHZj66GBrjriCAci9JUCkB/kLu0KljI8Rx1w==", "dev": true }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "dev": true, "requires": { - "lodash": "^4.17.14" + "object.assign": "^4.1.0" } }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true + "babel-plugin-emotion": { + "version": "10.0.33", + "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.33.tgz", + "integrity": "sha512-bxZbTTGz0AJQDHm8k6Rf3RQJ8tX2scsfsRyKVgAbiUPUNIRtlK+7JxP+TAd1kRLABFxe0CFm2VdK4ePkoA9FxQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@emotion/hash": "0.8.0", + "@emotion/memoize": "0.7.4", + "@emotion/serialize": "^0.11.16", + "babel-plugin-macros": "^2.0.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^1.0.5", + "find-root": "^1.1.0", + "source-map": "^0.5.7" + } }, - "async-listener": { - "version": "0.6.10", - "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz", - "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==", + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", "dev": true, "requires": { - "semver": "^5.3.0", - "shimmer": "^1.1.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" } }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "babel-plugin-jest-hoist": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.0.0.tgz", + "integrity": "sha512-+AuoehOrjt9irZL7DOt2+4ZaTM6dlu1s5TTS46JBa0/qem4dy7VNW3tMb96qeEqcIh20LD73TVNtmVEeymTG7w==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__traverse": "^7.0.6" + } }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true + "babel-plugin-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" + } }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", "dev": true }, - "atomic-batcher": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/atomic-batcher/-/atomic-batcher-1.0.2.tgz", - "integrity": "sha1-0WkB0QzOxZUWwZe5zNiTBom4E7Q=", + "babel-plugin-transform-html-import-require-to-string": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-html-import-require-to-string/-/babel-plugin-transform-html-import-require-to-string-0.0.3.tgz", + "integrity": "sha512-tANZz2t1iPVDE1EpeMEbR7Uath4nwesgITAxuZPEH9FS5iafl0Gy6jvk1ntOO/DKnAokZbeDLa6Kc3dnOeqszw==", "dev": true }, - "autoprefixer": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.0.tgz", - "integrity": "sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A==", + "babel-preset-current-node-syntax": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.3.tgz", + "integrity": "sha512-uyexu1sVwcdFnyq9o8UQYsXwXflIh8LvrF5+cKrYam93ned1CStffB3+BEcsxGSgagoA3GEyjDqO4a/58hyPYQ==", "dev": true, "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001061", - "chalk": "^2.4.2", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.30", - "postcss-value-parser": "^4.1.0" + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, - "aws-info": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/aws-info/-/aws-info-1.0.0.tgz", - "integrity": "sha512-xhZfilnREzSwcaU/jXrfnTSY+1soseElFlkVuN0yWJnRtafH3gACXkd3vXddFgt3GvQxQ0d2g+gBtuZHoA7sZA==", - "dev": true + "babel-preset-jest": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.0.0.tgz", + "integrity": "sha512-9ce+DatAa31DpR4Uir8g4Ahxs5K4W4L8refzt+qHWQANb6LhGcAEfIFgLUwk67oya2cCUd6t4eUMtO/z64ocNw==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^26.0.0", + "babel-preset-current-node-syntax": "^0.1.2" + } }, - "aws-sdk": { - "version": "2.698.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.698.0.tgz", - "integrity": "sha512-6S01wJMGwVLU7uld3sNXd1YuZab/Rha7qMFznxOHjkX/N+N0N1+Spd0T4NqXX9ebSai+OfeLT2H0IwyH4LAIZw==", + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "buffer": "4.9.2", - "events": "1.1.1", - "ieee754": "1.1.13", - "jmespath": "0.15.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "uuid": "3.3.2", - "xml2js": "0.4.19" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" }, "dependencies": { - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "dev": true }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", "dev": true } } }, - "aws-sdk-mock": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/aws-sdk-mock/-/aws-sdk-mock-5.1.0.tgz", - "integrity": "sha512-Wa5eCSo8HX0Snqb7FdBylaXMmfrAWoWZ+d7MFhiYsgHPvNvMEGjV945FF2qqE1U0Tolr1ALzik1fcwgaOhqUWQ==", - "dev": true, - "requires": { - "aws-sdk": "^2.637.0", - "sinon": "^9.0.1", - "traverse": "^0.6.6" - } - }, - "aws-serverless-express": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/aws-serverless-express/-/aws-serverless-express-3.3.8.tgz", - "integrity": "sha512-2TQdF5EhxnAtGeEi+wSi2M3xCfpiemuImnpU7HKih3onH0izJ/G2tkM+gwcGHZEsW/gLWFl/JjQAYGa3fILfvw==", - "dev": true, - "requires": { - "binary-case": "^1.0.0", - "type-is": "^1.6.16" - } - }, - "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=", - "dev": true - }, - "aws-xray-sdk": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/aws-xray-sdk/-/aws-xray-sdk-2.5.0.tgz", - "integrity": "sha512-KBTF9QUq0zu24t+gFh3VATYDNx295VzZUUjpZ1OmIEbcs3Zqmox5L6VAqjCgGfJeLaCUAWPLkduxau3LuDpqcw==", - "dev": true, - "requires": { - "aws-xray-sdk-core": "^2.5.0", - "aws-xray-sdk-express": "^2.5.0", - "aws-xray-sdk-mysql": "^2.5.0", - "aws-xray-sdk-postgres": "^2.5.0", - "pkginfo": "^0.4.0" - } - }, - "aws-xray-sdk-core": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/aws-xray-sdk-core/-/aws-xray-sdk-core-2.5.0.tgz", - "integrity": "sha512-qe60bv0kn5KY6gAIF88TPCOIdu/A3dTmcKISj+kE4OH02eF6kMm1ctL7OgoBAasnsDNSn0VMLhIaA1izgoWuxA==", - "dev": true, - "requires": { - "@types/continuation-local-storage": "*", - "atomic-batcher": "^1.0.2", - "aws-sdk": "^2.304.0", - "continuation-local-storage": "^3.2.0", - "date-fns": "^1.29.0", - "pkginfo": "^0.4.0", - "semver": "^5.3.0", - "winston": "^2.4.4" - } - }, - "aws-xray-sdk-express": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/aws-xray-sdk-express/-/aws-xray-sdk-express-2.5.0.tgz", - "integrity": "sha512-VfUXlxFlI+gr6ImMF+3000fqPRTBS9MbAywdtC8dt/U57WQbLFDjPW+V6oJowTwrkgKwpOKSXncQDfBs8QHvIw==", + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "@types/express": "*" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + } } }, - "aws-xray-sdk-mysql": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/aws-xray-sdk-mysql/-/aws-xray-sdk-mysql-2.5.0.tgz", - "integrity": "sha512-OI3cDkVcKTiWytwoOE1Oj0D2UbchOVHkiQNXWktDk9QYzqbOz+GNEwD5QneqyxFu0z0bQieClBM+0okUprFBXQ==", + "babel-walk": { + "version": "3.0.0-canary-5", + "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", + "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", "dev": true, "requires": { - "@types/mysql": "*" + "@babel/types": "^7.9.6" } }, - "aws-xray-sdk-postgres": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/aws-xray-sdk-postgres/-/aws-xray-sdk-postgres-2.5.0.tgz", - "integrity": "sha512-8LcXTjr272gKMSg9a+QSGQPjAabQb87SA0c4ZlVcPqzoG7nAd3pULR6/HDtujeukbRAb6rEoxzKvPX0s18NyFw==", + "babylon-walk": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/babylon-walk/-/babylon-walk-1.0.2.tgz", + "integrity": "sha1-OxWl3btIKni0zpwByLoYFwLZ1s4=", "dev": true, "requires": { - "@types/pg": "*" + "babel-runtime": "^6.11.6", + "babel-types": "^6.15.0", + "lodash.clone": "^4.5.0" } }, - "aws4": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", - "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", - "dev": true - }, - "axe-core": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-3.5.4.tgz", - "integrity": "sha512-JRuxixN5bPHre+815qnyqBQzNpRTqGxLWflvjr4REpGZ5o0WXm+ik2IS4PZ01EnacWmVRB4jCPWFiYENMiiasA==", + "bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", "dev": true }, - "axios": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", - "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", - "dev": true, - "requires": { - "follow-redirects": "1.5.10" - } - }, - "axobject-query": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.2.tgz", - "integrity": "sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ==", + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "babel-eslint": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", - "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - } - }, - "babel-jest": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.0.1.tgz", - "integrity": "sha512-Z4GGmSNQ8pX3WS1O+6v3fo41YItJJZsVxG5gIQ+HuB/iuAQBJxMTHTwz292vuYws1LnHfwSRgoqI+nxdy/pcvw==", + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "@jest/transform": "^26.0.1", - "@jest/types": "^26.0.1", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" }, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" + "is-descriptor": "^1.0.0" } }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "kind-of": "^6.0.0" } }, - "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==", + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "color-name": "~1.1.4" + "kind-of": "^6.0.0" } }, - "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 - }, - "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 - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } }, - "babel-plugin-cerebral": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-cerebral/-/babel-plugin-cerebral-1.0.1.tgz", - "integrity": "sha512-j5FIMZVJjmI+EFcsWdZU83rWLHq0PyN8+ANsMT8oJJ6I0i6FzBBHZj66GBrjriCAci9JUCkB/kLu0KljI8Rx1w==", + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", "dev": true }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, "requires": { - "object.assign": "^4.1.0" + "tweetnacl": "^0.14.3" } }, - "babel-plugin-emotion": { - "version": "10.0.33", - "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.33.tgz", - "integrity": "sha512-bxZbTTGz0AJQDHm8k6Rf3RQJ8tX2scsfsRyKVgAbiUPUNIRtlK+7JxP+TAd1kRLABFxe0CFm2VdK4ePkoA9FxQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@emotion/hash": "0.8.0", - "@emotion/memoize": "0.7.4", - "@emotion/serialize": "^0.11.16", - "babel-plugin-macros": "^2.0.0", - "babel-plugin-syntax-jsx": "^6.18.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^1.0.5", - "find-root": "^1.1.0", - "source-map": "^0.5.7" - } - }, - "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.0.0.tgz", - "integrity": "sha512-+AuoehOrjt9irZL7DOt2+4ZaTM6dlu1s5TTS46JBa0/qem4dy7VNW3tMb96qeEqcIh20LD73TVNtmVEeymTG7w==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" - } - }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", - "dev": true - }, - "babel-plugin-transform-html-import-require-to-string": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-html-import-require-to-string/-/babel-plugin-transform-html-import-require-to-string-0.0.3.tgz", - "integrity": "sha512-tANZz2t1iPVDE1EpeMEbR7Uath4nwesgITAxuZPEH9FS5iafl0Gy6jvk1ntOO/DKnAokZbeDLa6Kc3dnOeqszw==", - "dev": true - }, - "babel-preset-current-node-syntax": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.3.tgz", - "integrity": "sha512-uyexu1sVwcdFnyq9o8UQYsXwXflIh8LvrF5+cKrYam93ned1CStffB3+BEcsxGSgagoA3GEyjDqO4a/58hyPYQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.0.0.tgz", - "integrity": "sha512-9ce+DatAa31DpR4Uir8g4Ahxs5K4W4L8refzt+qHWQANb6LhGcAEfIFgLUwk67oya2cCUd6t4eUMtO/z64ocNw==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^26.0.0", - "babel-preset-current-node-syntax": "^0.1.2" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "babylon-walk": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/babylon-walk/-/babylon-walk-1.0.2.tgz", - "integrity": "sha1-OxWl3btIKni0zpwByLoYFwLZ1s4=", - "dev": true, - "requires": { - "babel-runtime": "^6.11.6", - "babel-types": "^6.15.0", - "lodash.clone": "^4.5.0" - } - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, - "bail": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", - "dev": true - }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "dev": true, - "requires": { - "callsite": "1.0.0" - } - }, - "bfj": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/bfj/-/bfj-4.2.4.tgz", - "integrity": "sha1-hfeyNoPCr9wVhgOEotHD+sgO0zo=", + "bfj": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-4.2.4.tgz", + "integrity": "sha1-hfeyNoPCr9wVhgOEotHD+sgO0zo=", "dev": true, "requires": { "check-types": "^7.3.0", @@ -6463,12 +4277,6 @@ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, - "bignumber.js": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", - "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", - "dev": true - }, "bin-build": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-3.0.0.tgz", @@ -6789,12 +4597,6 @@ } } }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", - "dev": true - }, "block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", @@ -6905,6 +4707,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -7206,12 +5014,6 @@ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, - "builtin-modules": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", - "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", - "dev": true - }, "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", @@ -7367,12 +5169,6 @@ "caller-callsite": "^2.0.0" } }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true - }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -7416,9 +5212,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001084", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001084.tgz", - "integrity": "sha512-ftdc5oGmhEbLUuMZ/Qp3mOpzfZLCxPYKcvGv6v2dJJ+8EdqcvZRbAGOiLmkM/PV1QGta/uwBs8/nCl6sokDW6w==", + "version": "1.0.30001085", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001085.tgz", + "integrity": "sha512-x0YRFRE0pmOD90z+9Xk7jwO58p4feVNXP+U8kWV+Uo/HADyrgESlepzIkUqPgaXkpyceZU6siM1gsK7sHgplqA==", "dev": true }, "capture-exit": { @@ -7430,12 +5226,6 @@ "rsvp": "^4.8.4" } }, - "capture-stack-trace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", - "dev": true - }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -7463,38 +5253,12 @@ "url-to-options": "^1.0.1" } }, - "cbor": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.0.1.tgz", - "integrity": "sha512-l4ghwqioCyuAaD3LvY4ONwv8NMuERz62xjbMHGdWBqERJPygVmoFER1b4+VS6iW0rXwoVGuKZPPPTofwWOg3YQ==", - "dev": true, - "requires": { - "bignumber.js": "^9.0.0", - "nofilter": "^1.0.3" - } - }, - "cbor-js": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cbor-js/-/cbor-js-0.1.0.tgz", - "integrity": "sha1-yAzmEg84fo+qdDcN/aIdlluPx/k=", - "dev": true - }, "ccount": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.5.tgz", "integrity": "sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw==", "dev": true }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, "cerebral": { "version": "5.2.1-1584683380023", "resolved": "https://registry.npmjs.org/cerebral/-/cerebral-5.2.1-1584683380023.tgz", @@ -7587,19 +5351,6 @@ "parse5": "^3.0.1" } }, - "child-process-ext": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/child-process-ext/-/child-process-ext-2.1.1.tgz", - "integrity": "sha512-0UQ55f51JBkOFa+fvR76ywRzxiPwQS3Xe8oe5bZRphpv+dIMeerW5Zn5e4cUy4COJwVtJyU0R79RMnw+aCqmGA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.5", - "es5-ext": "^0.10.53", - "log": "^6.0.0", - "split2": "^3.1.1", - "stream-promise": "^3.2.0" - } - }, "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -7695,23 +5446,6 @@ "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==", "dev": true }, - "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - }, - "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 - } - } - }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -7853,6 +5587,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "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", @@ -8004,12 +5744,6 @@ "simple-swizzle": "^0.2.2" } }, - "colornames": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", - "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=", - "dev": true - }, "colors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", @@ -8083,24 +5817,12 @@ "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", "dev": true }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, "compress-commons": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-2.1.1.tgz", @@ -8223,15 +5945,13 @@ "dev": true }, "constantinople": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz", - "integrity": "sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", + "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", "dev": true, "requires": { - "@types/babel-types": "^7.0.0", - "@types/babylon": "^6.16.2", - "babel-types": "^6.26.0", - "babylon": "^6.18.0" + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.1" } }, "constants-browserify": { @@ -8292,12 +6012,6 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", "dev": true }, - "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", - "dev": true - }, "cookies": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", @@ -8457,15 +6171,6 @@ "elliptic": "^6.0.0" } }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "dev": true, - "requires": { - "capture-stack-trace": "^1.0.0" - } - }, "create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", @@ -8877,12 +6582,6 @@ "integrity": "sha512-gdDJVchi0oSLIcYXz1H/VSgLE6htHDqJyFsRU/vTkQgmVOZ3S0IR2LXnNbWUYG7VD76dYVwdfBLyx8AX9+An8A==", "dev": true }, - "cuid": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/cuid/-/cuid-2.1.8.tgz", - "integrity": "sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg==", - "dev": true - }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -9060,12 +6759,6 @@ "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", "dev": true }, - "dayjs": { - "version": "1.8.28", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.28.tgz", - "integrity": "sha512-ccnYgKC0/hPSGXxj7Ju6AV/BP4HUkXC2u15mikXT5mX9YorEaoi1bEKOmAqdkJHN4EEkmAf97SpH66Try5Mbeg==", - "dev": true - }, "deasync": { "version": "0.1.20", "resolved": "https://registry.npmjs.org/deasync/-/deasync-0.1.20.tgz", @@ -9357,19 +7050,6 @@ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", "dev": true }, - "deferred": { - "version": "0.7.11", - "resolved": "https://registry.npmjs.org/deferred/-/deferred-0.7.11.tgz", - "integrity": "sha512-8eluCl/Blx4YOGwMapBvXRKxHXhA8ejDXYzEaK8+/gtcm8hRMhSLmXSqDmNUKNc/C8HNSmuyyp/hflhqDAvK2A==", - "dev": true, - "requires": { - "d": "^1.0.1", - "es5-ext": "^0.10.50", - "event-emitter": "^0.3.5", - "next-tick": "^1.0.0", - "timers-ext": "^0.1.7" - } - }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -9707,14 +7387,13 @@ } }, "diagnostics": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", - "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", + "version": "github:DABH/diagnostics#1533851826eac88679124d41f87e45e1b196be56", + "from": "github:DABH/diagnostics#master", "dev": true, "requires": { "colorspace": "1.1.x", - "enabled": "1.0.x", - "kuler": "1.0.x" + "enabled": "2.0.x", + "kuler": "^2.0.0" } }, "dicer": { @@ -9759,12 +7438,6 @@ "randombytes": "^2.0.0" } }, - "dijkstrajs": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.1.tgz", - "integrity": "sha1-082BIh4+pAdCz83lVtTpnpjdxxs=", - "dev": true - }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -9894,12 +7567,6 @@ } } }, - "dot-qs": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dot-qs/-/dot-qs-0.2.0.tgz", - "integrity": "sha1-02UX/iS3zaYfznpQJqACSvr1pDk=", - "dev": true - }, "dotenv": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz", @@ -9982,38 +7649,15 @@ "dev": true }, "duplexify": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz", - "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "requires": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", "stream-shift": "^1.0.0" - }, - "dependencies": { - "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" - } - } - } - }, - "duration": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz", - "integrity": "sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.46" } }, "dynamodb-admin": { @@ -10034,9 +7678,9 @@ } }, "dynamodb-streams-readable": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/dynamodb-streams-readable/-/dynamodb-streams-readable-1.0.5.tgz", - "integrity": "sha512-RFUWJ4pqheqh0nsZDq9KSUT0th6EIHH2vxwSHGcYnFe1xelQz6Qpc3o3GQBau4cET/RYJWvSHU0AMBjILvdCNg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/dynamodb-streams-readable/-/dynamodb-streams-readable-1.0.7.tgz", + "integrity": "sha512-XqilFJdCpLmYH3l5WYDbGmS9lnN8rGjXWrhKyRua5tgJra4J1j6nwxrDcc4BnkBCRG6MTHs9KRoO5L0KU4ZoUA==", "dev": true }, "ecc-jsbn": { @@ -10112,9 +7756,9 @@ } }, "electron-to-chromium": { - "version": "1.3.474", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.474.tgz", - "integrity": "sha512-fPkSgT9IBKmVJz02XioNsIpg0WYmkPrvU1lUJblMMJALxyE7/32NGvbJQKKxpNokozPvqfqkuUqVClYsvetcLw==", + "version": "1.3.480", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.480.tgz", + "integrity": "sha512-wnuUfQCBMAdzu5Xe+F4FjaRK+6ToG6WvwG72s8k/3E6b+hoGVYGiQE7JD1NhiCMcqF3+wV+c2vAnaLGRSSWVqA==", "dev": true }, "elegant-spinner": { @@ -10136,9 +7780,9 @@ "dev": true }, "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", "dev": true, "requires": { "bn.js": "^4.4.0", @@ -10160,9 +7804,9 @@ } }, "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==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, "emojis-list": { @@ -10172,13 +7816,10 @@ "dev": true }, "enabled": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", - "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", - "dev": true, - "requires": { - "env-variable": "0.0.x" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "dev": true }, "encodeurl": { "version": "1.0.2", @@ -10195,18 +7836,6 @@ "iconv-lite": "~0.4.13" } }, - "encodr": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/encodr/-/encodr-1.2.2.tgz", - "integrity": "sha512-MQ5cDilH5al566/2KXvsyrti6t67Oso5oe2RLfgdcNKaMcqEPfbTxpFOa+41QkPAu1+bEVksWL8JK3Owa6Ow+g==", - "dev": true, - "requires": { - "cbor": "5.0.1", - "cbor-js": "0.1.0", - "msgpack-lite": "0.1.26", - "utf8": "3.0.0" - } - }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -10216,64 +7845,6 @@ "once": "^1.4.0" } }, - "engine.io-client": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.3.tgz", - "integrity": "sha512-0NGY+9hioejTEJCaSJZfWZLk4FPI9dN+1H1C4+wj2iuFba47UgZbJzfWs4aNFajnX/qAaYKbe2lLTfEEWzCmcw==", - "dev": true, - "requires": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~6.1.0", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "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 - }, - "ws": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", - "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "engine.io-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", - "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } - }, "enhanced-resolve": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.2.0.tgz", @@ -10300,12 +7871,6 @@ "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", "dev": true }, - "env-variable": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.6.tgz", - "integrity": "sha512-bHz59NlBbtS0NhftmR8+ExBEekE7br0e01jw+kk0NDro7TtZzBYZ5ScGPs3OmwnpyfHTHOtr1Y6uedCdrIldtg==", - "dev": true - }, "envinfo": { "version": "7.5.1", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.5.1.tgz", @@ -10484,31 +8049,6 @@ "es6-promise": "^4.0.3" } }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" - }, - "dependencies": { - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - } - } - }, "es6-symbol": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", @@ -10611,9 +8151,9 @@ } }, "eslint": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.2.0.tgz", - "integrity": "sha512-B3BtEyaDKC5MlfDa2Ha8/D6DsS4fju95zs0hjS3HdGazw+LNayai38A25qMppK37wWGWNYSPOR6oYzlz5MHsRQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.3.0.tgz", + "integrity": "sha512-dJMVXwfU5PT1cj2Nv2VPPrKahKTGdX+5Dh0Q3YuKt+Y2UhdL2YbzsVaBMyG9HC0tBismlv/r1+eZqs6SMIV38Q==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -10622,6 +8162,7 @@ "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", + "enquirer": "^2.3.5", "eslint-scope": "^5.1.0", "eslint-utils": "^2.0.0", "eslint-visitor-keys": "^1.2.0", @@ -10635,7 +8176,6 @@ "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", "is-glob": "^4.0.0", "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", @@ -10875,26 +8415,26 @@ } }, "eslint-plugin-jest": { - "version": "23.13.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.13.2.tgz", - "integrity": "sha512-qZit+moTXTyZFNDqSIR88/L3rdBlTU7CuW6XmyErD2FfHEkdoLgThkRbiQjzgYnX6rfgLx3Ci4eJmF4Ui5v1Cw==", + "version": "23.16.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.16.0.tgz", + "integrity": "sha512-51KcQup31S2NBm+Yqg3rxZIPETd+wZ/gU2rb034RpdXLcZYsa2+uwubqbbDAYIpQw3m+wywF/A56OMEouBY/wA==", "dev": true, "requires": { "@typescript-eslint/experimental-utils": "^2.5.0" } }, "eslint-plugin-jsdoc": { - "version": "25.4.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-25.4.3.tgz", - "integrity": "sha512-5FyIKcNoM+AMBf1sTHvs2DVyij2x6eCYO1hxOUWFLBZV6H5AIdXPT3fVc9H6hrxOYe9SRF+5SjY1hqimV3Q+gQ==", + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-28.0.0.tgz", + "integrity": "sha512-Etne7B8AQcgXrnDPXdfV4x+szHVEP+JVZ2cYNfZGn+HoaZigIOzxxJGU+QUhymz6vuz0fpzFM6fTt64XOvw69w==", "dev": true, "requires": { - "comment-parser": "^0.7.4", + "comment-parser": "^0.7.5", "debug": "^4.1.1", - "jsdoctypeparser": "^6.1.0", + "jsdoctypeparser": "^7.0.0", "lodash": "^4.17.15", "regextras": "^0.7.1", - "semver": "^6.3.0", + "semver": "^7.3.2", "spdx-expression-parse": "^3.0.1" }, "dependencies": { @@ -10914,34 +8454,36 @@ "dev": true }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true } } }, "eslint-plugin-jsx-a11y": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", - "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.3.1.tgz", + "integrity": "sha512-i1S+P+c3HOlBJzMFORRbC58tHa65Kbo8b52/TwCwSKLohwvpfT5rm2GjGWzOHTEuq4xxf2aRlHHTtmExDQOP+g==", "dev": true, "requires": { - "@babel/runtime": "^7.4.5", - "aria-query": "^3.0.0", - "array-includes": "^3.0.3", + "@babel/runtime": "^7.10.2", + "aria-query": "^4.2.2", + "array-includes": "^3.1.1", "ast-types-flow": "^0.0.7", - "axobject-query": "^2.0.2", - "damerau-levenshtein": "^1.0.4", - "emoji-regex": "^7.0.2", + "axe-core": "^3.5.4", + "axobject-query": "^2.1.2", + "damerau-levenshtein": "^1.0.6", + "emoji-regex": "^9.0.0", "has": "^1.0.3", - "jsx-ast-utils": "^2.2.1" + "jsx-ast-utils": "^2.4.1", + "language-tags": "^1.0.5" }, "dependencies": { "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.0.0.tgz", + "integrity": "sha512-6p1NII1Vm62wni/VR/cUMauVQoxmLVb9csqQlvLz+hO2gk8U2UYDfXHQSUYIBKmZwAKz867IDqG7B+u0mj+M6w==", "dev": true } } @@ -11001,9 +8543,9 @@ } }, "eslint-plugin-sort-destructure-keys": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-sort-destructure-keys/-/eslint-plugin-sort-destructure-keys-1.3.4.tgz", - "integrity": "sha512-isdXh0LxE6WEUkkmNtpXX0W95wqCyYI6PY3w9aEcrWQ2IqUzgHQpCfMcb8BD5Wlp2Y9i91kk2leDiII43C1kww==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-sort-destructure-keys/-/eslint-plugin-sort-destructure-keys-1.3.5.tgz", + "integrity": "sha512-JmVpidhDsLwZsmRDV7Tf/vZgOAOEQGkLtwToSvX5mD8fuWYS/xkgMRBsalW1fGlc8CgJJwnzropt4oMQ7YCHLg==", "dev": true, "requires": { "natural-compare-lite": "^1.4.0" @@ -11200,9 +8742,9 @@ "dev": true }, "eslint-plugin-spellcheck": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/eslint-plugin-spellcheck/-/eslint-plugin-spellcheck-0.0.16.tgz", - "integrity": "sha512-zsR9DjzgmTgS0Gz4NpfZHNaBcmQCt6m4JYzrZx+XX4vvHj3rk1mwdEjgenTd55mKakSLDvzclDkDU2IVugfe7w==", + "version": "0.0.17", + "resolved": "https://registry.npmjs.org/eslint-plugin-spellcheck/-/eslint-plugin-spellcheck-0.0.17.tgz", + "integrity": "sha512-SjEPsqHgAODWgCusCXxzYqTkJHe8krun7UjekzhWkFlGM3ZTPto66ED+kQHBrOB3Mrqkx3oD0qf0sDmxyeCRCA==", "dev": true, "requires": { "globals": "^13.0.0", @@ -11241,9 +8783,9 @@ } }, "eslint-visitor-keys": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.2.0.tgz", - "integrity": "sha512-WFb4ihckKil6hu3Dp798xdzSfddwKKU3+nGniKF6HfeW6OLd2OUDEPP7TcHtB5+QXOKg2s6B2DaMPE1Nn/kxKQ==", + "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 }, "esm": { @@ -11252,16 +8794,6 @@ "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", "dev": true }, - "esniff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/esniff/-/esniff-1.1.0.tgz", - "integrity": "sha1-xmhJIp+RRk3t4uDUAgHtar9l8qw=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.12" - } - }, "espree": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/espree/-/espree-7.1.0.tgz", @@ -11305,12 +8837,6 @@ "estraverse": "^4.1.0" } }, - "essentials": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/essentials/-/essentials-1.1.1.tgz", - "integrity": "sha512-SmaxoAdVu86XkZQM/u6TYSu96ZlFGwhvSk1l9zAkznFuQkMb9mRDS2iq/XWDow7R8OwBwdYH8nLyDKznMD+GWw==", - "dev": true - }, "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", @@ -11339,12 +8865,6 @@ "es5-ext": "~0.10.14" } }, - "event-lite": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/event-lite/-/event-lite-0.1.2.tgz", - "integrity": "sha512-HnSYx1BsJ87/p6swwzv+2v6B4X+uxUteoDfRxsAb1S1BePzQqOLevVmkdA15GHJVd9A9Ok6wygUR18Hu0YeV9g==", - "dev": true - }, "eventemitter2": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-4.1.2.tgz", @@ -11898,9 +9418,9 @@ } }, "fecha": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", - "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.0.tgz", + "integrity": "sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg==", "dev": true }, "figgy-pudding": { @@ -12086,35 +9606,6 @@ "pkg-dir": "^3.0.0" } }, - "find-process": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.3.tgz", - "integrity": "sha512-+IA+AUsQCf3uucawyTwMWcY+2M3FXq3BRvw3S+j5Jvydjk31f/+NPWpYZOJs+JUs2GvxH4Yfr6Wham0ZtRLlPA==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "commander": "^2.11.0", - "debug": "^2.6.8" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } - }, - "find-requires": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-requires/-/find-requires-1.0.0.tgz", - "integrity": "sha512-UME7hNwBfzeISSFQcBEDemEEskpOjI/shPrpJM5PI4DSdn6hX0dmz+2dL70blZER2z8tSnTRL+2rfzlYgtbBoQ==", - "dev": true, - "requires": { - "es5-ext": "^0.10.49", - "esniff": "^1.1.0" - } - }, "find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", @@ -12139,23 +9630,6 @@ "semver-regex": "^2.0.0" } }, - "flat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.0.tgz", - "integrity": "sha512-6KSMM+cHHzXC/hpldXApL2S8Uz+QZv+tq5o/L0KQYleoG+GcwrnIJhTWC7tCOiKQp8D/fIvryINU1OZCCwevjA==", - "dev": true, - "requires": { - "is-buffer": "~2.0.4" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", - "dev": true - } - } - }, "flat-cache": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", @@ -12200,6 +9674,12 @@ "readable-stream": "^2.3.6" } }, + "fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "dev": true + }, "follow-redirects": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", @@ -12249,12 +9729,6 @@ "mime-types": "^2.1.12" } }, - "formidable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", - "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", - "dev": true - }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -12327,35 +9801,6 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "fs2": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/fs2/-/fs2-0.3.8.tgz", - "integrity": "sha512-HxOTRiFS3PqwAOmlp1mTwLA+xhQBdaP82b5aBamc/rHKFVyn4qL8YpngaAleD52PNMzBm6TsGOoU/Hq+bAfBhA==", - "dev": true, - "requires": { - "d": "^1.0.1", - "deferred": "^0.7.11", - "es5-ext": "^0.10.53", - "event-emitter": "^0.3.5", - "ignore": "^5.1.4", - "memoizee": "^0.4.14", - "type": "^2.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 - }, - "type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", - "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==", - "dev": true - } - } - }, "fsevents": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", @@ -12801,15 +10246,6 @@ "unicode-trie": "^0.3.1" } }, - "graphlib": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", - "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, "graphviz": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/graphviz/-/graphviz-0.0.9.tgz", @@ -12844,42 +10280,6 @@ } } }, - "hapi-plugin-websocket": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/hapi-plugin-websocket/-/hapi-plugin-websocket-2.3.0.tgz", - "integrity": "sha512-bm+K5opYruM7/u9q+2YnP48PaMZqYo4NiQMtPfg6eHfXgkFjmQ6WUSr5NQkTzl3Gn/aMiYgEM3AX3pR30TZhwA==", - "dev": true, - "requires": { - "@hapi/boom": "9.0.0", - "@hapi/hoek": "9.0.3", - "urijs": "1.19.2", - "websocket-framed": "1.2.2", - "ws": "7.2.1" - }, - "dependencies": { - "@hapi/boom": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.0.0.tgz", - "integrity": "sha512-D+Or4yahLq3L7D1Jf0fR1+Lgr+HPK1lej8tc6hS/fBLmK66XdpvTyKv8YUR5ls1GeQy+KGtbpKAs+ZxyzNtUyA==", - "dev": true, - "requires": { - "@hapi/hoek": "9.x.x" - } - }, - "@hapi/hoek": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.0.3.tgz", - "integrity": "sha512-jKtjLLDiH95b002sJVc5c74PE6KKYftuyVdVmsuYId5stTaWcRFqE+5ukZI4gDUKjGn8wv2C3zPn3/nyjEI7gg==", - "dev": true - }, - "ws": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.1.tgz", - "integrity": "sha512-sucePNSafamSKoOqoNfBd8V0StlkzJKL2ZAhGQinCfNQ+oacw+Pk7lcdAElecBF2VkLNZRiIb5Oi1Q5lVUVt2A==", - "dev": true - } - } - }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -12920,29 +10320,6 @@ "ansi-regex": "^2.0.0" } }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "dev": true, - "requires": { - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -13654,32 +11031,108 @@ } }, "imagemin-pngquant": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/imagemin-pngquant/-/imagemin-pngquant-8.0.0.tgz", - "integrity": "sha512-PVq0diOxO+Zyq/zlMCz2Pfu6mVLHgiT1GpW702OwVlnej+NhS6ZQegYi3OFEDW8d7GxouyR5e8R+t53SMciOeg==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/imagemin-pngquant/-/imagemin-pngquant-9.0.0.tgz", + "integrity": "sha512-9cqnTEaJwAHWUi+8EMTB3NUouWToCWxtL+QnoYr8bfVwuKilHvRVWKsa9lt+0c3aWaGxCAkHs++j8qINvSqomA==", "dev": true, "requires": { - "execa": "^1.0.0", + "execa": "^4.0.0", "is-png": "^2.0.0", "is-stream": "^2.0.0", - "ow": "^0.13.2", - "pngquant-bin": "^5.0.0" + "ow": "^0.17.0", + "pngquant-bin": "^6.0.0" }, "dependencies": { + "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" + } + }, + "execa": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.2.tgz", + "integrity": "sha512-QI2zLa6CjGWdiQsmSkZoGtDx2N+cQIGb3yNolGTdjSQzydzLgYYf8LRuagp7S7fPimjcrzUDSUFd/MgzELMi4Q==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, "is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "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 + }, + "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 } } }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", - "dev": true - }, "import-fresh": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", @@ -13804,12 +11257,6 @@ "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", "dev": true }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, "infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", @@ -13918,6 +11365,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -14001,18 +11454,6 @@ } } }, - "inspectdep": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/inspectdep/-/inspectdep-0.2.0.tgz", - "integrity": "sha512-DSa0F9KfYjMIVKbJpqn196ZGnoO6lv+/OOL1kbJMqGAyFeIkG5rAUmabVnqlp4o26y8XCINj1xp2Yecb6Q/MUQ==", - "dev": true - }, - "int64-buffer": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-0.1.10.tgz", - "integrity": "sha1-J3siiofZWtd30HwTgyAiQGpHNCM=", - "dev": true - }, "internal-slot": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz", @@ -14241,21 +11682,13 @@ "dev": true }, "is-expression": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz", - "integrity": "sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", + "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", "dev": true, "requires": { - "acorn": "~4.0.2", - "object-assign": "^4.0.1" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } + "acorn": "^7.1.1", + "object-assign": "^4.1.1" } }, "is-extendable": { @@ -14572,12 +12005,6 @@ } } }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "dev": true - }, "is-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", @@ -14710,12 +12137,6 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "iso8601-duration": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/iso8601-duration/-/iso8601-duration-1.2.0.tgz", - "integrity": "sha512-ErTBd++b17E8nmWII1K1uZtBgD1E8RjyvwmxlCjPHNqHMD7gmcMHOw0E8Ro/6+QT4PhHRSnnMo7bxa1vFPkwhg==", - "dev": true - }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", @@ -14732,12 +12153,6 @@ "whatwg-fetch": ">=0.10.0" } }, - "isomorphic-ws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", - "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", - "dev": true - }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -16464,15 +13879,9 @@ "dev": true }, "js-base64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", - "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==", - "dev": true - }, - "js-string-escape": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.1.tgz", + "integrity": "sha512-G5x2saUTupU9D/xBY9snJs3TxvwX8EkpLFiYlPpDt/VmMHOXprnSU1nxiTmFbijCX4BLF/cMRIfAcC5BiMYgFQ==", "dev": true }, "js-stringify": { @@ -16549,9 +13958,9 @@ } }, "jsdoctypeparser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-6.1.0.tgz", - "integrity": "sha512-UCQBZ3xCUBv/PLfwKAJhp6jmGOSLFNKzrotXGNgbKhWvz27wPsCsVeP7gIcHPElQw2agBmynAitXqhxR58XAmA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-7.0.0.tgz", + "integrity": "sha512-6vWPn5qSy+MbgCVjXsQKVkRywhs+IxFU7Chw72DKsWoGueYp6QX8eTc55+EA0yPGYfhmglb1gfi283asXirfGQ==", "dev": true }, "jsdom": { @@ -16631,12 +14040,6 @@ "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", "dev": true }, - "json-cycle": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/json-cycle/-/json-cycle-1.3.0.tgz", - "integrity": "sha512-FD/SedD78LCdSvJaOUQAXseT8oQBb5z6IVYaQaCrVUlu9zOAr1BDdKyVYQaSD/GDsAMrXpKcOyBD4LIl8nfjHw==", - "dev": true - }, "json-format": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-format/-/json-format-1.0.1.tgz", @@ -16649,50 +14052,6 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, - "json-refs": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/json-refs/-/json-refs-2.1.7.tgz", - "integrity": "sha1-uesB/in16j6Sh48VrqEK04taz4k=", - "dev": true, - "requires": { - "commander": "^2.9.0", - "graphlib": "^2.1.1", - "js-yaml": "^3.8.3", - "native-promise-only": "^0.8.1", - "path-loader": "^1.0.2", - "slash": "^1.0.0", - "uri-js": "^3.0.2" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "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 - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "uri-js": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", - "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - } - } - }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -16752,12 +14111,6 @@ } } }, - "jsonata": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/jsonata/-/jsonata-1.8.3.tgz", - "integrity": "sha512-r6ztI6ohbpRo77AxBm6vMs3aHZi2L2PaakW7TCPwSkeGcuAZ/SxXGLWH2Npwqq5+YBM/fg/g0EXg/pI9HvXQ8Q==", - "dev": true - }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -16767,12 +14120,6 @@ "graceful-fs": "^4.1.6" } }, - "jsonpath-plus": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-1.1.0.tgz", - "integrity": "sha512-ydqTBOuLcFCUr9e7AxJlKCFgxzEQ03HjnIim0hJSdk2NxD8MOsaMOrRgP6XWEm5q3VuDY5+cRT1DM9vLlGo/qA==", - "dev": true - }, "jsonwebtoken": { "version": "8.5.1", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", @@ -16831,26 +14178,6 @@ "object.assign": "^4.1.0" } }, - "jszip": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.5.0.tgz", - "integrity": "sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA==", - "dev": true, - "requires": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "set-immediate-shim": "~1.0.1" - }, - "dependencies": { - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - } - } - }, "junk": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", @@ -16895,12 +14222,6 @@ "safe-buffer": "^5.0.1" } }, - "jwt-decode": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-2.2.0.tgz", - "integrity": "sha1-fYa9VmefWM5qhHBKZX3TkruoGnk=", - "dev": true - }, "keyboardevent-key-polyfill": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/keyboardevent-key-polyfill/-/keyboardevent-key-polyfill-1.1.0.tgz", @@ -16941,9 +14262,9 @@ } }, "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.0.1.tgz", + "integrity": "sha512-Qs6SqCLm63rd0kNVh+wO4XsWLU6kgfwwaPYsLiClWf0Tewkzsa6MvB21bespb8cz+ANS+2t3So1ge3gintzhlw==", "dev": true }, "known-css-properties": { @@ -16953,9 +14274,9 @@ "dev": true }, "koa": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.12.1.tgz", - "integrity": "sha512-NuYVKjnBxeEe19VljPO9yNcaKKVrMagcax3jjzZtOlxRY2nThWKQqgnI3Pr1OG7mFtvySoDRixoUWZIt6R9C3A==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.13.0.tgz", + "integrity": "sha512-i/XJVOfPw7npbMv67+bOeXr3gPqOAw6uh5wFyNs3QvJ47tUx3M3V9rIE0//WytY42MKz4l/MXKyGkQ2LQTfLUQ==", "dev": true, "requires": { "accepts": "^1.3.5", @@ -17034,13 +14355,10 @@ } }, "kuler": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", - "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", - "dev": true, - "requires": { - "colornames": "^1.1.1" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "dev": true }, "lambdafs": { "version": "1.3.0", @@ -17178,6 +14496,21 @@ } } }, + "language-subtag-registry": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.20.tgz", + "integrity": "sha512-KPMwROklF4tEx283Xw0pNKtfTj1gZ4UByp4EsIFWLgBavJltF4TiYPc39k06zSTsLzxTVXXDSpbwaQXaFB4Qeg==", + "dev": true + }, + "language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", + "dev": true, + "requires": { + "language-subtag-registry": "~0.3.2" + } + }, "latest-version": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", @@ -17193,12 +14526,6 @@ "integrity": "sha1-eZllXoZGwX8In90YfRUNMyTVRRM=", "dev": true }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, "lazystream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", @@ -17242,15 +14569,6 @@ "type-check": "~0.4.0" } }, - "lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dev": true, - "requires": { - "immediate": "~3.0.5" - } - }, "lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", @@ -17267,9 +14585,9 @@ } }, "lint-staged": { - "version": "10.2.10", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.2.10.tgz", - "integrity": "sha512-dgelFaNH6puUGAcU+OVMgbfpKSerNYsPSn6+nlbRDjovL0KigpsVpCu0PFZG6BJxX8gnHJqaZlR9krZamQsb0w==", + "version": "10.2.11", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.2.11.tgz", + "integrity": "sha512-LRRrSogzbixYaZItE2APaS4l2eJMjjf5MbclRZpLJtcQJShcvUzKXsNeZgsLIZ0H0+fg2tL4B59fU9wHIHtFIA==", "dev": true, "requires": { "chalk": "^4.0.0", @@ -17381,6 +14699,12 @@ "ms": "^2.1.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 + }, "execa": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.2.tgz", @@ -17688,9 +15012,9 @@ } }, "listr2": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-2.1.7.tgz", - "integrity": "sha512-XCC1sWLkBFFIMIRwG/LedgHUzN2XLEo02ZqXn6fwuP0GlXGE5BCuL6EAbQFb4vZB+++YEonzEXDPWQe+jCoF6Q==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-2.1.8.tgz", + "integrity": "sha512-Op+hheiChfAphkJ5qUxZtHgyjlX9iNnAeFS/S134xw7mVSg0YVrQo1IY4/K+ElY6XgOPg2Ij4z07urUXR+YEew==", "dev": true, "requires": { "chalk": "^4.0.0", @@ -17778,6 +15102,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -18181,20 +15511,6 @@ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", "dev": true }, - "log": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log/-/log-6.0.0.tgz", - "integrity": "sha512-sxChESNYJ/EcQv8C7xpmxhtTOngoXuMEqGDAkhXBEmt3MAzM3SM/TmIBOqnMEVdrOv1+VgZoYbo6U2GemQiU4g==", - "dev": true, - "requires": { - "d": "^1.0.0", - "duration": "^0.2.2", - "es5-ext": "^0.10.49", - "event-emitter": "^0.3.5", - "sprintf-kit": "^2.0.0", - "type": "^1.0.1" - } - }, "log-symbols": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", @@ -18256,14 +15572,14 @@ } }, "logform": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz", - "integrity": "sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", + "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", "dev": true, "requires": { "colors": "^1.2.1", "fast-safe-stringify": "^2.0.4", - "fecha": "^2.3.3", + "fecha": "^4.2.0", "ms": "^2.1.1", "triple-beam": "^1.3.0" }, @@ -18282,12 +15598,6 @@ } } }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "dev": true - }, "longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", @@ -18373,12 +15683,6 @@ "es5-ext": "~0.10.2" } }, - "luxon": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.24.1.tgz", - "integrity": "sha512-CgnIMKAWT0ghcuWFfCWBnWGOddM0zu6c4wZAWmD0NN7MZTnro0+833DF6tJep+xlxRPg4KtsYEHYLfTMBQKwYg==", - "dev": true - }, "madge": { "version": "3.9.2", "resolved": "https://registry.npmjs.org/madge/-/madge-3.9.2.tgz", @@ -18478,35 +15782,6 @@ "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", "dev": true }, - "precinct": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/precinct/-/precinct-6.3.1.tgz", - "integrity": "sha512-JAwyLCgTylWminoD7V0VJwMElWmwrVSR6r9HaPWCoswkB4iFzX7aNtO7VBfAVPy+NhmjKb8IF8UmlWJXzUkOIQ==", - "dev": true, - "requires": { - "commander": "^2.20.3", - "debug": "^4.1.1", - "detective-amd": "^3.0.0", - "detective-cjs": "^3.1.1", - "detective-es6": "^2.1.0", - "detective-less": "^1.0.2", - "detective-postcss": "^3.0.1", - "detective-sass": "^3.0.1", - "detective-scss": "^2.0.1", - "detective-stylus": "^1.0.0", - "detective-typescript": "^5.8.0", - "module-definition": "^3.3.0", - "node-source-walk": "^4.2.0" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } - }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", @@ -18981,12 +16256,6 @@ "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 - }, "minimist-options": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", @@ -19022,20 +16291,6 @@ "pumpify": "^1.3.3", "stream-each": "^1.1.0", "through2": "^2.0.0" - }, - "dependencies": { - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - } } }, "mixin-deep": { @@ -19124,9 +16379,9 @@ } }, "moment": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.26.0.tgz", - "integrity": "sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw==", + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", + "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==", "dev": true }, "moment-timezone": { @@ -19164,18 +16419,6 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "msgpack-lite": { - "version": "0.1.26", - "resolved": "https://registry.npmjs.org/msgpack-lite/-/msgpack-lite-0.1.26.tgz", - "integrity": "sha1-3TxQsm8FnyXn7e42REGDWOKprYk=", - "dev": true, - "requires": { - "event-lite": "^0.1.1", - "ieee754": "^1.1.8", - "int64-buffer": "^0.1.9", - "isarray": "^1.0.0" - } - }, "mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", @@ -19188,12 +16431,6 @@ "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", "dev": true }, - "nanoid": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", - "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==", - "dev": true - }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -19213,12 +16450,6 @@ "to-regex": "^3.0.1" } }, - "native-promise-only": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", - "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=", - "dev": true - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -19231,33 +16462,10 @@ "integrity": "sha1-F7CVgZiJef3a/gIB6TG6kzyWy7Q=", "dev": true }, - "ncjsm": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/ncjsm/-/ncjsm-4.0.1.tgz", - "integrity": "sha512-gxh5Sgait8HyclaulfhgetHQGyhFm00ZQqISIfqtwFVnyWJ20rk+55SUamo9n3KhM6Vk63gemKPxIDYiSV/xZw==", - "dev": true, - "requires": { - "builtin-modules": "^3.1.0", - "deferred": "^0.7.11", - "es5-ext": "^0.10.51", - "es6-set": "^0.1.5", - "find-requires": "^1.0.0", - "fs2": "^0.3.6", - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", - "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==", - "dev": true - } - } - }, "nearley": { - "version": "2.19.3", - "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.19.3.tgz", - "integrity": "sha512-FpAy1PmTsUpOtgxr23g4jRNvJHYzZEW2PixXeSzksLR/ykPfwKhAodc2+9wQhY+JneWLcvkDw6q7FJIsIdF/aQ==", + "version": "2.19.4", + "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.19.4.tgz", + "integrity": "sha512-oqj3m4oqwKsN77pETa9IPvxHHHLW68KrDc2KYoWMUOhDlrNUo7finubwffQMBRnwNCOXc4kRxCZO0Rvx4L6Zrw==", "dev": true, "requires": { "commander": "^2.19.0", @@ -19318,15 +16526,6 @@ "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", "dev": true }, - "node-dir": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", - "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=", - "dev": true, - "requires": { - "minimatch": "^3.0.2" - } - }, "node-ensure": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/node-ensure/-/node-ensure-0.0.0.tgz", @@ -19725,12 +16924,6 @@ } } }, - "nofilter": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.3.tgz", - "integrity": "sha512-FlUlqwRK6reQCaFLAhMcF+6VkVG2caYjKQY3YsRDTl4/SEch595Qb3oLjJRDr8dkHAAOVj2pOx3VknfnSgkE5g==", - "dev": true - }, "nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", @@ -19970,12 +17163,6 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", - "dev": true - }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -20007,16 +17194,10 @@ } } }, - "object-hash": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", - "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==", - "dev": true - }, "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", "dev": true }, "object-is": { @@ -20135,10 +17316,13 @@ } }, "one-time": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", - "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dev": true, + "requires": { + "fn.name": "1.x.x" + } }, "onetime": { "version": "1.1.0", @@ -20377,18 +17561,18 @@ "dev": true }, "ow": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/ow/-/ow-0.13.2.tgz", - "integrity": "sha512-9wvr+q+ZTDRvXDjL6eDOdFe5WUl/wa5sntf9kAolxqSpkBqaIObwLgFCGXSJASFw+YciXnOVtDWpxXa9cqV94A==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/ow/-/ow-0.17.0.tgz", + "integrity": "sha512-i3keDzDQP5lWIe4oODyDFey1qVrq2hXKTuTH2VpqwpYtzPiKZt2ziRI4NBQmgW40AnV5Euz17OyWweCb+bNEQA==", "dev": true, "requires": { - "type-fest": "^0.5.1" + "type-fest": "^0.11.0" }, "dependencies": { "type-fest": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", - "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", "dev": true } } @@ -21216,24 +18400,6 @@ "@types/node": "*" } }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -21315,16 +18481,6 @@ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, - "path-loader": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/path-loader/-/path-loader-1.0.10.tgz", - "integrity": "sha512-CMP0v6S6z8PHeJ6NFVyVJm6WyJjIwFvyz2b0n2/4bKdS/0uZa/9sKUlYZzubrn3zuDRU0zIuEDX9DZYQ2ZI8TA==", - "dev": true, - "requires": { - "native-promise-only": "^0.8.1", - "superagent": "^3.8.3" - } - }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", @@ -21379,9 +18535,9 @@ } }, "pdf-lib": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.7.0.tgz", - "integrity": "sha512-JauBSWwR5hCsdqxCsm1vJUJ4R1MSikzxWzi+E4zFFMU0zZHX71u18oyW0ZaELXJW13L11I/2LKrUJEhTISUzzg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.8.0.tgz", + "integrity": "sha512-3D2FExYcr0Egdk4Uy5WxojkNLmxYDj/VRt/Lxu9qjRHD6m3G/YiyjA9aRFHAahsXDf8uI0R4cTZ/CgwR8P6yfw==", "dev": true, "requires": { "@pdf-lib/standard-fonts": "^0.0.4", @@ -21582,36 +18738,103 @@ "dev": true }, "pngquant-bin": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/pngquant-bin/-/pngquant-bin-5.0.2.tgz", - "integrity": "sha512-OLdT+4JZx5BqE1CFJkrvomYV0aSsv6x2Bba+aWaVc0PMfWlE+ZByNKYAdKeIqsM4uvW1HOSEHnf8KcOnykPNxA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pngquant-bin/-/pngquant-bin-6.0.0.tgz", + "integrity": "sha512-oXWAS9MQ9iiDAJRdAZ9KO1mC5UwhzKkJsmetiu0iqIjJuW7JsuLhmc4JdRm7uJkIWRzIAou/Vq2VcjfJwz30Ow==", "dev": true, "requires": { "bin-build": "^3.0.0", "bin-wrapper": "^4.0.1", - "execa": "^0.10.0", + "execa": "^4.0.0", "logalot": "^2.0.0" }, "dependencies": { + "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" + } + }, "execa": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", - "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.2.tgz", + "integrity": "sha512-QI2zLa6CjGWdiQsmSkZoGtDx2N+cQIGb3yNolGTdjSQzydzLgYYf8LRuagp7S7fPimjcrzUDSUFd/MgzELMi4Q==", "dev": true, "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" } }, "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "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 + }, + "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/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true } } @@ -22515,31 +19738,6 @@ "parse-ms": "^2.1.0" } }, - "prettyoutput": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/prettyoutput/-/prettyoutput-1.2.0.tgz", - "integrity": "sha512-G2gJwLzLcYS+2m6bTAe+CcDpwak9YpcvpScI0tE4WYb2O3lEZD/YywkMNpGqsSx5wttGvh2UXaKROTKKCyM2dw==", - "dev": true, - "requires": { - "colors": "1.3.x", - "commander": "2.19.x", - "lodash": "4.17.x" - }, - "dependencies": { - "colors": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", - "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", - "dev": true - }, - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true - } - } - }, "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", @@ -22579,12 +19777,6 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, - "promise-queue": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/promise-queue/-/promise-queue-2.2.5.tgz", - "integrity": "sha1-L29ffA9tCBCelnZZx5uIqe1ek7Q=", - "dev": true - }, "prompts": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", @@ -22593,6 +19785,14 @@ "requires": { "kleur": "^3.0.3", "sisteransi": "^1.0.4" + }, + "dependencies": { + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + } } }, "prop-types": { @@ -22623,35 +19823,6 @@ "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", "dev": true }, - "protobufjs": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.9.0.tgz", - "integrity": "sha512-LlGVfEWDXoI/STstRDdZZKb/qusoAWUnmLg9R8OLSO473mBLWHowx8clbX5/+mKDEI+v7GzjoK9tRPZMMcoTrg==", - "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" - }, - "dependencies": { - "@types/node": { - "version": "13.13.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.12.tgz", - "integrity": "sha512-zWz/8NEPxoXNT9YyF2osqyA9WjssZukYpgI4UYZpOjcyqwIUqWGkcCionaEb9Ki+FULyPyvNFpg/329Kd2/pbw==", - "dev": true - } - } - }, "protocolify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/protocolify/-/protocolify-2.0.0.tgz", @@ -22717,129 +19888,127 @@ } }, "pug": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.4.tgz", - "integrity": "sha512-XhoaDlvi6NIzL49nu094R2NA6P37ijtgMDuWE+ofekDChvfKnzFal60bhSdiy8y2PBO6fmz3oMEIcfpBVRUdvw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.0.tgz", + "integrity": "sha512-inmsJyFBSHZaiGLaguoFgJGViX0If6AcfcElimvwj9perqjDpUpw79UIEDZbWFmoGVidh08aoE+e8tVkjVJPCw==", "dev": true, "requires": { - "pug-code-gen": "^2.0.2", - "pug-filters": "^3.1.1", - "pug-lexer": "^4.1.0", - "pug-linker": "^3.0.6", - "pug-load": "^2.0.12", - "pug-parser": "^5.0.1", - "pug-runtime": "^2.0.5", - "pug-strip-comments": "^1.0.4" + "pug-code-gen": "^3.0.0", + "pug-filters": "^4.0.0", + "pug-lexer": "^5.0.0", + "pug-linker": "^4.0.0", + "pug-load": "^3.0.0", + "pug-parser": "^6.0.0", + "pug-runtime": "^3.0.0", + "pug-strip-comments": "^2.0.0" } }, "pug-attrs": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.4.tgz", - "integrity": "sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", + "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", "dev": true, "requires": { - "constantinople": "^3.0.1", - "js-stringify": "^1.0.1", - "pug-runtime": "^2.0.5" + "constantinople": "^4.0.1", + "js-stringify": "^1.0.2", + "pug-runtime": "^3.0.0" } }, "pug-code-gen": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.2.tgz", - "integrity": "sha512-kROFWv/AHx/9CRgoGJeRSm+4mLWchbgpRzTEn8XCiwwOy6Vh0gAClS8Vh5TEJ9DBjaP8wCjS3J6HKsEsYdvaCw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.1.tgz", + "integrity": "sha512-xJIGvmXTQlkJllq6hqxxjRWcay2F9CU69TuAuiVZgHK0afOhG5txrQOcZyaPHBvSWCU/QQOqEp5XCH94rRZpBQ==", "dev": true, "requires": { - "constantinople": "^3.1.2", + "constantinople": "^4.0.1", "doctypes": "^1.1.0", - "js-stringify": "^1.0.1", - "pug-attrs": "^2.0.4", - "pug-error": "^1.3.3", - "pug-runtime": "^2.0.5", - "void-elements": "^2.0.1", - "with": "^5.0.0" + "js-stringify": "^1.0.2", + "pug-attrs": "^3.0.0", + "pug-error": "^2.0.0", + "pug-runtime": "^3.0.0", + "void-elements": "^3.1.0", + "with": "^7.0.0" } }, "pug-error": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.3.tgz", - "integrity": "sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz", + "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==", "dev": true }, "pug-filters": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-3.1.1.tgz", - "integrity": "sha512-lFfjNyGEyVWC4BwX0WyvkoWLapI5xHSM3xZJFUhx4JM4XyyRdO8Aucc6pCygnqV2uSgJFaJWW3Ft1wCWSoQkQg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", + "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", "dev": true, "requires": { - "clean-css": "^4.1.11", - "constantinople": "^3.0.1", + "constantinople": "^4.0.1", "jstransformer": "1.0.0", - "pug-error": "^1.3.3", - "pug-walk": "^1.1.8", - "resolve": "^1.1.6", - "uglify-js": "^2.6.1" + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0", + "resolve": "^1.15.1" } }, "pug-lexer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-4.1.0.tgz", - "integrity": "sha512-i55yzEBtjm0mlplW4LoANq7k3S8gDdfC6+LThGEvsK4FuobcKfDAwt6V4jKPH9RtiE3a2Akfg5UpafZ1OksaPA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.0.tgz", + "integrity": "sha512-52xMk8nNpuyQ/M2wjZBN5gXQLIylaGkAoTk5Y1pBhVqaopaoj8Z0iVzpbFZAqitL4RHNVDZRnJDsqEYe99Ti0A==", "dev": true, "requires": { - "character-parser": "^2.1.1", - "is-expression": "^3.0.0", - "pug-error": "^1.3.3" + "character-parser": "^2.2.0", + "is-expression": "^4.0.0", + "pug-error": "^2.0.0" } }, "pug-linker": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.6.tgz", - "integrity": "sha512-bagfuHttfQOpANGy1Y6NJ+0mNb7dD2MswFG2ZKj22s8g0wVsojpRlqveEQHmgXXcfROB2RT6oqbPYr9EN2ZWzg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", + "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", "dev": true, "requires": { - "pug-error": "^1.3.3", - "pug-walk": "^1.1.8" + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0" } }, "pug-load": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.12.tgz", - "integrity": "sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", + "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", "dev": true, "requires": { - "object-assign": "^4.1.0", - "pug-walk": "^1.1.8" + "object-assign": "^4.1.1", + "pug-walk": "^2.0.0" } }, "pug-parser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-5.0.1.tgz", - "integrity": "sha512-nGHqK+w07p5/PsPIyzkTQfzlYfuqoiGjaoqHv1LjOv2ZLXmGX1O+4Vcvps+P4LhxZ3drYSljjq4b+Naid126wA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", + "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", "dev": true, "requires": { - "pug-error": "^1.3.3", - "token-stream": "0.0.1" + "pug-error": "^2.0.0", + "token-stream": "1.0.0" } }, "pug-runtime": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.5.tgz", - "integrity": "sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.0.tgz", + "integrity": "sha512-GoEPcmQNnaTsePEdVA05bDpY+Op5VLHKayg08AQiqJBWU/yIaywEYv7TetC5dEQS3fzBBoyb2InDcZEg3mPTIA==", "dev": true }, "pug-strip-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz", - "integrity": "sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", + "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", "dev": true, "requires": { - "pug-error": "^1.3.3" + "pug-error": "^2.0.0" } }, "pug-walk": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.8.tgz", - "integrity": "sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", + "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==", "dev": true }, "pump": { @@ -22863,18 +20032,6 @@ "pump": "^2.0.0" }, "dependencies": { - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, "pump": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", @@ -23027,12 +20184,6 @@ "wrap-ansi": "^5.1.0" } }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -23787,12 +20938,6 @@ "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", "dev": true }, - "replaceall": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/replaceall/-/replaceall-0.1.6.tgz", - "integrity": "sha1-gdgax663LX9cSUKt8ml6MiBojY4=", - "dev": true - }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -24010,15 +21155,6 @@ "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", "dev": true }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "requires": { - "align-text": "^0.1.1" - } - }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -24103,1727 +21239,201 @@ "dev": true, "requires": { "tslib": "^1.9.0" - } - }, - "s3-files": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/s3-files/-/s3-files-2.0.1.tgz", - "integrity": "sha512-fZTj+WwndviG7QDwK6qZgR02qbhR4IwPjrmX3S98Zp2gWJhvAyzJnZQA4PQgfr8mEuTgUbjWp7ul/KzY8UaecA==", - "dev": true, - "requires": { - "aws-sdk": "^2.449.0", - "concat-stream": "^2.0.0", - "stream-array": "^1.1.2" - }, - "dependencies": { - "concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "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" - } - } - } - }, - "s3-zip": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/s3-zip/-/s3-zip-3.1.3.tgz", - "integrity": "sha512-GaeIaMNpNBmWDbul9qzJWsyZDhPwk950tYKkDgjIJgv2upnEtwjgWIGVLMh7Hd4DAZRiuv/JEiLUTsQAkSTHDg==", - "dev": true, - "requires": { - "archiver": "^3.1.1", - "s3-files": "^2.0.0" - } - }, - "s3rver": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/s3rver/-/s3rver-3.6.1.tgz", - "integrity": "sha512-8PI1yIUJ6WQbDYjidZo/EOknMRxos3uukM1a70VQE2lqzH9A8FUTOhlUGaRiAU/K0teROou1mesUsfrYwpwkCw==", - "dev": true, - "requires": { - "@koa/router": "^9.0.0", - "busboy": "^0.3.1", - "commander": "^5.0.0", - "fast-xml-parser": "^3.12.19", - "fs-extra": "^8.0.0", - "he": "^1.2.0", - "koa": "^2.7.0", - "koa-logger": "^3.2.0", - "lodash": "^4.17.5", - "statuses": "^2.0.0", - "winston": "^3.0.0" - }, - "dependencies": { - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true - }, - "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" - } - }, - "statuses": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.0.tgz", - "integrity": "sha512-w9jNUUQdpuVoYqXxnyOakhckBbOxRaoYqJscyIBYCS5ixyCnO7nQn7zBZvP9zf5QOPZcz2DLUpE3KsNPbJBOFA==", - "dev": true - }, - "winston": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz", - "integrity": "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw==", - "dev": true, - "requires": { - "async": "^2.6.1", - "diagnostics": "^1.1.1", - "is-stream": "^1.1.0", - "logform": "^2.1.1", - "one-time": "0.0.4", - "readable-stream": "^3.1.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.3.0" - } - } - } - }, - "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 - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dev": true, - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } - } - }, - "sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "dev": true, - "requires": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "sass": { - "version": "1.26.8", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.8.tgz", - "integrity": "sha512-yvtzyrKLGiXQu7H12ekXqsfoGT/aTKeMDyVzCB675k1HYuaj0py63i8Uf4SI9CHXj6apDhpfwbUr3gGOjdpu2Q==", - "dev": true, - "requires": { - "chokidar": ">=2.0.0 <4.0.0" - } - }, - "sass-graph": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", - "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "lodash": "^4.0.0", - "scss-tokenizer": "^0.2.3", - "yargs": "^13.3.2" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.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": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.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 - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.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": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "sass-lookup": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sass-lookup/-/sass-lookup-3.0.0.tgz", - "integrity": "sha512-TTsus8CfFRn1N44bvdEai1no6PqdmDiQUiqW5DlpmtT+tYnIt1tXtDIph5KA1efC+LmioJXSnCtUVpcK9gaKIg==", - "dev": true, - "requires": { - "commander": "^2.16.0" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } - }, - "sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", - "dev": true - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", - "dev": true, - "requires": { - "js-base64": "^2.1.8", - "source-map": "^0.4.2" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "seek-bzip": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", - "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", - "dev": true, - "requires": { - "commander": "~2.8.1" - }, - "dependencies": { - "commander": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - } - } - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", - "dev": true - }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "requires": { - "semver": "^6.3.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 - } - } - }, - "semver-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", - "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", - "dev": true - }, - "semver-truncate": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.2.tgz", - "integrity": "sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g=", - "dev": true, - "requires": { - "semver": "^5.3.0" - } - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "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==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", - "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serialize-to-js": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/serialize-to-js/-/serialize-to-js-3.1.1.tgz", - "integrity": "sha512-F+NGU0UHMBO4Q965tjw7rvieNVjlH6Lqi2emq/Lc9LUURYJbiCzmpi4Cy1OOjjVPtxu0c+NE85LU6968Wko5ZA==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "serverless": { - "version": "1.70.1", - "resolved": "https://registry.npmjs.org/serverless/-/serverless-1.70.1.tgz", - "integrity": "sha512-2HU2wVKG3FKQQax8LuZDi35NutL8Gd7wq9YPuqs/S1cnM3HNsesptxAnUzz73dtUxu8d3tkVXvlqgpKd2RN1/A==", - "dev": true, - "requires": { - "@serverless/cli": "^1.4.0", - "@serverless/components": "^2.30.10", - "@serverless/enterprise-plugin": "^3.6.11", - "archiver": "^3.1.1", - "async": "^1.5.2", - "aws-sdk": "^2.673.0", - "bluebird": "^3.7.2", - "boxen": "^3.2.0", - "cachedir": "^2.3.0", - "chalk": "^2.4.2", - "child-process-ext": "^2.1.1", - "ci-info": "^2.0.0", - "d": "^1.0.1", - "dayjs": "^1.8.26", - "decompress": "^4.2.1", - "download": "^7.1.0", - "essentials": "^1.1.1", - "fast-levenshtein": "^2.0.6", - "filesize": "^3.6.1", - "fs-extra": "^0.30.0", - "get-stdin": "^6.0.0", - "globby": "^6.1.0", - "graceful-fs": "^4.2.4", - "https-proxy-agent": "^5.0.0", - "inquirer": "^6.5.2", - "is-docker": "^1.1.0", - "is-wsl": "^2.2.0", - "js-yaml": "^3.13.1", - "json-cycle": "^1.3.0", - "json-refs": "^2.1.7", - "jwt-decode": "^2.2.0", - "lodash": "^4.17.15", - "memoizee": "^0.4.14", - "mkdirp": "^0.5.4", - "nanomatch": "^1.2.13", - "ncjsm": "^4.0.1", - "node-fetch": "^2.6.0", - "object-hash": "^2.0.3", - "p-limit": "^2.3.0", - "promise-queue": "^2.2.5", - "rc": "^1.2.8", - "replaceall": "^0.1.6", - "semver": "^5.7.1", - "semver-regex": "^2.0.0", - "stream-promise": "^3.2.0", - "tabtab": "^3.0.2", - "untildify": "^3.0.3", - "update-notifier": "^2.5.0", - "uuid": "^8.0.0", - "write-file-atomic": "^2.4.3", - "yaml-ast-parser": "0.0.43", - "yargs-parser": "^18.1.3" - }, - "dependencies": { - "@serverless/components": { - "version": "2.30.15", - "resolved": "https://registry.npmjs.org/@serverless/components/-/components-2.30.15.tgz", - "integrity": "sha512-1K8L1DV1pUEYeBtUyJZfCSpfzBuuvCEPwAuu/D89g4Lxlp5DcrnkXUItKFf1sprTR/20q3tS9iKdcgPsU5QFCA==", - "dev": true, - "requires": { - "@serverless/inquirer": "^1.1.0", - "@serverless/platform-client": "^0.25.7", - "@serverless/platform-client-china": "^1.0.12", - "@serverless/platform-sdk": "^2.3.0", - "adm-zip": "^0.4.14", - "ansi-escapes": "^4.3.1", - "axios": "^0.19.2", - "chalk": "^2.4.2", - "chokidar": "^3.3.1", - "dotenv": "^8.2.0", - "figures": "^3.2.0", - "fs-extra": "^8.1.0", - "globby": "^10.0.2", - "graphlib": "^2.1.8", - "https-proxy-agent": "^5.0.0", - "ini": "^1.3.5", - "js-yaml": "^3.13.1", - "minimist": "^1.2.5", - "moment": "^2.24.0", - "open": "^7.0.3", - "prettyoutput": "^1.2.0", - "ramda": "^0.26.1", - "semver": "^7.3.2", - "strip-ansi": "^5.2.0", - "traverse": "^0.6.6", - "uuid": "^3.4.0", - "ws": "^7.2.3" - }, - "dependencies": { - "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" - } - }, - "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" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } - } - }, - "agent-base": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", - "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "dev": true, - "requires": { - "type-fest": "^0.11.0" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", - "dev": true - }, - "boxen": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-3.2.0.tgz", - "integrity": "sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^2.4.2", - "cli-boxes": "^2.2.0", - "string-width": "^3.0.0", - "term-size": "^1.2.0", - "type-fest": "^0.3.0", - "widest-line": "^2.0.0" - }, - "dependencies": { - "type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", - "dev": true - } - } - }, - "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" - } - }, - "chokidar": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", - "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", - "dev": true, - "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "dev": true, - "requires": { - "is-obj": "^1.0.0" - } - }, - "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", - "dev": true - }, - "download": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz", - "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==", - "dev": true, - "requires": { - "archive-type": "^4.0.0", - "caw": "^2.0.1", - "content-disposition": "^0.5.2", - "decompress": "^4.2.0", - "ext-name": "^5.0.0", - "file-type": "^8.1.0", - "filenamify": "^2.0.0", - "get-stream": "^3.0.0", - "got": "^8.3.1", - "make-dir": "^1.2.0", - "p-event": "^2.1.0", - "pify": "^3.0.0" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-type": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz", - "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==", - "dev": true - }, - "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" - } - }, - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - }, - "dependencies": { - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - } - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "got": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", - "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.7.0", - "cacheable-request": "^2.1.1", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "into-stream": "^3.1.0", - "is-retry-allowed": "^1.1.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "mimic-response": "^1.0.0", - "p-cancelable": "^0.4.0", - "p-timeout": "^2.0.1", - "pify": "^3.0.0", - "safe-buffer": "^5.1.1", - "timed-out": "^4.0.1", - "url-parse-lax": "^3.0.0", - "url-to-options": "^1.0.1" - } - }, - "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" - } - }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, - "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "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" - }, - "dependencies": { - "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" - } - } - } - } - } - }, - "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-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", - "dev": true, - "requires": { - "ci-info": "^1.5.0" - }, - "dependencies": { - "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", - "dev": true - } - } - }, - "is-docker": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-1.1.0.tgz", - "integrity": "sha1-8EN01O7lMQ6ajhE78UlUEeRhdqE=", - "dev": true - }, - "is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", - "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 - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.9" - } - }, - "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", - "dev": true, - "requires": { - "package-json": "^4.0.0" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "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 - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", - "dev": true - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "p-cancelable": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", - "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", - "dev": true - }, - "p-event": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", - "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==", - "dev": true, - "requires": { - "p-timeout": "^2.0.1" - } - }, - "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-timeout": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", - "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", - "dev": true, - "requires": { - "p-finally": "^1.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-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "dev": true, - "requires": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" - }, - "dependencies": { - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "dev": true, - "requires": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" - } - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "requires": { - "prepend-http": "^1.0.1" - } - } - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "registry-auth-token": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", - "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", - "dev": true, - "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "dev": true, - "requires": { - "rc": "^1.0.1" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "dev": true, - "requires": { - "semver": "^5.0.3" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "dev": true, - "requires": { - "execa": "^0.7.0" - } - }, - "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" - } - }, - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true - }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "dev": true, - "requires": { - "crypto-random-string": "^1.0.0" - } - }, - "untildify": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", - "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==", - "dev": true - }, - "update-notifier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", - "dev": true, - "requires": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", - "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" - }, - "dependencies": { - "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", - "dev": true, - "requires": { - "string-width": "^2.0.0" - } - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "dev": true, - "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" - } - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", - "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" - } - } - } - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + } + }, + "s3-files": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/s3-files/-/s3-files-2.0.1.tgz", + "integrity": "sha512-fZTj+WwndviG7QDwK6qZgR02qbhR4IwPjrmX3S98Zp2gWJhvAyzJnZQA4PQgfr8mEuTgUbjWp7ul/KzY8UaecA==", + "dev": true, + "requires": { + "aws-sdk": "^2.449.0", + "concat-stream": "^2.0.0", + "stream-array": "^1.1.2" + }, + "dependencies": { + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", "dev": true, "requires": { - "string-width": "^2.1.1" - }, - "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 - }, - "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" - } - } + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" } }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "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": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } - }, - "ws": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", - "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==", - "dev": true - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", - "dev": true } } }, - "serverless-domain-manager": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/serverless-domain-manager/-/serverless-domain-manager-4.1.1.tgz", - "integrity": "sha512-9cQC+aj7FD82ca7SC1fWLKZzyDyRufj+ez0SC89VeNQ43UfugstSSCqbJ6nOWSgSeLQdEKZzukY61vcOF957LA==", + "s3-zip": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/s3-zip/-/s3-zip-3.1.3.tgz", + "integrity": "sha512-GaeIaMNpNBmWDbul9qzJWsyZDhPwk950tYKkDgjIJgv2upnEtwjgWIGVLMh7Hd4DAZRiuv/JEiLUTsQAkSTHDg==", "dev": true, "requires": { - "aws-sdk": "^2.490.0", - "chalk": "^2.4.1" + "archiver": "^3.1.1", + "s3-files": "^2.0.0" } }, - "serverless-jetpack": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/serverless-jetpack/-/serverless-jetpack-0.10.6.tgz", - "integrity": "sha512-91+vrX36nKTalSEEhq4bpLYEQNsiVgP0SOvKE5g1QLMnLfBeVJVvUXsBzRLyVCnxMF3S2vqszpkq/eql9JomrQ==", + "s3rver": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/s3rver/-/s3rver-3.6.1.tgz", + "integrity": "sha512-8PI1yIUJ6WQbDYjidZo/EOknMRxos3uukM1a70VQE2lqzH9A8FUTOhlUGaRiAU/K0teROou1mesUsfrYwpwkCw==", "dev": true, "requires": { - "archiver": "^3.1.1", - "globby": "^9.2.0", - "inspectdep": "^0.2.0", - "jest-worker": "^25.5.0", - "make-dir": "^3.0.2", - "nanomatch": "^1.2.13", - "p-limit": "^2.3.0", - "trace-deps": "^0.3.3" + "@koa/router": "^9.0.0", + "busboy": "^0.3.1", + "commander": "^5.0.0", + "fast-xml-parser": "^3.12.19", + "fs-extra": "^8.0.0", + "he": "^1.2.0", + "koa": "^2.7.0", + "koa-logger": "^3.2.0", + "lodash": "^4.17.5", + "statuses": "^2.0.0", + "winston": "^3.0.0" }, "dependencies": { - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", "dev": true }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "dev": true, - "requires": { - "path-type": "^3.0.0" - } - }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - } - }, - "globby": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", - "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^1.0.2", - "dir-glob": "^2.2.2", - "fast-glob": "^2.2.6", - "glob": "^7.1.3", - "ignore": "^4.0.3", - "pify": "^4.0.1", - "slash": "^2.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "dev": true }, - "jest-worker": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz", - "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.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" - } - }, - "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-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", "dev": true }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "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": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "statuses": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.0.tgz", + "integrity": "sha512-w9jNUUQdpuVoYqXxnyOakhckBbOxRaoYqJscyIBYCS5ixyCnO7nQn7zBZvP9zf5QOPZcz2DLUpE3KsNPbJBOFA==", "dev": true }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "winston": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.1.tgz", + "integrity": "sha512-ijjJtGl8tqQzftLysZn0jQBwa1VjyIrgysvk9tJJczk88oXmXZ5z6CvSFcQ69FfXONINxgIVfx3lqwjK57Hfsg==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "async": "^3.1.0", + "diagnostics": "github:DABH/diagnostics#master", + "is-stream": "^2.0.0", + "logform": "^2.2.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.4.0" } } } }, - "serverless-latest-layer-version": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/serverless-latest-layer-version/-/serverless-latest-layer-version-2.1.0.tgz", - "integrity": "sha512-KuczOWVuyzM7urhfSdiWknsInwHaZWNrGUVGRvb66G/EPMEsjWJuLq/RsGcYsT7fmbBglzO4DY+EIuPq9/fRfg==", + "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 + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "aws-sdk": "^2.591.0", - "traverse": "^0.6.6" + "ret": "~0.1.10" } }, - "serverless-log-forwarding": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/serverless-log-forwarding/-/serverless-log-forwarding-1.4.0.tgz", - "integrity": "sha512-+LBfP1JmDM+MIWVlFJ6JMU6c/TIL7Ukh75aWe32/a7k65032DrjCb/ZVkN+C7ncEP2o8d3FVf1iSerywaU/jeQ==", + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + } + } + }, + "sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dev": true, + "requires": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "sass": { + "version": "1.26.8", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.8.tgz", + "integrity": "sha512-yvtzyrKLGiXQu7H12ekXqsfoGT/aTKeMDyVzCB675k1HYuaj0py63i8Uf4SI9CHXj6apDhpfwbUr3gGOjdpu2Q==", "dev": true, "requires": { - "underscore": "^1.8.3" + "chokidar": ">=2.0.0 <4.0.0" } }, - "serverless-offline": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/serverless-offline/-/serverless-offline-5.12.1.tgz", - "integrity": "sha512-OXgfXWZM8RxXie1NXNvjQk7TpM3KI/lyJd4pmakcL7XNZADCd1ph5yOvVdDlJAZgmrkaq2tzSG8ZaKDE66JTmg==", + "sass-graph": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", + "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", "dev": true, "requires": { - "@hapi/boom": "^7.4.11", - "@hapi/h2o2": "^8.3.2", - "@hapi/hapi": "^18.4.0", - "cuid": "^2.1.6", - "hapi-plugin-websocket": "^2.1.2", - "js-string-escape": "^1.0.1", - "jsonpath-plus": "^1.1.0", - "jsonwebtoken": "^8.5.1", - "luxon": "^1.21.3", - "object.fromentries": "^2.0.1", - "semver": "^6.2.0", - "trim-newlines": "^3.0.0", - "update-notifier": "^3.0.1", - "velocityjs": "^1.1.5" + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^13.3.2" }, "dependencies": { "ansi-regex": { @@ -25832,139 +21442,60 @@ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, - "boxen": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-3.2.0.tgz", - "integrity": "sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^2.4.2", - "cli-boxes": "^2.2.0", - "string-width": "^3.0.0", - "term-size": "^1.2.0", - "type-fest": "^0.3.0", - "widest-line": "^2.0.0" - } - }, - "configstore": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", - "integrity": "sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==", + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "locate-path": "^3.0.0" } }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", - "dev": true - }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { - "is-obj": "^1.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "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": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "p-try": "^2.0.0" } }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, - "is-npm": { + "p-locate": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-3.0.0.tgz", - "integrity": "sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA==", - "dev": true - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "pify": "^3.0.0" + "p-limit": "^2.0.0" } }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "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 }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "dev": true, - "requires": { - "semver": "^5.0.3" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -25985,195 +21516,159 @@ "ansi-regex": "^4.1.0" } }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "dev": true, - "requires": { - "execa": "^0.7.0" - } - }, - "trim-newlines": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", - "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", - "dev": true - }, - "type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", - "dev": true - }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "dev": true, - "requires": { - "crypto-random-string": "^1.0.0" - } - }, - "update-notifier": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-3.0.1.tgz", - "integrity": "sha512-grrmrB6Zb8DUiyDIaeRTBCkgISYUgETNe7NglEbVsrLWXeESnlCSP50WfRSj/GmzMPl6Uchj24S/p80nP/ZQrQ==", - "dev": true, - "requires": { - "boxen": "^3.0.0", - "chalk": "^2.0.1", - "configstore": "^4.0.0", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.1.0", - "is-npm": "^3.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { - "isexe": "^2.0.0" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" } }, - "widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { - "string-width": "^2.1.1" - }, - "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 - }, - "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" - } - } + "cliui": "^5.0.0", + "find-up": "^3.0.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": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" } }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + } + } + }, + "sass-lookup": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/sass-lookup/-/sass-lookup-3.0.0.tgz", + "integrity": "sha512-TTsus8CfFRn1N44bvdEai1no6PqdmDiQUiqW5DlpmtT+tYnIt1tXtDIph5KA1efC+LmioJXSnCtUVpcK9gaKIg==", + "dev": true, + "requires": { + "commander": "^2.16.0" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true } } }, - "serverless-offline-dynamodb-streams": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/serverless-offline-dynamodb-streams/-/serverless-offline-dynamodb-streams-3.0.2.tgz", - "integrity": "sha512-6YVADdUfwB1I9B7H0jML8tgOT/mxJ3ELVByCVxzM0/eo4p3QwfQakAWiNJULbfHe+yWUJhMEHdsaqLQSwy73dQ==", + "sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", + "dev": true + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", "dev": true, "requires": { - "aws-sdk": "^2.642.0", - "dynamodb-streams-readable": "^1.0.5", - "figures": "^3.2.0", - "lodash": "^4.17.15" + "xmlchars": "^2.2.0" + } + }, + "scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" }, "dependencies": { - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5" + "amdefine": ">=0.0.4" } } } }, - "serverless-plugin-aws-alerts": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/serverless-plugin-aws-alerts/-/serverless-plugin-aws-alerts-1.5.2.tgz", - "integrity": "sha512-ZQ4adV2r9pSX0ARcvLO2bXr0Ql359lYW8w/a0FmmtynjwhYrEw1jhlYQhToZQ/ruS4OrOsRGEvyuf58aTZhhkQ==", - "dev": true, - "requires": { - "lodash": "^4.17.10" - } - }, - "serverless-plugin-git-variables": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serverless-plugin-git-variables/-/serverless-plugin-git-variables-4.0.0.tgz", - "integrity": "sha512-r7MMsnfzvZ0sMfaFAz8GXUml/uZhZU87TlS5+exHIjqlLVVTBe4GK+/cxJzET2UnPwcaA1O1fs/deMV37G7lIw==", + "seek-bzip": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", + "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", "dev": true, "requires": { - "babel-runtime": "6.23.0" + "commander": "~2.8.1" }, "dependencies": { - "babel-runtime": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", "dev": true, "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.10.0" + "graceful-readlink": ">= 1.0.0" } - }, - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true } } }, - "serverless-plugin-split-stacks": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/serverless-plugin-split-stacks/-/serverless-plugin-split-stacks-1.9.3.tgz", - "integrity": "sha512-ZSPekmIZzN7aWVKSI3PRrVgxf7qLkczHTBUZdb68OzQbaahPga8HFAwpeFvhjMWuxU3YQX/OZSQHZJkUCWnXOw==", + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", "dev": true, "requires": { - "aws-info": "^1.0.0", - "lodash": "^4.17.15", - "semver": "^6.3.0", - "throat": "^5.0.0" + "semver": "^6.3.0" }, "dependencies": { "semver": { @@ -26184,58 +21679,75 @@ } } }, - "serverless-plugin-tracing": { + "semver-regex": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/serverless-plugin-tracing/-/serverless-plugin-tracing-2.0.0.tgz", - "integrity": "sha1-32uLMWasm7cKN8f8h1AUsjaRWPY=", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", "dev": true }, - "serverless-plugin-warmup": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/serverless-plugin-warmup/-/serverless-plugin-warmup-4.9.0.tgz", - "integrity": "sha512-o6u0Wovyjm1tJNsa38oHOKEjmjBdhie8sCIlCCUAtHZza7L7y9WgtHTFqK6QGTl7O6sbw98vB8z4pNsSQGH6YA==", + "semver-truncate": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.2.tgz", + "integrity": "sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g=", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", "dev": true, "requires": { - "fs-extra": "^9.0.0" + "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" }, "dependencies": { - "fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" - } - }, - "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" - } - }, - "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "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==", "dev": true } } }, - "serverless-prune-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/serverless-prune-plugin/-/serverless-prune-plugin-1.4.3.tgz", - "integrity": "sha512-gsZF3oLs5rFdp6ynjiWf5cuXZ4DZrAhxRd5Zf2gfH/43kPqtZMZzUqcGYbHh1OXbOzogdn8fEg5d4Q3xxWwRBA==", + "serialize-javascript": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serialize-to-js": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/serialize-to-js/-/serialize-to-js-3.1.1.tgz", + "integrity": "sha512-F+NGU0UHMBO4Q965tjw7rvieNVjlH6Lqi2emq/Lc9LUURYJbiCzmpi4Cy1OOjjVPtxu0c+NE85LU6968Wko5ZA==", + "dev": true + }, + "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==", "dev": true, "requires": { - "bluebird": "^3.4.7" + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" } }, "set-blocking": { @@ -26244,12 +21756,6 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -26341,15 +21847,6 @@ "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==", "dev": true }, - "shortid": { - "version": "2.2.15", - "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.15.tgz", - "integrity": "sha512-5EaCy2mx2Jgc/Fdn9uuDuNIIfWBpzY4XIlhoqtXF6qsf+/+SGZ+FxDdX/ZsMZiWupIWNqAEmiNY4RC+LSmCeOw==", - "dev": true, - "requires": { - "nanoid": "^2.1.0" - } - }, "side-channel": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz", @@ -26366,32 +21863,6 @@ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, - "simple-git": { - "version": "1.132.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.132.0.tgz", - "integrity": "sha512-xauHm1YqCTom1sC9eOjfq3/9RKiUA9iPnxBbrY2DdL8l4ADMu0jjM5l5lphQP5YWNqAL2aXC/OeuQ76vHtW5fg==", - "dev": true, - "requires": { - "debug": "^4.0.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "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 - } - } - }, "simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -26566,112 +22037,6 @@ } } }, - "socket.io-client": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", - "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", - "dev": true, - "requires": { - "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "engine.io-client": "~3.4.0", - "has-binary2": "~1.0.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "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 - } - } - }, - "socket.io-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", - "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "debug": "~3.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } - } - }, - "socket.io-stream": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/socket.io-stream/-/socket.io-stream-0.9.1.tgz", - "integrity": "sha1-QhJYMWKIuDrGk7DUPv0J1tQ6upc=", - "dev": true, - "requires": { - "component-bind": "~1.0.0", - "debug": "~2.2.0" - }, - "dependencies": { - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - } - } - }, "sort-keys": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", @@ -26792,43 +22157,12 @@ "extend-shallow": "^3.0.0" } }, - "split2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.1.1.tgz", - "integrity": "sha512-emNzr1s7ruq4N+1993yht631/JH+jaj0NYBosuKmLcq+JkGQ9MmTw1RB1fGaTCzUuseRIClrlSLHRNYGwWQ58Q==", - "dev": true, - "requires": { - "readable-stream": "^3.0.0" - }, - "dependencies": { - "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" - } - } - } - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "sprintf-kit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sprintf-kit/-/sprintf-kit-2.0.0.tgz", - "integrity": "sha512-/0d2YTn8ZFVpIPAU230S9ZLF8WDkSSRWvh/UOLM7zzvkCchum1TtouRgyV8OfgOaYilSGU4lSSqzwBXJVlAwUw==", - "dev": true, - "requires": { - "es5-ext": "^0.10.46" - } - }, "squeak": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/squeak/-/squeak-1.3.0.tgz", @@ -27145,44 +22479,12 @@ "xtend": "^4.0.0" } }, - "stream-promise": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/stream-promise/-/stream-promise-3.2.0.tgz", - "integrity": "sha512-P+7muTGs2C8yRcgJw/PPt61q7O517tDHiwYEzMWo1GSBCcZedUMT/clz7vUNsSxFphIlJ6QUL4GexQKlfJoVtA==", - "dev": true, - "requires": { - "2-thenable": "^1.0.0", - "es5-ext": "^0.10.49", - "is-stream": "^1.1.0" - } - }, "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 }, - "stream.finished": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stream.finished/-/stream.finished-1.2.0.tgz", - "integrity": "sha512-xSp45f/glqd035qAtFUxAGvhotjY/EfqDNV+rQW8o7ffligiOjPaguTEvRzeQAhiQMCdkPEBrp5++S/rQyavWQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "stream.pipeline-shim": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stream.pipeline-shim/-/stream.pipeline-shim-1.1.0.tgz", - "integrity": "sha512-pSi/SZZDbSA5l3YYjSmJadCoD74/qSe79r9ZVR21lD4bpf+khn5Umi6AlfJrD8I0KQfGSqm/7Yp48dmithM+Vw==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1", - "stream.finished": "^1.2.0" - } - }, "streamsearch": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", @@ -27442,16 +22744,16 @@ } }, "stylelint": { - "version": "13.6.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.6.0.tgz", - "integrity": "sha512-55gG2pNjVr183JJM/tlr3KAua6vTVX7Ho/lgKKuCIWszTZ1gmrXjX4Wok53SI8wRYFPbwKAcJGULQ77OJxTcNw==", + "version": "13.6.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.6.1.tgz", + "integrity": "sha512-XyvKyNE7eyrqkuZ85Citd/Uv3ljGiuYHC6UiztTR6sWS9rza8j3UeQv/eGcQS9NZz/imiC4GKdk1EVL3wst5vw==", "dev": true, "requires": { "@stylelint/postcss-css-in-js": "^0.37.1", "@stylelint/postcss-markdown": "^0.36.1", "autoprefixer": "^9.8.0", "balanced-match": "^1.0.0", - "chalk": "^4.0.0", + "chalk": "^4.1.0", "cosmiconfig": "^6.0.0", "debug": "^4.1.1", "execall": "^2.0.0", @@ -27581,6 +22883,12 @@ "ms": "^2.1.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 + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -27958,52 +23266,6 @@ "postcss": "^7.0.2" } }, - "superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", - "dev": true, - "requires": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "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 - } - } - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -28206,12 +23468,6 @@ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, "slice-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", @@ -28245,134 +23501,6 @@ } } }, - "tabtab": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tabtab/-/tabtab-3.0.2.tgz", - "integrity": "sha512-jANKmUe0sIQc/zTALTBy186PoM/k6aPrh3A7p6AaAfF6WPSbTx1JYeGIGH162btpH+mmVEXln+UxwViZHO2Jhg==", - "dev": true, - "requires": { - "debug": "^4.0.1", - "es6-promisify": "^6.0.0", - "inquirer": "^6.0.0", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "untildify": "^3.0.3" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "es6-promisify": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.1.1.tgz", - "integrity": "sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg==", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "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 - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "untildify": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", - "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==", - "dev": true - } - } - }, "taffydb": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", @@ -28683,12 +23811,6 @@ "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", "dev": true }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -28762,9 +23884,9 @@ "dev": true }, "token-stream": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz", - "integrity": "sha1-zu78cXp2xDFvEm0LnbqlXX598Bo=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", + "integrity": "sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ=", "dev": true }, "touch": { @@ -28822,16 +23944,6 @@ } } }, - "trace-deps": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/trace-deps/-/trace-deps-0.3.3.tgz", - "integrity": "sha512-aNpC9Bd8UYuaVlo5sXSJboveHUVmeWk9/0ak/usg/eOUSt1Mj0xjLQFJ7QStBqezf0PHQi48mNTua64PS6ve7w==", - "dev": true, - "requires": { - "acorn-node": "^2.0.0", - "resolve": "^1.15.1" - } - }, "traverse": { "version": "0.6.6", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", @@ -28926,7 +24038,21 @@ "dev": true, "requires": { "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + } } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true } } }, @@ -29036,61 +24162,6 @@ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", "dev": true }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, "ultron": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", @@ -29583,12 +24654,6 @@ "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", "dev": true }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", - "dev": true - }, "upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", @@ -29716,12 +24781,6 @@ } } }, - "urijs": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.2.tgz", - "integrity": "sha512-s/UIq9ap4JPZ7H1EB5ULo/aOUbWqfDi7FKzMC2Nz+0Si8GiT1rIEaprt8hy3Vy2Ex2aJPpOQv4P4DuOZ+K1c6w==", - "dev": true - }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -29763,15 +24822,6 @@ "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", "dev": true }, - "urlencode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/urlencode/-/urlencode-1.1.0.tgz", - "integrity": "sha1-HyuibwE8hfATP3o61v8nMK33y7c=", - "dev": true, - "requires": { - "iconv-lite": "~0.4.11" - } - }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -29779,12 +24829,12 @@ "dev": true }, "uswds": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/uswds/-/uswds-2.7.0.tgz", - "integrity": "sha512-1NJJFg5PzPHWt/s7lHGzU1ox4xEA4+Njs/2h2xWHDscA3THvm+vMCvpnrKP1M9yzdXNd3Rb/G5se0w+2n69XkQ==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/uswds/-/uswds-2.7.1.tgz", + "integrity": "sha512-RzczCK4TfnJud6WFj7pV6er5BQ0qQviM/GZgyDkYT6ZvOIXR0khbk7WZR72a+vy75fEiAzJut4N/x5/UZq0ZrA==", "dev": true, "requires": { - "@types/node": "^13.9.1", + "@types/node": "^13.13.12", "classlist-polyfill": "^1.0.3", "del": "^5.1.0", "domready": "^1.0.8", @@ -29811,12 +24861,6 @@ } } }, - "utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", - "dev": true - }, "utf8-byte-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", @@ -29917,12 +24961,6 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, - "velocityjs": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/velocityjs/-/velocityjs-1.1.5.tgz", - "integrity": "sha512-U4ANK4MRYSczVZjOp9FkAQoPO9geKSy3CWrBShPxMoWyqDox8SW8AZYiKtlCrV21ucONUtlU0iF3+KKK9AGoyA==", - "dev": true - }, "vendors": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", @@ -29996,9 +25034,9 @@ "dev": true }, "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha1-YU9/v42AHwu18GYfWy9XhXUOTwk=", "dev": true }, "w3c-hr-time": { @@ -30283,24 +25321,6 @@ "yaeti": "^0.0.6" } }, - "websocket-framed": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/websocket-framed/-/websocket-framed-1.2.2.tgz", - "integrity": "sha512-7EeuDADPk6SLmpBiSnxg7P/ZxFKb7WOjpA+pvcsnKLwTGzJO1aob+gxUXETW93cozUIOUPGS6+rgaClAjig1qQ==", - "dev": true, - "requires": { - "encodr": "1.2.2", - "eventemitter3": "4.0.0" - }, - "dependencies": { - "eventemitter3": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", - "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", - "dev": true - } - } - }, "whatwg-encoding": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", @@ -30392,6 +25412,12 @@ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "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", @@ -30420,16 +25446,10 @@ } } }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true - }, "winston": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.4.tgz", - "integrity": "sha512-NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q==", + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.5.tgz", + "integrity": "sha512-TWoamHt5yYvsMarGlGEQE59SbJHqGsZV8/lwC+iCcGeAe0vUaOh+Lv6SYM17ouzC/a/LB1/hz/7sxFBtlu1l4A==", "dev": true, "requires": { "async": "~1.0.0", @@ -30449,48 +25469,25 @@ } }, "winston-transport": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.3.0.tgz", - "integrity": "sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", + "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", "dev": true, "requires": { - "readable-stream": "^2.3.6", + "readable-stream": "^2.3.7", "triple-beam": "^1.2.0" } }, "with": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz", - "integrity": "sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", + "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", "dev": true, "requires": { - "acorn": "^3.1.0", - "acorn-globals": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - }, - "acorn-globals": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", - "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", - "dev": true, - "requires": { - "acorn": "^4.0.4" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } - } - } + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "assert-never": "^1.2.1", + "babel-walk": "3.0.0-canary-5" } }, "word-wrap": { @@ -30629,12 +25626,6 @@ "integrity": "sha512-HgS+X6zAztGa9zIK3Y3LXuJes33Lz9x+YyTxgrkIdabu2vqcGOWwdfCpf1hWLRrd553wd4QCDf6BBO6FfdsRiQ==", "dev": true }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", - "dev": true - }, "xregexp": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz", @@ -30674,12 +25665,6 @@ "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", "dev": true }, - "yaml-ast-parser": { - "version": "0.0.43", - "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", - "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", - "dev": true - }, "yargs": { "version": "15.3.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", @@ -30705,6 +25690,12 @@ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -30802,12 +25793,6 @@ "fd-slicer": "~1.1.0" } }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true - }, "ylru": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz", diff --git a/package.json b/package.json index c3cb4d39b27..f9d9d556aa4 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "@hapi/joi-date": "^2.0.1", "archiver": "3.1.1", "autoprefixer": "^9.8.0", - "aws-sdk": "^2.698.0", + "aws-sdk": "^2.702.0", "aws-sdk-mock": "^5.0.0", "aws-serverless-express": "^3.3.8", "aws-xray-sdk": "^2.5.0", @@ -49,7 +49,7 @@ "eslint-plugin-cypress": "^2.11.1", "eslint-plugin-import": "^2.21.2", "eslint-plugin-jest": "^23.13.2", - "eslint-plugin-jsdoc": "^25.4.3", + "eslint-plugin-jsdoc": "^28.0.0", "eslint-plugin-jsx-a11y": "^6.2.3", "eslint-plugin-prettier": "^3.1.4", "eslint-plugin-promise": "^4.2.1", @@ -59,7 +59,7 @@ "eslint-plugin-sort-imports-es6-autofix": "^0.5.0", "eslint-plugin-sort-keys-fix": "^1.1.0", "eslint-plugin-sort-requires": "^2.1.0", - "eslint-plugin-spellcheck": "0.0.16", + "eslint-plugin-spellcheck": "^0.0.17", "esm": "^3.2.25", "express": "^4.17.1", "faker": "^4.1.0", @@ -72,7 +72,7 @@ "husky": "^4.2.5", "i": "^0.3.6", "imagemin": "^7.0.1", - "imagemin-pngquant": "^8.0.0", + "imagemin-pngquant": "^9.0.0", "is-reachable": "^4.0.0", "isomorphic-fetch": "^2.2.1", "jest": "^26.0.1", @@ -102,7 +102,7 @@ "pngjs": "^5.0.0", "prettier": "^2.0.4", "prop-types": "^15.7.2", - "pug": "^2.0.3", + "pug": "^3.0.0", "puppeteer": "1.20.0", "puppeteer-core": "1.20.0", "qs": "^6.9.2", @@ -124,19 +124,6 @@ "s3rver": "^3.6.1", "sanitize-filename": "^1.6.3", "sass": "^1.26.8", - "serverless": "1.70.1", - "serverless-domain-manager": "^4.1.1", - "serverless-jetpack": "^0.10.4", - "serverless-latest-layer-version": "^2.1.0", - "serverless-log-forwarding": "^1.4.0", - "serverless-offline": "^5.12.1", - "serverless-offline-dynamodb-streams": "^3.0.2", - "serverless-plugin-aws-alerts": "^1.5.2", - "serverless-plugin-git-variables": "^4.0.0", - "serverless-plugin-split-stacks": "^1.9.3", - "serverless-plugin-tracing": "^2.0.0", - "serverless-plugin-warmup": "^4.9.0", - "serverless-prune-plugin": "^1.4.3", "stylelint": "^13.6.0", "stylelint-config-idiomatic-order": "^8.1.0", "stylelint-config-standard": "^20.0.0", @@ -166,27 +153,7 @@ ] }, "scripts": { - "build:_api": "parcel build --no-minify --no-source-maps --bundle-node-modules --target node", - "build:all": "npm run clean && npm run build:assets && npm run build:_api -- web-api/src/*Handlers.js && mkdir -p web-api/dist && cp web-api/src/*Handlers.js web-api/dist/ && npm run build:client", - "build:api:case:deadlines": "npm run build:_api -- web-api/src/caseDeadlinesHandlers.js", - "build:api:case:documents": "npm run build:_api -- web-api/src/caseDocumentsHandlers.js", - "build:api:case:meta": "npm run build:_api -- web-api/src/caseMetaHandlers.js", - "build:api:case:notes": "npm run build:_api -- web-api/src/caseNotesHandlers.js", - "build:api:case:parties": "npm run build:_api -- web-api/src/casePartiesHandlers.js", - "build:api:cases": "npm run build:_api -- web-api/src/casesHandlers.js", - "build:api:documents": "npm run build:_api -- web-api/src/documentsHandlers.js", - "build:api:messages": "npm run build:_api -- web-api/src/messagesHandlers.js", - "build:api:migrate": "npm run build:_api -- web-api/src/migrateHandlers.js", - "build:api:notifications": "npm run build:_api -- web-api/src/notificationHandlers.js", - "build:api:practitioners": "npm run build:_api -- web-api/src/practitionersHandlers.js", - "build:api:public": "npm run build:_api -- web-api/src/publicApiHandlers.js", - "build:api:reports": "npm run build:_api -- web-api/src/reportsHandlers.js", - "build:api:sections": "npm run build:_api -- web-api/src/sectionsHandlers.js", - "build:api:streams": "npm run build:_api -- web-api/src/streamsHandlers.js", - "build:api:trialSessions": "npm run build:_api -- web-api/src/trialSessionsHandlers.js", - "build:api:users": "npm run build:_api -- web-api/src/usersHandlers.js", - "build:api:workItems": "npm run build:_api -- web-api/src/workItemsHandlers.js", - "build:api": "npm run build:_api -- web-api/src/apiHandlers.js", + "build:all": "npm run clean && npm run build:assets && npm run build:client", "build:assets": "node shared/createModule.js", "build:client": "USTC_ENV=prod parcel build --no-source-maps web-client/src/index.pug", "build:entity:docs": "node shared/src/tools/generateMarkdownSchema.js", @@ -214,9 +181,8 @@ "lint:js:fix:plain": "npm run lint:js:fix -- --rule 'prettier/prettier: 0'", "lint:js:fix": "npm run lint:js -- --fix", "lint:js": "TIMING=1 eslint --ext .js,.jsx shared/src/ web-api/storage/ web-api/src/ web-client/src/ web-client/integration-tests/", - "lint:serverless": "node ./validateServerless.js", "lint:swagger": "swagger-cli validate web-api/swagger.json", - "lint": "npx run-p lint:swagger lint:css lint:js lint:serverless", + "lint": "npx run-p lint:swagger lint:css lint:js", "loadtest:high": "./web-api/load-test-trial-session.sh dev us-east-1 150", "loadtest:medium": "./web-api/load-test-trial-session.sh dev us-east-1 125", "loadtest:practitioners": "./web-api/load-test-practitioners.sh dev us-east-1 200", diff --git a/run-local.sh b/run-local.sh index e5d90a12541..2039d2d0b53 100755 --- a/run-local.sh +++ b/run-local.sh @@ -56,34 +56,11 @@ if [[ -z "${RUN_DIR}" ]]; then RUN_DIR="src" fi -# set common arguments used by sls below (appearing as "$@") -set -- \ - --accountId noop \ - --domain noop \ - --efcmsTableName=efcms-local \ - --noAuth \ - --noTimeout \ - --region us-east-1 \ - --run_dir "${RUN_DIR}" \ - --skipCacheInvalidation "${SKIP_CACHE_INVALIDATION}" \ - --stage local \ - --stageColor "blue" \ - --dynamo_stream_arn "arn:aws:dynamodb:ddblocal:000000000000:table/efcms-local/stream/*" \ - --circleHoneybadgerApiKey noop \ - --elasticsearch_endpoint "http://localhost:9200" - -echo "starting notifications service" -npx sls offline start "$@" --config web-api/serverless-notifications.yml & - -echo "starting proxy" -node ./web-api/proxy.js & - nodemon -e js --ignore web-client/ --ignore dist/ --exec "node -r esm web-api/streams-local.js" & +nodemon -e js --ignore web-client/ --ignore dist/ --exec "node -r esm web-api/websockets-local.js" & nodemon -e js --ignore web-client/ --ignore dist/ --exec "node -r esm web-api/src/app-local.js" & nodemon -e js --ignore web-client/ --ignore dist/ --exec "node -r esm web-api/src/app-public-local.js" -echo "proxy stopped" - if [ ! -e "$CIRCLECI" ]; then echo "killing dynamodb local" pkill -P $DYNAMO_PID diff --git a/shared/src/business/entities/CaseAssociationRequestFactory.js b/shared/src/business/entities/CaseAssociationRequestFactory.js index 0beaf62c778..e8972bc4e1d 100644 --- a/shared/src/business/entities/CaseAssociationRequestFactory.js +++ b/shared/src/business/entities/CaseAssociationRequestFactory.js @@ -1,4 +1,10 @@ const joi = require('@hapi/joi'); +const { + ALL_DOCUMENT_TYPES, + ALL_EVENT_CODES, + OBJECTIONS_OPTIONS, + SCENARIOS, +} = require('./EntityConstants'); const { joiValidationDecorator, } = require('../../utilities/JoiValidationDecorator'); @@ -6,7 +12,6 @@ const { SupportingDocumentInformationFactory, } = require('./externalDocument/SupportingDocumentInformationFactory'); const { getTimestampSchema } = require('../../utilities/dateSchema'); -const { OBJECTIONS_OPTIONS, SCENARIOS } = require('./EntityConstants'); const { replaceBracketed } = require('../utilities/replaceBracketed'); const joiStrictTimestamp = getTimestampSchema(); const { @@ -121,8 +126,14 @@ function CaseAssociationRequestFactory(rawProps) { certificateOfService: joi.boolean().required(), documentTitle: joi.string().max(500).optional(), documentTitleTemplate: joi.string().max(500).required(), - documentType: joi.string().max(500).required(), - eventCode: joi.string().max(500).required(), + documentType: joi + .string() + .valid(...ALL_DOCUMENT_TYPES) + .required(), + eventCode: joi + .string() + .valid(...ALL_EVENT_CODES) + .required(), partyIrsPractitioner: joi.boolean().optional(), partyPrivatePractitioner: joi.boolean().optional(), primaryDocumentFile: joi.object().required(), // TODO: object definition diff --git a/shared/src/business/entities/CaseAssociationRequestFactory.test.js b/shared/src/business/entities/CaseAssociationRequestFactory.test.js index b9d55997e36..2429903f2c2 100644 --- a/shared/src/business/entities/CaseAssociationRequestFactory.test.js +++ b/shared/src/business/entities/CaseAssociationRequestFactory.test.js @@ -54,7 +54,7 @@ describe('CaseAssociationRequestFactory', () => { it('should require event code', () => { expect(errors().eventCode).toEqual(VALIDATION_ERROR_MESSAGES.eventCode); - rawEntity.eventCode = '345'; + rawEntity.eventCode = 'P'; expect(errors().eventCode).toEqual(undefined); }); diff --git a/shared/src/business/entities/CaseMessage.js b/shared/src/business/entities/CaseMessage.js index 9900babb342..7ed0739b5c7 100644 --- a/shared/src/business/entities/CaseMessage.js +++ b/shared/src/business/entities/CaseMessage.js @@ -27,6 +27,11 @@ function CaseMessage(rawMessage, { applicationContext }) { this.caseId = rawMessage.caseId; this.caseStatus = rawMessage.caseStatus; this.caseTitle = rawMessage.caseTitle; + this.completedAt = rawMessage.completedAt; + this.completedBy = rawMessage.completedBy; + this.completedBySection = rawMessage.completedBySection; + this.completedByUserId = rawMessage.completedByUserId; + this.completedMessage = rawMessage.completedMessage; this.createdAt = rawMessage.createdAt || createISODateString(); this.docketNumber = rawMessage.docketNumber; this.docketNumberWithSuffix = rawMessage.docketNumberWithSuffix; @@ -34,8 +39,11 @@ function CaseMessage(rawMessage, { applicationContext }) { this.from = rawMessage.from; this.fromSection = rawMessage.fromSection; this.fromUserId = rawMessage.fromUserId; + this.isCompleted = rawMessage.isCompleted || false; + this.isRepliedTo = rawMessage.isRepliedTo || false; this.message = rawMessage.message; this.messageId = rawMessage.messageId || applicationContext.getUniqueId(); + this.parentMessageId = rawMessage.parentMessageId || this.messageId; this.subject = rawMessage.subject; this.to = rawMessage.to; this.toSection = rawMessage.toSection; @@ -66,12 +74,54 @@ CaseMessage.VALIDATION_RULES = { caseStatus: joi .string() .valid(...Object.values(CASE_STATUS_TYPES)) - .optional() + .required() .description('The status of the associated case.'), caseTitle: joi .string() - .optional() + .required() .description('The case title for the associated cases.'), + completedAt: joiStrictTimestamp + .when('isCompleted', { + is: true, + otherwise: joi.optional().allow(null), + then: joi.required(), + }) + .description('When the message was marked as completed.'), + completedBy: joi + .string() + .max(500) + .when('isCompleted', { + is: true, + otherwise: joi.optional().allow(null), + then: joi.required(), + }) + .description('The name of the user who completed the message thread'), + completedBySection: joi + .string() + .valid(...SECTIONS, ...CHAMBERS_SECTIONS) + .when('isCompleted', { + is: true, + otherwise: joi.optional().allow(null), + then: joi.required(), + }) + .description('The section of the user who completed the message thread'), + completedByUserId: joi + .string() + .uuid({ + version: ['uuidv4'], + }) + .when('isCompleted', { + is: true, + otherwise: joi.optional().allow(null), + then: joi.required(), + }) + .description('The ID of the user who completed the message thread'), + completedMessage: joi + .string() + .max(500) + .allow(null) + .optional() + .description('The message entered when completing the message thread.'), createdAt: joiStrictTimestamp .required() .description('When the message was created.'), @@ -100,6 +150,14 @@ CaseMessage.VALIDATION_RULES = { }) .required() .description('The ID of the user who sent the message.'), + isCompleted: joi + .boolean() + .required() + .description('Whether the message thread has been completed.'), + isRepliedTo: joi + .boolean() + .required() + .description('Whether the message has been replied to or forwarded.'), message: joi.string().max(500).required().description('The message text.'), messageId: joi .string() @@ -110,6 +168,11 @@ CaseMessage.VALIDATION_RULES = { .description( 'A unique ID generated by the system to represent the message.', ), + parentMessageId: joi + .string() + .uuid({ version: ['uuidv4'] }) + .required() + .description('The ID of the initial message in the thread.'), subject: joi .string() .max(250) @@ -144,4 +207,15 @@ joiValidationDecorator( CaseMessage.VALIDATION_ERROR_MESSAGES, ); +CaseMessage.prototype.markAsCompleted = function ({ message, user }) { + this.isCompleted = true; + this.completedAt = createISODateString(); + this.completedBy = user.name; + this.completedByUserId = user.userId; + this.completedBySection = user.section; + this.completedMessage = message; + + return this; +}; + module.exports = { CaseMessage }; diff --git a/shared/src/business/entities/CaseMessage.test.js b/shared/src/business/entities/CaseMessage.test.js index c6f1a9ce7a2..8c56c97b713 100644 --- a/shared/src/business/entities/CaseMessage.test.js +++ b/shared/src/business/entities/CaseMessage.test.js @@ -43,5 +43,79 @@ describe('CaseMessage', () => { ); expect(message.isValid()).toBeFalsy(); }); + + it('creates an invalid CaseMessage with isCompleted true and without completedBy fields', () => { + const message = new CaseMessage( + { + caseId: '3079c990-cc6c-4b99-8fca-8e31f2d9e7a8', + caseStatus: 'General Docket - Not at Issue', + caseTitle: 'Test Petitioner', + createdAt: '2019-01-01T17:29:13.122Z', + docketNumber: '123-45', + docketNumberWithSuffix: '123-45S', + from: 'gg', + fromSection: 'petitions', + fromUserId: '6805d1ab-18d0-43ec-bafb-654e83405416', + isCompleted: true, + message: 'hello world', + subject: 'hey!', + to: 'bob', + toSection: 'petitions', + toUserId: '6805d1ab-18d0-43ec-bafb-654e83405416', + }, + { applicationContext }, + ); + expect(message.isValid()).toBeFalsy(); + expect(Object.keys(message.getFormattedValidationErrors())).toEqual([ + 'completedAt', + 'completedBy', + 'completedBySection', + 'completedByUserId', + ]); + }); + }); + + describe('markAsCompleted', () => { + it('should mark the message as completed with a message and user', () => { + const message = new CaseMessage( + { + caseId: '3079c990-cc6c-4b99-8fca-8e31f2d9e7a8', + caseStatus: 'General Docket - Not at Issue', + caseTitle: 'Test Petitioner', + createdAt: '2019-01-01T17:29:13.122Z', + docketNumber: '123-45', + docketNumberWithSuffix: '123-45S', + from: 'gg', + fromSection: 'petitions', + fromUserId: '6805d1ab-18d0-43ec-bafb-654e83405416', + message: 'hello world', + subject: 'hey!', + to: 'bob', + toSection: 'petitions', + toUserId: '6805d1ab-18d0-43ec-bafb-654e83405416', + }, + { applicationContext }, + ); + + message.markAsCompleted({ + message: 'the completed message', + user: { + name: 'Test Person', + section: 'petitions', + userId: 'f3cf18f9-f1b0-43f7-a4e0-d0e2658e1faa', + }, + }); + + expect(message.isValid()).toBeTruthy(); + expect(message).toMatchObject({ + completedBy: 'Test Person', + completedBySection: 'petitions', + completedByUserId: 'f3cf18f9-f1b0-43f7-a4e0-d0e2658e1faa', + completedMessage: 'the completed message', + createdAt: expect.anything(), + isCompleted: true, + }); + expect(1).toEqual(1); + }); }); }); diff --git a/shared/src/business/entities/DocketRecord.js b/shared/src/business/entities/DocketRecord.js index 90a3ae77d15..1165be19717 100644 --- a/shared/src/business/entities/DocketRecord.js +++ b/shared/src/business/entities/DocketRecord.js @@ -2,7 +2,7 @@ const joi = require('@hapi/joi'); const { joiValidationDecorator, } = require('../../utilities/JoiValidationDecorator'); -const { getAllEventCodes } = require('../../utilities/getAllEventCodes'); +const { ALL_EVENT_CODES } = require('./EntityConstants'); const { getTimestampSchema } = require('../../utilities/dateSchema'); const joiStrictTimestamp = getTimestampSchema(); @@ -75,7 +75,7 @@ joiValidationDecorator( entityName: joi.string().valid('DocketRecord').required(), eventCode: joi .string() - .valid(...getAllEventCodes()) + .valid(...ALL_EVENT_CODES) .required() .description( 'Code associated with the event that resulted in this item being added to the Docket Record.', diff --git a/shared/src/business/entities/Document.js b/shared/src/business/entities/Document.js index 20ddc1d4466..66c7b3862f0 100644 --- a/shared/src/business/entities/Document.js +++ b/shared/src/business/entities/Document.js @@ -1,17 +1,15 @@ const joi = require('@hapi/joi'); const { - COURT_ISSUED_EVENT_CODES, + ALL_DOCUMENT_TYPES, + ALL_EVENT_CODES, DOCKET_NUMBER_MATCHER, - DOCUMENT_CATEGORY_MAP, - DOCUMENT_INTERNAL_CATEGORY_MAP, + DOCUMENT_EXTERNAL_CATEGORIES_MAP, DOCUMENT_RELATIONSHIPS, - INITIAL_DOCUMENT_TYPES, OBJECTIONS_OPTIONS, + OPINION_DOCUMENT_TYPES, ORDER_TYPES, PRACTITIONER_ASSOCIATION_DOCUMENT_TYPES, SCENARIOS, - SIGNED_DOCUMENT_TYPES, - SYSTEM_GENERATED_DOCUMENT_TYPES, TRACKED_DOCUMENT_TYPES, } = require('./EntityConstants'); const { @@ -132,37 +130,6 @@ Document.isPendingOnCreation = rawDocument => { return isPending; }; -Document.getDocumentTypes = () => { - const allFilingEvents = flatten([ - ...Object.values(DOCUMENT_CATEGORY_MAP), - ...Object.values(DOCUMENT_INTERNAL_CATEGORY_MAP), - ]); - const filingEventTypes = allFilingEvents.map(t => t.documentType); - const orderDocTypes = ORDER_TYPES.map(t => t.documentType); - const courtIssuedDocTypes = COURT_ISSUED_EVENT_CODES.map(t => t.documentType); - const initialTypes = Object.keys(INITIAL_DOCUMENT_TYPES).map( - t => INITIAL_DOCUMENT_TYPES[t].documentType, - ); - const signedTypes = Object.keys(SIGNED_DOCUMENT_TYPES).map( - t => SIGNED_DOCUMENT_TYPES[t].documentType, - ); - const systemGeneratedTypes = Object.keys(SYSTEM_GENERATED_DOCUMENT_TYPES).map( - t => SYSTEM_GENERATED_DOCUMENT_TYPES[t].documentType, - ); - - const documentTypes = [ - ...initialTypes, - ...PRACTITIONER_ASSOCIATION_DOCUMENT_TYPES, - ...filingEventTypes, - ...orderDocTypes, - ...courtIssuedDocTypes, - ...signedTypes, - ...systemGeneratedTypes, - ]; - - return documentTypes; -}; - joiValidationDecorator( Document, joi.object().keys({ @@ -176,17 +143,15 @@ joiValidationDecorator( 'A document that was archived instead of added to the Docket Record.', ), certificateOfService: joi.boolean().optional(), - certificateOfServiceDate: joi.when('certificateOfService', { + certificateOfServiceDate: joiStrictTimestamp.when('certificateOfService', { is: true, - otherwise: joi.optional(), - then: joiStrictTimestamp.required(), + otherwise: joi.optional().allow(null), + then: joi.required(), }), createdAt: joiStrictTimestamp .required() .description('When the Document was added to the system.'), - date: joi - .date() - .iso() + date: joiStrictTimestamp .optional() .allow(null) .description( @@ -225,12 +190,17 @@ joiValidationDecorator( .description('The title of this document.'), documentType: joi .string() - .valid(...Document.getDocumentTypes()) + .valid(...ALL_DOCUMENT_TYPES) .required() .description('The type of this document.'), + // TODO - figure out if draft state being null/ not null relies on signature being present draftState: joi.object().allow(null).optional(), entityName: joi.string().valid('Document').required(), - eventCode: joi.string().optional(), + eventCode: joi + .string() + .valid(...ALL_EVENT_CODES) + .allow(null) + .optional(), filedBy: joi.string().max(500).allow('').optional(), filingDate: joiStrictTimestamp .max('now') @@ -244,8 +214,14 @@ joiValidationDecorator( judge: joi .string() .allow(null) - .optional() - .description('The judge associated with the document.'), + .description('The judge associated with the document.') + .when('documentType', { + is: joi + .string() + .valid(...OPINION_DOCUMENT_TYPES.map(t => t.documentType)), + otherwise: joi.optional(), + then: joi.required(), + }), lodged: joi .boolean() .optional() @@ -312,15 +288,47 @@ joiValidationDecorator( .allow(null) .description('Certificate of service date.'), serviceStamp: joi.string().optional(), - signedAt: joiStrictTimestamp.optional().allow(null), - signedByUserId: joi + signedAt: joi .string() - .uuid({ - version: ['uuidv4'], + .when('draftState', { + is: joi.exist().not(null), + otherwise: joi.when('documentType', { + is: joi.valid(...ORDER_TYPES.map(t => t.documentType)), + otherwise: joi.optional().allow(null), + then: joi.required(), + }), + then: joi.optional().allow(null), }) - .optional() - .allow(null), - signedJudgeName: joi.string().optional().allow(null), + .description('The time at which the document was signed.'), + signedByUserId: joi + .when('signedJudgeName', { + is: joi.exist().not(null), + otherwise: joi + .string() + .uuid({ + version: ['uuidv4'], + }) + .optional() + .allow(null), + then: joi + .string() + .uuid({ + version: ['uuidv4'], + }) + .required(), + }) + .description('The id of the user who applied the signature.'), + signedJudgeName: joi + .when('draftState', { + is: joi.exist().not(null), + otherwise: joi.when('documentType', { + is: joi.string().valid(...ORDER_TYPES.map(t => t.documentType)), + otherwise: joi.string().optional().allow(null), + then: joi.string().required(), + }), + then: joi.string().optional().allow(null), + }) + .description('The judge who signed the document.'), supportingDocument: joi.string().optional().allow(null), trialLocation: joi .string() @@ -421,6 +429,7 @@ Document.prototype.setSigned = function (signByUserId, signedJudgeName) { this.signedByUserId = signByUserId; this.signedJudgeName = signedJudgeName; this.signedAt = createISODateString(); + this.draftState = null; }; /** @@ -449,7 +458,7 @@ Document.prototype.getQCWorkItem = function () { Document.prototype.isAutoServed = function () { const externalDocumentTypes = flatten( - Object.values(DOCUMENT_CATEGORY_MAP), + Object.values(DOCUMENT_EXTERNAL_CATEGORIES_MAP), ).map(t => t.documentType); const isExternalDocumentType = externalDocumentTypes.includes( diff --git a/shared/src/business/entities/Document.test.js b/shared/src/business/entities/Document.test.js index 46f30175e51..0c445b5ede1 100644 --- a/shared/src/business/entities/Document.test.js +++ b/shared/src/business/entities/Document.test.js @@ -1,7 +1,11 @@ +const { + OPINION_DOCUMENT_TYPES, + ORDER_TYPES, + ROLES, +} = require('./EntityConstants'); const { applicationContext } = require('../test/createTestApplicationContext'); const { Document } = require('./Document'); const { Message } = require('./Message'); -const { ROLES } = require('./EntityConstants'); const { WorkItem } = require('./WorkItem'); const A_VALID_DOCUMENT = { @@ -17,6 +21,7 @@ const caseDetail = { name: 'Bill', }, }; +const mockUserId = applicationContext.getUniqueId(); describe('Document entity', () => { describe('isPendingOnCreation', () => { @@ -205,6 +210,109 @@ describe('Document entity', () => { expect(document.isValid()).toBeTruthy(); expect(document.secondaryDate).toBeDefined(); }); + + it('should fail validation when the document type is Order and "signedJudgeName" is not provided', () => { + const document = new Document( + { + ...A_VALID_DOCUMENT, + documentId: '777afd4b-1408-4211-a80e-3e897999861a', + documentType: ORDER_TYPES[0].documentType, + eventCode: 'TRAN', + isOrder: true, + secondaryDate: '2019-03-01T21:40:46.415Z', + }, + { applicationContext }, + ); + expect(document.isValid()).toBeFalsy(); + expect(document.signedJudgeName).toBeUndefined(); + }); + + it('should fail validation when the document type is opinion and judge is not provided', () => { + const document = new Document( + { + ...A_VALID_DOCUMENT, + documentId: '777afd4b-1408-4211-a80e-3e897999861a', + documentType: OPINION_DOCUMENT_TYPES[0].documentType, + eventCode: 'MOP', + secondaryDate: '2019-03-01T21:40:46.415Z', + }, + { applicationContext }, + ); + expect(document.isValid()).toBeFalsy(); + expect(document.judge).toBeUndefined(); + }); + + it('should pass validation when the document type is Order and a "signedAt" is provided', () => { + const document = new Document( + { + ...A_VALID_DOCUMENT, + documentId: '777afd4b-1408-4211-a80e-3e897999861a', + documentType: ORDER_TYPES[0].documentType, + draftState: null, + eventCode: 'TRAN', + isOrder: true, + secondaryDate: '2019-03-01T21:40:46.415Z', + signedAt: '2019-03-01T21:40:46.415Z', + signedByUserId: mockUserId, + signedJudgeName: 'Dredd', + }, + { applicationContext }, + ); + + expect(document.isValid()).toBeTruthy(); + }); + + it('should pass validation when the document type is Order and "signedJudgeName" and "signedByUserId" are provided', () => { + const document = new Document( + { + ...A_VALID_DOCUMENT, + documentId: '777afd4b-1408-4211-a80e-3e897999861a', + documentType: ORDER_TYPES[0].documentType, + eventCode: 'TRAN', + isOrder: true, + secondaryDate: '2019-03-01T21:40:46.415Z', + signedAt: '2019-03-01T21:40:46.415Z', + signedByUserId: mockUserId, + signedJudgeName: 'Dredd', + }, + { applicationContext }, + ); + expect(document.isValid()).toBeTruthy(); + }); + + it('should fail validation when the document type is Order but no "signedAt" is provided', () => { + const document = new Document( + { + ...A_VALID_DOCUMENT, + documentId: '777afd4b-1408-4211-a80e-3e897999861a', + documentType: ORDER_TYPES[0].documentType, + eventCode: 'TRAN', + isOrder: true, + secondaryDate: '2019-03-01T21:40:46.415Z', + }, + { applicationContext }, + ); + expect(document.isValid()).toBeFalsy(); + expect(document.signedJudgeName).toBeUndefined(); + }); + + it('should pass validation when the document type is Order and "signedJudgeName" is provided', () => { + const document = new Document( + { + ...A_VALID_DOCUMENT, + documentId: '777afd4b-1408-4211-a80e-3e897999861a', + documentType: ORDER_TYPES[0].documentType, + eventCode: 'TRAN', + isOrder: true, + secondaryDate: '2019-03-01T21:40:46.415Z', + signedAt: '2019-03-01T21:40:46.415Z', + signedByUserId: mockUserId, + signedJudgeName: 'Dredd', + }, + { applicationContext }, + ); + expect(document.isValid()).toBeTruthy(); + }); }); describe('generate filed by string', () => { diff --git a/shared/src/business/entities/EntityConstants.js b/shared/src/business/entities/EntityConstants.js index 3495da4a7b7..f291a3e4e40 100644 --- a/shared/src/business/entities/EntityConstants.js +++ b/shared/src/business/entities/EntityConstants.js @@ -1,7 +1,7 @@ const courtIssuedEventCodes = require('../../tools/courtIssuedEventCodes.json'); const documentMapExternal = require('../../tools/externalFilingEvents.json'); const documentMapInternal = require('../../tools/internalFilingEvents.json'); -const { sortBy } = require('lodash'); +const { flatten, sortBy } = require('lodash'); const SERVICE_INDICATOR_TYPES = { SI_ELECTRONIC: 'Electronic', @@ -82,12 +82,24 @@ const ORDER_DOCUMENT_TYPES = [ ]; const DOCUMENT_NOTICE_EVENT_CODES = ['NOT']; -const DOCUMENT_CATEGORIES = Object.keys(documentMapExternal); -const DOCUMENT_CATEGORY_MAP = documentMapExternal; +const DOCUMENT_EXTERNAL_CATEGORIES = Object.keys(documentMapExternal); +const DOCUMENT_EXTERNAL_CATEGORIES_MAP = documentMapExternal; const DOCUMENT_INTERNAL_CATEGORIES = Object.keys(documentMapInternal); const DOCUMENT_INTERNAL_CATEGORY_MAP = documentMapInternal; const COURT_ISSUED_EVENT_CODES = courtIssuedEventCodes; -const OPINION_DOCUMENT_TYPES = ['MOP', 'SOP', 'TCOP']; +const OPINION_EVENT_CODES = ['MOP', 'SOP', 'TCOP']; + +const OPINION_DOCUMENT_TYPES = [ + { + documentType: 'MOP - Memorandum Opinion', + }, + { + documentType: 'Summary Opinion', + }, + { + documentType: 'TCOP - T.C. Opinion', + }, +]; const SCENARIOS = [ 'Standard', @@ -382,6 +394,20 @@ const US_STATES = { WY: 'Wyoming', }; +const US_STATES_OTHER = [ + 'AA', + 'AE', + 'AP', + 'AS', + 'FM', + 'GU', + 'MH', + 'MP', + 'PR', + 'PW', + 'VI', +]; + const PARTY_TYPES = { conservator: 'Conservator', corporation: 'Corporation', @@ -701,10 +727,58 @@ const DEFAULT_PROCEDURE_TYPE = PROCEDURE_TYPES[0]; const CASE_SEARCH_MIN_YEAR = 1986; const CASE_SEARCH_PAGE_SIZE = 5; +// TODO: event codes need to be reorganized +const ALL_EVENT_CODES = flatten([ + ...Object.values(DOCUMENT_EXTERNAL_CATEGORIES_MAP), + ...Object.values(DOCUMENT_INTERNAL_CATEGORY_MAP), +]) + .map(item => item.eventCode) + .concat( + EVENT_CODES, + COURT_ISSUED_EVENT_CODES.map(item => item.eventCode), + OPINION_EVENT_CODES, + ORDER_DOCUMENT_TYPES, + ORDER_TYPES.map(item => item.eventCode), + ) + .sort(); + +const ALL_DOCUMENT_TYPES = (() => { + const allFilingEvents = flatten([ + ...Object.values(DOCUMENT_EXTERNAL_CATEGORIES_MAP), + ...Object.values(DOCUMENT_INTERNAL_CATEGORY_MAP), + ]); + const filingEventTypes = allFilingEvents.map(t => t.documentType); + const orderDocTypes = ORDER_TYPES.map(t => t.documentType); + const courtIssuedDocTypes = COURT_ISSUED_EVENT_CODES.map(t => t.documentType); + const initialTypes = Object.keys(INITIAL_DOCUMENT_TYPES).map( + t => INITIAL_DOCUMENT_TYPES[t].documentType, + ); + const signedTypes = Object.keys(SIGNED_DOCUMENT_TYPES).map( + t => SIGNED_DOCUMENT_TYPES[t].documentType, + ); + const systemGeneratedTypes = Object.keys(SYSTEM_GENERATED_DOCUMENT_TYPES).map( + t => SYSTEM_GENERATED_DOCUMENT_TYPES[t].documentType, + ); + + const documentTypes = [ + ...initialTypes, + ...PRACTITIONER_ASSOCIATION_DOCUMENT_TYPES, + ...filingEventTypes, + ...orderDocTypes, + ...courtIssuedDocTypes, + ...signedTypes, + ...systemGeneratedTypes, + ]; + + return documentTypes; +})(); + module.exports = { ADC_SECTION, ADMISSIONS_SECTION, ADMISSIONS_STATUS_OPTIONS, + ALL_DOCUMENT_TYPES, + ALL_EVENT_CODES, ANSWER_CUTOFF_AMOUNT_IN_DAYS, ANSWER_CUTOFF_UNIT, ANSWER_DOCUMENT_CODES, @@ -727,8 +801,8 @@ module.exports = { DOCKET_NUMBER_MATCHER, DOCKET_NUMBER_SUFFIXES, DOCKET_SECTION, - DOCUMENT_CATEGORIES, - DOCUMENT_CATEGORY_MAP, + DOCUMENT_EXTERNAL_CATEGORIES, + DOCUMENT_EXTERNAL_CATEGORIES_MAP, DOCUMENT_INTERNAL_CATEGORIES, DOCUMENT_INTERNAL_CATEGORY_MAP, DOCUMENT_NOTICE_EVENT_CODES, @@ -745,6 +819,7 @@ module.exports = { NOTICE_OF_TRIAL, OBJECTIONS_OPTIONS, OPINION_DOCUMENT_TYPES, + OPINION_EVENT_CODES, ORDER_DOCUMENT_TYPES, ORDER_TYPES, OTHER_TYPES, @@ -776,4 +851,5 @@ module.exports = { TRIAL_LOCATION_MATCHER, TRIAL_STATUS_TYPES, US_STATES, + US_STATES_OTHER, }; diff --git a/shared/src/business/entities/Statistic.js b/shared/src/business/entities/Statistic.js index e9cfe47bebd..5f7c2c3bacb 100644 --- a/shared/src/business/entities/Statistic.js +++ b/shared/src/business/entities/Statistic.js @@ -79,11 +79,12 @@ joiValidationDecorator( .description( 'The total amount of penalties for the period or year on the IRS notice.', ), - lastDateOfPeriod: joi + lastDateOfPeriod: joiStrictTimestamp + .max('now') .when('yearOrPeriod', { is: 'Period', otherwise: joi.optional().allow(null), - then: joiStrictTimestamp.max('now').required(), + then: joi.required(), }) .description('Last date of the statistics period.'), statisticId: joi @@ -94,15 +95,14 @@ joiValidationDecorator( .required() .description('Unique statistic ID only used by the system.'), year: joi + .number() + .integer() + .min(1900) + .max(new Date().getFullYear()) .when('yearOrPeriod', { is: 'Year', otherwise: joi.optional().allow(null), - then: joi - .number() - .integer() - .required() - .min(1900) - .max(new Date().getFullYear()), + then: joi.required(), }) .description('The year of the statistics period.'), yearOrPeriod: joi diff --git a/shared/src/business/entities/User.js b/shared/src/business/entities/User.js index 096cc383dc4..a3282b46685 100644 --- a/shared/src/business/entities/User.js +++ b/shared/src/business/entities/User.js @@ -1,11 +1,16 @@ const joi = require('@hapi/joi'); +const { + COUNTRY_TYPES, + ROLES, + US_STATES, + US_STATES_OTHER, +} = require('./EntityConstants'); const { JoiValidationConstants, } = require('../../utilities/JoiValidationConstants'); const { joiValidationDecorator, } = require('../../utilities/JoiValidationDecorator'); -const { COUNTRY_TYPES, ROLES } = require('./EntityConstants'); const userDecorator = (obj, rawObj) => { obj.entityName = 'User'; @@ -36,16 +41,22 @@ const userDecorator = (obj, rawObj) => { }; const baseUserValidation = { - judgeFullName: joi.when('role', { - is: ROLES.judge, - otherwise: joi.optional().allow(null), - then: joi.string().max(100).optional(), - }), - judgeTitle: joi.when('role', { - is: ROLES.judge, - otherwise: joi.optional().allow(null), - then: joi.string().max(100).optional(), - }), + judgeFullName: joi + .string() + .max(100) + .when('role', { + is: ROLES.judge, + otherwise: joi.optional().allow(null), + then: joi.optional(), + }), + judgeTitle: joi + .string() + .max(100) + .when('role', { + is: ROLES.judge, + otherwise: joi.optional().allow(null), + then: joi.optional(), + }), name: joi.string().max(100).optional(), role: joi .string() @@ -62,10 +73,10 @@ const userValidation = { address2: joi.string().max(100).optional().allow(null), address3: joi.string().max(100).optional().allow(null), city: joi.string().max(100).required(), - country: joi.when('countryType', { + country: joi.string().when('countryType', { is: COUNTRY_TYPES.INTERNATIONAL, - otherwise: joi.string().optional().allow(null), - then: joi.string().required(), + otherwise: joi.optional().allow(null), + then: joi.required(), }), countryType: joi .string() @@ -77,11 +88,14 @@ const userValidation = { otherwise: JoiValidationConstants.US_POSTAL_CODE.required(), then: joi.string().max(100).required(), }), - state: joi.when('countryType', { - is: COUNTRY_TYPES.INTERNATIONAL, - otherwise: joi.string().max(100).required(), - then: joi.string().optional().allow(null), - }), + state: joi + .string() + .valid(...Object.keys(US_STATES), ...US_STATES_OTHER) + .when('countryType', { + is: COUNTRY_TYPES.INTERNATIONAL, + otherwise: joi.required(), + then: joi.optional().allow(null), + }), }) .optional(), email: joi.string().max(100).optional(), diff --git a/shared/src/business/entities/cases/Case.js b/shared/src/business/entities/cases/Case.js index c4a5158ba26..7895ca1662f 100644 --- a/shared/src/business/entities/cases/Case.js +++ b/shared/src/business/entities/cases/Case.js @@ -282,12 +282,16 @@ function Case(rawCase, { applicationContext, filtered = false }) { const contacts = ContactFactory.createContacts({ contactInfo: { + otherPetitioners: rawCase.otherPetitioners, primary: rawCase.contactPrimary, secondary: rawCase.contactSecondary, }, isPaper: rawCase.isPaper, partyType: rawCase.partyType, }); + + this.otherPetitioners = contacts.otherPetitioners; + this.contactPrimary = contacts.primary; this.contactSecondary = contacts.secondary; } @@ -305,43 +309,42 @@ Case.VALIDATION_RULES = { .description( 'Temporarily blocked from trial due to a pending item or due date.', ), - automaticBlockedDate: joi.when('automaticBlocked', { - is: true, - otherwise: joi.optional().allow(null), - then: joiStrictTimestamp.required(), - }), - automaticBlockedReason: joi.when('automaticBlocked', { + automaticBlockedDate: joiStrictTimestamp.when('automaticBlocked', { is: true, otherwise: joi.optional().allow(null), - then: joi - .string() - .valid(...Object.values(AUTOMATIC_BLOCKED_REASONS)) - .required() - .description('The reason the case was automatically blocked from trial.'), + then: joi.required(), }), + automaticBlockedReason: joi + .string() + .valid(...Object.values(AUTOMATIC_BLOCKED_REASONS)) + .description('The reason the case was automatically blocked from trial.') + .when('automaticBlocked', { + is: true, + otherwise: joi.optional().allow(null), + then: joi.required(), + }), blocked: joi .boolean() .optional() .meta({ tags: ['Restricted'] }) .description('Temporarily blocked from trial.'), - blockedDate: joi + blockedDate: joiStrictTimestamp .when('blocked', { is: true, otherwise: joi.optional().allow(null), - then: joiStrictTimestamp.required(), + then: joi.required(), }) .meta({ tags: ['Restricted'] }), blockedReason: joi + .string() + .max(250) + .description( + 'Open text field for describing reason for blocking this case from trial.', + ) .when('blocked', { is: true, otherwise: joi.optional().allow(null), - then: joi - .string() - .max(250) - .required() - .description( - 'Open text field for describing reason for blocking this case from trial.', - ), + then: joi.required(), }) .meta({ tags: ['Restricted'] }), caseCaption: joi @@ -367,10 +370,10 @@ Case.VALIDATION_RULES = { .string() .valid(...CASE_TYPES) .required(), - closedDate: joi.when('status', { + closedDate: joiStrictTimestamp.when('status', { is: CASE_STATUS_TYPES.closed, otherwise: joi.optional().allow(null), - then: joiStrictTimestamp.required(), + then: joi.required(), }), contactPrimary: joi.object().required(), contactSecondary: joi.object().optional().allow(null), @@ -433,10 +436,12 @@ Case.VALIDATION_RULES = { .optional() .meta({ tags: ['Restricted'] }), highPriorityReason: joi + .string() + .max(250) .when('highPriority', { is: true, otherwise: joi.optional().allow(null), - then: joi.string().max(250).required(), + then: joi.required(), }) .meta({ tags: ['Restricted'] }), initialCaption: joi @@ -478,10 +483,12 @@ Case.VALIDATION_RULES = { .allow(null) .description('Litigation costs for the case.'), mailingDate: joi + .string() + .max(25) .when('isPaper', { is: true, - otherwise: joi.string().max(25).allow(null).optional(), - then: joi.string().max(25).required(), + otherwise: joi.allow(null).optional(), + then: joi.required(), }) .description('Date that petition was mailed to the court.'), noticeOfAttachments: joi @@ -531,23 +538,29 @@ Case.VALIDATION_RULES = { .boolean() .optional() .description('Reminder for clerks to review the Order to Show Cause.'), + otherPetitioners: joi + .array() + .items(joi.object().meta({ entityName: 'OtherPetitionerContact' })) + .description('List of OtherPetitionerContact Entities for the case.'), partyType: joi .string() .valid(...Object.values(PARTY_TYPES)) .required() .description('Party type of the case petitioner.'), - petitionPaymentDate: joi + petitionPaymentDate: joiStrictTimestamp .when('petitionPaymentStatus', { is: PAYMENT_STATUS.PAID, - otherwise: joiStrictTimestamp.optional().allow(null), - then: joiStrictTimestamp.required(), + otherwise: joi.optional().allow(null), + then: joi.required(), }) .description('When the petitioner paid the case fee.'), petitionPaymentMethod: joi + .string() + .max(50) .when('petitionPaymentStatus', { is: PAYMENT_STATUS.PAID, - otherwise: joi.string().allow(null).optional(), - then: joi.string().max(50).required(), + otherwise: joi.optional().allow(null), + then: joi.required(), }) .description('How the petitioner paid the case fee.'), petitionPaymentStatus: joi @@ -555,11 +568,11 @@ Case.VALIDATION_RULES = { .valid(...Object.values(PAYMENT_STATUS)) .required() .description('Status of the case fee payment.'), - petitionPaymentWaivedDate: joi + petitionPaymentWaivedDate: joiStrictTimestamp .when('petitionPaymentStatus', { is: PAYMENT_STATUS.WAIVED, - otherwise: joiStrictTimestamp.allow(null).optional(), - then: joiStrictTimestamp.required(), + otherwise: joi.allow(null).optional(), + then: joi.required(), }) .description('When the case fee was waived.'), preferredTrialCity: joi @@ -602,23 +615,15 @@ Case.VALIDATION_RULES = { 'A sortable representation of the docket number (auto-generated by constructor).', ), statistics: joi + .array() + .items(joi.object().meta({ entityName: 'Statistic' })) .when('hasVerifiedIrsNotice', { is: true, - otherwise: joi - .array() - .items(joi.object().meta({ entityName: 'Statistic' })) - .optional(), + otherwise: joi.optional(), then: joi.when('caseType', { is: CASE_TYPES_MAP.deficiency, - otherwise: joi - .array() - .items(joi.object().meta({ entityName: 'Statistic' })) - .optional(), - then: joi - .array() - .min(1) - .items(joi.object().meta({ entityName: 'Statistic' })) - .required(), + otherwise: joi.optional(), // TODO: only allow null? + then: joi.array().min(1).required(), }), }) .description('List of Statistic Entities for the case.'), @@ -1481,6 +1486,7 @@ Case.prototype.getCaseContacts = function (shape) { 'contactSecondary', 'privatePractitioners', 'irsPractitioners', + 'otherPetitioners', ].forEach(contact => { if (!shape || (shape && shape[contact] === true)) { caseContacts[contact] = this[contact]; @@ -1746,6 +1752,8 @@ Case.prototype.deleteStatistic = function (statisticId) { return this; }; -exports.Case = Case; -exports.isAssociatedUser = isAssociatedUser; -exports.getPetitionDocumentFromDocuments = getPetitionDocumentFromDocuments; +module.exports = { + Case, + getPetitionDocumentFromDocuments, + isAssociatedUser, +}; diff --git a/shared/src/business/entities/cases/Case.test.js b/shared/src/business/entities/cases/Case.test.js index 9b1c23efaeb..bd87496bacf 100644 --- a/shared/src/business/entities/cases/Case.test.js +++ b/shared/src/business/entities/cases/Case.test.js @@ -168,11 +168,57 @@ describe('Case entity', () => { }); }); + describe('Other Petitioners', () => { + it('sets the value of otherPetitioners on the case', () => { + const mockOtherPetitioners = [ + { + additionalName: 'First Other Petitioner', + address1: '876 12th Ave', + city: 'Nashville', + country: 'USA', + countryType: 'domestic', + email: 'someone@example.com', + name: 'Jimmy Dean', + phone: '1234567890', + postalCode: '05198', + state: 'AK', + }, + { + additionalName: 'First Other Petitioner', + address1: '876 12th Ave', + city: 'Nashville', + country: 'USA', + countryType: 'domestic', + email: 'someone@example.com', + name: 'Jimmy Dean', + phone: '1234567890', + postalCode: '05198', + state: 'AK', + }, + ]; + + const myCase = new Case( + { + ...MOCK_CASE, + otherPetitioners: mockOtherPetitioners, + }, + { + applicationContext, + }, + ); + + expect(myCase.otherPetitioners).toEqual(mockOtherPetitioners); + }); + }); + describe('isValid', () => { it('Creates a valid case', () => { - const myCase = new Case(MOCK_CASE, { - applicationContext, - }); + const myCase = new Case( + { ...MOCK_CASE, otherPetitioners: undefined }, + { + applicationContext, + }, + ); expect(myCase.isValid()).toBeTruthy(); expect(myCase.entityName).toEqual('Case'); }); @@ -260,6 +306,33 @@ describe('Case entity', () => { expect(myCase.isValid()).toBeFalsy(); }); + it('Creates an invalid case with invalid otherPetitioners', () => { + const myCase = new Case( + { + ...MOCK_CASE, + otherPetitioners: [ + { + address1: '982 Oak Boulevard', + address2: 'Maxime dolorum quae ', + address3: 'Ut numquam ducimus ', + city: 'Placeat sed dolorum', + countryType: 'domestic', + name: 'Keelie Bruce', + phone: '+1 (785) 771-2329', + postalCode: '17860', + secondaryName: 'Logan Fields', + serviceIndicator: 'None', + state: 'LA', + }, + ], + }, + { + applicationContext, + }, + ); + expect(myCase.isValid()).toBeFalsy(); + }); + it('Creates a valid case with statistics', () => { const myCase = new Case( { @@ -2285,6 +2358,29 @@ describe('Case entity', () => { title: 'Executor', }; + const otherPetitioners = [ + { + additionalName: 'Other Petitioner 1', + address1: '123 Main St', + city: 'Somewhere', + countryType: COUNTRY_TYPES.DOMESTIC, + name: 'Contact Secondary', + postalCode: '12345', + state: 'TN', + title: 'Executor', + }, + { + additionalName: 'Other Petitioner 1', + address1: '123 Main St', + city: 'Somewhere', + countryType: COUNTRY_TYPES.DOMESTIC, + name: 'Contact Secondary', + postalCode: '12345', + state: 'TN', + title: 'Executor', + }, + ]; + const privatePractitioners = [ { name: 'Private Practitioner One', @@ -2304,6 +2400,7 @@ describe('Case entity', () => { contactPrimary, contactSecondary, irsPractitioners, + otherPetitioners, partyType: PARTY_TYPES.petitionerSpouse, privatePractitioners, }, @@ -2317,6 +2414,7 @@ describe('Case entity', () => { contactPrimary, contactSecondary, irsPractitioners, + otherPetitioners, privatePractitioners, }); }); @@ -2328,6 +2426,7 @@ describe('Case entity', () => { contactPrimary, contactSecondary, irsPractitioners, + otherPetitioners, partyType: PARTY_TYPES.petitionerSpouse, privatePractitioners, }, @@ -2339,10 +2438,12 @@ describe('Case entity', () => { const caseContacts = testCase.getCaseContacts({ contactPrimary: true, contactSecondary: true, + otherPetitioners: true, }); expect(caseContacts).toMatchObject({ contactPrimary, contactSecondary, + otherPetitioners, }); }); }); diff --git a/shared/src/business/entities/cases/CaseExternal.js b/shared/src/business/entities/cases/CaseExternal.js index da29991cf1d..3b882b59901 100644 --- a/shared/src/business/entities/cases/CaseExternal.js +++ b/shared/src/business/entities/cases/CaseExternal.js @@ -57,10 +57,10 @@ CaseExternal.VALIDATION_ERROR_MESSAGES = Case.VALIDATION_ERROR_MESSAGES; CaseExternal.commonRequirements = { businessType: joi.string().optional().allow(null), // TODO: enum - caseType: joi.when('hasIrsNotice', { + caseType: joi.string().when('hasIrsNotice', { is: joi.exist(), otherwise: joi.optional().allow(null), - then: joi.string().required(), + then: joi.required(), }), contactPrimary: joi.object().optional(), // TODO: object definition contactSecondary: joi.object().optional(), // TODO: object definition @@ -71,33 +71,48 @@ CaseExternal.commonRequirements = { ...FILING_TYPES[ROLES.petitioner], ...FILING_TYPES[ROLES.privatePractitioner], ) - .required(), // TODO: enum + .required(), hasIrsNotice: joi.boolean().required(), ownershipDisclosureFile: joi.object().when('filingType', { is: 'A business', otherwise: joi.optional().allow(null), then: joi.required(), }), - ownershipDisclosureFileSize: joi.when('ownershipDisclosureFile', { - is: joi.exist(), - otherwise: joi.optional().allow(null), - then: joi.number().required().min(1).max(MAX_FILE_SIZE_BYTES).integer(), - }), + ownershipDisclosureFileSize: joi + .number() + .integer() + .min(1) + .max(MAX_FILE_SIZE_BYTES) + .when('ownershipDisclosureFile', { + is: joi.exist(), + otherwise: joi.optional().allow(null), + then: joi.required(), + }), partyType: joi.string().required(), // TODO: enum petitionFile: joi.object().required(), // TODO: object definition - petitionFileSize: joi.when('petitionFile', { - is: joi.exist(), - otherwise: joi.optional().allow(null), - then: joi.number().required().min(1).max(MAX_FILE_SIZE_BYTES).integer(), - }), + petitionFileSize: joi + .number() + .integer() + .min(1) + .max(MAX_FILE_SIZE_BYTES) + .when('petitionFile', { + is: joi.exist(), + otherwise: joi.optional().allow(null), + then: joi.required(), + }), preferredTrialCity: joi.string().required(), // TODO: enum procedureType: joi.string().required(), // TODO: enum stinFile: joi.object().required(), // TODO: object definition - stinFileSize: joi.when('stinFile', { - is: joi.exist(), - otherwise: joi.optional().allow(null), - then: joi.number().required().min(1).max(MAX_FILE_SIZE_BYTES).integer(), - }), + stinFileSize: joi + .number() + .integer() + .min(1) + .max(MAX_FILE_SIZE_BYTES) + .when('stinFile', { + is: joi.exist(), + otherwise: joi.optional().allow(null), + then: joi.required(), + }), }; joiValidationDecorator( diff --git a/shared/src/business/entities/cases/CaseInternal.js b/shared/src/business/entities/cases/CaseInternal.js index 5ccf15a7b40..675117e7c86 100644 --- a/shared/src/business/entities/cases/CaseInternal.js +++ b/shared/src/business/entities/cases/CaseInternal.js @@ -1,10 +1,12 @@ const joi = require('@hapi/joi'); const { CASE_TYPES, - MAX_FILE_SIZE_BYTES, PARTY_TYPES, PAYMENT_STATUS, } = require('../EntityConstants'); +const { + JoiValidationConstants, +} = require('../../../utilities/JoiValidationConstants'); const { joiValidationDecorator, } = require('../../../utilities/JoiValidationDecorator'); @@ -111,17 +113,19 @@ CaseInternal.VALIDATION_ERROR_MESSAGES = { const paperRequirements = joi .object() .keys({ - applicationForWaiverOfFilingFeeFile: joi.when('petitionPaymentStatus', { - is: PAYMENT_STATUS.WAIVED, - otherwise: joi.optional().allow(null), - then: joi.object().required(), - }), - applicationForWaiverOfFilingFeeFileSize: joi.when( + applicationForWaiverOfFilingFeeFile: joi + .object() + .when('petitionPaymentStatus', { + is: PAYMENT_STATUS.WAIVED, + otherwise: joi.optional().allow(null), + then: joi.required(), + }), + applicationForWaiverOfFilingFeeFileSize: JoiValidationConstants.MAX_FILE_SIZE_BYTES.when( 'applicationForWaiverOfFilingFeeFile', { is: joi.exist().not(null), otherwise: joi.optional().allow(null), - then: joi.number().required().min(1).max(MAX_FILE_SIZE_BYTES).integer(), + then: joi.required(), }, ), caseCaption: joi.string().max(500).required(), @@ -142,7 +146,7 @@ const paperRequirements = joi orderForOds: Case.VALIDATION_RULES.orderForOds, orderForRatification: Case.VALIDATION_RULES.orderForRatification, orderToShowCause: Case.VALIDATION_RULES.orderToShowCause, - ownershipDisclosureFile: joi.when('partyType', { + ownershipDisclosureFile: joi.object().when('partyType', { is: joi .exist() .valid( @@ -155,26 +159,34 @@ const paperRequirements = joi then: joi.when('orderForOds', { is: joi.not(true), otherwise: joi.optional().allow(null), - then: joi.object().required(), + then: joi.required(), }), }), - ownershipDisclosureFileSize: joi.when('ownershipDisclosureFile', { - is: joi.exist().not(null), - otherwise: joi.optional().allow(null), - then: joi.number().required().min(1).max(MAX_FILE_SIZE_BYTES).integer(), - }), + ownershipDisclosureFileSize: JoiValidationConstants.MAX_FILE_SIZE_BYTES.when( + 'ownershipDisclosureFile', + { + is: joi.exist().not(null), + otherwise: joi.optional().allow(null), + then: joi.required(), + }, + ), partyType: joi.string().max(500).required(), // TODO: enum petitionFile: joi.object().required(), // TODO: object definition - petitionFileSize: joi.when('petitionFile', { - is: joi.exist().not(null), - otherwise: joi.optional().allow(null), - then: joi.number().required().min(1).max(MAX_FILE_SIZE_BYTES).integer(), - }), - petitionPaymentDate: joi.when('petitionPaymentStatus', { - is: PAYMENT_STATUS.PAID, - otherwise: joiStrictTimestamp.optional().allow(null), - then: joiStrictTimestamp.max('now').required(), - }), + petitionFileSize: JoiValidationConstants.MAX_FILE_SIZE_BYTES.when( + 'petitionFile', + { + is: joi.exist().not(null), + otherwise: joi.optional().allow(null), + then: joi.required(), + }, + ), + petitionPaymentDate: joiStrictTimestamp + .max('now') + .when('petitionPaymentStatus', { + is: PAYMENT_STATUS.PAID, + otherwise: joi.optional().allow(null), + then: joi.required(), + }), petitionPaymentMethod: Case.VALIDATION_RULES.petitionPaymentMethod, petitionPaymentStatus: Case.VALIDATION_RULES.petitionPaymentStatus, petitionPaymentWaivedDate: Case.VALIDATION_RULES.petitionPaymentWaivedDate, @@ -194,17 +206,20 @@ const paperRequirements = joi otherwise: joi.object().optional(), then: joi.object().required(), // TODO: object definition }), - requestForPlaceOfTrialFileSize: joi.when('requestForPlaceOfTrialFile', { - is: joi.exist().not(null), - otherwise: joi.optional().allow(null), - then: joi.number().required().min(1).max(MAX_FILE_SIZE_BYTES).integer(), - }), + requestForPlaceOfTrialFileSize: JoiValidationConstants.MAX_FILE_SIZE_BYTES.when( + 'requestForPlaceOfTrialFile', + { + is: joi.exist().not(null), + otherwise: joi.optional().allow(null), + then: joi.required(), + }, + ), statistics: Case.VALIDATION_RULES.statistics, stinFile: joi.object().optional(), // TODO: object definition - stinFileSize: joi.when('stinFile', { + stinFileSize: JoiValidationConstants.MAX_FILE_SIZE_BYTES.when('stinFile', { is: joi.exist().not(null), otherwise: joi.optional().allow(null), - then: joi.number().required().min(1).max(MAX_FILE_SIZE_BYTES).integer(), + then: joi.required(), }), useSameAsPrimary: Case.VALIDATION_RULES.useSameAsPrimary, }) diff --git a/shared/src/business/entities/cases/CaseSearch.js b/shared/src/business/entities/cases/CaseSearch.js index b4553e73114..75ea4e2ffde 100644 --- a/shared/src/business/entities/cases/CaseSearch.js +++ b/shared/src/business/entities/cases/CaseSearch.js @@ -36,15 +36,16 @@ CaseSearch.schema = joi.object().keys({ countryType: joi.string().max(500).optional(), // TODO: enum petitionerName: joi.string().max(500).required(), petitionerState: joi.string().max(500).optional(), // TODO: enum - yearFiledMax: joi.when('yearFiledMin', { - is: joi.number(), - otherwise: joi.number().integer().min(1900).max(new Date().getFullYear()), - then: joi - .number() - .integer() - .min(joi.ref('yearFiledMin')) - .max(new Date().getFullYear()), - }), + yearFiledMax: joi + .number() + .integer() + .min(joi.ref('yearFiledMin')) + .max(new Date().getFullYear()) + .when('yearFiledMin', { + is: joi.number(), + otherwise: joi.number().min(1900), + then: joi.number().min(joi.ref('yearFiledMin')), + }), yearFiledMin: joi.number().integer().min(1900).max(new Date().getFullYear()), }); diff --git a/shared/src/business/entities/cases/PublicDocument.js b/shared/src/business/entities/cases/PublicDocument.js index 191abb4f312..0e1dcc13453 100644 --- a/shared/src/business/entities/cases/PublicDocument.js +++ b/shared/src/business/entities/cases/PublicDocument.js @@ -2,6 +2,7 @@ const joi = require('@hapi/joi'); const { joiValidationDecorator, } = require('../../../utilities/JoiValidationDecorator'); +const { ALL_DOCUMENT_TYPES, ALL_EVENT_CODES } = require('../EntityConstants'); const { getTimestampSchema } = require('../../../utilities/dateSchema'); const joiStrictTimestamp = getTimestampSchema(); @@ -48,8 +49,14 @@ joiValidationDecorator( }) .optional(), documentTitle: joi.string().max(500).optional(), - documentType: joi.string().max(500).optional(), // TODO: enum - eventCode: joi.string().max(500).optional(), // TODO: enum + documentType: joi + .string() + .valid(...ALL_DOCUMENT_TYPES) + .optional(), + eventCode: joi + .string() + .valid(...ALL_EVENT_CODES) + .optional(), filedBy: joi.string().max(500).optional(), isPaper: joi.boolean().optional(), processingStatus: joi.string().max(500).optional(), // TODO: enum diff --git a/shared/src/business/entities/contacts/ContactFactory.js b/shared/src/business/entities/contacts/ContactFactory.js index c57a1b750a4..389c364cc4f 100644 --- a/shared/src/business/entities/contacts/ContactFactory.js +++ b/shared/src/business/entities/contacts/ContactFactory.js @@ -4,6 +4,7 @@ const { PARTY_TYPES, SERVICE_INDICATOR_TYPES, US_STATES, + US_STATES_OTHER, } = require('../EntityConstants'); const { JoiValidationConstants, @@ -63,7 +64,7 @@ const domesticValidationObject = { ...commonValidationRequirements, state: joi .string() - .valid(...Object.keys(US_STATES)) + .valid(...Object.keys(US_STATES), ...US_STATES_OTHER) .required(), postalCode: JoiValidationConstants.US_POSTAL_CODE.required(), }; @@ -115,21 +116,15 @@ ContactFactory.getErrorToMessageMap = ({ }; /** - * used for getting the contact constructor depending on the party type and contact type + * used for getting the contact constructors depending on the party type and contact type * * @param {object} options the options object - * @param {string} options.partyType see the PARTY_TYPES map for a list of all valid partyTypes * @param {string} options.countryType typically either 'domestic' or 'international' - * @param {string} options.contactType typically either 'primary' or 'secondary' * @param {boolean} options.isPaper is paper case - * @returns {object} the contact constructors for the primary and/or secondary contacts + * @param {string} options.partyType see the PARTY_TYPES map for a list of all valid partyTypes + * @returns {object} (:) the contact constructors map for the primary contact, secondary contact, other petitioner contacts */ -const getContactConstructor = ({ - contactType, - countryType, - isPaper, - partyType, -}) => { +const getContactConstructors = ({ partyType }) => { const { getNextFriendForIncompetentPersonContact, } = require('./NextFriendForIncompetentPersonContact'); @@ -166,100 +161,126 @@ const getContactConstructor = ({ const { getPetitionerIntermediaryContact, } = require('./PetitionerIntermediaryContact'); + const { getOtherPetitionerContact } = require('./OtherPetitionerContact'); const { getPetitionerPrimaryContact } = require('./PetitionerPrimaryContact'); const { getPetitionerSpouseContact } = require('./PetitionerSpouseContact'); const { getPetitionerTrustContact } = require('./PetitionerTrustContact'); const { getSurvivingSpouseContact } = require('./SurvivingSpouseContact'); - return { - [PARTY_TYPES.petitioner]: { - primary: getPetitionerPrimaryContact({ countryType, isPaper }), - secondary: null, - }[contactType], - [PARTY_TYPES.transferee]: { - primary: getPetitionerPrimaryContact({ countryType, isPaper }), - secondary: null, - }[contactType], - [PARTY_TYPES.donor]: { - primary: getPetitionerPrimaryContact({ countryType, isPaper }), - secondary: null, - }[contactType], - [PARTY_TYPES.petitionerDeceasedSpouse]: { - primary: getPetitionerPrimaryContact({ countryType, isPaper }), - secondary: getPetitionerDeceasedSpouseContact({ countryType, isPaper }), - }[contactType], - [PARTY_TYPES.survivingSpouse]: { - primary: getSurvivingSpouseContact({ countryType, isPaper }), - secondary: null, - }[contactType], - [PARTY_TYPES.petitionerSpouse]: { - primary: getPetitionerPrimaryContact({ countryType, isPaper }), - secondary: getPetitionerSpouseContact({ countryType, isPaper }), - }[contactType], - [PARTY_TYPES.corporation]: { - primary: getPetitionerCorporationContact({ countryType, isPaper }), - secondary: null, - }[contactType], - [PARTY_TYPES.estateWithoutExecutor]: { - primary: getPetitionerIntermediaryContact({ countryType, isPaper }), - secondary: null, - }[contactType], - [PARTY_TYPES.partnershipAsTaxMattersPartner]: { - primary: getPartnershipAsTaxMattersPartnerPrimaryContact({ - countryType, - isPaper, - }), - secondary: null, - }[contactType], - [PARTY_TYPES.partnershipOtherThanTaxMatters]: { - primary: getPartnershipOtherThanTaxMattersPrimaryContact({ - countryType, - isPaper, - }), - secondary: null, - }[contactType], - [PARTY_TYPES.nextFriendForMinor]: { - primary: getNextFriendForMinorContact({ countryType, isPaper }), - secondary: null, - }[contactType], - [PARTY_TYPES.nextFriendForIncompetentPerson]: { - primary: getNextFriendForIncompetentPersonContact({ - countryType, - isPaper, - }), - secondary: null, - }[contactType], - [PARTY_TYPES.estate]: { - primary: getPetitionerEstateWithExecutorPrimaryContact({ - countryType, - isPaper, - }), - secondary: null, - }[contactType], - [PARTY_TYPES.partnershipBBA]: { - primary: getPartnershipBBAPrimaryContact({ countryType, isPaper }), - secondary: null, - }[contactType], - [PARTY_TYPES.trust]: { - primary: getPetitionerTrustContact({ countryType, isPaper }), - secondary: null, - }[contactType], - [PARTY_TYPES.conservator]: { - primary: getPetitionerConservatorContact({ countryType, isPaper }), - secondary: null, - }[contactType], - [PARTY_TYPES.guardian]: { - primary: getPetitionerGuardianContact({ countryType, isPaper }), - secondary: null, - }[contactType], - [PARTY_TYPES.custodian]: { - primary: getPetitionerCustodianContact({ countryType, isPaper }), - secondary: null, - }[contactType], - }[partyType]; + + const partyConstructorFetch = partyTypeValue => { + switch (partyTypeValue) { + case PARTY_TYPES.donor: // fall through + case PARTY_TYPES.transferee: // fall through + case PARTY_TYPES.petitioner: + return { + otherPetitioners: getOtherPetitionerContact, + primary: getPetitionerPrimaryContact, + secondary: null, + }; + case PARTY_TYPES.conservator: + return { + otherPetitioners: getOtherPetitionerContact, + primary: getPetitionerConservatorContact, + secondary: null, + }; + case PARTY_TYPES.corporation: + return { + otherPetitioners: getOtherPetitionerContact, + primary: getPetitionerCorporationContact, + secondary: null, + }; + case PARTY_TYPES.custodian: + return { + otherPetitioners: getOtherPetitionerContact, + primary: getPetitionerCustodianContact, + secondary: null, + }; + case PARTY_TYPES.estate: + return { + otherPetitioners: getOtherPetitionerContact, + primary: getPetitionerEstateWithExecutorPrimaryContact, + secondary: null, + }; + case PARTY_TYPES.estateWithoutExecutor: + return { + otherPetitioners: getOtherPetitionerContact, + primary: getPetitionerIntermediaryContact, + secondary: null, + }; + case PARTY_TYPES.guardian: + return { + otherPetitioners: getOtherPetitionerContact, + primary: getPetitionerGuardianContact, + secondary: null, + }; + case PARTY_TYPES.nextFriendForIncompetentPerson: + return { + otherPetitioners: getOtherPetitionerContact, + primary: getNextFriendForIncompetentPersonContact, + secondary: null, + }; + case PARTY_TYPES.nextFriendForMinor: + return { + otherPetitioners: getOtherPetitionerContact, + primary: getNextFriendForMinorContact, + secondary: null, + }; + + case PARTY_TYPES.partnershipAsTaxMattersPartner: + return { + otherPetitioners: getOtherPetitionerContact, + primary: getPartnershipAsTaxMattersPartnerPrimaryContact, + secondary: null, + }; + case PARTY_TYPES.partnershipBBA: + return { + otherPetitioners: getOtherPetitionerContact, + primary: getPartnershipBBAPrimaryContact, + secondary: null, + }; + case PARTY_TYPES.partnershipOtherThanTaxMatters: + return { + otherPetitioners: getOtherPetitionerContact, + primary: getPartnershipOtherThanTaxMattersPrimaryContact, + secondary: null, + }; + case PARTY_TYPES.petitionerDeceasedSpouse: + return { + otherPetitioners: getOtherPetitionerContact, + primary: getPetitionerPrimaryContact, + secondary: getPetitionerDeceasedSpouseContact, + }; + case PARTY_TYPES.petitionerSpouse: + return { + otherPetitioners: getOtherPetitionerContact, + primary: getPetitionerPrimaryContact, + secondary: getPetitionerSpouseContact, + }; + case PARTY_TYPES.survivingSpouse: + return { + otherPetitioners: getOtherPetitionerContact, + primary: getSurvivingSpouseContact, + secondary: null, + }; + case PARTY_TYPES.trust: + return { + otherPetitioners: getOtherPetitionerContact, + primary: getPetitionerTrustContact, + secondary: null, + }; + default: + if (partyTypeValue) { + throw new Error(`Unrecognized party type "${partyTypeValue}"`); + } + return {}; + } + }; + + return partyConstructorFetch(partyType); }; /** - * used for instantiating the primary and secondary contact objects which are later used in the Petition entity. + * used for instantiating the primary and secondary contact objects which are later used in the Case entity. * * @param {object} options the options object * @param {string} options.partyType see the PARTY_TYPES map for a list of all valid partyTypes @@ -267,24 +288,45 @@ const getContactConstructor = ({ * @returns {object} contains the primary and secondary contacts constructed */ ContactFactory.createContacts = ({ contactInfo, isPaper, partyType }) => { - const primaryConstructor = getContactConstructor({ - contactType: 'primary', - countryType: (contactInfo.primary || {}).countryType, - isPaper, - partyType, - }); - const secondaryConstructor = getContactConstructor({ - contactType: 'secondary', - countryType: (contactInfo.secondary || {}).countryType, - isPaper, - partyType, - }); + const constructorMap = getContactConstructors({ partyType }); + + const constructors = { + primary: + constructorMap.primary && + constructorMap.primary({ + countryType: (contactInfo.primary || {}).countryType, + isPaper, + }), + secondary: + constructorMap.secondary && + constructorMap.secondary({ + countryType: (contactInfo.secondary || {}).countryType, + isPaper, + }), + }; + + let otherPetitioners = []; + if (Array.isArray(contactInfo.otherPetitioners)) { + otherPetitioners = contactInfo.otherPetitioners.map(otherPetitioner => { + const otherPetitionerConstructor = constructorMap.otherPetitioners + ? constructorMap.otherPetitioners({ + countryType: otherPetitioner.countryType, + isPaper, + }) + : undefined; + return otherPetitionerConstructor + ? new otherPetitionerConstructor(otherPetitioner) + : {}; + }); + } + return { - primary: primaryConstructor - ? new primaryConstructor(contactInfo.primary || {}) + otherPetitioners, + primary: constructors.primary + ? new constructors.primary(contactInfo.primary || {}) : {}, - secondary: secondaryConstructor - ? new secondaryConstructor(contactInfo.secondary || {}) + secondary: constructors.secondary + ? new constructors.secondary(contactInfo.secondary || {}) : {}, }; }; @@ -309,6 +351,7 @@ ContactFactory.createContactFactory = ({ */ function GenericContactConstructor(rawContact) { this.address1 = rawContact.address1; + //TODO make this look like additionalName this.address2 = rawContact.address2 ? rawContact.address2 : undefined; this.address3 = rawContact.address3 ? rawContact.address3 : undefined; this.city = rawContact.city; @@ -323,6 +366,7 @@ ContactFactory.createContactFactory = ({ this.serviceIndicator = rawContact.serviceIndicator; this.state = rawContact.state; this.title = rawContact.title; + this.additionalName = rawContact.additionalName; } GenericContactConstructor.errorToMessageMap = { diff --git a/shared/src/business/entities/contacts/ContactFactory.test.js b/shared/src/business/entities/contacts/ContactFactory.test.js index 93da960c05c..267620cbd3d 100644 --- a/shared/src/business/entities/contacts/ContactFactory.test.js +++ b/shared/src/business/entities/contacts/ContactFactory.test.js @@ -1,13 +1,15 @@ const { applicationContext, } = require('../../test/createTestApplicationContext'); +const { Case } = require('../cases/Case'); const { CaseExternal } = require('../cases/CaseExternal'); const { CaseInternal } = require('../cases/CaseInternal'); +const { MOCK_CASE } = require('../../../test/mockCase'); const { PARTY_TYPES, PAYMENT_STATUS } = require('../EntityConstants'); let caseExternal; -describe('Petition', () => { +describe('ContactFactory', () => { describe('for Corporation Contacts', () => { it('should not validate without contact', () => { caseExternal = new CaseExternal({ @@ -432,7 +434,6 @@ describe('Petition', () => { it('can validate valid Custodian contact', () => { caseExternal = new CaseExternal({ caseType: 'Other', - contactPrimary: { address1: '876 12th Ave', city: 'Nashville', @@ -529,11 +530,9 @@ describe('Petition', () => { }); expect(caseExternal.isValid()).toEqual(false); }); - it('can validate valid Transferee contact', () => { caseExternal = new CaseExternal({ caseType: 'Other', - contactPrimary: { address1: '876 12th Ave', city: 'Nashville', @@ -561,6 +560,37 @@ describe('Petition', () => { expect(caseExternal.getFormattedValidationErrors()).toEqual(null); }); + it('throws an Error (upon construction) if `partyType` is defined but not found in the available list', () => { + expect(() => { + caseExternal = new CaseExternal({ + caseType: 'Other', + contactPrimary: { + address1: '876 12th Ave', + city: 'Nashville', + country: 'USA', + countryType: 'domestic', + email: 'someone@example.com', + name: 'Jimmy Dean', + phone: '1234567890', + postalCode: '05198', + state: 'AK', + }, + filingType: 'Myself', + hasIrsNotice: true, + irsNoticeDate: '2009-10-13T08:06:07.539Z', + mailingDate: 'testing', + partyType: 'SOME INVALID PARTY TYPE', + petitionFile: {}, + petitionFileSize: 1, + preferredTrialCity: 'Chattanooga, Tennessee', + procedureType: 'Small', + signature: true, + stinFile: {}, + stinFileSize: 1, + }); + }).toThrow('Unrecognized party type "SOME INVALID PARTY TYPE"'); + }); + it('does not require phone number for internal cases', () => { const caseInternal = new CaseInternal( { @@ -601,4 +631,59 @@ describe('Petition', () => { expect(caseInternal.getFormattedValidationErrors()).toEqual(null); }); + + describe('Cases with otherPetitioners', () => { + const partyTypeKeys = Object.keys(PARTY_TYPES); + partyTypeKeys.forEach(partyType => { + it(`can validate valid contacts for a case with otherPetitioners for party type ${partyType}`, () => { + let caseWithOtherPetitioners = new Case( + { + ...MOCK_CASE, + contactPrimary: { + ...MOCK_CASE.contactPrimary, + inCareOf: 'Peter Parker', + secondaryName: 'Trustee Name', + }, + contactSecondary: { + ...MOCK_CASE.contactPrimary, + inCareOf: 'Peter Parker', + secondaryName: 'Trustee Name', + }, + otherPetitioners: [ + { + additionalName: 'First Other Petitioner', + address1: '876 12th Ave', + city: 'Nashville', + country: 'USA', + countryType: 'domestic', + email: 'someone@example.com', + name: 'Jimmy Dean', + phone: '1234567890', + postalCode: '05198', + state: 'AK', + }, + { + additionalName: 'First Other Petitioner', + address1: '876 12th Ave', + city: 'Nashville', + country: 'USA', + countryType: 'domestic', + email: 'someone@example.com', + name: 'Jimmy Dean', + phone: '1234567890', + postalCode: '05198', + state: 'AK', + }, + ], + partyType: PARTY_TYPES[partyType], + }, + { applicationContext }, + ); + + expect(caseWithOtherPetitioners.getFormattedValidationErrors()).toEqual( + null, + ); + }); + }); + }); }); diff --git a/shared/src/business/entities/contacts/OtherPetitionerContact.js b/shared/src/business/entities/contacts/OtherPetitionerContact.js new file mode 100644 index 00000000000..9770c78b04d --- /dev/null +++ b/shared/src/business/entities/contacts/OtherPetitionerContact.js @@ -0,0 +1,14 @@ +const joi = require('@hapi/joi'); +const { ContactFactory } = require('./ContactFactory'); + +/** + * returns the constructor used for creating the OtherPetitionerContact entity + */ +exports.getOtherPetitionerContact = ContactFactory.createContactFactory({ + additionalErrorMappings: { + additionalName: 'Enter name of other petitioner', + }, + additionalValidation: { + additionalName: joi.string().max(500).required(), + }, +}); diff --git a/shared/src/business/entities/courtIssuedDocument/CourtIssuedDocumentTypeA.js b/shared/src/business/entities/courtIssuedDocument/CourtIssuedDocumentTypeA.js index 0a8bf782c0c..3a3d6e1ecaf 100644 --- a/shared/src/business/entities/courtIssuedDocument/CourtIssuedDocumentTypeA.js +++ b/shared/src/business/entities/courtIssuedDocument/CourtIssuedDocumentTypeA.js @@ -29,19 +29,19 @@ CourtIssuedDocumentTypeA.schema = { attachments: joi.boolean().required(), documentTitle: joi.string().optional(), documentType: joi.string().required(), - freeText: joi.when('documentType', { + freeText: joi.string().when('documentType', { is: GENERIC_ORDER_DOCUMENT_TYPE, otherwise: joi.optional().allow(null), - then: joi.string().required(), - }), - serviceStamp: joi.when('documentType', { - is: GENERIC_ORDER_DOCUMENT_TYPE, - otherwise: joi.optional().allow(null), - then: joi - .string() - .valid(...SERVICE_STAMP_OPTIONS) - .required(), + then: joi.required(), }), + serviceStamp: joi + .string() + .valid(...SERVICE_STAMP_OPTIONS) + .when('documentType', { + is: GENERIC_ORDER_DOCUMENT_TYPE, + otherwise: joi.optional().allow(null), + then: joi.required(), + }), }; joiValidationDecorator( diff --git a/shared/src/business/entities/docketEntry/DocketEntryFactory.js b/shared/src/business/entities/docketEntry/DocketEntryFactory.js index 3668c43bdb2..708303c29e1 100644 --- a/shared/src/business/entities/docketEntry/DocketEntryFactory.js +++ b/shared/src/business/entities/docketEntry/DocketEntryFactory.js @@ -1,12 +1,16 @@ const joi = require('@hapi/joi'); const { - DOCUMENT_CATEGORY_MAP, - MAX_FILE_SIZE_BYTES, + ALL_DOCUMENT_TYPES, + ALL_EVENT_CODES, + DOCUMENT_EXTERNAL_CATEGORIES_MAP, MAX_FILE_SIZE_MB, } = require('../EntityConstants'); const { ExternalDocumentFactory, } = require('../externalDocument/ExternalDocumentFactory'); +const { + JoiValidationConstants, +} = require('../../../utilities/JoiValidationConstants'); const { joiValidationDecorator, } = require('../../../utilities/JoiValidationDecorator'); @@ -80,19 +84,28 @@ function DocketEntryFactory(rawProps) { attachments: joi.boolean(), certificateOfService: joi.boolean(), dateReceived: joiStrictTimestamp.max('now').required(), - documentType: joi.string().optional(), - eventCode: joi.string().required(), + documentType: joi + .string() + .valid(...ALL_DOCUMENT_TYPES) + .optional(), + eventCode: joi + .string() + .valid(...ALL_EVENT_CODES) + .required(), freeText: joi.string().optional(), hasSupportingDocuments: joi.boolean(), lodged: joi.boolean(), ordinalValue: joi.string().optional(), previousDocument: joi.object().optional(), primaryDocumentFile: joi.object().optional(), - primaryDocumentFileSize: joi.when('primaryDocumentFile', { - is: joi.exist().not(null), - otherwise: joi.optional().allow(null), - then: joi.number().required().min(1).max(MAX_FILE_SIZE_BYTES).integer(), - }), + primaryDocumentFileSize: JoiValidationConstants.MAX_FILE_SIZE_BYTES.when( + 'primaryDocumentFile', + { + is: joi.exist().not(null), + otherwise: joi.optional().allow(null), + then: joi.required(), + }, + ), serviceDate: joiStrictTimestamp.max('now').optional(), trialLocation: joi.string().optional(), }); @@ -126,7 +139,7 @@ function DocketEntryFactory(rawProps) { } const objectionDocumentTypes = [ - ...DOCUMENT_CATEGORY_MAP['Motion'].map(entry => { + ...DOCUMENT_EXTERNAL_CATEGORIES_MAP['Motion'].map(entry => { return entry.documentType; }), 'Motion to Withdraw Counsel (filed by petitioner)', diff --git a/shared/src/business/entities/externalDocument/ExternalDocumentInformationFactory.js b/shared/src/business/entities/externalDocument/ExternalDocumentInformationFactory.js index 49a6962385b..101bed37021 100644 --- a/shared/src/business/entities/externalDocument/ExternalDocumentInformationFactory.js +++ b/shared/src/business/entities/externalDocument/ExternalDocumentInformationFactory.js @@ -4,7 +4,9 @@ const { makeRequiredHelper, } = require('./externalDocumentHelpers'); const { - DOCUMENT_CATEGORY_MAP, + ALL_DOCUMENT_TYPES, + ALL_EVENT_CODES, + DOCUMENT_EXTERNAL_CATEGORIES_MAP, MAX_FILE_SIZE_BYTES, MAX_FILE_SIZE_MB, } = require('../EntityConstants'); @@ -163,8 +165,14 @@ ExternalDocumentInformationFactory.get = documentMetadata => { attachments: joi.boolean().required(), casesParties: joi.object().optional(), certificateOfService: joi.boolean().required(), - documentType: joi.string().optional(), - eventCode: joi.string().optional(), + documentType: joi + .string() + .valid(...ALL_DOCUMENT_TYPES) + .optional(), + eventCode: joi + .string() + .valid(...ALL_EVENT_CODES) + .optional(), freeText: joi.string().optional(), hasSupportingDocuments: joi.boolean().required(), lodged: joi.boolean().optional(), @@ -221,7 +229,7 @@ ExternalDocumentInformationFactory.get = documentMetadata => { } const objectionDocumentTypes = [ - ...DOCUMENT_CATEGORY_MAP['Motion'].map(entry => { + ...DOCUMENT_EXTERNAL_CATEGORIES_MAP['Motion'].map(entry => { return entry.documentType; }), 'Motion to Withdraw Counsel (filed by petitioner)', diff --git a/shared/src/business/entities/externalDocument/ExternalDocumentStandard.js b/shared/src/business/entities/externalDocument/ExternalDocumentStandard.js index edb3ee71866..30190e527e8 100644 --- a/shared/src/business/entities/externalDocument/ExternalDocumentStandard.js +++ b/shared/src/business/entities/externalDocument/ExternalDocumentStandard.js @@ -34,7 +34,7 @@ ExternalDocumentStandard.schema = joi.object({ .required() .when('selectedCases', { is: joi.array().min(1).required(), - then: joi.string().required().invalid('Proposed Stipulated Decision'), + then: joi.string().invalid('Proposed Stipulated Decision'), }), selectedCases: joi.array().items(joi.string()).optional(), }); diff --git a/shared/src/business/entities/orders/Order.js b/shared/src/business/entities/orders/Order.js index 8dfade0fea3..7802280137e 100644 --- a/shared/src/business/entities/orders/Order.js +++ b/shared/src/business/entities/orders/Order.js @@ -2,6 +2,7 @@ const joi = require('@hapi/joi'); const { joiValidationDecorator, } = require('../../../utilities/JoiValidationDecorator'); +const { ALL_DOCUMENT_TYPES, ALL_EVENT_CODES } = require('../EntityConstants'); /** * @param {object} rawOrder the raw order data @@ -22,8 +23,14 @@ Order.VALIDATION_ERROR_MESSAGES = { Order.VALIDATION_RULES = { documentTitle: joi.string().max(100).required(), - documentType: joi.string().required(), // TODO: add enum - eventCode: joi.string().optional(), // TODO: add enum + documentType: joi + .string() + .valid(...ALL_DOCUMENT_TYPES) + .required(), + eventCode: joi + .string() + .valid(...ALL_EVENT_CODES) + .optional(), orderBody: joi.string().max(500).required(), }; diff --git a/shared/src/business/entities/orders/OrderWithoutBody.js b/shared/src/business/entities/orders/OrderWithoutBody.js index c2077901ae8..a04f512946d 100644 --- a/shared/src/business/entities/orders/OrderWithoutBody.js +++ b/shared/src/business/entities/orders/OrderWithoutBody.js @@ -2,6 +2,7 @@ const joi = require('@hapi/joi'); const { joiValidationDecorator, } = require('../../../utilities/JoiValidationDecorator'); +const { ALL_DOCUMENT_TYPES, ALL_EVENT_CODES } = require('../EntityConstants'); const { Order } = require('./Order'); /** @@ -21,9 +22,15 @@ OrderWithoutBody.VALIDATION_ERROR_MESSAGES = { joiValidationDecorator( OrderWithoutBody, joi.object().keys({ - documentTitle: joi.string().required(), - documentType: joi.string().required(), - eventCode: joi.string().required(), + documentTitle: joi.string().max(100).required(), + documentType: joi + .string() + .valid(...ALL_DOCUMENT_TYPES) + .required(), + eventCode: joi + .string() + .valid(...ALL_EVENT_CODES) + .required(), }), OrderWithoutBody.VALIDATION_ERROR_MESSAGES, ); diff --git a/shared/src/business/entities/trialSessions/TrialSession.js b/shared/src/business/entities/trialSessions/TrialSession.js index 4eacc1b78af..5864d448bce 100644 --- a/shared/src/business/entities/trialSessions/TrialSession.js +++ b/shared/src/business/entities/trialSessions/TrialSession.js @@ -119,15 +119,10 @@ TrialSession.validationRules = { startTime: JoiValidationConstants.TWENTYFOUR_HOUR_MINUTES, state: joi.string().allow('').optional(), swingSession: joi.boolean().optional(), - swingSessionId: joi.when('swingSession', { + swingSessionId: JoiValidationConstants.UUID.when('swingSession', { is: true, otherwise: joi.string().optional(), - then: joi - .string() - .uuid({ - version: ['uuidv4'], - }) - .required(), + then: joi.required(), }), term: joi .string() @@ -136,12 +131,7 @@ TrialSession.validationRules = { termYear: joi.string().required(), trialClerk: joi.object().optional(), trialLocation: joi.string().required(), - trialSessionId: joi - .string() - .uuid({ - version: ['uuidv4'], - }) - .optional(), + trialSessionId: JoiValidationConstants.UUID.optional(), }, }; @@ -151,20 +141,18 @@ joiValidationDecorator( ...TrialSession.validationRules.COMMON, caseOrder: joi.array().items( joi.object().keys({ - caseId: joi.string().uuid({ - version: ['uuidv4'], - }), - disposition: joi.when('removedFromTrial', { + caseId: JoiValidationConstants.UUID, + disposition: joi.string().when('removedFromTrial', { is: true, otherwise: joi.optional().allow(null), - then: joi.string().required(), + then: joi.required(), }), isManuallyAdded: joi.boolean().optional(), removedFromTrial: joi.boolean().optional(), - removedFromTrialDate: joi.when('removedFromTrial', { + removedFromTrialDate: joiStrictTimestamp.when('removedFromTrial', { is: true, otherwise: joi.optional().allow(null), - then: joiStrictTimestamp.required(), + then: joi.required(), }), }), ), diff --git a/shared/src/business/test/createTestApplicationContext.js b/shared/src/business/test/createTestApplicationContext.js index ef1ab2b2a75..d70e863b5c3 100644 --- a/shared/src/business/test/createTestApplicationContext.js +++ b/shared/src/business/test/createTestApplicationContext.js @@ -329,6 +329,7 @@ const createTestApplicationContext = ({ user } = {}) => { getUserById: jest.fn().mockImplementation(getUserByIdPersistence), getWorkItemById: jest.fn().mockImplementation(getWorkItemByIdPersistence), incrementCounter, + persistUser: jest.fn(), putWorkItemInOutbox: jest.fn().mockImplementation(putWorkItemInOutbox), removeItem: jest.fn().mockImplementation(removeItem), saveDocumentFromLambda: jest.fn(), diff --git a/shared/src/business/test/fileExternalDocumentInteractor.e2e.test.js b/shared/src/business/test/fileExternalDocumentInteractor.e2e.test.js index 7d6261436ca..9fcabb8386e 100644 --- a/shared/src/business/test/fileExternalDocumentInteractor.e2e.test.js +++ b/shared/src/business/test/fileExternalDocumentInteractor.e2e.test.js @@ -77,7 +77,7 @@ describe('fileExternalDocumentInteractor integration test', () => { attachments: false, caseId, certificateOfService: false, - certificateOfServiceDate: 'undefined-undefined-undefined', + certificateOfServiceDate: '2020-06-12T08:09:45.129Z', docketNumber: '201-19', documentTitle: 'Motion for Leave to File Brief in Support of Petition', documentType: 'Motion for Leave to File', @@ -236,7 +236,7 @@ describe('fileExternalDocumentInteractor integration test', () => { document: { attachments: false, certificateOfService: false, - certificateOfServiceDate: 'undefined-undefined-undefined', + certificateOfServiceDate: '2020-06-12T08:09:45.129Z', docketNumber: '201-19', documentId: '12de0fac-f63c-464f-ac71-0f54fd248484', documentTitle: diff --git a/shared/src/business/useCases/caseAssociationRequest/validateCaseAssociationRequestInteractor.test.js b/shared/src/business/useCases/caseAssociationRequest/validateCaseAssociationRequestInteractor.test.js index 24dc0ce022c..653a0719447 100644 --- a/shared/src/business/useCases/caseAssociationRequest/validateCaseAssociationRequestInteractor.test.js +++ b/shared/src/business/useCases/caseAssociationRequest/validateCaseAssociationRequestInteractor.test.js @@ -31,7 +31,7 @@ describe('validateCaseAssociationRequest', () => { certificateOfServiceDate: '1987-08-06T07:53:09.001Z', documentTitleTemplate: 'Entry of Appearance for [Petitioner Names]', documentType: 'Entry of Appearance', - eventCode: '123', + eventCode: 'A', primaryDocumentFile: {}, representingPrimary: true, scenario: 'Standard', diff --git a/shared/src/business/useCases/courtIssuedOrder/fileCourtIssuedOrderInteractor.js b/shared/src/business/useCases/courtIssuedOrder/fileCourtIssuedOrderInteractor.js index 6c597fe7427..aa34f04c57a 100644 --- a/shared/src/business/useCases/courtIssuedOrder/fileCourtIssuedOrderInteractor.js +++ b/shared/src/business/useCases/courtIssuedOrder/fileCourtIssuedOrderInteractor.js @@ -41,6 +41,7 @@ exports.fileCourtIssuedOrderInteractor = async ({ const caseEntity = new Case(caseToUpdate, { applicationContext }); + // TODO - account for all order types? if (['O', 'NOT'].includes(documentMetadata.eventCode)) { documentMetadata.freeText = documentMetadata.documentTitle; } @@ -115,10 +116,6 @@ exports.fileCourtIssuedOrderInteractor = async ({ ); documentEntity.setAsProcessingStatusAsCompleted(); - if (documentMetadata.eventCode === 'NOT') { - documentEntity.setSigned(authorizedUser.userId); - } - caseEntity.addDocumentWithoutDocketRecord(documentEntity); await applicationContext.getPersistenceGateway().updateCase({ diff --git a/shared/src/business/useCases/courtIssuedOrder/fileCourtIssuedOrderInteractor.test.js b/shared/src/business/useCases/courtIssuedOrder/fileCourtIssuedOrderInteractor.test.js index a8e3c05db96..5f2d7728bc8 100644 --- a/shared/src/business/useCases/courtIssuedOrder/fileCourtIssuedOrderInteractor.test.js +++ b/shared/src/business/useCases/courtIssuedOrder/fileCourtIssuedOrderInteractor.test.js @@ -9,6 +9,7 @@ const { ROLES } = require('../../entities/EntityConstants'); const { User } = require('../../entities/User'); describe('fileCourtIssuedOrderInteractor', () => { + const mockUserId = applicationContext.getUniqueId(); const caseRecord = { caseCaption: 'Caption', caseId: 'c54ba5a9-b37b-479d-9201-067ec6e335bb', @@ -39,19 +40,19 @@ describe('fileCourtIssuedOrderInteractor', () => { docketNumber: '45678-18', documentId: 'c54ba5a9-b37b-479d-9201-067ec6e335bb', documentType: 'Answer', - userId: 'e3bb51b1-bb93-494b-8a20-8bce8327fd99', + userId: mockUserId, }, { docketNumber: '45678-18', documentId: 'c54ba5a9-b37b-479d-9201-067ec6e335bb', documentType: 'Answer', - userId: 'e3bb51b1-bb93-494b-8a20-8bce8327fd99', + userId: mockUserId, }, { docketNumber: '45678-18', documentId: 'c54ba5a9-b37b-479d-9201-067ec6e335bb', documentType: 'Answer', - userId: 'e3bb51b1-bb93-494b-8a20-8bce8327fd99', + userId: mockUserId, }, ], filingType: 'Myself', @@ -106,6 +107,9 @@ describe('fileCourtIssuedOrderInteractor', () => { caseId: caseRecord.caseId, docketNumber: '45678-18', documentType: 'Order to Show Cause', + signedAt: '2019-03-01T21:40:46.415Z', + signedByUserId: mockUserId, + signedJudgeName: 'Dredd', }, primaryDocumentFileId: 'c54ba5a9-b37b-479d-9201-067ec6e335bb', }); @@ -128,6 +132,9 @@ describe('fileCourtIssuedOrderInteractor', () => { documentTitle: 'Order to do anything', documentType: 'Order', eventCode: 'O', + signedAt: '2019-03-01T21:40:46.415Z', + signedByUserId: mockUserId, + signedJudgeName: 'Dredd', }, primaryDocumentFileId: 'c54ba5a9-b37b-479d-9201-067ec6e335bb', }); @@ -154,6 +161,9 @@ describe('fileCourtIssuedOrderInteractor', () => { documentTitle: 'Notice to be nice', documentType: 'Notice', eventCode: 'NOT', + signedAt: '2019-03-01T21:40:46.415Z', + signedByUserId: mockUserId, + signedJudgeName: 'Dredd', }, primaryDocumentFileId: 'c54ba5a9-b37b-479d-9201-067ec6e335bb', }); @@ -179,11 +189,9 @@ describe('fileCourtIssuedOrderInteractor', () => { docketNumber: '45678-18', documentContents: 'I am some document contents', documentType: 'Order to Show Cause', - draftState: { - documentContents: 'I am some document contents', - editorDelta: 'I am some document contents', - richText: 'I am some document contents', - }, + signedAt: '2019-03-01T21:40:46.415Z', + signedByUserId: mockUserId, + signedJudgeName: 'Dredd', }, primaryDocumentFileId: 'c54ba5a9-b37b-479d-9201-067ec6e335bb', }); @@ -222,6 +230,7 @@ describe('fileCourtIssuedOrderInteractor', () => { documentTitle: 'TC Opinion', documentType: 'TCOP - T.C. Opinion', eventCode: 'TCOP', + judge: 'Dredd', }, primaryDocumentFileId: 'c54ba5a9-b37b-479d-9201-067ec6e335bb', }); diff --git a/shared/src/business/useCases/courtIssuedOrder/updateCourtIssuedOrderInteractor.test.js b/shared/src/business/useCases/courtIssuedOrder/updateCourtIssuedOrderInteractor.test.js index 9eee1fa8502..1b8d2fed256 100644 --- a/shared/src/business/useCases/courtIssuedOrder/updateCourtIssuedOrderInteractor.test.js +++ b/shared/src/business/useCases/courtIssuedOrder/updateCourtIssuedOrderInteractor.test.js @@ -10,6 +10,7 @@ const { User } = require('../../entities/User'); describe('updateCourtIssuedOrderInteractor', () => { let mockCurrentUser; let mockUserById; + const mockUserId = applicationContext.getUniqueId(); let caseRecord = { caseCaption: 'Caption', @@ -42,19 +43,19 @@ describe('updateCourtIssuedOrderInteractor', () => { documentContentsId: '442f46fd-727b-485c-8998-a0138593cebe', documentId: 'c54ba5a9-b37b-479d-9201-067ec6e335bb', documentType: 'Answer', - userId: '2db02773-6583-42d8-ab91-52529d1993cf', + userId: mockUserId, }, { docketNumber: '45678-18', documentId: 'a75e4cc8-deed-42d0-b7b0-3846004fe3f9', documentType: 'Answer', - userId: '2db02773-6583-42d8-ab91-52529d1993cf', + userId: mockUserId, }, { docketNumber: '45678-18', documentId: 'd3cc11ab-bbee-4d09-bc66-da267f3cfd07', documentType: 'Answer', - userId: '2db02773-6583-42d8-ab91-52529d1993cf', + userId: mockUserId, }, ], filingType: 'Myself', @@ -126,6 +127,7 @@ describe('updateCourtIssuedOrderInteractor', () => { documentMetadata: { caseId: caseRecord.caseId, documentType: 'Order to Show Cause', + draftState: {}, }, }); @@ -151,6 +153,9 @@ describe('updateCourtIssuedOrderInteractor', () => { richText: 'the contents!', }, richText: 'the contents!', + signedAt: '2019-03-01T21:40:46.415Z', + signedByUserId: mockUserId, + signedJudgeName: 'Dredd', }, }); @@ -175,6 +180,7 @@ describe('updateCourtIssuedOrderInteractor', () => { documentMetadata: { caseId: caseRecord.caseId, documentType: 'Order to Show Cause', + draftState: {}, judge: 'Judge Judgy', }, }); diff --git a/shared/src/business/useCases/docketEntry/fileCourtIssuedDocketEntryInteractor.test.js b/shared/src/business/useCases/docketEntry/fileCourtIssuedDocketEntryInteractor.test.js index 1b5c0134a0e..ca41b565676 100644 --- a/shared/src/business/useCases/docketEntry/fileCourtIssuedDocketEntryInteractor.test.js +++ b/shared/src/business/useCases/docketEntry/fileCourtIssuedDocketEntryInteractor.test.js @@ -12,6 +12,7 @@ const { ROLES } = require('../../entities/EntityConstants'); describe('fileCourtIssuedDocketEntryInteractor', () => { let caseRecord; + const mockUserId = applicationContext.getUniqueId(); beforeEach(() => { applicationContext.getPersistenceGateway().getUserById.mockReturnValue({ @@ -57,7 +58,7 @@ describe('fileCourtIssuedDocketEntryInteractor', () => { documentTitle: 'Answer', documentType: 'Answer', eventCode: 'A', - userId: 'e3bb51b1-bb93-494b-8a20-8bce8327fd99', + userId: mockUserId, }, { docketNumber: '45678-18', @@ -65,7 +66,7 @@ describe('fileCourtIssuedDocketEntryInteractor', () => { documentTitle: 'Answer', documentType: 'Answer', eventCode: 'A', - userId: 'e3bb51b1-bb93-494b-8a20-8bce8327fd99', + userId: mockUserId, }, { docketNumber: '45678-18', @@ -73,7 +74,7 @@ describe('fileCourtIssuedDocketEntryInteractor', () => { documentTitle: 'Answer', documentType: 'Answer', eventCode: 'A', - userId: 'e3bb51b1-bb93-494b-8a20-8bce8327fd99', + userId: mockUserId, }, { docketNumber: '45678-18', @@ -81,7 +82,10 @@ describe('fileCourtIssuedDocketEntryInteractor', () => { documentTitle: 'Order', documentType: 'Order', eventCode: 'O', - userId: 'e3bb51b1-bb93-494b-8a20-8bce8327fd99', + signedAt: '2019-03-01T21:40:46.415Z', + signedByUserId: mockUserId, + signedJudgeName: 'Dredd', + userId: mockUserId, }, { docketNumber: '45678-18', @@ -89,7 +93,10 @@ describe('fileCourtIssuedDocketEntryInteractor', () => { documentTitle: 'Order to Show Cause', documentType: 'Order to Show Cause', eventCode: 'OSC', - userId: 'e3bb51b1-bb93-494b-8a20-8bce8327fd99', + signedAt: '2019-03-01T21:40:46.415Z', + signedByUserId: mockUserId, + signedJudgeName: 'Dredd', + userId: mockUserId, }, { docketNumber: '45678-18', @@ -97,7 +104,7 @@ describe('fileCourtIssuedDocketEntryInteractor', () => { documentTitle: 'Transcript of [anything] on [date]', documentType: 'TRAN - Transcript', eventCode: 'TRAN', - userId: 'e3bb51b1-bb93-494b-8a20-8bce8327fd99', + userId: mockUserId, }, ], filingType: 'Myself', diff --git a/shared/src/business/useCases/docketEntry/updateCourtIssuedDocketEntryInteractor.test.js b/shared/src/business/useCases/docketEntry/updateCourtIssuedDocketEntryInteractor.test.js index 595ea34472f..8078f65fa44 100644 --- a/shared/src/business/useCases/docketEntry/updateCourtIssuedDocketEntryInteractor.test.js +++ b/shared/src/business/useCases/docketEntry/updateCourtIssuedDocketEntryInteractor.test.js @@ -7,6 +7,7 @@ const { PARTY_TYPES, ROLES } = require('../../entities/EntityConstants'); describe('updateCourtIssuedDocketEntryInteractor', () => { let caseRecord; + const mockUserId = applicationContext.getUniqueId(); beforeAll(() => { caseRecord = { @@ -40,25 +41,28 @@ describe('updateCourtIssuedDocketEntryInteractor', () => { docketNumber: '45678-18', documentId: '30413c1e-9a71-4c22-8c11-41f8689313ae', documentType: 'Answer', - userId: 'be32eee7-4c0c-48bf-b2bd-7000ebb6941f', + userId: mockUserId, }, { docketNumber: '45678-18', documentId: 'e27d2d4e-f768-4167-b2c9-989dccbbb738', documentType: 'Answer', - userId: 'be32eee7-4c0c-48bf-b2bd-7000ebb6941f', + userId: mockUserId, }, { docketNumber: '45678-18', documentId: 'c54ba5a9-b37b-479d-9201-067ec6e335bb', documentType: 'Answer', - userId: 'be32eee7-4c0c-48bf-b2bd-7000ebb6941f', + userId: mockUserId, }, { docketNumber: '45678-18', documentId: 'c54ba5a9-b37b-479d-9201-067ec6e335ba', documentType: 'Order', - userId: 'be32eee7-4c0c-48bf-b2bd-7000ebb6941f', + signedAt: '2019-03-01T21:40:46.415Z', + signedByUserId: mockUserId, + signedJudgeName: 'Dredd', + userId: mockUserId, workItems: [ { assigneeId: '8b4cd447-6278-461b-b62b-d9e357eea62c', @@ -82,7 +86,7 @@ describe('updateCourtIssuedDocketEntryInteractor', () => { documentTitle: 'Transcript of [anything] on [date]', documentType: 'TRAN - Transcript', eventCode: 'TRAN', - userId: 'be32eee7-4c0c-48bf-b2bd-7000ebb6941f', + userId: mockUserId, workItems: [ { assigneeId: '8b4cd447-6278-461b-b62b-d9e357eea62c', @@ -147,6 +151,9 @@ describe('updateCourtIssuedDocketEntryInteractor', () => { caseId: caseRecord.caseId, documentId: 'c54ba5a9-b37b-479d-9201-067ec6e335bc', documentType: 'Order', + signedAt: '2019-03-01T21:40:46.415Z', + signedByUserId: mockUserId, + signedJudgeName: 'Dredd', }, }), ).rejects.toThrow('Document not found'); @@ -165,6 +172,9 @@ describe('updateCourtIssuedDocketEntryInteractor', () => { caseId: caseRecord.caseId, documentId: 'c54ba5a9-b37b-479d-9201-067ec6e335ba', documentType: 'Order', + signedAt: '2019-03-01T21:40:46.415Z', + signedByUserId: mockUserId, + signedJudgeName: 'Dredd', }, }); @@ -226,6 +236,9 @@ describe('updateCourtIssuedDocketEntryInteractor', () => { documentId: 'c54ba5a9-b37b-479d-9201-067ec6e335ba', documentType: 'Order', objections: 'No', + signedAt: '2019-03-01T21:40:46.415Z', + signedByUserId: mockUserId, + signedJudgeName: 'Dredd', }, }); diff --git a/shared/src/business/useCases/docketEntry/updateDocketEntryMetaInteractor.test.js b/shared/src/business/useCases/docketEntry/updateDocketEntryMetaInteractor.test.js index 95595ab175a..a83407e0cc0 100644 --- a/shared/src/business/useCases/docketEntry/updateDocketEntryMetaInteractor.test.js +++ b/shared/src/business/useCases/docketEntry/updateDocketEntryMetaInteractor.test.js @@ -11,6 +11,8 @@ describe('updateDocketEntryMetaInteractor', () => { let docketRecord; let documents; + const mockUserId = applicationContext.getUniqueId(); + beforeEach(() => { documents = [ { @@ -20,7 +22,10 @@ describe('updateDocketEntryMetaInteractor', () => { freeText: 'some free text', servedAt: '2019-01-01T00:01:00.000Z', servedParties: [{ name: 'Some Party' }], - userId: 'abcba5a9-b37b-479d-9201-067ec6e33abc', + signedAt: '2019-03-01T21:40:46.415Z', + signedByUserId: mockUserId, + signedJudgeName: 'Dredd', + userId: mockUserId, }, { documentId: '111ba5a9-b37b-479d-9201-067ec6e33111', @@ -28,7 +33,10 @@ describe('updateDocketEntryMetaInteractor', () => { filingDate: '2019-01-01T00:01:00.000Z', servedAt: '2019-01-02T00:01:00.000Z', servedParties: [{ name: 'Some Other Party' }], - userId: 'abcba5a9-b37b-479d-9201-067ec6e33abc', + signedAt: '2019-03-01T21:40:46.415Z', + signedByUserId: mockUserId, + signedJudgeName: 'Dredd', + userId: mockUserId, }, ]; diff --git a/shared/src/business/useCases/docketEntry/validateDocketEntryInteractor.test.js b/shared/src/business/useCases/docketEntry/validateDocketEntryInteractor.test.js index f7a30eea2d7..b47d4be693a 100644 --- a/shared/src/business/useCases/docketEntry/validateDocketEntryInteractor.test.js +++ b/shared/src/business/useCases/docketEntry/validateDocketEntryInteractor.test.js @@ -32,8 +32,8 @@ describe('validateDocketEntryInteractor', () => { category: 'Answer', dateReceived: '1987-08-06T07:53:09.001Z', documentTitle: '[First, Second, etc.] Amendment to Answer', - documentType: 'Amendment to Answer', - eventCode: 'ATAN', + documentType: 'Answer', + eventCode: 'A', lodged: false, ordinalValue: 'First', partyPrimary: true, diff --git a/shared/src/business/useCases/messages/completeCaseMessageInteractor.js b/shared/src/business/useCases/messages/completeCaseMessageInteractor.js new file mode 100644 index 00000000000..ae8ce074e0f --- /dev/null +++ b/shared/src/business/useCases/messages/completeCaseMessageInteractor.js @@ -0,0 +1,65 @@ +const { + isAuthorized, + ROLE_PERMISSIONS, +} = require('../../../authorization/authorizationClientService'); +const { CaseMessage } = require('../../entities/CaseMessage'); +const { orderBy } = require('lodash'); +const { UnauthorizedError } = require('../../../errors/errors'); + +/** + * completes a case message thread + * + * @param {object} providers the providers object + * @param {object} providers.applicationContext the application context + * @param {string} providers.message the message text + * @param {string} providers.parentMessageId the id of the parent message for the thread + * @returns {object} the case message + */ +exports.completeCaseMessageInteractor = async ({ + applicationContext, + message, + parentMessageId, +}) => { + const authorizedUser = applicationContext.getCurrentUser(); + + if (!isAuthorized(authorizedUser, ROLE_PERMISSIONS.MESSAGES)) { + throw new UnauthorizedError('Unauthorized'); + } + + const user = await applicationContext + .getPersistenceGateway() + .getUserById({ applicationContext, userId: authorizedUser.userId }); + + await applicationContext + .getPersistenceGateway() + .markCaseMessageThreadRepliedTo({ + applicationContext, + parentMessageId, + }); + + const messages = await applicationContext + .getPersistenceGateway() + .getCaseMessageThreadByParentId({ + applicationContext, + parentMessageId, + }); + + const mostRecentMessage = orderBy(messages, 'createdAt', 'desc')[0]; + + const updatedCaseMessage = new CaseMessage(mostRecentMessage, { + applicationContext, + }).validate(); + + updatedCaseMessage.markAsCompleted({ message, user }); + + const updatedMessage = await applicationContext + .getPersistenceGateway() + .updateCaseMessage({ + applicationContext, + caseMessage: updatedCaseMessage.validate().toRawObject(), + }); + + return new CaseMessage(updatedMessage, { applicationContext }) + .validate() + .toRawObject(); +}; diff --git a/shared/src/business/useCases/messages/completeCaseMessageInteractor.test.js b/shared/src/business/useCases/messages/completeCaseMessageInteractor.test.js new file mode 100644 index 00000000000..e1961dbed6a --- /dev/null +++ b/shared/src/business/useCases/messages/completeCaseMessageInteractor.test.js @@ -0,0 +1,115 @@ +const { + applicationContext, +} = require('../../test/createTestApplicationContext'); +const { + completeCaseMessageInteractor, +} = require('./completeCaseMessageInteractor'); +const { + UnauthorizedError, +} = require('../../../../../shared/src/errors/errors'); +const { ROLES } = require('../../entities/EntityConstants'); + +describe('completeCaseMessageInteractor', () => { + const mockCaseMessages = [ + { + caseId: '3079c990-cc6c-4b99-8fca-8e31f2d9e7a8', + caseStatus: 'New', + caseTitle: 'Test Petitioner', + createdAt: '2019-01-01T17:29:13.122Z', + docketNumber: '123-45', + docketNumberWithSuffix: '123-45S', + from: 'gg', + fromSection: 'petitions', + fromUserId: '6805d1ab-18d0-43ec-bafb-654e83405416', + message: 'hello world', + messageId: '829e790e-3c22-4308-9267-a251c0d4ce77', + parentMessageId: '829e790e-3c22-4308-9267-a251c0d4ce77', + pk: 'case|3079c990-cc6c-4b99-8fca-8e31f2d9e7a8', + sk: 'message|5a79c990-cc6c-4b99-8fca-8e31f2d9e78a', + subject: 'hey!', + to: 'bob', + toSection: 'petitions', + toUserId: '6805d1ab-18d0-43ec-bafb-654e83405416', + }, + { + caseId: '3079c990-cc6c-4b99-8fca-8e31f2d9e7a8', + caseStatus: 'New', + caseTitle: 'Test Petitioner', + createdAt: '2019-01-04T17:29:13.122Z', + docketNumber: '123-45', + docketNumberWithSuffix: '123-45S', + from: 'gg', + fromSection: 'petitions', + fromUserId: '6805d1ab-18d0-43ec-bafb-654e83405416', + message: 'hello world2', + messageId: 'ee84c7d5-31db-40dc-b1cc-7913be7138e8', + parentMessageId: '829e790e-3c22-4308-9267-a251c0d4ce77', + pk: 'case|3079c990-cc6c-4b99-8fca-8e31f2d9e7a8', + sk: 'message|ee84c7d5-31db-40dc-b1cc-7913be7138e8', + subject: 'hey!', + to: 'bob', + toSection: 'petitions', + toUserId: '6805d1ab-18d0-43ec-bafb-654e83405416', + }, + ]; + + it('throws unauthorized for a user without MESSAGES permission', async () => { + applicationContext.getCurrentUser.mockReturnValue({ + role: ROLES.petitioner, + userId: '9bd0308c-2b06-4589-b36e-242398bea31b', + }); + + await expect( + completeCaseMessageInteractor({ + applicationContext, + }), + ).rejects.toThrow(UnauthorizedError); + }); + + it('calls persistence methods to mark the thread as replied to and complete the most recent message', async () => { + applicationContext.getCurrentUser.mockReturnValue({ + role: ROLES.petitionsClerk, + userId: 'b9fcabc8-3c83-4cbf-9f4a-d2ecbdc591e1', + }); + applicationContext.getPersistenceGateway().getUserById.mockReturnValue({ + name: 'Test Petitionsclerk', + role: ROLES.petitionsClerk, + section: 'petitions', + userId: 'b9fcabc8-3c83-4cbf-9f4a-d2ecbdc591e1', + }); + applicationContext + .getPersistenceGateway() + .getCaseMessageThreadByParentId.mockReturnValue(mockCaseMessages); + applicationContext + .getPersistenceGateway() + .updateCaseMessage.mockResolvedValue(mockCaseMessages[1]); + + const PARENT_MESSAGE_ID = 'b8ff88da-89fe-46a6-bc37-dc2100c7b2bd'; + + await completeCaseMessageInteractor({ + applicationContext, + message: 'the completed message', + parentMessageId: PARENT_MESSAGE_ID, + }); + + expect( + applicationContext.getPersistenceGateway().markCaseMessageThreadRepliedTo, + ).toBeCalled(); + expect( + applicationContext.getPersistenceGateway().markCaseMessageThreadRepliedTo + .mock.calls[0][0].parentMessageId, + ).toEqual(PARENT_MESSAGE_ID); + expect( + applicationContext.getPersistenceGateway().updateCaseMessage, + ).toBeCalled(); + expect( + applicationContext.getPersistenceGateway().updateCaseMessage.mock + .calls[0][0].caseMessage, + ).toMatchObject({ + completedBy: 'Test Petitionsclerk', + completedBySection: 'petitions', + completedByUserId: 'b9fcabc8-3c83-4cbf-9f4a-d2ecbdc591e1', + isCompleted: true, + }); + }); +}); diff --git a/shared/src/business/useCases/messages/createCaseMessageInteractor.js b/shared/src/business/useCases/messages/createCaseMessageInteractor.js index f154a851cb6..3f60091148f 100644 --- a/shared/src/business/useCases/messages/createCaseMessageInteractor.js +++ b/shared/src/business/useCases/messages/createCaseMessageInteractor.js @@ -34,7 +34,6 @@ exports.createCaseMessageInteractor = async ({ throw new UnauthorizedError('Unauthorized'); } - // TODO: Would it be better to just pass this in since case detail is already loaded in the action? const { caseCaption, docketNumber, diff --git a/shared/src/business/useCases/messages/createCaseMessageInteractor.test.js b/shared/src/business/useCases/messages/createCaseMessageInteractor.test.js index dd5b388e62e..a188403703c 100644 --- a/shared/src/business/useCases/messages/createCaseMessageInteractor.test.js +++ b/shared/src/business/useCases/messages/createCaseMessageInteractor.test.js @@ -32,6 +32,7 @@ describe('createCaseMessageInteractor', () => { }, ], caseId: '7a130321-0a76-43bc-b3eb-64a18f07987d', + isRepliedTo: false, message: "How's it going?", subject: 'Hey!', toSection: 'petitions', diff --git a/shared/src/business/useCases/messages/forwardCaseMessageInteractor.js b/shared/src/business/useCases/messages/forwardCaseMessageInteractor.js new file mode 100644 index 00000000000..f8e7dc952c3 --- /dev/null +++ b/shared/src/business/useCases/messages/forwardCaseMessageInteractor.js @@ -0,0 +1,37 @@ +const { replyToMessage } = require('./replyToCaseMessageInteractor'); + +/** + * forwards a case message + * + * @param {object} providers the providers object + * @param {object} providers.applicationContext the application context + * @param {array} providers.attachments array of objects containing documentId and documentTitle + * @param {string} providers.caseId the id of the case + * @param {string} providers.message the message text + * @param {string} providers.parentMessageId the id of the parent message for the thread + * @param {string} providers.subject the message subject + * @param {string} providers.toSection the section of the user receiving the message + * @param {string} providers.toUserId the user id of the user receiving the message + * @returns {object} the case message + */ +exports.forwardCaseMessageInteractor = async ({ + applicationContext, + attachments, + caseId, + message, + parentMessageId, + subject, + toSection, + toUserId, +}) => { + return await replyToMessage({ + applicationContext, + attachments, + caseId, + message, + parentMessageId, + subject, + toSection, + toUserId, + }); +}; diff --git a/shared/src/business/useCases/messages/getCaseMessageThreadInteractor.js b/shared/src/business/useCases/messages/getCaseMessageThreadInteractor.js new file mode 100644 index 00000000000..11208ba201f --- /dev/null +++ b/shared/src/business/useCases/messages/getCaseMessageThreadInteractor.js @@ -0,0 +1,36 @@ +const { + isAuthorized, + ROLE_PERMISSIONS, +} = require('../../../authorization/authorizationClientService'); +const { CaseMessage } = require('../../entities/CaseMessage'); +const { UnauthorizedError } = require('../../../errors/errors'); + +/** + * gets a case message thread by parent id + * + * @param {object} providers the providers object + * @param {object} providers.applicationContext the application context + * @param {string} providers.parentMessageId the id of the parent message for the thread + * @returns {object} the case message + */ +exports.getCaseMessageThreadInteractor = async ({ + applicationContext, + parentMessageId, +}) => { + const authorizedUser = applicationContext.getCurrentUser(); + + if (!isAuthorized(authorizedUser, ROLE_PERMISSIONS.MESSAGES)) { + throw new UnauthorizedError('Unauthorized'); + } + + const caseMessages = await applicationContext + .getPersistenceGateway() + .getCaseMessageThreadByParentId({ + applicationContext, + parentMessageId, + }); + + return CaseMessage.validateRawCollection(caseMessages, { + applicationContext, + }); +}; diff --git a/shared/src/business/useCases/messages/getCaseMessageThreadInteractor.test.js b/shared/src/business/useCases/messages/getCaseMessageThreadInteractor.test.js new file mode 100644 index 00000000000..33df432a10e --- /dev/null +++ b/shared/src/business/useCases/messages/getCaseMessageThreadInteractor.test.js @@ -0,0 +1,64 @@ +const { + applicationContext, +} = require('../../test/createTestApplicationContext'); +const { + getCaseMessageThreadInteractor, +} = require('./getCaseMessageThreadInteractor'); +const { ROLES } = require('../../entities/EntityConstants'); +const { UnauthorizedError } = require('../../../errors/errors'); + +describe('getCaseMessageThreadInteractor', () => { + it('throws unauthorized for a user without MESSAGES permission', async () => { + applicationContext.getCurrentUser.mockReturnValue({ + role: ROLES.petitioner, + userId: '9bd0308c-2b06-4589-b36e-242398bea31b', + }); + + await expect( + getCaseMessageThreadInteractor({ + applicationContext, + }), + ).rejects.toThrow(UnauthorizedError); + }); + + it('retrieves the case message thread from persistence and returns it', async () => { + const mockCaseMessage = { + attachments: [], + caseId: '7a130321-0a76-43bc-b3eb-64a18f07987d', + caseStatus: 'General Docket - Not at Issue', + caseTitle: 'Bill Burr', + createdAt: '2019-03-01T21:40:46.415Z', + docketNumber: '123-45', + docketNumberWithSuffix: '123-45S', + entityName: 'CaseMessage', + from: 'Test Petitionsclerk2', + fromSection: 'petitions', + fromUserId: 'fe6eeadd-e4e8-4e56-9ddf-0ebe9516df6b', + isRepliedTo: false, + message: "How's it going?", + messageId: '9ca37b65-9aac-4621-b5d7-e4a7c8a26a21', + parentMessageId: '9ca37b65-9aac-4621-b5d7-e4a7c8a26a21', + subject: 'Hey!', + to: 'Test Petitionsclerk', + toSection: 'petitions', + toUserId: 'b427ca37-0df1-48ac-94bb-47aed073d6f7', + }; + applicationContext.getCurrentUser.mockReturnValue({ + role: ROLES.petitionsClerk, + userId: 'b9fcabc8-3c83-4cbf-9f4a-d2ecbdc591e1', + }); + applicationContext + .getPersistenceGateway() + .getCaseMessageThreadByParentId.mockReturnValue([mockCaseMessage]); + + const returnedMessage = await getCaseMessageThreadInteractor({ + applicationContext, + messageId: mockCaseMessage.messageId, + }); + + expect( + applicationContext.getPersistenceGateway().getCaseMessageThreadByParentId, + ).toBeCalled(); + expect(returnedMessage).toMatchObject([mockCaseMessage]); + }); +}); diff --git a/shared/src/business/useCases/messages/getCaseMessageInteractor.js b/shared/src/business/useCases/messages/getCaseMessagesForCaseInteractor.js similarity index 66% rename from shared/src/business/useCases/messages/getCaseMessageInteractor.js rename to shared/src/business/useCases/messages/getCaseMessagesForCaseInteractor.js index cdd549358e6..8c3251e1b94 100644 --- a/shared/src/business/useCases/messages/getCaseMessageInteractor.js +++ b/shared/src/business/useCases/messages/getCaseMessagesForCaseInteractor.js @@ -6,16 +6,16 @@ const { CaseMessage } = require('../../entities/CaseMessage'); const { UnauthorizedError } = require('../../../errors/errors'); /** - * gets a case message + * gets case messages for a case * * @param {object} providers the providers object * @param {object} providers.applicationContext the application context - * @param {string} providers.messageId the id of the message to retrieve + * @param {string} providers.caseId the id of the case * @returns {object} the case message */ -exports.getCaseMessageInteractor = async ({ +exports.getCaseMessagesForCaseInteractor = async ({ applicationContext, - messageId, + caseId, }) => { const authorizedUser = applicationContext.getCurrentUser(); @@ -23,14 +23,14 @@ exports.getCaseMessageInteractor = async ({ throw new UnauthorizedError('Unauthorized'); } - const caseMessage = await applicationContext + const caseMessages = await applicationContext .getPersistenceGateway() - .getCaseMessageById({ + .getCaseMessagesByCaseId({ applicationContext, - messageId, + caseId, }); - return new CaseMessage(caseMessage, { applicationContext }) - .validate() - .toRawObject(); + return CaseMessage.validateRawCollection(caseMessages, { + applicationContext, + }); }; diff --git a/shared/src/business/useCases/messages/getCaseMessageInteractor.test.js b/shared/src/business/useCases/messages/getCaseMessagesForCaseInteractor.test.js similarity index 64% rename from shared/src/business/useCases/messages/getCaseMessageInteractor.test.js rename to shared/src/business/useCases/messages/getCaseMessagesForCaseInteractor.test.js index dd7e9b95527..b65155fb9da 100644 --- a/shared/src/business/useCases/messages/getCaseMessageInteractor.test.js +++ b/shared/src/business/useCases/messages/getCaseMessagesForCaseInteractor.test.js @@ -2,12 +2,12 @@ const { applicationContext, } = require('../../test/createTestApplicationContext'); const { - UnauthorizedError, -} = require('../../../../../shared/src/errors/errors'); -const { getCaseMessageInteractor } = require('./getCaseMessageInteractor'); + getCaseMessagesForCaseInteractor, +} = require('./getCaseMessagesForCaseInteractor'); const { ROLES } = require('../../entities/EntityConstants'); +const { UnauthorizedError } = require('../../../errors/errors'); -describe('getCaseMessageInteractor', () => { +describe('getCaseMessagesForCaseInteractor', () => { it('throws unauthorized for a user without MESSAGES permission', async () => { applicationContext.getCurrentUser.mockReturnValue({ role: ROLES.petitioner, @@ -15,17 +15,18 @@ describe('getCaseMessageInteractor', () => { }); await expect( - getCaseMessageInteractor({ + getCaseMessagesForCaseInteractor({ applicationContext, }), ).rejects.toThrow(UnauthorizedError); }); - it('retrieves the case message from persistence and returns it', async () => { - const caseMessageData = { + it('retrieves the case messages from persistence and returns them', async () => { + const mockCaseMessage = { attachments: [], caseId: '7a130321-0a76-43bc-b3eb-64a18f07987d', caseStatus: 'General Docket - Not at Issue', + caseTitle: 'Bill Burr', createdAt: '2019-03-01T21:40:46.415Z', docketNumber: '123-45', docketNumberWithSuffix: '123-45S', @@ -33,8 +34,10 @@ describe('getCaseMessageInteractor', () => { from: 'Test Petitionsclerk2', fromSection: 'petitions', fromUserId: 'fe6eeadd-e4e8-4e56-9ddf-0ebe9516df6b', + isRepliedTo: false, message: "How's it going?", messageId: '9ca37b65-9aac-4621-b5d7-e4a7c8a26a21', + parentMessageId: '9ca37b65-9aac-4621-b5d7-e4a7c8a26a21', subject: 'Hey!', to: 'Test Petitionsclerk', toSection: 'petitions', @@ -46,16 +49,16 @@ describe('getCaseMessageInteractor', () => { }); applicationContext .getPersistenceGateway() - .getCaseMessageById.mockReturnValue(caseMessageData); + .getCaseMessagesByCaseId.mockReturnValue([mockCaseMessage]); - const returnedMessage = await getCaseMessageInteractor({ + const returnedMessage = await getCaseMessagesForCaseInteractor({ applicationContext, - messageId: caseMessageData.messageId, + messageId: mockCaseMessage.messageId, }); expect( - applicationContext.getPersistenceGateway().getCaseMessageById, + applicationContext.getPersistenceGateway().getCaseMessagesByCaseId, ).toBeCalled(); - expect(returnedMessage).toEqual(caseMessageData); + expect(returnedMessage).toMatchObject([mockCaseMessage]); }); }); diff --git a/shared/src/business/useCases/messages/getCompletedCaseMessagesForSectionInteractor.js b/shared/src/business/useCases/messages/getCompletedCaseMessagesForSectionInteractor.js new file mode 100644 index 00000000000..65fff2ff3b3 --- /dev/null +++ b/shared/src/business/useCases/messages/getCompletedCaseMessagesForSectionInteractor.js @@ -0,0 +1,36 @@ +const { + isAuthorized, + ROLE_PERMISSIONS, +} = require('../../../authorization/authorizationClientService'); +const { CaseMessage } = require('../../entities/CaseMessage'); +const { UnauthorizedError } = require('../../../errors/errors'); + +/** + * getCompletedCaseMessagesForSectionInteractor + * + * @param {object} providers the providers object + * @param {object} providers.applicationContext the application context + * @param {string} providers.section the section to get the inbox messages + * @returns {object} the messages in the user inbox + */ +exports.getCompletedCaseMessagesForSectionInteractor = async ({ + applicationContext, + section, +}) => { + const authorizedUser = applicationContext.getCurrentUser(); + + if (!isAuthorized(authorizedUser, ROLE_PERMISSIONS.MESSAGES)) { + throw new UnauthorizedError('Unauthorized'); + } + + const messages = await applicationContext + .getPersistenceGateway() + .getCompletedSectionInboxMessages({ + applicationContext, + section, + }); + + return CaseMessage.validateRawCollection(messages, { + applicationContext, + }); +}; diff --git a/shared/src/business/useCases/messages/getCompletedCaseMessagesForSectionInteractor.test.js b/shared/src/business/useCases/messages/getCompletedCaseMessagesForSectionInteractor.test.js new file mode 100644 index 00000000000..d81ebf902cf --- /dev/null +++ b/shared/src/business/useCases/messages/getCompletedCaseMessagesForSectionInteractor.test.js @@ -0,0 +1,77 @@ +const { + applicationContext, +} = require('../../test/createTestApplicationContext'); +const { + getCompletedCaseMessagesForSectionInteractor, +} = require('./getCompletedCaseMessagesForSectionInteractor'); +const { + UnauthorizedError, +} = require('../../../../../shared/src/errors/errors'); +const { omit } = require('lodash'); +const { ROLES } = require('../../entities/EntityConstants'); + +describe('getCompletedCaseMessagesForSectionInteractor', () => { + it('throws unauthorized for a user without MESSAGES permission', async () => { + applicationContext.getCurrentUser.mockReturnValue({ + role: ROLES.petitioner, + userId: '9bd0308c-2b06-4589-b36e-242398bea31b', + }); + + await expect( + getCompletedCaseMessagesForSectionInteractor({ + applicationContext, + }), + ).rejects.toThrow(UnauthorizedError); + }); + + it('retrieves the case messages from persistence and returns them', async () => { + const caseMessageData = { + attachments: [], + caseId: '7a130321-0a76-43bc-b3eb-64a18f07987d', + caseStatus: 'General Docket - Not at Issue', + caseTitle: 'Bill Burr', + completedAt: '2019-05-01T21:40:46.415Z', + completedBy: 'Test Petitionsclerk', + completedBySection: 'petitions', + completedByUserId: '21d7cd77-43e5-4713-92d4-aef69b5f72fd', + createdAt: '2019-03-01T21:40:46.415Z', + docketNumber: '123-45', + docketNumberWithSuffix: '123-45S', + entityName: 'CaseMessage', + from: 'Test Petitionsclerk2', + fromSection: 'petitions', + fromUserId: 'fe6eeadd-e4e8-4e56-9ddf-0ebe9516df6b', + isCompleted: true, + isRepliedTo: false, + message: "How's it going?", + messageId: '9ca37b65-9aac-4621-b5d7-e4a7c8a26a21', + parentMessageId: '9ca37b65-9aac-4621-b5d7-e4a7c8a26a21', + pk: 'case|9ca37b65-9aac-4621-b5d7-e4a7c8a26a21', + sk: 'message|9ca37b65-9aac-4621-b5d7-e4a7c8a26a21', + subject: 'Hey!', + to: 'Test Petitionsclerk', + toSection: 'petitions', + toUserId: 'b427ca37-0df1-48ac-94bb-47aed073d6f7', + }; + applicationContext.getCurrentUser.mockReturnValue({ + role: ROLES.petitionsClerk, + userId: 'b9fcabc8-3c83-4cbf-9f4a-d2ecbdc591e1', + }); + applicationContext + .getPersistenceGateway() + .getCompletedSectionInboxMessages.mockReturnValue([caseMessageData]); + + const returnedMessages = await getCompletedCaseMessagesForSectionInteractor( + { + applicationContext, + section: caseMessageData.section, + }, + ); + + expect( + applicationContext.getPersistenceGateway() + .getCompletedSectionInboxMessages, + ).toBeCalled(); + expect(returnedMessages).toMatchObject([omit(caseMessageData, 'pk', 'sk')]); + }); +}); diff --git a/shared/src/business/useCases/messages/getCompletedCaseMessagesForUserInteractor.js b/shared/src/business/useCases/messages/getCompletedCaseMessagesForUserInteractor.js new file mode 100644 index 00000000000..9fd1ccf0685 --- /dev/null +++ b/shared/src/business/useCases/messages/getCompletedCaseMessagesForUserInteractor.js @@ -0,0 +1,36 @@ +const { + isAuthorized, + ROLE_PERMISSIONS, +} = require('../../../authorization/authorizationClientService'); +const { CaseMessage } = require('../../entities/CaseMessage'); +const { UnauthorizedError } = require('../../../errors/errors'); + +/** + * getCompletedCaseMessagesForUserInteractor + * + * @param {object} providers the providers object + * @param {object} providers.applicationContext the application context + * @param {string} providers.userId the user to get the inbox messages + * @returns {object} the messages in the user inbox + */ +exports.getCompletedCaseMessagesForUserInteractor = async ({ + applicationContext, + userId, +}) => { + const authorizedUser = applicationContext.getCurrentUser(); + + if (!isAuthorized(authorizedUser, ROLE_PERMISSIONS.MESSAGES)) { + throw new UnauthorizedError('Unauthorized'); + } + + const messages = await applicationContext + .getPersistenceGateway() + .getCompletedUserInboxMessages({ + applicationContext, + userId, + }); + + return CaseMessage.validateRawCollection(messages, { + applicationContext, + }); +}; diff --git a/shared/src/business/useCases/messages/getCompletedCaseMessagesForUserInteractor.test.js b/shared/src/business/useCases/messages/getCompletedCaseMessagesForUserInteractor.test.js new file mode 100644 index 00000000000..a21cddceb64 --- /dev/null +++ b/shared/src/business/useCases/messages/getCompletedCaseMessagesForUserInteractor.test.js @@ -0,0 +1,74 @@ +const { + applicationContext, +} = require('../../test/createTestApplicationContext'); +const { + getCompletedCaseMessagesForUserInteractor, +} = require('./getCompletedCaseMessagesForUserInteractor'); +const { + UnauthorizedError, +} = require('../../../../../shared/src/errors/errors'); +const { omit } = require('lodash'); +const { ROLES } = require('../../entities/EntityConstants'); + +describe('getCompletedCaseMessagesForUserInteractor', () => { + it('throws unauthorized for a user without MESSAGES permission', async () => { + applicationContext.getCurrentUser.mockReturnValue({ + role: ROLES.petitioner, + userId: '9bd0308c-2b06-4589-b36e-242398bea31b', + }); + + await expect( + getCompletedCaseMessagesForUserInteractor({ + applicationContext, + }), + ).rejects.toThrow(UnauthorizedError); + }); + + it('retrieves the case messages from persistence and returns them', async () => { + const caseMessageData = { + attachments: [], + caseId: '7a130321-0a76-43bc-b3eb-64a18f07987d', + caseStatus: 'General Docket - Not at Issue', + caseTitle: 'Bill Burr', + completedAt: '2019-05-01T21:40:46.415Z', + completedBy: 'Test Petitionsclerk', + completedBySection: 'petitions', + completedByUserId: '21d7cd77-43e5-4713-92d4-aef69b5f72fd', + createdAt: '2019-03-01T21:40:46.415Z', + docketNumber: '123-45', + docketNumberWithSuffix: '123-45S', + entityName: 'CaseMessage', + from: 'Test Petitionsclerk2', + fromSection: 'petitions', + fromUserId: 'fe6eeadd-e4e8-4e56-9ddf-0ebe9516df6b', + isCompleted: true, + isRepliedTo: false, + message: "How's it going?", + messageId: '9ca37b65-9aac-4621-b5d7-e4a7c8a26a21', + parentMessageId: '9ca37b65-9aac-4621-b5d7-e4a7c8a26a21', + pk: 'case|9ca37b65-9aac-4621-b5d7-e4a7c8a26a21', + sk: 'message|9ca37b65-9aac-4621-b5d7-e4a7c8a26a21', + subject: 'Hey!', + to: 'Test Petitionsclerk', + toSection: 'petitions', + toUserId: 'b427ca37-0df1-48ac-94bb-47aed073d6f7', + }; + applicationContext.getCurrentUser.mockReturnValue({ + role: ROLES.petitionsClerk, + userId: 'b9fcabc8-3c83-4cbf-9f4a-d2ecbdc591e1', + }); + applicationContext + .getPersistenceGateway() + .getCompletedUserInboxMessages.mockReturnValue([caseMessageData]); + + const returnedMessages = await getCompletedCaseMessagesForUserInteractor({ + applicationContext, + userId: caseMessageData.completedByUserId, + }); + + expect( + applicationContext.getPersistenceGateway().getCompletedUserInboxMessages, + ).toBeCalled(); + expect(returnedMessages).toMatchObject([omit(caseMessageData, 'pk', 'sk')]); + }); +}); diff --git a/shared/src/business/useCases/messages/getInboxCaseMessagesForSectionInteractor.test.js b/shared/src/business/useCases/messages/getInboxCaseMessagesForSectionInteractor.test.js index 93055446ff3..64a94b5fcdc 100644 --- a/shared/src/business/useCases/messages/getInboxCaseMessagesForSectionInteractor.test.js +++ b/shared/src/business/useCases/messages/getInboxCaseMessagesForSectionInteractor.test.js @@ -28,6 +28,8 @@ describe('getInboxCaseMessagesForSectionInteractor', () => { const caseMessageData = { attachments: [], caseId: '7a130321-0a76-43bc-b3eb-64a18f07987d', + caseStatus: 'General Docket - Not at Issue', + caseTitle: 'Bill Burr', createdAt: '2019-03-01T21:40:46.415Z', docketNumber: '123-45', docketNumberWithSuffix: '123-45S', @@ -35,8 +37,10 @@ describe('getInboxCaseMessagesForSectionInteractor', () => { from: 'Test Petitionsclerk2', fromSection: 'petitions', fromUserId: 'fe6eeadd-e4e8-4e56-9ddf-0ebe9516df6b', + isRepliedTo: false, message: "How's it going?", messageId: '9ca37b65-9aac-4621-b5d7-e4a7c8a26a21', + parentMessageId: '9ca37b65-9aac-4621-b5d7-e4a7c8a26a21', pk: 'case|9ca37b65-9aac-4621-b5d7-e4a7c8a26a21', sk: 'message|9ca37b65-9aac-4621-b5d7-e4a7c8a26a21', subject: 'Hey!', @@ -60,6 +64,6 @@ describe('getInboxCaseMessagesForSectionInteractor', () => { expect( applicationContext.getPersistenceGateway().getSectionInboxMessages, ).toBeCalled(); - expect(returnedMessages).toEqual([omit(caseMessageData, 'pk', 'sk')]); + expect(returnedMessages).toMatchObject([omit(caseMessageData, 'pk', 'sk')]); }); }); diff --git a/shared/src/business/useCases/messages/getInboxCaseMessagesForUserInteractor.test.js b/shared/src/business/useCases/messages/getInboxCaseMessagesForUserInteractor.test.js index 34d0ffb9a7d..054b6588775 100644 --- a/shared/src/business/useCases/messages/getInboxCaseMessagesForUserInteractor.test.js +++ b/shared/src/business/useCases/messages/getInboxCaseMessagesForUserInteractor.test.js @@ -28,6 +28,8 @@ describe('getInboxCaseMessagesForUserInteractor', () => { const caseMessageData = { attachments: [], caseId: '7a130321-0a76-43bc-b3eb-64a18f07987d', + caseStatus: 'General Docket - Not at Issue', + caseTitle: 'Bill Burr', createdAt: '2019-03-01T21:40:46.415Z', docketNumber: '123-45', docketNumberWithSuffix: '123-45S', @@ -35,8 +37,10 @@ describe('getInboxCaseMessagesForUserInteractor', () => { from: 'Test Petitionsclerk2', fromSection: 'petitions', fromUserId: 'fe6eeadd-e4e8-4e56-9ddf-0ebe9516df6b', + isRepliedTo: false, message: "How's it going?", messageId: '9ca37b65-9aac-4621-b5d7-e4a7c8a26a21', + parentMessageId: '9ca37b65-9aac-4621-b5d7-e4a7c8a26a21', pk: 'case|9ca37b65-9aac-4621-b5d7-e4a7c8a26a21', sk: 'message|9ca37b65-9aac-4621-b5d7-e4a7c8a26a21', subject: 'Hey!', @@ -60,6 +64,6 @@ describe('getInboxCaseMessagesForUserInteractor', () => { expect( applicationContext.getPersistenceGateway().getUserInboxMessages, ).toBeCalled(); - expect(returnedMessages).toEqual([omit(caseMessageData, 'pk', 'sk')]); + expect(returnedMessages).toMatchObject([omit(caseMessageData, 'pk', 'sk')]); }); }); diff --git a/shared/src/business/useCases/messages/getOutboxCaseMessagesForSectionInteractor.test.js b/shared/src/business/useCases/messages/getOutboxCaseMessagesForSectionInteractor.test.js index 804a67630f2..9e7e757f014 100644 --- a/shared/src/business/useCases/messages/getOutboxCaseMessagesForSectionInteractor.test.js +++ b/shared/src/business/useCases/messages/getOutboxCaseMessagesForSectionInteractor.test.js @@ -28,6 +28,8 @@ describe('getOutboxCaseMessagesForSectionInteractor', () => { const caseMessageData = { attachments: [], caseId: '7a130321-0a76-43bc-b3eb-64a18f07987d', + caseStatus: 'General Docket - Not at Issue', + caseTitle: 'Bill Burr', createdAt: '2019-03-01T21:40:46.415Z', docketNumber: '123-45', docketNumberWithSuffix: '123-45S', @@ -35,8 +37,10 @@ describe('getOutboxCaseMessagesForSectionInteractor', () => { from: 'Test Petitionsclerk2', fromSection: 'petitions', fromUserId: 'fe6eeadd-e4e8-4e56-9ddf-0ebe9516df6b', + isRepliedTo: false, message: "How's it going?", messageId: '9ca37b65-9aac-4621-b5d7-e4a7c8a26a21', + parentMessageId: '9ca37b65-9aac-4621-b5d7-e4a7c8a26a21', pk: 'case|9ca37b65-9aac-4621-b5d7-e4a7c8a26a21', sk: 'message|9ca37b65-9aac-4621-b5d7-e4a7c8a26a21', subject: 'Hey!', @@ -60,6 +64,6 @@ describe('getOutboxCaseMessagesForSectionInteractor', () => { expect( applicationContext.getPersistenceGateway().getSectionOutboxMessages, ).toBeCalled(); - expect(returnedMessages).toEqual([omit(caseMessageData, 'pk', 'sk')]); + expect(returnedMessages).toMatchObject([omit(caseMessageData, 'pk', 'sk')]); }); }); diff --git a/shared/src/business/useCases/messages/getOutboxCaseMessagesForUserInteractor.test.js b/shared/src/business/useCases/messages/getOutboxCaseMessagesForUserInteractor.test.js index 95628a5c3f1..60be54a5d05 100644 --- a/shared/src/business/useCases/messages/getOutboxCaseMessagesForUserInteractor.test.js +++ b/shared/src/business/useCases/messages/getOutboxCaseMessagesForUserInteractor.test.js @@ -28,6 +28,8 @@ describe('getOutboxCaseMessagesForUserInteractor', () => { const caseMessageData = { attachments: [], caseId: '7a130321-0a76-43bc-b3eb-64a18f07987d', + caseStatus: 'General Docket - Not at Issue', + caseTitle: 'Bill Burr', createdAt: '2019-03-01T21:40:46.415Z', docketNumber: '123-45', docketNumberWithSuffix: '123-45S', @@ -35,8 +37,10 @@ describe('getOutboxCaseMessagesForUserInteractor', () => { from: 'Test Petitionsclerk2', fromSection: 'petitions', fromUserId: 'fe6eeadd-e4e8-4e56-9ddf-0ebe9516df6b', + isRepliedTo: false, message: "How's it going?", messageId: '9ca37b65-9aac-4621-b5d7-e4a7c8a26a21', + parentMessageId: '9ca37b65-9aac-4621-b5d7-e4a7c8a26a21', pk: 'case|9ca37b65-9aac-4621-b5d7-e4a7c8a26a21', sk: 'message|9ca37b65-9aac-4621-b5d7-e4a7c8a26a21', subject: 'Hey!', @@ -60,6 +64,6 @@ describe('getOutboxCaseMessagesForUserInteractor', () => { expect( applicationContext.getPersistenceGateway().getUserOutboxMessages, ).toBeCalled(); - expect(returnedMessages).toEqual([omit(caseMessageData, 'pk', 'sk')]); + expect(returnedMessages).toMatchObject([omit(caseMessageData, 'pk', 'sk')]); }); }); diff --git a/shared/src/business/useCases/messages/replyToCaseMessageInteractor.js b/shared/src/business/useCases/messages/replyToCaseMessageInteractor.js new file mode 100644 index 00000000000..cc9604c1380 --- /dev/null +++ b/shared/src/business/useCases/messages/replyToCaseMessageInteractor.js @@ -0,0 +1,116 @@ +const { + isAuthorized, + ROLE_PERMISSIONS, +} = require('../../../authorization/authorizationClientService'); +const { Case } = require('../../entities/cases/Case'); +const { CaseMessage } = require('../../entities/CaseMessage'); +const { UnauthorizedError } = require('../../../errors/errors'); + +const replyToMessage = async ({ + applicationContext, + attachments, + caseId, + message, + parentMessageId, + subject, + toSection, + toUserId, +}) => { + const authorizedUser = applicationContext.getCurrentUser(); + + if (!isAuthorized(authorizedUser, ROLE_PERMISSIONS.MESSAGES)) { + throw new UnauthorizedError('Unauthorized'); + } + + await applicationContext + .getPersistenceGateway() + .markCaseMessageThreadRepliedTo({ + applicationContext, + parentMessageId, + }); + + const { + caseCaption, + docketNumber, + docketNumberWithSuffix, + status, + } = await applicationContext + .getPersistenceGateway() + .getCaseByCaseId({ applicationContext, caseId }); + + const fromUser = await applicationContext + .getPersistenceGateway() + .getUserById({ applicationContext, userId: authorizedUser.userId }); + + const toUser = await applicationContext + .getPersistenceGateway() + .getUserById({ applicationContext, userId: toUserId }); + + const caseMessage = new CaseMessage( + { + attachments, + caseId, + caseStatus: status, + caseTitle: Case.getCaseTitle(caseCaption), + docketNumber, + docketNumberWithSuffix, + from: fromUser.name, + fromSection: fromUser.section, + fromUserId: fromUser.userId, + message, + parentMessageId, + subject, + to: toUser.name, + toSection, + toUserId, + }, + { applicationContext }, + ) + .validate() + .toRawObject(); + + await applicationContext.getPersistenceGateway().createCaseMessage({ + applicationContext, + caseMessage, + }); + + return caseMessage; +}; + +exports.replyToMessage = replyToMessage; + +/** + * replies to a case message + * + * @param {object} providers the providers object + * @param {object} providers.applicationContext the application context + * @param {array} providers.attachments array of objects containing documentId and documentTitle + * @param {string} providers.caseId the id of the case + * @param {string} providers.message the message text + * @param {string} providers.parentMessageId the id of the parent message for the thread + * @param {string} providers.subject the message subject + * @param {string} providers.toSection the section of the user receiving the message + * @param {string} providers.toUserId the user id of the user receiving the message + * @returns {object} the case message + */ +exports.replyToCaseMessageInteractor = async ({ + applicationContext, + attachments, + caseId, + message, + parentMessageId, + subject, + toSection, + toUserId, +}) => { + return await replyToMessage({ + applicationContext, + attachments, + caseId, + message, + parentMessageId, + subject, + toSection, + toUserId, + }); +}; diff --git a/shared/src/business/useCases/messages/replyToCaseMessageInteractor.test.js b/shared/src/business/useCases/messages/replyToCaseMessageInteractor.test.js new file mode 100644 index 00000000000..f176deae74a --- /dev/null +++ b/shared/src/business/useCases/messages/replyToCaseMessageInteractor.test.js @@ -0,0 +1,99 @@ +const { + applicationContext, +} = require('../../test/createTestApplicationContext'); +const { + replyToCaseMessageInteractor, +} = require('./replyToCaseMessageInteractor'); +const { + UnauthorizedError, +} = require('../../../../../shared/src/errors/errors'); +const { ROLES } = require('../../entities/EntityConstants'); + +describe('replyToCaseMessageInteractor', () => { + it('throws unauthorized for a user without MESSAGES permission', async () => { + applicationContext.getCurrentUser.mockReturnValue({ + role: ROLES.petitioner, + userId: '9bd0308c-2b06-4589-b36e-242398bea31b', + }); + + await expect( + replyToCaseMessageInteractor({ + applicationContext, + }), + ).rejects.toThrow(UnauthorizedError); + }); + + it('creates the case message reply and marks the parent message as replied to', async () => { + const caseMessageData = { + attachments: [ + { + documentId: 'b1130321-0a76-43bc-b3eb-64a18f079873', + documentTitle: 'Petition', + }, + ], + caseId: '7a130321-0a76-43bc-b3eb-64a18f07987d', + message: "How's it going?", + parentMessageId: '62ea7e6e-8101-4e4b-9bbd-932b149c86c3', + subject: 'Hey!', + toSection: 'petitions', + toUserId: 'b427ca37-0df1-48ac-94bb-47aed073d6f7', + }; + applicationContext.getCurrentUser.mockReturnValue({ + role: ROLES.petitionsClerk, + userId: 'b9fcabc8-3c83-4cbf-9f4a-d2ecbdc591e1', + }); + applicationContext + .getPersistenceGateway() + .getUserById.mockReturnValueOnce({ + name: 'Test Petitionsclerk', + role: ROLES.petitionsClerk, + section: 'petitions', + userId: 'b9fcabc8-3c83-4cbf-9f4a-d2ecbdc591e1', + }) + .mockReturnValueOnce({ + name: 'Test Petitionsclerk2', + role: ROLES.petitionsClerk, + section: 'petitions', + userId: 'd90c8a79-9628-4ca9-97c6-02a161a02904', + }); + + applicationContext.getPersistenceGateway().getCaseByCaseId.mockReturnValue({ + caseCaption: 'Guy Fieri, Petitioner', + docketNumber: '123-45', + docketNumberWithSuffix: '123-45S', + status: 'General Docket - Not at Issue', + }); + + await replyToCaseMessageInteractor({ + applicationContext, + ...caseMessageData, + }); + + expect( + applicationContext.getPersistenceGateway().createCaseMessage, + ).toBeCalled(); + expect( + applicationContext.getPersistenceGateway().createCaseMessage.mock + .calls[0][0].caseMessage, + ).toMatchObject({ + ...caseMessageData, + caseStatus: 'General Docket - Not at Issue', + caseTitle: 'Guy Fieri', + docketNumber: '123-45', + docketNumberWithSuffix: '123-45S', + from: 'Test Petitionsclerk', + fromSection: 'petitions', + fromUserId: 'b9fcabc8-3c83-4cbf-9f4a-d2ecbdc591e1', + to: 'Test Petitionsclerk2', + }); + expect( + applicationContext.getPersistenceGateway().markCaseMessageThreadRepliedTo, + ).toBeCalled(); + expect( + applicationContext.getPersistenceGateway().markCaseMessageThreadRepliedTo + .mock.calls[0][0], + ).toMatchObject({ + parentMessageId: caseMessageData.parentMessageId, + }); + }); +}); diff --git a/shared/src/business/useCases/opinionAdvancedSearchInteractor.js b/shared/src/business/useCases/opinionAdvancedSearchInteractor.js index fc002f73d08..7f9b755063c 100644 --- a/shared/src/business/useCases/opinionAdvancedSearchInteractor.js +++ b/shared/src/business/useCases/opinionAdvancedSearchInteractor.js @@ -6,7 +6,7 @@ const { ROLE_PERMISSIONS, } = require('../../authorization/authorizationClientService'); const { - OPINION_DOCUMENT_TYPES, + OPINION_EVENT_CODES, } = require('../../business/entities/EntityConstants'); const { UnauthorizedError } = require('../../errors/errors'); @@ -58,7 +58,7 @@ exports.opinionAdvancedSearchInteractor = async ({ .getPersistenceGateway() .advancedDocumentSearch({ applicationContext, - documentEventCodes: OPINION_DOCUMENT_TYPES, + documentEventCodes: OPINION_EVENT_CODES, judgeType: 'judge', ...rawSearch, }); diff --git a/shared/src/business/useCases/opinionAdvancedSearchInteractor.test.js b/shared/src/business/useCases/opinionAdvancedSearchInteractor.test.js index 7528fe65496..a268dfc36bf 100644 --- a/shared/src/business/useCases/opinionAdvancedSearchInteractor.test.js +++ b/shared/src/business/useCases/opinionAdvancedSearchInteractor.test.js @@ -1,5 +1,5 @@ const { - OPINION_DOCUMENT_TYPES, + OPINION_EVENT_CODES, } = require('../../business/entities/EntityConstants'); const { opinionAdvancedSearchInteractor, @@ -98,7 +98,7 @@ describe('opinionAdvancedSearchInteractor', () => { applicationContext.getPersistenceGateway().advancedDocumentSearch.mock .calls[0][0], ).toMatchObject({ - documentEventCodes: OPINION_DOCUMENT_TYPES, + documentEventCodes: OPINION_EVENT_CODES, }); }); }); diff --git a/shared/src/business/useCases/public/getTodaysOpinionsInteractor.js b/shared/src/business/useCases/public/getTodaysOpinionsInteractor.js index 59eee37bde7..c2cf45a6041 100644 --- a/shared/src/business/useCases/public/getTodaysOpinionsInteractor.js +++ b/shared/src/business/useCases/public/getTodaysOpinionsInteractor.js @@ -4,7 +4,7 @@ const { createStartOfDayISO, deconstructDate, } = require('../../utilities/DateHandler'); -const { OPINION_DOCUMENT_TYPES } = require('../../entities/EntityConstants'); +const { OPINION_EVENT_CODES } = require('../../entities/EntityConstants'); /** * getTodaysOpinionsInteractor @@ -22,7 +22,7 @@ exports.getTodaysOpinionsInteractor = async ({ applicationContext }) => { .getPersistenceGateway() .advancedDocumentSearch({ applicationContext, - documentEventCodes: OPINION_DOCUMENT_TYPES, + documentEventCodes: OPINION_EVENT_CODES, endDate: currentDateEnd, judgeType: 'judge', startDate: currentDateStart, diff --git a/shared/src/business/useCases/public/getTodaysOpinionsInteractor.test.js b/shared/src/business/useCases/public/getTodaysOpinionsInteractor.test.js index 0daa162ee6f..eb425863265 100644 --- a/shared/src/business/useCases/public/getTodaysOpinionsInteractor.test.js +++ b/shared/src/business/useCases/public/getTodaysOpinionsInteractor.test.js @@ -10,7 +10,7 @@ const { const { getTodaysOpinionsInteractor, } = require('./getTodaysOpinionsInteractor'); -const { OPINION_DOCUMENT_TYPES } = require('../../entities/EntityConstants'); +const { OPINION_EVENT_CODES } = require('../../entities/EntityConstants'); describe('getTodaysOpinionsInteractor', () => { const mockOpinionSearchResult = [ @@ -63,7 +63,7 @@ describe('getTodaysOpinionsInteractor', () => { applicationContext.getPersistenceGateway().advancedDocumentSearch.mock .calls[0][0], ).toMatchObject({ - documentEventCodes: OPINION_DOCUMENT_TYPES, + documentEventCodes: OPINION_EVENT_CODES, endDate: currentDateEnd, startDate: currentDateStart, }); diff --git a/shared/src/business/useCases/public/opinionPublicSearchInteractor.js b/shared/src/business/useCases/public/opinionPublicSearchInteractor.js index 81c85349d3d..2924659033b 100644 --- a/shared/src/business/useCases/public/opinionPublicSearchInteractor.js +++ b/shared/src/business/useCases/public/opinionPublicSearchInteractor.js @@ -1,5 +1,5 @@ const { DocumentSearch } = require('../../entities/documents/DocumentSearch'); -const { OPINION_DOCUMENT_TYPES } = require('../../entities/EntityConstants'); +const { OPINION_EVENT_CODES } = require('../../entities/EntityConstants'); /** * opinionPublicSearchInteractor @@ -42,7 +42,7 @@ exports.opinionPublicSearchInteractor = async ({ .getPersistenceGateway() .advancedDocumentSearch({ applicationContext, - documentEventCodes: OPINION_DOCUMENT_TYPES, + documentEventCodes: OPINION_EVENT_CODES, judgeType: 'judge', ...rawSearch, }); diff --git a/shared/src/business/useCases/public/opinionPublicSearchInteractor.test.js b/shared/src/business/useCases/public/opinionPublicSearchInteractor.test.js index e463b4e03ba..8fc8df0b984 100644 --- a/shared/src/business/useCases/public/opinionPublicSearchInteractor.test.js +++ b/shared/src/business/useCases/public/opinionPublicSearchInteractor.test.js @@ -4,7 +4,7 @@ const { const { opinionPublicSearchInteractor, } = require('./opinionPublicSearchInteractor'); -const { OPINION_DOCUMENT_TYPES } = require('../../entities/EntityConstants'); +const { OPINION_EVENT_CODES } = require('../../entities/EntityConstants'); describe('opinionPublicSearchInteractor', () => { const mockOpinionSearchResult = [ @@ -54,7 +54,7 @@ describe('opinionPublicSearchInteractor', () => { applicationContext.getPersistenceGateway().advancedDocumentSearch.mock .calls[0][0], ).toMatchObject({ - documentEventCodes: OPINION_DOCUMENT_TYPES, + documentEventCodes: OPINION_EVENT_CODES, }); }); diff --git a/shared/src/business/useCases/users/createPetitionerAccountInteractor.js b/shared/src/business/useCases/users/createPetitionerAccountInteractor.js new file mode 100644 index 00000000000..1312de65cf4 --- /dev/null +++ b/shared/src/business/useCases/users/createPetitionerAccountInteractor.js @@ -0,0 +1,34 @@ +const { ROLES } = require('../../entities/EntityConstants'); +const { User } = require('../../entities/User'); + +/** + * createPetitionerAccountInteractor + * + * @param {object} providers the providers object + * @param {object} providers.applicationContext the application context + * @param {object} providers.user the user data + * @returns {Promise} the promise of the createUser call + */ +exports.createPetitionerAccountInteractor = async ({ + applicationContext, + email, + name, + userId, +}) => { + const userEntity = new User( + { + email, + name, + role: ROLES.petitioner, + userId, + }, + { applicationContext }, + ); + + await applicationContext.getPersistenceGateway().persistUser({ + applicationContext, + user: userEntity.validate().toRawObject(), + }); + + return userEntity.validate().toRawObject(); +}; diff --git a/shared/src/business/useCases/users/createPetitionerAccountInteractor.test.js b/shared/src/business/useCases/users/createPetitionerAccountInteractor.test.js new file mode 100644 index 00000000000..93ce3772f64 --- /dev/null +++ b/shared/src/business/useCases/users/createPetitionerAccountInteractor.test.js @@ -0,0 +1,50 @@ +const { + applicationContext, +} = require('../../test/createTestApplicationContext'); +const { + createPetitionerAccountInteractor, +} = require('./createPetitionerAccountInteractor'); + +describe('createPetitionerAccountInteractor', () => { + it('should attempt to persist the petitioner', async () => { + applicationContext + .getPersistenceGateway() + .persistUser.mockReturnValue(null); + + await createPetitionerAccountInteractor({ + applicationContext, + email: 'test@example.com', + name: 'Cody', + userId: '2fa6da8d-4328-4a20-a5d7-b76637e1dc02', + }); + + expect( + applicationContext.getPersistenceGateway().persistUser.mock.calls[0][0] + .user, + ).toMatchObject({ + email: 'test@example.com', + entityName: 'User', + name: 'Cody', + role: 'petitioner', + userId: '2fa6da8d-4328-4a20-a5d7-b76637e1dc02', + }); + }); + + it('should validate the user entity', async () => { + applicationContext + .getPersistenceGateway() + .persistUser.mockReturnValue(null); + + let error = null; + try { + await createPetitionerAccountInteractor({ + applicationContext, + name: 'Cody', + userId: '2fa6da8d-4328-4a20-a5d7-b76637e1dc02', + }); + } catch (err) { + error = err; + } + expect(error).toBeDefined(); + }); +}); diff --git a/shared/src/business/useCases/validatePetitionFromPaperInteractor.test.js b/shared/src/business/useCases/validatePetitionFromPaperInteractor.test.js index f511e36bfdc..89e5c19c599 100644 --- a/shared/src/business/useCases/validatePetitionFromPaperInteractor.test.js +++ b/shared/src/business/useCases/validatePetitionFromPaperInteractor.test.js @@ -2,7 +2,7 @@ const { validatePetitionFromPaperInteractor, } = require('./validatePetitionFromPaperInteractor'); const { applicationContext } = require('../test/createTestApplicationContext'); -const { PAYMENT_STATUS } = require('../entities/EntityConstants'); +const { PARTY_TYPES, PAYMENT_STATUS } = require('../entities/EntityConstants'); describe('validate petition from paper', () => { it('returns the expected errors object on an empty petition', () => { @@ -30,9 +30,20 @@ describe('validate petition from paper', () => { petition: { caseCaption: 'testing', caseType: 'CDP (Lien/Levy)', + contactPrimary: { + address1: '876 12th Ave', + city: 'Nashville', + country: 'USA', + countryType: 'domestic', + email: 'someone@example.com', + name: 'Jimmy Dean', + phone: '1234567890', + postalCode: '05198', + state: 'AK', + }, mailingDate: 'testing', orderDesignatingPlaceOfTrial: true, - partyType: 'testing', + partyType: PARTY_TYPES.petitioner, petitionFile: {}, petitionFileSize: 100, petitionPaymentStatus: PAYMENT_STATUS.UNPAID, diff --git a/shared/src/business/useCases/validatePetitionInteractor.test.js b/shared/src/business/useCases/validatePetitionInteractor.test.js index 9bdc422511f..4743af3c0f6 100644 --- a/shared/src/business/useCases/validatePetitionInteractor.test.js +++ b/shared/src/business/useCases/validatePetitionInteractor.test.js @@ -1,4 +1,5 @@ const { applicationContext } = require('../test/createTestApplicationContext'); +const { PARTY_TYPES } = require('../entities/EntityConstants'); const { validatePetitionInteractor } = require('./validatePetitionInteractor'); describe('validatePetitionInteractor', () => { @@ -44,9 +45,20 @@ describe('validatePetitionInteractor', () => { applicationContext, petition: { caseType: 'defined', + contactPrimary: { + address1: '876 12th Ave', + city: 'Nashville', + country: 'USA', + countryType: 'domestic', + email: 'someone@example.com', + name: 'Jimmy Dean', + phone: '1234567890', + postalCode: '05198', + state: 'AK', + }, filingType: 'Myself', hasIrsNotice: true, - partyType: 'defined', + partyType: PARTY_TYPES.petitioner, petitionFile: new File([], 'test.png'), petitionFileSize: 1, preferredTrialCity: 'defined', diff --git a/shared/src/business/utilities/DateHandler.test.js b/shared/src/business/utilities/DateHandler.test.js index 8e6d242b889..0b85855707b 100644 --- a/shared/src/business/utilities/DateHandler.test.js +++ b/shared/src/business/utilities/DateHandler.test.js @@ -125,6 +125,14 @@ describe('DateHandler', () => { }); expect(result).toEqual('2000-01-21T00:00:00.000Z'); }); + it('calculates dates with an hour not at midnight', () => { + const result = DateHandler.calculateISODate({ + dateString: '2000-01-01T20:01:23.212Z', + howMuch: 20, + units: 'days', + }); + expect(result).toEqual('2000-01-21T20:01:23.212Z'); + }); it('calculates dates with negative adjustment', () => { const result = DateHandler.calculateISODate({ dateString: '2000-01-21T00:00:00.000Z', diff --git a/shared/src/persistence/dynamo/messages/createCaseMessage.js b/shared/src/persistence/dynamo/messages/createCaseMessage.js index 94f3cea8d47..40aa71e9181 100644 --- a/shared/src/persistence/dynamo/messages/createCaseMessage.js +++ b/shared/src/persistence/dynamo/messages/createCaseMessage.js @@ -11,7 +11,7 @@ const { put } = require('../../dynamodbClientService'); exports.createCaseMessage = async ({ applicationContext, caseMessage }) => { await put({ Item: { - gsi1pk: `message|${caseMessage.messageId}`, + gsi1pk: `message|${caseMessage.parentMessageId}`, pk: `case|${caseMessage.caseId}`, sk: `message|${caseMessage.messageId}`, ...caseMessage, diff --git a/shared/src/persistence/dynamo/messages/createCaseMessage.test.js b/shared/src/persistence/dynamo/messages/createCaseMessage.test.js index a5845b9c066..58688689ae3 100644 --- a/shared/src/persistence/dynamo/messages/createCaseMessage.test.js +++ b/shared/src/persistence/dynamo/messages/createCaseMessage.test.js @@ -11,6 +11,7 @@ const mockCaseMessage = { fromUserId: '4791e892-14ee-4ab1-8468-0c942ec379d2', message: 'hey there', messageId: 'a10d6855-f3ee-4c11-861c-c7f11cba4dff', + parentMessageId: '31687a1e-3640-42cd-8e7e-a8e6df39ce9a', subject: 'hello', to: 'Test Petitionsclerk2', toSection: 'petitions', @@ -37,7 +38,7 @@ describe('createCaseMessage', () => { expect( applicationContext.getDocumentClient().put.mock.calls[0][0].Item, ).toMatchObject({ - gsi1pk: `message|${mockCaseMessage.messageId}`, + gsi1pk: `message|${mockCaseMessage.parentMessageId}`, pk: `case|${mockCaseMessage.caseId}`, sk: `message|${mockCaseMessage.messageId}`, ...mockCaseMessage, diff --git a/shared/src/persistence/dynamo/messages/getCaseMessageById.js b/shared/src/persistence/dynamo/messages/getCaseMessageThreadByParentId.js similarity index 61% rename from shared/src/persistence/dynamo/messages/getCaseMessageById.js rename to shared/src/persistence/dynamo/messages/getCaseMessageThreadByParentId.js index 2fd2f0aa99d..c75e1aedf5d 100644 --- a/shared/src/persistence/dynamo/messages/getCaseMessageById.js +++ b/shared/src/persistence/dynamo/messages/getCaseMessageThreadByParentId.js @@ -1,25 +1,26 @@ const { query } = require('../../dynamodbClientService'); /** - * getCaseMessageById + * getCaseMessageThreadByParentId * * @param {object} providers the providers object * @param {object} providers.applicationContext the application context - * @param {string} providers.messageId the message id + * @param {string} providers.parentMessageId the id of the parent message * @returns {object} the created case message */ -exports.getCaseMessageById = async ({ applicationContext, messageId }) => { - const messages = await query({ +exports.getCaseMessageThreadByParentId = async ({ + applicationContext, + parentMessageId, +}) => { + return await query({ ExpressionAttributeNames: { '#gsi1pk': 'gsi1pk', }, ExpressionAttributeValues: { - ':gsi1pk': `message|${messageId}`, + ':gsi1pk': `message|${parentMessageId}`, }, IndexName: 'gsi1', KeyConditionExpression: '#gsi1pk = :gsi1pk', applicationContext, }); - - return messages[0]; }; diff --git a/shared/src/persistence/dynamo/messages/getCaseMessageById.test.js b/shared/src/persistence/dynamo/messages/getCaseMessageThreadByParentId.test.js similarity index 77% rename from shared/src/persistence/dynamo/messages/getCaseMessageById.test.js rename to shared/src/persistence/dynamo/messages/getCaseMessageThreadByParentId.test.js index 2976dd980f0..2765dd5dbaa 100644 --- a/shared/src/persistence/dynamo/messages/getCaseMessageById.test.js +++ b/shared/src/persistence/dynamo/messages/getCaseMessageThreadByParentId.test.js @@ -1,7 +1,9 @@ const { applicationContext, } = require('../../../business/test/createTestApplicationContext'); -const { getCaseMessageById } = require('./getCaseMessageById'); +const { + getCaseMessageThreadByParentId, +} = require('./getCaseMessageThreadByParentId'); const mockCaseMessage = { caseId: 'b3f09a45-b27c-4383-acc1-2ab1f99e6725', @@ -17,7 +19,7 @@ const mockCaseMessage = { toUserId: '449b916e-3362-4a5d-bf56-b2b94ba29c12', }; -describe('getCaseMessageById', () => { +describe('getCaseMessageThreadByParentId', () => { beforeAll(() => { applicationContext.environment.stage = 'dev'; applicationContext.getDocumentClient().query.mockReturnValue({ @@ -26,11 +28,11 @@ describe('getCaseMessageById', () => { }); it('retrieves the case message from persistence', async () => { - const retrievedMessage = await getCaseMessageById({ + const retrievedMessage = await getCaseMessageThreadByParentId({ applicationContext, messageId: mockCaseMessage.messageId, }); - expect(retrievedMessage).toEqual(mockCaseMessage); + expect(retrievedMessage).toEqual([mockCaseMessage]); }); }); diff --git a/shared/src/persistence/dynamo/messages/getCaseMessagesByCaseId.js b/shared/src/persistence/dynamo/messages/getCaseMessagesByCaseId.js new file mode 100644 index 00000000000..c8ab48b57ea --- /dev/null +++ b/shared/src/persistence/dynamo/messages/getCaseMessagesByCaseId.js @@ -0,0 +1,24 @@ +const { query } = require('../../dynamodbClientService'); + +/** + * getCaseMessagesByCaseId + * + * @param {object} providers the providers object + * @param {object} providers.applicationContext the application context + * @param {string} providers.caseId the id of the case + * @returns {object} the created case message + */ +exports.getCaseMessagesByCaseId = async ({ applicationContext, caseId }) => { + return await query({ + ExpressionAttributeNames: { + '#pk': 'pk', + '#sk': 'sk', + }, + ExpressionAttributeValues: { + ':pk': `case|${caseId}`, + ':prefix': 'message|', + }, + KeyConditionExpression: '#pk = :pk and begins_with(#sk, :prefix)', + applicationContext, + }); +}; diff --git a/shared/src/persistence/dynamo/messages/getCaseMessagesByCaseId.test.js b/shared/src/persistence/dynamo/messages/getCaseMessagesByCaseId.test.js new file mode 100644 index 00000000000..8d61c4c0965 --- /dev/null +++ b/shared/src/persistence/dynamo/messages/getCaseMessagesByCaseId.test.js @@ -0,0 +1,36 @@ +const { + applicationContext, +} = require('../../../business/test/createTestApplicationContext'); +const { getCaseMessagesByCaseId } = require('./getCaseMessagesByCaseId'); + +const mockCaseMessage = { + caseId: 'b3f09a45-b27c-4383-acc1-2ab1f99e6725', + createdAt: '2019-03-01T21:40:46.415Z', + from: 'Test Petitionsclerk', + fromSection: 'petitions', + fromUserId: '4791e892-14ee-4ab1-8468-0c942ec379d2', + message: 'hey there', + messageId: 'a10d6855-f3ee-4c11-861c-c7f11cba4dff', + subject: 'hello', + to: 'Test Petitionsclerk2', + toSection: 'petitions', + toUserId: '449b916e-3362-4a5d-bf56-b2b94ba29c12', +}; + +describe('getCaseMessagesByCaseId', () => { + beforeAll(() => { + applicationContext.environment.stage = 'dev'; + applicationContext.getDocumentClient().query.mockReturnValue({ + promise: () => Promise.resolve({ Items: [mockCaseMessage] }), + }); + }); + + it('retrieves the case message from persistence', async () => { + const retrievedMessage = await getCaseMessagesByCaseId({ + applicationContext, + caseId: mockCaseMessage.caseId, + }); + + expect(retrievedMessage).toEqual([mockCaseMessage]); + }); +}); diff --git a/shared/src/persistence/dynamo/messages/markCaseMessageRepliedTo.js b/shared/src/persistence/dynamo/messages/markCaseMessageRepliedTo.js new file mode 100644 index 00000000000..65297c36113 --- /dev/null +++ b/shared/src/persistence/dynamo/messages/markCaseMessageRepliedTo.js @@ -0,0 +1,31 @@ +const { update } = require('../../dynamodbClientService'); + +/** + * markCaseMessageRepliedTo + * + * @param {object} providers the providers object + * @param {object} providers.applicationContext the application context + * @param {string} providers.caseId the id of the case containing the message + * @param {string} providers.messageId the id of the message to update + * @returns {object} the created case message + */ +exports.markCaseMessageRepliedTo = async ({ + applicationContext, + caseId, + messageId, +}) => { + await update({ + ExpressionAttributeNames: { + '#isRepliedTo': 'isRepliedTo', + }, + ExpressionAttributeValues: { + ':isRepliedTo': true, + }, + Key: { + pk: `case|${caseId}`, + sk: `message|${messageId}`, + }, + UpdateExpression: 'SET #isRepliedTo = :isRepliedTo', + applicationContext, + }); +}; diff --git a/shared/src/persistence/dynamo/messages/markCaseMessageRepliedTo.test.js b/shared/src/persistence/dynamo/messages/markCaseMessageRepliedTo.test.js new file mode 100644 index 00000000000..9fab07734a0 --- /dev/null +++ b/shared/src/persistence/dynamo/messages/markCaseMessageRepliedTo.test.js @@ -0,0 +1,33 @@ +const { + applicationContext, +} = require('../../../business/test/createTestApplicationContext'); +const { markCaseMessageRepliedTo } = require('./markCaseMessageRepliedTo'); + +describe('markCaseMessageRepliedTo', () => { + beforeAll(() => { + applicationContext.environment.stage = 'dev'; + applicationContext.getDocumentClient().update.mockReturnValue({ + promise: () => Promise.resolve(null), + }); + }); + + it('attempts to update the case message record', async () => { + await markCaseMessageRepliedTo({ + applicationContext, + caseId: 'bd775c3b-96ce-4cf0-ae9c-fda225266434', + messageId: '0c0de040-1dfd-4be8-937a-d6aefdfcd71d', + }); + + expect( + applicationContext.getDocumentClient().update.mock.calls.length, + ).toEqual(1); + expect( + applicationContext.getDocumentClient().update.mock.calls[0][0], + ).toMatchObject({ + Key: { + pk: 'case|bd775c3b-96ce-4cf0-ae9c-fda225266434', + sk: 'message|0c0de040-1dfd-4be8-937a-d6aefdfcd71d', + }, + }); + }); +}); diff --git a/shared/src/persistence/dynamo/messages/markCaseMessageThreadRepliedTo.js b/shared/src/persistence/dynamo/messages/markCaseMessageThreadRepliedTo.js new file mode 100644 index 00000000000..5bf0f172c71 --- /dev/null +++ b/shared/src/persistence/dynamo/messages/markCaseMessageThreadRepliedTo.js @@ -0,0 +1,41 @@ +const { + getCaseMessageThreadByParentId, +} = require('./getCaseMessageThreadByParentId'); +const { update } = require('../../dynamodbClientService'); + +/** + * markCaseMessageThreadRepliedTo + * + * @param {object} providers the providers object + * @param {object} providers.applicationContext the application context + * @param {string} providers.messageId the id of the message to update + * @returns {object} the created case message + */ +exports.markCaseMessageThreadRepliedTo = async ({ + applicationContext, + parentMessageId, +}) => { + const messages = await getCaseMessageThreadByParentId({ + applicationContext, + parentMessageId, + }); + + const updateMessage = async message => { + return await update({ + ExpressionAttributeNames: { + '#isRepliedTo': 'isRepliedTo', + }, + ExpressionAttributeValues: { + ':isRepliedTo': true, + }, + Key: { + pk: `case|${message.caseId}`, + sk: `message|${message.messageId}`, + }, + UpdateExpression: 'SET #isRepliedTo = :isRepliedTo', + applicationContext, + }); + }; + + await Promise.all(messages.map(updateMessage)); +}; diff --git a/shared/src/persistence/dynamo/messages/markCaseMessageThreadRepliedTo.test.js b/shared/src/persistence/dynamo/messages/markCaseMessageThreadRepliedTo.test.js new file mode 100644 index 00000000000..670d7ee9292 --- /dev/null +++ b/shared/src/persistence/dynamo/messages/markCaseMessageThreadRepliedTo.test.js @@ -0,0 +1,64 @@ +const { + applicationContext, +} = require('../../../business/test/createTestApplicationContext'); +const { + markCaseMessageThreadRepliedTo, +} = require('./markCaseMessageThreadRepliedTo'); + +describe('markCaseMessageThreadRepliedTo', () => { + beforeAll(() => { + applicationContext.environment.stage = 'dev'; + applicationContext.getDocumentClient().update.mockReturnValue({ + promise: () => Promise.resolve(null), + }); + applicationContext.getDocumentClient().query.mockReturnValue({ + promise: () => + Promise.resolve({ + Items: [ + { + caseId: '40eeec19-0e38-42e0-bb8b-a8ff9b2ce5d5', + gsi1pk: 'message|28de1ba1-8518-4a7d-8075-4291eea569c7', + messageId: '28de1ba1-8518-4a7d-8075-4291eea569c7', + pk: 'case|40eeec19-0e38-42e0-bb8b-a8ff9b2ce5d5', + sk: 'message|28de1ba1-8518-4a7d-8075-4291eea569c7', + }, + { + caseId: '40eeec19-0e38-42e0-bb8b-a8ff9b2ce5d5', + gsi1pk: 'message|28de1ba1-8518-4a7d-8075-4291eea569c7', + messageId: 'badc2bf0-cc82-4fd1-9a61-d1a8937a4f1b', + pk: 'case|40eeec19-0e38-42e0-bb8b-a8ff9b2ce5d5', + sk: 'message|badc2bf0-cc82-4fd1-9a61-d1a8937a4f1b', + }, + ], + }), + }); + }); + + it('attempts to update the case message records', async () => { + await markCaseMessageThreadRepliedTo({ + applicationContext, + caseId: 'bd775c3b-96ce-4cf0-ae9c-fda225266434', + messageId: '0c0de040-1dfd-4be8-937a-d6aefdfcd71d', + }); + + expect( + applicationContext.getDocumentClient().update.mock.calls.length, + ).toEqual(2); + expect( + applicationContext.getDocumentClient().update.mock.calls[0][0], + ).toMatchObject({ + Key: { + pk: 'case|40eeec19-0e38-42e0-bb8b-a8ff9b2ce5d5', + sk: 'message|28de1ba1-8518-4a7d-8075-4291eea569c7', + }, + }); + expect( + applicationContext.getDocumentClient().update.mock.calls[1][0], + ).toMatchObject({ + Key: { + pk: 'case|40eeec19-0e38-42e0-bb8b-a8ff9b2ce5d5', + sk: 'message|badc2bf0-cc82-4fd1-9a61-d1a8937a4f1b', + }, + }); + }); +}); diff --git a/shared/src/persistence/dynamo/messages/updateCaseMessage.js b/shared/src/persistence/dynamo/messages/updateCaseMessage.js new file mode 100644 index 00000000000..6f2cf073799 --- /dev/null +++ b/shared/src/persistence/dynamo/messages/updateCaseMessage.js @@ -0,0 +1,21 @@ +const { put } = require('../../dynamodbClientService'); + +/** + * updateCaseMessage + * + * @param {object} providers the providers object + * @param {object} providers.applicationContext the application context + * @param {object} providers.caseMessage the case message data + * @returns {object} the created case message + */ +exports.updateCaseMessage = async ({ applicationContext, caseMessage }) => { + return await put({ + Item: { + gsi1pk: `message|${caseMessage.parentMessageId}`, + pk: `case|${caseMessage.caseId}`, + sk: `message|${caseMessage.messageId}`, + ...caseMessage, + }, + applicationContext, + }); +}; diff --git a/shared/src/persistence/dynamo/messages/updateCaseMessage.test.js b/shared/src/persistence/dynamo/messages/updateCaseMessage.test.js new file mode 100644 index 00000000000..3045aaff482 --- /dev/null +++ b/shared/src/persistence/dynamo/messages/updateCaseMessage.test.js @@ -0,0 +1,47 @@ +const { + applicationContext, +} = require('../../../business/test/createTestApplicationContext'); +const { updateCaseMessage } = require('./updateCaseMessage'); + +const mockCaseMessage = { + caseId: 'b3f09a45-b27c-4383-acc1-2ab1f99e6725', + createdAt: '2019-03-01T21:40:46.415Z', + from: 'Test Petitionsclerk', + fromSection: 'petitions', + fromUserId: '4791e892-14ee-4ab1-8468-0c942ec379d2', + message: 'hey there', + messageId: 'a10d6855-f3ee-4c11-861c-c7f11cba4dff', + parentMessageId: '31687a1e-3640-42cd-8e7e-a8e6df39ce9a', + subject: 'hello', + to: 'Test Petitionsclerk2', + toSection: 'petitions', + toUserId: '449b916e-3362-4a5d-bf56-b2b94ba29c12', +}; + +describe('updateCaseMessage', () => { + beforeAll(() => { + applicationContext.environment.stage = 'dev'; + applicationContext.getDocumentClient().put.mockReturnValue({ + promise: () => Promise.resolve(null), + }); + }); + + it('attempts to persist the case message record', async () => { + await updateCaseMessage({ + applicationContext, + caseMessage: mockCaseMessage, + }); + + expect( + applicationContext.getDocumentClient().put.mock.calls.length, + ).toEqual(1); + expect( + applicationContext.getDocumentClient().put.mock.calls[0][0].Item, + ).toMatchObject({ + gsi1pk: `message|${mockCaseMessage.parentMessageId}`, + pk: `case|${mockCaseMessage.caseId}`, + sk: `message|${mockCaseMessage.messageId}`, + ...mockCaseMessage, + }); + }); +}); diff --git a/shared/src/persistence/dynamo/users/persistUser.js b/shared/src/persistence/dynamo/users/persistUser.js new file mode 100644 index 00000000000..2ce371d9be8 --- /dev/null +++ b/shared/src/persistence/dynamo/users/persistUser.js @@ -0,0 +1,12 @@ +const client = require('../../dynamodbClientService'); + +exports.persistUser = async ({ applicationContext, user }) => { + await client.put({ + Item: { + pk: `user|${user.userId}`, + sk: `user|${user.userId}`, + ...user, + }, + applicationContext, + }); +}; diff --git a/shared/src/persistence/elasticsearch/messages/getCompletedSectionInboxMessages.js b/shared/src/persistence/elasticsearch/messages/getCompletedSectionInboxMessages.js new file mode 100644 index 00000000000..1e88499092f --- /dev/null +++ b/shared/src/persistence/elasticsearch/messages/getCompletedSectionInboxMessages.js @@ -0,0 +1,45 @@ +const { calculateISODate } = require('../../../business/utilities/DateHandler'); +const { search } = require('../searchClient'); + +exports.getCompletedSectionInboxMessages = async ({ + applicationContext, + section, +}) => { + const filterDate = calculateISODate({ howMuch: -7 }); + + const query = { + body: { + query: { + bool: { + must: [ + { + match: { + 'completedBySection.S': { operator: 'and', query: section }, + }, + }, + { + match: { 'isCompleted.BOOL': true }, + }, + { + range: { + 'completedAt.S': { + format: 'strict_date_time', // ISO-8601 time stamp + gte: filterDate, + }, + }, + }, + ], + }, + }, + size: 5000, + }, + index: 'efcms-message', + }; + + const { results } = await search({ + applicationContext, + searchParameters: query, + }); + + return results; +}; diff --git a/shared/src/persistence/elasticsearch/messages/getCompletedSectionInboxMessages.test.js b/shared/src/persistence/elasticsearch/messages/getCompletedSectionInboxMessages.test.js new file mode 100644 index 00000000000..120a38828b0 --- /dev/null +++ b/shared/src/persistence/elasticsearch/messages/getCompletedSectionInboxMessages.test.js @@ -0,0 +1,22 @@ +const { + applicationContext, +} = require('../../../business/test/createTestApplicationContext'); +const { + getCompletedSectionInboxMessages, +} = require('./getCompletedSectionInboxMessages'); +jest.mock('../searchClient'); +const { search } = require('../searchClient'); + +describe('getCompletedSectionInboxMessages', () => { + it('returns results from the search client', async () => { + search.mockReturnValue({ results: ['some', 'matches'], total: 0 }); + + const results = await getCompletedSectionInboxMessages({ + applicationContext, + section: 'petitions', + }); + + expect(search).toHaveBeenCalledTimes(1); + expect(results).toMatchObject(['some', 'matches']); + }); +}); diff --git a/shared/src/persistence/elasticsearch/messages/getCompletedUserInboxMessages.js b/shared/src/persistence/elasticsearch/messages/getCompletedUserInboxMessages.js new file mode 100644 index 00000000000..c718e265f7e --- /dev/null +++ b/shared/src/persistence/elasticsearch/messages/getCompletedUserInboxMessages.js @@ -0,0 +1,45 @@ +const { calculateISODate } = require('../../../business/utilities/DateHandler'); +const { search } = require('../searchClient'); + +exports.getCompletedUserInboxMessages = async ({ + applicationContext, + userId, +}) => { + const filterDate = calculateISODate({ howMuch: -7 }); + + const query = { + body: { + query: { + bool: { + must: [ + { + match: { + 'completedByUserId.S': { operator: 'and', query: userId }, + }, + }, + { + match: { 'isCompleted.BOOL': true }, + }, + { + range: { + 'completedAt.S': { + format: 'strict_date_time', // ISO-8601 time stamp + gte: filterDate, + }, + }, + }, + ], + }, + }, + size: 5000, + }, + index: 'efcms-message', + }; + + const { results } = await search({ + applicationContext, + searchParameters: query, + }); + + return results; +}; diff --git a/shared/src/persistence/elasticsearch/messages/getCompletedUserInboxMessages.test.js b/shared/src/persistence/elasticsearch/messages/getCompletedUserInboxMessages.test.js new file mode 100644 index 00000000000..eb7c519aeec --- /dev/null +++ b/shared/src/persistence/elasticsearch/messages/getCompletedUserInboxMessages.test.js @@ -0,0 +1,20 @@ +const { + applicationContext, +} = require('../../../business/test/createTestApplicationContext'); +const { getUserInboxMessages } = require('./getUserInboxMessages'); +jest.mock('../searchClient'); +const { search } = require('../searchClient'); + +describe('getCompletedUserInboxMessages', () => { + it('returns results from the search client', async () => { + search.mockReturnValue({ results: ['some', 'matches'], total: 0 }); + + const results = await getUserInboxMessages({ + applicationContext, + userId: 'f5d68c53-af31-484d-803b-da22c4d03357', + }); + + expect(search).toHaveBeenCalledTimes(1); + expect(results).toMatchObject(['some', 'matches']); + }); +}); diff --git a/shared/src/persistence/elasticsearch/messages/getSectionInboxMessages.js b/shared/src/persistence/elasticsearch/messages/getSectionInboxMessages.js index 6fe8c0770d2..5c6ba00c56f 100644 --- a/shared/src/persistence/elasticsearch/messages/getSectionInboxMessages.js +++ b/shared/src/persistence/elasticsearch/messages/getSectionInboxMessages.js @@ -5,11 +5,16 @@ exports.getSectionInboxMessages = async ({ applicationContext, section }) => { body: { query: { bool: { - must: { - match: { - 'toSection.S': { operator: 'and', query: section }, + must: [ + { + match: { + 'toSection.S': { operator: 'and', query: section }, + }, }, - }, + { + match: { 'isRepliedTo.BOOL': false }, + }, + ], }, }, size: 5000, diff --git a/shared/src/persistence/elasticsearch/messages/getSectionOutboxMessages.js b/shared/src/persistence/elasticsearch/messages/getSectionOutboxMessages.js index 6655fb2212e..972cfa762ff 100644 --- a/shared/src/persistence/elasticsearch/messages/getSectionOutboxMessages.js +++ b/shared/src/persistence/elasticsearch/messages/getSectionOutboxMessages.js @@ -1,15 +1,28 @@ +const { calculateISODate } = require('../../../business/utilities/DateHandler'); const { search } = require('../searchClient'); exports.getSectionOutboxMessages = async ({ applicationContext, section }) => { + const filterDate = calculateISODate({ howMuch: -7 }); + const query = { body: { query: { bool: { - must: { - match: { - 'fromSection.S': { operator: 'and', query: section }, + must: [ + { + match: { + 'fromSection.S': { operator: 'and', query: section }, + }, + }, + { + range: { + 'createdAt.S': { + format: 'strict_date_time', // ISO-8601 time stamp + gte: filterDate, + }, + }, }, - }, + ], }, }, size: 5000, diff --git a/shared/src/persistence/elasticsearch/messages/getUserInboxMessages.js b/shared/src/persistence/elasticsearch/messages/getUserInboxMessages.js index 1d9e0d925de..6a448e2160c 100644 --- a/shared/src/persistence/elasticsearch/messages/getUserInboxMessages.js +++ b/shared/src/persistence/elasticsearch/messages/getUserInboxMessages.js @@ -5,11 +5,16 @@ exports.getUserInboxMessages = async ({ applicationContext, userId }) => { body: { query: { bool: { - must: { - match: { - 'toUserId.S': { operator: 'and', query: userId }, + must: [ + { + match: { + 'toUserId.S': { operator: 'and', query: userId }, + }, }, - }, + { + match: { 'isRepliedTo.BOOL': false }, + }, + ], }, }, size: 5000, diff --git a/shared/src/persistence/elasticsearch/messages/getUserOutboxMessages.js b/shared/src/persistence/elasticsearch/messages/getUserOutboxMessages.js index d11d9b7bdd4..5a9ad5d7cc9 100644 --- a/shared/src/persistence/elasticsearch/messages/getUserOutboxMessages.js +++ b/shared/src/persistence/elasticsearch/messages/getUserOutboxMessages.js @@ -1,15 +1,28 @@ +const { calculateISODate } = require('../../../business/utilities/DateHandler'); const { search } = require('../searchClient'); exports.getUserOutboxMessages = async ({ applicationContext, userId }) => { + const filterDate = calculateISODate({ howMuch: -7 }); + const query = { body: { query: { bool: { - must: { - match: { - 'fromUserId.S': { operator: 'and', query: userId }, + must: [ + { + match: { + 'fromUserId.S': { operator: 'and', query: userId }, + }, + }, + { + range: { + 'createdAt.S': { + format: 'strict_date_time', // ISO-8601 time stamp + gte: filterDate, + }, + }, }, - }, + ], }, }, size: 5000, diff --git a/shared/src/proxies/messages/completeCaseMessageProxy.js b/shared/src/proxies/messages/completeCaseMessageProxy.js new file mode 100644 index 00000000000..ac53118fcd4 --- /dev/null +++ b/shared/src/proxies/messages/completeCaseMessageProxy.js @@ -0,0 +1,24 @@ +const { post } = require('../requests'); + +/** + * completeCaseMessageInteractor + * + * @param {object} providers the providers object + * @param {object} providers.applicationContext the application context + * @param {string} providers.message the message text + * @param {string} providers.parentMessageId the id of the parent message for the thread + * @returns {Promise<*>} the promise of the api call + */ +exports.completeCaseMessageInteractor = ({ + applicationContext, + message, + parentMessageId, +}) => { + return post({ + applicationContext, + body: { + message, + }, + endpoint: `/messages/${parentMessageId}/complete`, + }); +}; diff --git a/shared/src/proxies/messages/forwardCaseMessageProxy.js b/shared/src/proxies/messages/forwardCaseMessageProxy.js new file mode 100644 index 00000000000..32d4910df67 --- /dev/null +++ b/shared/src/proxies/messages/forwardCaseMessageProxy.js @@ -0,0 +1,39 @@ +const { post } = require('../requests'); + +/** + * forwardCaseMessageInteractor + * + * @param {object} providers the providers object + * @param {object} providers.applicationContext the application context + * @param {array} providers.attachments array attachments on the message + * @param {string} providers.caseId the id of the case + * @param {string} providers.message the message text + * @param {string} providers.parentMessageId the id of the parent message for the thread + * @param {string} providers.subject the message subject + * @param {string} providers.toSection the section of the user receiving the message + * @param {string} providers.toUserId the user id of the user receiving the message + * @returns {Promise<*>} the promise of the api call + */ +exports.forwardCaseMessageInteractor = ({ + applicationContext, + attachments, + caseId, + message, + parentMessageId, + subject, + toSection, + toUserId, +}) => { + return post({ + applicationContext, + body: { + attachments, + caseId, + message, + subject, + toSection, + toUserId, + }, + endpoint: `/messages/${parentMessageId}/forward`, + }); +}; diff --git a/shared/src/proxies/messages/getCaseMessageThreadProxy.js b/shared/src/proxies/messages/getCaseMessageThreadProxy.js new file mode 100644 index 00000000000..ce94427ac22 --- /dev/null +++ b/shared/src/proxies/messages/getCaseMessageThreadProxy.js @@ -0,0 +1,19 @@ +const { get } = require('../requests'); + +/** + * getCaseMessageThreadInteractor + * + * @param {object} providers the providers object + * @param {object} providers.applicationContext the application context + * @param {string} providers.parentMessageId the id of the parent message for the thread + * @returns {Promise<*>} the promise of the api call + */ +exports.getCaseMessageThreadInteractor = ({ + applicationContext, + parentMessageId, +}) => { + return get({ + applicationContext, + endpoint: `/messages/${parentMessageId}`, + }); +}; diff --git a/shared/src/proxies/messages/getCaseMessageProxy.js b/shared/src/proxies/messages/getCaseMessagesForCaseProxy.js similarity index 56% rename from shared/src/proxies/messages/getCaseMessageProxy.js rename to shared/src/proxies/messages/getCaseMessagesForCaseProxy.js index ecc64beff70..c1ecbaab35d 100644 --- a/shared/src/proxies/messages/getCaseMessageProxy.js +++ b/shared/src/proxies/messages/getCaseMessagesForCaseProxy.js @@ -1,16 +1,16 @@ const { get } = require('../requests'); /** - * getCaseMessageInteractor + * getCaseMessagesForCaseInteractor * * @param {object} providers the providers object * @param {object} providers.applicationContext the application context - * @param {string} providers.messageId the message id + * @param {string} providers.caseId the id of the case * @returns {Promise<*>} the promise of the api call */ -exports.getCaseMessageInteractor = ({ applicationContext, messageId }) => { +exports.getCaseMessagesForCaseInteractor = ({ applicationContext, caseId }) => { return get({ applicationContext, - endpoint: `/messages/${messageId}`, + endpoint: `/messages/case/${caseId}`, }); }; diff --git a/shared/src/proxies/messages/getCompletedCaseMessagesForSectionProxy.js b/shared/src/proxies/messages/getCompletedCaseMessagesForSectionProxy.js new file mode 100644 index 00000000000..4fd71d077b1 --- /dev/null +++ b/shared/src/proxies/messages/getCompletedCaseMessagesForSectionProxy.js @@ -0,0 +1,19 @@ +const { get } = require('../requests'); + +/** + * getCompletedCaseMessagesForSectionInteractor + * + * @param {object} providers the providers object + * @param {object} providers.applicationContext the application context + * @param {string} providers.section the section + * @returns {Promise<*>} the promise of the api call + */ +exports.getCompletedCaseMessagesForSectionInteractor = ({ + applicationContext, + section, +}) => { + return get({ + applicationContext, + endpoint: `/messages/completed/section/${section}`, + }); +}; diff --git a/shared/src/proxies/messages/getCompletedCaseMessagesForUserProxy.js b/shared/src/proxies/messages/getCompletedCaseMessagesForUserProxy.js new file mode 100644 index 00000000000..6c8267ab77d --- /dev/null +++ b/shared/src/proxies/messages/getCompletedCaseMessagesForUserProxy.js @@ -0,0 +1,19 @@ +const { get } = require('../requests'); + +/** + * getCompletedCaseMessagesForUserInteractor + * + * @param {object} providers the providers object + * @param {object} providers.applicationContext the application context + * @param {string} providers.userId the user id + * @returns {Promise<*>} the promise of the api call + */ +exports.getCompletedCaseMessagesForUserInteractor = ({ + applicationContext, + userId, +}) => { + return get({ + applicationContext, + endpoint: `/messages/completed/${userId}`, + }); +}; diff --git a/shared/src/proxies/messages/replyToCaseMessageProxy.js b/shared/src/proxies/messages/replyToCaseMessageProxy.js new file mode 100644 index 00000000000..85e173ef63d --- /dev/null +++ b/shared/src/proxies/messages/replyToCaseMessageProxy.js @@ -0,0 +1,39 @@ +const { post } = require('../requests'); + +/** + * replyToCaseMessageInteractor + * + * @param {object} providers the providers object + * @param {object} providers.applicationContext the application context + * @param {array} providers.attachments array attachments on the message + * @param {string} providers.caseId the id of the case + * @param {string} providers.message the message text + * @param {string} providers.parentMessageId the id of the parent message for the thread + * @param {string} providers.subject the message subject + * @param {string} providers.toSection the section of the user receiving the message + * @param {string} providers.toUserId the user id of the user receiving the message + * @returns {Promise<*>} the promise of the api call + */ +exports.replyToCaseMessageInteractor = ({ + applicationContext, + attachments, + caseId, + message, + parentMessageId, + subject, + toSection, + toUserId, +}) => { + return post({ + applicationContext, + body: { + attachments, + caseId, + message, + subject, + toSection, + toUserId, + }, + endpoint: `/messages/${parentMessageId}/reply`, + }); +}; diff --git a/shared/src/utilities/JoiValidationConstants.js b/shared/src/utilities/JoiValidationConstants.js index 5696247636b..42c1ed14354 100644 --- a/shared/src/utilities/JoiValidationConstants.js +++ b/shared/src/utilities/JoiValidationConstants.js @@ -1,9 +1,17 @@ -const joi = require('@hapi/joi'); - +const joi = require('@hapi/joi').extend(require('@hapi/joi-date')); +const { FORMATS } = require('../business/utilities/DateHandler'); +const { MAX_FILE_SIZE_BYTES } = require('../business/entities/EntityConstants'); // if repeatedly using the same rules to validate how an input should be formatted, capture it here. exports.JoiValidationConstants = { + // eslint-disable-next-line spellcheck/spell-checker + // TODO: remove FORMATS.YYYYMMDD from valid timestamp formats after devex task + ISO_DATE: joi.date().iso().format([FORMATS.ISO, FORMATS.YYYYMMDD]), + MAX_FILE_SIZE_BYTES: joi.number().integer().min(1).max(MAX_FILE_SIZE_BYTES), TWENTYFOUR_HOUR_MINUTES: joi .string() .regex(/^(([0-1][0-9])|([2][0-3])):([0-5][0-9])$/), US_POSTAL_CODE: joi.string().regex(/^(\d{5}|\d{5}-\d{4})$/), + UUID: joi.string().uuid({ + version: ['uuidv4'], + }), }; diff --git a/shared/src/utilities/JoiValidationDecorator.js b/shared/src/utilities/JoiValidationDecorator.js index 701e59bbe78..0f4823eef85 100644 --- a/shared/src/utilities/JoiValidationDecorator.js +++ b/shared/src/utilities/JoiValidationDecorator.js @@ -1,6 +1,6 @@ const joi = require('@hapi/joi'); const { InvalidEntityError } = require('../errors/errors'); -const { isEmpty } = require('lodash'); +const { isEmpty, pick } = require('lodash'); /** * @@ -134,13 +134,18 @@ exports.joiValidationDecorator = function ( entityConstructor.prototype.validate = function validate() { if (!this.isValid()) { - const ids = Object.entries(this) - .filter(([key, value]) => value && key.endsWith('Id')) - .map(([key, value]) => `${key}: "${value}"`) - .join('; '); + const helpfulKeys = Object.keys(this).filter(key => key.endsWith('Id')); + helpfulKeys.push( + 'docketNumber', + ...Object.keys(this.getFormattedValidationErrors()), + ); throw new InvalidEntityError( entityConstructor.validationName, - ids, + JSON.stringify(pick(this, helpfulKeys), (key, value) => + this.hasOwnProperty(key) && typeof value === 'undefined' + ? '' + : value, + ), JSON.stringify(this.getFormattedValidationErrors()), ); } diff --git a/shared/src/utilities/JoiValidationDecorator.test.js b/shared/src/utilities/JoiValidationDecorator.test.js index a7f2dc93afd..f1c57d27f7a 100644 --- a/shared/src/utilities/JoiValidationDecorator.test.js +++ b/shared/src/utilities/JoiValidationDecorator.test.js @@ -57,7 +57,23 @@ const MockEntity3Schema = joi.object().keys({ anotherItem: joi.string().required(), }); -joiValidationDecorator(MockEntity3, MockEntity3Schema, { +joiValidationDecorator(MockEntity3, MockEntity3Schema, {}); + +const MockCase = function (raw) { + this.caseId = raw.caseId; + this.docketNumber = raw.docketNumber; + this.somethingId = raw.somethingId; + this.title = raw.title; +}; + +const MockCaseSchema = joi.object().keys({ + caseId: joi.string().required(), + docketNumber: joi.string().required(), + somethingId: joi.string().required(), + title: joi.string().required(), +}); + +joiValidationDecorator(MockCase, MockCaseSchema, { anotherItem: 'Another item is required', }); @@ -132,6 +148,25 @@ describe('Joi Validation Decorator', () => { expect(obj.getSchema()).toEqual(MockEntity2Schema); }); + it('should throw a detailed "InvalidEntityError" when `validate` fails including all keys ending in `Id`, `docketNumber` if it exists, and key/value pairs that failed validation', () => { + const obj1 = new MockCase({ + caseId: 'abc', + docketNumber: '123-20', + title: 'some title', + }); + let error; + try { + obj1.validate(); + } catch (e) { + error = e; + } + expect(error).toBeDefined(); + expect(error.message).toContain('\\"somethingId\\" is required'); + expect(error.message).toContain('"caseId":"abc"'); + expect(error.message).toContain('"somethingId":""'); + expect(error.message).toContain('"docketNumber":"123-20"'); + }); + it('should have access to the schema without instantiating the entity', () => { expect(MockEntity2.getSchema()).toEqual(MockEntity2Schema); }); diff --git a/shared/src/utilities/getAllEventCodes.js b/shared/src/utilities/getAllEventCodes.js deleted file mode 100644 index 3f203a21e67..00000000000 --- a/shared/src/utilities/getAllEventCodes.js +++ /dev/null @@ -1,25 +0,0 @@ -const courtIssuedEventCodes = require('../tools/courtIssuedEventCodes.json'); -const documentMapExternal = require('../tools/externalFilingEvents.json'); -const documentMapInternal = require('../tools/internalFilingEvents.json'); -const { EVENT_CODES } = require('../business/entities/EntityConstants'); - -const eventCodes = []; -for (const category in documentMapExternal) { - for (const document of documentMapExternal[category]) { - eventCodes.push(document.eventCode); - } -} -for (const category in documentMapInternal) { - for (const document of documentMapInternal[category]) { - eventCodes.push(document.eventCode); - } -} -for (const document of courtIssuedEventCodes) { - eventCodes.push(document.eventCode); -} - -const results = Array.from(new Set(eventCodes.concat(EVENT_CODES))).sort(); - -exports.getAllEventCodes = () => { - return results; -}; diff --git a/validateServerless.js b/validateServerless.js deleted file mode 100644 index 662d3d6b935..00000000000 --- a/validateServerless.js +++ /dev/null @@ -1,62 +0,0 @@ -const fs = require('fs'); -const glob = require('glob'); - -let errorsFound = 0; - -glob('web-api/serverless-*.yml', pathMethodLint); - -/** - * - */ -function pathMethodLint(err, files) { - if (err) { - console.error(err); - return; - } - for (const file of files) { - let endpointCollection = {}; - let endpoint = {}; - const lines = fs.readFileSync(file).toString().split('\n'); - - lines.forEach(line => { - let matches; - if ((matches = line.match(/(path|method|handler):\s(\S+)/))) { - endpoint[matches[1]] = matches[2]; - } - if (endpoint.method && endpoint.path) { - const simplified = `${endpoint.method} ${endpoint.path.replace( - /\{\w+\}/, - '{var}', - )}`; - endpointCollection[simplified] = endpointCollection[simplified] || []; - endpointCollection[simplified].push(endpoint); - endpoint = {}; - } - }); - - Object.entries(endpointCollection).forEach(endpointIsUnique); - } - - if (errorsFound > 0) { - console.error( - `FAIL: Serverless configuration linting - ${errorsFound} errors`, - ); - process.exit(1); - } else { - console.info('PASS: Serverless configuration linting'); - process.exit(); - } -} - -/** - * - */ -function endpointIsUnique([simplifiedPath, endpointsWithin]) { - if (endpointsWithin.length > 1) { - errorsFound++; - console.error( - `Likely endpoint conflict on ${simplifiedPath}:\n`, - JSON.stringify(endpointsWithin, null, 2), - ); - } -} diff --git a/wait-until-services.sh b/wait-until-services.sh index de7b0ce3751..70c0c696839 100755 --- a/wait-until-services.sh +++ b/wait-until-services.sh @@ -1,4 +1,3 @@ #!/bin/bash ./wait-until.sh http://localhost:4000/ 404 -./wait-until.sh http://localhost:3011/ 400 true # notifications -- websocket port 3011 diff --git a/web-api/config/custom.yml b/web-api/config/custom.yml deleted file mode 100644 index 8cc97e43d0b..00000000000 --- a/web-api/config/custom.yml +++ /dev/null @@ -1,228 +0,0 @@ -customDefault: &customDefault - logForwarding: - destinationARN: arn:aws:lambda:${opt:region}:${opt:accountId}:function:log_forwarder_${opt:stage} - filterPattern: 'ERROR' - - jetpack: - mode: npm - lockfile: ../package-lock.json - - prune: - automatic: true - number: 3 - - alerts: - stages: - - dev - - stg - - test - - prod - dashboards: true - alarms: - - errorExceptions - definitions: - errorExceptions: - description: 'Internal Error Exception Alarm' - namespace: 'AWS/Lambda' - metric: Errors - threshold: 1 - statistic: Sum - period: 60 - evaluationPeriods: 1 - comparisonOperator: GreaterThanThreshold - pattern: 'ERROR' - topics: - alarm: - topic: arn:aws:sns:${opt:region}:${opt:accountId}:serverless-alerts-topic-${self:provider.stage} - - splitStacks: - perFunction: true - perType: true - - stage: ${opt:stage, 'dev'} - - region: ${opt:region, 'us-east-1'} - - vars: ${file(./config/${opt:stage, 'dev'}.yml)} - -serverless-offline: &serverless-offline-default - skipCacheInvalidation: ${opt:skipCacheInvalidation} - host: 0.0.0.0 - -customDomainDefault: &customDomainDefault - domainName: efcms-${self:provider.stage}.${opt:domain} - endpointType: 'regional' - certificateName: efcms-${self:provider.stage}.${opt:domain} - certificateRegion: ${opt:region} - stage: ${self:provider.stage} - createRoute53Record: false - enabled: true - -api: - <<: *customDefault - serverless-offline: - <<: *serverless-offline-default - port: 3001 - customDomain: - <<: *customDomainDefault - basePath: 'api' - -cases: - <<: *customDefault - serverless-offline: - <<: *serverless-offline-default - port: 3002 - customDomain: - <<: *customDomainDefault - basePath: 'cases' - -users: - <<: *customDefault - serverless-offline: - <<: *serverless-offline-default - port: 3003 - customDomain: - <<: *customDomainDefault - basePath: 'users' - -documents: - <<: *customDefault - serverless-offline: - <<: *serverless-offline-default - port: 3004 - customDomain: - <<: *customDomainDefault - basePath: 'documents' - -work-items: - <<: *customDefault - serverless-offline: - <<: *serverless-offline-default - port: 3005 - customDomain: - <<: *customDomainDefault - basePath: 'work-items' - -sections: - <<: *customDefault - serverless-offline: - <<: *serverless-offline-default - port: 3006 - customDomain: - <<: *customDomainDefault - basePath: 'sections' - -trial-sessions: - <<: *customDefault - serverless-offline: - <<: *serverless-offline-default - port: 3007 - customDomain: - <<: *customDomainDefault - basePath: 'trial-sessions' - -case-documents: - <<: *customDefault - serverless-offline: - <<: *serverless-offline-default - port: 3008 - customDomain: - <<: *customDomainDefault - basePath: 'case-documents' - -case-deadlines: - <<: *customDefault - serverless-offline: - <<: *serverless-offline-default - port: 3009 - customDomain: - <<: *customDomainDefault - basePath: 'case-deadlines' - -case-notes: - <<: *customDefault - serverless-offline: - <<: *serverless-offline-default - port: 3010 - customDomain: - <<: *customDomainDefault - basePath: 'case-notes' - -notifications: - <<: *customDefault - serverless-offline: - <<: *serverless-offline-default - port: 3020 # this port really isn't used, but needs to be unique to prevent address in use errors - websocketPort: 3011 - customDomain: - websocket: - domainName: efcms-${self:provider.stage}-ws.${opt:domain} - endpointType: 'regional' - certificateName: efcms-${self:provider.stage}-ws.${opt:domain} - certificateRegion: ${opt:region} - stage: ${self:provider.stage} - createRoute53Record: false - enabled: true - -public-api: - <<: *customDefault - serverless-offline: - <<: *serverless-offline-default - port: 3013 - customDomain: - <<: *customDomainDefault - basePath: 'public-api' - -case-parties: - <<: *customDefault - serverless-offline: - <<: *serverless-offline-default - port: 3014 - customDomain: - <<: *customDomainDefault - basePath: 'case-parties' - -case-meta: - <<: *customDefault - serverless-offline: - <<: *serverless-offline-default - port: 3015 - customDomain: - <<: *customDomainDefault - basePath: 'case-meta' - -reports: - <<: *customDefault - serverless-offline: - <<: *serverless-offline-default - port: 3016 - customDomain: - <<: *customDomainDefault - basePath: 'reports' - -practitioners: - <<: *customDefault - serverless-offline: - <<: *serverless-offline-default - port: 3017 - customDomain: - <<: *customDomainDefault - basePath: 'practitioners' - -messages: - <<: *customDefault - serverless-offline: - <<: *serverless-offline-default - port: 3018 - customDomain: - <<: *customDomainDefault - basePath: 'messages' - -migrate: - <<: *customDefault - serverless-offline: - <<: *serverless-offline-default - port: 3030 - customDomain: - <<: *customDomainDefault - basePath: 'migrate' diff --git a/web-api/config/dev.yml b/web-api/config/dev.yml deleted file mode 100644 index 5a410629412..00000000000 --- a/web-api/config/dev.yml +++ /dev/null @@ -1 +0,0 @@ -nodeEnv: production \ No newline at end of file diff --git a/web-api/config/environment-variables.yml b/web-api/config/environment-variables.yml deleted file mode 100644 index f1d72ac40ea..00000000000 --- a/web-api/config/environment-variables.yml +++ /dev/null @@ -1,18 +0,0 @@ -S3_ENDPOINT: ${self:custom.vars.s3Endpoint, self:provider.s3Endpoint} -DOCUMENTS_BUCKET_NAME: ${opt:domain}-documents-${opt:stage}-us-east-1 -TEMP_DOCUMENTS_BUCKET_NAME: ${opt:domain}-temp-documents-${opt:stage}-us-east-1 -DYNAMODB_ENDPOINT: ${self:custom.vars.dynamodbEndpoint, self:provider.dynamodbEndpoint} -MASTER_DYNAMODB_ENDPOINT: ${self:custom.vars.masterDynamodbEndpoint, self:provider.masterDynamodbEndpoint} -ELASTICSEARCH_ENDPOINT: ${self:custom.vars.elasticsearchEndpoint, self:provider.elasticsearchEndpoint} -MASTER_REGION: ${self:provider.masterRegion} -STAGE: ${self:custom.stage} -USER_POOL_ID: ${opt:userPoolId, self:provider.userPoolId} -USER_POOL_IRS_ID: ${opt:userPoolIrsId, self.provider.userPoolIrsId} -NODE_ENV: ${self:custom.vars.nodeEnv} -EMAIL_SOURCE: noreply@mail.efcms-${opt:stage}.${opt:domain} -EMAIL_DOCUMENT_SERVED_TEMPLATE: document_served_${opt:stage} -EMAIL_SERVED_PETITION_TEMPLATE: petition_served_${opt:stage} -EFCMS_DOMAIN: ${opt:domain} -CLAMAV_DEF_DIR: ${self:custom.vars.clamavDefDir, self:provider.clamavDefDir} -CIRCLE_HONEYBADGER_API_KEY: ${opt:circleHoneybadgerApiKey} -IRS_SUPERUSER_EMAIL: ${opt:irsSuperuserEmail, self:custom.vars.irsSuperuserEmail} diff --git a/web-api/config/exp1.yml b/web-api/config/exp1.yml deleted file mode 100644 index ef4833446e0..00000000000 --- a/web-api/config/exp1.yml +++ /dev/null @@ -1 +0,0 @@ -nodeEnv: production diff --git a/web-api/config/exp2.yml b/web-api/config/exp2.yml deleted file mode 100644 index ef4833446e0..00000000000 --- a/web-api/config/exp2.yml +++ /dev/null @@ -1 +0,0 @@ -nodeEnv: production diff --git a/web-api/config/irs.yml b/web-api/config/irs.yml deleted file mode 100644 index 6efcb39a2d6..00000000000 --- a/web-api/config/irs.yml +++ /dev/null @@ -1 +0,0 @@ -nodeEnv: irs diff --git a/web-api/config/local.yml b/web-api/config/local.yml deleted file mode 100644 index 65e15e00820..00000000000 --- a/web-api/config/local.yml +++ /dev/null @@ -1,6 +0,0 @@ -s3Endpoint: http://localhost:9000 -dynamodbEndpoint: http://localhost:8000 -masterDynamodbEndpoint: http://localhost:8000 -masterRegion: us-east-1 -nodeEnv: development -clamavDefDir: '' diff --git a/web-api/config/mig.yml b/web-api/config/mig.yml deleted file mode 100644 index ef4833446e0..00000000000 --- a/web-api/config/mig.yml +++ /dev/null @@ -1 +0,0 @@ -nodeEnv: production diff --git a/web-api/config/prod.yml b/web-api/config/prod.yml deleted file mode 100644 index 5a410629412..00000000000 --- a/web-api/config/prod.yml +++ /dev/null @@ -1 +0,0 @@ -nodeEnv: production \ No newline at end of file diff --git a/web-api/config/resources.yml b/web-api/config/resources.yml deleted file mode 100644 index 95534ed48bb..00000000000 --- a/web-api/config/resources.yml +++ /dev/null @@ -1,14 +0,0 @@ -Resources: - ##### - # This Authorizer is used for validating the JWT token before invoking the lambda - ##### - ApiGatewayAuthorizer: - Type: AWS::ApiGateway::Authorizer - Properties: - Name: CognitoUserPool - Type: COGNITO_USER_POOLS - IdentitySource: method.request.header.Authorization - RestApiId: - Ref: ApiGatewayRestApi - ProviderARNs: - - arn:aws:cognito-idp:${opt:region}:${opt:accountId}:userpool/${self:provider.environment.USER_POOL_ID} diff --git a/web-api/config/stg.yml b/web-api/config/stg.yml deleted file mode 100644 index 5a410629412..00000000000 --- a/web-api/config/stg.yml +++ /dev/null @@ -1 +0,0 @@ -nodeEnv: production \ No newline at end of file diff --git a/web-api/config/test.yml b/web-api/config/test.yml deleted file mode 100644 index ef4833446e0..00000000000 --- a/web-api/config/test.yml +++ /dev/null @@ -1 +0,0 @@ -nodeEnv: production diff --git a/web-api/docker-serverless.sh b/web-api/docker-serverless.sh deleted file mode 100755 index 7f188bb9e09..00000000000 --- a/web-api/docker-serverless.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -e -STAGE=$1 -REGION=$2 -docker build -t efcms-build -f ../Dockerfile .. -docker run -e "EFCMS_DOMAIN=${EFCMS_DOMAIN}" --rm efcms-build /bin/sh -c "cd shared && rm -rf node_modules && npm i --only=production && cd ../web-api && ./run-serverless.sh ${STAGE} ${REGION}" \ No newline at end of file diff --git a/web-api/migrations/00005-case-message-required-fields.js b/web-api/migrations/00005-case-message-required-fields.js new file mode 100644 index 00000000000..6c2bcd0ef08 --- /dev/null +++ b/web-api/migrations/00005-case-message-required-fields.js @@ -0,0 +1,41 @@ +const createApplicationContext = require('../src/applicationContext'); +const { + CaseMessage, +} = require('../../shared/src/business/entities/CaseMessage'); +const { isCaseMessageRecord, upGenerator } = require('./utilities'); +const applicationContext = createApplicationContext({}); + +const mutateRecord = async (item, documentClient, tableName) => { + if (isCaseMessageRecord(item)) { + if (!item.caseStatus || !item.caseTitle) { + const caseRecord = await documentClient + .get({ + Key: { + pk: `case|${item.caseId}`, + sk: `case|${item.caseId}`, + }, + TableName: tableName, + }) + .promise(); + + const { caseCaption, status } = caseRecord.Item; + const caseTitle = applicationContext.getCaseTitle(caseCaption); + + const messageAfter = { + ...item, + caseStatus: status, + caseTitle, + }; + + const caseMessageEntity = new CaseMessage(messageAfter, { + applicationContext, + }) + .validate() + .toRawObject(); + + return { ...item, ...caseMessageEntity }; + } + } +}; + +module.exports = { mutateRecord, up: upGenerator(mutateRecord) }; diff --git a/web-api/migrations/00005-case-message-required-fields.test.js b/web-api/migrations/00005-case-message-required-fields.test.js new file mode 100644 index 00000000000..fe2f8bdf7c1 --- /dev/null +++ b/web-api/migrations/00005-case-message-required-fields.test.js @@ -0,0 +1,82 @@ +const { forAllRecords } = require('./utilities'); +const { up } = require('./00005-case-message-required-fields'); + +describe('case messages required fields migration', () => { + let documentClient; + let scanStub; + let putStub; + let getStub; + + let mockCaseMessageItem; + + beforeEach(() => { + mockCaseMessageItem = { + caseId: '3079c990-cc6c-4b99-8fca-8e31f2d9e7a8', + createdAt: '2019-01-01T17:29:13.122Z', + docketNumber: '123-45', + docketNumberWithSuffix: '123-45S', + from: 'gg', + fromSection: 'petitions', + fromUserId: '6805d1ab-18d0-43ec-bafb-654e83405416', + message: 'hello world', + pk: 'case|3079c990-cc6c-4b99-8fca-8e31f2d9e7a8', + sk: 'message|5a79c990-cc6c-4b99-8fca-8e31f2d9e78a', + subject: 'hey!', + to: 'bob', + toSection: 'petitions', + toUserId: '6805d1ab-18d0-43ec-bafb-654e83405416', + }; + + scanStub = jest.fn().mockReturnValue({ + promise: async () => ({ + Items: [mockCaseMessageItem], + }), + }); + + putStub = jest.fn().mockReturnValue({ + promise: async () => ({}), + }); + + getStub = jest.fn().mockReturnValue({ + promise: async () => ({ + Item: { + caseCaption: 'Test Person, Petitioner', + caseId: '3079c990-cc6c-4b99-8fca-8e31f2d9e7a8', + status: 'New', + }, + }), + }); + + documentClient = { + get: getStub, + put: putStub, + scan: scanStub, + }; + }); + + it('does not mutate non case message records', async () => { + mockCaseMessageItem.sk = 'case|3079c990-cc6c-4b99-8fca-8e31f2d9e7a8'; + + await up(documentClient, '', forAllRecords); + + expect(putStub).not.toHaveBeenCalled(); + }); + + it('mutates case message records with missing case status or case title fields', async () => { + const items = [ + { ...mockCaseMessageItem, caseStatus: 'Foo', caseTitle: 'Bar' }, + { ...mockCaseMessageItem, caseStatus: 'Fooz' }, + { ...mockCaseMessageItem, caseTitle: 'Baz' }, + ]; + + documentClient.scan.mockReturnValue({ + promise: async () => ({ + Items: items, + }), + }); + + await up(documentClient, '', forAllRecords); + + expect(putStub.mock.calls.length).toEqual(2); + }); +}); diff --git a/web-api/migrations/00006-case-message-parent-id.js b/web-api/migrations/00006-case-message-parent-id.js new file mode 100644 index 00000000000..aeba69474fc --- /dev/null +++ b/web-api/migrations/00006-case-message-parent-id.js @@ -0,0 +1,25 @@ +const createApplicationContext = require('../src/applicationContext'); +const { + CaseMessage, +} = require('../../shared/src/business/entities/CaseMessage'); +const { isCaseMessageRecord, upGenerator } = require('./utilities'); +const applicationContext = createApplicationContext({}); + +const mutateRecord = async item => { + if (isCaseMessageRecord(item)) { + if (!item.parentMessageId) { + const caseMessage = new CaseMessage( + { + ...item, + parentMessageId: item.messageId, + }, + { applicationContext }, + ) + .validate() + .toRawObject(); + return { ...item, ...caseMessage }; + } + } +}; + +module.exports = { mutateRecord, up: upGenerator(mutateRecord) }; diff --git a/web-api/migrations/00006-case-message-parent-id.test.js b/web-api/migrations/00006-case-message-parent-id.test.js new file mode 100644 index 00000000000..6f268e2285a --- /dev/null +++ b/web-api/migrations/00006-case-message-parent-id.test.js @@ -0,0 +1,87 @@ +const { forAllRecords } = require('./utilities'); +const { up } = require('./00006-case-message-parent-id'); + +describe('case message parent message id migration', () => { + let documentClient; + let scanStub; + let putStub; + let getStub; + + let mockCaseMessageItem; + + beforeEach(() => { + mockCaseMessageItem = { + caseId: '3079c990-cc6c-4b99-8fca-8e31f2d9e7a8', + caseStatus: 'New', + caseTitle: 'Test Petitioner', + createdAt: '2019-01-01T17:29:13.122Z', + docketNumber: '123-45', + docketNumberWithSuffix: '123-45S', + from: 'gg', + fromSection: 'petitions', + fromUserId: '6805d1ab-18d0-43ec-bafb-654e83405416', + message: 'hello world', + messageId: '829e790e-3c22-4308-9267-a251c0d4ce77', + pk: 'case|3079c990-cc6c-4b99-8fca-8e31f2d9e7a8', + sk: 'message|5a79c990-cc6c-4b99-8fca-8e31f2d9e78a', + subject: 'hey!', + to: 'bob', + toSection: 'petitions', + toUserId: '6805d1ab-18d0-43ec-bafb-654e83405416', + }; + + scanStub = jest.fn().mockReturnValue({ + promise: async () => ({ + Items: [mockCaseMessageItem], + }), + }); + + putStub = jest.fn().mockReturnValue({ + promise: async () => ({}), + }); + + getStub = jest.fn().mockReturnValue({ + promise: async () => ({ + Item: mockCaseMessageItem, + }), + }); + + documentClient = { + get: getStub, + put: putStub, + scan: scanStub, + }; + }); + + it('does not mutate non case message records', async () => { + mockCaseMessageItem.sk = 'case|3079c990-cc6c-4b99-8fca-8e31f2d9e7a8'; + + await up(documentClient, '', forAllRecords); + + expect(putStub).not.toHaveBeenCalled(); + }); + + it('mutates case message records with missing parentMessageId field', async () => { + const items = [ + { ...mockCaseMessageItem }, + { + ...mockCaseMessageItem, + parentMessageId: 'b0ff6a42-cada-4808-8908-ecdb0c3c032e', + }, + ]; + + documentClient.scan.mockReturnValue({ + promise: async () => ({ + Items: items, + }), + }); + + await up(documentClient, '', forAllRecords); + + expect(putStub.mock.calls.length).toEqual(1); + expect(putStub.mock.calls[0][0].Item).toMatchObject({ + ...mockCaseMessageItem, + parentMessageId: mockCaseMessageItem.messageId, + }); + }); +}); diff --git a/web-api/migrations/00007-case-message-replied-to.js b/web-api/migrations/00007-case-message-replied-to.js new file mode 100644 index 00000000000..bbb082b37b8 --- /dev/null +++ b/web-api/migrations/00007-case-message-replied-to.js @@ -0,0 +1,19 @@ +const createApplicationContext = require('../src/applicationContext'); +const { + CaseMessage, +} = require('../../shared/src/business/entities/CaseMessage'); +const { isCaseMessageRecord, upGenerator } = require('./utilities'); +const applicationContext = createApplicationContext({}); + +const mutateRecord = async item => { + if (isCaseMessageRecord(item)) { + if (!item.isRepliedTo) { + const caseMessage = new CaseMessage({ ...item }, { applicationContext }) + .validate() + .toRawObject(); + return { ...item, ...caseMessage }; + } + } +}; + +module.exports = { mutateRecord, up: upGenerator(mutateRecord) }; diff --git a/web-api/migrations/00007-case-message-replied-to.test.js b/web-api/migrations/00007-case-message-replied-to.test.js new file mode 100644 index 00000000000..fc3d8f432ca --- /dev/null +++ b/web-api/migrations/00007-case-message-replied-to.test.js @@ -0,0 +1,88 @@ +const { forAllRecords } = require('./utilities'); +const { up } = require('./00007-case-message-replied-to'); + +describe('case message isRepliedTo migration', () => { + let documentClient; + let scanStub; + let putStub; + let getStub; + + let mockCaseMessageItem; + + beforeEach(() => { + mockCaseMessageItem = { + caseId: '3079c990-cc6c-4b99-8fca-8e31f2d9e7a8', + caseStatus: 'New', + caseTitle: 'Test Petitioner', + createdAt: '2019-01-01T17:29:13.122Z', + docketNumber: '123-45', + docketNumberWithSuffix: '123-45S', + from: 'gg', + fromSection: 'petitions', + fromUserId: '6805d1ab-18d0-43ec-bafb-654e83405416', + message: 'hello world', + messageId: '829e790e-3c22-4308-9267-a251c0d4ce77', + parentMessageId: '829e790e-3c22-4308-9267-a251c0d4ce77', + pk: 'case|3079c990-cc6c-4b99-8fca-8e31f2d9e7a8', + sk: 'message|5a79c990-cc6c-4b99-8fca-8e31f2d9e78a', + subject: 'hey!', + to: 'bob', + toSection: 'petitions', + toUserId: '6805d1ab-18d0-43ec-bafb-654e83405416', + }; + + scanStub = jest.fn().mockReturnValue({ + promise: async () => ({ + Items: [mockCaseMessageItem], + }), + }); + + putStub = jest.fn().mockReturnValue({ + promise: async () => ({}), + }); + + getStub = jest.fn().mockReturnValue({ + promise: async () => ({ + Item: mockCaseMessageItem, + }), + }); + + documentClient = { + get: getStub, + put: putStub, + scan: scanStub, + }; + }); + + it('does not mutate non case message records', async () => { + mockCaseMessageItem.sk = 'case|3079c990-cc6c-4b99-8fca-8e31f2d9e7a8'; + + await up(documentClient, '', forAllRecords); + + expect(putStub).not.toHaveBeenCalled(); + }); + + it('mutates case message records with missing isRepliedTo field', async () => { + const items = [ + { ...mockCaseMessageItem }, + { + ...mockCaseMessageItem, + isRepliedTo: true, + }, + ]; + + documentClient.scan.mockReturnValue({ + promise: async () => ({ + Items: items, + }), + }); + + await up(documentClient, '', forAllRecords); + + expect(putStub.mock.calls.length).toEqual(1); + expect(putStub.mock.calls[0][0].Item).toMatchObject({ + ...mockCaseMessageItem, + isRepliedTo: false, + }); + }); +}); diff --git a/web-api/migrations/00008-case-message-completed.js b/web-api/migrations/00008-case-message-completed.js new file mode 100644 index 00000000000..76020531b31 --- /dev/null +++ b/web-api/migrations/00008-case-message-completed.js @@ -0,0 +1,19 @@ +const createApplicationContext = require('../src/applicationContext'); +const { + CaseMessage, +} = require('../../shared/src/business/entities/CaseMessage'); +const { isCaseMessageRecord, upGenerator } = require('./utilities'); +const applicationContext = createApplicationContext({}); + +const mutateRecord = async item => { + if (isCaseMessageRecord(item)) { + if (!item.isCompleted) { + const caseMessage = new CaseMessage({ ...item }, { applicationContext }) + .validate() + .toRawObject(); + return { ...item, ...caseMessage }; + } + } +}; + +module.exports = { mutateRecord, up: upGenerator(mutateRecord) }; diff --git a/web-api/migrations/00008-case-message-completed.test.js b/web-api/migrations/00008-case-message-completed.test.js new file mode 100644 index 00000000000..4f40cacc976 --- /dev/null +++ b/web-api/migrations/00008-case-message-completed.test.js @@ -0,0 +1,89 @@ +const { forAllRecords } = require('./utilities'); +const { up } = require('./00008-case-message-completed'); + +describe('case message isCompleted migration', () => { + let documentClient; + let scanStub; + let putStub; + let getStub; + + let mockCaseMessageItem; + + beforeEach(() => { + mockCaseMessageItem = { + caseId: '3079c990-cc6c-4b99-8fca-8e31f2d9e7a8', + caseStatus: 'New', + caseTitle: 'Test Petitioner', + createdAt: '2019-01-01T17:29:13.122Z', + docketNumber: '123-45', + docketNumberWithSuffix: '123-45S', + from: 'gg', + fromSection: 'petitions', + fromUserId: '6805d1ab-18d0-43ec-bafb-654e83405416', + isRepliedTo: false, + message: 'hello world', + messageId: '829e790e-3c22-4308-9267-a251c0d4ce77', + parentMessageId: '829e790e-3c22-4308-9267-a251c0d4ce77', + pk: 'case|3079c990-cc6c-4b99-8fca-8e31f2d9e7a8', + sk: 'message|5a79c990-cc6c-4b99-8fca-8e31f2d9e78a', + subject: 'hey!', + to: 'bob', + toSection: 'petitions', + toUserId: '6805d1ab-18d0-43ec-bafb-654e83405416', + }; + + scanStub = jest.fn().mockReturnValue({ + promise: async () => ({ + Items: [mockCaseMessageItem], + }), + }); + + putStub = jest.fn().mockReturnValue({ + promise: async () => ({}), + }); + + getStub = jest.fn().mockReturnValue({ + promise: async () => ({ + Item: mockCaseMessageItem, + }), + }); + + documentClient = { + get: getStub, + put: putStub, + scan: scanStub, + }; + }); + + it('does not mutate non case message records', async () => { + mockCaseMessageItem.sk = 'case|3079c990-cc6c-4b99-8fca-8e31f2d9e7a8'; + + await up(documentClient, '', forAllRecords); + + expect(putStub).not.toHaveBeenCalled(); + }); + + it('mutates case message records with missing isCompleted field', async () => { + const items = [ + { ...mockCaseMessageItem }, + { + ...mockCaseMessageItem, + isCompleted: true, + }, + ]; + + documentClient.scan.mockReturnValue({ + promise: async () => ({ + Items: items, + }), + }); + + await up(documentClient, '', forAllRecords); + + expect(putStub.mock.calls.length).toEqual(1); + expect(putStub.mock.calls[0][0].Item).toMatchObject({ + ...mockCaseMessageItem, + isCompleted: false, + }); + }); +}); diff --git a/web-api/migrations/utilities.js b/web-api/migrations/utilities.js index f05d05210f0..da001471732 100644 --- a/web-api/migrations/utilities.js +++ b/web-api/migrations/utilities.js @@ -1,3 +1,5 @@ +const isCaseMessageRecord = item => + item.pk.startsWith('case|') && item.sk.startsWith('message|'); const isCaseRecord = item => !!item.caseType; const isTrialSessionRecord = item => !!item.caseOrder && !!item.trialSessionId && !!item.maxCases; @@ -51,6 +53,7 @@ const upGenerator = mutateFunction => async ( module.exports = { forAllRecords, + isCaseMessageRecord, isCaseRecord, isNewUserCaseMappingRecord, isTrialSessionRecord, diff --git a/web-api/migrations/utilities.test.js b/web-api/migrations/utilities.test.js index 6bac7f70c9e..018e4b87cd9 100644 --- a/web-api/migrations/utilities.test.js +++ b/web-api/migrations/utilities.test.js @@ -3,6 +3,7 @@ const { } = require('../../shared/src/business/entities/EntityConstants'); const { forAllRecords, + isCaseMessageRecord, isCaseRecord, isNewUserCaseMappingRecord, isTrialSessionRecord, @@ -11,6 +12,26 @@ const { } = require('./utilities'); describe('utilities', () => { + describe('isCaseMessageRecord', () => { + it('should return true if the item is a case message record', () => { + const result = isCaseMessageRecord({ + pk: 'case|', + sk: 'message|', + }); + + expect(result).toEqual(true); + }); + + it('should return false if the item is not a case message record', () => { + const result = isCaseMessageRecord({ + pk: 'case|', + sk: 'case|', + }); + + expect(result).toEqual(false); + }); + }); + describe('isCaseRecord', () => { it('should return true if the item is a case record', () => { const result = isCaseRecord({ diff --git a/web-api/proxy.js b/web-api/proxy.js deleted file mode 100644 index 9a36add463e..00000000000 --- a/web-api/proxy.js +++ /dev/null @@ -1,57 +0,0 @@ -/* eslint-disable no-console */ -const express = require('express'); -const isReachable = require('is-reachable'); -const { createProxyMiddleware } = require('http-proxy-middleware'); - -// https://github.com/chimurai/http-proxy-middleware#options - -const PROXY_REACHABLE_TIMEOUT = 30 * 1000; // 30 seconds -const PROXY_HOST = 'localhost'; -const PROXY_PORT = 3000; -const LOG_LEVEL = 'info'; // ['debug', 'info', 'warn', 'error', 'silent']. Default: 'info' - -// do not include trailing slashes -const PROXY_DESTINATIONS = { - '/notifications': `http://${PROXY_HOST}:3011`, -}; - -const proxyMain = async () => { - const pathRewrite = {}; - const router = {}; - - Object.entries(PROXY_DESTINATIONS).forEach(([path, destination]) => { - pathRewrite[`^${path}`] = ''; - router[`${PROXY_HOST}:${PROXY_PORT}${path}`] = destination; - }); - - if (LOG_LEVEL == 'debug') { - console.log('Path Rewrites', pathRewrite); - console.log('Router:', router); - } - - const proxyObj = createProxyMiddleware('**', { - headers: { - Connection: 'keep-alive', - }, - logLevel: LOG_LEVEL, - pathRewrite, - router, - target: `http://${PROXY_HOST}:1234`, - }); - - const app = express(); - app.use('/', proxyObj); - - app.listen(PROXY_PORT); - - const isProxyReachable = uri => { - // hitting '/TEST/PROXY' to deliberately elicit a 404 rather than 403 which clutters authorization logs - return isReachable(`${uri}/TEST/PROXY`, { - timeout: PROXY_REACHABLE_TIMEOUT, - }); - }; - - await Promise.all(Object.values(PROXY_DESTINATIONS).map(isProxyReachable)); -}; - -proxyMain(); diff --git a/web-api/run-serverless-clamav.sh b/web-api/run-serverless-clamav.sh deleted file mode 100755 index 53dc80d02cd..00000000000 --- a/web-api/run-serverless-clamav.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -e - -slsStage=$1 -region=$2 -layer="serverless-clamav.yml" - -tar -xvzf web-api/runtimes/clamav/clamav_lambda_layer.tar.gz -C web-api/runtimes/clamav - -SLS_DEPLOYMENT_BUCKET="${EFCMS_DOMAIN}.efcms.${slsStage}.${region}.deploys" -SLS_DEPLOYMENT_BUCKET="${SLS_DEPLOYMENT_BUCKET}" SLS_DEBUG="*" ./node_modules/.bin/sls deploy --config "web-api/${layer}" --stage "${slsStage}" --region "${region}" --verbose \ No newline at end of file diff --git a/web-api/run-serverless-notifications.sh b/web-api/run-serverless-notifications.sh deleted file mode 100755 index 1bcbf5d59a5..00000000000 --- a/web-api/run-serverless-notifications.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -e -./web-api/run-serverless.sh "${1}" "${2}" "notificationHandlers.js" "serverless-notifications.yml" "build:api:notifications" diff --git a/web-api/run-serverless-public-api.sh b/web-api/run-serverless-public-api.sh deleted file mode 100755 index a864d514c2f..00000000000 --- a/web-api/run-serverless-public-api.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -e - -./web-api/run-serverless.sh "${1}" "${2}" "publicApiHandlers.js" "serverless-public-api.yml" "build:api:public" diff --git a/web-api/run-serverless-puppeteer.sh b/web-api/run-serverless-puppeteer.sh deleted file mode 100755 index f347739895b..00000000000 --- a/web-api/run-serverless-puppeteer.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -e - -slsStage=$1 -region=$2 -layer="serverless-puppeteer.yml" - -tar -xvzf web-api/runtimes/puppeteer/puppeteer_lambda_layer.tar.gz -C web-api/runtimes/puppeteer - -SLS_DEPLOYMENT_BUCKET="${EFCMS_DOMAIN}.efcms.${slsStage}.${region}.deploys" - -echo "${SLS_DEPLOYMENT_BUCKET}" - -SLS_DEBUG="*" SLS_DEPLOYMENT_BUCKET="${SLS_DEPLOYMENT_BUCKET}" ./node_modules/.bin/sls deploy --config "web-api/${layer}" --stage "${slsStage}" --region "${region}" --verbose diff --git a/web-api/run-serverless.sh b/web-api/run-serverless.sh deleted file mode 100755 index e4ea0bc030d..00000000000 --- a/web-api/run-serverless.sh +++ /dev/null @@ -1,89 +0,0 @@ -#!/bin/bash -e - -slsStage="${1}" -region="${2}" -handler="${3}" -config="${4}" -build="${5}" - -pushd ./web-api/terraform/main - ../bin/deploy-init.sh "${slsStage}" - ELASTICSEARCH_ENDPOINT="$(terraform output elasticsearch_endpoint)" - export ELASTICSEARCH_ENDPOINT -popd - -USER_POOL_ID=$(aws cognito-idp list-user-pools --query "UserPools[?Name == 'efcms-${slsStage}'].Id | [0]" --max-results 30 --region "us-east-1") -# remove quotes surrounding string -USER_POOL_ID="${USER_POOL_ID%\"}" -USER_POOL_ID="${USER_POOL_ID#\"}" - -USER_POOL_IRS_ID=$(aws cognito-idp list-user-pools --query "UserPools[?Name == 'efcms-irs-${slsStage}'].Id | [0]" --max-results 30 --region "us-east-1") -USER_POOL_IRS_ID="${USER_POOL_IRS_ID%\"}" -USER_POOL_IRS_ID="${USER_POOL_IRS_ID#\"}" - -ACCOUNT_ID=$(aws sts get-caller-identity --query "Account") -# remove quotes surrounding string -ACCOUNT_ID="${ACCOUNT_ID%\"}" -ACCOUNT_ID="${ACCOUNT_ID#\"}" -export NODE_PRESERVE_SYMLINKS=1 -find ./web-api/src -type f -exec chmod -R ugo+r {} ";" - -npm run build:assets -npm run "${build}" -cp "./web-api/src/${handler}" /tmp -cp "./dist/${handler}" web-api/src - -export SLS_DEPLOYMENT_BUCKET="${EFCMS_DOMAIN}.efcms.${slsStage}.${region}.deploys" -export SLS_DEBUG="*" - -#CURRENT_COLOR=$(aws dynamodb get-item --region us-east-1 --table-name "efcms-deploy-${slsStage}" --key '{"pk":{"S":"deployed-stack"},"sk":{"S":"deployed-stack"}}' | jq -r ".Item.current.S") - -#echo "current color: ${CURRENT_COLOR}" - -#if [[ $CURRENT_COLOR == 'green' ]] ; then -# NEW_COLOR='blue' -#else -# NEW_COLOR='green' -#fi - -#echo "new color: ${NEW_COLOR}" - -# temp fix until serverless-domain-manager issue is resolved -NEW_COLOR="green" - -handlerCkSum=$(cksum "./web-api/src/${handler}" | awk '{print $1}') -configCkSum=$(cksum "./web-api/${config}" | awk '{print $1}') -lockCkSum=$(cksum package-lock.json | awk '{print $1}') -ckSum="${handlerCkSum} ${lockCkSum} ${configCkSum}" -deployedCkSum=$(aws dynamodb get-item --region us-east-1 --table-name "efcms-deploy-${slsStage}" --key '{"pk":{"S":"check-sum-'"${region}"'-'"${config}"'-'"${NEW_COLOR}"'"},"sk":{"S":"check-sum-'"${region}"'-'"${config}"'-'"${NEW_COLOR}"'"}}' | jq -r ".Item.cksum.S") - -if [ "${deployedCkSum}" == "${ckSum}" ] ; then - echo "check sums were equal, skipping the stack deploy" - exit 0; -fi - -set -- \ - --accountId "${ACCOUNT_ID}" \ - --config "./web-api/${config}" \ - --domain "${EFCMS_DOMAIN}" \ - --efcmsTableName="efcms-${slsStage}" \ - --region "${region}" \ - --stage "${slsStage}" \ - --stageColor "${NEW_COLOR}" \ - --userPoolId "${USER_POOL_ID}" \ - --userPoolIrsId "${USER_POOL_IRS_ID}" \ - --dynamo_stream_arn="${DYNAMO_STREAM_ARN}" \ - --elasticsearch_endpoint="${ELASTICSEARCH_ENDPOINT}" \ - --circleHoneybadgerApiKey="${CIRCLE_HONEYBADGER_API_KEY}" \ - --irsSuperuserEmail="${IRS_SUPERUSER_EMAIL}" \ - --verbose - -ENVIRONMENT="${slsStage}" ./node_modules/.bin/sls deploy --verbose "$@" -echo "done running sls deploy" - -echo "slsStage: ${slsStage}" -echo "region: ${region}" - -cp "/tmp/${handler}" src - -aws dynamodb put-item --region us-east-1 --table-name "efcms-deploy-${slsStage}" --item '{"pk":{"S":"check-sum-'"${region}"'-'"${config}"'-'"${NEW_COLOR}"'"},"sk":{"S":"check-sum-'"${region}"'-'"${config}"'-'"${NEW_COLOR}"'"},"cksum":{"S":"'"${ckSum}"'"}}' diff --git a/web-api/serverless-notifications.yml b/web-api/serverless-notifications.yml deleted file mode 100644 index 001490fa002..00000000000 --- a/web-api/serverless-notifications.yml +++ /dev/null @@ -1,67 +0,0 @@ -service: ef-cms-notifications - -plugins: - - serverless-domain-manager - - serverless-offline - - serverless-prune-plugin - - serverless-plugin-tracing - - serverless-latest-layer-version - - serverless-jetpack - - serverless-log-forwarding - -custom: ${file(./web-api/config/custom.yml):notifications} - -provider: - name: aws - endpointType: REGIONAL - tracing: true - stage: ${self:custom.stage} - region: ${self:custom.region} - runtime: nodejs12.x - websocketApiRouteSelectionExpression: $request.body.action - memorySize: 768 - timeout: 30 - logRetentionInDays: 7 - role: arn:aws:iam::${opt:accountId}:role/lambda_role_${opt:stage} - dir: ${opt:run_dir, 'src'} - s3Endpoint: s3.us-east-1.amazonaws.com - dynamodbEndpoint: dynamodb.${opt:region}.amazonaws.com - masterRegion: us-east-1 - userPoolId: us-east-1_7uRkF0Axn - masterDynamodbEndpoint: dynamodb.us-east-1.amazonaws.com - deploymentBucket: - name: ${env:SLS_DEPLOYMENT_BUCKET} - serverSideEncryption: AES256 - apiGateway: - binaryMediaTypes: - - 'application/pdf' - clamavDefDir: /opt/var/lib/clamav - - environment: ${file(./web-api/config/environment-variables.yml)} - -package: - exclude: - - ./** - include: - - web-api/${self:provider.dir}/notificationHandlers.js - - excludeDevDependencies: true - -functions: - connectHandler: - handler: web-api/${self:provider.dir}/notificationHandlers.connectLambda - events: - - websocket: - route: $connect - authorizer: - arn: arn:aws:lambda:${opt:region}:${opt:accountId}:function:cognito_authorizer_lambda_${opt:stage} - managedExternally: true - identitySource: - - route.request.querystring.token - type: request - - disconnectHandler: - handler: web-api/${self:provider.dir}/notificationHandlers.disconnectLambda - events: - - websocket: - route: $disconnect diff --git a/web-api/setup-sns-subscriptions.sh b/web-api/setup-sns-subscriptions.sh deleted file mode 100755 index c193e6b6e25..00000000000 --- a/web-api/setup-sns-subscriptions.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -ENV=$1 - -aws sns list-subscriptions-by-topic \ - --topic-arn="arn:aws:sns:us-east-1:$AWS_ACCOUNT_ID:serverless-alerts-topic-$ENV" \ - --region us-east-1 | grep "ustaxcourt@flexion.us" -code=$? - -if [ "${code}" -ne "0" ]; then - echo "no subscription found, creating a subscription" - - aws sns subscribe \ - --topic-arn="arn:aws:sns:us-east-1:$AWS_ACCOUNT_ID:serverless-alerts-topic-$ENV" \ - --protocol email \ - --notification-endpoint="ustaxcourt@flexion.us" \ - --region us-east-1 - - aws sns subscribe \ - --topic-arn="arn:aws:sns:us-west-1:$AWS_ACCOUNT_ID:serverless-alerts-topic-$ENV" \ - --protocol email \ - --notification-endpoint="ustaxcourt@flexion.us" \ - --region us-west-1 -else - echo "subscription exists; skipping" -fi diff --git a/web-api/sonar-project.properties b/web-api/sonar-project.properties index 3e121fa0695..0dec527ddc1 100644 --- a/web-api/sonar-project.properties +++ b/web-api/sonar-project.properties @@ -5,7 +5,7 @@ sonar.projectVersion=1.0 # Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. # This property is optional if sonar.modules is set. sonar.sources=./src -sonar.exclusions=**/node_modules/**/*, **/*.test.js, **/coverage/**, **/*Lambda.js, **/applicationContext.js, **/*Handlers.js +sonar.exclusions=**/node_modules/**/*, **/*.test.js, **/coverage/**, **/*Lambda.js, **/applicationContext.js, **/*Handlers.js, **/app-local.js, **/app-public-local.js, , **/app-public.js, , **/app.js sonar.javascript.file.suffixes=.js # Encoding of the source code. Default is default system encoding diff --git a/web-api/src/app.js b/web-api/src/app.js index e86b4cac87e..7c2cf111c4c 100644 --- a/web-api/src/app.js +++ b/web-api/src/app.js @@ -6,7 +6,7 @@ const { lambdaWrapper } = require('./lambdaWrapper'); const app = express(); app.use(cors()); -app.use(bodyParser.json()); +app.use(bodyParser.json({ limit: '1000kb' })); app.use(bodyParser.urlencoded({ extended: true })); app.use((req, res, next) => { if (process.env.NODE_ENV !== 'production') { @@ -46,6 +46,9 @@ const { const { caseAdvancedSearchLambda, } = require('./cases/caseAdvancedSearchLambda'); +const { + completeCaseMessageLambda, +} = require('./messages/completeCaseMessageLambda'); const { completeDocketEntryQCLambda, } = require('./documents/completeDocketEntryQCLambda'); @@ -112,6 +115,9 @@ const { const { fileExternalDocumentToConsolidatedCasesLambda, } = require('./documents/fileExternalDocumentToConsolidatedCasesLambda'); +const { + forwardCaseMessageLambda, +} = require('./messages/forwardCaseMessageLambda'); const { generateDocketRecordPdfLambda, } = require('./cases/generateDocketRecordPdfLambda'); @@ -139,6 +145,18 @@ const { const { getCaseInventoryReportLambda, } = require('./reports/getCaseInventoryReportLambda'); +const { + getCaseMessagesForCaseLambda, +} = require('./messages/getCaseMessagesForCaseLambda'); +const { + getCaseMessageThreadLambda, +} = require('./messages/getCaseMessageThreadLambda'); +const { + getCompletedCaseMessagesForSectionLambda, +} = require('./messages/getCompletedCaseMessagesForSectionLambda'); +const { + getCompletedCaseMessagesForUserLambda, +} = require('./messages/getCompletedCaseMessagesForUserLambda'); const { getConsolidatedCasesByCaseLambda, } = require('./cases/getConsolidatedCasesByCaseLambda'); @@ -232,6 +250,9 @@ const { const { removeConsolidatedCasesLambda, } = require('./cases/removeConsolidatedCasesLambda'); +const { + replyToCaseMessageLambda, +} = require('./messages/replyToCaseMessageLambda'); const { runTrialSessionPlanningReportLambda, } = require('./trialSessions/runTrialSessionPlanningReportLambda'); @@ -328,7 +349,6 @@ const { deleteCaseNoteLambda } = require('./caseNote/deleteCaseNoteLambda'); const { forwardWorkItemLambda } = require('./workitems/forwardWorkItemLambda'); const { getBlockedCasesLambda } = require('./reports/getBlockedCasesLambda'); const { getCaseLambda } = require('./cases/getCaseLambda'); -const { getCaseMessageLambda } = require('./messages/getCaseMessageLambda'); const { getCasesByUserLambda } = require('./cases/getCasesByUserLambda'); const { getClosedCasesLambda } = require('./cases/getClosedCasesLambda'); const { getInternalUsersLambda } = require('./users/getInternalUsersLambda'); @@ -626,23 +646,47 @@ app.post( /** * messages */ -app.get('/messages/:messageId', lambdaWrapper(getCaseMessageLambda)); +app.post( + '/messages/:parentMessageId/reply', + lambdaWrapper(replyToCaseMessageLambda), +); +app.post( + '/messages/:parentMessageId/forward', + lambdaWrapper(forwardCaseMessageLambda), +); +app.post( + '/messages/:parentMessageId/complete', + lambdaWrapper(completeCaseMessageLambda), +); app.get( - '/messages/inbox/:userId', - lambdaWrapper(getInboxCaseMessagesForUserLambda), + '/messages/:parentMessageId', + lambdaWrapper(getCaseMessageThreadLambda), ); +app.get('/messages/case/:caseId', lambdaWrapper(getCaseMessagesForCaseLambda)); app.get( '/messages/inbox/section/:section', lambdaWrapper(getInboxCaseMessagesForSectionLambda), ); app.get( - '/messages/outbox/:userId', - lambdaWrapper(getOutboxCaseMessagesForUserLambda), + '/messages/inbox/:userId', + lambdaWrapper(getInboxCaseMessagesForUserLambda), ); app.get( '/messages/outbox/section/:section', lambdaWrapper(getOutboxCaseMessagesForSectionLambda), ); +app.get( + '/messages/outbox/:userId', + lambdaWrapper(getOutboxCaseMessagesForUserLambda), +); +app.get( + '/messages/completed/section/:section', + lambdaWrapper(getCompletedCaseMessagesForSectionLambda), +); +app.get( + '/messages/completed/:userId', + lambdaWrapper(getCompletedCaseMessagesForUserLambda), +); app.post('/messages', lambdaWrapper(createCaseMessageLambda)); /** diff --git a/web-api/src/applicationContext.js b/web-api/src/applicationContext.js index cd4b4ea158e..64092cfd991 100644 --- a/web-api/src/applicationContext.js +++ b/web-api/src/applicationContext.js @@ -105,6 +105,9 @@ const { compareISODateStrings, compareStrings, } = require('../../shared/src/business/utilities/sortFunctions'); +const { + completeCaseMessageInteractor, +} = require('../../shared/src/business/useCases/messages/completeCaseMessageInteractor'); const { completeDocketEntryQCInteractor, } = require('../../shared/src/business/useCases/editDocketEntry/completeDocketEntryQCInteractor'); @@ -153,6 +156,9 @@ const { formatNow, prepareDateFromString, } = require('../../shared/src/business/utilities/DateHandler'); +const { + createPetitionerAccountInteractor, +} = require('../../shared/src/business/useCases/users/createPetitionerAccountInteractor'); const { createPractitionerUser, } = require('../../shared/src/persistence/dynamo/users/createPractitionerUser'); @@ -288,6 +294,9 @@ const { const { formatJudgeName, } = require('../../shared/src/business/utilities/getFormattedJudgeName'); +const { + forwardCaseMessageInteractor, +} = require('../../shared/src/business/useCases/messages/forwardCaseMessageInteractor'); const { forwardWorkItemInteractor, } = require('../../shared/src/business/useCases/workitems/forwardWorkItemInteractor'); @@ -375,11 +384,17 @@ const { getCaseInventoryReportInteractor, } = require('../../shared/src/business/useCases/caseInventoryReport/getCaseInventoryReportInteractor'); const { - getCaseMessageById, -} = require('../../shared/src/persistence/dynamo/messages/getCaseMessageById'); + getCaseMessagesByCaseId, +} = require('../../shared/src/persistence/dynamo/messages/getCaseMessagesByCaseId'); +const { + getCaseMessagesForCaseInteractor, +} = require('../../shared/src/business/useCases/messages/getCaseMessagesForCaseInteractor'); const { - getCaseMessageInteractor, -} = require('../../shared/src/business/useCases/messages/getCaseMessageInteractor'); + getCaseMessageThreadByParentId, +} = require('../../shared/src/persistence/dynamo/messages/getCaseMessageThreadByParentId'); +const { + getCaseMessageThreadInteractor, +} = require('../../shared/src/business/useCases/messages/getCaseMessageThreadInteractor'); const { getCasesByCaseIds, } = require('../../shared/src/persistence/dynamo/cases/getCasesByCaseIds'); @@ -401,6 +416,18 @@ const { const { getClosedCasesInteractor, } = require('../../shared/src/business/useCases/getClosedCasesInteractor'); +const { + getCompletedCaseMessagesForSectionInteractor, +} = require('../../shared/src/business/useCases/messages/getCompletedCaseMessagesForSectionInteractor'); +const { + getCompletedCaseMessagesForUserInteractor, +} = require('../../shared/src/business/useCases/messages/getCompletedCaseMessagesForUserInteractor'); +const { + getCompletedSectionInboxMessages, +} = require('../../shared/src/persistence/elasticsearch/messages/getCompletedSectionInboxMessages'); +const { + getCompletedUserInboxMessages, +} = require('../../shared/src/persistence/elasticsearch/messages/getCompletedUserInboxMessages'); const { getConsolidatedCasesByCaseInteractor, } = require('../../shared/src/business/useCases/getConsolidatedCasesByCaseInteractor'); @@ -654,6 +681,12 @@ const { const { isFileExists, } = require('../../shared/src/persistence/s3/isFileExists'); +const { + markCaseMessageRepliedTo, +} = require('../../shared/src/persistence/dynamo/messages/markCaseMessageRepliedTo'); +const { + markCaseMessageThreadRepliedTo, +} = require('../../shared/src/persistence/dynamo/messages/markCaseMessageThreadRepliedTo'); const { migrateCaseInteractor, } = require('../../shared/src/business/useCases/migrateCaseInteractor'); @@ -678,6 +711,9 @@ const { const { orderPublicSearchInteractor, } = require('../../shared/src/business/useCases/public/orderPublicSearchInteractor'); +const { + persistUser, +} = require('../../shared/src/persistence/dynamo/users/persistUser'); const { Practitioner, } = require('../../shared/src/business/entities/Practitioner'); @@ -708,6 +744,9 @@ const { const { removeConsolidatedCasesInteractor, } = require('../../shared/src/business/useCases/caseConsolidation/removeConsolidatedCasesInteractor'); +const { + replyToCaseMessageInteractor, +} = require('../../shared/src/business/useCases/messages/replyToCaseMessageInteractor'); const { reprocessFailedRecordsInteractor, } = require('../../shared/src/business/useCases/reprocessFailedRecordsInteractor'); @@ -816,6 +855,9 @@ const { const { updateCaseDeadlineInteractor, } = require('../../shared/src/business/useCases/caseDeadline/updateCaseDeadlineInteractor'); +const { + updateCaseMessage, +} = require('../../shared/src/persistence/dynamo/messages/updateCaseMessage'); const { updateCaseTrialSortMappingRecords, } = require('../../shared/src/persistence/dynamo/cases/updateCaseTrialSortMappingRecords'); @@ -1199,11 +1241,14 @@ module.exports = appContextUser => { getCaseByDocketNumber, getCaseDeadlinesByCaseId, getCaseInventoryReport, - getCaseMessageById, + getCaseMessageThreadByParentId, + getCaseMessagesByCaseId, getCasesByCaseIds, getCasesByLeadCaseId, getCasesByUser, getClosedCasesByUser, + getCompletedSectionInboxMessages, + getCompletedUserInboxMessages, getDocument, getDocumentQCInboxForSection, getDocumentQCInboxForUser, @@ -1246,6 +1291,9 @@ module.exports = appContextUser => { incrementCounter, indexRecord, isFileExists, + markCaseMessageRepliedTo, + markCaseMessageThreadRepliedTo, + persistUser, putWorkItemInOutbox, putWorkItemInUsersOutbox, saveDocumentFromLambda, @@ -1258,6 +1306,7 @@ module.exports = appContextUser => { setWorkItemAsRead, updateCase, updateCaseDeadline, + updateCaseMessage, updateCaseTrialSortMappingRecords, updateDocketRecord, updateDocument, @@ -1365,6 +1414,7 @@ module.exports = appContextUser => { caseAdvancedSearchInteractor, casePublicSearchInteractor, checkForReadyForTrialCasesInteractor, + completeCaseMessageInteractor, completeDocketEntryQCInteractor, completeWorkItemInteractor, createCaseDeadlineInteractor, @@ -1372,6 +1422,7 @@ module.exports = appContextUser => { createCaseInteractor, createCaseMessageInteractor, createCourtIssuedOrderPdfFromHtmlInteractor, + createPetitionerAccountInteractor, createPractitionerUserInteractor, createTrialSessionInteractor, createUserInteractor, @@ -1390,6 +1441,7 @@ module.exports = appContextUser => { fileDocketEntryInteractor, fileExternalDocumentForConsolidatedInteractor, fileExternalDocumentInteractor, + forwardCaseMessageInteractor, forwardWorkItemInteractor, generateDocketRecordPdfInteractor, generateNoticeOfTrialIssuedInteractor, @@ -1408,9 +1460,12 @@ module.exports = appContextUser => { getCaseForPublicDocketSearchInteractor, getCaseInteractor, getCaseInventoryReportInteractor, - getCaseMessageInteractor, + getCaseMessageThreadInteractor, + getCaseMessagesForCaseInteractor, getCasesByUserInteractor, getClosedCasesInteractor, + getCompletedCaseMessagesForSectionInteractor, + getCompletedCaseMessagesForUserInteractor, getConsolidatedCasesByCaseInteractor, getDocumentQCInboxForSectionInteractor, getDocumentQCInboxForUserInteractor, @@ -1459,6 +1514,7 @@ module.exports = appContextUser => { removeCaseFromTrialInteractor, removeCasePendingItemInteractor, removeConsolidatedCasesInteractor, + replyToCaseMessageInteractor, reprocessFailedRecordsInteractor, runTrialSessionPlanningReportInteractor, saveCaseDetailInternalEditInteractor, diff --git a/web-api/src/caseDeadlinesHandlers.js b/web-api/src/caseDeadlinesHandlers.js deleted file mode 100644 index 0750578d73c..00000000000 --- a/web-api/src/caseDeadlinesHandlers.js +++ /dev/null @@ -1,12 +0,0 @@ -module.exports = { - createCaseDeadlineLambda: require('./caseDeadline/createCaseDeadlineLambda') - .createCaseDeadlineLambda, - deleteCaseDeadlineLambda: require('./caseDeadline/deleteCaseDeadlineLambda') - .deleteCaseDeadlineLambda, - getAllCaseDeadlinesLambda: require('./caseDeadline/getAllCaseDeadlinesLambda') - .getAllCaseDeadlinesLambda, - getCaseDeadlinesForCaseLambda: require('./caseDeadline/getCaseDeadlinesForCaseLambda') - .getCaseDeadlinesForCaseLambda, - updateCaseDeadlineLambda: require('./caseDeadline/updateCaseDeadlineLambda') - .updateCaseDeadlineLambda, -}; diff --git a/web-api/src/caseDocumentsHandlers.js b/web-api/src/caseDocumentsHandlers.js deleted file mode 100644 index 349b760390d..00000000000 --- a/web-api/src/caseDocumentsHandlers.js +++ /dev/null @@ -1,46 +0,0 @@ -module.exports = { - addCoversheetLambda: require('./documents/addCoversheetLambda') - .addCoversheetLambda, - archiveDraftDocumentLambda: require('./documents/archiveDraftDocumentLambda') - .archiveDraftDocumentLambda, - completeDocketEntryQCLambda: require('./documents/completeDocketEntryQCLambda') - .completeDocketEntryQCLambda, - createWorkItemLambda: require('./workitems/createWorkItemLambda') - .createWorkItemLambda, - deleteCorrespondenceDocumentLambda: require('./correspondence/deleteCorrespondenceDocumentLambda') - .deleteCorrespondenceDocumentLambda, - downloadPolicyUrlLambda: require('./documents/downloadPolicyUrlLambda') - .downloadPolicyUrlLambda, - fileCorrespondenceDocumentLambda: require('./correspondence/fileCorrespondenceDocumentLambda') - .fileCorrespondenceDocumentLambda, - fileCourtIssuedDocketEntryLambda: require('./documents/fileCourtIssuedDocketEntryLambda') - .fileCourtIssuedDocketEntryLambda, - fileCourtIssuedOrderToCaseLambda: require('./documents/fileCourtIssuedOrderToCaseLambda') - .fileCourtIssuedOrderToCaseLambda, - fileDocketEntryToCaseLambda: require('./documents/fileDocketEntryToCaseLambda') - .fileDocketEntryToCaseLambda, - fileExternalDocumentToCaseLambda: require('./documents/fileExternalDocumentToCaseLambda') - .fileExternalDocumentToCaseLambda, - fileExternalDocumentToConsolidatedCasesLambda: require('./documents/fileExternalDocumentToConsolidatedCasesLambda') - .fileExternalDocumentToConsolidatedCasesLambda, - getDocumentDownloadUrlLambda: require('./documents/getDocumentDownloadUrlLambda') - .getDocumentDownloadUrlLambda, - opinionAdvancedSearchLambda: require('./documents/opinionAdvancedSearchLambda') - .opinionAdvancedSearchLambda, - orderAdvancedSearchLambda: require('./documents/orderAdvancedSearchLambda') - .orderAdvancedSearchLambda, - serveCourtIssuedDocumentLambda: require('./cases/serveCourtIssuedDocumentLambda') - .serveCourtIssuedDocumentLambda, - signDocumentLambda: require('./documents/signDocumentLambda') - .signDocumentLambda, - updateCorrespondenceDocumentLambda: require('./correspondence/updateCorrespondenceDocumentLambda') - .updateCorrespondenceDocumentLambda, - updateCourtIssuedDocketEntryLambda: require('./documents/updateCourtIssuedDocketEntryLambda') - .updateCourtIssuedDocketEntryLambda, - updateCourtIssuedOrderToCaseLambda: require('./documents/updateCourtIssuedOrderToCaseLambda') - .updateCourtIssuedOrderToCaseLambda, - updateDocketEntryMetaLambda: require('./documents/updateDocketEntryMetaLambda') - .updateDocketEntryMetaLambda, - updateDocketEntryOnCaseLambda: require('./documents/updateDocketEntryOnCaseLambda') - .updateDocketEntryOnCaseLambda, -}; diff --git a/web-api/src/caseMetaHandlers.js b/web-api/src/caseMetaHandlers.js deleted file mode 100644 index 539ec4fd5f4..00000000000 --- a/web-api/src/caseMetaHandlers.js +++ /dev/null @@ -1,29 +0,0 @@ -module.exports = { - addConsolidatedCaseLambda: require('./cases/addConsolidatedCaseLambda') - .addConsolidatedCaseLambda, - addDeficiencyStatisticLambda: require('./cases/addDeficiencyStatisticLambda') - .addDeficiencyStatisticLambda, - blockCaseFromTrialLambda: require('./cases/blockCaseFromTrialLambda') - .blockCaseFromTrialLambda, - deleteDeficiencyStatisticLambda: require('./cases/deleteDeficiencyStatisticLambda') - .deleteDeficiencyStatisticLambda, - prioritizeCaseLambda: require('./cases/prioritizeCaseLambda') - .prioritizeCaseLambda, - removeConsolidatedCasesLambda: require('./cases/removeConsolidatedCasesLambda') - .removeConsolidatedCasesLambda, - sealCaseLambda: require('./cases/sealCaseLambda').sealCaseLambda, - unblockCaseFromTrialLambda: require('./cases/unblockCaseFromTrialLambda') - .unblockCaseFromTrialLambda, - unprioritizeCaseLambda: require('./cases/unprioritizeCaseLambda') - .unprioritizeCaseLambda, - updateCaseContextLambda: require('./cases/updateCaseContextLambda') - .updateCaseContextLambda, - updateCaseTrialSortTagsLambda: require('./cases/updateCaseTrialSortTagsLambda') - .updateCaseTrialSortTagsLambda, - updateDeficiencyStatisticLambda: require('./cases/updateDeficiencyStatisticLambda') - .updateDeficiencyStatisticLambda, - updateOtherStatisticsLambda: require('./cases/updateOtherStatisticsLambda') - .updateOtherStatisticsLambda, - updateQcCompleteForTrialLambda: require('./cases/updateQcCompleteForTrialLambda') - .updateQcCompleteForTrialLambda, -}; diff --git a/web-api/src/caseNotesHandlers.js b/web-api/src/caseNotesHandlers.js deleted file mode 100644 index 5186bef5ffd..00000000000 --- a/web-api/src/caseNotesHandlers.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = { - deleteCaseNoteLambda: require('./caseNote/deleteCaseNoteLambda') - .deleteCaseNoteLambda, - deleteUserCaseNoteLambda: require('./caseNote/deleteUserCaseNoteLambda') - .deleteUserCaseNoteLambda, - getUserCaseNoteForCasesLambda: require('./caseNote/getUserCaseNoteForCasesLambda') - .getUserCaseNoteForCasesLambda, - getUserCaseNoteLambda: require('./caseNote/getUserCaseNoteLambda') - .getUserCaseNoteLambda, - saveCaseNoteLambda: require('./caseNote/saveCaseNoteLambda') - .saveCaseNoteLambda, - updateUserCaseNoteLambda: require('./caseNote/updateUserCaseNoteLambda') - .updateUserCaseNoteLambda, -}; diff --git a/web-api/src/casePartiesHandlers.js b/web-api/src/casePartiesHandlers.js deleted file mode 100644 index ab437240cfe..00000000000 --- a/web-api/src/casePartiesHandlers.js +++ /dev/null @@ -1,18 +0,0 @@ -module.exports = { - associateIrsPractitionerWithCaseLambda: require('./manualAssociation/associateIrsPractitionerWithCaseLambda') - .associateIrsPractitionerWithCaseLambda, - associatePrivatePractitionerWithCaseLambda: require('./manualAssociation/associatePrivatePractitionerWithCaseLambda') - .associatePrivatePractitionerWithCaseLambda, - deleteCounselFromCaseLambda: require('./cases/deleteCounselFromCaseLambda') - .deleteCounselFromCaseLambda, - updateCounselOnCaseLambda: require('./cases/updateCounselOnCaseLambda') - .updateCounselOnCaseLambda, - updatePetitionDetailsLambda: require('./cases/updatePetitionDetailsLambda') - .updatePetitionDetailsLambda, - updatePetitionerInformationLambda: require('./cases/updatePetitionerInformationLambda') - .updatePetitionerInformationLambda, - updatePrimaryContactLambda: require('./cases/updatePrimaryContactLambda') - .updatePrimaryContactLambda, - updateSecondaryContactLambda: require('./cases/updateSecondaryContactLambda') - .updateSecondaryContactLambda, -}; diff --git a/web-api/src/casesHandlers.js b/web-api/src/casesHandlers.js deleted file mode 100644 index f8454a9b029..00000000000 --- a/web-api/src/casesHandlers.js +++ /dev/null @@ -1,20 +0,0 @@ -module.exports = { - caseAdvancedSearchLambda: require('./cases/caseAdvancedSearchLambda') - .caseAdvancedSearchLambda, - createCaseFromPaperLambda: require('./cases/createCaseFromPaperLambda') - .createCaseFromPaperLambda, - createCaseLambda: require('./cases/createCaseLambda').createCaseLambda, - getCaseLambda: require('./cases/getCaseLambda').getCaseLambda, - getClosedCasesLambda: require('./cases/getClosedCasesLambda') - .getClosedCasesLambda, - getConsolidatedCasesByCaseLambda: require('./cases/getConsolidatedCasesByCaseLambda') - .getConsolidatedCasesByCaseLambda, - getOpenConsolidatedCasesLambda: require('./cases/getOpenConsolidatedCasesLambda') - .getOpenConsolidatedCasesLambda, - removeCasePendingItemLambda: require('./cases/removeCasePendingItemLambda') - .removeCasePendingItemLambda, - saveCaseDetailInternalEditLambda: require('./cases/saveCaseDetailInternalEditLambda') - .saveCaseDetailInternalEditLambda, - serveCaseToIrsLambda: require('./cases/serveCaseToIrsLambda') - .serveCaseToIrsLambda, -}; diff --git a/web-api/src/documentsHandlers.js b/web-api/src/documentsHandlers.js deleted file mode 100644 index 9a383e48cc0..00000000000 --- a/web-api/src/documentsHandlers.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = { - generatePrintableFilingReceiptLambda: require('./documents/generatePrintableFilingReceiptLambda') - .generatePrintableFilingReceiptLambda, - getUploadPolicyLambda: require('./documents/getUploadPolicyLambda') - .getUploadPolicyLambda, - validatePdfLambda: require('./documents/validatePdfLambda').validatePdfLambda, - virusScanPdfLambda: require('./documents/virusScanPdfLambda') - .virusScanPdfLambda, -}; diff --git a/web-api/src/messages/completeCaseMessageLambda.js b/web-api/src/messages/completeCaseMessageLambda.js new file mode 100644 index 00000000000..cc08718f736 --- /dev/null +++ b/web-api/src/messages/completeCaseMessageLambda.js @@ -0,0 +1,18 @@ +const { genericHandler } = require('../genericHandler'); + +/** + * lambda which is used to complete a case message thread + * + * @param {object} event the AWS event object + * @returns {Promise<*|undefined>} the api gateway response object containing the statusCode, body, and headers + */ +exports.completeCaseMessageLambda = event => + genericHandler(event, async ({ applicationContext }) => { + return await applicationContext + .getUseCases() + .completeCaseMessageInteractor({ + applicationContext, + parentMessageId: event.pathParameters.parentMessageId, + ...JSON.parse(event.body), + }); + }); diff --git a/web-api/src/messages/getCaseMessageLambda.js b/web-api/src/messages/forwardCaseMessageLambda.js similarity index 54% rename from web-api/src/messages/getCaseMessageLambda.js rename to web-api/src/messages/forwardCaseMessageLambda.js index 60f0f3ef43e..fd2124a9b7f 100644 --- a/web-api/src/messages/getCaseMessageLambda.js +++ b/web-api/src/messages/forwardCaseMessageLambda.js @@ -1,15 +1,16 @@ const { genericHandler } = require('../genericHandler'); /** - * lambda which is used for creating a new case message + * lambda which is used to forward a case message * * @param {object} event the AWS event object * @returns {Promise<*|undefined>} the api gateway response object containing the statusCode, body, and headers */ -exports.getCaseMessageLambda = event => +exports.forwardCaseMessageLambda = event => genericHandler(event, async ({ applicationContext }) => { - return await applicationContext.getUseCases().getCaseMessageInteractor({ + return await applicationContext.getUseCases().forwardCaseMessageInteractor({ applicationContext, - messageId: event.pathParameters.messageId, + parentMessageId: event.pathParameters.parentMessageId, + ...JSON.parse(event.body), }); }); diff --git a/web-api/src/messages/getCaseMessageThreadLambda.js b/web-api/src/messages/getCaseMessageThreadLambda.js new file mode 100644 index 00000000000..0f53a7d6083 --- /dev/null +++ b/web-api/src/messages/getCaseMessageThreadLambda.js @@ -0,0 +1,17 @@ +const { genericHandler } = require('../genericHandler'); + +/** + * lambda which is used for retrieving case messages by the parent message id + * + * @param {object} event the AWS event object + * @returns {Promise<*|undefined>} the api gateway response object containing the statusCode, body, and headers + */ +exports.getCaseMessageThreadLambda = event => + genericHandler(event, async ({ applicationContext }) => { + return await applicationContext + .getUseCases() + .getCaseMessageThreadInteractor({ + applicationContext, + parentMessageId: event.pathParameters.parentMessageId, + }); + }); diff --git a/web-api/src/messages/getCaseMessagesForCaseLambda.js b/web-api/src/messages/getCaseMessagesForCaseLambda.js new file mode 100644 index 00000000000..edaba35b2f9 --- /dev/null +++ b/web-api/src/messages/getCaseMessagesForCaseLambda.js @@ -0,0 +1,17 @@ +const { genericHandler } = require('../genericHandler'); + +/** + * lambda which is used for retrieving case messages for a case + * + * @param {object} event the AWS event object + * @returns {Promise<*|undefined>} the api gateway response object containing the statusCode, body, and headers + */ +exports.getCaseMessagesForCaseLambda = event => + genericHandler(event, async ({ applicationContext }) => { + return await applicationContext + .getUseCases() + .getCaseMessagesForCaseInteractor({ + applicationContext, + caseId: event.pathParameters.caseId, + }); + }); diff --git a/web-api/src/messages/getCompletedCaseMessagesForSectionLambda.js b/web-api/src/messages/getCompletedCaseMessagesForSectionLambda.js new file mode 100644 index 00000000000..97cf09b9b3d --- /dev/null +++ b/web-api/src/messages/getCompletedCaseMessagesForSectionLambda.js @@ -0,0 +1,17 @@ +const { genericHandler } = require('../genericHandler'); + +/** + * gets the completed case messages for the section + * + * @param {object} event the AWS event object + * @returns {Promise<*|undefined>} the api gateway response object containing the statusCode, body, and headers + */ +exports.getCompletedCaseMessagesForSectionLambda = event => + genericHandler(event, async ({ applicationContext }) => { + return await applicationContext + .getUseCases() + .getCompletedCaseMessagesForSectionInteractor({ + applicationContext, + section: event.pathParameters.section, + }); + }); diff --git a/web-api/src/messages/getCompletedCaseMessagesForUserLambda.js b/web-api/src/messages/getCompletedCaseMessagesForUserLambda.js new file mode 100644 index 00000000000..d5151dc467f --- /dev/null +++ b/web-api/src/messages/getCompletedCaseMessagesForUserLambda.js @@ -0,0 +1,17 @@ +const { genericHandler } = require('../genericHandler'); + +/** + * gets the completed case messages for the user + * + * @param {object} event the AWS event object + * @returns {Promise<*|undefined>} the api gateway response object containing the statusCode, body, and headers + */ +exports.getCompletedCaseMessagesForUserLambda = event => + genericHandler(event, async ({ applicationContext }) => { + return await applicationContext + .getUseCases() + .getCompletedCaseMessagesForUserInteractor({ + applicationContext, + userId: event.pathParameters.userId, + }); + }); diff --git a/web-api/src/messages/replyToCaseMessageLambda.js b/web-api/src/messages/replyToCaseMessageLambda.js new file mode 100644 index 00000000000..1d7171268a3 --- /dev/null +++ b/web-api/src/messages/replyToCaseMessageLambda.js @@ -0,0 +1,16 @@ +const { genericHandler } = require('../genericHandler'); + +/** + * lambda which is used to reply to a case message + * + * @param {object} event the AWS event object + * @returns {Promise<*|undefined>} the api gateway response object containing the statusCode, body, and headers + */ +exports.replyToCaseMessageLambda = event => + genericHandler(event, async ({ applicationContext }) => { + return await applicationContext.getUseCases().replyToCaseMessageInteractor({ + applicationContext, + parentMessageId: event.pathParameters.parentMessageId, + ...JSON.parse(event.body), + }); + }); diff --git a/web-api/src/messagesHandlers.js b/web-api/src/messagesHandlers.js deleted file mode 100644 index 1925d327f21..00000000000 --- a/web-api/src/messagesHandlers.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = { - createCaseMessageLambda: require('./messages/createCaseMessageLambda') - .createCaseMessageLambda, - getCaseMessageLambda: require('./messages/getCaseMessageLambda') - .getCaseMessageLambda, - getInboxCaseMessagesForSectionLambda: require('./messages/getInboxCaseMessagesForSectionLambda') - .getInboxCaseMessagesForSectionLambda, - getInboxCaseMessagesForUserLambda: require('./messages/getInboxCaseMessagesForUserLambda') - .getInboxCaseMessagesForUserLambda, - getOutboxCaseMessagesForSectionLambda: require('./messages/getOutboxCaseMessagesForSectionLambda') - .getOutboxCaseMessagesForSectionLambda, - getOutboxCaseMessagesForUserLambda: require('./messages/getOutboxCaseMessagesForUserLambda') - .getOutboxCaseMessagesForUserLambda, -}; diff --git a/web-api/src/middleware/apiGatewayHelper.js b/web-api/src/middleware/apiGatewayHelper.js index c01c87511d4..eb07d6fe31e 100644 --- a/web-api/src/middleware/apiGatewayHelper.js +++ b/web-api/src/middleware/apiGatewayHelper.js @@ -25,9 +25,6 @@ exports.headers = headers; */ exports.handle = async (event, fun) => { const applicationContext = createApplicationContext({}); - if (event.source === 'serverless-plugin-warmup') { - return exports.sendOk('Lambda is warm!'); - } try { let response = await fun(); @@ -90,9 +87,6 @@ exports.handle = async (event, fun) => { * @returns {object} the api gateway response object with the Location set to the url returned from fun */ exports.redirect = async (event, fun, statusCode = 302) => { - if (event.source === 'serverless-plugin-warmup') { - return exports.sendOk('Lambda is warm!'); - } try { const { url } = await fun(); return { diff --git a/web-api/src/middleware/apiGatewayHelper.test.js b/web-api/src/middleware/apiGatewayHelper.test.js index 2618ca091f3..963b32ba595 100644 --- a/web-api/src/middleware/apiGatewayHelper.test.js +++ b/web-api/src/middleware/apiGatewayHelper.test.js @@ -22,18 +22,6 @@ console.error = () => null; console.info = () => null; describe('handle', () => { - it('should return warm up string if warm up source is passed in', async () => { - const response = await handle( - { source: 'serverless-plugin-warmup' }, - async () => 'success', - ); - expect(response).toEqual({ - body: '"Lambda is warm!"', - headers: EXPECTED_HEADERS, - statusCode: '200', - }); - }); - it('should handle a response with pdf data', async () => { const response = await handle({}, async () => '%PDF-'); // contains pdf header expect(response).toEqual({ @@ -326,18 +314,6 @@ describe('getUserFromAuthHeader', () => { }); describe('redirect', () => { - it('should return warm up string if warm up source is passed in', async () => { - const response = await redirect( - { source: 'serverless-plugin-warmup' }, - async () => 'success', - ); - expect(response).toEqual({ - body: '"Lambda is warm!"', - headers: EXPECTED_HEADERS, - statusCode: '200', - }); - }); - it('should return a redirect status in the header', async () => { const response = await redirect({}, async () => ({ url: 'example.com' })); expect(response).toEqual({ diff --git a/web-api/src/migrateHandlers.js b/web-api/src/migrateHandlers.js deleted file mode 100644 index dee3fe736e7..00000000000 --- a/web-api/src/migrateHandlers.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - migrateCaseLambda: require('./migrate/migrateCaseLambda').migrateCaseLambda, -}; diff --git a/web-api/src/notificationHandlers.js b/web-api/src/notificationHandlers.js deleted file mode 100644 index 9a828acb23f..00000000000 --- a/web-api/src/notificationHandlers.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - connectLambda: require('./notifications/connectLambda').connectLambda, - disconnectLambda: require('./notifications/disconnectLambda') - .disconnectLambda, -}; diff --git a/web-api/src/practitionersHandlers.js b/web-api/src/practitionersHandlers.js deleted file mode 100644 index 8aa9e2d5683..00000000000 --- a/web-api/src/practitionersHandlers.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - createPractitionerUserLambda: require('./practitioners/createPractitionerUserLambda') - .createPractitionerUserLambda, - getPractitionerByBarNumberLambda: require('./practitioners/getPractitionerByBarNumberLambda') - .getPractitionerByBarNumberLambda, - getPractitionersByNameLambda: require('./practitioners/getPractitionersByNameLambda') - .getPractitionersByNameLambda, - updatePractitionerUserLambda: require('./practitioners/updatePractitionerUserLambda') - .updatePractitionerUserLambda, -}; diff --git a/web-api/src/publicApiHandlers.js b/web-api/src/publicApiHandlers.js deleted file mode 100644 index e0e5a01e887..00000000000 --- a/web-api/src/publicApiHandlers.js +++ /dev/null @@ -1,20 +0,0 @@ -module.exports = { - casePublicSearchLambda: require('./public-api/casePublicSearchLambda') - .casePublicSearchLambda, - generatePublicDocketRecordPdfLambda: require('./public-api/generatePublicDocketRecordPdfLambda') - .generatePublicDocketRecordPdfLambda, - getCaseForPublicDocketSearch: require('./public-api/getCaseForPublicDocketSearchLambda') - .getCaseForPublicDocketSearch, - getPublicCaseLambda: require('./public-api/getPublicCaseLambda') - .getPublicCaseLambda, - getPublicDocumentDownloadUrlLambda: require('./public-api/getPublicDocumentDownloadUrlLambda') - .getPublicDocumentDownloadUrlLambda, - getPublicJudgesLambda: require('./public-api/getPublicJudgesLambda') - .getPublicJudgesLambda, - opinionPublicSearchLambda: require('./public-api/opinionPublicSearchLambda') - .opinionPublicSearchLambda, - orderPublicSearchLambda: require('./public-api/orderPublicSearchLambda') - .orderPublicSearchLambda, - todaysOpinionsLambda: require('./public-api/todaysOpinionsLambda') - .todaysOpinionsLambda, -}; diff --git a/web-api/src/reportsHandlers.js b/web-api/src/reportsHandlers.js deleted file mode 100644 index 35e2d028328..00000000000 --- a/web-api/src/reportsHandlers.js +++ /dev/null @@ -1,16 +0,0 @@ -module.exports = { - fetchPendingItemsLambda: require('./pendingItems/fetchPendingItemsLambda') - .fetchPendingItemsLambda, - generatePrintableCaseInventoryReportLambda: require('./reports/generatePrintableCaseInventoryReportLambda') - .generatePrintableCaseInventoryReportLambda, - generatePrintablePendingReportLambda: require('./pendingItems/generatePrintablePendingReportLambda') - .generatePrintablePendingReportLambda, - generateTrialCalendarPdfLambda: require('./trialSessions/generateTrialCalendarPdfLambda') - .generateTrialCalendarPdfLambda, - getBlockedCasesLambda: require('./reports/getBlockedCasesLambda') - .getBlockedCasesLambda, - getCaseInventoryReportLambda: require('./reports/getCaseInventoryReportLambda') - .getCaseInventoryReportLambda, - runTrialSessionPlanningReportLambda: require('./trialSessions/runTrialSessionPlanningReportLambda') - .runTrialSessionPlanningReportLambda, -}; diff --git a/web-api/src/sectionsHandlers.js b/web-api/src/sectionsHandlers.js deleted file mode 100644 index 9526404f956..00000000000 --- a/web-api/src/sectionsHandlers.js +++ /dev/null @@ -1,12 +0,0 @@ -module.exports = { - getDocumentQCInboxForSectionLambda: require('./workitems/getDocumentQCInboxForSectionLambda') - .getDocumentQCInboxForSectionLambda, - getDocumentQCServedForSectionLambda: require('./workitems/getDocumentQCServedForSectionLambda') - .getDocumentQCServedForSectionLambda, - getInboxMessagesForSectionLambda: require('./workitems/getInboxMessagesForSectionLambda') - .getInboxMessagesForSectionLambda, - getSentMessagesForSectionLambda: require('./workitems/getSentMessagesForSectionLambda') - .getSentMessagesForSectionLambda, - getUsersInSectionLambda: require('./users/getUsersInSectionLambda') - .getUsersInSectionLambda, -}; diff --git a/web-api/src/streamsHandlers.js b/web-api/src/streamsHandlers.js deleted file mode 100644 index 6d71546f2c6..00000000000 --- a/web-api/src/streamsHandlers.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - processStreamRecordsLambda: require('./streams/processStreamRecordsLambda') - .processStreamRecordsLambda, - reprocessFailedRecordsLambda: require('./streams/reprocessFailedRecordsLambda') - .reprocessFailedRecordsLambda, -}; diff --git a/web-api/src/trialSessionsHandlers.js b/web-api/src/trialSessionsHandlers.js deleted file mode 100644 index 896772c4f80..00000000000 --- a/web-api/src/trialSessionsHandlers.js +++ /dev/null @@ -1,32 +0,0 @@ -module.exports = { - addCaseToTrialSessionLambda: require('./trialSessions/addCaseToTrialSessionLambda') - .addCaseToTrialSessionLambda, - batchDownloadTrialSessionLambda: require('./trialSessions/batchDownloadTrialSessionLambda') - .batchDownloadTrialSessionLambda, - createTrialSessionLambda: require('./trialSessions/createTrialSessionLambda') - .createTrialSessionLambda, - deleteTrialSessionLambda: require('./trialSessions/deleteTrialSessionLambda') - .deleteTrialSessionLambda, - getCalendaredCasesForTrialSessionLambda: require('./trialSessions/getCalendaredCasesForTrialSessionLambda') - .getCalendaredCasesForTrialSessionLambda, - getEligibleCasesForTrialSessionLambda: require('./trialSessions/getEligibleCasesForTrialSessionLambda') - .getEligibleCasesForTrialSessionLambda, - getTrialSessionDetailsLambda: require('./trialSessions/getTrialSessionDetailsLambda') - .getTrialSessionDetailsLambda, - getTrialSessionWorkingCopyLambda: require('./trialSessions/getTrialSessionWorkingCopyLambda') - .getTrialSessionWorkingCopyLambda, - getTrialSessionsLambda: require('./trialSessions/getTrialSessionsLambda') - .getTrialSessionsLambda, - removeCaseFromTrialLambda: require('./trialSessions/removeCaseFromTrialLambda') - .removeCaseFromTrialLambda, - setNoticesForCalendaredTrialSessionLambda: require('./trialSessions/setNoticesForCalendaredTrialSessionLambda') - .setNoticesForCalendaredTrialSessionLambda, - setTrialSessionAsSwingSessionLambda: require('./trialSessions/setTrialSessionAsSwingSessionLambda') - .setTrialSessionAsSwingSessionLambda, - setTrialSessionCalendarLambda: require('./trialSessions/setTrialSessionCalendarLambda') - .setTrialSessionCalendarLambda, - updateTrialSessionLambda: require('./trialSessions/updateTrialSessionLambda') - .updateTrialSessionLambda, - updateTrialSessionWorkingCopyLambda: require('./trialSessions/updateTrialSessionWorkingCopyLambda') - .updateTrialSessionWorkingCopyLambda, -}; diff --git a/web-api/src/usersHandlers.js b/web-api/src/usersHandlers.js deleted file mode 100644 index 791e0cf4708..00000000000 --- a/web-api/src/usersHandlers.js +++ /dev/null @@ -1,29 +0,0 @@ -module.exports = { - createUserLambda: require('./users/createUserLambda').createUserLambda, - getCasesByUserLambda: require('./cases/getCasesByUserLambda') - .getCasesByUserLambda, - getDocumentQCInboxForUserLambda: require('./workitems/getDocumentQCInboxForUserLambda') - .getDocumentQCInboxForUserLambda, - getDocumentQCServedForUserLambda: require('./workitems/getDocumentQCServedForUserLambda') - .getDocumentQCServedForUserLambda, - getInboxMessagesForUserLambda: require('./workitems/getInboxMessagesForUserLambda') - .getInboxMessagesForUserLambda, - getInternalUsersLambda: require('./users/getInternalUsersLambda') - .getInternalUsersLambda, - getIrsPractitionersBySearchKeyLambda: require('./users/getIrsPractitionersBySearchKeyLambda') - .getIrsPractitionersBySearchKeyLambda, - getPrivatePractitionersBySearchKeyLambda: require('./users/getPrivatePractitionersBySearchKeyLambda') - .getPrivatePractitionersBySearchKeyLambda, - getSentMessagesForUserLambda: require('./workitems/getSentMessagesForUserLambda') - .getSentMessagesForUserLambda, - getUserByIdLambda: require('./users/getUserByIdLambda').getUserByIdLambda, - getUserLambda: require('./users/getUserLambda').getUserLambda, - privatePractitionerCaseAssociationLambda: require('./cases/privatePractitionerCaseAssociationLambda') - .privatePractitionerCaseAssociationLambda, - privatePractitionerPendingCaseAssociationLambda: require('./cases/privatePractitionerPendingCaseAssociationLambda') - .privatePractitionerPendingCaseAssociationLambda, - updateUserContactInformationLambda: require('./users/updateUserContactInformationLambda') - .updateUserContactInformationLambda, - verifyPendingCaseForUserLambda: require('./cases/verifyPendingCaseForUserLambda') - .verifyPendingCaseForUserLambda, -}; diff --git a/web-api/src/workItemsHandlers.js b/web-api/src/workItemsHandlers.js deleted file mode 100644 index 646e6a34067..00000000000 --- a/web-api/src/workItemsHandlers.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = { - assignWorkItemsLambda: require('./workitems/assignWorkItemsLambda') - .assignWorkItemsLambda, - completeWorkItemLambda: require('./workitems/completeWorkItemLambda') - .completeWorkItemLambda, - forwardWorkItemLambda: require('./workitems/forwardWorkItemLambda') - .forwardWorkItemLambda, - getWorkItemLambda: require('./workitems/getWorkItemLambda').getWorkItemLambda, - setWorkItemAsReadLambda: require('./workitems/setWorkItemAsReadLambda') - .setWorkItemAsReadLambda, -}; diff --git a/web-api/storage/fixtures/seed/101-19.json b/web-api/storage/fixtures/seed/101-19.json index 3472d88116e..41a0d5b4d58 100755 --- a/web-api/storage/fixtures/seed/101-19.json +++ b/web-api/storage/fixtures/seed/101-19.json @@ -237,15 +237,16 @@ "userId": "1805d1ab-18d0-43ec-bafb-654e83405416", "eventCode": "ODJ", "createdAt": "2019-10-07T14:29:30.288Z", + "signedAt": "2019-10-07T14:29:30.288Z", + "signedByUserId": "1805d1ab-18d0-43ec-bafb-654e83405416", + "signedJudgeName": "Maurice B. Foley", "processingStatus": "complete", "filedBy": "Test Docketclerk", "caseId": "2fa6da8d-4328-4a20-a5d7-b76637e1dc02", "sk": "document|25100ec6-eeeb-4e88-872f-c99fad1fe6c7", - "signedAt": "2019-10-07T14:29:30.288Z", "documentId": "25100ec6-eeeb-4e88-872f-c99fad1fe6c7", "entityName": "Document", "numberOfPages": 1, - "signedByUserId": "1805d1ab-18d0-43ec-bafb-654e83405416", "pk": "case|2fa6da8d-4328-4a20-a5d7-b76637e1dc02", "documentTitle": "Order of Dismissal for Lack of Jurisdiction", "relationship": "primaryDocument", diff --git a/web-api/storage/fixtures/seed/101-20.json b/web-api/storage/fixtures/seed/101-20.json index 742ab5844f2..c1a07af5f60 100644 --- a/web-api/storage/fixtures/seed/101-20.json +++ b/web-api/storage/fixtures/seed/101-20.json @@ -24,6 +24,99 @@ "countryType": "domestic", "email": "petitioner" }, + "otherPetitioners": [ + { + "city": "Philadelphia", + "phone": "1234567890", + "serviceIndicator": "None", + "address1": "453 Electric Ave", + "postalCode": "99999", + "name": "Rachael Ray", + "additionalName": "Rachael Ray", + "state": "PA", + "countryType": "domestic", + "email": "mayor@flavortown.gov", + "title": "Petitioner" + }, + { + "city": "Philadelphia", + "phone": "1234567890", + "serviceIndicator": "None", + "address1": "453 Electric Ave", + "postalCode": "99999", + "name": "Guy Fieri", + "additionalName": "Guy Fieri", + "state": "PA", + "countryType": "domestic", + "email": "mayor@flavortown.gov", + "title": "Petitioner" + }, + { + "city": "Philadelphia", + "phone": "1234567890", + "serviceIndicator": "None", + "address1": "453 Electric Ave", + "postalCode": "99999", + "name": "Bobby Flay", + "additionalName": "Bobby Flay", + "state": "PA", + "countryType": "domestic", + "email": "mayor@flavortown.gov", + "title": "Petitioner" + }, + { + "city": "Philadelphia", + "phone": "1234567890", + "serviceIndicator": "None", + "address1": "453 Electric Ave", + "postalCode": "99999", + "name": "Kid Rock", + "additionalName": "Kid Rock", + "state": "PA", + "countryType": "domestic", + "email": "mayor@flavortown.gov", + "title": "Petitioner" + }, + { + "city": "Philadelphia", + "phone": "1234567890", + "serviceIndicator": "None", + "address1": "453 Electric Ave", + "postalCode": "99999", + "name": "Bill Burr", + "additionalName": "Bill Burr", + "state": "PA", + "countryType": "domestic", + "email": "mayor@flavortown.gov", + "title": "Petitioner" + }, + { + "city": "Philadelphia", + "phone": "1234567890", + "serviceIndicator": "None", + "address1": "453 Electric Ave", + "postalCode": "99999", + "name": "Bill Burr", + "additionalName": "Bill Burr", + "state": "PA", + "countryType": "domestic", + "email": "mayor@flavortown.gov", + "title": "Petitioner" + }, + { + "city": "Philadelphia", + "phone": "1234567890", + "serviceIndicator": "None", + "address1": "453 Electric Ave", + "postalCode": "99999", + "name": "Bill Burr", + "additionalName": "Bill Burr", + "state": "PA", + "countryType": "domestic", + "email": "mayor@flavortown.gov", + "title": "Petitioner" + } + ], "createdAt": "2020-01-02T16:05:45.978Z", "noticeOfAttachments": false, "trialTime": "10:00", diff --git a/web-api/storage/fixtures/seed/103-19.json b/web-api/storage/fixtures/seed/103-19.json index 9aa29b8cfce..fa02ff69224 100755 --- a/web-api/storage/fixtures/seed/103-19.json +++ b/web-api/storage/fixtures/seed/103-19.json @@ -78,7 +78,7 @@ "index": 4, "documentId": "dc2664a1-f552-418f-bcc7-8a67f4246568", "numberOfPages": 1, - "editState": "{\"lodged\":false,\"practitioner\":[],\"dateReceivedMonth\":\"10\",\"dateReceivedDay\":\"10\",\"dateReceivedYear\":\"2001\",\"eventCode\":\"ATOB\",\"category\":\"Simultaneous Brief\",\"documentTitle\":\"Simultaneous Answering Brief\",\"documentType\":\"Simultaneous Answering Brief\",\"scenario\":\"Standard\",\"additionalInfo\":\"abc\",\"additionalInfo2\":\"123\",\"partyPrimary\":true,\"partyIrsPractitioner\":true,\"attachments\":true,\"searchError\":false,\"serviceDate\":null,\"certificateOfServiceDate\":null,\"dateReceived\":\"2001-10-10\",\"isFileAttached\":false,\"isPaper\":true,\"docketNumber\":\"103-19\",\"caseId\":\"491b05b4-483f-4b85-8dd7-2dd4c069eb50\",\"createdAt\":\"2019-08-14T20:35:52.858Z\",\"receivedAt\":\"2001-10-10\"}", + "editState": "{\"lodged\":false,\"practitioner\":[],\"dateReceivedMonth\":\"10\",\"dateReceivedDay\":\"10\",\"dateReceivedYear\":\"2001\",\"eventCode\":\"SIAB\",\"category\":\"Simultaneous Brief\",\"documentTitle\":\"Simultaneous Answering Brief\",\"documentType\":\"Simultaneous Answering Brief\",\"scenario\":\"Standard\",\"additionalInfo\":\"abc\",\"additionalInfo2\":\"123\",\"partyPrimary\":true,\"partyIrsPractitioner\":true,\"attachments\":true,\"searchError\":false,\"serviceDate\":null,\"certificateOfServiceDate\":null,\"dateReceived\":\"2001-10-10\",\"isFileAttached\":false,\"isPaper\":true,\"docketNumber\":\"103-19\",\"caseId\":\"491b05b4-483f-4b85-8dd7-2dd4c069eb50\",\"createdAt\":\"2019-08-14T20:35:52.858Z\",\"receivedAt\":\"2001-10-10\"}", "filingDate": "2001-10-10T23:54:05.993Z", "docketRecordId": "63b1503d-26cc-448c-a4a4-670b846518c4", "pk": "case|491b05b4-483f-4b85-8dd7-2dd4c069eb50", @@ -624,7 +624,7 @@ "practitioner": [], "isFileAttached": false, "userId": "1805d1ab-18d0-43ec-bafb-654e83405416", - "eventCode": "ATOB", + "eventCode": "SIAB", "processingStatus": "pending", "lodged": false, "certificateOfServiceDate": null, @@ -661,7 +661,7 @@ ], "isFileAttached": false, "userId": "1805d1ab-18d0-43ec-bafb-654e83405416", - "eventCode": "ATOB", + "eventCode": "SIAB", "processingStatus": "pending", "lodged": false, "certificateOfServiceDate": null, diff --git a/web-api/storage/fixtures/seed/104-20.json b/web-api/storage/fixtures/seed/104-20.json index bec659be234..d96d2c6d613 100644 --- a/web-api/storage/fixtures/seed/104-20.json +++ b/web-api/storage/fixtures/seed/104-20.json @@ -44,15 +44,7 @@ "inProgress": true, "caseStatus": "General Docket - Not at Issue", "document": { - "draftState": { - "eventCode": "ODD", - "documentType": "Order of Dismissal and Decision", - "caseId": "1a92894e-83a5-48ba-9994-3ada44235deb", - "documentContents": "Déjà vu, this is a seed order in case 104-20 filed on Apr 13 at 11:01pm ET\n", - "documentTitle": "Order of Dismissal and Decision", - "richText": "

Déjà vu, this is a seed order in case 104-20 filed on Apr 13 at 11:01pm ET

", - "docketNumber": "104-20" - }, + "draftState": null, "attachments": false, "documentType": "ODD - Order of Dismissal and Decision Entered", "filingDate": "2020-04-14T03:01:15.215Z", diff --git a/web-api/storage/fixtures/seed/109-19.json b/web-api/storage/fixtures/seed/109-19.json index 51910f39507..0b94a7d25cf 100644 --- a/web-api/storage/fixtures/seed/109-19.json +++ b/web-api/storage/fixtures/seed/109-19.json @@ -169,6 +169,7 @@ "caseId": "2fb2da8d-4328-4a20-a5d7-b76637e1dc02", "sk": "document|25100ec6-eeeb-4e88-872f-c99fad1fe6c7", "signedAt": "2019-10-07T14:29:30.288Z", + "signedJudgeName": "Judge Buch", "documentId": "25100ec6-eeeb-4e88-872f-c99fad1fe6c7", "numberOfPages": 1, "signedByUserId": "1805d1ab-18d0-43ec-bafb-654e83405416", diff --git a/web-api/storage/fixtures/seed/110-19.json b/web-api/storage/fixtures/seed/110-19.json index d1e27dba562..16fd5b80c4e 100644 --- a/web-api/storage/fixtures/seed/110-19.json +++ b/web-api/storage/fixtures/seed/110-19.json @@ -148,6 +148,7 @@ "filedBy": "Test Docketclerk", "caseId": "2fb2da8d-4328-4a20-a5d7-a76637e1dc01", "sk": "document|25100ec6-eeeb-4e88-872f-c99fad1fe6c7", + "signedJudgeName": "Maurice B. Foley", "signedAt": "2019-10-07T14:29:30.288Z", "documentId": "25100ec6-eeeb-4e88-872f-c99fad1fe6c7", "numberOfPages": 1, diff --git a/web-api/storage/fixtures/seed/case-messages.json b/web-api/storage/fixtures/seed/case-messages.json index 25fe4eb182c..be5a55411f7 100644 --- a/web-api/storage/fixtures/seed/case-messages.json +++ b/web-api/storage/fixtures/seed/case-messages.json @@ -3,6 +3,7 @@ "caseId": "0bc59d5b-c2b9-41f7-92a7-03b8cadffcc0", "caseStatus": "General Docket - Not at Issue", "createdAt": "2020-06-05T18:02:25.280Z", + "caseTitle": "Bill Burr", "docketNumber": "105-20", "docketNumberWithSuffix": "105-20L", "entityName": "CaseMessage", @@ -14,9 +15,11 @@ "messageId": "eb0a139a-8951-4de1-8b83-f02a27504105", "pk": "case|0bc59d5b-c2b9-41f7-92a7-03b8cadffcc0", "sk": "message|eb0a139a-8951-4de1-8b83-f02a27504105", + "parentMessageId": "eb0a139a-8951-4de1-8b83-f02a27504105", "subject": "message to myself", "to": "Test Petitionsclerk", "toSection": "petitions", + "isRepliedTo": false, "toUserId": "3805d1ab-18d0-43ec-bafb-654e83405416" } ] diff --git a/web-api/storage/scripts/cases/createCase1.js b/web-api/storage/scripts/cases/createCase1.js index e1d22f2b190..7c2a7e3e29a 100644 --- a/web-api/storage/scripts/cases/createCase1.js +++ b/web-api/storage/scripts/cases/createCase1.js @@ -51,7 +51,7 @@ module.exports.createCase1 = async () => { name: 'Brett Osborne', phone: '+1 (537) 235-6147', postalCode: '89499', - state: 'AS', + state: 'AK', }, filingType: 'Myself', hasIrsNotice: false, @@ -101,6 +101,8 @@ module.exports.createCase1 = async () => { await applicationContext.getUseCases().saveSignedDocumentInteractor({ applicationContext, caseId, + //todo - dont hardcode a judge + nameForSigning: 'Maurice B. Foley', originalDocumentId: documentId, signedDocumentId: documentId, }); diff --git a/web-api/swagger.json b/web-api/swagger.json index ddb632fd79f..6ddab8194fa 100644 --- a/web-api/swagger.json +++ b/web-api/swagger.json @@ -5802,6 +5802,387 @@ } } }, + "/messages/completed/section/{sectionId}": { + "parameters": [ + { + "name": "sectionId", + "in": "path", + "required": true, + "type": "string" + } + ], + "get": { + "tags": ["messages"], + "summary": "gets the completed messages for the specific section", + "description": "Gets the completed messages for the specific user section.\n", + "produces": ["application/json"], + "responses": { + "200": { + "description": "200 response", + "schema": { + "$ref": "#/definitions/caseMessage" + } + } + }, + "security": [ + { + "CognitoUserPool": [] + } + ] + }, + "options": { + "consumes": ["application/json"], + "produces": ["application/json"], + "responses": { + "200": { + "description": "200 response", + "headers": { + "Access-Control-Allow-Origin": { + "type": "string" + }, + "Access-Control-Allow-Methods": { + "type": "string" + }, + "Access-Control-Allow-Credentials": { + "type": "string" + }, + "Access-Control-Allow-Headers": { + "type": "string" + } + } + } + } + } + }, + "/messages/completed/{userId}": { + "parameters": [ + { + "name": "userId", + "in": "path", + "required": true, + "type": "string" + } + ], + "get": { + "tags": ["messages"], + "summary": "gets the completed messages for the specific user", + "description": "Gets the completed messages for the specific user.\n", + "produces": ["application/json"], + "responses": { + "200": { + "description": "200 response", + "schema": { + "$ref": "#/definitions/caseMessage" + } + } + }, + "security": [ + { + "CognitoUserPool": [] + } + ] + }, + "options": { + "consumes": ["application/json"], + "produces": ["application/json"], + "responses": { + "200": { + "description": "200 response", + "headers": { + "Access-Control-Allow-Origin": { + "type": "string" + }, + "Access-Control-Allow-Methods": { + "type": "string" + }, + "Access-Control-Allow-Credentials": { + "type": "string" + }, + "Access-Control-Allow-Headers": { + "type": "string" + } + } + } + } + } + }, + "/messages/case/{caseId}": { + "parameters": [ + { + "name": "caseId", + "in": "path", + "required": true, + "type": "string" + } + ], + "get": { + "tags": ["messages"], + "summary": "gets the messages for the specific case", + "description": "Gets the messages for the specific case.\n", + "produces": ["application/json"], + "responses": { + "200": { + "description": "200 response", + "schema": { + "$ref": "#/definitions/caseMessage" + } + } + }, + "security": [ + { + "CognitoUserPool": [] + } + ] + }, + "options": { + "consumes": ["application/json"], + "produces": ["application/json"], + "responses": { + "200": { + "description": "200 response", + "headers": { + "Access-Control-Allow-Origin": { + "type": "string" + }, + "Access-Control-Allow-Methods": { + "type": "string" + }, + "Access-Control-Allow-Credentials": { + "type": "string" + }, + "Access-Control-Allow-Headers": { + "type": "string" + } + } + } + } + } + }, + "/messages/{parentMessageId}/complete": { + "post": { + "tags": ["messages"], + "summary": "complete a case message", + "description": "Complete a message.\n", + "produces": ["application/json"], + "responses": { + "200": { + "description": "200 response", + "schema": { + "$ref": "#/definitions/caseMessage" + } + } + }, + "security": [ + { + "CognitoUserPool": [] + } + ] + }, + "parameters": [ + { + "name": "parentMessageId", + "in": "path", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "message info", + "description": "the case message info", + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + } + } + ], + "options": { + "consumes": ["application/json"], + "produces": ["application/json"], + "responses": { + "200": { + "description": "200 response", + "headers": { + "Access-Control-Allow-Origin": { + "type": "string" + }, + "Access-Control-Allow-Methods": { + "type": "string" + }, + "Access-Control-Allow-Credentials": { + "type": "string" + }, + "Access-Control-Allow-Headers": { + "type": "string" + } + } + } + } + } + }, + "/messages/{parentMessageId}/reply": { + "post": { + "tags": ["messages"], + "summary": "reply to a case message", + "description": "Reply to a message.\n", + "produces": ["application/json"], + "responses": { + "200": { + "description": "200 response", + "schema": { + "$ref": "#/definitions/caseMessage" + } + } + }, + "security": [ + { + "CognitoUserPool": [] + } + ] + }, + "parameters": [ + { + "name": "parentMessageId", + "in": "path", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "message info", + "description": "the case message info", + "schema": { + "type": "object", + "properties": { + "attachments": { + "type": "array" + }, + "caseId": { + "type": "string" + }, + "message": { + "type": "string" + }, + "subject": { + "type": "string" + }, + "toSection": { + "type": "string" + }, + "toUserId": { + "type": "string" + } + } + } + } + ], + "options": { + "consumes": ["application/json"], + "produces": ["application/json"], + "responses": { + "200": { + "description": "200 response", + "headers": { + "Access-Control-Allow-Origin": { + "type": "string" + }, + "Access-Control-Allow-Methods": { + "type": "string" + }, + "Access-Control-Allow-Credentials": { + "type": "string" + }, + "Access-Control-Allow-Headers": { + "type": "string" + } + } + } + } + } + }, + "/messages/{parentMessageId}/forward": { + "post": { + "tags": ["messages"], + "summary": "forward a case message", + "description": "Forward a message.\n", + "produces": ["application/json"], + "responses": { + "200": { + "description": "200 response", + "schema": { + "$ref": "#/definitions/caseMessage" + } + } + }, + "security": [ + { + "CognitoUserPool": [] + } + ] + }, + "parameters": [ + { + "name": "parentMessageId", + "in": "path", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "message info", + "description": "the case message info", + "schema": { + "type": "object", + "properties": { + "attachments": { + "type": "array" + }, + "caseId": { + "type": "string" + }, + "message": { + "type": "string" + }, + "subject": { + "type": "string" + }, + "toSection": { + "type": "string" + }, + "toUserId": { + "type": "string" + } + } + } + } + ], + "options": { + "consumes": ["application/json"], + "produces": ["application/json"], + "responses": { + "200": { + "description": "200 response", + "headers": { + "Access-Control-Allow-Origin": { + "type": "string" + }, + "Access-Control-Allow-Methods": { + "type": "string" + }, + "Access-Control-Allow-Credentials": { + "type": "string" + }, + "Access-Control-Allow-Headers": { + "type": "string" + } + } + } + } + } + }, "/public-api/todays-opinions": { "get": { "tags": ["case-documents"], @@ -6214,6 +6595,10 @@ "caseMessage": { "type": "object", "properties": { + "attachments": { + "type": "array", + "description": "array of document metadata objects attached to the message" + }, "caseId": { "type": "string", "description": "id of the associated case" @@ -6222,6 +6607,30 @@ "type": "string", "description": "status of the associated case" }, + "caseTitle": { + "type": "string", + "description": "case title for the associated cases" + }, + "completedAt": { + "type": "string", + "description": "when the message was marked as completed" + }, + "completedBy": { + "type": "string", + "description": "the name of the user who completed the message thread" + }, + "completedBySection": { + "type": "string", + "description": "the section of the user who completed the message thread" + }, + "completedByUserId": { + "type": "string", + "description": "the ID of the user who completed the message thread" + }, + "completedMessage": { + "type": "string", + "description": "the message entered when completing the message thread" + }, "createdAt": { "type": "string", "description": "message created time" @@ -6250,6 +6659,14 @@ "type": "string", "description": "the ID of the user who sent the message" }, + "isCompleted": { + "type": "boolean", + "description": "whether the message thread has been completed" + }, + "isRepliedTo": { + "type": "boolean", + "description": "whether the message has been replied to or forwarded" + }, "message": { "type": "string", "description": "the message text" @@ -6258,6 +6675,10 @@ "type": "string", "description": "the unique ID generated by the system to represent the message" }, + "parentMessageId": { + "type": "string", + "description": "the unique ID generated by the system to represent the parent / initial message" + }, "subject": { "type": "string", "description": "the subject line of the message" diff --git a/web-api/terraform/bin/deploy-app.sh b/web-api/terraform/bin/deploy-app.sh index 5775832f995..6aaa3e22f63 100755 --- a/web-api/terraform/bin/deploy-app.sh +++ b/web-api/terraform/bin/deploy-app.sh @@ -27,6 +27,10 @@ npm run build:assets pushd ../template/cognito-authorizer npx parcel build index.js --target node --bundle-node-modules --no-minify popd + +pushd ../template/cognito-triggers +npx parcel build index.js --target node --bundle-node-modules --no-minify +popd pushd ../template/log-forwarder npx parcel build index.js --target node --bundle-node-modules --no-minify @@ -48,6 +52,10 @@ pushd ../template/cron npx parcel build index.js --target node --bundle-node-modules --no-minify popd +pushd ../template/websockets +npx parcel build index.js --target node --bundle-node-modules --no-minify +popd + pushd ../../runtimes/puppeteer ./build.sh popd diff --git a/web-api/terraform/template/cognito-trigger.tf b/web-api/terraform/template/cognito-trigger.tf index 0d7c6201250..3cef8b2e748 100644 --- a/web-api/terraform/template/cognito-trigger.tf +++ b/web-api/terraform/template/cognito-trigger.tf @@ -1,6 +1,6 @@ data "archive_file" "zip_triggers" { type = "zip" - source_file = "${path.module}/cognito-triggers/index.js" + source_file = "${path.module}/cognito-triggers/dist/index.js" output_path = "${path.module}/cognito-triggers/index.js.zip" } @@ -18,12 +18,28 @@ resource "aws_lambda_function" "cognito_post_confirmation_lambda" { role = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:role/iam_cognito_post_confirmation_lambda_role_${var.environment}" handler = "index.handler" source_code_hash = "${data.archive_file.zip_triggers.output_base64sha256}" - + timeout = "29" runtime = "nodejs12.x" + # These can not use null_data_source.locals due to circular dep environment { variables = { - DYNAMO_TABLE = "efcms-${var.environment}" + S3_ENDPOINT = "s3.us-east-1.amazonaws.com" + DOCUMENTS_BUCKET_NAME = "${var.dns_domain}-documents-${var.environment}-us-east-1" + TEMP_DOCUMENTS_BUCKET_NAME = "${var.dns_domain}-temp-documents-${var.environment}-us-east-1" + DYNAMODB_ENDPOINT = "dynamodb.us-east-1.amazonaws.com" + MASTER_DYNAMODB_ENDPOINT = "dynamodb.us-east-1.amazonaws.com" + ELASTICSEARCH_ENDPOINT = "${aws_elasticsearch_domain.efcms-search.endpoint}" + MASTER_REGION = "us-east-1" + STAGE = "${var.environment}" + NODE_ENV = "production" + EMAIL_SOURCE = "noreply@mail.efcms-${var.environment}.${var.dns_domain}" + EMAIL_DOCUMENT_SERVED_TEMPLATE = "document_served_${var.environment}" + EMAIL_SERVED_PETITION_TEMPLATE = "petition_served_${var.environment}" + EFCMS_DOMAIN = "${var.dns_domain}" + CLAMAV_DEF_DIR = "/opt/var/lib/clamav" + CIRCLE_HONEYBADGER_API_KEY = "${var.honeybadger_key}" + IRS_SUPERUSER_EMAIL = "${var.irs_superuser_email}" } } } \ No newline at end of file diff --git a/web-api/terraform/template/cognito-triggers/index.js b/web-api/terraform/template/cognito-triggers/index.js index 554bcc9e434..14e7190212e 100644 --- a/web-api/terraform/template/cognito-triggers/index.js +++ b/web-api/terraform/template/cognito-triggers/index.js @@ -1,28 +1,16 @@ -const AWS = require('aws-sdk'); - -const { DynamoDB } = AWS; - -const dynamoClient = new DynamoDB.DocumentClient({ - endpoint: 'dynamodb.us-east-1.amazonaws.com', - region: 'us-east-1', -}); +const createApplicationContext = require('../../../src/applicationContext'); exports.handler = async event => { + const applicationContext = createApplicationContext(); + const { email, name, sub: userId } = event.request.userAttributes; - await dynamoClient - .put({ - Item: { - email, - name, - pk: userId, - role: 'petitioner', - sk: userId, - userId, - }, - TableName: process.env.DYNAMO_TABLE, - }) - .promise(); + await applicationContext.getUseCases().createPetitionerAccountInteractor({ + applicationContext, + email, + name, + userId, + }); return event; }; diff --git a/web-api/terraform/template/cron/index.js b/web-api/terraform/template/cron/index.js index d28d3479f53..4c2063ecd41 100644 --- a/web-api/terraform/template/cron/index.js +++ b/web-api/terraform/template/cron/index.js @@ -5,10 +5,6 @@ const { reprocessFailedRecordsLambda, } = require('../../../src/streams/reprocessFailedRecordsLambda'); -exports.reprocessFailedRecordsHandler = async event => { - return reprocessFailedRecordsLambda(event); -}; +exports.reprocessFailedRecordsHandler = reprocessFailedRecordsLambda; -exports.checkForReadyForTrialCasesHandler = async event => { - return checkForReadyForTrialCasesLambda(event); -}; +exports.checkForReadyForTrialCasesHandler = checkForReadyForTrialCasesLambda; diff --git a/web-api/terraform/template/streams/index.js b/web-api/terraform/template/streams/index.js index 5e4cb089ec9..5656dd8f44e 100644 --- a/web-api/terraform/template/streams/index.js +++ b/web-api/terraform/template/streams/index.js @@ -2,6 +2,4 @@ const { processStreamRecordsLambda, } = require('../../../src/streams/processStreamRecordsLambda'); -exports.handler = async event => { - return processStreamRecordsLambda(event); -}; +exports.handler = processStreamRecordsLambda; diff --git a/web-api/terraform/template/topics.tf b/web-api/terraform/template/topics.tf deleted file mode 100644 index 697b1f5074a..00000000000 --- a/web-api/terraform/template/topics.tf +++ /dev/null @@ -1,8 +0,0 @@ -resource "aws_sns_topic" "cloudwatch_alerts" { - name = "serverless-alerts-topic-${var.environment}" -} - -resource "aws_sns_topic" "cloudwatch_alerts_west" { - name = "serverless-alerts-topic-${var.environment}" - provider = "aws.us-west-1" -} \ No newline at end of file diff --git a/web-api/terraform/template/websockets.tf b/web-api/terraform/template/websockets.tf new file mode 100644 index 00000000000..87d7cba145d --- /dev/null +++ b/web-api/terraform/template/websockets.tf @@ -0,0 +1,181 @@ +resource "aws_apigatewayv2_api" "websocket_api" { + name = "websocket_api_${var.environment}" + protocol_type = "WEBSOCKET" + route_selection_expression = "$request.body.action" +} + +resource "aws_apigatewayv2_route" "connect" { + api_id = "${aws_apigatewayv2_api.websocket_api.id}" + route_key = "$connect" + authorization_type = "CUSTOM" + authorizer_id = "${aws_apigatewayv2_authorizer.websocket_authorizer.id}" + target = "integrations/${aws_apigatewayv2_integration.websockets_connect_integration.id}" +} + +resource "aws_apigatewayv2_route" "disconnect" { + api_id = "${aws_apigatewayv2_api.websocket_api.id}" + route_key = "$disconnect" + target = "integrations/${aws_apigatewayv2_integration.websockets_disconnect_integration.id}" +} + +data "archive_file" "zip_websockets" { + type = "zip" + output_path = "${path.module}/websockets/index.js.zip" + source_file = "${path.module}/websockets/dist/index.js" +} + +resource "aws_lambda_function" "websockets_connect_lambda" { + filename = "${data.archive_file.zip_websockets.output_path}" + function_name = "websockets_connect_${var.environment}" + role = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:role/lambda_role_${var.environment}" + handler = "index.connectHandler" + source_code_hash = "${data.archive_file.zip_websockets.output_base64sha256}" + timeout = "29" + memory_size = "3008" + + runtime = "nodejs12.x" + + environment { + variables = "${data.null_data_source.locals.outputs}" + } +} + + +resource "aws_lambda_function" "websockets_disconnect_lambda" { + filename = "${data.archive_file.zip_websockets.output_path}" + function_name = "websockets_disconnect_${var.environment}" + role = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:role/lambda_role_${var.environment}" + handler = "index.disconnectHandler" + source_code_hash = "${data.archive_file.zip_websockets.output_base64sha256}" + timeout = "29" + memory_size = "3008" + + runtime = "nodejs12.x" + + environment { + variables = "${data.null_data_source.locals.outputs}" + } +} + +resource "aws_apigatewayv2_integration" "websockets_connect_integration" { + api_id = "${aws_apigatewayv2_api.websocket_api.id}" + integration_type = "AWS_PROXY" + integration_method = "POST" + integration_uri = "${aws_lambda_function.websockets_connect_lambda.invoke_arn}" + passthrough_behavior = "WHEN_NO_MATCH" + content_handling_strategy = "CONVERT_TO_TEXT" +} + + +resource "aws_apigatewayv2_integration" "websockets_disconnect_integration" { + api_id = "${aws_apigatewayv2_api.websocket_api.id}" + integration_type = "AWS_PROXY" + integration_method = "POST" + integration_uri = "${aws_lambda_function.websockets_disconnect_lambda.invoke_arn}" + passthrough_behavior = "WHEN_NO_MATCH" + content_handling_strategy = "CONVERT_TO_TEXT" +} + +resource "aws_lambda_permission" "apigw_connect_lambda" { + statement_id = "AllowExecutionFromAPIGateway" + action = "lambda:InvokeFunction" + function_name = "${aws_lambda_function.websockets_connect_lambda.function_name}" + principal = "apigateway.amazonaws.com" + source_arn = "${aws_apigatewayv2_api.websocket_api.execution_arn}/*/*" +} + + +resource "aws_lambda_permission" "apigw_disconnect_lambda" { + statement_id = "AllowExecutionFromAPIGateway" + action = "lambda:InvokeFunction" + function_name = "${aws_lambda_function.websockets_disconnect_lambda.function_name}" + principal = "apigateway.amazonaws.com" + source_arn = "${aws_apigatewayv2_api.websocket_api.execution_arn}/*/*" +} + +resource "aws_apigatewayv2_stage" "stage" { + api_id = "${aws_apigatewayv2_api.websocket_api.id}" + name = "${var.environment}" +} + +resource "aws_apigatewayv2_deployment" "websocket_deploy" { + api_id = "${aws_apigatewayv2_api.websocket_api.id}" + + depends_on = [ + "aws_apigatewayv2_route.connect", + "aws_apigatewayv2_route.disconnect", + ] + + lifecycle { + create_before_destroy = true + } + + triggers { + deployed_at = "Deployed at ${timestamp()}" + } +} + + +resource "aws_acm_certificate" "websockets_east_cert" { + domain_name = "efcms-websockets-${var.environment}.${var.dns_domain}" + validation_method = "DNS" + + tags = { + Name = "efcms-websockets-${var.environment}.${var.dns_domain}" + ProductDomain = "EFCMS websockets" + Environment = "${var.environment}" + Description = "Certificate for efcms-websockets-${var.environment}.${var.dns_domain}" + ManagedBy = "terraform" + } +} + +resource "aws_acm_certificate_validation" "validate_websockets_east_cert" { + certificate_arn = "${aws_acm_certificate.websockets_east_cert.arn}" + validation_record_fqdns = ["${aws_route53_record.websockets_route53_east_record.fqdn}"] +} + +resource "aws_route53_record" "websockets_route53_east_record" { + name = "${aws_acm_certificate.websockets_east_cert.domain_validation_options.0.resource_record_name}" + type = "${aws_acm_certificate.websockets_east_cert.domain_validation_options.0.resource_record_type}" + zone_id = "${data.aws_route53_zone.zone.id}" + records = [ + "${aws_acm_certificate.websockets_east_cert.domain_validation_options.0.resource_record_value}", + ] + ttl = 60 +} + +resource "aws_apigatewayv2_domain_name" "websockets_domain" { + domain_name = "efcms-websockets-${var.environment}.${var.dns_domain}" + + domain_name_configuration { + certificate_arn = "${aws_acm_certificate.websockets_east_cert.arn}" + endpoint_type = "REGIONAL" + security_policy = "TLS_1_2" + } +} + +resource "aws_apigatewayv2_api_mapping" "websocket_mapping" { + api_id = "${aws_apigatewayv2_api.websocket_api.id}" + domain_name = "${aws_apigatewayv2_domain_name.websockets_domain.id}" + stage = "${aws_apigatewayv2_stage.stage.id}" +} + +resource "aws_route53_record" "websocket_east_regional_record" { + name = "${aws_apigatewayv2_domain_name.websockets_domain.domain_name}" + type = "A" + zone_id = "${data.aws_route53_zone.zone.id}" + + alias { + evaluate_target_health = true + name = "${aws_apigatewayv2_domain_name.websockets_domain.domain_name_configuration.0.target_domain_name}" + zone_id = "${aws_apigatewayv2_domain_name.websockets_domain.domain_name_configuration.0.hosted_zone_id}" + } +} + +resource "aws_apigatewayv2_authorizer" "websocket_authorizer" { + api_id = "${aws_apigatewayv2_api.websocket_api.id}" + authorizer_type = "REQUEST" + authorizer_uri = "${aws_lambda_function.cognito_authorizer_lambda.invoke_arn}" + identity_sources = ["route.request.querystring.token"] + name = "websocket_authorizer_${var.environment}" +} \ No newline at end of file diff --git a/web-api/terraform/template/websockets/.gitignore b/web-api/terraform/template/websockets/.gitignore new file mode 100644 index 00000000000..a15430dfee4 --- /dev/null +++ b/web-api/terraform/template/websockets/.gitignore @@ -0,0 +1 @@ +index.js.zip \ No newline at end of file diff --git a/web-api/terraform/template/websockets/index.js b/web-api/terraform/template/websockets/index.js new file mode 100644 index 00000000000..0816144bfdd --- /dev/null +++ b/web-api/terraform/template/websockets/index.js @@ -0,0 +1,9 @@ +const { connectLambda } = require('../../../src/notifications/connectLambda'); + +const { + disconnectLambda, +} = require('../../../src/notifications/disconnectLambda'); + +exports.connectHandler = connectLambda; + +exports.disconnectHandler = disconnectLambda; diff --git a/web-api/verify-authorizers.js b/web-api/verify-authorizers.js deleted file mode 100755 index 53649392e78..00000000000 --- a/web-api/verify-authorizers.js +++ /dev/null @@ -1,80 +0,0 @@ -const axios = require('axios'); -const fs = require('fs'); -const yaml = require('js-yaml'); -const env = process.env.ENV; - -axios.interceptors.request.use(function (config) { - config.headers['Content-Type'] = 'application/json'; - return config; -}); - -const main = async () => { - const serverlessYmlFiles = process.argv - .slice(2) - .filter( - path => !path.includes('public-api') && path.includes('serverless'), - ); - - const serverlessConfigs = serverlessYmlFiles.map(path => - yaml.safeLoad(fs.readFileSync(path, 'utf8')), - ); - - const missingAuthorizers = []; - const no401Response = []; - - console.log('verifying the follwing urls:'); - - for (const config of serverlessConfigs) { - if (!config.custom.customDomain) continue; - - const { basePath } = config.custom.customDomain; - const { functions } = config; - - for (const [funName, funConfig] of Object.entries(functions)) { - const event = funConfig.events[0]; - const def = event.http; - if (!def) continue; - - const { authorizer, method, path } = def; - - if (!authorizer) { - missingAuthorizers.push(funName); - } - - const urlToVerify = `https://efcms-${env}.${process.env.EFCMS_DOMAIN}/${basePath}${path}`; - let responseStatus = null; - try { - console.log(` ${urlToVerify}`); - await axios[method.toLowerCase()](urlToVerify); - } catch (err) { - responseStatus = err.response.status; - } - if (responseStatus !== 401) { - no401Response.push(urlToVerify); - } - } - } - - if (missingAuthorizers.length) { - console.log( - `\n\nThe following http functions are missing authorizers: ${missingAuthorizers.join( - ', ', - )}`, - ); - process.exit(1); - } - - if (no401Response.length) { - console.log( - `\n\nThe following urls functions are missing authorizers:\n${no401Response.join( - '\n', - )}`, - ); - process.exit(1); - } -}; - -main().catch(err => { - console.error(err); - process.exit(1); -}); diff --git a/web-api/websockets-local.js b/web-api/websockets-local.js new file mode 100644 index 00000000000..93538453c82 --- /dev/null +++ b/web-api/websockets-local.js @@ -0,0 +1,63 @@ +const http = require('http'); +const uuid = require('uuid').v4; +const WebSocketServer = require('websocket').server; + +const { connectLambda } = require('./src/notifications/connectLambda'); +const { disconnectLambda } = require('./src/notifications/disconnectLambda'); + +const connections = {}; + +const server = http.createServer(function (request, response) { + let body = ''; + request.on('data', chunk => { + body += chunk.toString(); + }); + request.on('end', () => { + const split = request.url.split('/'); + const connectionId = split[split.length - 1]; + if (connections[connectionId]) { + connections[connectionId].sendUTF(body); + response.writeHead(200); + response.end(); + } else { + response.writeHead(410); + response.end(); + } + }); +}); + +const PORT = 3011; + +server.listen(PORT, function () { + console.log(new Date() + ` Server is listening on port ${PORT}`); +}); + +const wsServer = new WebSocketServer({ + autoAcceptConnections: false, + httpServer: server, +}); + +wsServer.on('request', function (request) { + const connection = request.accept('echo-protocol', request.origin); + const connectionId = uuid(); + connections[connectionId] = connection; + connectLambda({ + queryStringParameters: { + token: request.resourceURL.query.token, + }, + requestContext: { + connectionId, + domainName: `ws://localhost:${PORT}`, + }, + }); + connection.on('message', function () {}); + connection.on('close', function () { + delete connections[connectionId]; + + disconnectLambda({ + requestContext: { + connectionId, + }, + }); + }); +}); diff --git a/web-client/build-dist.sh b/web-client/build-dist.sh index 83f444e1a08..3a80c2e5c9c 100755 --- a/web-client/build-dist.sh +++ b/web-client/build-dist.sh @@ -2,7 +2,7 @@ ENV=$1 REGION="us-east-1" API_URL="https://efcms-api-${ENV}.${EFCMS_DOMAIN}" -WS_URL="wss://efcms-${ENV}-ws.${EFCMS_DOMAIN}" +WS_URL="wss://efcms-websockets-${ENV}.${EFCMS_DOMAIN}" COGNITO_REDIRECT_URL="https%3A//ui-${ENV}.${EFCMS_DOMAIN}/log-in" COGNITO_REDIRECT_URI="https://ui-${ENV}.${EFCMS_DOMAIN}/log-in" diff --git a/web-client/integration-tests/journey/admissionsClerkAddsNewPractitioner.js b/web-client/integration-tests/journey/admissionsClerkAddsNewPractitioner.js index 7ea965c827b..cac358630c3 100644 --- a/web-client/integration-tests/journey/admissionsClerkAddsNewPractitioner.js +++ b/web-client/integration-tests/journey/admissionsClerkAddsNewPractitioner.js @@ -73,7 +73,7 @@ export const admissionsClerkAddsNewPractitioner = test => { }); await test.runSequence('updateFormValueSequence', { key: 'contact.state', - value: 'Oklahoma', + value: 'OK', }); await test.runSequence('updateFormValueSequence', { key: 'contact.postalCode', diff --git a/web-client/integration-tests/journey/docketClerkCompletesMessageThread.js b/web-client/integration-tests/journey/docketClerkCompletesMessageThread.js new file mode 100644 index 00000000000..3972c3f8e26 --- /dev/null +++ b/web-client/integration-tests/journey/docketClerkCompletesMessageThread.js @@ -0,0 +1,60 @@ +import { formattedMessageDetail as formattedMessageDetailComputed } from '../../src/presenter/computeds/formattedMessageDetail'; +import { refreshElasticsearchIndex } from '../helpers'; +import { runCompute } from 'cerebral/test'; +import { withAppContextDecorator } from '../../src/withAppContext'; + +const formattedMessageDetail = withAppContextDecorator( + formattedMessageDetailComputed, +); + +export const docketClerkCompletesMessageThread = test => { + return it('docket clerk completes message thread', async () => { + await test.runSequence('openCompleteMessageModalSequence'); + + await test.runSequence('updateModalValueSequence', { + key: 'form.message', + value: 'Win, Win, Win, Win', + }); + + await test.runSequence('completeCaseMessageSequence'); + + expect(test.getState('validationErrors')).toEqual({}); + + expect(test.getState('messageDetail').length).toEqual(3); + + const messageDetailFormatted = runCompute(formattedMessageDetail, { + state: test.getState(), + }); + expect(messageDetailFormatted.isCompleted).toEqual(true); + + await refreshElasticsearchIndex(); + + //message should no longer be shown in inbox + await test.runSequence('gotoCaseMessagesSequence', { + box: 'inbox', + queue: 'my', + }); + + let messages = test.getState('messages'); + + let foundMessage = messages.find( + message => message.subject === test.testMessageSubject, + ); + + expect(foundMessage).not.toBeDefined(); + + //message thread should be shown in completed box + await test.runSequence('gotoCaseMessagesSequence', { + box: 'completed', + queue: 'my', + }); + + messages = test.getState('messages'); + + foundMessage = messages.find( + message => message.subject === test.testMessageSubject, + ); + + expect(foundMessage).toBeDefined(); + }); +}; diff --git a/web-client/integration-tests/journey/docketClerkViewsCompletedMessagesOnCaseDetail.js b/web-client/integration-tests/journey/docketClerkViewsCompletedMessagesOnCaseDetail.js new file mode 100644 index 00000000000..9d527fe31eb --- /dev/null +++ b/web-client/integration-tests/journey/docketClerkViewsCompletedMessagesOnCaseDetail.js @@ -0,0 +1,23 @@ +import { formattedCaseMessages as formattedCaseMessagesComputed } from '../../src/presenter/computeds/formattedCaseMessages'; +import { runCompute } from 'cerebral/test'; +import { withAppContextDecorator } from '../../src/withAppContext'; + +const formattedCaseMessages = withAppContextDecorator( + formattedCaseMessagesComputed, +); + +export const docketClerkViewsCompletedMessagesOnCaseDetail = test => { + return it('docket clerk views completed messages on the case detail page', async () => { + await test.runSequence('gotoCaseDetailSequence', { + docketNumber: test.docketNumber, + }); + + expect(test.getState('caseDetail.messages').length).toEqual(3); + + const caseMessagesFormatted = runCompute(formattedCaseMessages, { + state: test.getState(), + }); + expect(caseMessagesFormatted.inProgressMessages.length).toEqual(0); + expect(caseMessagesFormatted.completedMessages.length).toEqual(1); + }); +}; diff --git a/web-client/integration-tests/journey/docketClerkViewsForwardedMessageInInbox.js b/web-client/integration-tests/journey/docketClerkViewsForwardedMessageInInbox.js new file mode 100644 index 00000000000..4917f6a9145 --- /dev/null +++ b/web-client/integration-tests/journey/docketClerkViewsForwardedMessageInInbox.js @@ -0,0 +1,17 @@ +export const docketClerkViewsForwardedMessageInInbox = test => { + return it('docket clerk views the forwarded message they were sent in their inbox', async () => { + await test.runSequence('gotoCaseMessagesSequence', { + box: 'inbox', + queue: 'my', + }); + + const messages = test.getState('messages'); + + const foundMessage = messages.find( + message => message.subject === test.testMessageSubject, + ); + + expect(foundMessage).toBeDefined(); + expect(foundMessage.from).toEqual('Test Petitionsclerk'); + }); +}; diff --git a/web-client/integration-tests/journey/petitionsClerk1RepliesToMessage.js b/web-client/integration-tests/journey/petitionsClerk1RepliesToMessage.js new file mode 100644 index 00000000000..4b22e94129f --- /dev/null +++ b/web-client/integration-tests/journey/petitionsClerk1RepliesToMessage.js @@ -0,0 +1,40 @@ +import { refreshElasticsearchIndex } from '../helpers'; + +export const petitionsClerk1RepliesToMessage = test => { + return it('petitions clerk 1 replies to the message they received', async () => { + await test.runSequence('openReplyToMessageModalSequence'); + + expect(test.getState('modal.form')).toMatchObject({ + parentMessageId: test.parentMessageId, + subject: test.testMessageSubject, + to: 'Test Petitionsclerk', + }); + + await test.runSequence('updateModalValueSequence', { + key: 'form.message', + value: 'Identity theft is not a joke, Jim.', + }); + + await test.runSequence('replyToCaseMessageSequence'); + + expect(test.getState('validationErrors')).toEqual({}); + + expect(test.getState('messageDetail').length).toEqual(2); + + await refreshElasticsearchIndex(); + + //message should no longer be shown in inbox + await test.runSequence('gotoCaseMessagesSequence', { + box: 'inbox', + queue: 'my', + }); + + const messages = test.getState('messages'); + + const foundMessage = messages.find( + message => message.subject === test.testMessageSubject, + ); + + expect(foundMessage).not.toBeDefined(); + }); +}; diff --git a/web-client/integration-tests/journey/petitionsClerk1ViewsMessageDetail.js b/web-client/integration-tests/journey/petitionsClerk1ViewsMessageDetail.js index 079715a68c4..9d484cb7202 100644 --- a/web-client/integration-tests/journey/petitionsClerk1ViewsMessageDetail.js +++ b/web-client/integration-tests/journey/petitionsClerk1ViewsMessageDetail.js @@ -2,11 +2,13 @@ export const petitionsClerk1ViewsMessageDetail = test => { return it('petitions clerk 1 views the message detail for the message they received', async () => { await test.runSequence('gotoMessageDetailSequence', { docketNumber: test.docketNumber, - messageId: test.messageId, + parentMessageId: test.parentMessageId, }); - expect(test.getState('messageDetail')).toMatchObject({ - messageId: test.messageId, - }); + expect(test.getState('messageDetail')).toMatchObject([ + { + parentMessageId: test.parentMessageId, + }, + ]); }); }; diff --git a/web-client/integration-tests/journey/petitionsClerk1ViewsMessageInbox.js b/web-client/integration-tests/journey/petitionsClerk1ViewsMessageInbox.js index 59c42e1cde8..ecac4fd9c97 100644 --- a/web-client/integration-tests/journey/petitionsClerk1ViewsMessageInbox.js +++ b/web-client/integration-tests/journey/petitionsClerk1ViewsMessageInbox.js @@ -14,6 +14,6 @@ export const petitionsClerk1ViewsMessageInbox = test => { expect(foundMessage).toBeDefined(); test.testMessageDocumentId = foundMessage.attachments[0].documentId; - test.messageId = foundMessage.messageId; + test.parentMessageId = foundMessage.parentMessageId; }); }; diff --git a/web-client/integration-tests/journey/petitionsClerkAddsNoticeToCase.js b/web-client/integration-tests/journey/petitionsClerkAddsNoticeToCase.js index 84b2fd4eb1c..5b97f907d71 100644 --- a/web-client/integration-tests/journey/petitionsClerkAddsNoticeToCase.js +++ b/web-client/integration-tests/journey/petitionsClerkAddsNoticeToCase.js @@ -43,6 +43,13 @@ export const petitionsClerkAddsNoticeToCase = test => { expect(test.getState('validationErrors')).toEqual({}); expect(test.getState('pdfPreviewUrl')).toBeDefined(); + // await test.runSequence('setPDFSignatureDataSequence', { + // isPdfAlreadySigned: false, + // signatureApplied: false, + // signatureData: { scale: 1, x: 20, y: 20 }, + // }); + // await test.runSequence('saveDocumentSigningSequence'); + //skip signing and go back to caseDetail await test.runSequence('gotoCaseDetailSequence', { docketNumber: test.docketNumber, diff --git a/web-client/integration-tests/journey/petitionsClerkCreatesNewMessageOnCase.js b/web-client/integration-tests/journey/petitionsClerkCreatesNewMessageOnCase.js index ae1449d7404..bd8c1904c45 100644 --- a/web-client/integration-tests/journey/petitionsClerkCreatesNewMessageOnCase.js +++ b/web-client/integration-tests/journey/petitionsClerkCreatesNewMessageOnCase.js @@ -1,16 +1,16 @@ import { NewCaseMessage } from '../../../shared/src/business/entities/NewCaseMessage'; -import { createCaseMessageModalHelper as createCaseMessageModalHelperComputed } from '../../src/presenter/computeds/createCaseMessageModalHelper'; +import { caseMessageModalHelper as caseMessageModalHelperComputed } from '../../src/presenter/computeds/caseMessageModalHelper'; import { refreshElasticsearchIndex } from '../helpers'; import { runCompute } from 'cerebral/test'; import { withAppContextDecorator } from '../../src/withAppContext'; -const createCaseMessageModalHelper = withAppContextDecorator( - createCaseMessageModalHelperComputed, +const caseMessageModalHelper = withAppContextDecorator( + caseMessageModalHelperComputed, ); export const petitionsClerkCreatesNewMessageOnCase = test => { const getHelper = () => { - return runCompute(createCaseMessageModalHelper, { + return runCompute(caseMessageModalHelper, { state: test.getState(), }); }; @@ -35,7 +35,7 @@ export const petitionsClerkCreatesNewMessageOnCase = test => { const messageDocument = getHelper().documents[0]; test.testMessageDocumentId = messageDocument.documentId; - await test.runSequence('updateCreateCaseMessageAttachmentsSequence', { + await test.runSequence('updateCaseMessageModalAttachmentsSequence', { documentId: messageDocument.documentId, }); @@ -46,7 +46,7 @@ export const petitionsClerkCreatesNewMessageOnCase = test => { // Add four more attachments to reach the maximum of five. for (let i = 0; i < 4; i++) { // currently doesn't matter if we add the same document over and over - await test.runSequence('updateCreateCaseMessageAttachmentsSequence', { + await test.runSequence('updateCaseMessageModalAttachmentsSequence', { documentId: messageDocument.documentId, }); } diff --git a/web-client/integration-tests/journey/petitionsClerkForwardsMessageToDocketClerk.js b/web-client/integration-tests/journey/petitionsClerkForwardsMessageToDocketClerk.js new file mode 100644 index 00000000000..cc7b3261df9 --- /dev/null +++ b/web-client/integration-tests/journey/petitionsClerkForwardsMessageToDocketClerk.js @@ -0,0 +1,56 @@ +import { refreshElasticsearchIndex } from '../helpers'; + +export const petitionsClerkForwardsMessageToDocketClerk = test => { + return it('petitions clerk forwards the message to docket clerk', async () => { + await test.runSequence('openForwardMessageModalSequence'); + + expect(test.getState('modal.form')).toMatchObject({ + parentMessageId: test.parentMessageId, + subject: test.testMessageSubject, + }); + + await test.runSequence('updateModalValueSequence', { + key: 'form.message', + value: 'Four years of malfeasance unreported. This cannot stand.', + }); + + await test.runSequence('forwardCaseMessageSequence'); + + expect(test.getState('validationErrors')).toEqual({ + toSection: expect.anything(), + toUserId: expect.anything(), + }); + + await test.runSequence('updateCreateCaseMessageValueInModalSequence', { + key: 'toSection', + value: 'docket', + }); + + await test.runSequence('updateCreateCaseMessageValueInModalSequence', { + key: 'toUserId', + value: '1805d1ab-18d0-43ec-bafb-654e83405416', //docketclerk + }); + + await test.runSequence('forwardCaseMessageSequence'); + + expect(test.getState('validationErrors')).toEqual({}); + + expect(test.getState('messageDetail').length).toEqual(3); + + await refreshElasticsearchIndex(); + + //message should no longer be shown in inbox + await test.runSequence('gotoCaseMessagesSequence', { + box: 'inbox', + queue: 'my', + }); + + const messages = test.getState('messages'); + + const foundMessage = messages.find( + message => message.subject === test.testMessageSubject, + ); + + expect(foundMessage).not.toBeDefined(); + }); +}; diff --git a/web-client/integration-tests/journey/petitionsClerkViewsInProgressMessagesOnCaseDetail.js b/web-client/integration-tests/journey/petitionsClerkViewsInProgressMessagesOnCaseDetail.js new file mode 100644 index 00000000000..e3c66e67640 --- /dev/null +++ b/web-client/integration-tests/journey/petitionsClerkViewsInProgressMessagesOnCaseDetail.js @@ -0,0 +1,23 @@ +import { formattedCaseMessages as formattedCaseMessagesComputed } from '../../src/presenter/computeds/formattedCaseMessages'; +import { runCompute } from 'cerebral/test'; +import { withAppContextDecorator } from '../../src/withAppContext'; + +const formattedCaseMessages = withAppContextDecorator( + formattedCaseMessagesComputed, +); + +export const petitionsClerkViewsInProgressMessagesOnCaseDetail = test => { + return it('petitions clerk views in-progress messages on the case detail page', async () => { + await test.runSequence('gotoCaseDetailSequence', { + docketNumber: test.docketNumber, + }); + + expect(test.getState('caseDetail.messages').length).toEqual(3); + + const caseMessagesFormatted = runCompute(formattedCaseMessages, { + state: test.getState(), + }); + expect(caseMessagesFormatted.inProgressMessages.length).toEqual(1); + expect(caseMessagesFormatted.completedMessages.length).toEqual(0); + }); +}; diff --git a/web-client/integration-tests/journey/petitionsClerkViewsReplyInInbox.js b/web-client/integration-tests/journey/petitionsClerkViewsReplyInInbox.js new file mode 100644 index 00000000000..432d08e8c16 --- /dev/null +++ b/web-client/integration-tests/journey/petitionsClerkViewsReplyInInbox.js @@ -0,0 +1,17 @@ +export const petitionsClerkViewsReplyInInbox = test => { + return it('petitions clerk views the reply they were sent in their inbox', async () => { + await test.runSequence('gotoCaseMessagesSequence', { + box: 'inbox', + queue: 'my', + }); + + const messages = test.getState('messages'); + + const foundMessage = messages.find( + message => message.subject === test.testMessageSubject, + ); + + expect(foundMessage).toBeDefined(); + expect(foundMessage.from).toEqual('Test Petitionsclerk1'); + }); +}; diff --git a/web-client/integration-tests/messagesJourney.test.js b/web-client/integration-tests/messagesJourney.test.js index 8b8c57882e1..13de3c1762e 100644 --- a/web-client/integration-tests/messagesJourney.test.js +++ b/web-client/integration-tests/messagesJourney.test.js @@ -1,7 +1,14 @@ +import { docketClerkCompletesMessageThread } from './journey/docketClerkCompletesMessageThread'; +import { docketClerkViewsCompletedMessagesOnCaseDetail } from './journey/docketClerkViewsCompletedMessagesOnCaseDetail'; +import { docketClerkViewsForwardedMessageInInbox } from './journey/docketClerkViewsForwardedMessageInInbox'; import { loginAs, setupTest, uploadPetition } from './helpers'; +import { petitionsClerk1RepliesToMessage } from './journey/petitionsClerk1RepliesToMessage'; import { petitionsClerk1ViewsMessageDetail } from './journey/petitionsClerk1ViewsMessageDetail'; import { petitionsClerk1ViewsMessageInbox } from './journey/petitionsClerk1ViewsMessageInbox'; import { petitionsClerkCreatesNewMessageOnCase } from './journey/petitionsClerkCreatesNewMessageOnCase'; +import { petitionsClerkForwardsMessageToDocketClerk } from './journey/petitionsClerkForwardsMessageToDocketClerk'; +import { petitionsClerkViewsInProgressMessagesOnCaseDetail } from './journey/petitionsClerkViewsInProgressMessagesOnCaseDetail'; +import { petitionsClerkViewsReplyInInbox } from './journey/petitionsClerkViewsReplyInInbox'; import { petitionsClerkViewsSentMessagesBox } from './journey/petitionsClerkViewsSentMessagesBox'; const test = setupTest(); @@ -27,4 +34,15 @@ describe('messages journey', () => { loginAs(test, 'petitionsclerk1'); petitionsClerk1ViewsMessageInbox(test); petitionsClerk1ViewsMessageDetail(test); + petitionsClerk1RepliesToMessage(test); + + loginAs(test, 'petitionsclerk'); + petitionsClerkViewsReplyInInbox(test); + petitionsClerkForwardsMessageToDocketClerk(test); + petitionsClerkViewsInProgressMessagesOnCaseDetail(test); + + loginAs(test, 'docketclerk'); + docketClerkViewsForwardedMessageInInbox(test); + docketClerkCompletesMessageThread(test); + docketClerkViewsCompletedMessagesOnCaseDetail(test); }); diff --git a/web-client/integration-tests/petitionsClerkCreateNoticeJourney.test.js b/web-client/integration-tests/petitionsClerkCreateNoticeJourney.test.js index 2aa0f1d4ec1..a26a677b494 100644 --- a/web-client/integration-tests/petitionsClerkCreateNoticeJourney.test.js +++ b/web-client/integration-tests/petitionsClerkCreateNoticeJourney.test.js @@ -5,16 +5,25 @@ import { petitionerCreatesNewCase } from './journey/petitionerCreatesNewCase'; import { petitionerViewsDashboard } from './journey/petitionerViewsDashboard'; import { petitionsClerkAddsDocketEntryFromOrder } from './journey/petitionsClerkAddsDocketEntryFromOrder'; import { petitionsClerkAddsNoticeToCase } from './journey/petitionsClerkAddsNoticeToCase'; +import { petitionsClerkAppliesSignatureToDraftDocument } from './journey/petitionsClerkAppliesSignatureToDraftDocument'; +import { petitionsClerkSavesSignatureForDraftDocument } from './journey/petitionsClerkSavesSignatureForDraftDocument'; import { petitionsClerkViewsCaseDetail } from './journey/petitionsClerkViewsCaseDetail'; import { petitionsClerkViewsCaseDetailAfterAddingNotice } from './journey/petitionsClerkViewsCaseDetailAfterAddingNotice'; import { petitionsClerkViewsDocumentDetail } from './journey/petitionsClerkViewsDocumentDetail'; import { petitionsClerkViewsDraftDocumentsForNotice } from './journey/petitionsClerkViewsDraftDocumentsForNotice'; +import { petitionsClerkViewsSignDraftDocument } from './journey/petitionsClerkViewsSignDraftDocument'; -const test = setupTest(); - +const test = setupTest({ + useCases: { + loadPDFForSigningInteractor: () => Promise.resolve(null), + }, +}); describe('Petitions Clerk Create Notice Journey', () => { beforeAll(() => { jest.setTimeout(30000); + global.window.pdfjsObj = { + getData: () => Promise.resolve(new Uint8Array(fakeFile)), + }; }); loginAs(test, 'petitioner'); @@ -27,6 +36,9 @@ describe('Petitions Clerk Create Notice Journey', () => { petitionsClerkViewsCaseDetail(test); petitionsClerkAddsNoticeToCase(test); petitionsClerkViewsCaseDetailAfterAddingNotice(test); + petitionsClerkViewsSignDraftDocument(test); + petitionsClerkAppliesSignatureToDraftDocument(test); + petitionsClerkSavesSignatureForDraftDocument(test); petitionsClerkViewsDraftDocumentsForNotice(test, 1); petitionsClerkViewsDocumentDetail(test); petitionsClerkAddsDocketEntryFromOrder(test); diff --git a/web-client/pa11y/pa11y-petitionsclerk.js b/web-client/pa11y/pa11y-petitionsclerk.js index 92e37516d44..ace278555ef 100644 --- a/web-client/pa11y/pa11y-petitionsclerk.js +++ b/web-client/pa11y/pa11y-petitionsclerk.js @@ -143,8 +143,8 @@ module.exports = [ }, { actions: [ - 'wait for #tab-in-progress to be visible', - 'click element #tab-in-progress', + 'wait for #tab-drafts to be visible', + 'click element #tab-drafts', 'wait for button[data-document-id="25100ec6-eeeb-4e88-872f-c99fad1fe6c7"] to be visible', 'click element button[data-document-id="25100ec6-eeeb-4e88-872f-c99fad1fe6c7"]', ], @@ -182,12 +182,12 @@ module.exports = [ }, { actions: [ - 'wait for #tab-deadlines to be visible', - 'click element #tab-deadlines', + 'wait for #tab-tracked-items to be visible', + 'click element #tab-tracked-items', ], notes: 'checks a11y of deadlines tab', url: - 'http://localhost:1234/mock-login?token=petitionsclerk&path=/case-detail/107-19&info=deadlines-tab', + 'http://localhost:1234/mock-login?token=petitionsclerk&path=/case-detail/107-19&info=tracked-items-tab', }, { actions: [ @@ -216,34 +216,32 @@ module.exports = [ }, { actions: [ - 'wait for #tab-in-progress to be visible', - 'click element #tab-in-progress', + 'wait for #tab-drafts to be visible', + 'click element #tab-drafts', ], - notes: 'checks a11y of in progress tab, draft documents secondary tab', + notes: 'checks a11y of the draft documents tab', url: - 'http://localhost:1234/mock-login?token=petitionsclerk&path=/case-detail/109-19&info=in-progress-tab-drafts', + 'http://localhost:1234/mock-login?token=petitionsclerk&path=/case-detail/109-19&info=drafts-tab', }, { actions: [ - 'wait for #tab-in-progress to be visible', - 'click element #tab-in-progress', - 'wait for #tab-messages to be visible', - 'click element #tab-messages', + 'wait for #tab-case-messages to be visible', + 'click element #tab-case-messages', ], - notes: 'checks a11y of in progress tab, messages secondary tab', + notes: 'checks a11y of case messages tab', url: - 'http://localhost:1234/mock-login?token=petitionsclerk&path=/case-detail/109-19&info=in-progress-tab-messages', + 'http://localhost:1234/mock-login?token=petitionsclerk&path=/case-detail/109-19&info=case-messages-tab', }, { actions: [ - 'wait for #tab-in-progress to be visible', - 'click element #tab-in-progress', + 'wait for #tab-tracked-items to be visible', + 'click element #tab-tracked-items', 'wait for #tab-pending-report to be visible', 'click element #tab-pending-report', ], - notes: 'checks a11y of in progress tab, pending report secondary tab', + notes: 'checks a11y of tracked-items tab, pending report secondary tab', url: - 'http://localhost:1234/mock-login?token=petitionsclerk&path=/case-detail/109-19&info=in-progress-tab-pending-report', + 'http://localhost:1234/mock-login?token=petitionsclerk&path=/case-detail/109-19&info=tracked-items-tab-pending-report', }, { actions: [ @@ -488,4 +486,34 @@ module.exports = [ 'http://localhost:1234/mock-login?token=petitionsclerk&path=/case-messages/section/inbox&info=case-messages-section-inbox', 'http://localhost:1234/mock-login?token=petitionsclerk&path=/case-messages/section/outbox&info=case-messages-section-outbox', 'http://localhost:1234/mock-login?token=petitionsclerk&path=/case-messages/105-20/message-detail/eb0a139a-8951-4de1-8b83-f02a27504105&info=case-message-detail', + { + actions: [ + 'wait for #button-forward to be visible', + 'click element #button-forward', + 'wait for .modal-dialog to be visible', + ], + notes: 'checks the forward modal', + url: + 'http://localhost:1234/mock-login?token=petitionsclerk&path=/case-messages/105-20/message-detail/eb0a139a-8951-4de1-8b83-f02a27504105&info=message-detail-forward', + }, + { + actions: [ + 'wait for #button-reply to be visible', + 'click element #button-reply', + 'wait for .modal-dialog to be visible', + ], + notes: 'checks the reply modal', + url: + 'http://localhost:1234/mock-login?token=petitionsclerk&path=/case-messages/105-20/message-detail/eb0a139a-8951-4de1-8b83-f02a27504105&info=message-detail-reply', + }, + { + actions: [ + 'wait for #button-complete to be visible', + 'click element #button-reply', + 'wait for .modal-dialog to be visible', + ], + notes: 'checks the complete modal', + url: + 'http://localhost:1234/mock-login?token=petitionsclerk&path=/case-messages/105-20/message-detail/eb0a139a-8951-4de1-8b83-f02a27504105&info=message-detail-complete', + }, ]; diff --git a/web-client/sonar-project.properties b/web-client/sonar-project.properties index 20d0e479dde..bd601628484 100644 --- a/web-client/sonar-project.properties +++ b/web-client/sonar-project.properties @@ -5,7 +5,7 @@ sonar.projectVersion=1.0 # Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. # This property is optional if sonar.modules is set. sonar.sources=./src -sonar.exclusions=**/node_modules/**/*,dist/**, **/*.test.js, **/coverage/**, **/coverage-integration/**, **/coverage-unit/**, **/combined-coverage/**, **/cypress/**, src/environments/**, src/index.*, src/app.js, src/router.js, stylelint.*, **/applicationContext.js, **/getConstants.js +sonar.exclusions=**/node_modules/**/*,dist/**, **/*.test.js, **/coverage/**, **/coverage-integration/**, **/coverage-unit/**, **/combined-coverage/**, **/cypress/**, src/environments/**, src/index.*, src/app.js, src/router.js, stylelint.*, **/applicationContext.js, **/applicationContextPublic.js, **/getConstants.js sonar.javascript.file.suffixes=.js # Encoding of the source code. Default is default system encoding diff --git a/web-client/src/app.jsx b/web-client/src/app.jsx index 62244c70d16..241b9c446df 100644 --- a/web-client/src/app.jsx +++ b/web-client/src/app.jsx @@ -11,6 +11,7 @@ import { router, } from './router'; +import { faAddressCard } from '@fortawesome/free-regular-svg-icons/faAddressCard'; import { faArrowAltCircleLeft as faArrowAltCircleLeftRegular } from '@fortawesome/free-regular-svg-icons/faArrowAltCircleLeft'; import { faCheckCircle as faCheckCircleRegular } from '@fortawesome/free-regular-svg-icons/faCheckCircle'; import { faClock } from '@fortawesome/free-regular-svg-icons/faClock'; @@ -149,6 +150,7 @@ const app = { library.add( faArrowAltCircleLeftRegular, faArrowAltCircleLeftSolid, + faAddressCard, faCalculator, faCalendarAlt, faCalendarCheck, diff --git a/web-client/src/applicationContext.js b/web-client/src/applicationContext.js index 544d9ffb917..16bc2cc939a 100644 --- a/web-client/src/applicationContext.js +++ b/web-client/src/applicationContext.js @@ -23,6 +23,8 @@ import { } from '../../shared/src/business/utilities/getFormattedJudgeName'; import { generatePrintableCaseInventoryReportInteractor } from '../../shared/src/proxies/reports/generatePrintableCaseInventoryReportProxy'; import { generatePrintablePendingReportInteractor } from '../../shared/src/proxies/pendingItems/generatePrintablePendingReportProxy'; +import { getCompletedCaseMessagesForSectionInteractor } from '../../shared/src/proxies/messages/getCompletedCaseMessagesForSectionProxy'; +import { getCompletedCaseMessagesForUserInteractor } from '../../shared/src/proxies/messages/getCompletedCaseMessagesForUserProxy'; import { getDocumentDownloadUrlInteractor } from '../../shared/src/proxies/getDocumentDownloadUrlProxy'; import { getUserCaseNoteForCasesInteractor } from '../../shared/src/proxies/caseNote/getUserCaseNoteForCasesProxy'; import { validateDocketRecordInteractor } from '../../shared/src/business/useCases/validateDocketRecordInteractor'; @@ -62,6 +64,7 @@ import { formattedTrialSessionDetails, getTrialSessionStatus, } from '../../shared/src/business/utilities/getFormattedTrialSessionDetails'; +import { completeCaseMessageInteractor } from '../../shared/src/proxies/messages/completeCaseMessageProxy'; import { completeDocketEntryQCInteractor } from '../../shared/src/proxies/editDocketEntry/completeDocketEntryQCProxy'; import { completeWorkItemInteractor } from '../../shared/src/proxies/workitems/completeWorkItemProxy'; import { createCaseDeadlineInteractor } from '../../shared/src/proxies/caseDeadline/createCaseDeadlineProxy'; @@ -96,6 +99,7 @@ import { getFormattedCaseDetail, sortDocketRecords, } from '../../shared/src/business/utilities/getFormattedCaseDetail'; +import { forwardCaseMessageInteractor } from '../../shared/src/proxies/messages/forwardCaseMessageProxy'; import { forwardWorkItemInteractor } from '../../shared/src/proxies/workitems/forwardWorkItemProxy'; import { generateCaseAssociationDocumentTitleInteractor } from '../../shared/src/business/useCases/caseAssociationRequest/generateCaseAssociationDocumentTitleInteractor'; import { generateCourtIssuedDocumentTitleInteractor } from '../../shared/src/business/useCases/courtIssuedDocument/generateCourtIssuedDocumentTitleInteractor'; @@ -111,7 +115,8 @@ import { getCalendaredCasesForTrialSessionInteractor } from '../../shared/src/pr import { getCaseDeadlinesForCaseInteractor } from '../../shared/src/proxies/caseDeadline/getCaseDeadlinesForCaseProxy'; import { getCaseInteractor } from '../../shared/src/proxies/getCaseProxy'; import { getCaseInventoryReportInteractor } from '../../shared/src/proxies/reports/getCaseInventoryReportProxy'; -import { getCaseMessageInteractor } from '../../shared/src/proxies/messages/getCaseMessageProxy'; +import { getCaseMessageThreadInteractor } from '../../shared/src/proxies/messages/getCaseMessageThreadProxy'; +import { getCaseMessagesForCaseInteractor } from '../../shared/src/proxies/messages/getCaseMessagesForCaseProxy'; import { getCasesByUserInteractor } from '../../shared/src/proxies/getCasesByUserProxy'; import { getClosedCasesInteractor } from '../../shared/src/proxies/getClosedCasesProxy'; import { getConsolidatedCasesByCaseInteractor } from '../../shared/src/proxies/getConsolidatedCasesByCaseProxy'; @@ -160,6 +165,7 @@ import { removeCasePendingItemInteractor } from '../../shared/src/proxies/remove import { removeConsolidatedCasesInteractor } from '../../shared/src/proxies/removeConsolidatedCasesProxy'; import { removeItem } from '../../shared/src/persistence/localStorage/removeItem'; import { removeItemInteractor } from '../../shared/src/business/useCases/removeItemInteractor'; +import { replyToCaseMessageInteractor } from '../../shared/src/proxies/messages/replyToCaseMessageProxy'; import { runTrialSessionPlanningReportInteractor } from '../../shared/src/proxies/trialSessions/runTrialSessionPlanningReportProxy'; import { saveCaseDetailInternalEditInteractor } from '../../shared/src/proxies/saveCaseDetailInternalEditProxy'; import { saveCaseNoteInteractor } from '../../shared/src/proxies/caseNote/saveCaseNoteProxy'; @@ -274,6 +280,7 @@ const allUseCases = { canConsolidateInteractor, canSetTrialSessionAsCalendaredInteractor, caseAdvancedSearchInteractor, + completeCaseMessageInteractor, completeDocketEntryQCInteractor, completeWorkItemInteractor, createCaseDeadlineInteractor, @@ -300,6 +307,7 @@ const allUseCases = { fileExternalDocumentInteractor, filePetitionFromPaperInteractor, filePetitionInteractor, + forwardCaseMessageInteractor, forwardWorkItemInteractor, generateCaseAssociationDocumentTitleInteractor, generateCourtIssuedDocumentTitleInteractor, @@ -317,9 +325,12 @@ const allUseCases = { getCaseDeadlinesForCaseInteractor, getCaseInteractor, getCaseInventoryReportInteractor, - getCaseMessageInteractor, + getCaseMessageThreadInteractor, + getCaseMessagesForCaseInteractor, getCasesByUserInteractor, getClosedCasesInteractor, + getCompletedCaseMessagesForSectionInteractor, + getCompletedCaseMessagesForUserInteractor, getConsolidatedCasesByCaseInteractor, getDocumentDownloadUrlInteractor, getDocumentQCInboxForSectionInteractor, @@ -364,6 +375,7 @@ const allUseCases = { removeCasePendingItemInteractor, removeConsolidatedCasesInteractor, removeItemInteractor, + replyToCaseMessageInteractor, runTrialSessionPlanningReportInteractor, saveCaseDetailInternalEditInteractor, saveCaseNoteInteractor, diff --git a/web-client/src/applicationContextPublic.js b/web-client/src/applicationContextPublic.js index a924535c2fe..0aa4920a11f 100644 --- a/web-client/src/applicationContextPublic.js +++ b/web-client/src/applicationContextPublic.js @@ -3,6 +3,7 @@ import { CASE_SEARCH_PAGE_SIZE, COUNTRY_TYPES, US_STATES, + US_STATES_OTHER, } from '../../shared/src/business/entities/EntityConstants'; import { Case } from '../../shared/src/business/entities/cases/Case'; import { casePublicSearchInteractor } from '../../shared/src/proxies/casePublicSearchProxy'; @@ -53,7 +54,8 @@ const applicationContextPublic = { CASE_CAPTION_POSTFIX: CASE_CAPTION_POSTFIX, CASE_SEARCH_PAGE_SIZE: CASE_SEARCH_PAGE_SIZE, COUNTRY_TYPES: COUNTRY_TYPES, - US_STATES: US_STATES, + US_STATES, + US_STATES_OTHER, }), getCurrentUserToken: () => null, getHttpClient: () => axios, diff --git a/web-client/src/getConstants.js b/web-client/src/getConstants.js index e57f1e327a3..6ba4a41b048 100644 --- a/web-client/src/getConstants.js +++ b/web-client/src/getConstants.js @@ -13,8 +13,8 @@ import { COUNTRY_TYPES, COURT_ISSUED_EVENT_CODES, DEFAULT_PROCEDURE_TYPE, - DOCUMENT_CATEGORIES, - DOCUMENT_CATEGORY_MAP, + DOCUMENT_EXTERNAL_CATEGORIES, + DOCUMENT_EXTERNAL_CATEGORIES_MAP, DOCUMENT_INTERNAL_CATEGORY_MAP, DOCUMENT_NOTICE_EVENT_CODES, EMPLOYER_OPTIONS, @@ -43,6 +43,7 @@ import { TRIAL_CITIES, TRIAL_STATUS_TYPES, US_STATES, + US_STATES_OTHER, } from '../../shared/src/business/entities/EntityConstants'; import { FORMATS } from '../../shared/src/business/utilities/DateHandler'; import { ROLE_PERMISSIONS } from '../../shared/src/authorization/authorizationClientService'; @@ -72,8 +73,8 @@ export const getConstants = () => ({ CASE_SEARCH_PAGE_SIZE, CASE_TYPES, CASE_TYPES_MAP, - CATEGORIES: DOCUMENT_CATEGORIES, - CATEGORY_MAP: DOCUMENT_CATEGORY_MAP, + CATEGORIES: DOCUMENT_EXTERNAL_CATEGORIES, + CATEGORY_MAP: DOCUMENT_EXTERNAL_CATEGORIES_MAP, CHAMBERS_SECTION, CHAMBERS_SECTIONS, CHIEF_JUDGE, @@ -119,5 +120,6 @@ export const getConstants = () => ({ TRIAL_SESSION_TYPES: SESSION_TYPES, TRIAL_STATUS_TYPES, US_STATES, + US_STATES_OTHER, USER_ROLES: ROLES, }); diff --git a/web-client/src/presenter/actions/CaseDetail/completeCaseMessageAction.js b/web-client/src/presenter/actions/CaseDetail/completeCaseMessageAction.js new file mode 100644 index 00000000000..e0a6b5d890c --- /dev/null +++ b/web-client/src/presenter/actions/CaseDetail/completeCaseMessageAction.js @@ -0,0 +1,34 @@ +import { state } from 'cerebral'; + +/** + * completes a case message thread + * + * @param {object} providers the providers object + * @param {object} providers.applicationContext the application context + * @param {Function} providers.get the cerebral get function + * @param {object} providers.props the cerebral props object + * @returns {object} the alert success + */ +export const completeCaseMessageAction = async ({ + applicationContext, + get, + props, +}) => { + const form = get(state.modal.form); + const { mostRecentMessage } = props; + + const { + parentMessageId, + } = await applicationContext.getUseCases().completeCaseMessageInteractor({ + applicationContext, + parentMessageId: mostRecentMessage.parentMessageId, + ...form, + }); + + return { + alertSuccess: { + message: 'Your message has been sent.', + }, + parentMessageId, + }; +}; diff --git a/web-client/src/presenter/actions/CaseDetail/completeCaseMessageAction.test.js b/web-client/src/presenter/actions/CaseDetail/completeCaseMessageAction.test.js new file mode 100644 index 00000000000..59f5e4412a4 --- /dev/null +++ b/web-client/src/presenter/actions/CaseDetail/completeCaseMessageAction.test.js @@ -0,0 +1,50 @@ +import { applicationContextForClient as applicationContext } from '../../../../../shared/src/business/test/createTestApplicationContext'; +import { completeCaseMessageAction } from './completeCaseMessageAction'; +import { presenter } from '../../presenter-mock'; +import { runAction } from 'cerebral/test'; + +describe('completeCaseMessageAction', () => { + beforeAll(() => { + applicationContext + .getUseCases() + .completeCaseMessageInteractor.mockReturnValue({ + docketNumber: '123-45', + parentMessageId: '123', + }); + + presenter.providers.applicationContext = applicationContext; + }); + + it('should call completeCaseMessageInteractor with the expected parameters and return the alertSuccess and parentMessageId', async () => { + const result = await runAction(completeCaseMessageAction, { + modules: { + presenter, + }, + props: { + mostRecentMessage: { + parentMessageId: '08c26c12-a3b0-40e6-abff-08152edeb053', + }, + }, + state: { + modal: { + form: { + message: 'the complete message', + }, + }, + }, + }); + + expect( + applicationContext.getUseCases().completeCaseMessageInteractor, + ).toBeCalled(); + expect( + applicationContext.getUseCases().completeCaseMessageInteractor.mock + .calls[0][0], + ).toMatchObject({ + message: 'the complete message', + parentMessageId: '08c26c12-a3b0-40e6-abff-08152edeb053', + }); + expect(result.output).toHaveProperty('alertSuccess'); + expect(result.output).toHaveProperty('parentMessageId'); + }); +}); diff --git a/web-client/src/presenter/actions/CaseDetail/forwardCaseMessageAction.js b/web-client/src/presenter/actions/CaseDetail/forwardCaseMessageAction.js new file mode 100644 index 00000000000..863ca8fcc94 --- /dev/null +++ b/web-client/src/presenter/actions/CaseDetail/forwardCaseMessageAction.js @@ -0,0 +1,30 @@ +import { state } from 'cerebral'; + +/** + * forwards the case message + * + * @param {object} providers the providers object + * @param {object} providers.applicationContext the application context + * @param {Function} providers.get the cerebral get function + * @returns {object} contains the alert success message + */ +export const forwardCaseMessageAction = async ({ applicationContext, get }) => { + const form = get(state.modal.form); + + const { caseId } = get(state.caseDetail); + + const { + parentMessageId, + } = await applicationContext.getUseCases().forwardCaseMessageInteractor({ + applicationContext, + caseId, + ...form, + }); + + return { + alertSuccess: { + message: 'Your message has been sent.', + }, + parentMessageId, + }; +}; diff --git a/web-client/src/presenter/actions/CaseDetail/forwardCaseMessageAction.test.js b/web-client/src/presenter/actions/CaseDetail/forwardCaseMessageAction.test.js new file mode 100644 index 00000000000..08d41c77853 --- /dev/null +++ b/web-client/src/presenter/actions/CaseDetail/forwardCaseMessageAction.test.js @@ -0,0 +1,64 @@ +import { applicationContextForClient as applicationContext } from '../../../../../shared/src/business/test/createTestApplicationContext'; +import { forwardCaseMessageAction } from './forwardCaseMessageAction'; +import { presenter } from '../../presenter-mock'; +import { runAction } from 'cerebral/test'; + +describe('forwardCaseMessageAction', () => { + beforeAll(() => { + applicationContext + .getUseCases() + .forwardCaseMessageInteractor.mockReturnValue({ + docketNumber: '123-45', + parentMessageId: '123', + }); + + presenter.providers.applicationContext = applicationContext; + }); + + it('should call forwardCaseMessageInteractor with the expected parameters and return the alertSuccess and parentMessageId', async () => { + const result = await runAction(forwardCaseMessageAction, { + modules: { + presenter, + }, + state: { + caseDetail: { + caseId: 'a7806fa0-ce6a-41ca-b66e-59438953f8bb', + }, + modal: { + form: { + attachments: [ + { + documentId: 'b1130321-0a76-43bc-b3eb-64a18f079873', + documentTitle: 'Petition', + }, + ], + message: 'You there!', + parentMessageId: '499d51ae-f118-4eb6-bd0e-f2c351df8f06', + subject: 'Hey!', + }, + }, + }, + }); + + expect( + applicationContext.getUseCases().forwardCaseMessageInteractor, + ).toBeCalled(); + expect( + applicationContext.getUseCases().forwardCaseMessageInteractor.mock + .calls[0][0], + ).toMatchObject({ + attachments: [ + { + documentId: 'b1130321-0a76-43bc-b3eb-64a18f079873', + documentTitle: 'Petition', + }, + ], + caseId: 'a7806fa0-ce6a-41ca-b66e-59438953f8bb', + message: 'You there!', + parentMessageId: '499d51ae-f118-4eb6-bd0e-f2c351df8f06', + subject: 'Hey!', + }); + expect(result.output).toHaveProperty('alertSuccess'); + expect(result.output).toHaveProperty('parentMessageId'); + }); +}); diff --git a/web-client/src/presenter/actions/CaseDetail/getCaseMessagesForCaseAction.js b/web-client/src/presenter/actions/CaseDetail/getCaseMessagesForCaseAction.js new file mode 100644 index 00000000000..29e11b00033 --- /dev/null +++ b/web-client/src/presenter/actions/CaseDetail/getCaseMessagesForCaseAction.js @@ -0,0 +1,26 @@ +import { state } from 'cerebral'; + +/** + * gets and sets the case messages for a case + * + * @param {object} providers the providers object + * @param {object} providers.applicationContext the application context + * @param {Function} providers.get the cerebral get helper function + * @param {object} providers.store the cerebral store object + */ +export const getCaseMessagesForCaseAction = async ({ + applicationContext, + get, + store, +}) => { + const caseId = get(state.caseDetail.caseId); + + const messages = await applicationContext + .getUseCases() + .getCaseMessagesForCaseInteractor({ + applicationContext, + caseId, + }); + + store.set(state.caseDetail.messages, messages); +}; diff --git a/web-client/src/presenter/actions/CaseDetail/getCaseMessagesForCaseAction.test.js b/web-client/src/presenter/actions/CaseDetail/getCaseMessagesForCaseAction.test.js new file mode 100644 index 00000000000..5822b500758 --- /dev/null +++ b/web-client/src/presenter/actions/CaseDetail/getCaseMessagesForCaseAction.test.js @@ -0,0 +1,52 @@ +import { applicationContextForClient } from '../../../../../shared/src/business/test/createTestApplicationContext'; +import { getCaseMessagesForCaseAction } from './getCaseMessagesForCaseAction'; +import { presenter } from '../../presenter-mock'; +import { runAction } from 'cerebral/test'; + +describe('getCaseMessagesForCaseAction', () => { + const mockCaseMessage = { + caseId: 'b3f09a45-b27c-4383-acc1-2ab1f99e6725', + createdAt: '2019-03-01T21:40:46.415Z', + from: 'Test Petitionsclerk', + fromSection: 'petitions', + fromUserId: '4791e892-14ee-4ab1-8468-0c942ec379d2', + message: 'hey there', + messageId: 'a10d6855-f3ee-4c11-861c-c7f11cba4dff', + subject: 'hello', + to: 'Test Petitionsclerk2', + toSection: 'petitions', + toUserId: '449b916e-3362-4a5d-bf56-b2b94ba29c12', + }; + + beforeAll(() => { + presenter.providers.applicationContext = applicationContextForClient; + applicationContextForClient + .getUseCases() + .getCaseMessagesForCaseInteractor.mockReturnValue([mockCaseMessage]); + }); + + it('calls the use case with caseId', async () => { + const result = await runAction(getCaseMessagesForCaseAction, { + modules: { + presenter, + }, + state: { + caseDetail: { + caseId: '0fbd6b64-6e13-4984-b46b-fd74906fd2c7', + }, + }, + }); + + expect( + applicationContextForClient.getUseCases() + .getCaseMessagesForCaseInteractor, + ).toBeCalled(); + expect( + applicationContextForClient.getUseCases().getCaseMessagesForCaseInteractor + .mock.calls[0][0], + ).toMatchObject({ + caseId: '0fbd6b64-6e13-4984-b46b-fd74906fd2c7', + }); + expect(result.state.caseDetail.messages).toEqual([mockCaseMessage]); + }); +}); diff --git a/web-client/src/presenter/actions/CaseDetail/replyToCaseMessageAction.js b/web-client/src/presenter/actions/CaseDetail/replyToCaseMessageAction.js new file mode 100644 index 00000000000..c1ef97fa1ed --- /dev/null +++ b/web-client/src/presenter/actions/CaseDetail/replyToCaseMessageAction.js @@ -0,0 +1,22 @@ +import { state } from 'cerebral'; + +export const replyToCaseMessageAction = async ({ applicationContext, get }) => { + const form = get(state.modal.form); + + const { caseId } = get(state.caseDetail); + + const { + parentMessageId, + } = await applicationContext.getUseCases().replyToCaseMessageInteractor({ + applicationContext, + caseId, + ...form, + }); + + return { + alertSuccess: { + message: 'Your message has been sent.', + }, + parentMessageId, + }; +}; diff --git a/web-client/src/presenter/actions/CaseDetail/replyToCaseMessageAction.test.js b/web-client/src/presenter/actions/CaseDetail/replyToCaseMessageAction.test.js new file mode 100644 index 00000000000..a659f948295 --- /dev/null +++ b/web-client/src/presenter/actions/CaseDetail/replyToCaseMessageAction.test.js @@ -0,0 +1,64 @@ +import { applicationContextForClient as applicationContext } from '../../../../../shared/src/business/test/createTestApplicationContext'; +import { presenter } from '../../presenter-mock'; +import { replyToCaseMessageAction } from './replyToCaseMessageAction'; +import { runAction } from 'cerebral/test'; + +describe('replyToCaseMessageAction', () => { + beforeAll(() => { + applicationContext + .getUseCases() + .replyToCaseMessageInteractor.mockReturnValue({ + docketNumber: '123-45', + parentMessageId: '123', + }); + + presenter.providers.applicationContext = applicationContext; + }); + + it('should call replyToCaseMessageInteractor with the expected parameters and return the alertSuccess and parentMessageId', async () => { + const result = await runAction(replyToCaseMessageAction, { + modules: { + presenter, + }, + state: { + caseDetail: { + caseId: 'a7806fa0-ce6a-41ca-b66e-59438953f8bb', + }, + modal: { + form: { + attachments: [ + { + documentId: 'b1130321-0a76-43bc-b3eb-64a18f079873', + documentTitle: 'Petition', + }, + ], + message: 'You there!', + parentMessageId: '499d51ae-f118-4eb6-bd0e-f2c351df8f06', + subject: 'Hey!', + }, + }, + }, + }); + + expect( + applicationContext.getUseCases().replyToCaseMessageInteractor, + ).toBeCalled(); + expect( + applicationContext.getUseCases().replyToCaseMessageInteractor.mock + .calls[0][0], + ).toMatchObject({ + attachments: [ + { + documentId: 'b1130321-0a76-43bc-b3eb-64a18f079873', + documentTitle: 'Petition', + }, + ], + caseId: 'a7806fa0-ce6a-41ca-b66e-59438953f8bb', + message: 'You there!', + parentMessageId: '499d51ae-f118-4eb6-bd0e-f2c351df8f06', + subject: 'Hey!', + }); + expect(result.output).toHaveProperty('alertSuccess'); + expect(result.output).toHaveProperty('parentMessageId'); + }); +}); diff --git a/web-client/src/presenter/actions/CaseDetail/toggleShowAdditionalPetitionersAction.js b/web-client/src/presenter/actions/CaseDetail/toggleShowAdditionalPetitionersAction.js new file mode 100644 index 00000000000..bf5f6a38372 --- /dev/null +++ b/web-client/src/presenter/actions/CaseDetail/toggleShowAdditionalPetitionersAction.js @@ -0,0 +1,15 @@ +import { state } from 'cerebral'; + +/** + * sets state.showingAdditionalPetitioners its negated stored value (default false) + * + * @param {object} providers the providers object + * @param {object} providers.get the cerebral get function + * @param {Function} providers.store the cerebral store function + */ +export const toggleShowAdditionalPetitionersAction = ({ get, store }) => { + const showingAdditionalPetitioners = + get(state.showingAdditionalPetitioners) || false; + + store.set(state.showingAdditionalPetitioners, !showingAdditionalPetitioners); +}; diff --git a/web-client/src/presenter/actions/CaseDetail/toggleShowAdditionalPetitionersAction.test.js b/web-client/src/presenter/actions/CaseDetail/toggleShowAdditionalPetitionersAction.test.js new file mode 100644 index 00000000000..513f4d9a806 --- /dev/null +++ b/web-client/src/presenter/actions/CaseDetail/toggleShowAdditionalPetitionersAction.test.js @@ -0,0 +1,30 @@ +import { runAction } from 'cerebral/test'; +import { toggleShowAdditionalPetitionersAction } from './toggleShowAdditionalPetitionersAction'; + +describe('toggleShowAdditionalPetitionersAction', () => { + it('should default to true for the first run', async () => { + const result = await runAction(toggleShowAdditionalPetitionersAction); + + expect(result.state.showingAdditionalPetitioners).toEqual(true); + }); + + it('should be true if the state value is false', async () => { + const result = await runAction(toggleShowAdditionalPetitionersAction, { + state: { + showingAdditionalPetitioners: false, + }, + }); + + expect(result.state.showingAdditionalPetitioners).toEqual(true); + }); + + it('should be false if the state value is true', async () => { + const result = await runAction(toggleShowAdditionalPetitionersAction, { + state: { + showingAdditionalPetitioners: true, + }, + }); + + expect(result.state.showingAdditionalPetitioners).toEqual(false); + }); +}); diff --git a/web-client/src/presenter/actions/WorkItem/setForwardMessageModalDialogModalStateAction.js b/web-client/src/presenter/actions/WorkItem/setForwardMessageModalDialogModalStateAction.js new file mode 100644 index 00000000000..2920d897db6 --- /dev/null +++ b/web-client/src/presenter/actions/WorkItem/setForwardMessageModalDialogModalStateAction.js @@ -0,0 +1,24 @@ +import { state } from 'cerebral'; + +/** + * set the modal state + * + * @param {object} providers the providers object + * @param {object} providers.props the cerebral props + * @param {object} providers.store the cerebral store + */ +export const setForwardMessageModalDialogModalStateAction = ({ + props, + store, +}) => { + const { mostRecentMessage } = props; + store.set(state.modal.validationErrors, {}); + store.set(state.modal.form, { + attachments: mostRecentMessage.attachments, + from: mostRecentMessage.from, + fromSection: mostRecentMessage.fromSection, + fromUserId: mostRecentMessage.fromUserId, + parentMessageId: mostRecentMessage.parentMessageId, + subject: mostRecentMessage.subject, + }); +}; diff --git a/web-client/src/presenter/actions/WorkItem/setForwardMessageModalDialogModalStateAction.test.js b/web-client/src/presenter/actions/WorkItem/setForwardMessageModalDialogModalStateAction.test.js new file mode 100644 index 00000000000..ebed567379c --- /dev/null +++ b/web-client/src/presenter/actions/WorkItem/setForwardMessageModalDialogModalStateAction.test.js @@ -0,0 +1,49 @@ +import { presenter } from '../../presenter-mock'; +import { runAction } from 'cerebral/test'; +import { setForwardMessageModalDialogModalStateAction } from './setForwardMessageModalDialogModalStateAction'; + +describe('setForwardMessageModalDialogModalStateAction', () => { + it('should set the modal state for forwarding a message', async () => { + const result = await runAction( + setForwardMessageModalDialogModalStateAction, + { + modules: { + presenter, + }, + props: { + mostRecentMessage: { + attachments: [ + { + documentId: 'a5273185-f694-4d9c-bc90-71eddc5e5937', + documentTitle: 'Petition', + }, + ], + from: 'test user 1', + fromSection: 'petitions', + fromUserId: '589002b0-dacd-4e84-874a-52d9898623c3', + parentMessageId: '530f9b43-4934-4b2f-9aa4-50dcbe8064fa', + subject: 'the subject', + }, + }, + state: {}, + }, + ); + + expect(result.state.modal).toEqual({ + form: { + attachments: [ + { + documentId: 'a5273185-f694-4d9c-bc90-71eddc5e5937', + documentTitle: 'Petition', + }, + ], + from: 'test user 1', + fromSection: 'petitions', + fromUserId: '589002b0-dacd-4e84-874a-52d9898623c3', + parentMessageId: '530f9b43-4934-4b2f-9aa4-50dcbe8064fa', + subject: 'the subject', + }, + validationErrors: {}, + }); + }); +}); diff --git a/web-client/src/presenter/actions/WorkItem/setReplyToMessageModalDialogModalStateAction.js b/web-client/src/presenter/actions/WorkItem/setReplyToMessageModalDialogModalStateAction.js new file mode 100644 index 00000000000..b186996033b --- /dev/null +++ b/web-client/src/presenter/actions/WorkItem/setReplyToMessageModalDialogModalStateAction.js @@ -0,0 +1,24 @@ +import { state } from 'cerebral'; + +/** + * set the modal state + * + * @param {object} providers the providers object + * @param {object} providers.props the cerebral props + * @param {object} providers.store the cerebral store + */ +export const setReplyToMessageModalDialogModalStateAction = ({ + props, + store, +}) => { + const { mostRecentMessage } = props; + store.set(state.modal.validationErrors, {}); + store.set(state.modal.form, { + attachments: mostRecentMessage.attachments, + parentMessageId: mostRecentMessage.parentMessageId, + subject: mostRecentMessage.subject, + to: mostRecentMessage.from, + toSection: mostRecentMessage.fromSection, + toUserId: mostRecentMessage.fromUserId, + }); +}; diff --git a/web-client/src/presenter/actions/WorkItem/setReplyToMessageModalDialogModalStateAction.test.js b/web-client/src/presenter/actions/WorkItem/setReplyToMessageModalDialogModalStateAction.test.js new file mode 100644 index 00000000000..278e9dedb37 --- /dev/null +++ b/web-client/src/presenter/actions/WorkItem/setReplyToMessageModalDialogModalStateAction.test.js @@ -0,0 +1,49 @@ +import { presenter } from '../../presenter-mock'; +import { runAction } from 'cerebral/test'; +import { setReplyToMessageModalDialogModalStateAction } from './setReplyToMessageModalDialogModalStateAction'; + +describe('setReplyToMessageModalDialogModalStateAction', () => { + it('should set the modal state for replying to a message', async () => { + const result = await runAction( + setReplyToMessageModalDialogModalStateAction, + { + modules: { + presenter, + }, + props: { + mostRecentMessage: { + attachments: [ + { + documentId: 'a5273185-f694-4d9c-bc90-71eddc5e5937', + documentTitle: 'Petition', + }, + ], + from: 'test user 1', + fromSection: 'petitions', + fromUserId: '589002b0-dacd-4e84-874a-52d9898623c3', + parentMessageId: '530f9b43-4934-4b2f-9aa4-50dcbe8064fa', + subject: 'the subject', + }, + }, + state: {}, + }, + ); + + expect(result.state.modal).toEqual({ + form: { + attachments: [ + { + documentId: 'a5273185-f694-4d9c-bc90-71eddc5e5937', + documentTitle: 'Petition', + }, + ], + parentMessageId: '530f9b43-4934-4b2f-9aa4-50dcbe8064fa', + subject: 'the subject', + to: 'test user 1', + toSection: 'petitions', + toUserId: '589002b0-dacd-4e84-874a-52d9898623c3', + }, + validationErrors: {}, + }); + }); +}); diff --git a/web-client/src/presenter/actions/getCompletedCaseMessagesForSectionAction.js b/web-client/src/presenter/actions/getCompletedCaseMessagesForSectionAction.js new file mode 100644 index 00000000000..3033d13132a --- /dev/null +++ b/web-client/src/presenter/actions/getCompletedCaseMessagesForSectionAction.js @@ -0,0 +1,18 @@ +/** + * fetches the completed case messages for the section + * + * @param {object} applicationContext object that contains all the context specific methods + * @returns {Promise<{CaseMessage: Array}>} a list of messages + */ +export const getCompletedCaseMessagesForSectionAction = async ({ + applicationContext, +}) => { + const messages = await applicationContext + .getUseCases() + .getCompletedCaseMessagesForSectionInteractor({ + applicationContext, + section: applicationContext.getCurrentUser().section, + }); + + return { messages }; +}; diff --git a/web-client/src/presenter/actions/getCompletedCaseMessagesForSectionAction.test.js b/web-client/src/presenter/actions/getCompletedCaseMessagesForSectionAction.test.js new file mode 100644 index 00000000000..3b0c6640f8b --- /dev/null +++ b/web-client/src/presenter/actions/getCompletedCaseMessagesForSectionAction.test.js @@ -0,0 +1,27 @@ +import { applicationContextForClient as applicationContext } from '../../../../shared/src/business/test/createTestApplicationContext'; +import { getCompletedCaseMessagesForSectionAction } from './getCompletedCaseMessagesForSectionAction'; +import { presenter } from '../presenter-mock'; +import { runAction } from 'cerebral/test'; + +describe('getCompletedCaseMessagesForSectionAction', () => { + const message = { + messageId: '180bfc0c-4e8e-448a-802a-8fe027be85ef', + }; + + beforeAll(() => { + presenter.providers.applicationContext = applicationContext; + applicationContext + .getUseCases() + .getCompletedCaseMessagesForSectionInteractor.mockReturnValue([message]); + }); + + it('returns the messages retrieved from the use case', async () => { + const results = await runAction(getCompletedCaseMessagesForSectionAction, { + modules: { + presenter, + }, + state: {}, + }); + expect(results.output.messages).toEqual([message]); + }); +}); diff --git a/web-client/src/presenter/actions/getCompletedCaseMessagesForUserAction.js b/web-client/src/presenter/actions/getCompletedCaseMessagesForUserAction.js new file mode 100644 index 00000000000..9a64c3e4d71 --- /dev/null +++ b/web-client/src/presenter/actions/getCompletedCaseMessagesForUserAction.js @@ -0,0 +1,18 @@ +/** + * fetches the completed case messages for the user + * + * @param {object} applicationContext object that contains all the context specific methods + * @returns {Promise<{CaseMessage: Array}>} a list of messages + */ +export const getCompletedCaseMessagesForUserAction = async ({ + applicationContext, +}) => { + const messages = await applicationContext + .getUseCases() + .getCompletedCaseMessagesForUserInteractor({ + applicationContext, + userId: applicationContext.getCurrentUser().userId, + }); + + return { messages }; +}; diff --git a/web-client/src/presenter/actions/getCompletedCaseMessagesForUserAction.test.js b/web-client/src/presenter/actions/getCompletedCaseMessagesForUserAction.test.js new file mode 100644 index 00000000000..09fbe1edcc6 --- /dev/null +++ b/web-client/src/presenter/actions/getCompletedCaseMessagesForUserAction.test.js @@ -0,0 +1,27 @@ +import { applicationContextForClient as applicationContext } from '../../../../shared/src/business/test/createTestApplicationContext'; +import { getCompletedCaseMessagesForUserAction } from './getCompletedCaseMessagesForUserAction'; +import { presenter } from '../presenter-mock'; +import { runAction } from 'cerebral/test'; + +describe('getCompletedCaseMessagesForUserAction', () => { + const message = { + messageId: '180bfc0c-4e8e-448a-802a-8fe027be85ef', + }; + + beforeAll(() => { + presenter.providers.applicationContext = applicationContext; + applicationContext + .getUseCases() + .getCompletedCaseMessagesForUserInteractor.mockReturnValue([message]); + }); + + it('returns the messages retrieved from the use case', async () => { + const results = await runAction(getCompletedCaseMessagesForUserAction, { + modules: { + presenter, + }, + state: {}, + }); + expect(results.output.messages).toEqual([message]); + }); +}); diff --git a/web-client/src/presenter/actions/getDefaultAttachmentToDisplayAction.js b/web-client/src/presenter/actions/getDefaultAttachmentToDisplayAction.js index c32f3530677..3d5b50a3ba2 100644 --- a/web-client/src/presenter/actions/getDefaultAttachmentToDisplayAction.js +++ b/web-client/src/presenter/actions/getDefaultAttachmentToDisplayAction.js @@ -1,14 +1,13 @@ -import { state } from 'cerebral'; - /** - * gets the first attachment document from the case message to set as the default attachmentDocumentToDisplay + * gets the first attachment document from the most recent case message to set as the default attachmentDocumentToDisplay * * @param {object} providers the providers object - * @param {object} providers.get the cerebral get method + * @param {object} providers.props the cerebral props object * @returns {object} object containing attachmentDocumentToDisplay */ -export const getDefaultAttachmentToDisplayAction = ({ get }) => { - const { attachments } = get(state.messageDetail); +export const getDefaultAttachmentToDisplayAction = ({ props }) => { + const { mostRecentMessage } = props; + const { attachments } = mostRecentMessage; let attachmentDocumentToDisplay = null; if (attachments && attachments.length) { diff --git a/web-client/src/presenter/actions/getDefaultAttachmentToDisplayAction.test.js b/web-client/src/presenter/actions/getDefaultAttachmentToDisplayAction.test.js index bd39eea5449..03ee40740b1 100644 --- a/web-client/src/presenter/actions/getDefaultAttachmentToDisplayAction.test.js +++ b/web-client/src/presenter/actions/getDefaultAttachmentToDisplayAction.test.js @@ -4,8 +4,8 @@ import { runAction } from 'cerebral/test'; describe('getDefaultAttachmentToDisplayAction', () => { it('returns the first item in the attachments array as the attachmentDocumentToDisplay', async () => { const result = await runAction(getDefaultAttachmentToDisplayAction, { - state: { - messageDetail: { + props: { + mostRecentMessage: { attachments: [{ documentId: '1234' }, { documentId: '2345' }], }, }, @@ -17,8 +17,8 @@ describe('getDefaultAttachmentToDisplayAction', () => { it('returns attachmentDocumentToDisplay null if there are no attachments on the case message', async () => { const result = await runAction(getDefaultAttachmentToDisplayAction, { - state: { - messageDetail: { + props: { + mostRecentMessage: { attachments: [], }, }, diff --git a/web-client/src/presenter/actions/getMessageAction.test.js b/web-client/src/presenter/actions/getMessageAction.test.js deleted file mode 100644 index 68d9e4d1a26..00000000000 --- a/web-client/src/presenter/actions/getMessageAction.test.js +++ /dev/null @@ -1,31 +0,0 @@ -import { applicationContextForClient } from '../../../../shared/src/business/test/createTestApplicationContext'; -import { getMessageAction } from './getMessageAction'; -import { presenter } from '../presenter-mock'; -import { runAction } from 'cerebral/test'; - -describe('getMessageAction', () => { - beforeAll(() => { - presenter.providers.applicationContext = applicationContextForClient; - }); - - it('calls the use case with props.messageId', async () => { - await runAction(getMessageAction, { - modules: { - presenter, - }, - props: { - messageId: '0fbd6b64-6e13-4984-b46b-fd74906fd2c7', - }, - }); - - expect( - applicationContextForClient.getUseCases().getCaseMessageInteractor, - ).toBeCalled(); - expect( - applicationContextForClient.getUseCases().getCaseMessageInteractor.mock - .calls[0][0], - ).toMatchObject({ - messageId: '0fbd6b64-6e13-4984-b46b-fd74906fd2c7', - }); - }); -}); diff --git a/web-client/src/presenter/actions/getMessageAction.js b/web-client/src/presenter/actions/getMessageThreadAction.js similarity index 62% rename from web-client/src/presenter/actions/getMessageAction.js rename to web-client/src/presenter/actions/getMessageThreadAction.js index c5c5f5854a6..7db10e0b13c 100644 --- a/web-client/src/presenter/actions/getMessageAction.js +++ b/web-client/src/presenter/actions/getMessageThreadAction.js @@ -1,18 +1,18 @@ /** - * Fetches the message using the getMessage use case using the props.messageId + * Fetches the messages using the getMessage use case using the props.parentMessageId * * @param {object} providers the providers object * @param {object} providers.applicationContext needed for getting the getCase use case * @param {object} providers.props the cerebral props object containing props.docketNumber * @returns {object} contains the message returned from the use case */ -export const getMessageAction = async ({ applicationContext, props }) => { - const { messageId } = props; +export const getMessageThreadAction = async ({ applicationContext, props }) => { + const { parentMessageId } = props; const messageDetail = await applicationContext .getUseCases() - .getCaseMessageInteractor({ + .getCaseMessageThreadInteractor({ applicationContext, - messageId, + parentMessageId, }); return { messageDetail }; }; diff --git a/web-client/src/presenter/actions/getMessageThreadAction.test.js b/web-client/src/presenter/actions/getMessageThreadAction.test.js new file mode 100644 index 00000000000..e191893d9ad --- /dev/null +++ b/web-client/src/presenter/actions/getMessageThreadAction.test.js @@ -0,0 +1,31 @@ +import { applicationContextForClient } from '../../../../shared/src/business/test/createTestApplicationContext'; +import { getMessageThreadAction } from './getMessageThreadAction'; +import { presenter } from '../presenter-mock'; +import { runAction } from 'cerebral/test'; + +describe('getMessageThreadAction', () => { + beforeAll(() => { + presenter.providers.applicationContext = applicationContextForClient; + }); + + it('calls the use case with props.parentMessageId', async () => { + await runAction(getMessageThreadAction, { + modules: { + presenter, + }, + props: { + parentMessageId: '0fbd6b64-6e13-4984-b46b-fd74906fd2c7', + }, + }); + + expect( + applicationContextForClient.getUseCases().getCaseMessageThreadInteractor, + ).toBeCalled(); + expect( + applicationContextForClient.getUseCases().getCaseMessageThreadInteractor + .mock.calls[0][0], + ).toMatchObject({ + parentMessageId: '0fbd6b64-6e13-4984-b46b-fd74906fd2c7', + }); + }); +}); diff --git a/web-client/src/presenter/actions/getMostRecentMessageInThreadAction.js b/web-client/src/presenter/actions/getMostRecentMessageInThreadAction.js new file mode 100644 index 00000000000..0b6e7ebd1d9 --- /dev/null +++ b/web-client/src/presenter/actions/getMostRecentMessageInThreadAction.js @@ -0,0 +1,17 @@ +import { orderBy } from 'lodash'; +import { state } from 'cerebral'; + +/** + * gets the most recent message from state.messageDetail + * + * @param {object} providers the providers object + * @param {object} providers.get the cerebral get method + * @returns {object} object containing mostRecentMessage + */ +export const getMostRecentMessageInThreadAction = ({ get }) => { + const messageDetail = get(state.messageDetail); + + const sortedMessages = orderBy(messageDetail, 'createdAt', 'desc'); + + return { mostRecentMessage: sortedMessages[0] }; +}; diff --git a/web-client/src/presenter/actions/getMostRecentMessageInThreadAction.test.js b/web-client/src/presenter/actions/getMostRecentMessageInThreadAction.test.js new file mode 100644 index 00000000000..16036a73fd2 --- /dev/null +++ b/web-client/src/presenter/actions/getMostRecentMessageInThreadAction.test.js @@ -0,0 +1,27 @@ +import { getMostRecentMessageInThreadAction } from './getMostRecentMessageInThreadAction'; +import { runAction } from 'cerebral/test'; + +describe('getMostRecentMessageInThreadAction', () => { + it('returns the most recent message by createdAt from state.messageDetail', async () => { + const result = await runAction(getMostRecentMessageInThreadAction, { + state: { + messageDetail: [ + { + createdAt: '2019-03-01T21:40:46.415Z', + messageId: 'a8f07169-323d-4801-9a99-d2a8fe8ade91', + }, + { + createdAt: '2019-05-01T21:40:46.415Z', + messageId: 'bce7821c-f1e5-42e4-b459-ee4fb32b6e27', + }, + ], + }, + }); + expect(result.output).toEqual({ + mostRecentMessage: { + createdAt: '2019-05-01T21:40:46.415Z', + messageId: 'bce7821c-f1e5-42e4-b459-ee4fb32b6e27', + }, + }); + }); +}); diff --git a/web-client/src/presenter/actions/getOpinionTypesAction.js b/web-client/src/presenter/actions/getOpinionTypesAction.js index 40898a008fb..cd450af722d 100644 --- a/web-client/src/presenter/actions/getOpinionTypesAction.js +++ b/web-client/src/presenter/actions/getOpinionTypesAction.js @@ -1,4 +1,4 @@ -import { OPINION_DOCUMENT_TYPES } from '../../../../shared/src/business/entities/EntityConstants'; +import { OPINION_EVENT_CODES } from '../../../../shared/src/business/entities/EntityConstants'; const courtIssuedEventCodes = require('../../../../shared/src/tools/courtIssuedEventCodes.json'); /** @@ -9,7 +9,7 @@ const courtIssuedEventCodes = require('../../../../shared/src/tools/courtIssuedE */ export const getOpinionTypesAction = () => { const opinionDocuments = courtIssuedEventCodes.filter(courtIssuedDocument => { - if (OPINION_DOCUMENT_TYPES.includes(courtIssuedDocument.eventCode)) { + if (OPINION_EVENT_CODES.includes(courtIssuedDocument.eventCode)) { return courtIssuedDocument; } }); diff --git a/web-client/src/presenter/actions/navigateToCaseMessagesAction.js b/web-client/src/presenter/actions/navigateToCaseMessagesAction.js new file mode 100644 index 00000000000..5afd3553a97 --- /dev/null +++ b/web-client/src/presenter/actions/navigateToCaseMessagesAction.js @@ -0,0 +1,10 @@ +/** + * changes the route to case messages individual inbox + * + * @param {object} providers the providers object + * @param {object} providers.router the riot.router object that is used for changing the route + * @returns {Promise} async action + */ +export const navigateToCaseMessagesAction = async ({ router }) => { + await router.route('/case-messages/my/inbox'); +}; diff --git a/web-client/src/presenter/actions/navigateToCaseMessagesAction.test.js b/web-client/src/presenter/actions/navigateToCaseMessagesAction.test.js new file mode 100644 index 00000000000..2b2a4c429db --- /dev/null +++ b/web-client/src/presenter/actions/navigateToCaseMessagesAction.test.js @@ -0,0 +1,25 @@ +import { navigateToCaseMessagesAction } from './navigateToCaseMessagesAction'; +import { presenter } from '../presenter-mock'; +import { runAction } from 'cerebral/test'; + +describe('navigateToCaseMessagesAction', () => { + let routeStub; + + beforeAll(() => { + routeStub = jest.fn(); + + presenter.providers.router = { + route: routeStub, + }; + }); + + it('navigates to case messages', async () => { + await runAction(navigateToCaseMessagesAction, { + modules: { + presenter, + }, + }); + + expect(routeStub).toHaveBeenCalledWith('/case-messages/my/inbox'); + }); +}); diff --git a/web-client/src/presenter/actions/setDefaultIsExpandedAction.js b/web-client/src/presenter/actions/setDefaultIsExpandedAction.js new file mode 100644 index 00000000000..856a75cd908 --- /dev/null +++ b/web-client/src/presenter/actions/setDefaultIsExpandedAction.js @@ -0,0 +1,11 @@ +import { state } from 'cerebral'; + +/** + * sets state.isExpanded to false + * + * @param {object} providers the providers object + * @param {object} providers.store the cerebral store object + */ +export const setDefaultIsExpandedAction = async ({ store }) => { + store.set(state.isExpanded, false); +}; diff --git a/web-client/src/presenter/actions/setDocumentToEditAction.js b/web-client/src/presenter/actions/setDocumentToEditAction.js index 64a3fc45bf4..52eceb0c0e5 100644 --- a/web-client/src/presenter/actions/setDocumentToEditAction.js +++ b/web-client/src/presenter/actions/setDocumentToEditAction.js @@ -21,8 +21,10 @@ export const setDocumentToEditAction = ({ document => document.documentId === documentIdToEdit, ); + // TODO - refactor for clarity const draftState = documentToEdit.draftState || {}; draftState.documentIdToEdit = documentIdToEdit; + draftState.documentType = documentToEdit.documentType; store.set(state.documentToEdit, documentToEdit); store.set(state.form, draftState); diff --git a/web-client/src/presenter/actions/setDocumentToEditAction.test.js b/web-client/src/presenter/actions/setDocumentToEditAction.test.js index 98f73469315..67cdc08b2ab 100644 --- a/web-client/src/presenter/actions/setDocumentToEditAction.test.js +++ b/web-client/src/presenter/actions/setDocumentToEditAction.test.js @@ -108,6 +108,7 @@ describe('setDocumentToEditAction', () => { }); expect(result.state.form).toEqual({ documentIdToEdit: '321', + documentType: 'Petition', }); }); }); diff --git a/web-client/src/presenter/actions/updateCreateCaseMessageAttachmentsAction.js b/web-client/src/presenter/actions/updateCaseMessageModalAttachmentsAction.js similarity index 94% rename from web-client/src/presenter/actions/updateCreateCaseMessageAttachmentsAction.js rename to web-client/src/presenter/actions/updateCaseMessageModalAttachmentsAction.js index 14a3210f26a..05098ae2f14 100644 --- a/web-client/src/presenter/actions/updateCreateCaseMessageAttachmentsAction.js +++ b/web-client/src/presenter/actions/updateCaseMessageModalAttachmentsAction.js @@ -8,7 +8,7 @@ import { state } from 'cerebral'; * @param {object} providers.props the cerebral props object * @param {object} providers.store the cerebral store object */ -export const updateCreateCaseMessageAttachmentsAction = ({ +export const updateCaseMessageModalAttachmentsAction = ({ get, props, store, diff --git a/web-client/src/presenter/actions/updateCreateCaseMessageAttachmentsAction.test.js b/web-client/src/presenter/actions/updateCaseMessageModalAttachmentsAction.test.js similarity index 78% rename from web-client/src/presenter/actions/updateCreateCaseMessageAttachmentsAction.test.js rename to web-client/src/presenter/actions/updateCaseMessageModalAttachmentsAction.test.js index 8ea023815e1..d67a60cf6da 100644 --- a/web-client/src/presenter/actions/updateCreateCaseMessageAttachmentsAction.test.js +++ b/web-client/src/presenter/actions/updateCaseMessageModalAttachmentsAction.test.js @@ -1,7 +1,7 @@ import { runAction } from 'cerebral/test'; -import { updateCreateCaseMessageAttachmentsAction } from './updateCreateCaseMessageAttachmentsAction'; +import { updateCaseMessageModalAttachmentsAction } from './updateCaseMessageModalAttachmentsAction'; -describe('updateCreateCaseMessageAttachmentsAction', () => { +describe('updateCaseMessageModalAttachmentsAction', () => { const caseDetail = { documents: [ { @@ -12,7 +12,7 @@ describe('updateCreateCaseMessageAttachmentsAction', () => { }; it('appends the given document meta from props to the form.modal.attachments array', async () => { - const result = await runAction(updateCreateCaseMessageAttachmentsAction, { + const result = await runAction(updateCaseMessageModalAttachmentsAction, { props: { documentId: '123', }, @@ -32,7 +32,7 @@ describe('updateCreateCaseMessageAttachmentsAction', () => { }); it('does not modify the array if no documentId is given', async () => { - const result = await runAction(updateCreateCaseMessageAttachmentsAction, { + const result = await runAction(updateCaseMessageModalAttachmentsAction, { props: { documentId: '', documentTitle: '', @@ -51,7 +51,7 @@ describe('updateCreateCaseMessageAttachmentsAction', () => { }); it('sets the form subject field if this is the first attachment to be added', async () => { - const result = await runAction(updateCreateCaseMessageAttachmentsAction, { + const result = await runAction(updateCaseMessageModalAttachmentsAction, { props: { documentId: '123', }, @@ -69,7 +69,7 @@ describe('updateCreateCaseMessageAttachmentsAction', () => { }); it('does NOT set the form subject field if this is NOT the first attachment to be added', async () => { - const result = await runAction(updateCreateCaseMessageAttachmentsAction, { + const result = await runAction(updateCaseMessageModalAttachmentsAction, { props: { documentId: '123', }, diff --git a/web-client/src/presenter/computeds/AdvancedSearch/advancedDocumentSearchHelper.js b/web-client/src/presenter/computeds/AdvancedSearch/advancedDocumentSearchHelper.js index cd2f84ddb15..022aece29ff 100644 --- a/web-client/src/presenter/computeds/AdvancedSearch/advancedDocumentSearchHelper.js +++ b/web-client/src/presenter/computeds/AdvancedSearch/advancedDocumentSearchHelper.js @@ -1,6 +1,6 @@ import { Document } from '../../../../../shared/src/business/entities/Document'; import { - OPINION_DOCUMENT_TYPES, + OPINION_EVENT_CODES, ORDER_DOCUMENT_TYPES, } from '../../../../../shared/src/business/entities/EntityConstants'; @@ -64,7 +64,7 @@ export const formatDocumentSearchResultRecord = ( result.documentTitle = result.formattedDocumentType; } - if (OPINION_DOCUMENT_TYPES.includes(result.eventCode)) { + if (OPINION_EVENT_CODES.includes(result.eventCode)) { result.formattedJudgeName = result.judge ? applicationContext.getUtilities().getJudgeLastName(result.judge) : ''; diff --git a/web-client/src/presenter/computeds/AdvancedSearch/advancedDocumentSearchHelper.test.js b/web-client/src/presenter/computeds/AdvancedSearch/advancedDocumentSearchHelper.test.js index 463865a7009..86f97ab23ca 100644 --- a/web-client/src/presenter/computeds/AdvancedSearch/advancedDocumentSearchHelper.test.js +++ b/web-client/src/presenter/computeds/AdvancedSearch/advancedDocumentSearchHelper.test.js @@ -160,6 +160,7 @@ describe('advancedDocumentSearchHelper', () => { documentContents: 'Test Petitioner, Petitioner', documentTitle: 'Order', documentType: 'O - Order', + eventCode: 'O', filingDate: '2019-03-01T05:00:00.000Z', judge: 'Judge Buch', }, @@ -226,6 +227,7 @@ describe('advancedDocumentSearchHelper', () => { documentContents: 'Test Petitioner, Petitioner', documentTitle: 'My Opinion', documentType: 'TCOP - T.C. Opinion', + eventCode: 'TCOP', filingDate: '2019-03-01T05:00:00.000Z', judge: 'Judge Buch', }, @@ -237,6 +239,7 @@ describe('advancedDocumentSearchHelper', () => { documentContents: 'Test Petitioner, Petitioner', documentTitle: 'Opinion for Stuff', documentType: 'Summary Opinion', + eventCode: 'SOP', filingDate: '2019-03-01T05:00:00.000Z', judge: 'Judge Cohen', }, diff --git a/web-client/src/presenter/computeds/caseDetailSubnavHelper.js b/web-client/src/presenter/computeds/caseDetailSubnavHelper.js index 4c0fee2c415..e34af9c56b7 100644 --- a/web-client/src/presenter/computeds/caseDetailSubnavHelper.js +++ b/web-client/src/presenter/computeds/caseDetailSubnavHelper.js @@ -11,8 +11,9 @@ export const caseDetailSubnavHelper = (get, applicationContext) => { showCaseInformationTab: isInternalUser || (!isInternalUser && userAssociatedWithCase), showCorrespondenceTab: isInternalUser, - showDeadlinesTab: isInternalUser, - showInProgressTab: isInternalUser, + showDraftsTab: isInternalUser, + showMessagesTab: isInternalUser, showNotesTab: isInternalUser, + showTrackedItemsTab: isInternalUser, }; }; diff --git a/web-client/src/presenter/computeds/caseDetailSubnavHelper.test.js b/web-client/src/presenter/computeds/caseDetailSubnavHelper.test.js index f3e6aaaa7db..f7bd95b3b4c 100644 --- a/web-client/src/presenter/computeds/caseDetailSubnavHelper.test.js +++ b/web-client/src/presenter/computeds/caseDetailSubnavHelper.test.js @@ -36,8 +36,9 @@ describe('caseDetailSubnavHelper', () => { }, }); expect(result.showCaseInformationTab).toBeTruthy(); - expect(result.showDeadlinesTab).toBeTruthy(); - expect(result.showInProgressTab).toBeTruthy(); + expect(result.showTrackedItemsTab).toBeTruthy(); + expect(result.showDraftsTab).toBeTruthy(); + expect(result.showMessagesTab).toBeTruthy(); expect(result.showCorrespondenceTab).toBeTruthy(); expect(result.showNotesTab).toBeTruthy(); }); @@ -52,8 +53,9 @@ describe('caseDetailSubnavHelper', () => { ...getBaseState(user), }, }); - expect(result.showDeadlinesTab).toBeFalsy(); - expect(result.showInProgressTab).toBeFalsy(); + expect(result.showTrackedItemsTab).toBeFalsy(); + expect(result.showDraftsTab).toBeFalsy(); + expect(result.showMessagesTab).toBeFalsy(); expect(result.showCorrespondenceTab).toBeFalsy(); expect(result.showNotesTab).toBeFalsy(); }); diff --git a/web-client/src/presenter/computeds/caseInformationHelper.js b/web-client/src/presenter/computeds/caseInformationHelper.js index 424c33c4428..573c8149d80 100644 --- a/web-client/src/presenter/computeds/caseInformationHelper.js +++ b/web-client/src/presenter/computeds/caseInformationHelper.js @@ -14,11 +14,24 @@ export const caseInformationHelper = get => { !!caseDetail.irsPractitioners.length; const showAddCounsel = permissions.ASSOCIATE_USER_WITH_CASE; const showSealCaseButton = permissions.SEAL_CASE && !caseDetail.isSealed; + const showingAdditionalPetitioners = + get(state.showingAdditionalPetitioners) || false; + const toggleAdditionalPetitionersDisplay = showingAdditionalPetitioners + ? 'Hide' + : 'View'; + const otherPetitioners = [...(caseDetail.otherPetitioners || [])]; + const showOtherPetitioners = !!otherPetitioners.length; + const formattedOtherPetitioners = showingAdditionalPetitioners + ? otherPetitioners || [] + : otherPetitioners.slice(0, 4); return { + formattedOtherPetitioners, showAddCounsel, showEditIrsPractitioners: showEditIrsPractitionersButton, showEditPrivatePractitioners: showEditPrivatePractitionersButton, + showOtherPetitioners, showSealCaseButton, + toggleAdditionalPetitionersDisplay, }; }; diff --git a/web-client/src/presenter/computeds/caseInformationHelper.test.js b/web-client/src/presenter/computeds/caseInformationHelper.test.js index c495a42a0a8..4cc3f9faa54 100644 --- a/web-client/src/presenter/computeds/caseInformationHelper.test.js +++ b/web-client/src/presenter/computeds/caseInformationHelper.test.js @@ -138,4 +138,96 @@ describe('case information helper', () => { }); expect(result.showSealCaseButton).toBeFalsy(); }); + + describe('other petitioners', () => { + let baseState; + + beforeEach(() => { + const user = { + role: ROLES.docketClerk, // has SEAL_CASE permission + userId: '789', + }; + + baseState = { + ...getBaseState(user), + caseDetail: {}, + form: {}, + }; + }); + + it('shows "Hide" display if showingAdditionalPetitioners is true', () => { + const result = runCompute(caseInformationHelper, { + state: { + ...baseState, + showingAdditionalPetitioners: true, + }, + }); + + expect(result.toggleAdditionalPetitionersDisplay).toEqual('Hide'); + }); + + it('shows "View" display if showingAdditionalPetitioners is false', () => { + const result = runCompute(caseInformationHelper, { + state: { + ...baseState, + showingAdditionalPetitioners: false, + }, + }); + + expect(result.toggleAdditionalPetitionersDisplay).toEqual('View'); + }); + + it('does not paginate (or show) other petitioners if it is non-existent', () => { + const result = runCompute(caseInformationHelper, { + state: { + ...baseState, + }, + }); + + expect(result.formattedOtherPetitioners).toEqual([]); + expect(result.showOtherPetitioners).toEqual(false); + }); + + it('paginates if showingAdditionalPetitioners is false', () => { + const result = runCompute(caseInformationHelper, { + state: { + ...baseState, + caseDetail: { + otherPetitioners: [ + { a: '1' }, + { a: '1' }, + { a: '1' }, + { a: '1' }, + { a: '1' }, + ], + }, + showingAdditionalPetitioners: false, + }, + }); + + expect(result.formattedOtherPetitioners.length).toEqual(4); + expect(result.showOtherPetitioners).toEqual(true); + }); + + it('does not paginate (shows all) if showingAdditionalPetitioners is true', () => { + const result = runCompute(caseInformationHelper, { + state: { + ...baseState, + caseDetail: { + otherPetitioners: [ + { a: '1' }, + { a: '1' }, + { a: '1' }, + { a: '1' }, + { a: '1' }, + ], + }, + showingAdditionalPetitioners: true, + }, + }); + + expect(result.formattedOtherPetitioners.length).toEqual(5); + expect(result.showOtherPetitioners).toEqual(true); + }); + }); }); diff --git a/web-client/src/presenter/computeds/createCaseMessageModalHelper.js b/web-client/src/presenter/computeds/caseMessageModalHelper.js similarity index 93% rename from web-client/src/presenter/computeds/createCaseMessageModalHelper.js rename to web-client/src/presenter/computeds/caseMessageModalHelper.js index 649ca0caab7..fbd4b0bba00 100644 --- a/web-client/src/presenter/computeds/createCaseMessageModalHelper.js +++ b/web-client/src/presenter/computeds/caseMessageModalHelper.js @@ -1,6 +1,6 @@ import { state } from 'cerebral'; -export const createCaseMessageModalHelper = (get, applicationContext) => { +export const caseMessageModalHelper = (get, applicationContext) => { const caseDetail = get(state.caseDetail); const { docketRecordWithDocument, diff --git a/web-client/src/presenter/computeds/createCaseMessageModalHelper.test.js b/web-client/src/presenter/computeds/caseMessageModalHelper.test.js similarity index 84% rename from web-client/src/presenter/computeds/createCaseMessageModalHelper.test.js rename to web-client/src/presenter/computeds/caseMessageModalHelper.test.js index 85981451c19..4569ef9a882 100644 --- a/web-client/src/presenter/computeds/createCaseMessageModalHelper.test.js +++ b/web-client/src/presenter/computeds/caseMessageModalHelper.test.js @@ -1,15 +1,15 @@ import { MOCK_CASE } from '../../../../shared/src/test/mockCase'; import { applicationContext } from '../../applicationContext'; -import { createCaseMessageModalHelper as createCaseMessageModalHelperComputed } from './createCaseMessageModalHelper'; +import { caseMessageModalHelper as caseMessageModalHelperComputed } from './caseMessageModalHelper'; import { runCompute } from 'cerebral/test'; import { withAppContextDecorator } from '../../withAppContext'; -const createCaseMessageModalHelper = withAppContextDecorator( - createCaseMessageModalHelperComputed, +const caseMessageModalHelper = withAppContextDecorator( + caseMessageModalHelperComputed, applicationContext, ); -describe('createCaseMessageModalHelper', () => { +describe('caseMessageModalHelper', () => { let caseDetail; beforeAll(() => { @@ -33,7 +33,7 @@ describe('createCaseMessageModalHelper', () => { }); it('returns documents on the docket record', () => { - const result = runCompute(createCaseMessageModalHelper, { + const result = runCompute(caseMessageModalHelper, { state: { caseDetail, modal: { @@ -53,7 +53,7 @@ describe('createCaseMessageModalHelper', () => { }); it('returns draftDocuments from formattedCaseDetail', () => { - const result = runCompute(createCaseMessageModalHelper, { + const result = runCompute(caseMessageModalHelper, { state: { caseDetail, modal: { @@ -69,7 +69,7 @@ describe('createCaseMessageModalHelper', () => { }); it('returns showAddDocumentForm true when the current attachment count is zero', () => { - const result = runCompute(createCaseMessageModalHelper, { + const result = runCompute(caseMessageModalHelper, { state: { caseDetail, modal: { @@ -85,7 +85,7 @@ describe('createCaseMessageModalHelper', () => { }); it('returns showAddDocumentForm true when screenMetadata.showAddDocumentForm is true and the maximum number of attachments has not been met', () => { - const result = runCompute(createCaseMessageModalHelper, { + const result = runCompute(caseMessageModalHelper, { state: { caseDetail, modal: { @@ -103,7 +103,7 @@ describe('createCaseMessageModalHelper', () => { }); it('returns showAddDocumentForm false when screenMetadata.showAddDocumentForm is false and the maximum number of attachments has not been met', () => { - const result = runCompute(createCaseMessageModalHelper, { + const result = runCompute(caseMessageModalHelper, { state: { caseDetail, modal: { @@ -121,7 +121,7 @@ describe('createCaseMessageModalHelper', () => { }); it('returns showAddDocumentForm false when maximum number of attachments have been reached', () => { - const result = runCompute(createCaseMessageModalHelper, { + const result = runCompute(caseMessageModalHelper, { state: { caseDetail, modal: { @@ -139,7 +139,7 @@ describe('createCaseMessageModalHelper', () => { }); it('returns showAddMoreDocumentsButton true when showAddDocumentForm is false and the current attachment count is greater than zero but less than the maximum', () => { - const result = runCompute(createCaseMessageModalHelper, { + const result = runCompute(caseMessageModalHelper, { state: { caseDetail, modal: { @@ -157,7 +157,7 @@ describe('createCaseMessageModalHelper', () => { }); it('returns showAddMoreDocumentsButton false when maximum number of attachments have been reached', () => { - const result = runCompute(createCaseMessageModalHelper, { + const result = runCompute(caseMessageModalHelper, { state: { caseDetail, modal: { @@ -175,7 +175,7 @@ describe('createCaseMessageModalHelper', () => { }); it('returns showMessageAttachments true when the the form has message attachments', () => { - const result = runCompute(createCaseMessageModalHelper, { + const result = runCompute(caseMessageModalHelper, { state: { caseDetail, modal: { @@ -193,7 +193,7 @@ describe('createCaseMessageModalHelper', () => { }); it('returns showMessageAttachments false when the the form has NO message attachments', () => { - const result = runCompute(createCaseMessageModalHelper, { + const result = runCompute(caseMessageModalHelper, { state: { caseDetail, modal: { diff --git a/web-client/src/presenter/computeds/completeDocumentTypeSectionHelper.test.js b/web-client/src/presenter/computeds/completeDocumentTypeSectionHelper.test.js index 74854a0b6a6..0b0eb078b34 100644 --- a/web-client/src/presenter/computeds/completeDocumentTypeSectionHelper.test.js +++ b/web-client/src/presenter/computeds/completeDocumentTypeSectionHelper.test.js @@ -1,4 +1,4 @@ -import { DOCUMENT_CATEGORY_MAP } from '../../../../shared/src/business/entities/EntityConstants'; +import { DOCUMENT_EXTERNAL_CATEGORIES_MAP } from '../../../../shared/src/business/entities/EntityConstants'; import { applicationContext } from '../../applicationContext'; import { completeDocumentTypeSectionHelper as completeDocumentTypeSectionHelperComputed } from './completeDocumentTypeSectionHelper'; import { runCompute } from 'cerebral/test'; @@ -25,9 +25,9 @@ describe('completeDocumentTypeSectionHelper', () => { const categoryKey = 'Application'; const categoryIdx = 0; - const { category, documentType } = DOCUMENT_CATEGORY_MAP[categoryKey][ - categoryIdx - ]; + const { category, documentType } = DOCUMENT_EXTERNAL_CATEGORIES_MAP[ + categoryKey + ][categoryIdx]; const result = runCompute(completeDocumentTypeSectionHelper, { state: { @@ -49,9 +49,9 @@ describe('completeDocumentTypeSectionHelper', () => { const categoryKey = 'Motion'; const categoryIdx = 22; - const { category, documentType } = DOCUMENT_CATEGORY_MAP[categoryKey][ - categoryIdx - ]; + const { category, documentType } = DOCUMENT_EXTERNAL_CATEGORIES_MAP[ + categoryKey + ][categoryIdx]; const result = runCompute(completeDocumentTypeSectionHelper, { state: { diff --git a/web-client/src/presenter/computeds/formattedCaseMessages.js b/web-client/src/presenter/computeds/formattedCaseMessages.js new file mode 100644 index 00000000000..4a09f12e162 --- /dev/null +++ b/web-client/src/presenter/computeds/formattedCaseMessages.js @@ -0,0 +1,31 @@ +import { formatDateIfToday } from './formattedWorkQueue'; +import { state } from 'cerebral'; + +export const formattedCaseMessages = (get, applicationContext) => { + const messages = get(state.caseDetail.messages) || []; + + const formattedMessages = messages + .map(message => ({ + ...message, + completedAtFormatted: formatDateIfToday( + message.completedAt, + applicationContext, + ), + createdAtFormatted: formatDateIfToday( + message.createdAt, + applicationContext, + ), + })) + .sort((a, b) => { + return a.createdAt.localeCompare(b.createdAt); + }); + + const inProgressMessages = formattedMessages.filter( + message => !message.isRepliedTo, + ); + const completedMessages = formattedMessages.filter( + message => message.isCompleted, + ); + + return { completedMessages, inProgressMessages }; +}; diff --git a/web-client/src/presenter/computeds/formattedCaseMessages.test.js b/web-client/src/presenter/computeds/formattedCaseMessages.test.js new file mode 100644 index 00000000000..76b00948743 --- /dev/null +++ b/web-client/src/presenter/computeds/formattedCaseMessages.test.js @@ -0,0 +1,54 @@ +import { formattedCaseMessages as formattedCaseMessagesComputed } from './formattedCaseMessages'; +import { runCompute } from 'cerebral/test'; +import { withAppContextDecorator } from '../../withAppContext'; + +const formattedCaseMessages = withAppContextDecorator( + formattedCaseMessagesComputed, +); + +describe('formattedCaseMessages', () => { + it('returns formatted date strings and splits messages into completed and in-progress', () => { + const result = runCompute(formattedCaseMessages, { + state: { + caseDetail: { + messages: [ + { + createdAt: '2019-01-01T17:29:13.122Z', + from: 'Test Sender', + fromSection: 'docket', + fromUserId: '11181f4d-1e47-423a-8caf-6d2fdc3d3859', + isCompleted: false, + isRepliedTo: false, + message: 'This is a test message', + messageId: '22281f4d-1e47-423a-8caf-6d2fdc3d3859', + subject: 'Test subject...', + to: 'Test Recipient', + toSection: 'petitions', + toUserId: '33331f4d-1e47-423a-8caf-6d2fdc3d3859', + }, + { + completedAt: '2019-05-01T17:29:13.122Z', + createdAt: '2019-01-01T17:29:13.122Z', + from: 'Test Sender', + fromSection: 'docket', + fromUserId: '11181f4d-1e47-423a-8caf-6d2fdc3d3859', + isCompleted: true, + isRepliedTo: true, + message: 'This is a test message', + messageId: '9df69f8c-2db1-4981-b743-056b70b118c4', + subject: 'Test subject...', + to: 'Test Recipient', + toSection: 'petitions', + toUserId: '33331f4d-1e47-423a-8caf-6d2fdc3d3859', + }, + ], + }, + }, + }); + + expect(result).toMatchObject({ + completedMessages: [{ completedAtFormatted: '05/01/19' }], + inProgressMessages: [{ createdAtFormatted: '01/01/19' }], + }); + }); +}); diff --git a/web-client/src/presenter/computeds/formattedMessageDetail.js b/web-client/src/presenter/computeds/formattedMessageDetail.js index b9dc91f6890..4815aee2c0b 100644 --- a/web-client/src/presenter/computeds/formattedMessageDetail.js +++ b/web-client/src/presenter/computeds/formattedMessageDetail.js @@ -1,16 +1,48 @@ import { formatDateIfToday } from './formattedWorkQueue'; +import { orderBy } from 'lodash'; import { state } from 'cerebral'; -export const formattedMessageDetail = (get, applicationContext) => { - const messageDetail = get(state.messageDetail); - - const result = { - ...messageDetail, +const formatMessage = (message, applicationContext) => { + return { + ...message, + completedAtFormatted: formatDateIfToday( + message.completedAt, + applicationContext, + ), createdAtFormatted: formatDateIfToday( - messageDetail.createdAt, + message.createdAt, applicationContext, ), }; +}; - return result; +export const formattedMessageDetail = (get, applicationContext) => { + const messageDetail = get(state.messageDetail); + const isExpanded = get(state.isExpanded); + + const formattedMessages = orderBy( + messageDetail.map(message => formatMessage(message, applicationContext)), + 'createdAt', + 'desc', + ); + + const { isCompleted } = formattedMessages[0]; + + const currentMessage = formattedMessages[0]; + + if (isCompleted) { + formattedMessages.unshift(currentMessage); + } + + const hasOlderMessages = formattedMessages.length > 1; + + return { + attachments: formattedMessages[0].attachments, + currentMessage: formattedMessages[0], + hasOlderMessages, + isCompleted, + olderMessages: formattedMessages.slice(1), + showActionButtons: !isCompleted, + showOlderMessages: hasOlderMessages && isExpanded, + }; }; diff --git a/web-client/src/presenter/computeds/formattedMessageDetail.test.js b/web-client/src/presenter/computeds/formattedMessageDetail.test.js index b7116b30f27..bfd8351d653 100644 --- a/web-client/src/presenter/computeds/formattedMessageDetail.test.js +++ b/web-client/src/presenter/computeds/formattedMessageDetail.test.js @@ -11,19 +11,150 @@ const formattedMessageDetail = withAppContextDecorator( ); describe('formattedMessageDetail', () => { - it('formats the message detail with createdAtFormatted', () => { + it('formats the messages with createdAtFormatted and sorts by createdAt', () => { const result = runCompute(formattedMessageDetail, { state: { - messageDetail: { - caseId: '78fb798f-66c3-42fa-bb5a-c14fac735b61', - createdAt: '2019-03-01T21:40:46.415Z', + messageDetail: [ + { + attachments: [ + { documentId: '98065bac-b35c-423c-b649-122a09bb65b9' }, + ], + caseId: '78fb798f-66c3-42fa-bb5a-c14fac735b61', + createdAt: '2019-03-01T21:40:46.415Z', + messageId: '60e129bf-b8ec-4e0c-93c7-9633ab69f5df', + }, + { + attachments: [ + { documentId: '98065bac-b35c-423c-b649-122a09bb65b9' }, + { documentId: 'fee3958e-c738-4794-b0a1-bad711506685' }, + ], + caseId: '78fb798f-66c3-42fa-bb5a-c14fac735b61', + createdAt: '2019-04-01T21:40:46.415Z', + messageId: '98a9dbc4-a8d1-459b-98b2-30235b596d70', + }, + ], + }, + }); + + expect(result).toMatchObject({ + attachments: [ + { documentId: '98065bac-b35c-423c-b649-122a09bb65b9' }, + { documentId: 'fee3958e-c738-4794-b0a1-bad711506685' }, + ], + currentMessage: { + createdAtFormatted: '04/01/19', + messageId: '98a9dbc4-a8d1-459b-98b2-30235b596d70', + }, + olderMessages: [ + { + createdAtFormatted: '03/01/19', messageId: '60e129bf-b8ec-4e0c-93c7-9633ab69f5df', }, + ], + }); + }); + + it('formats completed message thread', () => { + const result = runCompute(formattedMessageDetail, { + state: { + messageDetail: [ + { + attachments: [ + { documentId: '98065bac-b35c-423c-b649-122a09bb65b9' }, + ], + caseId: '78fb798f-66c3-42fa-bb5a-c14fac735b61', + createdAt: '2019-03-01T21:40:46.415Z', + messageId: '60e129bf-b8ec-4e0c-93c7-9633ab69f5df', + }, + { + attachments: [ + { documentId: '98065bac-b35c-423c-b649-122a09bb65b9' }, + { documentId: 'fee3958e-c738-4794-b0a1-bad711506685' }, + ], + caseId: '78fb798f-66c3-42fa-bb5a-c14fac735b61', + completedAt: '2019-05-01T21:40:46.415Z', + completedBy: 'Test Petitioner', + completedBySection: 'petitions', + completedByUserId: '23869007-384d-464f-b079-cb1fcfb21e03', + createdAt: '2019-04-01T21:40:46.415Z', + isCompleted: true, + messageId: '98a9dbc4-a8d1-459b-98b2-30235b596d70', + }, + ], }, }); expect(result).toMatchObject({ - createdAtFormatted: '03/01/19', + attachments: [ + { documentId: '98065bac-b35c-423c-b649-122a09bb65b9' }, + { documentId: 'fee3958e-c738-4794-b0a1-bad711506685' }, + ], + currentMessage: { + completedAtFormatted: '05/01/19', + messageId: '98a9dbc4-a8d1-459b-98b2-30235b596d70', + }, + olderMessages: [ + { + createdAtFormatted: '04/01/19', + messageId: '98a9dbc4-a8d1-459b-98b2-30235b596d70', + }, + { + createdAtFormatted: '03/01/19', + messageId: '60e129bf-b8ec-4e0c-93c7-9633ab69f5df', + }, + ], + }); + }); + + it('returns hasOlderMessages true if there is more than one message', () => { + const result = runCompute(formattedMessageDetail, { + state: { + messageDetail: [ + { createdAt: '2019-03-01T21:40:46.415Z' }, + { createdAt: '2019-04-01T21:40:46.415Z' }, + ], + }, + }); + + expect(result.hasOlderMessages).toEqual(true); + }); + + it('returns hasOlderMessages false and showOlderMessages false if there is only one message', () => { + const result = runCompute(formattedMessageDetail, { + state: { + messageDetail: [{ createdAt: '2019-03-01T21:40:46.415Z' }], + }, }); + + expect(result.hasOlderMessages).toEqual(false); + expect(result.showOlderMessages).toEqual(false); + }); + + it('returns showOlderMessages true if there is more than one message and isExpanded is true', () => { + const result = runCompute(formattedMessageDetail, { + state: { + isExpanded: true, + messageDetail: [ + { createdAt: '2019-03-01T21:40:46.415Z' }, + { createdAt: '2019-04-01T21:40:46.415Z' }, + ], + }, + }); + + expect(result.showOlderMessages).toEqual(true); + }); + + it('returns showOlderMessages false if there is more than one message and isExpanded is false', () => { + const result = runCompute(formattedMessageDetail, { + state: { + isExpanded: false, + messageDetail: [ + { createdAt: '2019-03-01T21:40:46.415Z' }, + { createdAt: '2019-04-01T21:40:46.415Z' }, + ], + }, + }); + + expect(result.showOlderMessages).toEqual(false); }); }); diff --git a/web-client/src/presenter/computeds/formattedMessages.js b/web-client/src/presenter/computeds/formattedMessages.js index 4ecf40f1da4..5e270a06822 100644 --- a/web-client/src/presenter/computeds/formattedMessages.js +++ b/web-client/src/presenter/computeds/formattedMessages.js @@ -1,12 +1,15 @@ -import { state } from 'cerebral'; - import { formatDateIfToday } from './formattedWorkQueue'; +import { state } from 'cerebral'; export const formattedMessages = (get, applicationContext) => { const messages = get(state.messages) || []; const result = messages.map(message => ({ ...message, + completedAtFormatted: formatDateIfToday( + message.completedAt, + applicationContext, + ), createdAtFormatted: formatDateIfToday( message.createdAt, applicationContext, diff --git a/web-client/src/presenter/computeds/formattedMessages.test.js b/web-client/src/presenter/computeds/formattedMessages.test.js index 4fbd582f956..c6d4be48186 100644 --- a/web-client/src/presenter/computeds/formattedMessages.test.js +++ b/web-client/src/presenter/computeds/formattedMessages.test.js @@ -5,13 +5,14 @@ import { withAppContextDecorator } from '../../withAppContext'; const formattedMessages = withAppContextDecorator(formattedMessagesComputed); describe('formattedMessages', () => { - it('returns a createdAtFormatted', () => { + it('returns formatted date strings', () => { const result = runCompute(formattedMessages, { state: { messages: [ { caseId: 'c6b81f4d-1e47-423a-8caf-6d2fdc3d3859', caseStatus: 'Ready for trial', + completedAt: '2019-05-01T17:29:13.122Z', createdAt: '2019-01-01T17:29:13.122Z', docketNumber: '123-45', docketNumberSuffix: '', @@ -30,6 +31,7 @@ describe('formattedMessages', () => { }); expect(result[0].createdAtFormatted).toEqual('01/01/19'); + expect(result[0].completedAtFormatted).toEqual('05/01/19'); }); it('sorts messages by createdAt', () => { diff --git a/web-client/src/presenter/computeds/selectDocumentTypeHelper.test.js b/web-client/src/presenter/computeds/selectDocumentTypeHelper.test.js index e1fbbfa3bd4..ed3eedf7cdc 100644 --- a/web-client/src/presenter/computeds/selectDocumentTypeHelper.test.js +++ b/web-client/src/presenter/computeds/selectDocumentTypeHelper.test.js @@ -1,4 +1,4 @@ -import { DOCUMENT_CATEGORY_MAP } from '../../../../shared/src/business/entities/EntityConstants'; +import { DOCUMENT_EXTERNAL_CATEGORIES_MAP } from '../../../../shared/src/business/entities/EntityConstants'; import { MOCK_CASE } from '../../../../shared/src/test/mockCase'; import { applicationContext } from '../../applicationContext'; import { runCompute } from 'cerebral/test'; @@ -6,7 +6,7 @@ import { selectDocumentTypeHelper as selectDocumentTypeHelperComputed } from './ import { withAppContextDecorator } from '../../withAppContext'; // external filing events don't currently contain Nonstandard I, Nonstandard J -- but if they did ... -DOCUMENT_CATEGORY_MAP['Miscellaneous'].push({ +DOCUMENT_EXTERNAL_CATEGORIES_MAP['Miscellaneous'].push({ category: 'Miscellaneous', documentTitle: '[First, Second, etc.] Something to [anything]', documentType: 'Something [anything]', @@ -18,7 +18,7 @@ DOCUMENT_CATEGORY_MAP['Miscellaneous'].push({ scenario: 'Nonstandard I', }); -DOCUMENT_CATEGORY_MAP['Decision'].push({ +DOCUMENT_EXTERNAL_CATEGORIES_MAP['Decision'].push({ category: 'Decision', documentTitle: 'Stipulated Decision Entered [judge] [anything]', documentType: 'Stipulated Decision Entered', @@ -37,7 +37,7 @@ const selectDocumentTypeHelper = withAppContextDecorator( getConstants: () => { return { ...applicationContext.getConstants(), - CATEGORY_MAP: DOCUMENT_CATEGORY_MAP, + CATEGORY_MAP: DOCUMENT_EXTERNAL_CATEGORIES_MAP, }; }, }, diff --git a/web-client/src/presenter/presenter.js b/web-client/src/presenter/presenter.js index 3b212facd39..15ec78e8419 100644 --- a/web-client/src/presenter/presenter.js +++ b/web-client/src/presenter/presenter.js @@ -43,6 +43,7 @@ import { closeModalAndReturnToCaseDetailSequence } from './sequences/closeModalA import { closeModalAndReturnToDashboardSequence } from './sequences/closeModalAndReturnToDashboardSequence'; import { closeModalAndReturnToDocumentQCSequence } from './sequences/closeModalAndReturnToDocumentQCSequence'; import { closeModalAndReturnToTrialSessionsSequence } from './sequences/closeModalAndReturnToTrialSessionsSequence'; +import { completeCaseMessageSequence } from './sequences/completeCaseMessageSequence'; import { completeDocketEntryQCAndSendMessageSequence } from './sequences/completeDocketEntryQCAndSendMessageSequence'; import { completeDocketEntryQCSequence } from './sequences/completeDocketEntryQCSequence'; import { completeDocumentSelectSequence } from './sequences/completeDocumentSelectSequence'; @@ -74,6 +75,7 @@ import { editUploadCourtIssuedDocumentSequence } from './sequences/editUploadCou import { fetchPendingItemsSequence } from './sequences/pending/fetchPendingItemsSequence'; import { fetchUserNotificationsSequence } from './sequences/fetchUserNotificationsSequence'; import { formCancelToggleCancelSequence } from './sequences/formCancelToggleCancelSequence'; +import { forwardCaseMessageSequence } from './sequences/forwardCaseMessageSequence'; import { generateCaseCaptionSequence } from './sequences/generateCaseCaptionSequence'; import { generatePdfFromScanSessionSequence } from './sequences/generatePdfFromScanSessionSequence'; import { getBlockedCasesByTrialLocationSequence } from './sequences/getBlockedCasesByTrialLocationSequence'; @@ -224,6 +226,7 @@ import { removeScannedPdfSequence } from './sequences/removeScannedPdfSequence'; import { removeSecondarySupportingDocumentSequence } from './sequences/removeSecondarySupportingDocumentSequence'; import { removeSignatureFromOrderSequence } from './sequences/removeSignatureFromOrderSequence'; import { removeSupportingDocumentSequence } from './sequences/removeSupportingDocumentSequence'; +import { replyToCaseMessageSequence } from './sequences/replyToCaseMessageSequence'; import { rescanBatchSequence } from './sequences/rescanBatchSequence'; import { resetCaseMenuSequence } from './sequences/resetCaseMenuSequence'; import { resetHeaderAccordionsSequence } from './sequences/resetHeaderAccordionsSequence'; @@ -314,6 +317,7 @@ import { toggleCaseDifferenceSequence } from './sequences/toggleCaseDifferenceSe import { toggleMenuSequence } from './sequences/toggleMenuSequence'; import { toggleMobileDocketSortSequence } from './sequences/toggleMobileDocketSortSequence'; import { toggleMobileMenuSequence } from './sequences/toggleMobileMenuSequence'; +import { toggleShowAdditionalPetitionersSequence } from './sequences/toggleShowAdditionalPetitionersSequence'; import { toggleUsaBannerDetailsSequence } from './sequences/toggleUsaBannerDetailsSequence'; import { toggleWorkingCopySortSequence } from './sequences/toggleWorkingCopySortSequence'; import { unauthorizedErrorSequence } from './sequences/unauthorizedErrorSequence'; @@ -327,11 +331,11 @@ import { updateAdvancedSearchFormValueSequence } from './sequences/updateAdvance import { updateBatchDownloadProgressSequence } from './sequences/updateBatchDownloadProgressSequence'; import { updateCaseAssociationFormValueSequence } from './sequences/updateCaseAssociationFormValueSequence'; import { updateCaseDeadlineSequence } from './sequences/updateCaseDeadlineSequence'; +import { updateCaseMessageModalAttachmentsSequence } from './sequences/updateCaseMessageModalAttachmentsSequence'; import { updateCaseNoteSequence } from './sequences/updateCaseNoteSequence'; import { updateCasePartyTypeSequence } from './sequences/updateCasePartyTypeSequence'; import { updateCompleteFormValueSequence } from './sequences/updateCompleteFormValueSequence'; import { updateCourtIssuedDocketEntryFormValueSequence } from './sequences/updateCourtIssuedDocketEntryFormValueSequence'; -import { updateCreateCaseMessageAttachmentsSequence } from './sequences/updateCreateCaseMessageAttachmentsSequence'; import { updateCreateCaseMessageValueInModalSequence } from './sequences/updateCreateCaseMessageValueInModalSequence'; import { updateCreateOrderModalFormValueSequence } from './sequences/updateCreateOrderModalFormValueSequence'; import { updateDocketEntryFormValueSequence } from './sequences/updateDocketEntryFormValueSequence'; @@ -463,6 +467,7 @@ export const presenter = { closeModalAndReturnToDashboardSequence, closeModalAndReturnToDocumentQCSequence, closeModalAndReturnToTrialSessionsSequence, + completeCaseMessageSequence, completeDocketEntryQCAndSendMessageSequence, completeDocketEntryQCSequence, completeDocumentSelectSequence, @@ -494,6 +499,7 @@ export const presenter = { fetchPendingItemsSequence, fetchUserNotificationsSequence, formCancelToggleCancelSequence, + forwardCaseMessageSequence, generateCaseCaptionSequence, generatePdfFromScanSessionSequence, getBlockedCasesByTrialLocationSequence, @@ -644,6 +650,7 @@ export const presenter = { removeSecondarySupportingDocumentSequence, removeSignatureFromOrderSequence, removeSupportingDocumentSequence, + replyToCaseMessageSequence, rescanBatchSequence, resetCaseMenuSequence, resetHeaderAccordionsSequence, @@ -732,6 +739,7 @@ export const presenter = { toggleMenuSequence, toggleMobileDocketSortSequence, toggleMobileMenuSequence, + toggleShowAdditionalPetitionersSequence, toggleUsaBannerDetailsSequence, toggleWorkingCopySortSequence, unauthorizedErrorSequence, @@ -745,11 +753,11 @@ export const presenter = { updateBatchDownloadProgressSequence, updateCaseAssociationFormValueSequence, updateCaseDeadlineSequence, + updateCaseMessageModalAttachmentsSequence, updateCaseNoteSequence, updateCasePartyTypeSequence, updateCompleteFormValueSequence, updateCourtIssuedDocketEntryFormValueSequence, - updateCreateCaseMessageAttachmentsSequence, updateCreateCaseMessageValueInModalSequence, updateCreateOrderModalFormValueSequence, updateDocketEntryFormValueSequence, diff --git a/web-client/src/presenter/sequences/closeModalAndReturnToCaseDetailDraftDocumentsSequence.js b/web-client/src/presenter/sequences/closeModalAndReturnToCaseDetailDraftDocumentsSequence.js index e12245f4db2..43a32ead5d5 100644 --- a/web-client/src/presenter/sequences/closeModalAndReturnToCaseDetailDraftDocumentsSequence.js +++ b/web-client/src/presenter/sequences/closeModalAndReturnToCaseDetailDraftDocumentsSequence.js @@ -8,7 +8,7 @@ import { setIsPrimaryTabAction } from '../actions/setIsPrimaryTabAction'; export const closeModalAndReturnToCaseDetailDraftDocumentsSequence = [ clearModalAction, setCasePropFromStateAction, - setCaseDetailPageTabActionGenerator('inProgress'), + setCaseDetailPageTabActionGenerator('drafts'), setIsPrimaryTabAction, setCaseDetailPageTabFrozenAction, navigateToCaseDetailAction, diff --git a/web-client/src/presenter/sequences/completeCaseMessageSequence.js b/web-client/src/presenter/sequences/completeCaseMessageSequence.js new file mode 100644 index 00000000000..dc19092a9d8 --- /dev/null +++ b/web-client/src/presenter/sequences/completeCaseMessageSequence.js @@ -0,0 +1,26 @@ +import { clearAlertsAction } from '../actions/clearAlertsAction'; +import { clearModalAction } from '../actions/clearModalAction'; +import { clearModalStateAction } from '../actions/clearModalStateAction'; +import { clearScreenMetadataAction } from '../actions/clearScreenMetadataAction'; +import { clearUsersAction } from '../actions/clearUsersAction'; +import { completeCaseMessageAction } from '../actions/CaseDetail/completeCaseMessageAction'; +import { getMessageThreadAction } from '../actions/getMessageThreadAction'; +import { getMostRecentMessageInThreadAction } from '../actions/getMostRecentMessageInThreadAction'; +import { setAlertSuccessAction } from '../actions/setAlertSuccessAction'; +import { setMessageAction } from '../actions/setMessageAction'; +import { setSaveAlertsForNavigationAction } from '../actions/setSaveAlertsForNavigationAction'; +import { showProgressSequenceDecorator } from '../utilities/sequenceHelpers'; + +export const completeCaseMessageSequence = showProgressSequenceDecorator([ + clearAlertsAction, + getMostRecentMessageInThreadAction, + completeCaseMessageAction, + setAlertSuccessAction, + setSaveAlertsForNavigationAction, + clearScreenMetadataAction, + clearUsersAction, + clearModalAction, + clearModalStateAction, + getMessageThreadAction, + setMessageAction, +]); diff --git a/web-client/src/presenter/sequences/createCaseMessageSequence.js b/web-client/src/presenter/sequences/createCaseMessageSequence.js index 132b79ffefb..3b7f244d058 100644 --- a/web-client/src/presenter/sequences/createCaseMessageSequence.js +++ b/web-client/src/presenter/sequences/createCaseMessageSequence.js @@ -4,6 +4,7 @@ import { clearModalStateAction } from '../actions/clearModalStateAction'; import { clearScreenMetadataAction } from '../actions/clearScreenMetadataAction'; import { clearUsersAction } from '../actions/clearUsersAction'; import { createCaseMessageAction } from '../actions/CaseDetail/createCaseMessageAction'; +import { getCaseMessagesForCaseAction } from '../actions/CaseDetail/getCaseMessagesForCaseAction'; import { setAlertSuccessAction } from '../actions/setAlertSuccessAction'; import { setValidationErrorsAction } from '../actions/setValidationErrorsAction'; import { showProgressSequenceDecorator } from '../utilities/sequenceHelpers'; @@ -25,6 +26,7 @@ export const createCaseMessageSequence = [ clearUsersAction, clearModalAction, clearModalStateAction, + getCaseMessagesForCaseAction, ]), }, ]; diff --git a/web-client/src/presenter/sequences/forwardCaseMessageSequence.js b/web-client/src/presenter/sequences/forwardCaseMessageSequence.js new file mode 100644 index 00000000000..b839b4bbfda --- /dev/null +++ b/web-client/src/presenter/sequences/forwardCaseMessageSequence.js @@ -0,0 +1,36 @@ +import { clearAlertsAction } from '../actions/clearAlertsAction'; +import { clearModalAction } from '../actions/clearModalAction'; +import { clearModalStateAction } from '../actions/clearModalStateAction'; +import { clearScreenMetadataAction } from '../actions/clearScreenMetadataAction'; +import { clearUsersAction } from '../actions/clearUsersAction'; +import { forwardCaseMessageAction } from '../actions/CaseDetail/forwardCaseMessageAction'; +import { getMessageThreadAction } from '../actions/getMessageThreadAction'; +import { setAlertSuccessAction } from '../actions/setAlertSuccessAction'; +import { setMessageAction } from '../actions/setMessageAction'; +import { setSaveAlertsForNavigationAction } from '../actions/setSaveAlertsForNavigationAction'; +import { setValidationErrorsAction } from '../actions/setValidationErrorsAction'; +import { showProgressSequenceDecorator } from '../utilities/sequenceHelpers'; +import { startShowValidationAction } from '../actions/startShowValidationAction'; +import { stopShowValidationAction } from '../actions/stopShowValidationAction'; +import { validateCreateCaseMessageAction } from '../actions/validateCreateCaseMessageAction'; + +export const forwardCaseMessageSequence = showProgressSequenceDecorator([ + clearAlertsAction, + startShowValidationAction, + validateCreateCaseMessageAction, + { + error: [setValidationErrorsAction], + success: showProgressSequenceDecorator([ + forwardCaseMessageAction, + stopShowValidationAction, + setAlertSuccessAction, + setSaveAlertsForNavigationAction, + clearScreenMetadataAction, + clearUsersAction, + clearModalAction, + clearModalStateAction, + getMessageThreadAction, + setMessageAction, + ]), + }, +]); diff --git a/web-client/src/presenter/sequences/gotoCaseDetailSequence.js b/web-client/src/presenter/sequences/gotoCaseDetailSequence.js index 8b167756d27..b16772c5913 100644 --- a/web-client/src/presenter/sequences/gotoCaseDetailSequence.js +++ b/web-client/src/presenter/sequences/gotoCaseDetailSequence.js @@ -5,6 +5,7 @@ import { fetchUserNotificationsSequence } from './fetchUserNotificationsSequence import { getCaseAction } from '../actions/getCaseAction'; import { getCaseAssociationAction } from '../actions/getCaseAssociationAction'; import { getCaseDeadlinesForCaseAction } from '../actions/CaseDeadline/getCaseDeadlinesForCaseAction'; +import { getCaseMessagesForCaseAction } from '../actions/CaseDetail/getCaseMessagesForCaseAction'; import { getConsolidatedCasesByCaseAction } from '../actions/caseConsolidation/getConsolidatedCasesByCaseAction'; import { getConstants } from '../../getConstants'; import { getJudgesCaseNoteForCaseAction } from '../actions/TrialSession/getJudgesCaseNoteForCaseAction'; @@ -28,6 +29,7 @@ const { USER_ROLES } = getConstants(); const gotoCaseDetailInternal = [ showModalFromQueryAction, getCaseDeadlinesForCaseAction, + getCaseMessagesForCaseAction, setCurrentPageAction('CaseDetailInternal'), ]; diff --git a/web-client/src/presenter/sequences/gotoCaseMessagesSequence.js b/web-client/src/presenter/sequences/gotoCaseMessagesSequence.js index 6490d81fa2f..b55115c1c97 100644 --- a/web-client/src/presenter/sequences/gotoCaseMessagesSequence.js +++ b/web-client/src/presenter/sequences/gotoCaseMessagesSequence.js @@ -1,6 +1,8 @@ import { chooseMessageBoxAction } from '../actions/chooseMessageBoxAction'; import { clearErrorAlertsAction } from '../actions/clearErrorAlertsAction'; import { closeMobileMenuAction } from '../actions/closeMobileMenuAction'; +import { getCompletedCaseMessagesForSectionAction } from '../actions/getCompletedCaseMessagesForSectionAction'; +import { getCompletedCaseMessagesForUserAction } from '../actions/getCompletedCaseMessagesForUserAction'; import { getInboxCaseMessagesForSectionAction } from '../actions/getInboxCaseMessagesForSectionAction'; import { getInboxCaseMessagesForUserAction } from '../actions/getInboxCaseMessagesForUserAction'; import { getOutboxCaseMessagesForSectionAction } from '../actions/getOutboxCaseMessagesForSectionAction'; @@ -16,8 +18,10 @@ const goToCaseMessages = [ clearErrorAlertsAction, chooseMessageBoxAction, { + mycompleted: [getCompletedCaseMessagesForUserAction], myinbox: [getInboxCaseMessagesForUserAction], myoutbox: [getOutboxCaseMessagesForUserAction], + sectioncompleted: [getCompletedCaseMessagesForSectionAction], sectioninbox: [getInboxCaseMessagesForSectionAction], sectionoutbox: [getOutboxCaseMessagesForSectionAction], }, diff --git a/web-client/src/presenter/sequences/gotoMessageDetailSequence.js b/web-client/src/presenter/sequences/gotoMessageDetailSequence.js index 063bf29df0b..26e01d99346 100644 --- a/web-client/src/presenter/sequences/gotoMessageDetailSequence.js +++ b/web-client/src/presenter/sequences/gotoMessageDetailSequence.js @@ -2,12 +2,14 @@ import { clearErrorAlertsAction } from '../actions/clearErrorAlertsAction'; import { closeMobileMenuAction } from '../actions/closeMobileMenuAction'; import { getCaseAction } from '../actions/getCaseAction'; import { getDefaultAttachmentToDisplayAction } from '../actions/getDefaultAttachmentToDisplayAction'; -import { getMessageAction } from '../actions/getMessageAction'; +import { getMessageThreadAction } from '../actions/getMessageThreadAction'; +import { getMostRecentMessageInThreadAction } from '../actions/getMostRecentMessageInThreadAction'; import { isLoggedInAction } from '../actions/isLoggedInAction'; import { redirectToCognitoAction } from '../actions/redirectToCognitoAction'; import { setAttachmentDocumentToDisplayAction } from '../actions/setAttachmentDocumentToDisplayAction'; import { setCaseAction } from '../actions/setCaseAction'; import { setCurrentPageAction } from '../actions/setCurrentPageAction'; +import { setDefaultIsExpandedAction } from '../actions/setDefaultIsExpandedAction'; import { setMessageAction } from '../actions/setMessageAction'; import { showProgressSequenceDecorator } from '../utilities/sequenceHelpers'; @@ -17,10 +19,12 @@ const gotoMessageDetail = showProgressSequenceDecorator([ clearErrorAlertsAction, getCaseAction, setCaseAction, - getMessageAction, + getMessageThreadAction, setMessageAction, + getMostRecentMessageInThreadAction, getDefaultAttachmentToDisplayAction, setAttachmentDocumentToDisplayAction, + setDefaultIsExpandedAction, setCurrentPageAction('MessageDetail'), ]); diff --git a/web-client/src/presenter/sequences/openForwardMessageModalSequence.js b/web-client/src/presenter/sequences/openForwardMessageModalSequence.js index 7fc66575c1c..01cfc5e15d8 100644 --- a/web-client/src/presenter/sequences/openForwardMessageModalSequence.js +++ b/web-client/src/presenter/sequences/openForwardMessageModalSequence.js @@ -1,5 +1,11 @@ +import { clearModalStateAction } from '../actions/clearModalStateAction'; +import { getMostRecentMessageInThreadAction } from '../actions/getMostRecentMessageInThreadAction'; +import { setForwardMessageModalDialogModalStateAction } from '../actions/WorkItem/setForwardMessageModalDialogModalStateAction'; import { setShowModalFactoryAction } from '../actions/setShowModalFactoryAction'; export const openForwardMessageModalSequence = [ + clearModalStateAction, + getMostRecentMessageInThreadAction, + setForwardMessageModalDialogModalStateAction, setShowModalFactoryAction('ForwardMessageModal'), ]; diff --git a/web-client/src/presenter/sequences/openReplyToMessageModalSequence.js b/web-client/src/presenter/sequences/openReplyToMessageModalSequence.js index ce356062b38..8c36c47729e 100644 --- a/web-client/src/presenter/sequences/openReplyToMessageModalSequence.js +++ b/web-client/src/presenter/sequences/openReplyToMessageModalSequence.js @@ -1,5 +1,11 @@ +import { clearModalStateAction } from '../actions/clearModalStateAction'; +import { getMostRecentMessageInThreadAction } from '../actions/getMostRecentMessageInThreadAction'; +import { setReplyToMessageModalDialogModalStateAction } from '../actions/WorkItem/setReplyToMessageModalDialogModalStateAction'; import { setShowModalFactoryAction } from '../actions/setShowModalFactoryAction'; export const openReplyToMessageModalSequence = [ + clearModalStateAction, + getMostRecentMessageInThreadAction, + setReplyToMessageModalDialogModalStateAction, setShowModalFactoryAction('ReplyToMessageModal'), ]; diff --git a/web-client/src/presenter/sequences/replyToCaseMessageSequence.js b/web-client/src/presenter/sequences/replyToCaseMessageSequence.js new file mode 100644 index 00000000000..64e0ca9cd86 --- /dev/null +++ b/web-client/src/presenter/sequences/replyToCaseMessageSequence.js @@ -0,0 +1,36 @@ +import { clearAlertsAction } from '../actions/clearAlertsAction'; +import { clearModalAction } from '../actions/clearModalAction'; +import { clearModalStateAction } from '../actions/clearModalStateAction'; +import { clearScreenMetadataAction } from '../actions/clearScreenMetadataAction'; +import { clearUsersAction } from '../actions/clearUsersAction'; +import { getMessageThreadAction } from '../actions/getMessageThreadAction'; +import { replyToCaseMessageAction } from '../actions/CaseDetail/replyToCaseMessageAction'; +import { setAlertSuccessAction } from '../actions/setAlertSuccessAction'; +import { setMessageAction } from '../actions/setMessageAction'; +import { setSaveAlertsForNavigationAction } from '../actions/setSaveAlertsForNavigationAction'; +import { setValidationErrorsAction } from '../actions/setValidationErrorsAction'; +import { showProgressSequenceDecorator } from '../utilities/sequenceHelpers'; +import { startShowValidationAction } from '../actions/startShowValidationAction'; +import { stopShowValidationAction } from '../actions/stopShowValidationAction'; +import { validateCreateCaseMessageAction } from '../actions/validateCreateCaseMessageAction'; + +export const replyToCaseMessageSequence = showProgressSequenceDecorator([ + clearAlertsAction, + startShowValidationAction, + validateCreateCaseMessageAction, + { + error: [setValidationErrorsAction], + success: showProgressSequenceDecorator([ + replyToCaseMessageAction, + stopShowValidationAction, + setAlertSuccessAction, + setSaveAlertsForNavigationAction, + clearScreenMetadataAction, + clearUsersAction, + clearModalAction, + clearModalStateAction, + getMessageThreadAction, + setMessageAction, + ]), + }, +]); diff --git a/web-client/src/presenter/sequences/toggleShowAdditionalPetitionersSequence.js b/web-client/src/presenter/sequences/toggleShowAdditionalPetitionersSequence.js new file mode 100644 index 00000000000..00a5a411333 --- /dev/null +++ b/web-client/src/presenter/sequences/toggleShowAdditionalPetitionersSequence.js @@ -0,0 +1,5 @@ +import { toggleShowAdditionalPetitionersAction } from '../actions/CaseDetail/toggleShowAdditionalPetitionersAction'; + +export const toggleShowAdditionalPetitionersSequence = [ + toggleShowAdditionalPetitionersAction, +]; diff --git a/web-client/src/presenter/sequences/updateCaseMessageModalAttachmentsSequence.js b/web-client/src/presenter/sequences/updateCaseMessageModalAttachmentsSequence.js new file mode 100644 index 00000000000..54dc293851d --- /dev/null +++ b/web-client/src/presenter/sequences/updateCaseMessageModalAttachmentsSequence.js @@ -0,0 +1,5 @@ +import { updateCaseMessageModalAttachmentsAction } from '../actions/updateCaseMessageModalAttachmentsAction'; + +export const updateCaseMessageModalAttachmentsSequence = [ + updateCaseMessageModalAttachmentsAction, +]; diff --git a/web-client/src/presenter/sequences/updateCreateCaseMessageAttachmentsSequence.js b/web-client/src/presenter/sequences/updateCreateCaseMessageAttachmentsSequence.js deleted file mode 100644 index 6a6c7634400..00000000000 --- a/web-client/src/presenter/sequences/updateCreateCaseMessageAttachmentsSequence.js +++ /dev/null @@ -1,5 +0,0 @@ -import { updateCreateCaseMessageAttachmentsAction } from '../actions/updateCreateCaseMessageAttachmentsAction'; - -export const updateCreateCaseMessageAttachmentsSequence = [ - updateCreateCaseMessageAttachmentsAction, -]; diff --git a/web-client/src/presenter/state.js b/web-client/src/presenter/state.js index ad8bed76f76..f9421fe3d4d 100644 --- a/web-client/src/presenter/state.js +++ b/web-client/src/presenter/state.js @@ -16,13 +16,13 @@ import { caseDetailHelper } from './computeds/caseDetailHelper'; import { caseDetailSubnavHelper } from './computeds/caseDetailSubnavHelper'; import { caseInformationHelper } from './computeds/caseInformationHelper'; import { caseInventoryReportHelper } from './computeds/caseInventoryReportHelper'; +import { caseMessageModalHelper } from './computeds/caseMessageModalHelper'; import { caseSearchBoxHelper } from './computeds/caseSearchBoxHelper'; import { caseTypeDescriptionHelper } from './computeds/caseTypeDescriptionHelper'; import { completeDocumentTypeSectionHelper } from './computeds/completeDocumentTypeSectionHelper'; import { confirmInitiateServiceModalHelper } from './computeds/confirmInitiateServiceModalHelper'; import { contactEditHelper } from './computeds/contactEditHelper'; import { contactsHelper } from './computeds/contactsHelper'; -import { createCaseMessageModalHelper } from './computeds/createCaseMessageModalHelper'; import { createOrderHelper } from './computeds/createOrderHelper'; import { createPractitionerUserHelper } from './computeds/createPractitionerUserHelper'; import { dashboardExternalHelper } from './computeds/dashboardExternalHelper'; @@ -42,6 +42,7 @@ import { formattedClosedCases, formattedOpenCases, } from './computeds/formattedCaseDetail'; +import { formattedCaseMessages } from './computeds/formattedCaseMessages'; import { formattedDashboardTrialSessions } from './computeds/formattedDashboardTrialSessions'; import { formattedMessageDetail } from './computeds/formattedMessageDetail'; import { formattedMessages } from './computeds/formattedMessages'; @@ -101,13 +102,13 @@ const helpers = { caseDetailSubnavHelper, caseInformationHelper, caseInventoryReportHelper, + caseMessageModalHelper, caseSearchBoxHelper, caseTypeDescriptionHelper, completeDocumentTypeSectionHelper, confirmInitiateServiceModalHelper, contactEditHelper, contactsHelper, - createCaseMessageModalHelper, createOrderHelper, createPractitionerUserHelper, dashboardExternalHelper, @@ -123,6 +124,7 @@ const helpers = { fileDocumentHelper, fileUploadStatusHelper, formattedCaseDetail, + formattedCaseMessages, formattedClosedCases, formattedDashboardTrialSessions, formattedMessageDetail, @@ -187,10 +189,11 @@ export const baseState = { caseDetailInternalTabs: { caseInformation: false, correspondence: false, - deadlines: false, docketRecord: false, - inProgress: false, + drafts: false, + messages: false, notes: false, + trackedItems: false, }, }, documentDetail: { diff --git a/web-client/src/providers/socket.js b/web-client/src/providers/socket.js index 1a72cf09613..e98c8490ca2 100644 --- a/web-client/src/providers/socket.js +++ b/web-client/src/providers/socket.js @@ -1,7 +1,10 @@ const createWebSocketClient = token => { const notificationsUrl = process.env.WS_URL || 'ws://localhost:3011'; const connectionUrl = `${notificationsUrl}?token=${token}`; - const socket = new WebSocket(connectionUrl); + const socket = new WebSocket( + connectionUrl, + connectionUrl.indexOf('localhost') !== -1 ? 'echo-protocol' : undefined, + ); return socket; }; diff --git a/web-client/src/router.js b/web-client/src/router.js index 53c5237efbf..0c260c25832 100644 --- a/web-client/src/router.js +++ b/web-client/src/router.js @@ -992,11 +992,11 @@ const router = { registerRoute( '/case-messages/*/message-detail/*', - ifHasAccess((docketNumber, messageId) => { + ifHasAccess((docketNumber, parentMessageId) => { setPageTitle('Message detail'); return app.getSequence('gotoMessageDetailSequence')({ docketNumber, - messageId, + parentMessageId, }); }), ); diff --git a/web-client/src/styles/cards.scss b/web-client/src/styles/cards.scss index d12b0cd5b9d..d412867616e 100644 --- a/web-client/src/styles/cards.scss +++ b/web-client/src/styles/cards.scss @@ -147,7 +147,8 @@ } @media only screen and (max-width: $medium-screen) { - .counsel-information { + .counsel-information, + .other-petitioners-information { margin-bottom: 2rem; } diff --git a/web-client/src/styles/custom.scss b/web-client/src/styles/custom.scss index de4b4abf9fd..80504acbb76 100644 --- a/web-client/src/styles/custom.scss +++ b/web-client/src/styles/custom.scss @@ -1506,3 +1506,8 @@ button.change-scanner-button { .message-detail--attachments { height: 1000px; } + +.message-detail .usa-accordion__heading .accordion-item-title { + font-size: 16px; + font-weight: $font-regular; +} diff --git a/web-client/src/styles/icons.scss b/web-client/src/styles/icons.scss index 27138e3d064..169b814d25f 100644 --- a/web-client/src/styles/icons.scss +++ b/web-client/src/styles/icons.scss @@ -70,6 +70,10 @@ button:not(.ustc-button--unstyled) .fa-file-pdf { color: color($theme-color-primary); } +.fa-icon-black { + color: color($theme-color-base-darkest); +} + .fa-file-alt { display: inline-block; margin-right: 0.5em; diff --git a/web-client/src/styles/overrides.scss b/web-client/src/styles/overrides.scss index e6782ae648d..423c26d5d3b 100644 --- a/web-client/src/styles/overrides.scss +++ b/web-client/src/styles/overrides.scss @@ -313,6 +313,6 @@ input[type='file']::-webkit-file-upload-button { border-radius: 5px; } -.add-another-penalty-button .svg-inline--fa { +.modal-button-link .svg-inline--fa { margin-right: 0.5rem; } diff --git a/web-client/src/views/AdvancedSearch/CaseSearchByName.jsx b/web-client/src/views/AdvancedSearch/CaseSearchByName.jsx index 11abfc93b3c..4e7849a9617 100644 --- a/web-client/src/views/AdvancedSearch/CaseSearchByName.jsx +++ b/web-client/src/views/AdvancedSearch/CaseSearchByName.jsx @@ -14,6 +14,7 @@ export const CaseSearchByName = connect( updateAdvancedSearchFormValueSequence: sequences.updateAdvancedSearchFormValueSequence, usStates: state.constants.US_STATES, + usStatesOther: state.constants.US_STATES_OTHER, validateCaseAdvancedSearchFormSequence: sequences.validateCaseAdvancedSearchFormSequence, validationErrors: state.validationErrors, @@ -26,6 +27,7 @@ export const CaseSearchByName = connect( submitAdvancedSearchSequence, updateAdvancedSearchFormValueSequence, usStates, + usStatesOther, validateCaseAdvancedSearchFormSequence, validationErrors, }) { @@ -169,17 +171,13 @@ export const CaseSearchByName = connect( })} - - - - - - - - - - - + {usStatesOther.map(abbrev => { + return ( + + ); + })} diff --git a/web-client/src/views/CaseDetail/AddressDisplay.jsx b/web-client/src/views/CaseDetail/AddressDisplay.jsx new file mode 100644 index 00000000000..df94b1e5836 --- /dev/null +++ b/web-client/src/views/CaseDetail/AddressDisplay.jsx @@ -0,0 +1,46 @@ +import { connect } from '@cerebral/react'; +import { props, state } from 'cerebral'; +import React from 'react'; + +export const AddressDisplay = connect( + { + constants: state.constants, + contact: props.contact, + nameOverride: props.nameOverride || {}, + }, + function AddressDisplay({ constants, contact, nameOverride }) { + return ( + <> +

+ {nameOverride || contact.name}{' '} + {contact.barNumber && `(${contact.barNumber})`} + {contact.inCareOf && ( + +
+ c/o {contact.inCareOf} +
+ )} +

+

+ {contact.address1} + {contact.address2 && ( + {contact.address2} + )} + {contact.address3 && ( + {contact.address3} + )} + + {contact.city && `${contact.city}, `} + {contact.state} {contact.postalCode} + + {contact.countryType === constants.COUNTRY_TYPES.INTERNATIONAL && ( + {contact.country} + )} + {contact.phone && ( + {contact.phone} + )} +

+ + ); + }, +); diff --git a/web-client/src/views/CaseDetail/CaseDetailInternal.jsx b/web-client/src/views/CaseDetail/CaseDetailInternal.jsx index 5a055533b36..938fdf90040 100644 --- a/web-client/src/views/CaseDetail/CaseDetailInternal.jsx +++ b/web-client/src/views/CaseDetail/CaseDetailInternal.jsx @@ -3,13 +3,14 @@ import { CaseDetailHeader } from './CaseDetailHeader'; import { CaseDetailPendingReportList } from './CaseDetailPendingReportList'; import { CaseDetailSubnavTabs } from './CaseDetailSubnavTabs'; import { CaseInformationInternal } from './CaseInformationInternal'; +import { CaseMessagesCompleted } from './CaseMessagesCompleted'; +import { CaseMessagesInProgress } from './CaseMessagesInProgress'; import { CaseNotes } from './CaseNotes'; import { Correspondence } from '../Correspondence/Correspondence'; import { DocketRecord } from '../DocketRecord/DocketRecord'; import { DraftDocuments } from '../DraftDocuments/DraftDocuments'; import { EditPetitionDetails } from './EditPetitionDetails'; import { ErrorNotification } from '../ErrorNotification'; -import { MessagesInProgress } from './MessagesInProgress'; import { PaperServiceConfirmModal } from './PaperServiceConfirmModal'; import { PetitionerInformation } from './PetitionerInformation'; import { RespondentInformation } from './RespondentInformation'; @@ -53,35 +54,49 @@ export const CaseDetailInternal = connect( )} - {caseDetailInternalTabs.deadlines && ( + {caseDetailInternalTabs.trackedItems && ( + + + + + + + + + )} + {caseDetailInternalTabs.drafts && ( <>
-

Deadlines

+

Draft Documents

- + )} - {caseDetailInternalTabs.inProgress && ( + {caseDetailInternalTabs.messages && ( - - - - + - + )} diff --git a/web-client/src/views/CaseDetail/CaseDetailSubnavTabs.jsx b/web-client/src/views/CaseDetail/CaseDetailSubnavTabs.jsx index 27384f2414e..268acb729e2 100644 --- a/web-client/src/views/CaseDetail/CaseDetailSubnavTabs.jsx +++ b/web-client/src/views/CaseDetail/CaseDetailSubnavTabs.jsx @@ -31,16 +31,16 @@ export const CaseDetailSubnavTabs = connect( tabName="docketRecord" title="Docket Record" /> - {caseDetailSubnavHelper.showDeadlinesTab && ( - - )} - {caseDetailSubnavHelper.showInProgressTab && ( + {caseDetailSubnavHelper.showTrackedItemsTab && ( )} + {caseDetailSubnavHelper.showDraftsTab && ( + + )} {caseDetailSubnavHelper.showCorrespondenceTab && ( )} + {caseDetailSubnavHelper.showMessagesTab && ( + + )} {caseDetailSubnavHelper.showNotesTab && ( )} diff --git a/web-client/src/views/CaseDetail/CaseMessagesCompleted.jsx b/web-client/src/views/CaseDetail/CaseMessagesCompleted.jsx new file mode 100644 index 00000000000..5967c5999d7 --- /dev/null +++ b/web-client/src/views/CaseDetail/CaseMessagesCompleted.jsx @@ -0,0 +1,60 @@ +import { Button } from '../../ustc-ui/Button/Button'; +import { connect } from '@cerebral/react'; +import { state } from 'cerebral'; +import React from 'react'; + +export const CaseMessagesCompleted = connect( + { + formattedCompletedMessages: state.formattedCaseMessages.completedMessages, + }, + function CaseMessagesCompleted({ formattedCompletedMessages }) { + return ( + <> + {formattedCompletedMessages.length === 0 && ( +

There are no messages.

+ )} + {formattedCompletedMessages.length > 0 && ( + + + + + + + + + + + + + {formattedCompletedMessages.map((message, idx) => ( + + + + + + + + ))} + +
CompletedLast MessageCommentCompleted bySection
+ {message.completedAtFormatted} + +
+ +
+ +
+ {message.message} +
+
{message.completedMessage}{message.completedBy}{message.completedBySection}
+ )} + + ); + }, +); diff --git a/web-client/src/views/CaseDetail/CaseMessagesInProgress.jsx b/web-client/src/views/CaseDetail/CaseMessagesInProgress.jsx new file mode 100644 index 00000000000..f35d373cd87 --- /dev/null +++ b/web-client/src/views/CaseDetail/CaseMessagesInProgress.jsx @@ -0,0 +1,75 @@ +import { Button } from '../../ustc-ui/Button/Button'; +import { CaseMessagesRowAttachments } from '../Messages/CaseMessagesRowAttachments'; +import { connect } from '@cerebral/react'; +import { state } from 'cerebral'; +import React from 'react'; + +export const CaseMessagesInProgress = connect( + { + formattedInProgressMessages: state.formattedCaseMessages.inProgressMessages, + }, + function CaseMessagesInProgress({ formattedInProgressMessages }) { + return ( + <> + {formattedInProgressMessages.length === 0 && ( +

There are no messages.

+ )} + {formattedInProgressMessages.length > 0 && ( + + + + + + + + + + + + + {formattedInProgressMessages.map((message, idx) => ( + + + + + + + + ))} + +
ToFromReceivedMessage
+ {message.to} + {message.from} + + {message.createdAtFormatted} + + +
+ +
+ +
+ {message.message} +
+
+ {message.attachments.length === 0 && ( + No attachments + )} + {message.attachments.length > 0 && ( + + )} +
+ )} + + ); + }, +); diff --git a/web-client/src/views/CaseDetail/MessagesInProgress.jsx b/web-client/src/views/CaseDetail/MessagesInProgress.jsx index e24ec78833e..a6e4cb8ae0b 100644 --- a/web-client/src/views/CaseDetail/MessagesInProgress.jsx +++ b/web-client/src/views/CaseDetail/MessagesInProgress.jsx @@ -11,7 +11,7 @@ export const MessagesInProgress = connect( return ( <> {extractedPendingMessagesFromCaseDetail.length === 0 && ( -

There are no messages.

+

There are no messages.

)} {extractedPendingMessagesFromCaseDetail.length > 0 && ( diff --git a/web-client/src/views/CaseDetail/OtherPetitionerDisplay.jsx b/web-client/src/views/CaseDetail/OtherPetitionerDisplay.jsx new file mode 100644 index 00000000000..f224139b1d0 --- /dev/null +++ b/web-client/src/views/CaseDetail/OtherPetitionerDisplay.jsx @@ -0,0 +1,51 @@ +import { connect } from '@cerebral/react'; +import { props, state } from 'cerebral'; +import React from 'react'; + +const OtherPetitionerDisplay = connect( + { + constants: state.constants, + petitioner: props.petitioner, + }, + function OtherPetitionerDisplay({ constants, petitioner }) { + return ( + <> +

+ {petitioner.additionalName || petitioner.name}, {petitioner.title} + {petitioner.inCareOf && ( + +
+ c/o {petitioner.inCareOf} +
+ )} +

+

+ {petitioner.address1} + {petitioner.address2 && ( + {petitioner.address2} + )} + {petitioner.address3 && ( + {petitioner.address3} + )} + + {petitioner.city && `${petitioner.city}, `} + {petitioner.state} {petitioner.postalCode} + + {petitioner.countryType === constants.COUNTRY_TYPES.INTERNATIONAL && ( + {petitioner.country} + )} + {petitioner.phone && ( + + {petitioner.phone} + + )} + {petitioner.email && ( + {petitioner.email} + )} +

+ + ); + }, +); + +export { OtherPetitionerDisplay }; diff --git a/web-client/src/views/CaseDetail/PetitionerInformation.jsx b/web-client/src/views/CaseDetail/PetitionerInformation.jsx index eabb351157b..7304b4018a1 100644 --- a/web-client/src/views/CaseDetail/PetitionerInformation.jsx +++ b/web-client/src/views/CaseDetail/PetitionerInformation.jsx @@ -1,56 +1,21 @@ import { AddPrivatePractitionerModal } from './AddPrivatePractitionerModal'; +import { AddressDisplay } from './AddressDisplay'; import { Button } from '../../ustc-ui/Button/Button'; import { EditPrivatePractitionersModal } from './EditPrivatePractitionersModal'; import { EditSecondaryContactModal } from '../EditSecondaryContactModal'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FormGroup } from '../../ustc-ui/FormGroup/FormGroup'; +import { OtherPetitionerDisplay } from './OtherPetitionerDisplay'; import { PractitionerExistsModal } from './PractitionerExistsModal'; import { connect } from '@cerebral/react'; import { sequences, state } from 'cerebral'; import React from 'react'; import classNames from 'classnames'; -const AddressDisplay = (contact, constants, { nameOverride } = {}) => { - return ( - -

- {nameOverride || contact.name}{' '} - {contact.barNumber && `(${contact.barNumber})`} - {contact.inCareOf && ( - -
- c/o {contact.inCareOf} -
- )} -

-

- {contact.address1} - {contact.address2 && ( - {contact.address2} - )} - {contact.address3 && ( - {contact.address3} - )} - - {contact.city && `${contact.city}, `} - {contact.state} {contact.postalCode} - - {contact.countryType === constants.COUNTRY_TYPES.INTERNATIONAL && ( - {contact.country} - )} - {contact.phone && ( - {contact.phone} - )} -

-
- ); -}; - const PetitionerInformation = connect( { caseDetailHelper: state.caseDetailHelper, caseInformationHelper: state.caseInformationHelper, - constants: state.constants, form: state.form, formattedCaseDetail: state.formattedCaseDetail, openAddPrivatePractitionerModalSequence: @@ -58,18 +23,20 @@ const PetitionerInformation = connect( openEditPrivatePractitionersModalSequence: sequences.openEditPrivatePractitionersModalSequence, showModal: state.modal.showModal, + toggleShowAdditionalPetitionersSequence: + sequences.toggleShowAdditionalPetitionersSequence, updateFormValueSequence: sequences.updateFormValueSequence, validationErrors: state.validationErrors, }, function PetitionerInformation({ caseDetailHelper, caseInformationHelper, - constants, form, formattedCaseDetail, openAddPrivatePractitionerModalSequence, openEditPrivatePractitionersModalSequence, showModal, + toggleShowAdditionalPetitionersSequence, updateFormValueSequence, validationErrors, }) { @@ -113,15 +80,13 @@ const PetitionerInformation = connect(
- {AddressDisplay( - formattedCaseDetail.contactPrimary, - constants, - { - nameOverride: - formattedCaseDetail.showCaseTitleForPrimary && - formattedCaseDetail.caseTitle, - }, - )} +
{formattedCaseDetail.contactPrimary.serviceIndicator && (
@@ -159,12 +124,11 @@ const PetitionerInformation = connect(
- {formattedCaseDetail.contactSecondary.name && - AddressDisplay( - formattedCaseDetail.contactSecondary, - constants, - {}, - )} + {formattedCaseDetail.contactSecondary.name && ( + + )}
{formattedCaseDetail.contactSecondary.serviceIndicator && (
@@ -182,6 +146,67 @@ const PetitionerInformation = connect(
); + const otherPetitionersInformation = () => ( +
+
+
+
+
+

Other Petitioners

+
+
+
+ {caseInformationHelper.formattedOtherPetitioners.map( + (otherPetitioner, idx) => ( +
3 && 'margin-top-4', + )} + key={idx} + > +
+ {otherPetitioner.name && ( + + )} +
+ {otherPetitioner.serviceIndicator && ( +
+

+ Service preference +

+ {otherPetitioner.serviceIndicator} +
+ )} +
+ ), + )} +
+
+
+ +
+
+
+
+
+ ); + const practitionerPartyInformation = () => (
@@ -196,17 +221,15 @@ const PetitionerInformation = connect( key={index} >
- {practitioner.name && - AddressDisplay( - { + {practitioner.name && ( + + )}
{practitioner.serviceIndicator && (
@@ -329,6 +352,8 @@ const PetitionerInformation = connect(
)} + {caseInformationHelper.showOtherPetitioners && + otherPetitionersInformation()} {caseDetailHelper.showEditSecondaryContactModal && ( )} @@ -344,4 +369,4 @@ const PetitionerInformation = connect( }, ); -export { AddressDisplay, PetitionerInformation }; +export { PetitionerInformation }; diff --git a/web-client/src/views/CaseDetail/RespondentInformation.jsx b/web-client/src/views/CaseDetail/RespondentInformation.jsx index d4146fb09a3..6da1c7c368f 100644 --- a/web-client/src/views/CaseDetail/RespondentInformation.jsx +++ b/web-client/src/views/CaseDetail/RespondentInformation.jsx @@ -1,4 +1,5 @@ import { AddIrsPractitionerModal } from './AddIrsPractitionerModal'; +import { AddressDisplay } from './AddressDisplay'; import { Button } from '../../ustc-ui/Button/Button'; import { EditIrsPractitionersModal } from './EditIrsPractitionersModal'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; @@ -9,47 +10,10 @@ import { sequences, state } from 'cerebral'; import React from 'react'; import classNames from 'classnames'; -const AddressDisplay = (contact, constants, { nameOverride } = {}) => { - return ( - -

- {nameOverride || contact.name}{' '} - {contact.barNumber && `(${contact.barNumber})`} - {contact.inCareOf && ( - -
- c/o {contact.inCareOf} -
- )} -

-

- {contact.address1} - {contact.address2 && ( - {contact.address2} - )} - {contact.address3 && ( - {contact.address3} - )} - - {contact.city && `${contact.city}, `} - {contact.state} {contact.postalCode} - - {contact.countryType === constants.COUNTRY_TYPES.INTERNATIONAL && ( - {contact.country} - )} - {contact.phone && ( - {contact.phone} - )} -

-
- ); -}; - const RespondentInformation = connect( { caseDetailHelper: state.caseDetailHelper, caseInformationHelper: state.caseInformationHelper, - constants: state.constants, form: state.form, formattedCaseDetail: state.formattedCaseDetail, openAddIrsPractitionerModalSequence: @@ -63,7 +27,6 @@ const RespondentInformation = connect( function RespondentInformation({ caseDetailHelper, caseInformationHelper, - constants, form, formattedCaseDetail, openAddIrsPractitionerModalSequence, @@ -85,17 +48,15 @@ const RespondentInformation = connect( key={index} >
- {respondent.name && - AddressDisplay( - { + {respondent.name && ( + + )}
{respondent.serviceIndicator && (
@@ -209,4 +170,4 @@ const RespondentInformation = connect( }, ); -export { AddressDisplay, RespondentInformation }; +export { RespondentInformation }; diff --git a/web-client/src/views/CaseDetailEdit/ReviewSavedPetition.jsx b/web-client/src/views/CaseDetailEdit/ReviewSavedPetition.jsx index 46ea8801b90..1039fad1940 100644 --- a/web-client/src/views/CaseDetailEdit/ReviewSavedPetition.jsx +++ b/web-client/src/views/CaseDetailEdit/ReviewSavedPetition.jsx @@ -1,4 +1,4 @@ -import { AddressDisplay } from '../CaseDetail/PetitionerInformation'; +import { AddressDisplay } from '../CaseDetail/AddressDisplay'; import { Button } from '../../ustc-ui/Button/Button'; import { CaseDetailHeader } from '../CaseDetail/CaseDetailHeader'; import { ConfirmModal } from '../../ustc-ui/Modal/ConfirmModal'; @@ -98,11 +98,13 @@ export const ReviewSavedPetition = connect( {form.contactPrimary && (
- {AddressDisplay(form.contactPrimary, constants, { - nameOverride: +
)}
@@ -115,7 +117,7 @@ export const ReviewSavedPetition = connect( > Spouse’s information - {AddressDisplay(form.contactSecondary, constants)} + )}
diff --git a/web-client/src/views/EditUploadCourtIssuedDocument/EditUploadCourtIssuedDocument.jsx b/web-client/src/views/EditUploadCourtIssuedDocument/EditUploadCourtIssuedDocument.jsx index 1591618b2d2..a35f0818a2b 100644 --- a/web-client/src/views/EditUploadCourtIssuedDocument/EditUploadCourtIssuedDocument.jsx +++ b/web-client/src/views/EditUploadCourtIssuedDocument/EditUploadCourtIssuedDocument.jsx @@ -178,7 +178,7 @@ export const EditUploadCourtIssuedDocument = connect( + )} + + ); + }, +); diff --git a/web-client/src/views/Messages/CaseMessages.jsx b/web-client/src/views/Messages/CaseMessages.jsx index d782ad4aa61..703ca7314ed 100644 --- a/web-client/src/views/Messages/CaseMessages.jsx +++ b/web-client/src/views/Messages/CaseMessages.jsx @@ -1,6 +1,8 @@ import { Button } from '../../ustc-ui/Button/Button'; +import { CaseMessagesIndividualCompleted } from './CaseMessagesIndividualCompleted'; import { CaseMessagesIndividualInbox } from './CaseMessagesIndividualInbox'; import { CaseMessagesIndividualOutbox } from './CaseMessagesIndividualOutbox'; +import { CaseMessagesSectionCompleted } from './CaseMessagesSectionCompleted'; import { CaseMessagesSectionInbox } from './CaseMessagesSectionInbox'; import { CaseMessagesSectionOutbox } from './CaseMessagesSectionOutbox'; import { ErrorNotification } from '../ErrorNotification'; @@ -92,7 +94,14 @@ export const CaseMessages = connect(
-
+
+ {messagesHelper.showIndividualMessages && ( + + )} + {messagesHelper.showSectionMessages && ( + + )} +
diff --git a/web-client/src/views/Messages/CaseMessagesIndividualCompleted.jsx b/web-client/src/views/Messages/CaseMessagesIndividualCompleted.jsx new file mode 100644 index 00000000000..4e7da0d0453 --- /dev/null +++ b/web-client/src/views/Messages/CaseMessagesIndividualCompleted.jsx @@ -0,0 +1,64 @@ +import { Button } from '../../ustc-ui/Button/Button'; +import { CaseLink } from '../../ustc-ui/CaseLink/CaseLink'; +import { connect } from '@cerebral/react'; +import { state } from 'cerebral'; +import React from 'react'; + +export const CaseMessagesIndividualCompleted = connect( + { formattedMessages: state.formattedMessages }, + function CaseMessagesIndividualInbox({ formattedMessages }) { + return ( + <> +
+ + + + + + + + + + {formattedMessages.map((message, idx) => { + return ( + + + + + + + + + + ); + })} +
+ Docket Number + CompletedLast MessageCommentCase Title
+ + + + {message.completedAtFormatted} + + +
+ +
+
+ {message.message} +
+
+ {message.completedMessage} + {message.caseTitle}
+ {formattedMessages.length === 0 &&
There are no messages.
} + + ); + }, +); diff --git a/web-client/src/views/Messages/CaseMessagesIndividualInbox.jsx b/web-client/src/views/Messages/CaseMessagesIndividualInbox.jsx index cea365758b1..daa30e9de1e 100644 --- a/web-client/src/views/Messages/CaseMessagesIndividualInbox.jsx +++ b/web-client/src/views/Messages/CaseMessagesIndividualInbox.jsx @@ -43,7 +43,7 @@ export const CaseMessagesIndividualInbox = connect( diff --git a/web-client/src/views/Messages/CaseMessagesIndividualOutbox.jsx b/web-client/src/views/Messages/CaseMessagesIndividualOutbox.jsx index 198a2367133..b6c96f5fda7 100644 --- a/web-client/src/views/Messages/CaseMessagesIndividualOutbox.jsx +++ b/web-client/src/views/Messages/CaseMessagesIndividualOutbox.jsx @@ -43,7 +43,7 @@ export const CaseMessagesIndividualOutbox = connect( diff --git a/web-client/src/views/Messages/CaseMessagesSectionCompleted.jsx b/web-client/src/views/Messages/CaseMessagesSectionCompleted.jsx new file mode 100644 index 00000000000..91034ec2e36 --- /dev/null +++ b/web-client/src/views/Messages/CaseMessagesSectionCompleted.jsx @@ -0,0 +1,69 @@ +import { Button } from '../../ustc-ui/Button/Button'; +import { CaseLink } from '../../ustc-ui/CaseLink/CaseLink'; +import { connect } from '@cerebral/react'; +import { state } from 'cerebral'; +import React from 'react'; + +export const CaseMessagesSectionCompleted = connect( + { formattedMessages: state.formattedMessages }, + function CaseMessagesSectionCompleted({ formattedMessages }) { + return ( + <> + + + + + + + + + + + + {formattedMessages.map((message, idx) => { + return ( + + + + + + + + + + + ); + })} +
+ Docket Number + CompletedLast MessageCommentCompleted bySection
+ + + + {message.completedAtFormatted} + + +
+ +
+ +
+ {message.message} +
+
+ {message.completedMessage} + {message.completedBy} + {message.completedBySection} +
+ {formattedMessages.length === 0 &&
There are no messages.
} + + ); + }, +); diff --git a/web-client/src/views/Messages/CaseMessagesSectionInbox.jsx b/web-client/src/views/Messages/CaseMessagesSectionInbox.jsx index 0999b45d820..b31a7c88f61 100644 --- a/web-client/src/views/Messages/CaseMessagesSectionInbox.jsx +++ b/web-client/src/views/Messages/CaseMessagesSectionInbox.jsx @@ -42,7 +42,7 @@ export const CaseMessagesSectionInbox = connect( diff --git a/web-client/src/views/Messages/CaseMessagesSectionOutbox.jsx b/web-client/src/views/Messages/CaseMessagesSectionOutbox.jsx index 98e081bb244..45acc64c32b 100644 --- a/web-client/src/views/Messages/CaseMessagesSectionOutbox.jsx +++ b/web-client/src/views/Messages/CaseMessagesSectionOutbox.jsx @@ -42,7 +42,7 @@ export const CaseMessagesSectionOutbox = connect( diff --git a/web-client/src/views/Messages/CompleteCaseMessageModalDialog.jsx b/web-client/src/views/Messages/CompleteCaseMessageModalDialog.jsx index 30a4672c6c5..73ab5373a4d 100644 --- a/web-client/src/views/Messages/CompleteCaseMessageModalDialog.jsx +++ b/web-client/src/views/Messages/CompleteCaseMessageModalDialog.jsx @@ -1,10 +1,12 @@ import { ConfirmModal } from '../../ustc-ui/Modal/ConfirmModal'; +import { FormGroup } from '../../ustc-ui/FormGroup/FormGroup'; import { connect } from '@cerebral/react'; +import { sequences } from 'cerebral'; import React from 'react'; export const CompleteCaseMessageModalDialog = connect( - {}, - function CompleteCaseMessageModalDialog() { + { updateModalValueSequence: sequences.updateModalValueSequence }, + function CompleteCaseMessageModalDialog({ updateModalValueSequence }) { return ( {}} - > + onConfirmSequence="completeCaseMessageSequence" + > + + +