diff --git a/.github/workflows/trigger-e2e-environment.yml b/.github/workflows/trigger-e2e-environment.yml index b8916db97..54c484d40 100644 --- a/.github/workflows/trigger-e2e-environment.yml +++ b/.github/workflows/trigger-e2e-environment.yml @@ -136,6 +136,11 @@ jobs: // Check if deploy job has completed while (!deployJobCompleted) { + const workflowRun = await github.rest.actions.getWorkflowRun({ + owner, + repo, + run_id: runId + }); const jobs = await github.rest.actions.listJobsForWorkflowRun({ owner, repo, @@ -143,6 +148,12 @@ jobs: }); const deployJob = jobs.data.jobs.find(job => job.name === 'deploy / seed-data / seed-data'); + const cancelled = jobs.data.jobs.find(job => job.conclusion === 'cancelled'); + + if (cancelled) { + throw new Error('E2E workflow was cancelled'); + } + if (deployJob && deployJob.status === 'completed') { deployJobCompleted = true; @@ -153,6 +164,14 @@ jobs: console.log('Deploy job completed successfully'); } + if(workflowRun.data.status === 'completed') { + deployJobCompleted = true; + + if (workflowRun.data.conclusion !== 'success') { + throw new Error('E2E workflow failed'); + } + } + if (!deployJobCompleted) { await new Promise(resolve => setTimeout(resolve, 10000)); } diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 000000000..feff123a7 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "apollographql.vscode-apollo" + ] +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index d750bbc00..91d59a129 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ ### Improvements - Auth token, ip address, remote address, mobile number, email redacted/masked from server log +- Country alpha3 ISO code now is derived from variables to the Docker Compose files and don't need to be hard coded ### Infrastructure breaking changes @@ -39,6 +40,10 @@ INSERT CSV ROWS IN ENGLISH ONLY ### Breaking changes +- **Notification Flags** The configuration of various notifications is now controlled from `countryconfig` instead of being handled in the UI, as notification settings are not something that should be changed on the fly. To simplify this process, we have moved the settings to the `application-config.ts` file. From now on, the notifications can be managed in the `notificationForRecord` object defined in the mentioned file. Any changes will take effect after a new deployment. + + **_Country implementors must define the `notificationForRecord` object in the `application-config.ts` file to enable the notifications they want. Not doing so will keep notifications disabled by default._** + - **Gateways searchEvents API updated** `operationHistories` only returns `operationType` & `operatedOn` due to the other fields being unused in OpenCRVS - **Config changes to review/preview and signatures** Core used to provide review/preview section by default which are now removed and need to be provided from countryconfig. The signature field definitions (e.g. informant signature, bride signature etc.) were hard coded in core which also have now been removed. The signatures can now be added through the review/preview sections defined in countryconfig just like any other field. You can use the following section definition as the default which is without any additional fields. We highly recommend checking out our reference country repository which has the signature fields in it's review/preview sections @@ -87,12 +92,20 @@ INSERT CSV ROWS IN ENGLISH ONLY - If there is only one option in the document uploader select, then it stays hidden and only the upload button is showed with the only option being selected by default - The select options in DOCUMENT_UPLOADER_WITH_OPTION field can now be hidden using the new `optionCondition` property. It works similarly to the same property available in SELECT_WITH_OPTIONS field -* **ElasticSearch reindexing** - -Allows reindexing ElasticSearch via a new search-service endpoint `reindex`. We're replacing the original `ocrvs` index with timestamped ones. This is done automatically when upgrading and migrating, but this is an important architectural change that should be noted. More details in [#7033](https://github.com/opencrvs/opencrvs-core/pull/7033). +* **ElasticSearch reindexing** Allows reindexing ElasticSearch via a new search-service endpoint `reindex`. We're replacing the original `ocrvs` index with timestamped ones. This is done automatically when upgrading and migrating, but this is an important architectural change that should be noted. More details in [#7033](https://github.com/opencrvs/opencrvs-core/pull/7033). - Introduce a new certificate handlebar "preview" which can be used to conditionally render some svg element when previewing the certificate e.g. background image similar to security paper +- **Notification flags**: Added notification flags for `BIRTH`, `DEATH`, and `MARRIAGE` events, including: + + - `sent-notification` + - `sent-notification-for-review` + - `sent-for-approval` + - `registered` + - `sent-for-updates` + +- **`/record-notification` API**: Endpoint to check enabled notifications for records. The API returns the `notificationForRecord` object for `BIRTH` and `DEATH` events, listing their respective flags. Route configuration includes description and tags for API documentation. + ### New content keys requiring translation ``` diff --git a/apollo.config.json b/apollo.config.json new file mode 100644 index 000000000..959a3b4a3 --- /dev/null +++ b/apollo.config.json @@ -0,0 +1,8 @@ +{ + "client": { + "service": { + "name": "@opencrvs/gateway", + "url": "http://localhost:7070/graphql" + } + } +} \ No newline at end of file diff --git a/codegen.yml b/codegen.yml deleted file mode 100644 index f111cf228..000000000 --- a/codegen.yml +++ /dev/null @@ -1,19 +0,0 @@ -overwrite: true -schema: - - http://localhost:7070/graphql: - headers: - Authorization: 'Bearer ${TOKEN}' -documents: - - 'src/**/*.ts' - - '!src/data-generator/gateway.ts' -generates: - src/data-generator/gateway.ts: - plugins: - - add: - content: '/* DO NOT EDIT! This file is auto-generated by yarn data-generator:generate-types - see `codegen.yml` */' - - 'typescript' - - 'typescript-operations' - - ./graphql.schema.json: - plugins: - - 'introspection' diff --git a/e2e/testcases/applications/17-validate-user-can-correct-a-record-from-audit-record-page.spec.ts b/e2e/testcases/applications/17-validate-user-can-correct-a-record-from-audit-record-page.spec.ts index ccda9c4e0..414c06ec4 100644 --- a/e2e/testcases/applications/17-validate-user-can-correct-a-record-from-audit-record-page.spec.ts +++ b/e2e/testcases/applications/17-validate-user-can-correct-a-record-from-audit-record-page.spec.ts @@ -44,9 +44,8 @@ test.describe }) expect(res).toStrictEqual({ trackingId: expect.any(String), - compositionId: expect.any(String), - isPotentiallyDuplicate: false, - __typename: 'CreatedIds' + recordId: expect.any(String), + isPotentiallyDuplicate: false }) }) diff --git a/e2e/testcases/birth/1-birth-event-declaration.spec.ts b/e2e/testcases/birth/1-birth-event-declaration.spec.ts index f87ca9cbb..353ac0104 100644 --- a/e2e/testcases/birth/1-birth-event-declaration.spec.ts +++ b/e2e/testcases/birth/1-birth-event-declaration.spec.ts @@ -574,9 +574,8 @@ test.describe('1. Birth event declaration', () => { }) expect(res).toStrictEqual({ trackingId: expect.any(String), - compositionId: expect.any(String), - isPotentiallyDuplicate: false, - __typename: 'CreatedIds' + recordId: expect.any(String), + isPotentiallyDuplicate: false }) }) }) diff --git a/e2e/testcases/birth/8-validate-declaration-review-page.spec.ts b/e2e/testcases/birth/8-validate-declaration-review-page.spec.ts index 0986bc61a..1d445666c 100644 --- a/e2e/testcases/birth/8-validate-declaration-review-page.spec.ts +++ b/e2e/testcases/birth/8-validate-declaration-review-page.spec.ts @@ -1398,8 +1398,8 @@ test.describe.serial('8. Validate declaration review page', () => { */ expect(page.url().includes('registration-home')).toBeTruthy() - await page.getByRole('button', { name: 'Ready to print' }).click() await expectOutboxToBeEmpty(page) + await page.getByRole('button', { name: 'Ready to print' }).click() /* * Expected result: The declaration should be in Ready to print @@ -1425,3 +1425,5 @@ test.describe.serial('8. Validate declaration review page', () => { }) }) }) + +function refreshQueuesUntil() {} diff --git a/e2e/testcases/birth/helpers.ts b/e2e/testcases/birth/helpers.ts index d3a38e290..23a4bd547 100644 --- a/e2e/testcases/birth/helpers.ts +++ b/e2e/testcases/birth/helpers.ts @@ -13,6 +13,8 @@ import { } from './queries' import { random } from 'lodash' import { generateRandomSuffix } from '../../helpers' +import gql from 'graphql-tag' +import { print } from 'graphql/language/printer' export type BirthDetails = { informant: { @@ -64,9 +66,68 @@ function getLocationIdByName(locations: fhir.Location[], name: string) { } return location.id } + +const FETCH_RECORD_STATUS = gql` + query fetchRecordStatus($draftId: ID!) { + fetchRecordStatus(draftId: $draftId) { + __typename + ... on RecordProcessing { + processed + } + ... on RecordProcessed { + processed + trackingId + hasPotentialDuplicates + recordId + } + } + } +` + +export async function waitUntilRecordDetails( + token: string, + draftId: string, + maxTries = 10 +) { + let nthTry = 0 + + // eslint-disable-next-line no-constant-condition + while (true) { + const response = await fetch(`${GATEWAY_HOST}/graphql`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${token}` + }, + body: JSON.stringify({ + query: print(FETCH_RECORD_STATUS), + variables: { + draftId: draftId + } + }) + }).then((res) => res.json()) + + const result = response.data + if (result.fetchRecordStatus.__typename === 'RecordProcessed') { + return { + recordId: result.fetchRecordStatus.recordId, + trackingId: result.fetchRecordStatus.trackingId, + isPotentiallyDuplicate: result.fetchRecordStatus.hasPotentialDuplicates + } + } + + await new Promise((resolve) => setTimeout(resolve, 1000 + nthTry * 1000)) + if (nthTry >= maxTries) { + throw new Error('Max tries exceeded') + } + nthTry++ + } +} + export async function createDeclaration(token: string, details: BirthDetails) { const locations = await getAllLocations('ADMIN_STRUCTURE') const facilities = await getAllLocations('HEALTH_FACILITY') + const draftId = uuid.v4() const res = await fetch(`${GATEWAY_HOST}/graphql`, { method: 'POST', @@ -94,7 +155,7 @@ export async function createDeclaration(token: string, details: BirthDetails) { informantType: details.informant.type, contactPhoneNumber: '0' + faker.random.numeric(9), contactEmail: faker.internet.email(), - draftId: uuid.v4() + draftId }, child: { name: [ @@ -320,7 +381,7 @@ export async function createDeclaration(token: string, details: BirthDetails) { } }) }) - return res.json().then((r) => r.data.createBirthRegistration) + return res.json().then(() => waitUntilRecordDetails(token, draftId)) } export const fetchDeclaration = async ( diff --git a/e2e/testcases/birth/queries.ts b/e2e/testcases/birth/queries.ts index ec7c183bb..65afe46b2 100644 --- a/e2e/testcases/birth/queries.ts +++ b/e2e/testcases/birth/queries.ts @@ -3,12 +3,7 @@ import { print } from 'graphql/language/printer' export const CREATE_BIRTH_REGISTRATION = print(gql` mutation createBirthRegistration($details: BirthRegistrationInput!) { - createBirthRegistration(details: $details) { - trackingId - compositionId - isPotentiallyDuplicate - __typename - } + createBirthRegistration(details: $details) } `) diff --git a/e2e/testcases/correction-birth/correct-birth-record-1.spec.ts b/e2e/testcases/correction-birth/correct-birth-record-1.spec.ts index 7c1e682a8..890b21d1d 100644 --- a/e2e/testcases/correction-birth/correct-birth-record-1.spec.ts +++ b/e2e/testcases/correction-birth/correct-birth-record-1.spec.ts @@ -68,16 +68,15 @@ test.describe('1. Correct record - 1', () => { const res = await createDeclaration(token, declarationInput) expect(res).toStrictEqual({ trackingId: expect.any(String), - compositionId: expect.any(String), - isPotentiallyDuplicate: false, - __typename: 'CreatedIds' + recordId: expect.any(String), + isPotentiallyDuplicate: false }) trackingId = res.trackingId token = await getToken('f.katongo', 'test') - declaration = (await fetchDeclaration(token, res.compositionId)).data + declaration = (await fetchDeclaration(token, res.recordId)).data .fetchBirthRegistration as BirthDeclaration }) diff --git a/e2e/testcases/correction-birth/correct-birth-record-2.spec.ts b/e2e/testcases/correction-birth/correct-birth-record-2.spec.ts index 286b6165b..d4290c93d 100644 --- a/e2e/testcases/correction-birth/correct-birth-record-2.spec.ts +++ b/e2e/testcases/correction-birth/correct-birth-record-2.spec.ts @@ -97,16 +97,15 @@ test.describe.serial('Correct record - 2', () => { const res = await createDeclaration(token, declarationInput) expect(res).toStrictEqual({ trackingId: expect.any(String), - compositionId: expect.any(String), - isPotentiallyDuplicate: false, - __typename: 'CreatedIds' + recordId: expect.any(String), + isPotentiallyDuplicate: false }) trackingId = res.trackingId token = await getToken('f.katongo', 'test') - declaration = (await fetchDeclaration(token, res.compositionId)).data + declaration = (await fetchDeclaration(token, res.recordId)).data .fetchBirthRegistration as BirthDeclaration }) @@ -942,7 +941,7 @@ test.describe.serial('Correct record - 2', () => { ) ).toBeVisible() - /* + /* @ToDo: assert this after https://github.com/opencrvs/opencrvs-core/issues/7505 is solved await expect( page.getByText( diff --git a/e2e/testcases/correction-birth/correct-birth-record-3.spec.ts b/e2e/testcases/correction-birth/correct-birth-record-3.spec.ts index 2e80bc2cf..b524abe41 100644 --- a/e2e/testcases/correction-birth/correct-birth-record-3.spec.ts +++ b/e2e/testcases/correction-birth/correct-birth-record-3.spec.ts @@ -94,16 +94,15 @@ test.describe.serial(' Correct record - 3', () => { const res = await createDeclaration(token, declarationInput) expect(res).toStrictEqual({ trackingId: expect.any(String), - compositionId: expect.any(String), - isPotentiallyDuplicate: false, - __typename: 'CreatedIds' + recordId: expect.any(String), + isPotentiallyDuplicate: false }) trackingId = res.trackingId token = await getToken('f.katongo', 'test') - declaration = (await fetchDeclaration(token, res.compositionId)).data + declaration = (await fetchDeclaration(token, res.recordId)).data .fetchBirthRegistration as BirthDeclaration }) @@ -919,7 +918,7 @@ test.describe.serial(' Correct record - 3', () => { page.getByText('Comments' + declaration.registration.registrationNumber) ).toBeVisible() - /* + /* @ToDo: assert this after https://github.com/opencrvs/opencrvs-core/issues/7505 is solved await expect( page.getByText( diff --git a/e2e/testcases/correction-birth/correct-birth-record-4.spec.ts b/e2e/testcases/correction-birth/correct-birth-record-4.spec.ts index 57b6dc448..b0a5593c6 100644 --- a/e2e/testcases/correction-birth/correct-birth-record-4.spec.ts +++ b/e2e/testcases/correction-birth/correct-birth-record-4.spec.ts @@ -97,16 +97,15 @@ test.describe.serial(' Correct record - 4', () => { const res = await createDeclaration(token, declarationInput) expect(res).toStrictEqual({ trackingId: expect.any(String), - compositionId: expect.any(String), - isPotentiallyDuplicate: false, - __typename: 'CreatedIds' + recordId: expect.any(String), + isPotentiallyDuplicate: false }) trackingId = res.trackingId token = await getToken('k.mweene', 'test') - declaration = (await fetchDeclaration(token, res.compositionId)).data + declaration = (await fetchDeclaration(token, res.recordId)).data .fetchBirthRegistration as BirthDeclaration }) diff --git a/e2e/testcases/correction-birth/correct-birth-record-5.spec.ts b/e2e/testcases/correction-birth/correct-birth-record-5.spec.ts index 107753760..7c8dcebe0 100644 --- a/e2e/testcases/correction-birth/correct-birth-record-5.spec.ts +++ b/e2e/testcases/correction-birth/correct-birth-record-5.spec.ts @@ -91,15 +91,14 @@ test.describe.serial(' Correct record - 5', () => { const res = await createDeclaration(token, declarationInput) expect(res).toStrictEqual({ trackingId: expect.any(String), - compositionId: expect.any(String), - isPotentiallyDuplicate: false, - __typename: 'CreatedIds' + recordId: expect.any(String), + isPotentiallyDuplicate: false }) trackingId = res.trackingId token = await getToken('k.mweene', 'test') - declaration = (await fetchDeclaration(token, res.compositionId)).data + declaration = (await fetchDeclaration(token, res.recordId)).data .fetchBirthRegistration as BirthDeclaration }) diff --git a/e2e/testcases/correction-birth/correct-birth-record-6.spec.ts b/e2e/testcases/correction-birth/correct-birth-record-6.spec.ts index d324be305..6cbe59d30 100644 --- a/e2e/testcases/correction-birth/correct-birth-record-6.spec.ts +++ b/e2e/testcases/correction-birth/correct-birth-record-6.spec.ts @@ -82,15 +82,14 @@ test.describe.serial(' Correct record - 6', () => { const res = await createDeclaration(token, declarationInput) expect(res).toStrictEqual({ trackingId: expect.any(String), - compositionId: expect.any(String), - isPotentiallyDuplicate: false, - __typename: 'CreatedIds' + recordId: expect.any(String), + isPotentiallyDuplicate: false }) trackingId = res.trackingId token = await getToken('k.mweene', 'test') - declaration = (await fetchDeclaration(token, res.compositionId)).data + declaration = (await fetchDeclaration(token, res.recordId)).data .fetchBirthRegistration as BirthDeclaration }) diff --git a/e2e/testcases/correction-birth/correct-birth-record-7.spec.ts b/e2e/testcases/correction-birth/correct-birth-record-7.spec.ts index 33f3da87b..0b0a1b446 100644 --- a/e2e/testcases/correction-birth/correct-birth-record-7.spec.ts +++ b/e2e/testcases/correction-birth/correct-birth-record-7.spec.ts @@ -83,16 +83,15 @@ test.describe.serial(' Correct record - 7', () => { const res = await createDeclaration(token, declarationInput) expect(res).toStrictEqual({ trackingId: expect.any(String), - compositionId: expect.any(String), - isPotentiallyDuplicate: false, - __typename: 'CreatedIds' + recordId: expect.any(String), + isPotentiallyDuplicate: false }) trackingId = res.trackingId token = await getToken('j.musonda', 'test') - declaration = (await fetchDeclaration(token, res.compositionId)).data + declaration = (await fetchDeclaration(token, res.recordId)).data .fetchBirthRegistration as BirthDeclaration }) diff --git a/e2e/testcases/correction-birth/correct-birth-record-8.spec.ts b/e2e/testcases/correction-birth/correct-birth-record-8.spec.ts index dee0601cc..54945523a 100644 --- a/e2e/testcases/correction-birth/correct-birth-record-8.spec.ts +++ b/e2e/testcases/correction-birth/correct-birth-record-8.spec.ts @@ -84,15 +84,14 @@ test.describe.serial(' Correct record - 8', () => { const res = await createDeclaration(token, declarationInput) expect(res).toStrictEqual({ trackingId: expect.any(String), - compositionId: expect.any(String), - isPotentiallyDuplicate: false, - __typename: 'CreatedIds' + recordId: expect.any(String), + isPotentiallyDuplicate: false }) trackingId = res.trackingId token = await getToken('j.musonda', 'test') - declaration = (await fetchDeclaration(token, res.compositionId)).data + declaration = (await fetchDeclaration(token, res.recordId)).data .fetchBirthRegistration as BirthDeclaration }) diff --git a/e2e/testcases/correction-birth/correct-birth-record-9.spec.ts b/e2e/testcases/correction-birth/correct-birth-record-9.spec.ts index 35a5fa7f0..a781fe37a 100644 --- a/e2e/testcases/correction-birth/correct-birth-record-9.spec.ts +++ b/e2e/testcases/correction-birth/correct-birth-record-9.spec.ts @@ -82,15 +82,14 @@ test.describe.serial(' Correct record - 9', () => { const res = await createDeclaration(token, declarationInput) expect(res).toStrictEqual({ trackingId: expect.any(String), - compositionId: expect.any(String), - isPotentiallyDuplicate: false, - __typename: 'CreatedIds' + recordId: expect.any(String), + isPotentiallyDuplicate: false }) trackingId = res.trackingId token = await getToken('j.musonda', 'test') - declaration = (await fetchDeclaration(token, res.compositionId)).data + declaration = (await fetchDeclaration(token, res.recordId)).data .fetchBirthRegistration as BirthDeclaration }) diff --git a/e2e/testcases/correction-death/correct-death-record-10.spec.ts b/e2e/testcases/correction-death/correct-death-record-10.spec.ts index 668708b78..88651f3d5 100644 --- a/e2e/testcases/correction-death/correct-death-record-10.spec.ts +++ b/e2e/testcases/correction-death/correct-death-record-10.spec.ts @@ -51,16 +51,15 @@ test.describe('10. Correct record - 10', () => { const res = await createDeathDeclaration(token) expect(res).toStrictEqual({ trackingId: expect.any(String), - compositionId: expect.any(String), - isPotentiallyDuplicate: false, - __typename: 'CreatedIds' + recordId: expect.any(String), + isPotentiallyDuplicate: false }) trackingId = res.trackingId token = await getToken('f.katongo', 'test') - declaration = (await fetchDeclaration(token, res.compositionId)).data + declaration = (await fetchDeclaration(token, res.recordId)).data .fetchDeathRegistration as DeathDeclaration }) diff --git a/e2e/testcases/correction-death/correct-death-record-11.spec.ts b/e2e/testcases/correction-death/correct-death-record-11.spec.ts index 9590c131d..86cfe82a8 100644 --- a/e2e/testcases/correction-death/correct-death-record-11.spec.ts +++ b/e2e/testcases/correction-death/correct-death-record-11.spec.ts @@ -52,16 +52,15 @@ test.describe.serial(' Correct record - 11', () => { }) expect(res).toStrictEqual({ trackingId: expect.any(String), - compositionId: expect.any(String), - isPotentiallyDuplicate: false, - __typename: 'CreatedIds' + recordId: expect.any(String), + isPotentiallyDuplicate: false }) trackingId = res.trackingId token = await getToken('f.katongo', 'test') - declaration = (await fetchDeclaration(token, res.compositionId)).data + declaration = (await fetchDeclaration(token, res.recordId)).data .fetchDeathRegistration as DeathDeclaration }) diff --git a/e2e/testcases/correction-death/correct-death-record-12.spec.ts b/e2e/testcases/correction-death/correct-death-record-12.spec.ts index 261f5f5c7..98824142b 100644 --- a/e2e/testcases/correction-death/correct-death-record-12.spec.ts +++ b/e2e/testcases/correction-death/correct-death-record-12.spec.ts @@ -89,16 +89,15 @@ test.describe.serial(' Correct record - 12', () => { const res = await createDeathDeclaration(token, declarationInput) expect(res).toStrictEqual({ trackingId: expect.any(String), - compositionId: expect.any(String), - isPotentiallyDuplicate: false, - __typename: 'CreatedIds' + recordId: expect.any(String), + isPotentiallyDuplicate: false }) trackingId = res.trackingId token = await getToken('f.katongo', 'test') - declaration = (await fetchDeclaration(token, res.compositionId)).data + declaration = (await fetchDeclaration(token, res.recordId)).data .fetchDeathRegistration as DeathDeclaration }) diff --git a/e2e/testcases/correction-death/correct-death-record-13.spec.ts b/e2e/testcases/correction-death/correct-death-record-13.spec.ts index 7db3976dc..d306c6edb 100644 --- a/e2e/testcases/correction-death/correct-death-record-13.spec.ts +++ b/e2e/testcases/correction-death/correct-death-record-13.spec.ts @@ -77,16 +77,15 @@ test.describe.serial(' Correct record - 13', () => { const res = await createDeathDeclaration(token, declarationInput) expect(res).toStrictEqual({ trackingId: expect.any(String), - compositionId: expect.any(String), - isPotentiallyDuplicate: false, - __typename: 'CreatedIds' + recordId: expect.any(String), + isPotentiallyDuplicate: false }) trackingId = res.trackingId token = await getToken('k.mweene', 'test') - declaration = (await fetchDeclaration(token, res.compositionId)).data + declaration = (await fetchDeclaration(token, res.recordId)).data .fetchDeathRegistration as DeathDeclaration }) diff --git a/e2e/testcases/correction-death/correct-death-record-14.spec.ts b/e2e/testcases/correction-death/correct-death-record-14.spec.ts index fff69a238..a648ad2e6 100644 --- a/e2e/testcases/correction-death/correct-death-record-14.spec.ts +++ b/e2e/testcases/correction-death/correct-death-record-14.spec.ts @@ -56,15 +56,14 @@ test.describe.serial(' Correct record - 14', () => { const res = await createDeathDeclaration(token) expect(res).toStrictEqual({ trackingId: expect.any(String), - compositionId: expect.any(String), - isPotentiallyDuplicate: false, - __typename: 'CreatedIds' + recordId: expect.any(String), + isPotentiallyDuplicate: false }) trackingId = res.trackingId token = await getToken('k.mweene', 'test') - declaration = (await fetchDeclaration(token, res.compositionId)).data + declaration = (await fetchDeclaration(token, res.recordId)).data .fetchDeathRegistration as DeathDeclaration }) diff --git a/e2e/testcases/correction-death/correct-death-record-15.spec.ts b/e2e/testcases/correction-death/correct-death-record-15.spec.ts index 5bc348880..ddd1c2f73 100644 --- a/e2e/testcases/correction-death/correct-death-record-15.spec.ts +++ b/e2e/testcases/correction-death/correct-death-record-15.spec.ts @@ -52,15 +52,14 @@ test.describe.serial(' Correct record - 15', () => { }) expect(res).toStrictEqual({ trackingId: expect.any(String), - compositionId: expect.any(String), - isPotentiallyDuplicate: false, - __typename: 'CreatedIds' + recordId: expect.any(String), + isPotentiallyDuplicate: false }) trackingId = res.trackingId token = await getToken('k.mweene', 'test') - declaration = (await fetchDeclaration(token, res.compositionId)).data + declaration = (await fetchDeclaration(token, res.recordId)).data .fetchDeathRegistration as DeathDeclaration deathLocation = diff --git a/e2e/testcases/correction-death/correct-death-record-16.spec.ts b/e2e/testcases/correction-death/correct-death-record-16.spec.ts index 20db8acec..eb720db93 100644 --- a/e2e/testcases/correction-death/correct-death-record-16.spec.ts +++ b/e2e/testcases/correction-death/correct-death-record-16.spec.ts @@ -61,16 +61,15 @@ test.describe.serial(' Correct record - 16', () => { const res = await createDeathDeclaration(token) expect(res).toStrictEqual({ trackingId: expect.any(String), - compositionId: expect.any(String), - isPotentiallyDuplicate: false, - __typename: 'CreatedIds' + recordId: expect.any(String), + isPotentiallyDuplicate: false }) trackingId = res.trackingId token = await getToken('j.musonda', 'test') - declaration = (await fetchDeclaration(token, res.compositionId)).data + declaration = (await fetchDeclaration(token, res.recordId)).data .fetchDeathRegistration as DeathDeclaration }) diff --git a/e2e/testcases/correction-death/correct-death-record-17.spec.ts b/e2e/testcases/correction-death/correct-death-record-17.spec.ts index 55b1e30a0..bc1003154 100644 --- a/e2e/testcases/correction-death/correct-death-record-17.spec.ts +++ b/e2e/testcases/correction-death/correct-death-record-17.spec.ts @@ -58,15 +58,14 @@ test.describe.serial(' Correct record - 17', () => { const res = await createDeathDeclaration(token) expect(res).toStrictEqual({ trackingId: expect.any(String), - compositionId: expect.any(String), - isPotentiallyDuplicate: false, - __typename: 'CreatedIds' + recordId: expect.any(String), + isPotentiallyDuplicate: false }) trackingId = res.trackingId token = await getToken('j.musonda', 'test') - declaration = (await fetchDeclaration(token, res.compositionId)).data + declaration = (await fetchDeclaration(token, res.recordId)).data .fetchDeathRegistration as DeathDeclaration }) diff --git a/e2e/testcases/correction-death/correct-death-record-18.spec.ts b/e2e/testcases/correction-death/correct-death-record-18.spec.ts index 22222c7dd..f653f9cf2 100644 --- a/e2e/testcases/correction-death/correct-death-record-18.spec.ts +++ b/e2e/testcases/correction-death/correct-death-record-18.spec.ts @@ -56,15 +56,14 @@ test.describe.serial(' Correct record - 18', () => { const res = await createDeathDeclaration(token) expect(res).toStrictEqual({ trackingId: expect.any(String), - compositionId: expect.any(String), - isPotentiallyDuplicate: false, - __typename: 'CreatedIds' + recordId: expect.any(String), + isPotentiallyDuplicate: false }) trackingId = res.trackingId token = await getToken('j.musonda', 'test') - declaration = (await fetchDeclaration(token, res.compositionId)).data + declaration = (await fetchDeclaration(token, res.recordId)).data .fetchDeathRegistration as DeathDeclaration }) diff --git a/e2e/testcases/death/1-death-event-declaration.spec.ts b/e2e/testcases/death/1-death-event-declaration.spec.ts index 2e1dab483..0375b41b7 100644 --- a/e2e/testcases/death/1-death-event-declaration.spec.ts +++ b/e2e/testcases/death/1-death-event-declaration.spec.ts @@ -530,9 +530,8 @@ test.describe('1. Death event declaration', () => { const res = await createDeathDeclaration(token) expect(res).toStrictEqual({ trackingId: expect.any(String), - compositionId: expect.any(String), - isPotentiallyDuplicate: false, - __typename: 'CreatedIds' + recordId: expect.any(String), + isPotentiallyDuplicate: false }) }) }) diff --git a/e2e/testcases/death/8-validate-declaration-review-page.spec.ts b/e2e/testcases/death/8-validate-declaration-review-page.spec.ts index 83011bf89..e0ab1540f 100644 --- a/e2e/testcases/death/8-validate-declaration-review-page.spec.ts +++ b/e2e/testcases/death/8-validate-declaration-review-page.spec.ts @@ -1388,8 +1388,8 @@ test.describe.serial('8. Validate declaration review page', () => { */ expect(page.url().includes('registration-home')).toBeTruthy() - await page.getByRole('button', { name: 'Ready to print' }).click() await expectOutboxToBeEmpty(page) + await page.getByRole('button', { name: 'Ready to print' }).click() /* * Expected result: The declaration should be in Ready to print diff --git a/e2e/testcases/death/helpers.ts b/e2e/testcases/death/helpers.ts index 9960b6014..c01ca838e 100644 --- a/e2e/testcases/death/helpers.ts +++ b/e2e/testcases/death/helpers.ts @@ -15,6 +15,7 @@ import { GET_DEATH_REGISTRATION_FOR_REVIEW } from './queries' import { random } from 'lodash' +import { waitUntilRecordDetails } from '../birth/helpers' export type DeathDeclarationInput = { deceased?: { @@ -108,6 +109,7 @@ export async function createDeathDeclaration( ) { const locations = await getAllLocations('ADMIN_STRUCTURE') const facilities = await getAllLocations('HEALTH_FACILITY') + const draftId = uuid.v4() const res = await fetch(`${GATEWAY_HOST}/graphql`, { method: 'POST', @@ -134,7 +136,7 @@ export async function createDeathDeclaration( ).toString('base64'), informantType: declaration.informantType, contactEmail: declaration.informantEmail, - draftId: uuid.v4() + draftId }, causeOfDeath: 'NATURAL', deceased: { @@ -268,7 +270,7 @@ export async function createDeathDeclaration( } }) }) - return res.json().then((r) => r.data.createDeathRegistration) + return res.json().then(() => waitUntilRecordDetails(token, draftId)) } export const fetchDeclaration = async ( diff --git a/e2e/testcases/death/queries.ts b/e2e/testcases/death/queries.ts index 52eb3734b..59cbf7b20 100644 --- a/e2e/testcases/death/queries.ts +++ b/e2e/testcases/death/queries.ts @@ -3,12 +3,7 @@ import { print } from 'graphql/language/printer' export const CREATE_DEATH_REGISTRATION = print(gql` mutation createDeathRegistration($details: DeathRegistrationInput!) { - createDeathRegistration(details: $details) { - trackingId - compositionId - isPotentiallyDuplicate - __typename - } + createDeathRegistration(details: $details) } `) diff --git a/infrastructure/docker-compose.deploy.yml b/infrastructure/docker-compose.deploy.yml index b0ecc9dff..f9f941e5a 100644 --- a/infrastructure/docker-compose.deploy.yml +++ b/infrastructure/docker-compose.deploy.yml @@ -704,6 +704,7 @@ services: - LOGIN_URL=https://login.{{hostname}} - CLIENT_APP_URL=https://register.{{hostname}} - DOMAIN={{hostname}} + - COUNTRY=${COUNTRY} deploy: labels: - 'traefik.enable=true' diff --git a/infrastructure/docker-compose.development-deploy.yml b/infrastructure/docker-compose.development-deploy.yml index 4910514f3..00f67cf91 100644 --- a/infrastructure/docker-compose.development-deploy.yml +++ b/infrastructure/docker-compose.development-deploy.yml @@ -37,7 +37,7 @@ services: environment: - LANGUAGES=en,fr - SENTRY_DSN=${SENTRY_DSN:-} - - COUNTRY=FAR + - COUNTRY=${COUNTRY} - QA_ENV=true - NODE_ENV=production - DISABLE_RATE_LIMIT=true diff --git a/infrastructure/docker-compose.qa-deploy.yml b/infrastructure/docker-compose.qa-deploy.yml index 73d7b97f5..f6d4a8173 100644 --- a/infrastructure/docker-compose.qa-deploy.yml +++ b/infrastructure/docker-compose.qa-deploy.yml @@ -66,7 +66,7 @@ services: environment: - LANGUAGES=en,fr - SENTRY_DSN=${SENTRY_DSN:-} - - COUNTRY=FAR + - COUNTRY=${COUNTRY} - QA_ENV=true - NODE_ENV=production - DISABLE_RATE_LIMIT=true diff --git a/infrastructure/environments/setup-environment.ts b/infrastructure/environments/setup-environment.ts index dc3cc84d7..66dbc41f5 100644 --- a/infrastructure/environments/setup-environment.ts +++ b/infrastructure/environments/setup-environment.ts @@ -329,7 +329,7 @@ const sshQuestions = [ name: 'sshHost', type: 'text' as const, message: - 'What is the target server IP address? (Note: For "production" environment with 2, 3 or 5 servers, this is the IP address of the manager server', + 'What is the target server IP address? (Note: For "production" environment with 2, 3 or 5 servers, this is the IP address of the manager server)', valueType: 'VARIABLE' as const, validate: notEmpty, valueLabel: 'SSH_HOST', @@ -373,6 +373,19 @@ const sshKeyQuestions = [ } ] +const countryQuestions = [ + { + name: 'country', + type: 'text' as const, + message: + 'What is the ISO 3166-1 alpha-3 country-code? (e.g. "NZL" for New Zealand) Reference: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3', + valueType: 'VARIABLE' as const, + valueLabel: 'COUNTRY', + initial: process.env.COUNTRY, + scope: 'REPOSITORY' as const + } +] + const infrastructureQuestions = [ { name: 'diskSpace', @@ -754,6 +767,7 @@ ALL_QUESTIONS.push( ...sshQuestions, ...sshKeyQuestions, ...infrastructureQuestions, + ...countryQuestions, ...databaseAndMonitoringQuestions, ...notificationTransportQuestions, ...smsQuestions, @@ -1026,6 +1040,7 @@ const SPECIAL_NON_APPLICATION_ENVIRONMENTS = ['jump', 'backup'] const answerOrExisting = ( variable: string | undefined, existingValue: Variable | undefined, + // eslint-disable-next-line no-unused-vars fn: (value: string | undefined) => string ) => fn(variable || existingValue?.value) || '' diff --git a/src/api/application/application-config.ts b/src/api/application/application-config.ts index b977c5fc8..59f74f2e5 100644 --- a/src/api/application/application-config.ts +++ b/src/api/application/application-config.ts @@ -65,3 +65,34 @@ export const applicationConfig = { } export const COUNTRY_WIDE_CRUDE_DEATH_RATE = 10 + +type EventNotificationFlags = { + 'sent-notification'?: boolean + 'sent-notification-for-review'?: boolean + 'sent-for-approval'?: boolean + registered?: boolean + 'sent-for-updates'?: boolean +} + +type NotificationFlags = { + BIRTH?: EventNotificationFlags + DEATH?: EventNotificationFlags + MARRIAGE?: EventNotificationFlags +} + +export const notificationForRecord: NotificationFlags = { + BIRTH: { + 'sent-notification': true, + 'sent-notification-for-review': true, + 'sent-for-approval': true, + registered: true, + 'sent-for-updates': true + }, + DEATH: { + 'sent-notification': true, + 'sent-notification-for-review': true, + 'sent-for-approval': true, + registered: true, + 'sent-for-updates': true + } +} diff --git a/src/api/event-registration/handler.ts b/src/api/event-registration/handler.ts index f317482ec..4d0d7f0fd 100644 --- a/src/api/event-registration/handler.ts +++ b/src/api/event-registration/handler.ts @@ -9,11 +9,13 @@ * Copyright (C) The OpenCRVS Authors located at https://github.com/opencrvs/opencrvs-core/blob/master/AUTHORS. */ import * as Hapi from '@hapi/hapi' -import fetch from 'node-fetch' import { logger } from '@countryconfig/logger' -import { CONFIRM_REGISTRATION_URL } from '@countryconfig/constants' import { createUniqueRegistrationNumberFromBundle } from '@countryconfig/api/event-registration/service' import { badImplementation } from '@hapi/boom' +import { + confirmRegistration + // rejectRegistration +} from '@countryconfig/utils/gateway-api' export async function eventRegistrationHandler( request: Hapi.Request, @@ -33,15 +35,28 @@ export async function eventRegistrationHandler( const bundle = request.payload as fhir.Bundle const eventRegistrationIdentifiersResponse = - await createUniqueRegistrationNumberFromBundle(bundle) + createUniqueRegistrationNumberFromBundle(bundle) - await fetch(CONFIRM_REGISTRATION_URL, { - method: 'POST', - body: JSON.stringify(eventRegistrationIdentifiersResponse), - headers: request.headers - }) + await confirmRegistration( + eventRegistrationIdentifiersResponse.compositionId, + eventRegistrationIdentifiersResponse, + { + headers: request.headers + } + ) } catch (err) { - // IF ANY ERROR OCCURS IN THIS API, THE REGISTRATION WILL BE REJECTED AND MUST BE RE-SUBMITTED BY A REGISTRAR ONCE THE ISSUE IS RESOLVED + // If the confirm registration endpoint throws an error, the registration will be retried through country-config + // If you don't want the registration to retry, you can call `rejectRegistration` from here and return 202 Accepted + + // await confirmRegistration( + // eventRegistrationIdentifiersResponse.compositionId, + // { + // reason: 'other', // Refer to the GraphQL schema for other options + // comment: 'The comment that will be visible on audit log.' + // }, + // { headers: request.headers } + // ) + logger.error(err) const boomError = badImplementation() diff --git a/src/api/event-registration/service.ts b/src/api/event-registration/service.ts index cab3a207f..521eb9e22 100644 --- a/src/api/event-registration/service.ts +++ b/src/api/event-registration/service.ts @@ -24,9 +24,7 @@ function generateRegistrationNumber(trackingId: string): string { return brn } -export async function createUniqueRegistrationNumberFromBundle( - bundle: fhir.Bundle -) { +export function createUniqueRegistrationNumberFromBundle(bundle: fhir.Bundle) { const taskResource = getTaskResource(bundle) if (!taskResource || !taskResource.extension) { @@ -36,11 +34,12 @@ export async function createUniqueRegistrationNumberFromBundle( } const trackingId = getTrackingIdFromTaskResource(taskResource) + const compositionId = getCompositionId(bundle) return { trackingId, + compositionId, registrationNumber: generateRegistrationNumber(trackingId), - compositionId: getCompositionId(bundle), ...(taskResource.code?.coding?.[0].code === 'BIRTH' && { // Some countries desire to create multiple identifiers for citizens at the point of birth registration using external systems. // OpenCRVS supports up to 3 additional, custom identifiers that can be created diff --git a/src/api/record-notification/handler.ts b/src/api/record-notification/handler.ts new file mode 100644 index 000000000..a10916e07 --- /dev/null +++ b/src/api/record-notification/handler.ts @@ -0,0 +1,9 @@ +import * as Hapi from '@hapi/hapi' +import { notificationForRecord } from '../application/application-config' + +export function recordNotificationHandler( + request: Hapi.Request, + h: Hapi.ResponseToolkit +) { + return h.response(notificationForRecord) +} diff --git a/src/constants.ts b/src/constants.ts index d970bf2c6..7de225c22 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -28,9 +28,6 @@ export const SENTRY_DSN = process.env.SENTRY_DSN // Check if the token has been invalided in the auth service before it has expired // This needs to be a string to make it easy to pass as an ENV var. export const CHECK_INVALID_TOKEN = process.env.CHECK_INVALID_TOKEN || 'false' -export const CONFIRM_REGISTRATION_URL = - process.env.CONFIRM_REGISTRATION_URL || - 'http://localhost:5050/confirm/registration' export const DEFAULT_TIMEOUT = 600000 export const PRODUCTION = process.env.NODE_ENV === 'production' export const QA_ENV = process.env.QA_ENV || false diff --git a/src/form/index.ts b/src/form/index.ts index 51323c305..489a985dc 100644 --- a/src/form/index.ts +++ b/src/form/index.ts @@ -14,12 +14,12 @@ import { birthForm } from './birth' import { deathForm } from './death' import { marriageForm } from './marriage' import { IForms, Event } from './types/types' -import { fetchUserLocationHierarchy } from '@countryconfig/utils/users' +import { fetchUserLocationHierarchy } from '@countryconfig/utils/gateway-api' export async function formHandler(req: Request): Promise { const addressHierarchy = await fetchUserLocationHierarchy( - req.headers.authorization, - req.auth.credentials.sub as string + req.auth.credentials.sub as string, + { headers: req.headers } ) // ====================== NOTE REGARDING MIGRATING FROM OPNCRVS v1.2 OR EARLIER ====================== diff --git a/src/index.ts b/src/index.ts index 446c9585f..78d3bbeac 100644 --- a/src/index.ts +++ b/src/index.ts @@ -64,6 +64,7 @@ import { trackingIDHandler } from './api/tracking-id/handler' import { dashboardQueriesHandler } from './api/dashboards/handler' import { fontsHandler } from './api/fonts/handler' import { certificateConfigurationHandler } from './api/certificate-configuration/handler' +import { recordNotificationHandler } from './api/record-notification/handler' export interface ITokenPayload { sub: string @@ -579,6 +580,16 @@ export async function createServer() { } }) + server.route({ + method: 'GET', + path: '/record-notification', + handler: recordNotificationHandler, + options: { + tags: ['api'], + description: 'Checks for enabled notification for record' + } + }) + server.ext({ type: 'onRequest', method(request: Hapi.Request & { sentryScope?: any }, h) { diff --git a/src/utils/gateway-api.ts b/src/utils/gateway-api.ts new file mode 100644 index 000000000..44459b389 --- /dev/null +++ b/src/utils/gateway-api.ts @@ -0,0 +1,129 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * OpenCRVS is also distributed under the terms of the Civil Registration + * & Healthcare Disclaimer located at http://opencrvs.org/license. + * + * Copyright (C) The OpenCRVS Authors located at https://github.com/opencrvs/opencrvs-core/blob/master/AUTHORS. + */ +import { GATEWAY_URL } from '@countryconfig/constants' +import { URL } from 'url' +import fetch from 'node-fetch' + +const GRAPHQL_GATEWAY_URL = new URL('graphql', GATEWAY_URL) + +/** Communicates with opencrvs-core's GraphQL gateway */ +const post = async ({ + query, + variables, + headers +}: { + query: string + variables: Record + headers: Record +}) => { + const response = await fetch(GRAPHQL_GATEWAY_URL, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + ...headers + }, + body: JSON.stringify({ + variables, + query + }) + }) + + if (!response.ok) { + throw new Error(`not ok: ${await response.text()}`) + } + + return response.json() as Promise<{ data: T }> +} + +export const confirmRegistration = ( + id: string, + variables: { + childIdentifiers?: Array<{ type: string; value: string }> + registrationNumber: string + trackingId: string + }, + { headers }: { headers: Record } +) => + post({ + query: /* GraphQL */ ` + mutation confirmRegistration( + $id: ID! + $details: ConfirmRegistrationInput! + ) { + confirmRegistration(id: $id, details: $details) + } + `, + variables: { + id, + details: { + childIdentifiers: variables.childIdentifiers, + registrationNumber: variables.registrationNumber, + trackingId: variables.trackingId + } + }, + headers + }) + +export const rejectRegistration = ( + id: string, + { reason, comment }: { reason: string; comment: string }, + { headers }: { headers: Record } +) => + post({ + query: /* GraphQL */ ` + mutation rejectRegistration( + $id: ID! + $details: RejectRegistrationInput! + ) { + rejectRegistration(id: $id, details: $details) + } + `, + variables: { + id, + details: { + reason, + comment + } + }, + headers + }) + +type GetUser = { + getUser: { + primaryOffice: { + hierarchy: Array<{ + id: string + }> + } + } +} + +export const fetchUserLocationHierarchy = async ( + userId: string, + { headers }: { headers: Record } +) => { + const res = await post({ + query: /* GraphQL */ ` + query fetchUser($userId: String!) { + getUser(userId: $userId) { + primaryOffice { + hierarchy { + id + } + } + } + } + `, + variables: { userId }, + headers + }) + return res.data.getUser.primaryOffice.hierarchy.map(({ id }) => id) +} diff --git a/src/utils/index.ts b/src/utils/index.ts index 1b720b487..af15210be 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -11,11 +11,9 @@ import fetch from 'node-fetch' import { APPLICATION_CONFIG_URL, FHIR_URL } from '@countryconfig/constants' -import { callingCountries } from 'country-data' import csv2json from 'csv2json' import { createReadStream } from 'fs' import fs from 'fs' -import { PhoneNumberFormat, PhoneNumberUtil } from 'google-libphonenumber' import { URL } from 'url' import { build } from 'esbuild' import { memoize } from 'lodash' @@ -26,6 +24,8 @@ export const OPENCRVS_SPECIFICATION_URL = 'http://opencrvs.org/specs/' import { join } from 'path' import { promisify } from 'util' import { stringify, Options } from 'csv-stringify' +import { PhoneNumberFormat, PhoneNumberUtil } from 'google-libphonenumber' +import { callingCountries } from 'country-data' export interface ILocation { id?: string @@ -64,9 +64,15 @@ export interface IApplicationConfigResponse { } export function getCompositionId(resBody: fhir.Bundle) { - return resBody.entry + const id = resBody.entry ?.map((e) => e.resource) .find((res) => res?.resourceType === 'Composition')?.id + + if (!id) { + throw new Error('Could not find composition id in FHIR Bundle') + } + + return id } export function getTaskResource( diff --git a/src/utils/users.ts b/src/utils/users.ts deleted file mode 100644 index 415c77bb5..000000000 --- a/src/utils/users.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { GATEWAY_URL } from '@countryconfig/constants' -import fetch from 'node-fetch' -import gql from 'graphql-tag' -import { print } from 'graphql/language/printer' -import { URL } from 'url' - -type GetUser = { - primaryOffice: { - hierarchy: Array<{ - id: string - }> - } -} -export async function fetchUserLocationHierarchy( - token: string, - userId: string -) { - const url = new URL('graphql', GATEWAY_URL) - const getUsersRes = await fetch(url, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - Authorization: `${token}` - }, - body: JSON.stringify({ - operationName: 'fetchUser', - variables: { - userId: userId - }, - query: print(gql` - query fetchUser($userId: String!) { - getUser(userId: $userId) { - primaryOffice { - hierarchy { - id - } - } - } - } - `) - }) - }) - - const res = (await getUsersRes.json()) as { - data: { getUser: GetUser } - } - - return res.data.getUser.primaryOffice.hierarchy.map(({ id }) => id) -} diff --git a/yarn.lock b/yarn.lock index 3dd1d1b2c..e1626a45e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -949,9 +949,9 @@ integrity sha512-8YXBE2ZcU/pImVOHX7MWrSR/X5up7t6rPWZlk34RwZEcdr3ua6X+32pSd6XuOQRN+vbuvYNfA6iey8NbrjuMFQ== "@fastify/busboy@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.0.0.tgz#f22824caff3ae506b18207bad4126dbc6ccdb6b8" - integrity sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ== + version "2.1.1" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" + integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== "@formatjs/ecma402-abstract@1.16.0": version "1.16.0" @@ -2111,12 +2111,7 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/resolve-uri@^3.0.3": +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== @@ -2126,16 +2121,16 @@ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/sourcemap-codec@1.4.14": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== +"@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + "@jridgewell/trace-mapping@0.3.9": version "0.3.9" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" @@ -2144,21 +2139,13 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.17": - version "0.3.18" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" - integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - -"@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" "@ljharb/through@^2.3.11": version "2.3.11" @@ -2276,6 +2263,15 @@ pvtsutils "^1.3.2" tslib "^2.4.0" +"@peculiar/asn1-schema@^2.3.8": + version "2.3.13" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.3.13.tgz#ec8509cdcbc0da3abe73fd7e690556b57a61b8f4" + integrity sha512-3Xq3a01WkHRZL8X04Zsfg//mGaA21xlL4tlVn4v2xGT0JStiztATRkMwa5b+f/HXmY2smsiLXYK46Gwgzvfg3g== + dependencies: + asn1js "^3.0.5" + pvtsutils "^1.3.5" + tslib "^2.6.2" + "@peculiar/json-schema@^1.1.12": version "1.1.12" resolved "https://registry.yarnpkg.com/@peculiar/json-schema/-/json-schema-1.1.12.tgz#fe61e85259e3b5ba5ad566cb62ca75b3d3cd5339" @@ -2643,9 +2639,9 @@ integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== "@types/json-stable-stringify@^1.0.32": - version "1.0.34" - resolved "https://registry.yarnpkg.com/@types/json-stable-stringify/-/json-stable-stringify-1.0.34.tgz#c0fb25e4d957e0ee2e497c1f553d7f8bb668fd75" - integrity sha512-s2cfwagOQAS8o06TcwKfr9Wx11dNGbH2E9vJz1cqV+a/LOyhWNLUNd6JSRYNzvB4d29UuJX2M0Dj9vE1T8fRXw== + version "1.0.36" + resolved "https://registry.yarnpkg.com/@types/json-stable-stringify/-/json-stable-stringify-1.0.36.tgz#fe6c6001a69ff8160a772da08779448a333c7ddd" + integrity sha512-b7bq23s4fgBB76n34m2b3RBf6M369B0Z9uRR8aHTMd8kZISRkmDEpPD8hhpYvDFzr3bJCPES96cm3Q6qRNDbQw== "@types/json5@^0.0.29": version "0.0.29" @@ -3811,12 +3807,7 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colorette@^2.0.16: - version "2.0.19" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" - integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== - -colorette@^2.0.7: +colorette@^2.0.16, colorette@^2.0.7: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== @@ -3898,9 +3889,9 @@ cosmiconfig@^5.0.2: parse-json "^4.0.0" cosmiconfig@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" - integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: "@types/parse-json" "^4.0.0" import-fresh "^3.2.1" @@ -4070,7 +4061,7 @@ debounce@^1.2.0: resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: +debug@4, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -4091,6 +4082,13 @@ debug@^3.1.0, debug@^3.2.7: dependencies: ms "^2.1.1" +debug@^4.1.0, debug@^4.3.1: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -4271,9 +4269,9 @@ ecdsa-sig-formatter@1.0.11: safe-buffer "^5.0.1" electron-to-chromium@^1.4.251: - version "1.4.284" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" - integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== + version "1.5.32" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.32.tgz#4a05ee78e29e240aabaf73a67ce9fe73f52e1bc7" + integrity sha512-M+7ph0VGBQqqpTT2YrabjNKSQ2fEl9PVx6AK3N558gDH9NO8O6XN9SXXFWRo9u9PbEg/bWq+tjXQr+eXmxubCw== elegant-spinner@^1.0.1: version "1.0.1" @@ -4332,10 +4330,10 @@ esbuild@^0.18.9: "@esbuild/win32-ia32" "0.18.9" "@esbuild/win32-x64" "0.18.9" -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" @@ -4677,9 +4675,9 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fast-querystring@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/fast-querystring/-/fast-querystring-1.1.1.tgz#f4c56ef56b1a954880cfd8c01b83f9e1a3d3fda2" - integrity sha512-qR2r+e3HvhEFmpdHMv//U8FnFlnYjaC6QKDuaXALDkw2kvHO8WDjxH+f/rHGR4Me4pnk8p9JAkRNTjYHAKRn2Q== + version "1.1.2" + resolved "https://registry.yarnpkg.com/fast-querystring/-/fast-querystring-1.1.2.tgz#a6d24937b4fc6f791b4ee31dcb6f53aeafb89f53" + integrity sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg== dependencies: fast-decode-uri-component "^1.0.1" @@ -4720,9 +4718,9 @@ fbjs-css-vars@^1.0.0: integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== fbjs@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.4.tgz#e1871c6bd3083bac71ff2da868ad5067d37716c6" - integrity sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ== + version "3.0.5" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.5.tgz#aa0edb7d5caa6340011790bd9249dbef8a81128d" + integrity sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg== dependencies: cross-fetch "^3.1.5" fbjs-css-vars "^1.0.0" @@ -4730,7 +4728,7 @@ fbjs@^3.0.0: object-assign "^4.1.0" promise "^7.1.1" setimmediate "^1.0.5" - ua-parser-js "^0.7.30" + ua-parser-js "^1.0.35" figures@^1.7.0: version "1.7.0" @@ -5387,9 +5385,9 @@ inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inquirer@^8.0.0: - version "8.2.5" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8" - integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ== + version "8.2.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" + integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== dependencies: ansi-escapes "^4.2.1" chalk "^4.1.1" @@ -5405,7 +5403,7 @@ inquirer@^8.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" through "^2.3.6" - wrap-ansi "^7.0.0" + wrap-ansi "^6.0.1" inquirer@^9.2.12: version "9.2.12" @@ -6248,9 +6246,9 @@ joi@^17.2.1, joi@^17.3.0, joi@^17.4.0: "@sideway/pinpoint" "^2.0.0" jose@^4.11.4: - version "4.14.1" - resolved "https://registry.yarnpkg.com/jose/-/jose-4.14.1.tgz#74f12a621ea2ef850bf0dd8405e2ee4041aea934" - integrity sha512-SgjXLpP7jhQkUNKL6RpowoR/IF4QKE+WjLDMpNnh2vmhiFs67NftrNpvFtgbwpvRdtueFliahYYWz9E+XZZQlg== + version "4.15.9" + resolved "https://registry.yarnpkg.com/jose/-/jose-4.15.9.tgz#9b68eda29e9a0614c042fa29387196c7dd800100" + integrity sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA== joycon@^3.1.1: version "3.1.1" @@ -6885,7 +6883,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.1.1: +ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -7433,10 +7431,10 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" + integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" @@ -7706,6 +7704,13 @@ pvtsutils@^1.3.2: dependencies: tslib "^2.4.0" +pvtsutils@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.5.tgz#b8705b437b7b134cd7fd858f025a23456f1ce910" + integrity sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA== + dependencies: + tslib "^2.6.1" + pvutils@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.3.tgz#f35fc1d27e7cd3dfbd39c0826d173e806a03f5a3" @@ -7834,9 +7839,9 @@ real-require@^0.1.0: integrity sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg== regenerator-runtime@^0.13.4: - version "0.13.10" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz#ed07b19616bcbec5da6274ebc75ae95634bfc2ee" - integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw== + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" @@ -8026,20 +8031,13 @@ rxjs@^6.3.3: dependencies: tslib "^1.9.0" -rxjs@^7.2.0, rxjs@^7.8.1: +rxjs@^7.2.0, rxjs@^7.5.5, rxjs@^7.8.1: version "7.8.1" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== dependencies: tslib "^2.1.0" -rxjs@^7.5.5: - version "7.5.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.7.tgz#2ec0d57fdc89ece220d2e702730ae8f1e49def39" - integrity sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA== - dependencies: - tslib "^2.1.0" - safe-buffer@^5.0.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -8840,12 +8838,12 @@ tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.1.0, tslib@^2.3.1: +tslib@^2.0.0, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== -tslib@^2.0.3, tslib@^2.4.0: +tslib@^2.0.3: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -8855,6 +8853,11 @@ tslib@^2.5.0, tslib@~2.5.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== +tslib@^2.6.1, tslib@^2.6.2: + version "2.7.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== + tslib@~2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" @@ -8923,10 +8926,10 @@ typescript@^5.1.6: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== -ua-parser-js@^0.7.30: - version "0.7.33" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.33.tgz#1d04acb4ccef9293df6f70f2c3d22f3030d8b532" - integrity sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw== +ua-parser-js@^1.0.35: + version "1.0.39" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.39.tgz#bfc07f361549bf249bd8f4589a4cccec18fd2018" + integrity sha512-k24RCVWlEcjkdOxYmVJgeD/0a1TiSpqLg+ZalVGV9lsnr4yqu0w7tX/x2xX6G4zpkgQnRf89lxuZ1wsbjXM8lw== uglify-js@^3.1.4: version "3.17.4" @@ -8954,9 +8957,9 @@ undici-types@~5.26.4: integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== undici@^5.10.0: - version "5.26.3" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.26.3.tgz#ab3527b3d5bb25b12f898dfd22165d472dd71b79" - integrity sha512-H7n2zmKEWgOllKkIUkLvFmsJQj062lSm3uA4EYApG8gLuiOM0/go9bIoC3HVaSnfg4xunowDE2i9p8drkXuvDw== + version "5.28.4" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" + integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== dependencies: "@fastify/busboy" "^2.0.0" @@ -8996,12 +8999,12 @@ unset-value@^1.0.0: isobject "^3.0.0" update-browserslist-db@^1.0.9: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + version "1.1.1" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" + integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" + escalade "^3.2.0" + picocolors "^1.1.0" upper-case-first@^2.0.2: version "2.0.2" @@ -9128,20 +9131,20 @@ web-streams-polyfill@4.0.0-beta.3: integrity sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug== web-streams-polyfill@^3.2.0, web-streams-polyfill@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" - integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== + version "3.3.3" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" + integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== webcrypto-core@^1.7.4: - version "1.7.5" - resolved "https://registry.yarnpkg.com/webcrypto-core/-/webcrypto-core-1.7.5.tgz#c02104c953ca7107557f9c165d194c6316587ca4" - integrity sha512-gaExY2/3EHQlRNNNVSrbG2Cg94Rutl7fAaKILS1w8ZDhGxdFOaw6EbCfHIxPy9vt/xwp5o0VQAx9aySPF6hU1A== + version "1.8.0" + resolved "https://registry.yarnpkg.com/webcrypto-core/-/webcrypto-core-1.8.0.tgz#aaea17f3dd9c77c304e3c494eb27ca07cc72ca37" + integrity sha512-kR1UQNH8MD42CYuLzvibfakG5Ew5seG85dMMoAM/1LqvckxaF6pUiidLuraIu4V+YCIFabYecUZAW0TuxAoaqw== dependencies: - "@peculiar/asn1-schema" "^2.1.6" + "@peculiar/asn1-schema" "^2.3.8" "@peculiar/json-schema" "^1.1.12" asn1js "^3.0.1" - pvtsutils "^1.3.2" - tslib "^2.4.0" + pvtsutils "^1.3.5" + tslib "^2.6.2" webidl-conversions@^3.0.0: version "3.0.1" @@ -9229,7 +9232,7 @@ wrap-ansi@^3.0.1: string-width "^2.1.1" strip-ansi "^4.0.0" -wrap-ansi@^6.2.0: +wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==