From 5c8001f9e0ca20a40877b172bea320a4d34c52cf Mon Sep 17 00:00:00 2001 From: Nam Hoang Date: Mon, 21 Oct 2024 15:21:20 +0700 Subject: [PATCH 01/17] fix: handle enveloping proof for local storage and import components Signed-off-by: Nam Hoang --- app-config.json | 72 +++- .../mock-apps/components/import-button.md | 16 +- .../qr-code-scanner-dialog-button.md | 14 +- .../src/__tests__/ImportButton.test.tsx | 88 ++++- .../QRCodeScannerDialogButton.test.tsx | 314 +++++++++++------- .../utils/importDataHelpers.test.tsx | 127 +++++++ .../components/ImportButton/ImportButton.tsx | 30 +- .../QRCodeScannerDialogButton.tsx | 26 +- .../RenderCheckList/RenderCheckList.tsx | 10 +- .../src/components/Scanner/Scanner.tsx | 28 +- packages/components/src/types/common.types.ts | 4 + .../components/src/utils/importDataHelpers.ts | 30 ++ packages/components/src/utils/index.ts | 1 + packages/mock-app/src/pages/Verify.tsx | 14 +- packages/services/package.json | 1 + .../src/__tests__/aggregationEvent.test.ts | 21 +- .../__tests__/epcisEvents/objectEvent.test.ts | 4 + .../services/src/__tests__/processDPP.test.ts | 10 +- .../processDigitalIdentityAnchor.test.ts | 4 + .../src/__tests__/transactionEvent.test.ts | 7 + .../src/__tests__/vckit.service.test.ts | 115 +++++++ .../src/epcisEvents/aggregationEvent.ts | 8 +- .../services/src/epcisEvents/objectEvent.ts | 5 +- .../src/epcisEvents/transactionEvent.ts | 5 +- .../src/epcisEvents/transformationEvent.ts | 4 +- packages/services/src/processDPP.service.ts | 6 +- .../processDigitalIdentityAnchor.service.ts | 5 +- packages/services/src/vckit.service.ts | 41 +++ 28 files changed, 806 insertions(+), 204 deletions(-) create mode 100644 packages/components/src/__tests__/utils/importDataHelpers.test.tsx create mode 100644 packages/components/src/utils/importDataHelpers.ts diff --git a/app-config.json b/app-config.json index 4bb34a1c..8274bbd5 100644 --- a/app-config.json +++ b/app-config.json @@ -31,6 +31,48 @@ "tertiaryColor": "#ffffff" }, "features": [ + { + "name": "Process Steel", + "id": "process_product", + "components": [ + { + "name": "RenderCheckList", + "type": "EntryData", + "props": { + "checkBoxLabel": "Imported valid json:", + "nestedComponents": [ + { + "name": "ImportButton", + "type": "EntryData", + "props": { + "label": "Import JSON", + "style": { "margin": "40px auto", "paddingTop": "40px", "width": "80%" }, + "vcOptions": { + "credentialPath": "/vc" + } + } + }, + { + "name": "QRCodeScannerDialogButton", + "type": "EntryData" + } + ], + "style": { "margin": "40px auto", "paddingTop": "40px", "width": "80%" } + } + }, + { + "name": "CustomButton", + "type": "Submit", + "props": {} + } + ], + "services": [ + { + "name": "test", + "parameters": [] + } + ] + }, { "name": "Issue DPP", "id": "produce_product", @@ -760,7 +802,7 @@ "parameters": [ { "storageKey": "CherriesFarm_dpps", - "objectKeyPath": "/vc/credentialSubject/productIdentifier/0/identifierValue" + "objectKeyPath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue" } ] } @@ -4604,11 +4646,11 @@ "constructData": { "mappingFields": [ { - "sourcePath": "/vc/credentialSubject/productIdentifier/0/identifierValue", + "sourcePath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue", "destinationPath": "/eventID" }, { - "sourcePath": "/vc/credentialSubject/productIdentifier/0/identifierValue", + "sourcePath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue", "destinationPath": "/epcList/index/name" }, { @@ -4748,7 +4790,7 @@ "parameters": [ { "storageKey": "orchard_facility_transaction_event", - "objectKeyPath": "/vc/credentialSubject/eventID" + "objectKeyPath": "/decodedEnvelopedVC/credentialSubject/eventID" } ] } @@ -5502,7 +5544,7 @@ "parameters": [ { "storageKey": "CherriesFarm_dpps", - "objectKeyPath": "/vc/credentialSubject/productIdentifier/0/identifierValue" + "objectKeyPath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue" } ] } @@ -5845,11 +5887,11 @@ "constructData": { "mappingFields": [ { - "sourcePath": "/vc/credentialSubject/productIdentifier/0/identifierValue", + "sourcePath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue", "destinationPath": "/eventID" }, { - "sourcePath": "/vc/credentialSubject/productIdentifier/0/identifierValue", + "sourcePath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue", "destinationPath": "/epcList/index/name" }, { @@ -5989,7 +6031,7 @@ "parameters": [ { "storageKey": "packhouse_facility_transaction_event", - "objectKeyPath": "/vc/credentialSubject/eventID" + "objectKeyPath": "/decodedEnvelopedVC/credentialSubject/eventID" } ] } @@ -6743,7 +6785,7 @@ "parameters": [ { "storageKey": "CherriesFarm_dpps", - "objectKeyPath": "/vc/credentialSubject/productIdentifier/0/identifierValue" + "objectKeyPath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue" } ] } @@ -7086,11 +7128,11 @@ "constructData": { "mappingFields": [ { - "sourcePath": "/vc/credentialSubject/productIdentifier/0/identifierValue", + "sourcePath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue", "destinationPath": "/eventID" }, { - "sourcePath": "/vc/credentialSubject/productIdentifier/0/identifierValue", + "sourcePath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue", "destinationPath": "/epcList/index/name" }, { @@ -7230,7 +7272,7 @@ "parameters": [ { "storageKey": "fumigation_and_freight_forwarding_facility_transaction_event", - "objectKeyPath": "/vc/credentialSubject/eventID" + "objectKeyPath": "/decodedEnvelopedVC/credentialSubject/eventID" } ] } @@ -7984,7 +8026,7 @@ "parameters": [ { "storageKey": "CherriesFarm_dpps", - "objectKeyPath": "/vc/credentialSubject/productIdentifier/0/identifierValue" + "objectKeyPath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue" } ] } @@ -8327,11 +8369,11 @@ "constructData": { "mappingFields": [ { - "sourcePath": "/vc/credentialSubject/productIdentifier/0/identifierValue", + "sourcePath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue", "destinationPath": "/eventID" }, { - "sourcePath": "/vc/credentialSubject/productIdentifier/0/identifierValue", + "sourcePath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue", "destinationPath": "/epcList/index/name" }, { diff --git a/documentation/docs/mock-apps/components/import-button.md b/documentation/docs/mock-apps/components/import-button.md index 78dafb57..78146fe2 100644 --- a/documentation/docs/mock-apps/components/import-button.md +++ b/documentation/docs/mock-apps/components/import-button.md @@ -33,7 +33,15 @@ The ImportButton component is responsible for rendering a button that allows the ### Props -| Property | Required | Description | Type | -| -------- | -------- | ------------------------------- | ------ | -| label | Yes | The label for the import button | String | -| style | No | The style for the component | Object | +| Property | Required | Description | Type | +| --------- | -------- | ----------------------------------------------------------------------------------------------------- | ------ | +| label | Yes | The label for the import button | String | +| style | No | The style for the component | Object | +| type | No | The type of data (should be 'VerifiableCredential' and 'JSON'), the default is 'VerifiableCredential' | String | +| vcOptions | No | The options for the VC data processing | Object | + +#### vcOptions + +| Property | Required | Description | Type | +| -------------- | -------- | -------------------------------- | ------ | +| credentialPath | Yes | The path for the credential data | String | diff --git a/documentation/docs/mock-apps/components/qr-code-scanner-dialog-button.md b/documentation/docs/mock-apps/components/qr-code-scanner-dialog-button.md index 8156c96a..fb37a226 100644 --- a/documentation/docs/mock-apps/components/qr-code-scanner-dialog-button.md +++ b/documentation/docs/mock-apps/components/qr-code-scanner-dialog-button.md @@ -32,6 +32,14 @@ The QRCodeScannerDialogButton component is responsible for rendering a button th ### Props -| Property | Required | Description | Type | -| -------- | -------- | --------------------------- | ------ | -| style | No | The style for the component | Object | +| Property | Required | Description | Type | +| --------- | -------- | ----------------------------------------------------------------------------------------------------- | ------ | +| style | No | The style for the component | Object | +| type | No | The type of data (should be 'VerifiableCredential' and 'JSON'), the default is 'VerifiableCredential' | String | +| vcOptions | No | The options for the VC data processing | Object | + +#### vcOptions + +| Property | Required | Description | Type | +| -------------- | -------- | --------------------------------------------------------------------- | ------ | +| credentialPath | Yes | The path for the credential data that is fetched from the QR code URL | String | diff --git a/packages/components/src/__tests__/ImportButton.test.tsx b/packages/components/src/__tests__/ImportButton.test.tsx index a1a96dcb..181dcb19 100644 --- a/packages/components/src/__tests__/ImportButton.test.tsx +++ b/packages/components/src/__tests__/ImportButton.test.tsx @@ -2,9 +2,15 @@ /* eslint-disable jest/no-conditional-expect */ import React from 'react'; import { render, screen, fireEvent, waitFor } from '@testing-library/react'; -import { ImportButton } from '..'; +import { ImportButton } from '../components/ImportButton/ImportButton'; +import { processVerifiableCredentialData } from '../utils/index.js'; +import { ImportDataType } from '../types/common.types'; -describe('ImportButton', () => { +jest.mock('../utils/index.js', () => ({ + processVerifiableCredentialData: jest.fn(), +})); + +describe('ImportButton, when type is JSON', () => { // Mock Json object const contentObjectMock = { pdfUrl: 'https://integritysystems.com.au/api/v1/kqUvtmA', @@ -30,7 +36,7 @@ describe('ImportButton', () => { const label = 'Import JSON File'; // Render the ImportButton component with the provided props - render(); + render(); // Expect that the rendered button is present in the document const renderedImportButton = screen.getByText(label); @@ -40,10 +46,11 @@ describe('ImportButton', () => { it('handles file upload and calls onChange with file content', async () => { render( { const [fileContentObject] = data; // Expect the onChange function to have been called with the expected content - expect(fileContentObject).toMatchObject(contentObjectMock); + expect(fileContentObject).toMatchObject({ 'testFile.json': contentObjectMock }); }} />, ); @@ -69,7 +76,7 @@ describe('ImportButton', () => { Object.defineProperty(oversizedFileMock, 'size', { value: 1024 * 1024 * 6 }); // Render the ImportButton component with the provided label and onChange mock function - render(); + render(); // Simulate a file change event by providing an oversized file to the file input const input = screen.getByTestId('file-input'); @@ -91,7 +98,7 @@ describe('ImportButton', () => { }); // Render the ImportButton component with the provided label and onChange mock function - render(); + render(); // Simulate a file change event by providing a file with empty content to the file input const input = screen.getByTestId('file-input'); @@ -113,7 +120,7 @@ describe('ImportButton', () => { }); // Render the ImportButton component with the provided label and onChange mock function - render(); + render(); // Simulate a file change event by providing a file with invalid JSON content to the file input const input = screen.getByTestId('file-input'); @@ -126,3 +133,70 @@ describe('ImportButton', () => { } }); }); + +describe('ImportButton, when type is VerifiableCredential', () => { + // Mock Json object + const contentObjectMock = { + '@context': ['https://www.w3.org/ns/credentials/v2', 'https://www.w3.org/ns/credentials/examples/v2'], + type: 'EnvelopedVerifiableCredential', + id: 'data:application/vc-ld+jwt,jwt.abc.123', + }; + const fileMock = new File([JSON.stringify(contentObjectMock, null, 2)], 'testFile.json', { + type: 'application/json', + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('renders ImportButton component', () => { + const onChangeMock = jest.fn(); + const label = 'Import Verifiable Credential'; + + render(); + + const renderedImportButton = screen.getByText(label); + expect(renderedImportButton).toBeInTheDocument(); + }); + + it('handles file upload and calls onChange with file content', async () => { + (processVerifiableCredentialData as jest.Mock).mockImplementation(() => ({ + vc: contentObjectMock, + decodedEnvelopedVC: { + type: ['VerifiableCredential'], + credentialSubject: { + id: 'did:example:123', + name: 'Alice', + }, + }, + })); + + render( + { + const [fileContentObject] = data; + expect(fileContentObject).toMatchObject({ + 'testFile.json': { + vc: contentObjectMock, + decodedEnvelopedVC: { + type: ['VerifiableCredential'], + credentialSubject: { + id: 'did:example:123', + name: 'Alice', + }, + }, + }, + }); + }} + />, + ); + + const fileInput = screen.getByLabelText('Import'); + fireEvent.change(fileInput, { target: { files: [fileMock] } }); + + await waitFor(() => expect(fileInput).not.toBeDisabled()); + }); + + it; +}); diff --git a/packages/components/src/__tests__/QRCodeScannerDialogButton.test.tsx b/packages/components/src/__tests__/QRCodeScannerDialogButton.test.tsx index 323d3b7d..fb4dc239 100644 --- a/packages/components/src/__tests__/QRCodeScannerDialogButton.test.tsx +++ b/packages/components/src/__tests__/QRCodeScannerDialogButton.test.tsx @@ -1,136 +1,208 @@ import React from 'react'; -import { publicAPI } from '@mock-app/services' +import { publicAPI } from '@mock-app/services'; import { render, screen, getByText, act, fireEvent } from '@testing-library/react'; -import {QRCodeScannerDialogButton} from '../components/QRCodeScannerDialogButton/QRCodeScannerDialogButton'; -import {ScannerDialog} from '../components/QRCodeScannerDialogButton/ScannerDialog'; +import { processVerifiableCredentialData } from '../utils/importDataHelpers.js'; +import { QRCodeScannerDialogButton } from '../components/QRCodeScannerDialogButton/QRCodeScannerDialogButton'; +import { ScannerDialog } from '../components/QRCodeScannerDialogButton/ScannerDialog'; +import { ImportDataType } from '../types/common.types'; jest.mock('@mock-app/services', () => ({ - publicAPI: { - get: jest.fn(), - }, + publicAPI: { + get: jest.fn(), + }, })); jest.mock('../components/QRCodeScannerDialogButton/ScannerDialog', () => ({ - ScannerDialog: jest.fn(), -})) + ScannerDialog: jest.fn(), +})); + +jest.mock('../utils/importDataHelpers.js', () => ({ + processVerifiableCredentialData: jest.fn(), +})); + +describe('QRCodeScannerDialogButton, when type is JSON', () => { + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('should render QRCodeScannerDialogButton', () => { + render(); + expect(screen.getByRole('button')).toBeInTheDocument(); + }); + + it('should call onChange with result when getQRCodeDataFromUrl is called with valid URL', async () => { + const url = 'https://example.com'; + function MockScannerDialog({ onScanQRResult }: { onScanQRResult: (value: string) => () => void }) { + return ( + + ); + } + + (ScannerDialog as any).mockImplementation(MockScannerDialog); + + const onChange = jest.fn(); + const result = { + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://www.w3.org/2018/credentials/examples/v1'], + type: ['VerifiableCredential', 'UniversityDegreeCredential'], + issuer: 'https://example.edu/issuers/565049', + credentialSubject: { + id: 'did:example:ebfeb1f712ebc6f1c276e12ec21', + degree: { + type: 'BachelorDegree', + name: 'Bachelor of Science and Arts', + }, + }, + }; + publicAPI.get = jest.fn().mockResolvedValue(result); + act(() => { + render(); + }); + + act(() => { + const button = getByText(document.body, 'ScanQR'); + fireEvent.click(button); + }); + + act(() => { + const button = getByText(document.body, 'Click'); + fireEvent.click(button); + }); -describe('QRCodeScannerDialogButton', () => { - beforeEach(() => { - jest.resetAllMocks(); + expect(publicAPI.get).toHaveBeenCalledWith(url); + expect(await onChange).toHaveBeenCalledWith({ 'https://example.com': result }); + }); + + it('should show toast message with error message when getQRCodeDataFromUrl is called with invalid URL', async () => { + const url = 'invalid-url'; + function MockScannerDialog({ onScanQRResult }: { onScanQRResult: (value: string) => () => void }) { + return ( + + ); + } + + (ScannerDialog as any).mockImplementation(MockScannerDialog); + + const onChange = jest.fn(); + act(() => { + render(); }); - it('should render QRCodeScannerDialogButton', () => { - render(); - expect(screen.getByRole('button')).toBeInTheDocument(); + act(() => { + const button = getByText(document.body, 'ScanQR'); + fireEvent.click(button); }); - it('should call onChange with result when getQRCodeDataFromUrl is called with valid URL', async () => { - const url = 'https://example.com'; - function MockScannerDialog({ onScanQRResult }: { onScanQRResult: (value: string) => () => void }) { - return ( - - ); - } - - (ScannerDialog as any).mockImplementation(MockScannerDialog); - - - const onChange = jest.fn(); - const result = { - '@context': [ - 'https://www.w3.org/2018/credentials/v1', - 'https://www.w3.org/2018/credentials/examples/v1' - ], - type: ['VerifiableCredential', 'UniversityDegreeCredential'], - issuer: 'https://example.edu/issuers/565049', - credentialSubject: { - id: 'did:example:ebfeb1f712ebc6f1c276e12ec21', - degree: { - type: 'BachelorDegree', - name: 'Bachelor of Science and Arts' - } - } - } - publicAPI.get = jest.fn().mockResolvedValue(result); - act(() => { - render(); - }) - - act(() => { - const button = getByText(document.body, 'ScanQR'); - fireEvent.click(button); - }); - - act(() => { - const button = getByText(document.body, 'Click'); - fireEvent.click(button); - }) - - - - expect(publicAPI.get).toHaveBeenCalledWith(url); - expect(await onChange).toHaveBeenCalledWith(result); - }) - - it('should show toast message with error message when getQRCodeDataFromUrl is called with invalid URL', async () => { - const url = 'invalid-url'; - function MockScannerDialog({ onScanQRResult }: { onScanQRResult: (value: string) => () => void }) { - return ( - - ); - } - - (ScannerDialog as any).mockImplementation(MockScannerDialog); - - const onChange = jest.fn(); - act(() => { - render(); - }) - - act(() => { - const button = getByText(document.body, 'ScanQR'); - fireEvent.click(button); - }); - - act(() => { - const button = getByText(document.body, 'Click'); - fireEvent.click(button); - }); - - expect(onChange).not.toHaveBeenCalled(); - expect(screen.getByText(/Invalid URL/i)).toBeInTheDocument(); + act(() => { + const button = getByText(document.body, 'Click'); + fireEvent.click(button); }); - it('should close scanner dialog when close button is clicked', () => { - function MockScannerDialog({ close }: { close: () => () => void }) { - return ( - - ); - } - - (ScannerDialog as any).mockImplementation(MockScannerDialog); - - const onChange = jest.fn(); - act(() => { - render(); - }) - - act(() => { - const button = getByText(document.body, 'ScanQR'); - fireEvent.click(button); - }); - - act(() => { - const button = getByText(document.body, 'Close'); - fireEvent.click(button); - }); - - expect(screen.queryByText('ScannerDialog')).not.toBeInTheDocument(); + expect(onChange).not.toHaveBeenCalled(); + expect(screen.getByText(/Invalid URL/i)).toBeInTheDocument(); + }); + + it('should close scanner dialog when close button is clicked', () => { + function MockScannerDialog({ close }: { close: () => () => void }) { + return ( + + ); + } + + (ScannerDialog as any).mockImplementation(MockScannerDialog); + + const onChange = jest.fn(); + act(() => { + render(); }); -}); \ No newline at end of file + + act(() => { + const button = getByText(document.body, 'ScanQR'); + fireEvent.click(button); + }); + + act(() => { + const button = getByText(document.body, 'Close'); + fireEvent.click(button); + }); + + expect(screen.queryByText('ScannerDialog')).not.toBeInTheDocument(); + }); +}); + +describe('QRCodeScannerDialogButton, when type is VerifiableCredential', () => { + beforeEach(() => { + jest.resetAllMocks(); + }); + + fit('should call onChange with result when getQRCodeDataFromUrl is called with valid URL', async () => { + const url = 'https://example.com'; + function MockScannerDialog({ onScanQRResult }: { onScanQRResult: (value: string) => () => void }) { + return ( + + ); + } + + (ScannerDialog as any).mockImplementation(MockScannerDialog); + + const onChange = jest.fn(); + const result = { + '@context': ['https://www.w3.org/ns/credentials/v2', 'https://www.w3.org/ns/credentials/examples/v2'], + type: 'EnvelopedVerifiableCredential', + id: 'data:application/vc-ld+jwt,jwt.abc.123', + }; + + (processVerifiableCredentialData as jest.Mock).mockImplementation(() => ({ + vc: result, + decodedEnvelopedVC: { + type: ['VerifiableCredential'], + credentialSubject: { + id: 'did:example:123', + name: 'Alice', + }, + }, + })); + + publicAPI.get = jest.fn().mockResolvedValue(result); + act(() => { + render( + { + expect(data).toEqual({ + 'https://example.com': { + vc: result, + decodedEnvelopedVC: { + type: ['VerifiableCredential'], + credentialSubject: { + id: 'did:example:123', + name: 'Alice', + }, + }, + }, + }); + }} + />, + ); + }); + + act(() => { + const button = getByText(document.body, 'ScanQR'); + fireEvent.click(button); + }); + + act(() => { + const button = getByText(document.body, 'Click'); + fireEvent.click(button); + }); + + expect(publicAPI.get).toHaveBeenCalledWith(url); + }); +}); diff --git a/packages/components/src/__tests__/utils/importDataHelpers.test.tsx b/packages/components/src/__tests__/utils/importDataHelpers.test.tsx new file mode 100644 index 00000000..425b8ba2 --- /dev/null +++ b/packages/components/src/__tests__/utils/importDataHelpers.test.tsx @@ -0,0 +1,127 @@ +import { processVerifiableCredentialData } from '../../utils'; +import { verifyVC, decodeEnvelopedVC } from '@mock-app/services'; + +jest.mock('@mock-app/services', () => ({ + verifyVC: jest.fn(), + decodeEnvelopedVC: jest.fn(), +})); + +describe('processVerifiableCredentialData', () => { + it('should return input data when the VC is not envelopedVC', async () => { + const data = { + vc: { + type: ['VerifiableCredential'], + credentialSubject: { + id: 'did:example:123', + name: 'Alice', + }, + }, + }; + const credentialPath = '/vc'; + + (verifyVC as jest.Mock).mockImplementation(() => ({ + verified: true, + })); + (decodeEnvelopedVC as jest.Mock).mockReturnValue(null); + const result = await processVerifiableCredentialData(data, credentialPath); + + expect(result).toEqual(data); + }); + + it('should return input data with decodedEnvelopedVC when the VC is envelopedVC', async () => { + const data = { + vc: { + '@context': ['https://www.w3.org/ns/credentials/v2', 'https://www.w3.org/ns/credentials/examples/v2'], + type: 'EnvelopedVerifiableCredential', + id: 'data:application/vc-ld+jwt,jwt.abc.123', + }, + }; + const credentialPath = '/vc'; + + (verifyVC as jest.Mock).mockImplementation(() => ({ + verified: true, + })); + (decodeEnvelopedVC as jest.Mock).mockReturnValue({ + type: ['VerifiableCredential'], + credentialSubject: { + id: 'did:example:123', + name: 'Alice', + }, + }); + const result = await processVerifiableCredentialData(data, credentialPath); + + expect(result).toEqual({ + vc: { + vc: { + '@context': ['https://www.w3.org/ns/credentials/v2', 'https://www.w3.org/ns/credentials/examples/v2'], + type: 'EnvelopedVerifiableCredential', + id: 'data:application/vc-ld+jwt,jwt.abc.123', + }, + decodedEnvelopedVC: { + type: ['VerifiableCredential'], + credentialSubject: { + id: 'did:example:123', + name: 'Alice', + }, + }, + }, + }); + }); + + it('should return input data with decodedEnvelopedVC when the VC is envelopedVC and credentialPath is not provided', async () => { + const data = { + '@context': ['https://www.w3.org/ns/credentials/v2', 'https://www.w3.org/ns/credentials/examples/v2'], + type: 'EnvelopedVerifiableCredential', + id: 'data:application/vc-ld+jwt,jwt.abc.123', + }; + + (verifyVC as jest.Mock).mockImplementation(() => ({ + verified: true, + })); + (decodeEnvelopedVC as jest.Mock).mockReturnValue({ + type: ['VerifiableCredential'], + credentialSubject: { + id: 'did:example:123', + name: 'Alice', + }, + }); + const result = await processVerifiableCredentialData(data); + + expect(result).toEqual({ + vc: { + '@context': ['https://www.w3.org/ns/credentials/v2', 'https://www.w3.org/ns/credentials/examples/v2'], + type: 'EnvelopedVerifiableCredential', + id: 'data:application/vc-ld+jwt,jwt.abc.123', + }, + decodedEnvelopedVC: { + type: ['VerifiableCredential'], + credentialSubject: { + id: 'did:example:123', + name: 'Alice', + }, + }, + }); + }); + + it('should throw error when VC is not verified', async () => { + const data = { + vc: { + type: ['VerifiableCredential'], + credentialSubject: { + id: 'did:example:123', + name: 'Alice', + }, + }, + }; + const credentialPath = '/vc'; + + (verifyVC as jest.Mock).mockImplementation(() => ({ + verified: false, + })); + (decodeEnvelopedVC as jest.Mock).mockReturnValue(null); + + expect(async () => await processVerifiableCredentialData(data, credentialPath)).rejects.toThrow( + 'Invalid Verifiable Credential!', + ); + }); +}); diff --git a/packages/components/src/components/ImportButton/ImportButton.tsx b/packages/components/src/components/ImportButton/ImportButton.tsx index 40707ecc..688ecf5b 100644 --- a/packages/components/src/components/ImportButton/ImportButton.tsx +++ b/packages/components/src/components/ImportButton/ImportButton.tsx @@ -2,23 +2,34 @@ import React, { ChangeEvent, useState } from 'react'; import { Box } from '@mui/material'; import { LoadingButton } from '@mui/lab'; import { UploadFile as UploadFileIcon } from '@mui/icons-material'; +import { ImportDataType } from '../../types/common.types.js'; +import { processVerifiableCredentialData } from '../../utils/index.js'; export interface IImportButtonProps { onChange: (data: object[]) => void; label?: string; + type?: ImportDataType; + vcOptions?: { + credentialPath: string; + }; } /** * ImportButton component is used to display the footer */ -export const ImportButton = ({ label = 'Import', onChange}: IImportButtonProps) => { +export const ImportButton = ({ + label = 'Import', + type = ImportDataType.VerifiableCredential, + vcOptions, + onChange, +}: IImportButtonProps) => { const [loading, setLoading] = useState(false); const loadJsonFile = (file: File): Promise => { - const maxFileSizeMB = 5; + const maxFileSizeMB = 5; // 5 MB return new Promise((resolve) => { - if (file.size > maxFileSizeMB * 1024 * 1024) {// 5 MB + if (file.size > maxFileSizeMB * 1024 * 1024) { throw new Error(`File size exceeds the maximum allowed size of ${maxFileSizeMB} MB.`); } const fileReader = new FileReader(); @@ -43,7 +54,7 @@ export const ImportButton = ({ label = 'Import', onChange}: IImportButtonProps) fileReader.readAsText(file); }); - } + }; const handleFileUpload = async (event: ChangeEvent) => { setLoading(true); @@ -55,7 +66,16 @@ export const ImportButton = ({ label = 'Import', onChange}: IImportButtonProps) } const fileArray = Array.from(files); - const fileContents = await Promise.all(fileArray.map((file: File) => loadJsonFile(file))); + const fileContents = await Promise.all( + fileArray.map(async (file: File) => { + const content = await loadJsonFile(file); + if (type === ImportDataType.VerifiableCredential) { + const processedData = await processVerifiableCredentialData(content, vcOptions?.credentialPath); + return { [file.name]: processedData }; + } + return { [file.name]: content }; + }), + ); onChange(fileContents); } catch (error: any) { diff --git a/packages/components/src/components/QRCodeScannerDialogButton/QRCodeScannerDialogButton.tsx b/packages/components/src/components/QRCodeScannerDialogButton/QRCodeScannerDialogButton.tsx index 3e2bd58a..56b5f8f4 100644 --- a/packages/components/src/components/QRCodeScannerDialogButton/QRCodeScannerDialogButton.tsx +++ b/packages/components/src/components/QRCodeScannerDialogButton/QRCodeScannerDialogButton.tsx @@ -1,25 +1,41 @@ import React, { useState } from 'react'; import { Button } from '@mui/material'; import { CredentialPayload } from '@vckit/core-types'; -import { publicAPI } from '@mock-app/services' +import { publicAPI } from '@mock-app/services'; import { ScannerDialog } from './ScannerDialog.js'; import { Status, ToastMessage, toastMessage } from '../ToastMessage/ToastMessage.js'; +import { ImportDataType } from '../../types/common.types.js'; +import { processVerifiableCredentialData } from '../../utils/importDataHelpers.js'; export interface IQRCodeScannerDialogButton { - onChange: (credential: CredentialPayload) => void; + onChange: (data: { [k: string]: CredentialPayload }) => void; style?: React.CSSProperties; + type?: ImportDataType; + vcOptions?: { + credentialPath: string; + }; } -export const QRCodeScannerDialogButton = ({ onChange, style}: IQRCodeScannerDialogButton) => { +export const QRCodeScannerDialogButton = ({ + onChange, + style, + type = ImportDataType.VerifiableCredential, + vcOptions, +}: IQRCodeScannerDialogButton) => { const [isOpenScanDialog, setIsOpenScanDialog] = useState(false); const getQRCodeDataFromUrl = async (url: string) => { try { // Attempt to check url params is valid URL , if it fails, it will throw an error - new URL(url) + new URL(url); const credential = await publicAPI.get(url); - await onChange(credential); + if (type === ImportDataType.VerifiableCredential) { + const processedData = await processVerifiableCredentialData(credential, vcOptions?.credentialPath); + onChange({ [url]: processedData }); + } else { + onChange({ [url]: credential }); + } } catch (error) { const e = error as Error; toastMessage({ status: Status.error, message: e.message }); diff --git a/packages/components/src/components/RenderCheckList/RenderCheckList.tsx b/packages/components/src/components/RenderCheckList/RenderCheckList.tsx index dfbbc99d..bfc11543 100644 --- a/packages/components/src/components/RenderCheckList/RenderCheckList.tsx +++ b/packages/components/src/components/RenderCheckList/RenderCheckList.tsx @@ -30,18 +30,12 @@ export const RenderCheckList = ({ checkBoxLabel, requiredFieldPath, onChange, ne const uploadedFiles = []; if (Array.isArray(data)) { uploadedFiles.push(...data); - } - if (typeof data === 'object') { + } else if (typeof data === 'object') { uploadedFiles.push(data); } const validItems = uploadedFiles.reduce((acc, item) => { - const requiredFieldValue = getValueByPath(item, requiredFieldPath); - if (!requiredFieldValue) { - return acc; - } - - return { ...acc, [requiredFieldValue]: item }; + return { ...acc, ...item }; }, {}); return setCheckBoxes((prev) => ({ ...prev, ...validItems })); diff --git a/packages/components/src/components/Scanner/Scanner.tsx b/packages/components/src/components/Scanner/Scanner.tsx index 636dfab6..fc2253ad 100644 --- a/packages/components/src/components/Scanner/Scanner.tsx +++ b/packages/components/src/components/Scanner/Scanner.tsx @@ -1,8 +1,17 @@ -import React, { forwardRef, useImperativeHandle, useState, useCallback, useEffect, useMemo, memo, ForwardedRef } from 'react'; -import {CameraswitchRounded} from '@mui/icons-material'; +import React, { + forwardRef, + useImperativeHandle, + useState, + useCallback, + useEffect, + useMemo, + memo, + ForwardedRef, +} from 'react'; +import { CameraswitchRounded } from '@mui/icons-material'; import { Html5Qrcode } from 'html5-qrcode'; import { Box } from '@mui/material'; -import { detectDevice } from '../../utils/index.js'; +import { detectDevice } from '../../utils/helpers.js'; import { DeviceTypeEnum, FacingCameraEnum, IHtml5QrcodePluginProps, IScannerRef } from '../../types/scanner.types.js'; /** @@ -15,11 +24,14 @@ const Scanner = forwardRef((props: IHtml5QrcodePluginProps, ref: ForwardedRef ({ - fps: props.fps || 10, - qrbox: props.qrbox || { width: 250, height: 250 }, - disableFlip: props.disableFlip || false, - }), [props.fps, props.qrbox, props.disableFlip]); + const config = useMemo( + () => ({ + fps: props.fps || 10, + qrbox: props.qrbox || { width: 250, height: 250 }, + disableFlip: props.disableFlip || false, + }), + [props.fps, props.qrbox, props.disableFlip], + ); /** * create method with hook to use in parent with ref. diff --git a/packages/components/src/types/common.types.ts b/packages/components/src/types/common.types.ts index 04f4f3f5..8a854d36 100644 --- a/packages/components/src/types/common.types.ts +++ b/packages/components/src/types/common.types.ts @@ -2,3 +2,7 @@ export interface IComponentFunc { onChange: ({ data, errors }: { data: any; errors?: any[] }) => void; } +export enum ImportDataType { + VerifiableCredential = 'VerifiableCredential', + JSON = 'JSON', +} diff --git a/packages/components/src/utils/importDataHelpers.ts b/packages/components/src/utils/importDataHelpers.ts new file mode 100644 index 00000000..f5ddc895 --- /dev/null +++ b/packages/components/src/utils/importDataHelpers.ts @@ -0,0 +1,30 @@ +import { verifyVC, decodeEnvelopedVC } from '@mock-app/services'; +import { VerifiableCredential } from '@vckit/core-types'; +import JSONPointer from 'jsonpointer'; + +export const processVerifiableCredentialData = async (data: any, credentialPath?: string) => { + try { + let vc: VerifiableCredential = data as VerifiableCredential; + if (credentialPath) { + vc = JSONPointer.get(data, credentialPath); + } + + const result = await verifyVC(vc); + if (!result.verified) { + throw new Error('Invalid Verifiable Credential!'); + } + const decodedEnvelopedVC = decodeEnvelopedVC(vc); + if (decodedEnvelopedVC) { + const vcData = { vc, decodedEnvelopedVC }; + if (credentialPath) { + JSONPointer.set(data, credentialPath, vcData); + } else { + data = vcData; + } + } + + return data; + } catch (error: any) { + throw new Error(error); + } +}; diff --git a/packages/components/src/utils/index.ts b/packages/components/src/utils/index.ts index 2942c10a..2354acab 100644 --- a/packages/components/src/utils/index.ts +++ b/packages/components/src/utils/index.ts @@ -1 +1,2 @@ export * from './helpers.js'; +export * from './importDataHelpers.js'; diff --git a/packages/mock-app/src/pages/Verify.tsx b/packages/mock-app/src/pages/Verify.tsx index e22c0e98..ac33f41b 100644 --- a/packages/mock-app/src/pages/Verify.tsx +++ b/packages/mock-app/src/pages/Verify.tsx @@ -1,5 +1,5 @@ import { Status } from '@mock-app/components'; -import { computeHash, decryptCredential, privateAPI, publicAPI } from '@mock-app/services'; +import { computeHash, decryptCredential, privateAPI, publicAPI, verifyVC } from '@mock-app/services'; import { IVerifyResult, VerifiableCredential } from '@vckit/core-types'; import * as jose from 'jose'; import React, { useCallback, useEffect, useState } from 'react'; @@ -97,17 +97,9 @@ const Verify = () => { // TODO: Move this function to the vckit service const verifyCredential = async (verifiableCredential: VerifiableCredential) => { try { - const verifyCredentialParams = { - credential: verifiableCredential, - fetchRemoteContexts: true, - policies: { - credentialStatus: true, - }, - }; - const verifyServiceUrl = appConfig.defaultVerificationServiceLink.href; - privateAPI.setBearerTokenAuthorizationHeaders(appConfig.defaultVerificationServiceLink.apiKey ?? ''); - const verifiedCredentialResult = await privateAPI.post(verifyServiceUrl, verifyCredentialParams); + const verifiedCredentialResult = await verifyVC(verifiableCredential, verifyServiceUrl); + showVerifiedCredentialResult(verifiedCredentialResult); } catch (error) { displayErrorUI(); diff --git a/packages/services/package.json b/packages/services/package.json index 94324533..f0888c4e 100644 --- a/packages/services/package.json +++ b/packages/services/package.json @@ -25,6 +25,7 @@ "babel-jest": "^29.7.0", "digitallink_toolkit_server": "file:../../digitallink_toolkit_server", "jsonpointer": "^5.0.1", + "jose": "^5.9.3", "lodash": "^4.17.21", "moment": "^2.30.1", "uuid": "^9.0.1" diff --git a/packages/services/src/__tests__/aggregationEvent.test.ts b/packages/services/src/__tests__/aggregationEvent.test.ts index ad6e5a1c..482eede5 100644 --- a/packages/services/src/__tests__/aggregationEvent.test.ts +++ b/packages/services/src/__tests__/aggregationEvent.test.ts @@ -11,6 +11,7 @@ import { aggregationEventMock } from './mocks/constants'; jest.mock('../vckit.service', () => ({ issueVC: jest.fn(), + decodeEnvelopedVC: jest.fn(), })); jest.mock('../storage.service', () => ({ uploadData: jest.fn(), @@ -56,7 +57,8 @@ describe('processAggregationEvent', () => { it('should process aggregation event', async () => { (vckitService.issueVC as jest.Mock).mockImplementationOnce(() => aggregationVCMock); - (uploadData as jest.Mock).mockResolvedValueOnce('https://exampleStorage.com/vc.json'); + (vckitService.decodeEnvelopedVC as jest.Mock).mockReturnValue(aggregationVCMock); + (uploadData as jest.Mock).mockResolvedValueOnce(aggregationEventDLRMock); jest .spyOn(validateContext, 'validateAggregationEventContext') @@ -64,10 +66,20 @@ describe('processAggregationEvent', () => { jest .spyOn(linkResolverService, 'getLinkResolverIdentifier') .mockReturnValueOnce({ identifier: '0123456789', qualifierPath: '/10/ABC123' }); + jest.spyOn(linkResolverService, 'getLinkResolverIdentifierFromURI').mockReturnValueOnce({ + identifier: '0123456789', + qualifierPath: '/10/ABC123', + elementString: '01012345678910ABC123', + }); + jest.spyOn(linkResolverService, 'registerLinkResolver').mockResolvedValueOnce(aggregationEventDLRMock); const aggregationVC = await processAggregationEvent(aggregationEvent, context); - expect(aggregationVC).toBe(aggregationVCMock); + expect(aggregationVC).toEqual({ + vc: aggregationVCMock, + decodedEnvelopedVC: aggregationVCMock, + linkResolver: aggregationEventDLRMock, + }); expect(uploadData).toHaveBeenCalled(); expect(validateContext.validateAggregationEventContext).toHaveBeenCalled(); expect(linkResolverService.registerLinkResolver).toHaveBeenCalled(); @@ -142,6 +154,8 @@ describe('processAggregationEvent', () => { storage: { ...context.storage, storageAPIUrl: 'https://invalid-storage-provider.com' }, }; (vckitService.issueVC as jest.Mock).mockImplementationOnce(() => aggregationVCMock); + (vckitService.decodeEnvelopedVC as jest.Mock).mockReturnValue(aggregationVCMock); + jest .spyOn(validateContext, 'validateAggregationEventContext') .mockReturnValueOnce({ ok: true, value: context } as Result); @@ -171,9 +185,12 @@ describe('processAggregationEvent', () => { dlr: { ...context.dlr, dlrAPIUrl: 'http://invalid-dlr.com' }, }; (vckitService.issueVC as jest.Mock).mockImplementationOnce(() => aggregationVCMock); + (vckitService.decodeEnvelopedVC as jest.Mock).mockReturnValue(aggregationVCMock); + (uploadData as jest.Mock).mockImplementation(({ url, _data, path }) => { return `${url}/${path}`; }); + jest .spyOn(validateContext, 'validateAggregationEventContext') .mockReturnValueOnce({ ok: true, value: context } as Result); diff --git a/packages/services/src/__tests__/epcisEvents/objectEvent.test.ts b/packages/services/src/__tests__/epcisEvents/objectEvent.test.ts index 4edc3209..1e0c4054 100644 --- a/packages/services/src/__tests__/epcisEvents/objectEvent.test.ts +++ b/packages/services/src/__tests__/epcisEvents/objectEvent.test.ts @@ -10,6 +10,7 @@ import { objectEventContext as context } from '../mocks/constants'; jest.mock('../../vckit.service', () => ({ issueVC: jest.fn(), + decodeEnvelopedVC: jest.fn(), })); jest.mock('../../storage.service', () => ({ uploadData: jest.fn(), @@ -60,6 +61,9 @@ describe('processObjectEvent', () => { (vckitService.issueVC as jest.Mock).mockImplementation(() => ({ credentialSubject: { id: 'https://example.com/123' }, })); + (vckitService.decodeEnvelopedVC as jest.Mock).mockReturnValue({ + credentialSubject: { id: 'https://example.com/123' }, + }); (uploadData as jest.Mock).mockResolvedValue('https://exampleStorage.com/vc.json'); jest diff --git a/packages/services/src/__tests__/processDPP.test.ts b/packages/services/src/__tests__/processDPP.test.ts index 2928cc19..4ef11cdb 100644 --- a/packages/services/src/__tests__/processDPP.test.ts +++ b/packages/services/src/__tests__/processDPP.test.ts @@ -1,11 +1,12 @@ import { processDPP } from '../processDPP.service'; -import { issueVC, contextDefault } from '../vckit.service'; +import { issueVC, contextDefault, decodeEnvelopedVC } from '../vckit.service'; import { uploadData } from '../storage.service'; import { registerLinkResolver, IdentificationKeyType, LinkType } from '../linkResolver.service'; import { contextDPP, dataDPP } from './mocks/constants'; jest.mock('../vckit.service', () => ({ issueVC: jest.fn(), + decodeEnvelopedVC: jest.fn(), contextDefault: ['https://www.w3.org/2018/credentials/v1', 'https://w3id.org/vc-revocation-list-2020/v1'], })); @@ -48,6 +49,10 @@ describe('processDPP', () => { return Promise.resolve(expectVCResult); }); + + (decodeEnvelopedVC as jest.Mock).mockReturnValue({ + credentialSubject: { id: 'https://example.com/123' }, + }); }); afterEach(() => { @@ -76,6 +81,9 @@ describe('processDPP', () => { const vc = await processDPP(dataDPP, contextDPP); expect(vc).toEqual({ vc: expectVCResult, + decodedEnvelopedVC: { + credentialSubject: { id: 'https://example.com/123' }, + }, linkResolver: contextDPP.dpp.dlrVerificationPage + '/' + diff --git a/packages/services/src/__tests__/processDigitalIdentityAnchor.test.ts b/packages/services/src/__tests__/processDigitalIdentityAnchor.test.ts index a18a0a85..92f9e22b 100644 --- a/packages/services/src/__tests__/processDigitalIdentityAnchor.test.ts +++ b/packages/services/src/__tests__/processDigitalIdentityAnchor.test.ts @@ -9,6 +9,7 @@ import { digitalIdentityAnchorContext as context } from './mocks/constants'; jest.mock('../vckit.service', () => ({ issueVC: jest.fn(), + decodeEnvelopedVC: jest.fn(), })); jest.mock('../storage.service', () => ({ uploadData: jest.fn(), @@ -40,6 +41,9 @@ describe('processDigitalIdentityAnchor', () => { (vckitService.issueVC as jest.Mock).mockImplementation(() => ({ credentialSubject: { id: 'https://example.com/123' }, })); + (vckitService.decodeEnvelopedVC as jest.Mock).mockReturnValue({ + credentialSubject: { id: 'https://example.com/123' }, + }); (uploadData as jest.Mock).mockResolvedValue('https://exampleStorage.com/vc.json'); jest diff --git a/packages/services/src/__tests__/transactionEvent.test.ts b/packages/services/src/__tests__/transactionEvent.test.ts index a657be23..a4989abc 100644 --- a/packages/services/src/__tests__/transactionEvent.test.ts +++ b/packages/services/src/__tests__/transactionEvent.test.ts @@ -8,9 +8,11 @@ import { Result } from '../types/validateContext'; import { ITransactionEventContext } from '../types/types'; import { publicAPI } from '../utils/httpService'; import { transactionEventMock } from './mocks/constants'; +import { decode } from 'punycode'; jest.mock('../vckit.service', () => ({ issueVC: jest.fn(), + decodeEnvelopedVC: jest.fn(), })); jest.mock('../storage.service', () => ({ uploadData: jest.fn(), @@ -68,9 +70,11 @@ describe('processTransactionEvent', () => { it('should process transaction event', async () => { (vckitService.issueVC as jest.Mock).mockImplementationOnce(() => transactionVCMock); + (vckitService.decodeEnvelopedVC as jest.Mock).mockReturnValue(transactionVCMock); (uploadData as jest.Mock).mockImplementation(({ url, _data, path }) => { return `${url}/${path}`; }); + jest .spyOn(validateContext, 'validateTransactionEventContext') .mockReturnValueOnce({ ok: true, value: context } as Result); @@ -80,6 +84,7 @@ describe('processTransactionEvent', () => { expect(transactionVC).toEqual({ vc: transactionVCMock, + decodedEnvelopedVC: transactionVCMock, linkResolver: transactionEventDLRMock, }); expect(uploadData).toHaveBeenCalled(); @@ -148,6 +153,8 @@ describe('processTransactionEvent', () => { storage: { ...context.storage, storageAPIUrl: 'https://invalid-storage-provider.com' }, }; (vckitService.issueVC as jest.Mock).mockImplementationOnce(() => transactionVCMock); + (vckitService.decodeEnvelopedVC as jest.Mock).mockReturnValue(transactionVCMock); + jest .spyOn(validateContext, 'validateTransactionEventContext') .mockReturnValueOnce({ ok: true, value: context } as Result); diff --git a/packages/services/src/__tests__/vckit.service.test.ts b/packages/services/src/__tests__/vckit.service.test.ts index f0baf966..fc76e41e 100644 --- a/packages/services/src/__tests__/vckit.service.test.ts +++ b/packages/services/src/__tests__/vckit.service.test.ts @@ -1,9 +1,17 @@ import { issueVC, issueCredentialStatus } from '../vckit.service'; import { privateAPI } from '../utils/httpService'; +import { decodeJwt } from 'jose'; +import appConfig from '../../../mock-app/src/constants/app-config.json'; +import { decodeEnvelopedVC, verifyVC } from '../vckit.service'; + +jest.mock('jose', () => ({ + decodeJwt: jest.fn(), +})); jest.mock('../utils/httpService', () => ({ privateAPI: { post: jest.fn(), + put: jest.fn(), setBearerTokenAuthorizationHeaders: jest.fn(), }, })); @@ -270,3 +278,110 @@ describe('vckit.service', () => { }); }); }); +jest.mock('../../../mock-app/src/constants/app-config.json', () => ({ + defaultVerificationServiceLink: { + href: 'https://example.com/credentials/verify', + apiKey: '123', + }, +})); + +describe('verifyVC', () => { + afterEach(() => { + jest.resetAllMocks(); + }); + + it('should call privateAPI.post with the correct arguments when vcKitAPIUrl is not provided', async () => { + const vc = { + '@context': ['https://www.w3.org/ns/credentials/v2', 'https://www.w3.org/ns/credentials/examples/v2'], + type: ['VerifiableCredential'], + issuer: 'did:web:localhost', + credentialSubject: { + id: 'did:web:localhost', + name: 'John Doe', + age: 30, + }, + } as any; + + await verifyVC(vc); + + expect(privateAPI.setBearerTokenAuthorizationHeaders).toHaveBeenCalledWith('123'); + expect(privateAPI.post).toHaveBeenCalledWith('https://example.com/credentials/verify', { + credential: vc, + fetchRemoteContexts: true, + policies: { + credentialStatus: true, + }, + }); + }); + + it('should call privateAPI.post with the correct arguments when vcKitAPIUrl is provided', async () => { + const vc = { + '@context': ['https://www.w3.org/ns/credentials/v2', 'https://www.w3.org/ns/credentials/examples/v2'], + type: ['VerifiableCredential'], + issuer: 'did:web:localhost', + credentialSubject: { + id: 'did:web:localhost', + name: 'John Doe', + age: 30, + }, + } as any; + + const vckitAPIUrl = 'https://example.vcservice.com/credentials/verify'; + + await verifyVC(vc, vckitAPIUrl); + + expect(privateAPI.setBearerTokenAuthorizationHeaders).toHaveBeenCalledWith('123'); + expect(privateAPI.post).toHaveBeenCalledWith('https://example.vcservice.com/credentials/verify', { + credential: vc, + fetchRemoteContexts: true, + policies: { + credentialStatus: true, + }, + }); + }); + + describe('decodeEnvelopedVC', () => { + afterEach(() => { + jest.resetAllMocks(); + }); + + it('should return null when vc is not enveloped', () => { + const vc = { + '@context': ['https://www.w3.org/ns/credentials/v2', 'https://www.w3.org/ns/credentials/examples/v2'], + type: ['VerifiableCredential'], + issuer: 'did:web:localhost', + credentialSubject: { + id: 'did:web:localhost', + name: 'John Doe', + age: 30, + }, + } as any; + + const result = decodeEnvelopedVC(vc); + + expect(result).toBeNull(); + }); + + it('should return the decoded vc when vc is enveloped', () => { + const vc = { + '@context': ['https://www.w3.org/ns/credentials/v2', 'https://www.w3.org/ns/credentials/examples/v2'], + type: 'EnvelopedVerifiableCredential', + id: 'data:application/vc-ld+jwt,jwt.abc.123', + } as any; + + (decodeJwt as jest.Mock).mockReturnValue({ + '@context': ['https://www.w3.org/ns/credentials/v2', 'https://www.w3.org/ns/credentials/examples/v2'], + type: ['VerifiableCredential'], + issuer: 'did:web:localhost', + credentialSubject: { + id: 'did:web:localhost', + name: 'John Doe', + age: 30, + }, + }); + + const result = decodeEnvelopedVC(vc); + expect(result).not.toBeNull(); + }); + }); +}); diff --git a/packages/services/src/epcisEvents/aggregationEvent.ts b/packages/services/src/epcisEvents/aggregationEvent.ts index 82576896..e0bc71f0 100644 --- a/packages/services/src/epcisEvents/aggregationEvent.ts +++ b/packages/services/src/epcisEvents/aggregationEvent.ts @@ -1,5 +1,4 @@ -import { VerifiableCredential } from '@vckit/core-types'; -import { issueVC } from '../vckit.service.js'; +import { decodeEnvelopedVC, issueVC } from '../vckit.service.js'; import { uploadData } from '../storage.service.js'; import { LinkType, getLinkResolverIdentifier, registerLinkResolver } from '../linkResolver.service.js'; import { IService } from '../types/IService.js'; @@ -11,7 +10,7 @@ import { EPCISBusinessStepCode, EPCISEventAction, EPCISEventDisposition, EPCISEv export const processAggregationEvent: IService = async ( aggregationEvent: ITraceabilityEvent, context: IAggregationEventContext, -): Promise => { +): Promise => { const validationResult = validateAggregationEventContext(context); if (!validationResult.ok) { throw new Error(validationResult.value); @@ -49,6 +48,7 @@ export const processAggregationEvent: IService = async ( }, }); + const decodedEnvelopedVC = decodeEnvelopedVC(aggregationVC); const aggregationVCLink = await uploadData(storage, aggregationVC, generateUUID()); await registerLinkResolver( @@ -64,5 +64,5 @@ export const processAggregationEvent: IService = async ( qualifierPath, ); - return aggregationVC; + return { vc: aggregationVC, decodedEnvelopedVC, linkResolver: aggregationVCLink }; }; diff --git a/packages/services/src/epcisEvents/objectEvent.ts b/packages/services/src/epcisEvents/objectEvent.ts index 79294e21..34c15791 100644 --- a/packages/services/src/epcisEvents/objectEvent.ts +++ b/packages/services/src/epcisEvents/objectEvent.ts @@ -3,7 +3,7 @@ import { registerLinkResolver, LinkType, getLinkResolverIdentifier } from '../li import { uploadData } from '../storage.service.js'; import { IService } from '../types/IService.js'; import { constructIdentifierString, generateUUID } from '../utils/helpers.js'; -import { issueVC } from '../vckit.service.js'; +import { decodeEnvelopedVC, issueVC } from '../vckit.service.js'; import { ITraceabilityEvent, IObjectEventContext } from '../types/index.js'; import { validateObjectEventContext } from '../validateContext.js'; @@ -46,6 +46,7 @@ export const processObjectEvent: IService = async ( }, }); + const decodedEnvelopedVC = decodeEnvelopedVC(objectEventVc); const objectEventVcUrl = await uploadData(storage, objectEventVc, generateUUID()); const objectEventLinkResolver = await registerLinkResolver( @@ -62,5 +63,5 @@ export const processObjectEvent: IService = async ( LinkType.epcisLinkType, ); - return { vc: objectEventVc, linkResolver: objectEventLinkResolver }; + return { vc: objectEventVc, decodedEnvelopedVC, linkResolver: objectEventLinkResolver }; }; diff --git a/packages/services/src/epcisEvents/transactionEvent.ts b/packages/services/src/epcisEvents/transactionEvent.ts index 6025b363..de838832 100644 --- a/packages/services/src/epcisEvents/transactionEvent.ts +++ b/packages/services/src/epcisEvents/transactionEvent.ts @@ -1,6 +1,6 @@ import { VerifiableCredential } from '@vckit/core-types'; import { IService, ITraceabilityEvent, ITransactionEventContext } from '../types/index.js'; -import { issueVC } from '../vckit.service.js'; +import { decodeEnvelopedVC, issueVC } from '../vckit.service.js'; import { uploadData } from '../storage.service.js'; import { constructIdentifierString, generateUUID } from '../utils/helpers.js'; import { LinkType, getLinkResolverIdentifier, registerLinkResolver } from '../linkResolver.service.js'; @@ -36,6 +36,7 @@ export const processTransactionEvent: IService = async ( }, }); + const decodedEnvelopedVC = decodeEnvelopedVC(vc); const vcUrl = await uploadData(storage, vc, generateUUID()); const linkResolver = await registerLinkResolver( @@ -58,5 +59,5 @@ export const processTransactionEvent: IService = async ( localStorageParams.keyPath, ); - return { vc, linkResolver }; + return { vc, decodedEnvelopedVC, linkResolver }; }; diff --git a/packages/services/src/epcisEvents/transformationEvent.ts b/packages/services/src/epcisEvents/transformationEvent.ts index 79af6d72..632c6ae4 100644 --- a/packages/services/src/epcisEvents/transformationEvent.ts +++ b/packages/services/src/epcisEvents/transformationEvent.ts @@ -27,7 +27,7 @@ import JSONPointer from 'jsonpointer'; /** * Process transformation event, issue epcis transformation event and dpp for each identifiers, then upload to storage and register link resolver for each dpp - * @param data - data for the transformation event, which nlsids are selected + * @param data - data for the transformation event * @param context - context for the transformation event */ export const processTransformationEvent: IService = async ( @@ -143,7 +143,7 @@ export const issueEpcisTransformationEvent = async ( dlrContext.dlrAPIUrl, dlrContext.namespace, IdentificationKeyType.gtin, - `linkType=${LinkType.certificationLinkType}`, + `linkType=${dlrContext.namespace}:${LinkType.certificationLinkType}`, ), generateIdWithBatchLot, generateCurrentDatetime, diff --git a/packages/services/src/processDPP.service.ts b/packages/services/src/processDPP.service.ts index 3e2ef54d..6e00b469 100644 --- a/packages/services/src/processDPP.service.ts +++ b/packages/services/src/processDPP.service.ts @@ -3,7 +3,7 @@ import { IDppContext, IService } from './types/index.js'; import { constructIdentifierString, generateUUID } from './utils/helpers.js'; import { uploadData } from './storage.service.js'; -import { issueVC } from './vckit.service.js'; +import { decodeEnvelopedVC, issueVC } from './vckit.service.js'; import { validateContextDPP } from './validateContext.js'; import { deleteItemFromLocalStorage } from './features/localStorage.service.js'; import { LinkType, getLinkResolverIdentifier, registerLinkResolver } from './linkResolver.service.js'; @@ -38,6 +38,8 @@ export const processDPP: IService = async (data: any, context: IDppContext): Pro restOfVC, }); + const decodedEnvelopedVC = decodeEnvelopedVC(vc); + const storageContext = context.storage; const vcUrl = await uploadData(storageContext, vc, generateUUID()); @@ -60,7 +62,7 @@ export const processDPP: IService = async (data: any, context: IDppContext): Pro deleteItemFromLocalStorage(context.localStorageParams); } - return { vc, linkResolver }; + return { vc, decodedEnvelopedVC, linkResolver }; } catch (error: any) { throw new Error(error.message ?? 'Error processing DPP'); } diff --git a/packages/services/src/processDigitalIdentityAnchor.service.ts b/packages/services/src/processDigitalIdentityAnchor.service.ts index 78e7db8d..f9729133 100644 --- a/packages/services/src/processDigitalIdentityAnchor.service.ts +++ b/packages/services/src/processDigitalIdentityAnchor.service.ts @@ -3,7 +3,7 @@ import { registerLinkResolver, LinkType, getLinkResolverIdentifier } from './lin import { uploadData } from './storage.service.js'; import { IService } from './types/IService.js'; import { constructIdentifierString, generateUUID } from './utils/helpers.js'; -import { issueVC } from './vckit.service.js'; +import { decodeEnvelopedVC, issueVC } from './vckit.service.js'; import { ITraceabilityEvent, IDigitalIdentityAnchorContext } from './types/index.js'; import { validateDigitalIdentityAnchorContext } from './validateContext.js'; @@ -45,6 +45,7 @@ export const processDigitalIdentityAnchor: IService = async ( }, }); + const decodedEnvelopedVC = decodeEnvelopedVC(vc); const vcUrl = await uploadData(storage, vc, generateUUID()); const linkResolver = await registerLinkResolver( @@ -61,5 +62,5 @@ export const processDigitalIdentityAnchor: IService = async ( LinkType.certificationLinkType, ); - return { vc, linkResolver }; + return { vc, decodedEnvelopedVC, linkResolver }; }; diff --git a/packages/services/src/vckit.service.ts b/packages/services/src/vckit.service.ts index b9df5967..2d304bac 100644 --- a/packages/services/src/vckit.service.ts +++ b/packages/services/src/vckit.service.ts @@ -4,7 +4,10 @@ import { VerifiableCredential, CredentialStatusReference, IssuerType, + IVerifyResult, + UnsignedCredential, } from '@vckit/core-types'; +import { decodeJwt } from 'jose'; import { privateAPI } from './utils/httpService.js'; import { isPlainObject, every, isString } from 'lodash'; @@ -150,3 +153,41 @@ const constructCredentialObject = ({ context, type, issuer, credentialSubject, . }, }; }; + +/** + * Integrate with vckit to verify VC + * @param verifiableCredential + * @param vcKitAPIUrl + * @returns + */ +export const verifyVC = async ( + verifiableCredential: VerifiableCredential, + vcKitAPIUrl?: string, +): Promise => { + const verifyCredentialParams = { + credential: verifiableCredential, + fetchRemoteContexts: true, + policies: { + credentialStatus: true, + }, + }; + + privateAPI.setBearerTokenAuthorizationHeaders(appConfig.defaultVerificationServiceLink.apiKey ?? ''); + return await privateAPI.post( + vcKitAPIUrl || appConfig.defaultVerificationServiceLink.href, + verifyCredentialParams, + ); +}; + +/** + * Decode enveloped VC + * @param vc + * @returns + */ +export const decodeEnvelopedVC = (vc: VerifiableCredential): UnsignedCredential | null => { + if (vc?.type === 'EnvelopedVerifiableCredential') { + const encodedCredential = vc?.id?.split(',')[1]; + return decodeJwt(encodedCredential as string) as UnsignedCredential; + } + return null; +}; From bd1d2a70903a118176f084b51257f9b9a5515f91 Mon Sep 17 00:00:00 2001 From: Nam Hoang Date: Tue, 22 Oct 2024 11:18:29 +0700 Subject: [PATCH 02/17] fix: test failed on components --- .../src/__tests__/CheckBoxList.test.tsx | 25 ++- .../__tests__/ConformityCredential.test.tsx | 2 +- .../ConformityCredentialCheckbox.test.tsx | 2 +- .../src/__tests__/DownloadButton.test.tsx | 10 +- .../src/__tests__/ImportButton.test.tsx | 4 +- .../src/__tests__/RenderCheckList.test.tsx | 143 +++++++----------- .../components/CheckBoxList/CheckBoxList.tsx | 2 +- .../components/ImportButton/ImportButton.tsx | 2 +- .../RenderCheckList/RenderCheckList.tsx | 4 +- .../__tests__/Footer/Footer.test.tsx | 2 +- .../__tests__/Header/Header.test.tsx | 2 +- .../__tests__/Layout/Layout.test.tsx | 4 +- .../ToastMessage/ToastMessage.test.tsx | 4 +- 13 files changed, 79 insertions(+), 127 deletions(-) diff --git a/packages/components/src/__tests__/CheckBoxList.test.tsx b/packages/components/src/__tests__/CheckBoxList.test.tsx index c2934a60..263d2421 100644 --- a/packages/components/src/__tests__/CheckBoxList.test.tsx +++ b/packages/components/src/__tests__/CheckBoxList.test.tsx @@ -40,7 +40,7 @@ describe('render CheckBoxList component', () => { fireEvent.click(checkbox1); expect(checkbox1).toBeChecked(); - expect(data).toEqual({ label1: { checked: true, value: { value: 'value1' } } }); + expect(data).toEqual({ label1: { value: 'value1' } }); }); it('Should call onChange with the selected items when multiple checkbox are checked', () => { @@ -65,9 +65,7 @@ describe('render CheckBoxList component', () => { expect(checkbox2).not.toBeChecked(); expect(checkbox3).not.toBeChecked(); expect(CheckBoxListState).toEqual({ - label1: { checked: true, value: { value: 'value1' } }, - label2: { value: { value: 'value2' } }, - label3: { value: { value: 'value3' } }, + label1: { value: 'value1' }, }); // Check the second checkbox @@ -76,9 +74,8 @@ describe('render CheckBoxList component', () => { expect(checkbox2).toBeChecked(); expect(checkbox3).not.toBeChecked(); expect(CheckBoxListState).toEqual({ - label1: { checked: true, value: { value: 'value1' } }, - label2: { checked: true, value: { value: 'value2' } }, - label3: { value: { value: 'value3' } }, + label1: { value: 'value1' }, + label2: { value: 'value2' }, }); // Check the third checkbox @@ -87,9 +84,9 @@ describe('render CheckBoxList component', () => { expect(checkbox2).toBeChecked(); expect(checkbox3).toBeChecked(); expect(CheckBoxListState).toEqual({ - label1: { checked: true, value: { value: 'value1' } }, - label2: { checked: true, value: { value: 'value2' } }, - label3: { checked: true, value: { value: 'value3' } }, + label1: { value: 'value1' }, + label2: { value: 'value2' }, + label3: { value: 'value3' }, }); }); @@ -112,18 +109,14 @@ describe('render CheckBoxList component', () => { expect(checkbox1).toBeChecked(); expect(checkbox2).not.toBeChecked(); expect(CheckBoxListState).toEqual({ - label1: { checked: true, value: { value: 'value1' } }, - label2: { value: { value: 'value2' } }, + label1: { value: 'value1' }, }); // Uncheck the first checkbox fireEvent.click(checkbox1); expect(checkbox1).not.toBeChecked(); expect(checkbox2).not.toBeChecked(); - expect(CheckBoxListState).toEqual({ - label1: { checked: false, value: { value: 'value1' } }, - label2: { value: { value: 'value2' } }, - }); + expect(CheckBoxListState).toEqual({}); }); it("Should display the default label 'CheckBoxList' when no label prop is provided", () => { diff --git a/packages/components/src/__tests__/ConformityCredential.test.tsx b/packages/components/src/__tests__/ConformityCredential.test.tsx index eee8123b..28d29313 100644 --- a/packages/components/src/__tests__/ConformityCredential.test.tsx +++ b/packages/components/src/__tests__/ConformityCredential.test.tsx @@ -9,6 +9,7 @@ jest.mock('@mock-app/services', () => ({ uploadData: jest.fn(), generateUUID: jest.fn(), getJsonDataFromConformityAPI: jest.fn(), + getValueByPath: jest.fn(), })); jest.mock('../components/ToastMessage/ToastMessage', () => ({ @@ -18,7 +19,6 @@ jest.mock('../components/ToastMessage/ToastMessage', () => ({ })); jest.mock('../components/ConformityCredential/utils', () => ({ - getValueByPath: jest.fn(), checkStoredCredentialsConfig: jest.fn(), })); diff --git a/packages/components/src/__tests__/ConformityCredentialCheckbox.test.tsx b/packages/components/src/__tests__/ConformityCredentialCheckbox.test.tsx index 2ae636b0..c190504c 100644 --- a/packages/components/src/__tests__/ConformityCredentialCheckbox.test.tsx +++ b/packages/components/src/__tests__/ConformityCredentialCheckbox.test.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { render, screen, fireEvent } from '@testing-library/react'; -import { ConformityCredentialCheckbox } from '../components'; +import { ConformityCredentialCheckbox } from '../components/ConformityCredentialCheckBox'; import { getCaseInsensitive } from '../components/ConformityCredentialCheckBox/utils'; jest.mock('../components/ConformityCredentialCheckBox/utils', () => ({ diff --git a/packages/components/src/__tests__/DownloadButton.test.tsx b/packages/components/src/__tests__/DownloadButton.test.tsx index becc7655..f22f1000 100644 --- a/packages/components/src/__tests__/DownloadButton.test.tsx +++ b/packages/components/src/__tests__/DownloadButton.test.tsx @@ -1,7 +1,7 @@ /* eslint-disable testing-library/no-node-access */ import React from 'react'; import { render, screen, fireEvent } from '@testing-library/react'; -import { DownloadButton, DownloadFileType } from '..'; +import { DownloadButton, DownloadFileType } from '../components/DownloadButton/DownloadButton'; describe('DownloadButton', () => { const jsonData = { key: 'value' }; @@ -17,7 +17,7 @@ describe('DownloadButton', () => { fileName={fileName} fileExtension={fileExtensionJson} fileType={DownloadFileType.json} - /> + />, ); // Check if the rendered button with default text is in the document @@ -34,7 +34,7 @@ describe('DownloadButton', () => { fileName={fileName} fileExtension={fileExtensionJson} fileType={DownloadFileType.json} - /> + />, ); // Check if the rendered button with custom text is in the document @@ -52,7 +52,7 @@ describe('DownloadButton', () => { fileName={fileName} fileExtension={fileExtensionJson} fileType={DownloadFileType.json} - /> + />, ); // Find the download button and simulate a click @@ -74,7 +74,7 @@ describe('DownloadButton', () => { fileName={fileName} fileExtension={fileExtensionTxt} fileType={DownloadFileType.plainText} - /> + />, ); // Find the download button and simulate a click diff --git a/packages/components/src/__tests__/ImportButton.test.tsx b/packages/components/src/__tests__/ImportButton.test.tsx index 181dcb19..bf7931b7 100644 --- a/packages/components/src/__tests__/ImportButton.test.tsx +++ b/packages/components/src/__tests__/ImportButton.test.tsx @@ -3,10 +3,10 @@ import React from 'react'; import { render, screen, fireEvent, waitFor } from '@testing-library/react'; import { ImportButton } from '../components/ImportButton/ImportButton'; -import { processVerifiableCredentialData } from '../utils/index.js'; +import { processVerifiableCredentialData } from '../utils/importDataHelpers.js'; import { ImportDataType } from '../types/common.types'; -jest.mock('../utils/index.js', () => ({ +jest.mock('../utils/importDataHelpers.js', () => ({ processVerifiableCredentialData: jest.fn(), })); diff --git a/packages/components/src/__tests__/RenderCheckList.test.tsx b/packages/components/src/__tests__/RenderCheckList.test.tsx index 36c8c819..96b789e1 100644 --- a/packages/components/src/__tests__/RenderCheckList.test.tsx +++ b/packages/components/src/__tests__/RenderCheckList.test.tsx @@ -1,19 +1,27 @@ import React from 'react'; import { act, fireEvent, render, screen, waitFor } from '@testing-library/react'; import { RenderCheckList } from '../components/RenderCheckList/RenderCheckList'; -import * as DynamicComponentRendererComponent from '../components/DynamicComponentRenderer/DynamicComponentRenderer'; +import { IDynamicComponentRendererProps } from '../components/DynamicComponentRenderer/DynamicComponentRenderer'; +import { processVerifiableCredentialData } from '../utils/importDataHelpers.js'; jest.mock('../components/ConformityCredential/index.ts', () => ({})); +jest.mock('../utils/importDataHelpers.js', () => ({ + processVerifiableCredentialData: jest.fn(), +})); + +jest.mock('@mock-app/services', () => ({ + publicAPI: jest.fn(), +})); + describe('render RenderCheckList component', () => { const checkBoxLabel = 'checkBoxLabel'; - const requiredFieldPath = '/requiredField1'; const nestedComponents = [ { name: 'ImportButton', type: 'EntryData', - props: { label: 'Import JSON' }, - } as DynamicComponentRendererComponent.IDynamicComponentRendererProps, + props: { label: 'Import JSON', type: 'JSON' }, + } as IDynamicComponentRendererProps, ]; const onChange = jest.fn(); @@ -22,14 +30,7 @@ describe('render RenderCheckList component', () => { let componentError: any; try { - render( - , - ); + render(); } catch (error) { // If an error is thrown during rendering, catch it and assign it to componentError componentError = error; @@ -40,14 +41,7 @@ describe('render RenderCheckList component', () => { }); it('Should display an ImportButton component when "nestedComponents" prop have ImportButton item', () => { - render( - , - ); + render(); // This assumes that the ImportButton component displays this text const importButton = screen.getByText('Import JSON'); @@ -57,14 +51,7 @@ describe('render RenderCheckList component', () => { }); it('Should not display a CheckboxList component when renderCheckboxList state is empty', () => { - render( - , - ); + render(); // Use screen.queryByLabelText to find an element with the label text equal to checkBoxLabel const checkboxList = screen.queryByLabelText(checkBoxLabel); @@ -78,17 +65,10 @@ describe('render RenderCheckList component', () => { name: 'InvalidComponent', type: 'EntryData', props: { label: 'Import JSON' }, - } as DynamicComponentRendererComponent.IDynamicComponentRendererProps; + } as IDynamicComponentRendererProps; const nestedComponents = [nestedComponent]; - render( - , - ); + render(); // Try to find an element with the text 'Import JSON' const importButton = screen.queryByText('Import JSON'); @@ -101,14 +81,7 @@ describe('render RenderCheckList component', () => { type: 'application/json', }); - render( - , - ); + render(); // Find the import button and simulate a change event with a JSON file const importButton = screen.getByTestId('file-input'); @@ -118,7 +91,7 @@ describe('render RenderCheckList component', () => { // Wait for the checkbox to appear and assert that it's checked after being clicked await waitFor(() => { - const checkBox1 = screen.getByLabelText('label-test-1'); + const checkBox1 = screen.getByLabelText('vc.json'); expect(checkBox1).not.toBeChecked(); checkBox1.click(); @@ -136,7 +109,6 @@ describe('render RenderCheckList component', () => { render( , @@ -150,10 +122,10 @@ describe('render RenderCheckList component', () => { // Wait for the checkbox to appear, click it, and assert that the onChange prop was called with the correct data await waitFor(() => { - const checkBox1 = screen.getByLabelText('label-test-1'); + const checkBox1 = screen.getByLabelText('vc.json'); checkBox1.click(); - expect(checkBoxListData).toEqual([{ label: 'label-test-1', value: { requiredField1: 'label-test-1' } }]); + expect(checkBoxListData).toEqual({ 'vc.json': { requiredField1: 'label-test-1' } }); }); }); @@ -164,14 +136,7 @@ describe('render RenderCheckList component', () => { new File([JSON.stringify({ requiredField1: 'label-test-3' })], 'vc3.json', { type: 'application/json' }), ]; - render( - , - ); + render(); // Find the import button and simulate a change event with multiple JSON files const importButton = screen.getByTestId('file-input'); @@ -181,9 +146,9 @@ describe('render RenderCheckList component', () => { // Wait for the checkboxes to appear, click them, and assert that they are checked await waitFor(() => { - const checkBox1 = screen.getByLabelText('label-test-1'); - const checkBox2 = screen.getByLabelText('label-test-2'); - const checkBox3 = screen.getByLabelText('label-test-3'); + const checkBox1 = screen.getByLabelText('vc1.json'); + const checkBox2 = screen.getByLabelText('vc2.json'); + const checkBox3 = screen.getByLabelText('vc3.json'); checkBox1.click(); checkBox2.click(); @@ -205,7 +170,6 @@ describe('render RenderCheckList component', () => { render( , @@ -220,13 +184,13 @@ describe('render RenderCheckList component', () => { // Wait for the checkbox to appear, assert that it's not checked and the onChange prop was not called, // then click the checkbox and assert that it's checked and the onChange prop was called with the correct data await waitFor(() => { - const checkBox1 = screen.getByLabelText('label-test-1'); + const checkBox1 = screen.getByLabelText('vc1.json'); expect(checkBox1).not.toBeChecked(); expect(checkBoxListData).toEqual([]); checkBox1.click(); expect(checkBox1).toBeChecked(); - expect(checkBoxListData).toEqual([{ label: 'label-test-1', value: { requiredField1: 'label-test-1' } }]); + expect(checkBoxListData).toEqual({ 'vc1.json': { requiredField1: 'label-test-1' } }); }); }); @@ -240,7 +204,6 @@ describe('render RenderCheckList component', () => { render( , @@ -255,14 +218,14 @@ describe('render RenderCheckList component', () => { // Wait for the checkbox to appear, click it to check it, assert that it's checked and the onChange prop was called with the correct data, // then click it again to uncheck it and assert that it's not checked and the onChange prop was called with an empty array await waitFor(() => { - const checkBox1 = screen.getByLabelText('label-test-1'); + const checkBox1 = screen.getByLabelText('vc1.json'); checkBox1.click(); expect(checkBox1).toBeChecked(); - expect(checkBoxListData).toEqual([{ label: 'label-test-1', value: { requiredField1: 'label-test-1' } }]); + expect(checkBoxListData).toEqual({ 'vc1.json': { requiredField1: 'label-test-1' } }); checkBox1.click(); expect(checkBox1).not.toBeChecked(); - expect(checkBoxListData).toEqual([]); + expect(checkBoxListData).toEqual({}); }); }); @@ -278,7 +241,6 @@ describe('render RenderCheckList component', () => { render( , @@ -292,28 +254,28 @@ describe('render RenderCheckList component', () => { // Wait for the checkboxes to appear, click them, and assert that they are checked and the onChange prop was called with the correct data await waitFor(() => { - const checkBox1 = screen.getByLabelText('label-test-1'); - const checkBox2 = screen.getByLabelText('label-test-2'); - const checkBox3 = screen.getByLabelText('label-test-3'); + const checkBox1 = screen.getByLabelText('vc1.json'); + const checkBox2 = screen.getByLabelText('vc2.json'); + const checkBox3 = screen.getByLabelText('vc3.json'); checkBox1.click(); expect(checkBox1).toBeChecked(); - expect(checkBoxListData).toEqual([{ label: 'label-test-1', value: { requiredField1: 'label-test-1' } }]); + expect(checkBoxListData).toEqual({ 'vc1.json': { requiredField1: 'label-test-1' } }); checkBox2.click(); expect(checkBox2).toBeChecked(); - expect(checkBoxListData).toEqual([ - { label: 'label-test-1', value: { requiredField1: 'label-test-1' } }, - { label: 'label-test-2', value: { requiredField1: 'label-test-2' } }, - ]); + expect(checkBoxListData).toEqual({ + 'vc1.json': { requiredField1: 'label-test-1' }, + 'vc2.json': { requiredField1: 'label-test-2' }, + }); checkBox3.click(); expect(checkBox3).toBeChecked(); - expect(checkBoxListData).toEqual([ - { label: 'label-test-1', value: { requiredField1: 'label-test-1' } }, - { label: 'label-test-2', value: { requiredField1: 'label-test-2' } }, - { label: 'label-test-3', value: { requiredField1: 'label-test-3' } }, - ]); + expect(checkBoxListData).toEqual({ + 'vc1.json': { requiredField1: 'label-test-1' }, + 'vc2.json': { requiredField1: 'label-test-2' }, + 'vc3.json': { requiredField1: 'label-test-3' }, + }); }); }); @@ -329,7 +291,6 @@ describe('render RenderCheckList component', () => { render( , @@ -345,9 +306,9 @@ describe('render RenderCheckList component', () => { // click on them to check them, assert that they are checked and the state is updated correctly, // then uncheck some of them and assert that they are unchecked and the state is updated correctly await waitFor(() => { - const checkBox1 = screen.getByLabelText('label-test-1'); - const checkBox2 = screen.getByLabelText('label-test-2'); - const checkBox3 = screen.getByLabelText('label-test-3'); + const checkBox1 = screen.getByLabelText('vc1.json'); + const checkBox2 = screen.getByLabelText('vc2.json'); + const checkBox3 = screen.getByLabelText('vc3.json'); // Assert that all checkboxes are unchecked and the state is empty expect(checkBox1).not.toBeChecked(); @@ -364,11 +325,11 @@ describe('render RenderCheckList component', () => { expect(checkBox1).toBeChecked(); expect(checkBox2).toBeChecked(); expect(checkBox3).toBeChecked(); - expect(checkBoxListData).toEqual([ - { label: 'label-test-1', value: { requiredField1: 'label-test-1' } }, - { label: 'label-test-2', value: { requiredField1: 'label-test-2' } }, - { label: 'label-test-3', value: { requiredField1: 'label-test-3' } }, - ]); + expect(checkBoxListData).toEqual({ + 'vc1.json': { requiredField1: 'label-test-1' }, + 'vc2.json': { requiredField1: 'label-test-2' }, + 'vc3.json': { requiredField1: 'label-test-3' }, + }); // Uncheck checkbox 1 and 2, and assert that they are unchecked and the state is updated correctly checkBox1.click(); @@ -376,7 +337,7 @@ describe('render RenderCheckList component', () => { expect(checkBox1).not.toBeChecked(); expect(checkBox2).not.toBeChecked(); expect(checkBox3).toBeChecked(); - expect(checkBoxListData).toEqual([{ label: 'label-test-3', value: { requiredField1: 'label-test-3' } }]); + expect(checkBoxListData).toEqual({ 'vc3.json': { requiredField1: 'label-test-3' } }); }); }); }); diff --git a/packages/components/src/components/CheckBoxList/CheckBoxList.tsx b/packages/components/src/components/CheckBoxList/CheckBoxList.tsx index 620d2c16..da9d0e73 100644 --- a/packages/components/src/components/CheckBoxList/CheckBoxList.tsx +++ b/packages/components/src/components/CheckBoxList/CheckBoxList.tsx @@ -11,7 +11,7 @@ export interface ICheckBoxList { } export const CheckBoxList = ({ label = 'CheckBoxList', data, onChange }: ICheckBoxList) => { - const [checkList, setCheckList] = useState<{ [key: string]: { value: any; checked: boolean } }>(data); + const [checkList, setCheckList] = useState<{ [key: string]: { value: any; checked: boolean } }>({}); useEffect(() => { const checkListData = { ...data }; diff --git a/packages/components/src/components/ImportButton/ImportButton.tsx b/packages/components/src/components/ImportButton/ImportButton.tsx index 688ecf5b..16544602 100644 --- a/packages/components/src/components/ImportButton/ImportButton.tsx +++ b/packages/components/src/components/ImportButton/ImportButton.tsx @@ -3,7 +3,7 @@ import { Box } from '@mui/material'; import { LoadingButton } from '@mui/lab'; import { UploadFile as UploadFileIcon } from '@mui/icons-material'; import { ImportDataType } from '../../types/common.types.js'; -import { processVerifiableCredentialData } from '../../utils/index.js'; +import { processVerifiableCredentialData } from '../../utils/importDataHelpers.js'; export interface IImportButtonProps { onChange: (data: object[]) => void; diff --git a/packages/components/src/components/RenderCheckList/RenderCheckList.tsx b/packages/components/src/components/RenderCheckList/RenderCheckList.tsx index bfc11543..690c8aa0 100644 --- a/packages/components/src/components/RenderCheckList/RenderCheckList.tsx +++ b/packages/components/src/components/RenderCheckList/RenderCheckList.tsx @@ -5,11 +5,9 @@ import { DynamicComponentRenderer, IDynamicComponentRendererProps, } from '../DynamicComponentRenderer/DynamicComponentRenderer.js'; -import { getValueByPath } from '@mock-app/services/build/utils/index.js'; export interface IRenderCheckList { checkBoxLabel?: string; - requiredFieldPath: string; nestedComponents: IDynamicComponentRendererProps[]; onChange: (data: any) => void; } @@ -19,7 +17,7 @@ export enum AllowNestedComponent { QRCodeScannerDialogButton = 'QRCodeScannerDialogButton', } -export const RenderCheckList = ({ checkBoxLabel, requiredFieldPath, onChange, nestedComponents }: IRenderCheckList) => { +export const RenderCheckList = ({ checkBoxLabel, onChange, nestedComponents }: IRenderCheckList) => { const [checkBoxes, setCheckBoxes] = useState({}); const handleOnChange = (data: object | object[]) => { diff --git a/packages/components/src/components/__tests__/Footer/Footer.test.tsx b/packages/components/src/components/__tests__/Footer/Footer.test.tsx index d62959aa..0eccf0a9 100644 --- a/packages/components/src/components/__tests__/Footer/Footer.test.tsx +++ b/packages/components/src/components/__tests__/Footer/Footer.test.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { render, screen } from '@testing-library/react'; import '@testing-library/jest-dom'; -import { Footer } from '../../..'; +import { Footer } from '../../../components/Footer/Footer'; describe('Footer', () => { test('should render Footer component', () => { diff --git a/packages/components/src/components/__tests__/Header/Header.test.tsx b/packages/components/src/components/__tests__/Header/Header.test.tsx index 7fa20475..7b2c7d90 100644 --- a/packages/components/src/components/__tests__/Header/Header.test.tsx +++ b/packages/components/src/components/__tests__/Header/Header.test.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { fireEvent, render, screen, waitFor } from '@testing-library/react'; -import { Header } from '../../../'; +import { Header } from '../../../components/Header/Header'; describe('Header', () => { // Define an array of router links for testing diff --git a/packages/components/src/components/__tests__/Layout/Layout.test.tsx b/packages/components/src/components/__tests__/Layout/Layout.test.tsx index 51d8ddbc..8b5c9206 100644 --- a/packages/components/src/components/__tests__/Layout/Layout.test.tsx +++ b/packages/components/src/components/__tests__/Layout/Layout.test.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { render, screen } from '@testing-library/react'; -import { FallbackErrorContent, Layout, LayoutStatus, MessageText } from '../../..'; +import { FallbackErrorContent, Layout, LayoutStatus, MessageText } from '../../../components/Layout/Layout'; describe('Layout', () => { test('should render Layout component with children', () => { @@ -57,7 +57,7 @@ describe('Layout', () => { render( - + , ); // Expect that the FallbackErrorContent component is rendered for error scenario diff --git a/packages/components/src/components/__tests__/ToastMessage/ToastMessage.test.tsx b/packages/components/src/components/__tests__/ToastMessage/ToastMessage.test.tsx index 0a4aad9e..ab9eed8f 100644 --- a/packages/components/src/components/__tests__/ToastMessage/ToastMessage.test.tsx +++ b/packages/components/src/components/__tests__/ToastMessage/ToastMessage.test.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { render, waitFor } from '@testing-library/react'; -import { ToastMessage, toastMessage, Status } from '../../..'; +import { ToastMessage, toastMessage, Status } from '../../../components/ToastMessage/ToastMessage'; describe('Toast Message', () => { test('renders ToastMessage component and triggers toast', async () => { @@ -19,4 +19,4 @@ describe('Toast Message', () => { expect(document.body).toHaveTextContent(message); }); }); -}); \ No newline at end of file +}); From e95787079feb3c5c1a95e5d07a160d5c2e7500de Mon Sep 17 00:00:00 2001 From: Nam Hoang Date: Wed, 23 Oct 2024 13:11:07 +0700 Subject: [PATCH 03/17] chore: remove the test import configuration Signed-off-by: Nam Hoang --- app-config.json | 42 ------------------------------------------ 1 file changed, 42 deletions(-) diff --git a/app-config.json b/app-config.json index 8274bbd5..2ac8f205 100644 --- a/app-config.json +++ b/app-config.json @@ -31,48 +31,6 @@ "tertiaryColor": "#ffffff" }, "features": [ - { - "name": "Process Steel", - "id": "process_product", - "components": [ - { - "name": "RenderCheckList", - "type": "EntryData", - "props": { - "checkBoxLabel": "Imported valid json:", - "nestedComponents": [ - { - "name": "ImportButton", - "type": "EntryData", - "props": { - "label": "Import JSON", - "style": { "margin": "40px auto", "paddingTop": "40px", "width": "80%" }, - "vcOptions": { - "credentialPath": "/vc" - } - } - }, - { - "name": "QRCodeScannerDialogButton", - "type": "EntryData" - } - ], - "style": { "margin": "40px auto", "paddingTop": "40px", "width": "80%" } - } - }, - { - "name": "CustomButton", - "type": "Submit", - "props": {} - } - ], - "services": [ - { - "name": "test", - "parameters": [] - } - ] - }, { "name": "Issue DPP", "id": "produce_product", From 409f07a6894992fefe9e69c8f635314a643ba6c0 Mon Sep 17 00:00:00 2001 From: Nam Hoang Date: Thu, 24 Oct 2024 15:35:01 +0700 Subject: [PATCH 04/17] test: update unit tests Signed-off-by: Nam Hoang --- .../DynamicComponentRenderer.test.tsx | 29 - .../src/__tests__/GenericFeature.test.tsx | 31 +- .../mock-app/src/__tests__/Header.test.tsx | 130 +- .../mock-app/src/__tests__/Router.test.tsx | 166 +- .../mock-app/src/__tests__/Scanning.test.tsx | 2 +- .../src/__tests__/mocks/app-config.mock.json | 5316 +++++++++++++++++ .../mock-app/src/components/Header/Header.tsx | 7 +- packages/mock-app/src/hooks/GlobalContext.tsx | 4 +- 8 files changed, 5389 insertions(+), 296 deletions(-) delete mode 100644 packages/mock-app/src/__tests__/DynamicComponentRenderer.test.tsx create mode 100644 packages/mock-app/src/__tests__/mocks/app-config.mock.json diff --git a/packages/mock-app/src/__tests__/DynamicComponentRenderer.test.tsx b/packages/mock-app/src/__tests__/DynamicComponentRenderer.test.tsx deleted file mode 100644 index 28af72c8..00000000 --- a/packages/mock-app/src/__tests__/DynamicComponentRenderer.test.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import React from 'react'; -import { render, screen } from '@testing-library/react'; -import { JsonForm } from '@mock-app/components'; -import { DynamicComponentRenderer, ComponentType } from '../components/GenericFeature/DynamicComponentRenderer'; - -jest.mock('@mock-app/components', () => ({ - JsonForm: jest.fn(), -})); - -describe('DynamicComponentRenderer', () => { - beforeEach(() => { - jest.resetAllMocks(); - }); - - test('should render component with valid props name', () => { - (JsonForm as any).mockImplementation(() => <>jsonform); - render( - , - ); - expect(screen.getByText('jsonform')).not.toBeNull(); - }); - - test('should render null with invalid props name', () => { - render( - , - ); - expect(screen.queryByText('jsonform')).toBeNull(); - }); -}); diff --git a/packages/mock-app/src/__tests__/GenericFeature.test.tsx b/packages/mock-app/src/__tests__/GenericFeature.test.tsx index 8a39db41..178108f8 100644 --- a/packages/mock-app/src/__tests__/GenericFeature.test.tsx +++ b/packages/mock-app/src/__tests__/GenericFeature.test.tsx @@ -1,29 +1,26 @@ import React from 'react'; import { fireEvent, render, screen } from '@testing-library/react'; import { GenericFeature } from '../components/GenericFeature/GenericFeature'; -import { - ComponentType, - DynamicComponentRenderer, - IDynamicComponentRendererProps, -} from '../components/GenericFeature/DynamicComponentRenderer'; +import { ComponentType, DynamicComponentRenderer, IDynamicComponentRendererProps } from '@mock-app/components'; jest.mock('@mock-app/components', () => ({ JsonForm: jest.fn(), Button: jest.fn(), -})); - -jest.mock('@mock-app/services', () => ({ - logService: jest.fn().mockImplementation((value) => value), - logServiceTwo: jest.fn(), -})); - -jest.mock('../components/GenericFeature/DynamicComponentRenderer', () => ({ DynamicComponentRenderer: jest.fn(), + toastMessage: jest.fn(), ComponentType: { EntryData: 'EntryData', Void: 'Void', Submit: 'Submit', }, + Status: { + success: 'success', + error: 'error', + }, +})); + +jest.mock('@mock-app/services', () => ({ + logService: jest.fn().mockImplementation(() => 'logService'), })); describe('GenericFeature', () => { @@ -93,11 +90,11 @@ describe('GenericFeature', () => { }); test('should render UI with componentsData and call onClick to trigger services', () => { - const mock = jest.fn().mockImplementation(() => 'logService'); + const mock = jest.fn().mockImplementation((value) => expect(value).toBe('logService')); const services = [ { name: 'logService', - parameters: [mock()], + parameters: [], }, ]; @@ -106,7 +103,7 @@ describe('GenericFeature', () => {

{name}

- {name === 'Button' && } + {name === 'Button' && }
), ); @@ -115,7 +112,5 @@ describe('GenericFeature', () => { fireEvent.click(screen.getByText('Click me!')); expect(screen.getByText('Button')).not.toBeNull(); - expect(mock).toHaveBeenCalled(); - expect(mock).toHaveReturnedWith('logService'); }); }); diff --git a/packages/mock-app/src/__tests__/Header.test.tsx b/packages/mock-app/src/__tests__/Header.test.tsx index e9a67c9b..cc73cb08 100644 --- a/packages/mock-app/src/__tests__/Header.test.tsx +++ b/packages/mock-app/src/__tests__/Header.test.tsx @@ -2,122 +2,24 @@ import React from 'react'; import { render, screen, fireEvent } from '@testing-library/react'; import { createMemoryHistory } from 'history'; import { Router as RouterDom } from 'react-router-dom'; +import appConfig from './mocks/app-config.mock.json'; +import { useGlobalContext } from '../hooks/GlobalContext'; import Header from '../components/Header/Header'; // Mock the appConfig to provide test data -jest.mock( - '../../src/constants/app-config.json', - () => ({ - name: 'Red meat', - styles: { - primaryColor: '#fff', - secondaryColor: 'white', - tertiaryColor: 'black', - }, - generalFeatures: [ - { - name: 'General features', - type: '', - styles: { - primaryColor: 'rgb(255, 207, 7)', - secondaryColor: 'black', - tertiaryColor: 'black', - }, - features: [ - { - name: 'Conformity Credential', - id: 'conformity_credential', - components: [ - { - name: 'ConformityCredential', - type: '', - props: { - credentialRequestConfigs: [ - { - url: 'http://example.com/deforestation-free-assessment', - params: {}, - options: { - headers: [], - method: 'POST', - }, - credentialName: 'Deforestation Free Assessment', - credentialPath: '/body/credentil', - appOnly: 'Farm', - }, - ], - storedCredentialsConfig: { - url: 'https://storage.example.com', - params: {}, - options: { - bucket: 'bucket-stored-example', - }, - type: 's3', - }, - }, - }, - ], - services: [], - }, - ], - }, - ], - apps: [ - { - name: 'Farm', - features: [{ name: 'Issue DLP' }], - styles: { - primaryColor: '#fff', - secondaryColor: 'white', - tertiaryColor: 'black', - }, - }, - { - name: 'Feedlot', - features: [{ name: 'Import DLP' }, { name: 'Feed Cattle' }, { name: 'Sell Cattle' }], - styles: { - primaryColor: '#fff', - secondaryColor: 'white', - tertiaryColor: 'black', - }, - }, - { - name: 'Processor', - features: [{ name: 'Import DLP' }, { name: 'Process Cattle' }], - styles: { - primaryColor: '#fff', - secondaryColor: 'white', - tertiaryColor: 'black', - }, - }, - ], - scanningApp: { - config: { - path: '/scanning', - styles: { - primaryColor: 'rgb(41, 171, 48)', - secondaryColor: 'white', - tertiaryColor: 'black', - }, - }, - provider: 'gs1', - providerVerifyUrl: 'https://verified-by-gs1.agtrace.showthething.com', - services: { - certificationInfo: 'https://gs1.org/voc/certificationInfo', - verificationService: 'https://gs1.org/voc/verificationService', - serviceInfo: 'https://gs1.org/voc/serviceInfo', - }, - defaultVerificationServiceLink: { - title: 'Default Verification Service', - context: 'Default Verification Service', - type: 'application/json', - href: 'https://verify.agtrace.showthething.com/credentials/verify', - hreflang: ['en'], - }, +jest.mock('../../src/constants/app-config.json', () => appConfig, { virtual: true }); + +jest.mock('../hooks/GlobalContext', () => ({ + useGlobalContext: jest.fn(() => ({ + theme: { + selectedTheme: { primaryColor: '#000000', secondaryColor: '#000000', tertiaryColor: '#000000' }, + setSelectedTheme: jest + .fn() + .mockImplementation(() => ({ primaryColor: '#000000', secondaryColor: '#000000', tertiaryColor: '#000000' })), }, - }), - { virtual: true }, -); + })), +})); jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), @@ -136,7 +38,7 @@ describe('Header', () => { , ); - expect(screen.getByText('Red meat')).toBeInTheDocument(); + expect(screen.getByText(appConfig.name)).toBeInTheDocument(); }); it('should open sidebar menu in header', () => { @@ -162,9 +64,9 @@ describe('Header', () => { ); fireEvent.click(screen.getByTestId('icon-button')); - const linkElement = screen.getByText('Feedlot'); + const linkElement = screen.getByTestId('app-name'); fireEvent.click(linkElement); - expect(history.location.pathname).toBe('/feedlot'); + expect(history.location.pathname).toBe('/'); }); }); diff --git a/packages/mock-app/src/__tests__/Router.test.tsx b/packages/mock-app/src/__tests__/Router.test.tsx index 35001cf8..d9268025 100644 --- a/packages/mock-app/src/__tests__/Router.test.tsx +++ b/packages/mock-app/src/__tests__/Router.test.tsx @@ -2,122 +2,12 @@ import React from 'react'; import { render, screen, fireEvent } from '@testing-library/react'; import { Router as RouterDom } from 'react-router-dom'; import { createMemoryHistory } from 'history'; +import appConfig from './mocks/app-config.mock.json'; import { Router } from '../components/Router'; +import { Home, Scanning, Verify, Application, GenericPage } from '../pages'; // Mock the appConfig to provide test data -jest.mock( - '../../src/constants/app-config.json', - () => ({ - name: 'Red meat', - styles: { - primaryColor: '#fff', - secondaryColor: 'white', - tertiaryColor: 'black', - }, - generalFeatures: [ - { - name: 'General features', - type: '', - styles: { - primaryColor: 'rgb(255, 207, 7)', - secondaryColor: 'black', - tertiaryColor: 'black', - }, - features: [ - { - name: 'Conformity Credential', - id: 'conformity_credential', - components: [ - { - name: 'ConformityCredential', - type: '', - props: { - credentialRequestConfigs: [ - { - url: 'http://example.com/deforestation-free-assessment', - params: {}, - options: { - headers: [], - method: 'POST', - }, - credentialName: 'Deforestation Free Assessment', - credentialPath: '/body/credentil', - appOnly: 'Farm', - }, - ], - storedCredentialsConfig: { - url: 'https://storage.example.com', - params: {}, - options: { - bucket: 'bucket-stored-example', - }, - type: 's3', - }, - }, - }, - ], - services: [], - }, - ], - }, - ], - apps: [ - { - name: 'Farm', - features: [{ name: 'Issue DLP' }], - styles: { - primaryColor: '#fff', - secondaryColor: 'white', - tertiaryColor: 'black', - }, - }, - { - name: 'Feedlot', - features: [{ name: 'Import DLP' }, { name: 'Feed Cattle' }, { name: 'Sell Cattle' }], - styles: { - primaryColor: '#fff', - secondaryColor: 'white', - tertiaryColor: 'black', - }, - }, - { - name: 'Processor', - features: [{ name: 'Import DLP' }, { name: 'Process Cattle' }], - styles: { - primaryColor: '#fff', - secondaryColor: 'white', - tertiaryColor: 'black', - }, - }, - ], - scanningApp: { - config: { - path: '/scanning', - styles: { - primaryColor: 'rgb(41, 171, 48)', - secondaryColor: 'white', - tertiaryColor: 'black', - }, - }, - provider: 'gs1', - providerVerifyUrl: 'https://verified-by-gs1.agtrace.showthething.com', - services: { - certificationInfo: 'https://gs1.org/voc/certificationInfo', - verificationService: 'https://gs1.org/voc/verificationService', - serviceInfo: 'https://gs1.org/voc/serviceInfo', - }, - defaultVerificationServiceLink: { - title: 'Default Verification Service', - context: 'Default Verification Service', - type: 'application/json', - href: 'https://verify.agtrace.showthething.com/credentials/verify', - hreflang: ['en'], - }, - }, - }), - { virtual: true }, -); - +jest.mock('../../src/constants/app-config.json', () => appConfig, { virtual: true }); jest.mock('@mock-app/components', () => ({ Footer: jest.fn(), })); @@ -131,6 +21,14 @@ jest.mock('@vckit/renderer', () => ({ WebRenderingTemplate2022: jest.fn(), })); +jest.mock('../pages', () => ({ + Home: jest.fn().mockReturnValue(
Home
), + Scanning: jest.fn().mockReturnValue(
Scanning
), + Verify: jest.fn().mockReturnValue(
Verify
), + Application: jest.fn().mockReturnValue(
Application
), + GenericPage: jest.fn().mockReturnValue(
GenericPage
), +})); + describe('Router Component', () => { // Test case to check if the Router redirects to the 404 page for an invalid route it('should renders route incorrectly', () => { @@ -159,31 +57,39 @@ describe('Router Component', () => { , ); - // Find all buttons with text matching 'Farm', 'Feedlot', and 'Processor' - const farmButton = screen.getAllByText(/Farm/i); - const feedlotButton = screen.getAllByText(/Feedlot/i); - const processorButton = screen.getAllByText(/Processor/i); + expect(screen.getByText('Home')).not.toBeNull(); + }); + + it('should renders scanning page', () => { + const history = createMemoryHistory({ initialEntries: ['/scanning'] }); + render( + + + , + ); - // Assert that all buttons for the respective apps are displayed on the Home page - expect(farmButton).not.toBeNull(); - expect(feedlotButton).not.toBeNull(); - expect(processorButton).not.toBeNull(); + expect(screen.getByText('Scanning')).not.toBeNull(); }); - // Test case to check if clicking on a feature in the Router navigates to the correct subpath - it('should renders route subpath correctly', () => { - // Create a memory history object with an initial entry of the '/farm' route - const history = createMemoryHistory({ initialEntries: ['/farm'] }); - // Render the Router component with the provided history + it('should renders verify page', () => { + const history = createMemoryHistory({ initialEntries: ['/verify'] }); + render( + + + , + ); + + expect(screen.getByText('Verify')).not.toBeNull(); + }); + + it('should renders route feature path correctly', () => { + const history = createMemoryHistory({ initialEntries: ['/orchard-facility'] }); render( , ); - // Simulate a click on a feature in the Router (Issue DLP) - fireEvent.click(screen.getByText('Issue DLP')); - // Expect the Router to navigate to the '/farm/issue-dlp' subpath - expect(history.location.pathname).toBe('/farm/issue-dlp'); + expect(screen.getByText('Application')).not.toBeNull(); }); }); diff --git a/packages/mock-app/src/__tests__/Scanning.test.tsx b/packages/mock-app/src/__tests__/Scanning.test.tsx index 33c9fb99..1b80477c 100644 --- a/packages/mock-app/src/__tests__/Scanning.test.tsx +++ b/packages/mock-app/src/__tests__/Scanning.test.tsx @@ -5,7 +5,7 @@ import { fireEvent, render } from '@testing-library/react'; import { publicAPI } from '@mock-app/services'; import { act } from 'react-dom/test-utils'; import { Scanner } from '../components/Scanner'; -import { Scanning } from '../pages'; +import Scanning from '../pages/Scanning'; const mockUsedNavigate = jest.fn(); jest.mock('react-router', () => ({ diff --git a/packages/mock-app/src/__tests__/mocks/app-config.mock.json b/packages/mock-app/src/__tests__/mocks/app-config.mock.json new file mode 100644 index 00000000..765de3b7 --- /dev/null +++ b/packages/mock-app/src/__tests__/mocks/app-config.mock.json @@ -0,0 +1,5316 @@ +{ + "name": "CHERRIES SUPPLY CHAIN TRACEABILITY", + "styles": { + "primaryColor": "rgb(35, 138, 186)", + "secondaryColor": "black", + "tertiaryColor": "black" + }, + "generalFeatures": [ + { + "name": "General features", + "type": "", + "styles": { + "primaryColor": "rgb(35, 138, 186)", + "secondaryColor": "black", + "tertiaryColor": "black" + }, + "features": [] + } + ], + "apps": [ + { + "name": "Orchard Facility", + "type": "producer", + "assets": { + "logo": "Cherries-farm-logo.webp", + "brandTitle": "Orchard Facility" + }, + "styles": { + "primaryColor": "#b5651d", + "secondaryColor": "#391561", + "tertiaryColor": "#ffffff" + }, + "features": [ + { + "name": "Issue DPP", + "id": "produce_product", + "components": [ + { + "name": "JsonForm", + "type": "EntryData", + "props": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "productIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An array of unique identifiers assigned to the product or model. " + }, + "batchIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "Information regarding the specific production batch of the product." + }, + "itemIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An array of identifiers representing a specific serialised item of the product." + }, + "classification": { + "type": "array", + "items": { + "$ref": "#/$defs/Classification" + }, + "description": "A code representing the product's class, typically using the UN CPC (United Nations Central Product Classification) https://unstats.un.org/unsd/classifications/Econ/cpc" + }, + "modelName": { + "type": "string", + "description": "The model name or number of the product, represented as text." + }, + "image": { + "$ref": "#/$defs/BinaryFile", + "description": "A unique identifier (URI) pointing to an image of the product." + }, + "description": { + "type": "string", + "description": "A textual description providing details about the product." + }, + "furtherInformation": { + "type": "string", + "format": "uri", + "description": "A URL pointing to further human readable information about the product." + }, + "manufacturedDate": { + "type": "string", + "format": "date", + "description": "The ISO 8601 date on which the product batch was manufactured." + }, + "dimension": { + "$ref": "#/$defs/Dimension", + "description": "The physical dimensions of the product. Not every dimension is relevant to every products. For example bulk materials may have wieght and volume but not length, with, or height." + }, + "characteristic": { + "$ref": "#/$defs/Characteristic", + "description": "" + }, + "manufacturer": { + "$ref": "#/$defs/Party", + "description": "The Party entity that manufactured the product." + }, + "manufacturedAt": { + "$ref": "#/$defs/Facility", + "description": "The Facility where the product batch was manufactured." + }, + "materialsProvenance": { + "type": "array", + "items": { + "$ref": "#/$defs/Material" + }, + "description": "An array of Provenance objects providing details on the origin and mass fraction of components or ingredients of the product batch." + }, + "conformityClaim": { + "type": "array", + "items": { + "$ref": "#/$defs/Claim" + }, + "description": "An array of claim objects representing various product conformity claims about the product / batch. These can be sustainability claims, circularity claims, or any other claim type within the conformity topic list." + }, + "recyclingInstruction": { + "type": "string", + "format": "uri", + "description": "A URI pointing to information regarding the recycling aspects of the product." + }, + "traceabilityInformation": { + "type": "array", + "items": { + "$ref": "#/$defs/TraceabilityEvent" + }, + "description": "An array of TraceabilityEvent objects detailing EPCIS events related to the traceability of the product batch." + } + }, + "description": "The ProductInformation class encapsulates detailed information regarding a specific product, including its identification details, manufacturer, and other pertinent details.", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$defs": { + "Product": { + "type": "object", + "additionalProperties": false, + "properties": { + "productIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An array of unique identifiers assigned to the product or model. " + }, + "batchIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "Information regarding the specific production batch of the product." + }, + "itemIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An array of identifiers representing a specific serialised item of the product." + }, + "classification": { + "type": "array", + "items": { + "$ref": "#/$defs/Classification" + }, + "description": "A code representing the product's class, typically using the UN CPC (United Nations Central Product Classification) https://unstats.un.org/unsd/classifications/Econ/cpc" + }, + "modelName": { + "type": "string", + "description": "The model name or number of the product, represented as text." + }, + "image": { + "$ref": "#/$defs/BinaryFile", + "description": "A unique identifier (URI) pointing to an image of the product." + }, + "description": { + "type": "string", + "description": "A textual description providing details about the product." + }, + "furtherInformation": { + "type": "string", + "format": "uri", + "description": "A URL pointing to further human readable information about the product." + }, + "manufacturedDate": { + "type": "string", + "format": "date", + "description": "The ISO 8601 date on which the product batch was manufactured." + }, + "dimension": { + "$ref": "#/$defs/Dimension", + "description": "The physical dimensions of the product. Not every dimension is relevant to every products. For example bulk materials may have wieght and volume but not length, with, or height." + }, + "characteristic": { + "$ref": "#/$defs/Characteristic", + "description": "" + }, + "manufacturer": { + "$ref": "#/$defs/Party", + "description": "The Party entity that manufactured the product." + }, + "manufacturedAt": { + "$ref": "#/$defs/Facility", + "description": "The Facility where the product batch was manufactured." + }, + "materialsProvenance": { + "type": "array", + "items": { + "$ref": "#/$defs/Material" + }, + "description": "An array of Provenance objects providing details on the origin and mass fraction of components or ingredients of the product batch." + }, + "conformityClaim": { + "type": "array", + "items": { + "$ref": "#/$defs/Claim" + }, + "description": "An array of claim objects representing various product conformity claims about the product / batch. These can be sustainability claims, circularity claims, or any other claim type within the conformity topic list." + }, + "recyclingInstruction": { + "type": "string", + "format": "uri", + "description": "A URI pointing to information regarding the recycling aspects of the product." + }, + "traceabilityInformation": { + "type": "array", + "items": { + "$ref": "#/$defs/TraceabilityEvent" + }, + "description": "An array of TraceabilityEvent objects detailing EPCIS events related to the traceability of the product batch." + } + }, + "description": "The ProductInformation class encapsulates detailed information regarding a specific product, including its identification details, manufacturer, and other pertinent details." + }, + "Identifier": { + "type": "object", + "additionalProperties": false, + "properties": { + "scheme": { + "type": "string", + "format": "uri", + "description": "the identifier scheme as defined by the registrar that manages the identifier registry. If the identifier scheme is registered with UNTP then this URI can use used to dicsover the resolution method (to get more data) and the verification method (to prove ownership)." + }, + "identifierValue": { + "type": "string", + "description": "The value of the identifier within the scheme" + }, + "binding": { + "$ref": "#/$defs/Evidence", + "description": "Link to evidence that attests to the validity and ownership of the identifer. " + } + }, + "description": "An identifier of a party, product, or facility that is defined by an identifier scheme and idenfier value and, optinally, verification evidence " + }, + "Evidence": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": ["w3c_vc", "iso_mdl", "document", "website", "other"], + "example": "w3c_vc", + "description": "Format of the evidence (verifiable credential, document, website, etc)" + }, + "assuranceLevel": { + "type": "string", + "enum": ["Self", "Commercial", "Buyer", "Membership", "Unspecified", "3rdParty"], + "example": "Self", + "description": "The assurance level of the evidence (self declaration, 2nd party, 3rd party, accredited auditor)" + }, + "reference": { + "type": "string", + "format": "uri", + "description": "The URL at which the evidence data can be found. " + } + }, + "description": "Evidence to support a conformity or identity claim. " + }, + "Classification": { + "type": "object", + "additionalProperties": false, + "properties": { + "scheme": { + "type": "string", + "format": "uri", + "description": "Classification scheme - eg https://unstats.un.org/unsd/classifications/Econ/cpc " + }, + "classifierValue": { + "type": "string", + "description": "classifier value within the scheme - eg \"01211\" in UN CPC" + }, + "classifierName": { + "type": "string", + "description": "Name of the classifier - eg \"Asparagus\" for code \"01211\" in UNCPC" + }, + "classifierURL": { + "type": "string", + "format": "uri", + "description": "Linked data URL to a web vocabulary entery for this classificaiton code. When this property is provided, the scheme, value, and name properties of the classifer are not required. eg https://vocabulary.uncefact.org/unlocode#AUBNE represensign the port of Brisbane in the UN/LOCODE classification scheme." + } + }, + "description": "A classification scheme and code / name representing a category value for a product, entity, or facility." + }, + "BinaryFile": { + "type": "object", + "additionalProperties": false, + "properties": { + "fileHash": { + "x-jargon-isKey": true, + "type": "string", + "description": "The MD5 hash of the file." + }, + "fileLocation": { + "type": "string", + "format": "uri", + "description": "The location of the evidence file." + }, + "fileType": { + "type": "string", + "x-external-enumeration": "https://mimetype.io/all-types", + "description": "The type of file, represented as a MIME type.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://mimetype.io/all-types\n " + } + }, + "description": "A file representing a data snapshot that is used to infomr the conformity assessment." + }, + "Dimension": { + "type": "object", + "additionalProperties": false, + "properties": { + "weight": { + "$ref": "#/$defs/Measure", + "description": "the weight of the product" + }, + "length": { + "$ref": "#/$defs/Measure", + "description": "The length of the product or packaging" + }, + "width": { + "$ref": "#/$defs/Measure", + "description": "The width of the product or packaging" + }, + "height": { + "$ref": "#/$defs/Measure", + "description": "The height of the product or packaging" + }, + "volume": { + "$ref": "#/$defs/Measure", + "description": "The displacement volume of the product." + } + }, + "description": "Overall (length, width, height) dimensions and weight/volume of an item." + }, + "Measure": { + "type": "object", + "additionalProperties": false, + "properties": { + "value": { + "type": "number", + "description": "The numeric value of the measure" + }, + "unit": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/UnitMeasureCode", + "description": "Unit of measure drawn from the UNECE rec20 measure code list.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/UnitMeasureCode\n " + } + }, + "description": "The measure class defines a numeric measured value (eg 10) and a coded unit of measure (eg KG)." + }, + "Characteristic": { + "type": "object", + "additionalProperties": false, + "properties": {}, + "description": "Product specific characteristics. This class is an extension point for industry specific product characteristics or performance information such as clothing size or battery capacity." + }, + "Party": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "string", + "description": "The decentralised identifier of the party - must be a W3C DID." + }, + "name": { + "type": "string", + "description": "The name of the organization or company, represented as a text string." + }, + "identifiers": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "A list of unique business identifiers assigned to the party - such as tax registration numbers." + } + }, + "description": "The Party class represents an entity such as an organization, or a company that manufactured the product." + }, + "Facility": { + "type": "object", + "additionalProperties": false, + "properties": { + "identifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "A unique identifier (URI) assigned to the facility. (Link Resolver - GS1 GLN?)" + }, + "name": { + "type": "string", + "description": "The name of the facility, represented as a text string." + }, + "location": { + "type": "string", + "format": "uri", + "description": "" + }, + "operatedBy": { + "$ref": "#/$defs/Party", + "description": "The Party entity responsible for operating the facility." + } + }, + "description": "The physical site (eg farm or factory) where the product or materials was produced." + }, + "Material": { + "type": "object", + "additionalProperties": false, + "properties": { + "originCountry": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/CountryId", + "description": "A ISO 3166-1 code representing the country of origin of the component or ingredient.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/CountryId\n " + }, + "materialType": { + "$ref": "#/$defs/Classification", + "description": "The type of this material - as a value drawn from a controlled vocabulary eg textileexchange.org/materials/rm01014 - representing organic cotton." + }, + "massFraction": { + "type": "number", + "description": "A numeric value representing the mass fraction of the product represented by this material. The sum of all mass fraction values for a given passport should be 100." + }, + "recycled": { + "type": "boolean", + "description": "Indicator is true if this material input is from a recycled source." + }, + "hazardous": { + "type": "boolean", + "description": "Indicates whether this material is hazardous. If true then " + } + }, + "description": "The material class encapsulates details about the origin or source of raw materials in a product, including the country of origin and the mass fraction." + }, + "Claim": { + "type": "object", + "additionalProperties": false, + "properties": { + "topic": { + "type": "string", + "enum": [ + "environment.energy", + "environment.emissions", + "environment.water", + "environment.waste", + "environment.deforestation", + "environment.biodiversity", + "circularity.content", + "circularity.design", + "social.labour", + "social.rights", + "social.community", + "social.safety", + "governance.ethics", + "governance.compliance", + "governance.transparency" + ], + "example": "environment.energy", + "description": "A code representing the topic of the sustainability claim. E.g. environment.deforestation, environment.ghg-emission-intensity, etc.. Drawn from a standard code list. " + }, + "standardOrRegulation": { + "type": "string", + "format": "uri", + "description": "The standard or regulation against which this conformity claim is made. Expressed as a URI and should match a value in the UN catalogue of reference vocabularies. " + }, + "criteriaReference": { + "type": "string", + "format": "uri", + "description": "A URI pointing to the specific criteria within the standard or regulation against which this claim is made." + }, + "claimedValues": { + "type": "array", + "items": { + "$ref": "#/$defs/Metric" + }, + "description": "One or more actual measures supporting the claim. For example for GHG emissions there may be a metric for total emissions intensity and also a metric for amount of offsets included." + }, + "benchmarkValue": { + "$ref": "#/$defs/Metric", + "description": "A benchmark value against which the claimed value can be assessed. THis could be a value specified by a standard or regulation or could be an industry benchmark." + }, + "benchmarkReference": { + "type": "string", + "format": "uri", + "description": "A refernce to evidence to support the benchmark value." + }, + "conformance": { + "type": "boolean", + "description": "and indicator (boolean) that expresses whether or not this product has achieved compliance against the criteria. for example, if the topic is environment.deforstation and the criteria is EU.2023.1115 then the product is conformant if it has not touched any facility throughout it's lifecycle that is not deforestation free since dec 2020." + }, + "conformityEvidence": { + "$ref": "#/$defs/Evidence", + "description": "A URI pointing to the evidence supporting the claim. Most likely in the form of a verifiable credential." + } + }, + "description": "The SustainabilityClaim class represents specific claims regarding the sustainability of a product, providing details about the metrics, thresholds, and evidences supporting the claim." + }, + "Metric": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "description": "A human readable name for this metric" + }, + "value": { + "$ref": "#/$defs/Measure", + "description": "A numeric value representing the measurement or evaluation outcome for the claim." + }, + "accuracy": { + "type": "number", + "description": "A percentage represented as a numeric between 0 and 1 indicating the rage of accuracy of the claimed value (eg 0.05 means that the actual value is within 5% of the claimed value.)" + } + }, + "description": "A specific measure of performance against the criteria that governs the claim. Expressed as an array of metric (ie unit of emasure) / value (ie the actual numeric value) pairs. " + }, + "TraceabilityEvent": { + "type": "object", + "additionalProperties": false, + "properties": { + "eventReference": { + "type": "string", + "format": "uri", + "description": "A URI pointing to the detailed information about the EPCIS event. Most likely in the form of a verifiable credential." + }, + "eventType": { + "type": "string", + "enum": ["aggregation", "transformation", "object", "transaction", "association"], + "example": "aggregation", + "description": "A code representing the type of EPCIS event. ObjectEvent, AggregationEvent, TransactionEvent, TransformationEvent, ObjectEvent." + } + }, + "description": "The TraceabilityEvent class represents a specific EPCIS event in the traceability chain of a product, including details about the event type and reference." + } + } + }, + "data": { + "image": "data:image/jpg;base64,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", + "productIdentifier": [ + { + "scheme": "https://id.gs1.org/gtin", + "identifierValue": "05012345678900", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://id.gs1.org/gtin/05012345678900/binding" + } + } + ], + "batchIdentifier": [ + { + "scheme": "https://Cherriesfarm.example.org/batch", + "identifierValue": "2024001", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://Cherriesfarm.example.org/batch/2024-001/binding" + } + } + ], + "itemIdentifier": [ + { + "scheme": "https://Cherriesfarm.example.org/item", + "identifierValue": "TRF240001", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://Cherriesfarm.example.org/item/TRF-24-0001/binding" + } + } + ], + "classification": [ + { + "scheme": "https://www.unspsc.org", + "classifierValue": "50383710", + "classifierName": "Cherriess", + "classifierURL": "https://www.unspsc.org/search-code/50383710" + } + ], + "modelName": "Black Cherries", + "description": "Premium Black Cherriess harvested from our sustainable Cherries orchards.", + "furtherInformation": "https://Cherriesfarm.example.org/products/black_perigord", + "manufacturedDate": "2024-01-15", + "dimension": { + "weight": { "value": 50, "unit": "GRM" } + }, + "materialsProvenance": [ + { + "originCountry": "AU", + "materialType": { + "scheme": "https://www.gs1.org/gpc", + "classifierValue": "10005953", + "classifierName": "Cherriess (Fresh)", + "classifierURL": "https://www.gs1.org/gpc/10005953" + }, + "massFraction": 100, + "recycled": false, + "hazardous": false + } + ], + "characteristic": { + "variety": "Tuber melanosporum", + "grade": "Extra", + "aroma": "Intense, earthy", + "flavor": "Rich, complex" + }, + "manufacturer": { + "id": "did:example:123456789abcdefghi", + "name": "Gourmet Cherries Farm", + "identifiers": [ + { + "scheme": "https://identifier.example.org/company", + "identifierValue": "COMP-12345", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://identifier.example.org/company/12345/binding" + } + } + ] + }, + "manufacturedAt": { + "identifier": [ + { + "scheme": "https://identifier.example.org/facility", + "identifierValue": "FAC-5678", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://identifier.example.org/facility/5678/binding" + } + } + ], + "name": "Cherries Orchard", + "location": "https://Cherriesfarm.example.org/locations/perigord_orchard", + "operatedBy": { + "id": "did:example:123456789abcdefghi", + "name": "Gourmet Cherries Farm", + "identifiers": [ + { + "scheme": "https://identifier.example.org/company", + "identifierValue": "COMP-12345", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://identifier.example.org/company/12345/binding" + } + } + ] + } + } + }, + "constructData": { + "mappingFields": [], + "dummyFields": [], + "generationFields": [ + { + "path": "/eventID", + "handler": "generateIdWithSerialNumber" + } + ] + }, + "className": "json-form", + "style": { + "margin": "40px auto", + "paddingTop": "40px", + "width": "80%" + } + } + }, + { + "name": "CustomButton", + "type": "Submit", + "props": {} + } + ], + "services": [ + { + "name": "processDPP", + "parameters": [ + { + "vckit": { + "vckitAPIUrl": "http://localhost:3332/v2", + "issuer": "did:web:60c5-115-79-212-164.ngrok-free.app" + }, + "dpp": { + "context": ["https://dpp-json-ld.s3.ap-southeast-2.amazonaws.com/dppld.json"], + "renderTemplate": [ + { + "template": " Digital Product Passport

PRODUCT PASSPORT

{{credentialSubject.modelName}}

{{#each credentialSubject.batchIdentifier}} {{/each}} {{#each credentialSubject.productIdentifier}} {{/each}}

Sustainability

100%

Confidence

100%

PASSPORT ISSUED BY

{{issuer.name}}

Industry

Agriculture

Business identifier
75 859 224 235
Location
Rooty Hill, NSW
Identity verification
75 859 224 235
Other evidence

Conformity credentials

Conformity credentials are usually issued by independent third parties and provide a trusted assessment of product ESG performance against credible standards or regulations

{{#each credentialSubject.conformityClaim}}

{{topic}}

{{!-- {{#if (eq conformityEvidence.type 'w3c_vc')}} --}}
Verifiable credential
{{!-- {{/if}} --}}

View details

{{/each}}

Product composition

A complete list of materials that make up the composition of this product.

{{#each credentialSubject.materialsProvenance}}

{{massFraction}}%

ID {{materialType.classifierValue}}

{{materialType.classifierName}}

{{#if recycled}}

Recycled

{{/if}} {{#if hazardous}}

Hazard

{{/if}}
{{originCountry}}
{{/each}}

Product information

Harvest Date

{{credentialSubject.manufacturedDate}}

Batch No.

{{credentialSubject.batchIdentifier.0.identifierValue}}

Weight

{{credentialSubject.dimension.weight.value}}{{credentialSubject.dimension.weight.unit}}

Description

{{credentialSubject.description}}

", + "@type": "WebRenderingTemplate2022" + } + ], + "type": ["VerifiableCredential", "DigitalProductPassport"], + "dlrLinkTitle": "Cherries Product Passport", + "dlrIdentificationKeyType": "gtin", + "dlrVerificationPage": "http://localhost:3003/verify" + }, + "dlr": { + "dlrAPIUrl": "http://localhost:3000", + "dlrAPIKey": "test123", + "namespace": "gs1", + "linkRegisterPath": "/api/resolver" + }, + "storage": { + "url": "http://localhost:3334/v1/documents", + "params": { + "resultPath": "/uri", + "bucket": "verifiable-credentials" + }, + "options": { + "method": "POST", + "headers": { + "Content-Type": "application/json" + } + } + }, + "identifierKeyPath": { + "function": "concatService", + "args": [ + { "type": "text", "value": "(01)" }, + { "type": "path", "value": "/productIdentifier/0/identifierValue" }, + { "type": "text", "value": "(10)" }, + { "type": "path", "value": "/batchIdentifier/0/identifierValue" }, + { "type": "text", "value": "(21)" }, + { "type": "path", "value": "/itemIdentifier/0/identifierValue" } + ] + } + } + ] + }, + { + "name": "mergeToLocalStorage", + "parameters": [ + { + "storageKey": "CherriesFarm_dpps", + "objectKeyPath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue" + } + ] + } + ] + }, + { + "name": "Issue Object Event", + "id": "issue_object_event", + "components": [ + { + "name": "JsonForm", + "type": "EntryData", + "props": { + "schema": { + "url": "https://jargon.sh/user/unece/traceabilityEvents/v/0.4.0/artefacts/jsonSchemas/ObjectEvent.json?class=ObjectEvent" + }, + "data": { + "type": "transformation", + "id": "https://events.sample.com/01/05012345678900/21/951350380", + "processType": "Weaving", + "eventTime": "2024-09-01T12:00:00", + "action": "Add", + "disposition": "010501234567890021951350380", + "bizStep": "https://ref.gs1.org/cbv/BizStep-commissioning", + "bizLocation": "https://id.gs1.org/414/9520123456788", + "sensorElementList": [ + { + "sensorMetadata": { + "device": { + "type": ["Item"], + "id": "https://id.gs1.org/01/09520123456788/21/12345", + "name": "EV battery 300Ah." + }, + "dataProcessingMethod": "https://standards.org/sensorMethod#1234" + }, + "sensorReport": [ + { + "time": "2024-07-24T12:00:00", + "sensorType": "https://samplesensors.com/model1234", + "value": 25, + "uom": "KGM" + }, + { + "time": "2024-07-24T12:00:00", + "sensorType": "https://samplesensors.com/model1234", + "value": 25, + "uom": "KGM" + } + ], + "sensorIntegrityProof": "https://jargon.sh" + }, + { + "sensorMetadata": { + "device": { + "type": ["Item"], + "id": "https://id.gs1.org/01/09520123456788/21/12345", + "name": "EV battery 300Ah." + }, + "dataProcessingMethod": "https://standards.org/sensorMethod#1234" + }, + "sensorReport": [ + { + "time": "2024-07-24T12:00:00", + "sensorType": "https://samplesensors.com/model1234", + "value": 25, + "uom": "KGM" + }, + { + "time": "2024-07-24T12:00:00", + "sensorType": "https://samplesensors.com/model1234", + "value": 25, + "uom": "KGM" + } + ], + "sensorIntegrityProof": "https://jargon.sh" + } + ], + "epcList": [ + { + "type": ["Item"], + "id": "https://id.gs1.org/01/09520123456788/21/12345", + "name": "EV battery 300Ah." + }, + { + "type": ["Item"], + "id": "https://id.gs1.org/01/09520123456788/21/12345", + "name": "EV battery 300Ah." + } + ], + "quantityList": [ + { + "productId": "https://id.gs1.org/01/09520123456788/21/12345", + "productName": "EV battery 300Ah.", + "quantity": 20, + "uom": "KGM" + }, + { + "productId": "https://id.gs1.org/01/09520123456788/21/12345", + "productName": "EV battery 300Ah.", + "quantity": 20, + "uom": "KGM" + } + ] + }, + "constructData": { + "mappingFields": [], + "dummyFields": [], + "generationFields": [ + { + "path": "/eventID", + "handler": "generateIdWithSerialNumber" + } + ] + }, + "className": "json-form", + "style": { + "margin": "40px auto", + "paddingTop": "40px", + "width": "80%" + } + } + }, + { + "name": "CustomButton", + "type": "Submit", + "props": {} + } + ], + "services": [ + { + "name": "processObjectEvent", + "parameters": [ + { + "vckit": { + "vckitAPIUrl": "http://localhost:3332/v2", + "issuer": "did:web:60c5-115-79-212-164.ngrok-free.app" + }, + "epcisObjectEvent": { + "context": ["https://dpp-json-ld.s3.ap-southeast-2.amazonaws.com/dppld.json"], + "renderTemplate": [ + { + "template": "

Object Event

", + "@type": "WebRenderingTemplate2022" + } + ], + "type": ["VerifiableCredential", "DigitalTraceabilityEvent"], + "dlrLinkTitle": "Object Event", + "dlrIdentificationKeyType": "gtin", + "dlrVerificationPage": "http://localhost:3003/verify" + }, + "dlr": { + "dlrAPIUrl": "http://localhost:3000", + "dlrAPIKey": "test123", + "namespace": "gs1", + "linkRegisterPath": "/api/resolver" + }, + "storage": { + "url": "http://localhost:3334/v1/documents", + "params": { + "resultPath": "/uri", + "bucket": "verifiable-credentials" + }, + "options": { + "method": "POST", + "headers": { + "Content-Type": "application/json" + } + } + }, + "identifierKeyPath": "/id" + } + ] + } + ] + }, + { + "name": "Issue DIA", + "id": "produce_product", + "components": [ + { + "name": "JsonForm", + "type": "EntryData", + "props": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "default": "Entity", + "enum": ["Entity"] + }, + "id": { + "example": "https://id.gs1.org/01/09520123456788/21/12345", + "type": "string", + "format": "uri", + "description": "The globally unique ID of the entity as a resolvable URL according to ISO 18975. ExamplesProduct - id.gs1.org/01/09520123456788/21/12345 Party - abr.business.gov.au/ABN/View?abn=90664869327. Facility - did:web:facilities.example-company.com:123. " + }, + "name": { + "example": "EV battery 300Ah.", + "type": "string", + "description": "The registered name of the entity within the identifier scheme. Examplesproduct - EV battery 300Ahparty - Sample Company Pty Ltd. facility - Greenacres battery factory" + }, + "registeredId": { + "example": "90664869327", + "type": "string", + "description": "The registration number (alphanumeric) of the entity within the register. Unique within the register." + }, + "idScheme": { + "$ref": "#/$defs/IdentifierScheme", + "description": "The identifier scheme. Exampleproduct - id.gs1.org/01. party - business.gov.au/abn facility - did:web:facilities.acme.com. " + } + }, + "description": "The ID and Name of an identified entity such qs a product, facility, party, standard, etc. If the identifier is a W3C DID then the corresponding DID document SHOULD include a serviceEndpoint of type \"IdentityResolver\". If the identifier is not a W3C DID then the id peroperty SHOULD be an identity resolver URL.", + "required": ["id", "name"], + "$defs": { + "CredentialIssuer": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "default": "CredentialIssuer", + "enum": ["CredentialIssuer"] + }, + "id": { + "example": "did:web:identifiers.example-company.com:12345", + "type": "string", + "format": "uri", + "description": "The W3C DID of the issuer - should be a did:web or did:tdw" + }, + "name": { + "example": "Example Company Pty Ltd", + "type": "string", + "description": "The name of the issuer person or organisation" + }, + "otherIdentifiers": { + "type": "array", + "items": { + "$ref": "#/$defs/Entity" + }, + "description": "An optional list of other registered identifiers for this credential issuer " + } + }, + "description": "The issuer party ()person or orgnaition) of a verifiable credential.", + "required": ["id", "name"] + }, + "Entity": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "default": "Entity", + "enum": ["Entity"] + }, + "id": { + "example": "https://id.gs1.org/01/09520123456788/21/12345", + "type": "string", + "format": "uri", + "description": "The globally unique ID of the entity as a resolvable URL according to ISO 18975. ExamplesProduct - id.gs1.org/01/09520123456788/21/12345 Party - abr.business.gov.au/ABN/View?abn=90664869327. Facility - did:web:facilities.example-company.com:123. " + }, + "name": { + "example": "EV battery 300Ah.", + "type": "string", + "description": "The registered name of the entity within the identifier scheme. Examplesproduct - EV battery 300Ahparty - Sample Company Pty Ltd. facility - Greenacres battery factory" + }, + "registeredId": { + "example": "90664869327", + "type": "string", + "description": "The registration number (alphanumeric) of the entity within the register. Unique within the register." + }, + "idScheme": { + "$ref": "#/$defs/IdentifierScheme", + "description": "The identifier scheme. Exampleproduct - id.gs1.org/01. party - business.gov.au/abn facility - did:web:facilities.acme.com. " + } + }, + "description": "The ID and Name of an identified entity such qs a product, facility, party, standard, etc. If the identifier is a W3C DID then the corresponding DID document SHOULD include a serviceEndpoint of type \"IdentityResolver\". If the identifier is not a W3C DID then the id peroperty SHOULD be an identity resolver URL.", + "required": ["id", "name"] + }, + "IdentifierScheme": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "default": "IdentifierScheme", + "enum": ["IdentifierScheme"] + }, + "id": { + "example": "https://id.gs1.org/01/", + "type": "string", + "format": "uri", + "description": "The globally unique identifier of the registration scheme. The scheme should be registered and discoverable from vocabulary.uncefact.org/identifierSchemes" + }, + "name": { + "example": "Global Trade Identification Number (GTIN)", + "type": "string", + "description": "The name of the identifier scheme. " + } + }, + "description": "An identifier registration scheme for products, facilities, or organisations. Typically operated by a state, national or gloabl authority." + } + } + }, + "data": { + "type": ["Entity"], + "id": "0105012345678900", + "registeredId": "123456789", + "name": "Sample business Ltd", + "idScheme": { + "type": ["IdentifierScheme"], + "id": "https://id.gs1.org/01/", + "name": "Global Trade Identification Number (GTIN)" + }, + "verifiedDIDList": ["did:web:samplebusiness.com:key7", "did:web:samplebusiness.com:key7"], + "registrationScopeList": [ + "https://abr.business.gov.au/Help/EntityTypeDescription?Id=19", + "https://abr.business.gov.au/Help/EntityTypeDescription?Id=19" + ] + }, + "constructData": { + "mappingFields": [], + "dummyFields": [], + "generationFields": [ + { + "path": "/eventID", + "handler": "generateIdWithSerialNumber" + } + ] + }, + "className": "json-form", + "style": { + "margin": "40px auto", + "paddingTop": "40px", + "width": "80%" + } + } + }, + { + "name": "CustomButton", + "type": "Submit", + "props": {} + } + ], + "services": [ + { + "name": "processDigitalIdentityAnchor", + "parameters": [ + { + "vckit": { + "vckitAPIUrl": "http://localhost:3332/v2", + "issuer": "did:web:60c5-115-79-212-164.ngrok-free.app" + }, + "digitalIdentityAnchor": { + "context": ["https://dpp-json-ld.s3.ap-southeast-2.amazonaws.com/dppld.json"], + "renderTemplate": [ + { + "template": "
Digital Identity Anchor
", + "@type": "WebRenderingTemplate2022" + } + ], + "type": ["VerifiableCredential", "DigitalIdentityAnchor"], + "dlrLinkTitle": "DigitalIdentityAnchor", + "dlrIdentificationKeyType": "gtin", + "dlrVerificationPage": "http://localhost:3003/verify" + }, + "dlr": { + "dlrAPIUrl": "http://localhost:3000", + "dlrAPIKey": "test123", + "namespace": "gs1", + "linkRegisterPath": "/api/resolver" + }, + "storage": { + "url": "http://localhost:3334/v1/documents", + "params": { + "resultPath": "/uri", + "bucket": "verifiable-credentials" + }, + "options": { + "method": "POST", + "headers": { + "Content-Type": "application/json" + } + } + }, + "identifierKeyPath": "/id" + } + ] + } + ] + }, + { + "name": "Issue DFR", + "id": "produce_product", + "components": [ + { + "name": "JsonForm", + "type": "EntryData", + "props": { + "schema": { + "type": "object", + "additionalProperties": true, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["Facility"], + "default": ["Facility"], + "items": { + "type": "string", + "enum": ["Facility"] + } + }, + "id": { + "example": "https://id.gs1.org/gln/0614141123452", + "type": "string", + "format": "uri", + "description": "The globally unique ID of the facility as URI, ideally as a resolvable URL." + }, + "registeredId": { + "example": "0614141123452", + "type": "string", + "description": "The registration number (alphanumeric) of the facility within the identifier scheme. Unique within the register." + }, + "description": { + "example": "LiFePO4 Battery plant number 7", + "type": "string", + "description": "An optional short description of the facility" + }, + "name": { + "example": "Example facility 7", + "type": "string", + "description": "The registered name of the facility within the identifier scheme. " + }, + "idScheme": { + "$ref": "#/$defs/IdentifierScheme", + "description": "The ID scheme of the facility. eg a GS1 GLN or a National land registry scheme. If self issued then use the party ID of the facility owner. " + }, + "countryOfOperation": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/CountryId", + "description": "The country in which this facility is operating.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/CountryId\n " + }, + "processCategory": { + "type": "array", + "items": { + "$ref": "#/$defs/Classification" + }, + "description": "The industrial or production processes performed by this facility. Example unstats.un.org/isic/1030." + }, + "operatedByParty": { + "$ref": "#/$defs/Identifier", + "description": "The Party entity responsible for operating the facility.An object structure that uniquely identifies the party within a known party identification scheme. " + }, + "otherIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An optional list of other registered identifiers for this facility - eg GLNs or other schemes." + }, + "address": { + "$ref": "#/$defs/Address", + "description": "The Postal address of the location." + }, + "locationInformation": { + "$ref": "#/$defs/Location", + "description": "Physical location details" + }, + "conformityClaim": { + "type": "array", + "items": { + "$ref": "#/$defs/Claim" + }, + "description": "A list of conformity declarations against specific criteria from recognised standards or regulations. " + } + }, + "description": "The physical site (eg farm or factory) where the product or materials was produced. Including the facility sustainability performance record.", + "required": ["id", "name"], + "$defs": { + "CredentialIssuer": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["CredentialIssuer"], + "default": ["CredentialIssuer"], + "items": { + "type": "string", + "enum": ["CredentialIssuer"] + } + }, + "id": { + "example": "did:web:identifiers.example-company.com:12345", + "type": "string", + "format": "uri", + "description": "The W3C DID of the issuer - should be a did:web or did:tdw" + }, + "name": { + "example": "Example Company Pty Ltd", + "type": "string", + "description": "The name of the issuer person or organisation" + }, + "otherIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An optional list of other registered identifiers for this credential issuer " + } + }, + "description": "The issuer party (person or organisation) of a verifiable credential.", + "required": ["id", "name"] + }, + "Identifier": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["Identifier"], + "default": ["Identifier"], + "items": { + "type": "string", + "enum": ["Identifier"] + } + }, + "id": { + "example": "https://id.gs1.org/01/09520123456788/21/12345", + "type": "string", + "format": "uri", + "description": "The globally unique ID of the entity as a resolvable URL according to ISO 18975. ExamplesProduct - id.gs1.org/01/09520123456788/21/12345 Party - abr.business.gov.au/ABN/View?abn=90664869327. Facility - did:web:facilities.example-company.com:123. " + }, + "name": { + "example": "EV battery 300Ah.", + "type": "string", + "description": "The registered name of the entity within the identifier scheme. Examples: product - EV battery 300Ah, Party - Sample Company Pty Ltd, Facility - Green Acres battery factory" + }, + "registeredId": { + "example": "90664869327", + "type": "string", + "description": "The registration number (alphanumeric) of the entity within the register. Unique within the register." + }, + "idScheme": { + "$ref": "#/$defs/IdentifierScheme", + "description": "The identifier scheme. Examples : Product - id.gs1.org/01, Party - business.gov.au/abn, Facility - did:web:facilities.acme.com. " + } + }, + "description": "The ID and Name of an identified entity such as a product, facility, party, standard, etc. If the identifier is a W3C DID then the corresponding DID document SHOULD include a serviceEndpoint of type \"IdentityResolver\". If the identifier is not a W3C DID then the id property SHOULD be an identity resolver URL.", + "required": ["id", "name"] + }, + "IdentifierScheme": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["IdentifierScheme"], + "default": ["IdentifierScheme"], + "items": { + "type": "string", + "enum": ["IdentifierScheme"] + } + }, + "id": { + "example": "https://id.gs1.org/01/", + "type": "string", + "format": "uri", + "description": "The globally unique identifier of the registration scheme. The scheme should be registered and discoverable from vocabulary.uncefact.org/identifierSchemes" + }, + "name": { + "example": "Global Trade Identification Number (GTIN)", + "type": "string", + "description": "The name of the identifier scheme. " + } + }, + "description": "An identifier registration scheme for products, facilities, or organisations. Typically operated by a state, national or global authority." + }, + "Facility": { + "type": "object", + "additionalProperties": true, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["Facility"], + "default": ["Facility"], + "items": { + "type": "string", + "enum": ["Facility"] + } + }, + "id": { + "example": "https://id.gs1.org/gln/0614141123452", + "type": "string", + "format": "uri", + "description": "The globally unique ID of the facility as URI, ideally as a resolvable URL." + }, + "registeredId": { + "example": "0614141123452", + "type": "string", + "description": "The registration number (alphanumeric) of the facility within the identifier scheme. Unique within the register." + }, + "description": { + "example": "LiFePO4 Battery plant number 7", + "type": "string", + "description": "An optional short description of the facility" + }, + "name": { + "example": "Example facility 7", + "type": "string", + "description": "The registered name of the facility within the identifier scheme. " + }, + "idScheme": { + "$ref": "#/$defs/IdentifierScheme", + "description": "The ID scheme of the facility. eg a GS1 GLN or a National land registry scheme. If self issued then use the party ID of the facility owner. " + }, + "countryOfOperation": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/CountryId", + "description": "The country in which this facility is operating.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/CountryId\n " + }, + "processCategory": { + "type": "array", + "items": { + "$ref": "#/$defs/Classification" + }, + "description": "The industrial or production processes performed by this facility. Example unstats.un.org/isic/1030." + }, + "operatedByParty": { + "$ref": "#/$defs/Identifier", + "description": "The Party entity responsible for operating the facility.An object structure that uniquely identifies the party within a known party identification scheme. " + }, + "otherIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An optional list of other registered identifiers for this facility - eg GLNs or other schemes." + }, + "address": { + "$ref": "#/$defs/Address", + "description": "The Postal address of the location." + }, + "locationInformation": { + "$ref": "#/$defs/Location", + "description": "Physical location details" + }, + "conformityClaim": { + "type": "array", + "items": { + "$ref": "#/$defs/Claim" + }, + "description": "A list of conformity declarations against specific criteria from recognised standards or regulations. " + } + }, + "description": "The physical site (eg farm or factory) where the product or materials was produced. Including the facility sustainability performance record.", + "required": ["id", "name"] + }, + "Classification": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["Classification"], + "default": ["Classification"], + "items": { + "type": "string", + "enum": ["Classification"] + } + }, + "id": { + "example": "https://unstats.un.org/unsd/classifications/Econ/cpc/46410", + "type": "string", + "format": "uri", + "description": "The globally unique URI representing the specific classifier value" + }, + "code": { + "example": "46410", + "type": "string", + "description": "classification code within the scheme" + }, + "name": { + "example": "Primary cells and primary batteries", + "type": "string", + "description": "Name of the classification represented by the code" + }, + "schemeID": { + "example": "https://unstats.un.org/unsd/classifications/Econ/cpc/", + "type": "string", + "format": "uri", + "description": "Classification scheme ID" + }, + "schemeName": { + "example": "UN Central Product Classification (CPC)", + "type": "string", + "description": "The name of the classification scheme" + } + }, + "description": "A classification scheme and code / name representing a category value for a product, entity, or facility.", + "required": ["id", "name"] + }, + "Address": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["Address"], + "default": ["Address"], + "items": { + "type": "string", + "enum": ["Address"] + } + }, + "streetAddress": { + "example": "level 11, 15 London Circuit", + "type": "string", + "description": "the street address as an unstructured string." + }, + "postalCode": { + "example": "2601", + "type": "string", + "description": "The postal code or zip code for this address." + }, + "addressLocality": { + "example": "Acton", + "type": "string", + "description": "The city, suburb or township name." + }, + "addressRegion": { + "example": "ACT", + "type": "string", + "description": "The state or territory or province" + }, + "addressCountry": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/CountryId", + "description": "The address country as an ISO-3166 two letter country code.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/CountryId\n " + } + }, + "description": "A postal address." + }, + "Location": { + "type": "object", + "additionalProperties": true, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["Location"], + "default": ["Location"], + "items": { + "type": "string", + "enum": ["Location"] + } + }, + "plusCode": { + "example": "https://plus.codes/8CGRC78W+MM", + "type": "string", + "format": "uri", + "description": "An open location code (https://maps.google.com/pluscodes/) representing this geographic location or region. Open location codes can represent any sized area from a point to a large region and are easily resolved to a visual map location. " + }, + "geoLocation": { + "$ref": "#/$defs/Point", + "description": "The latitude and longitude coordinates that best represent the specified location. Using GeoJSON Point notation." + }, + "geoBoundary": { + "$ref": "#/$defs/Polygon", + "description": "The list of ordered coordinates that define a closed area polygon as a location boundary using GeoJSON polygon notation." + } + }, + "description": "Location information including address and geo-location of points, areas, and boundaries" + }, + "Point": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": ["Point"], + "example": "Point", + "description": "" + }, + "coordinates": { + "$ref": "#/$defs/Point3D", + "description": "Coordinates property of type Point3D" + } + }, + "description": "Represents a Point geometry", + "required": ["type"] + }, + "Point3D": { + "description": "Point in 3d space", + "oneOf": [ + { + "type": "array", + "readOnly": true, + "const": ["Point3D"], + "default": ["Point3D"], + "items": { + "type": "string", + "enum": ["Point3D"] + } + }, + { + "type": "array", + "items": { + "type": "number", + "format": "float" + }, + "description": "Array of decimal values" + } + ] + }, + "Polygon": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": ["Polygon"], + "example": "Polygon", + "description": "" + }, + "coordinates": { + "type": "array", + "items": { + "$ref": "#/$defs/Point3DWrapper" + }, + "description": "Array of PolygonCoordinates" + } + }, + "description": "Represents a Polygon geometry", + "required": ["type"] + }, + "Point3DWrapper": { + "description": "", + "oneOf": [ + { + "type": "array", + "readOnly": true, + "const": ["Point3DWrapper"], + "default": ["Point3DWrapper"], + "items": { + "type": "string", + "enum": ["Point3DWrapper"] + } + }, + { + "type": "array", + "items": { + "$ref": "#/$defs/Point3D" + }, + "description": "" + } + ] + }, + "Claim": { + "type": "object", + "additionalProperties": true, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["Claim", "Declaration"], + "default": ["Claim", "Declaration"], + "items": { + "type": "string", + "enum": ["Claim", "Declaration"] + } + }, + "assessmentDate": { + "example": "2024-03-15", + "type": "string", + "format": "date", + "description": "The date on which this assessment was made. " + }, + "id": { + "example": "https://products.example-company.com/09520123456788/declarations/12345", + "type": "string", + "format": "uri", + "description": "A unique identifier for the declaration. Often this will be an extension of the product.id or attestation.id. But could be a UUID." + }, + "referenceStandard": { + "$ref": "#/$defs/Standard", + "description": "The reference to the standard that defines the specification / criteria" + }, + "referenceRegulation": { + "$ref": "#/$defs/Regulation", + "description": "The reference to the regulation that defines the assessment criteria" + }, + "assessmentCriteria": { + "type": "array", + "items": { + "$ref": "#/$defs/Criterion" + }, + "description": "The specification against which the assessment is made." + }, + "declaredValue": { + "type": "array", + "items": { + "$ref": "#/$defs/Metric" + }, + "description": "The list of specific values measured as part of this assessment (eg tensile strength)" + }, + "conformance": { + "example": "true", + "type": "boolean", + "description": "An indicator of whether or not the claim or assesment conforms to the regulatory or standard criteria." + }, + "conformityTopic": { + "type": "string", + "enum": [ + "environment.energy", + "environment.emissions", + "environment.water", + "environment.waste", + "environment.deforestation", + "environment.biodiversity", + "circularity.content", + "circularity.design", + "social.labour", + "social.rights", + "social.community", + "social.safety", + "governance.ethics", + "governance.compliance", + "governance.transparency" + ], + "example": "environment.energy", + "description": "The conformity topic category for this assessment (eg vocabulary.uncefact.org/sustainability/emissions)" + }, + "conformityEvidence": { + "$ref": "#/$defs/SecureLink", + "description": "A binary file that is hashed ()for tamper evidence) and optionally encrypted (for confidentiality)." + } + }, + "description": "A conformity claim about the facility against a specific standard or regulation.", + "required": ["id", "conformance", "conformityTopic"] + }, + "Standard": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["Standard"], + "default": ["Standard"], + "items": { + "type": "string", + "enum": ["Standard"] + } + }, + "id": { + "example": "https://www.globalbattery.org/media/publications/gba-rulebook-v2.0-master.pdf", + "type": "string", + "format": "uri", + "description": "A unique identifier for the standard (eg https://www.iso.org/standard/60857.html)." + }, + "name": { + "example": "GBA Battery Passport Greenhouse Gas Rulebook - V.2.0", + "type": "string", + "description": "The name of the standard" + }, + "issuingParty": { + "$ref": "#/$defs/Identifier", + "description": "The party that issued the standard " + }, + "issueDate": { + "example": "2023-12-05", + "type": "string", + "format": "date", + "description": "The date when the standard was issued." + } + }, + "description": "A standard (eg ISO 14000) that specifies the criteria for conformance.", + "required": ["issuingParty"] + }, + "Regulation": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["Regulation"], + "default": ["Regulation"], + "items": { + "type": "string", + "enum": ["Regulation"] + } + }, + "id": { + "example": "https://www.legislation.gov.au/F2008L02309/latest/versions", + "type": "string", + "format": "uri", + "description": "The globally unique identifier of this regulation. " + }, + "name": { + "example": "NNational Greenhouse and Energy Reporting (Measurement) Determination", + "type": "string", + "description": "The name of the regulation or act." + }, + "jurisdictionCountry": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/CountryId", + "description": "The legal jurisdiction (country) under which the regulation is issued.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/CountryId\n " + }, + "administeredBy": { + "$ref": "#/$defs/Identifier", + "description": "the issuing body of the regulation. For example Australian Government Department of Climate Change, Energy, the Environment and Water" + }, + "effectiveDate": { + "example": "2024-03-20", + "type": "string", + "format": "date", + "description": "the date at which the regulation came into effect." + } + }, + "description": "A regulation (eg EU deforestation regulation) that defines the criteria for assessment.", + "required": ["administeredBy"] + }, + "Criterion": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["Criterion"], + "default": ["Criterion"], + "items": { + "type": "string", + "enum": ["Criterion"] + } + }, + "id": { + "example": "https://www.globalbattery.org/media/publications/gba-rulebook-v2.0-master.pdf#BatteryAssembly", + "type": "string", + "format": "uri", + "description": "A unique identifier for the criterion within the standard or regulation. For example CO2 emissions calculations for liquid fuel combustion." + }, + "name": { + "example": "GBA Battery rule book v2.0 battery assembly guidelines.", + "type": "string", + "description": "A name that describes this criteria." + }, + "thresholdValues": { + "type": "array", + "items": { + "$ref": "#/$defs/Metric" + }, + "description": "A conformity threshold defined by the specification (eg minimum compressive strength) " + } + }, + "description": "A specific rule or criterion within a standard or regulation. eg a carbon intensity calculation rule within an emissions standard.", + "required": ["id", "name"] + }, + "Metric": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["Metric"], + "default": ["Metric"], + "items": { + "type": "string", + "enum": ["Metric"] + } + }, + "metricName": { + "example": "GHG emissions intensity", + "type": "string", + "description": "A human readable name for this metric (for example \"Tensile strength\")" + }, + "metricValue": { + "$ref": "#/$defs/Measure", + "description": "A numeric value and unit of measure for this metric. Could be a measured value or a specified threshold. Eg {\"value\":400, \"unit\":\"MPA\"} as tensile strength of structural steel" + }, + "score": { + "example": "BB", + "type": "string", + "description": "A score or rank associated with this measured metric." + }, + "accuracy": { + "example": 0.05, + "type": "number", + "description": "A percentage represented as a numeric between 0 and 1 indicating the rage of accuracy of the claimed value (eg 0.05 means that the actual value is within 5% of the claimed value.)" + } + }, + "description": "A specific measure of performance against the criteria that governs the claim. Expressed as an array of metric (ie unit of measure) / value (ie the actual numeric value) pairs. ", + "required": ["metricName", "metricValue"] + }, + "Measure": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["Measure"], + "default": ["Measure"], + "items": { + "type": "string", + "enum": ["Measure"] + } + }, + "value": { + "example": 10, + "type": "number", + "description": "The numeric value of the measure" + }, + "unit": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/UnitMeasureCode", + "description": "Unit of measure drawn from the UNECE Rec20 measure code list.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/UnitMeasureCode\n " + } + }, + "description": "The measure class defines a numeric measured value (eg 10) and a coded unit of measure (eg KG).", + "required": ["value", "unit"] + }, + "SecureLink": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["SecureLink", "Link"], + "default": ["SecureLink", "Link"], + "items": { + "type": "string", + "enum": ["SecureLink", "Link"] + } + }, + "linkURL": { + "example": "https://files.example-certifier.com/1234567.json", + "type": "string", + "format": "uri", + "description": "The URL of the target resource. " + }, + "linkName": { + "example": "GBA rule book conformity certificate", + "type": "string", + "description": "A display name for the target resource " + }, + "linkType": { + "example": "https://test.uncefact.org/vocabulary/linkTypes/dcc", + "type": "string", + "description": "The type of the target resource - drawn from a controlled vocabulary " + }, + "hashDigest": { + "example": "6239119dda5bd4c8a6ffb832fe16feaa5c27b7dba154d24c53d4470a2c69adc2", + "type": "string", + "description": "The hash of the file." + }, + "hashMethod": { + "type": "string", + "enum": ["SHA-256", "SHA-1"], + "example": "SHA-256", + "description": "The hashing algorithm used to create the target hash. SHA-265 is the recommended standard" + }, + "encryptionMethod": { + "type": "string", + "enum": ["none", "AES"], + "example": "none", + "description": "The symmetric encryption algorithm used to encrypt the link target. AES is the recommended standard. Decryption keys are expected to be passed out of bounds." + } + }, + "description": "A binary file that is hashed ()for tamper evidence) and optionally encrypted (for confidentiality)." + } + } + }, + "data": { + "type": ["Facility"], + "id": "https://id.gs1.org/gln/0614141123452", + "registeredId": "614141123452", + "description": "LiFePO4 Battery plant number 7", + "name": "Example facility 7", + "idScheme": { + "type": ["IdentifierScheme"], + "id": "https://id.gs1.org/01/", + "name": "Global Trade Identification Number (GTIN)" + }, + "countryOfOperation": "AU", + "processCategory": [ + { + "type": ["Classification"], + "id": "https://unstats.un.org/unsd/classifications/Econ/cpc/46410", + "code": "46410", + "name": "Primary cells and primary batteries", + "schemeID": "https://unstats.un.org/unsd/classifications/Econ/cpc/", + "schemeName": "UN Central Product Classification (CPC)" + }, + { + "type": ["Classification"], + "id": "https://unstats.un.org/unsd/classifications/Econ/cpc/46410", + "code": "46410", + "name": "Primary cells and primary batteries", + "schemeID": "https://unstats.un.org/unsd/classifications/Econ/cpc/", + "schemeName": "UN Central Product Classification (CPC)" + } + ], + "operatedByParty": { + "type": ["Identifier"], + "id": "https://id.gs1.org/01/09520123456788/21/12345", + "name": "EV battery 300Ah.", + "registeredId": "90664869327", + "idScheme": { + "type": ["IdentifierScheme"], + "id": "https://id.gs1.org/01/", + "name": "Global Trade Identification Number (GTIN)" + } + }, + "otherIdentifier": [ + { + "type": ["Identifier"], + "id": "https://id.gs1.org/01/09520123456788/21/12345", + "name": "EV battery 300Ah.", + "registeredId": "90664869327", + "idScheme": { + "type": ["IdentifierScheme"], + "id": "https://id.gs1.org/01/", + "name": "Global Trade Identification Number (GTIN)" + } + }, + { + "type": ["Identifier"], + "id": "https://id.gs1.org/01/09520123456788/21/12345", + "name": "EV battery 300Ah.", + "registeredId": "90664869327", + "idScheme": { + "type": ["IdentifierScheme"], + "id": "https://id.gs1.org/01/", + "name": "Global Trade Identification Number (GTIN)" + } + } + ], + "address": { + "streetAddress": "level 11, 15 London Circuit", + "postalCode": "2601", + "addressLocality": "Acton", + "addressRegion": "ACT", + "addressCountry": "AU" + }, + "locationInformation": { + "plusCode": "https://plus.codes/8CGRC78W+MM", + "geoLocation": { + "type": "Point", + "coordinates": [3.141579, 3.141579] + }, + "geoBoundary": { + "type": "Polygon", + "coordinates": [[[3.141579, 3.141579]]] + } + }, + "conformityClaim": [ + { + "type": ["Claim", "Declaration"], + "assessmentDate": "2024-03-15", + "id": "https://products.example-company.com/09520123456788/declarations/12345", + "referenceStandard": { + "type": ["Standard"], + "id": "https://www.globalbattery.org/media/publications/gba-rulebook-v2.0-master.pdf", + "name": "GBA Battery Passport Greenhouse Gas Rulebook - V.2.0", + "issuingParty": { + "type": ["Identifier"], + "id": "https://id.gs1.org/01/09520123456788/21/12345", + "name": "EV battery 300Ah.", + "registeredId": "90664869327", + "idScheme": { + "type": ["IdentifierScheme"], + "id": "https://id.gs1.org/01/", + "name": "Global Trade Identification Number (GTIN)" + } + }, + "issueDate": "2023-12-05" + }, + "referenceRegulation": { + "type": ["Regulation"], + "id": "https://www.legislation.gov.au/F2008L02309/latest/versions", + "name": "NNational Greenhouse and Energy Reporting (Measurement) Determination", + "jurisdictionCountry": "Enumeration Value", + "administeredBy": { + "type": ["Identifier"], + "id": "https://id.gs1.org/01/09520123456788/21/12345", + "name": "EV battery 300Ah.", + "registeredId": "90664869327", + "idScheme": { + "type": ["IdentifierScheme"], + "id": "https://id.gs1.org/01/", + "name": "Global Trade Identification Number (GTIN)" + } + }, + "effectiveDate": "2024-03-20" + }, + "assessmentCriteria": [ + { + "type": ["Criterion"], + "id": "https://www.globalbattery.org/media/publications/gba-rulebook-v2.0-master.pdf#BatteryAssembly", + "name": "GBA Battery rule book v2.0 battery assembly guidelines.", + "thresholdValues": [ + { + "metricName": "GHG emissions intensity", + "metricValue": { + "value": 10, + "unit": "KGM" + }, + "score": "BB", + "accuracy": 0.05 + }, + { + "metricName": "GHG emissions intensity", + "metricValue": { + "value": 10, + "unit": "KGM" + }, + "score": "BB", + "accuracy": 0.05 + } + ] + }, + { + "type": ["Criterion"], + "id": "https://www.globalbattery.org/media/publications/gba-rulebook-v2.0-master.pdf#BatteryAssembly", + "name": "GBA Battery rule book v2.0 battery assembly guidelines.", + "thresholdValues": [ + { + "metricName": "GHG emissions intensity", + "metricValue": { + "value": 10, + "unit": "KGM" + }, + "score": "BB", + "accuracy": 0.05 + }, + { + "metricName": "GHG emissions intensity", + "metricValue": { + "value": 10, + "unit": "KGM" + }, + "score": "BB", + "accuracy": 0.05 + } + ] + } + ], + "declaredValue": [ + { + "metricName": "GHG emissions intensity", + "metricValue": { + "value": 10, + "unit": "KGM" + }, + "score": "BB", + "accuracy": 0.05 + }, + { + "metricName": "GHG emissions intensity", + "metricValue": { + "value": 10, + "unit": "KGM" + }, + "score": "BB", + "accuracy": 0.05 + } + ], + "conformance": true, + "conformityTopic": "environment.emissions", + "conformityEvidence": { + "linkURL": "https://files.example-certifier.com/1234567.json", + "linkName": "GBA rule book conformity certificate", + "linkType": "https://test.uncefact.org/vocabulary/linkTypes/dcc", + "hashDigest": "6239119", + "hashMethod": "SHA-256", + "encryptionMethod": "AES" + } + }, + { + "type": ["Claim", "Declaration"], + "assessmentDate": "2024-03-15", + "id": "https://products.example-company.com/09520123456788/declarations/12345", + "referenceStandard": { + "type": ["Standard"], + "id": "https://www.globalbattery.org/media/publications/gba-rulebook-v2.0-master.pdf", + "name": "GBA Battery Passport Greenhouse Gas Rulebook - V.2.0", + "issuingParty": { + "type": ["Identifier"], + "id": "https://id.gs1.org/01/09520123456788/21/12345", + "name": "EV battery 300Ah.", + "registeredId": "90664869327", + "idScheme": { + "type": ["IdentifierScheme"], + "id": "https://id.gs1.org/01/", + "name": "Global Trade Identification Number (GTIN)" + } + }, + "issueDate": "2023-12-05" + }, + "referenceRegulation": { + "type": ["Regulation"], + "id": "https://www.legislation.gov.au/F2008L02309/latest/versions", + "name": "NNational Greenhouse and Energy Reporting (Measurement) Determination", + "jurisdictionCountry": "Enumeration Value", + "administeredBy": { + "type": ["Identifier"], + "id": "https://id.gs1.org/01/09520123456788/21/12345", + "name": "EV battery 300Ah.", + "registeredId": "90664869327", + "idScheme": { + "type": ["IdentifierScheme"], + "id": "https://id.gs1.org/01/", + "name": "Global Trade Identification Number (GTIN)" + } + }, + "effectiveDate": "2024-03-20" + }, + "assessmentCriteria": [ + { + "type": ["Criterion"], + "id": "https://www.globalbattery.org/media/publications/gba-rulebook-v2.0-master.pdf#BatteryAssembly", + "name": "GBA Battery rule book v2.0 battery assembly guidelines.", + "thresholdValues": [ + { + "metricName": "GHG emissions intensity", + "metricValue": { + "value": 10, + "unit": "KGM" + }, + "score": "BB", + "accuracy": 0.05 + }, + { + "metricName": "GHG emissions intensity", + "metricValue": { + "value": 10, + "unit": "KGM" + }, + "score": "BB", + "accuracy": 0.05 + } + ] + }, + { + "type": ["Criterion"], + "id": "https://www.globalbattery.org/media/publications/gba-rulebook-v2.0-master.pdf#BatteryAssembly", + "name": "GBA Battery rule book v2.0 battery assembly guidelines.", + "thresholdValues": [ + { + "metricName": "GHG emissions intensity", + "metricValue": { + "value": 10, + "unit": "KGM" + }, + "score": "BB", + "accuracy": 0.05 + }, + { + "metricName": "GHG emissions intensity", + "metricValue": { + "value": 10, + "unit": "KGM" + }, + "score": "BB", + "accuracy": 0.05 + } + ] + } + ], + "declaredValue": [ + { + "metricName": "GHG emissions intensity", + "metricValue": { + "value": 10, + "unit": "KGM" + }, + "score": "BB", + "accuracy": 0.05 + }, + { + "metricName": "GHG emissions intensity", + "metricValue": { + "value": 10, + "unit": "KGM" + }, + "score": "BB", + "accuracy": 0.05 + } + ], + "conformance": true, + "conformityTopic": "environment.emissions", + "conformityEvidence": { + "linkURL": "https://files.example-certifier.com/1234567.json", + "linkName": "GBA rule book conformity certificate", + "linkType": "https://test.uncefact.org/vocabulary/linkTypes/dcc", + "hashDigest": "6239119", + "hashMethod": "SHA-256", + "encryptionMethod": "AES" + } + } + ] + }, + "constructData": { + "mappingFields": [], + "dummyFields": [], + "generationFields": [ + { + "path": "/eventID", + "handler": "generateIdWithSerialNumber" + } + ] + }, + "className": "json-form", + "style": { + "margin": "40px auto", + "paddingTop": "40px", + "width": "80%" + } + } + }, + { + "name": "CustomButton", + "type": "Submit", + "props": {} + } + ], + "services": [ + { + "name": "processDigitalFacilityRecord", + "parameters": [ + { + "vckit": { + "vckitAPIUrl": "http://localhost:3332/v2", + "issuer": "did:web:9f91-58-187-62-179.ngrok-free.app" + }, + "digitalFacilityRecord": { + "context": ["https://dpp-json-ld.s3.ap-southeast-2.amazonaws.com/dppld.json"], + "renderTemplate": [ + { + "template": "
Digital Facility Record
", + "@type": "WebRenderingTemplate2022" + } + ], + "type": ["VerifiableCredential", "DigitalFacilityRecord"], + "dlrLinkTitle": "DigitalFacilityRecord", + "dlrIdentificationKeyType": "gln", + "dlrVerificationPage": "http://localhost:3003/verify" + }, + "dlr": { + "dlrAPIUrl": "http://localhost:3000", + "dlrAPIKey": "test123", + "namespace": "gs1", + "linkRegisterPath": "/api/resolver" + }, + "storage": { + "url": "http://localhost:3334/v1/documents", + "params": { + "resultPath": "/uri", + "bucket": "verifiable-credentials" + }, + "options": { + "method": "POST", + "headers": { + "Content-Type": "application/json" + } + } + }, + "identifierKeyPath": "/id" + } + ] + } + ] + }, + { + "name": "Move to Next Facility", + "id": "transaction_product", + "components": [ + { + "name": "LocalStorageLoader", + "type": "EntryData", + "props": { + "storageKey": "CherriesFarm_dpps", + "nestedComponents": [ + { + "name": "JsonForm", + "type": "EntryData", + "props": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "sourceParty": { + "$ref": "#/$defs/Party", + "description": "The source party for this supply chain transaction - typically the seller party" + }, + "destinationParty": { + "$ref": "#/$defs/Party", + "description": "The destination party for this supply chain transaction - typically the buyer party." + }, + "epcList": { + "type": "array", + "items": { "$ref": "#/$defs/Item" }, + "description": "The list of uniquely identified trade items included in this supply chain transaction." + }, + "quantityList": { + "type": "array", + "items": { "$ref": "#/$defs/QuantityElement" }, + "description": "List of quantified product classes that are included in this transaction. Used when the trade items do not have unique identifiers (eg 100 reels of yarn)" + }, + "referenceDocument": { + "$ref": "#/$defs/TradeDocument", + "description": "The supply chain document reference for this transaction event - eg the invoice, order, or dispatch advice" + }, + "eventID": { + "x-jargon-isKey": true, + "type": "string", + "description": "The unique identifier of this event - SHOULD be a UUID" + }, + "eventTime": { + "type": "string", + "format": "date-time", + "description": "The ISO-8601 date time when the event occurred." + }, + "action": { + "type": "string", + "enum": ["observe", "add", "delete"], + "example": "observe", + "description": "Code describing how an event relates to the lifecycle of the entity impacted by the event." + }, + "disposition": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/Disp", + "description": "Disposition code describing the state of the item after the event. \n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/Disp\n " + }, + "bizStep": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/BizStep", + "description": "A business step code drawn from a controlled vocabulary. \n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/BizStep\n " + }, + "bizLocation": { + "type": "string", + "format": "uri", + "description": "A Business Location is a uniquely identified and discretely recorded geospatial location that is meant to designate the specific place where an object is assumed to be following an EPCIS event until it is reported to be at a different Business Location by a subsequent EPCIS event. The bizLocation must be a resolvable URI that links to facility information and geolocation data." + }, + "sensorElementList": { + "type": "array", + "items": { "$ref": "#/$defs/SensorElement" }, + "description": "An array (one for each sensor) of sensor device data sets associated with the event. " + } + }, + "description": "Transaction represents an event in which one or more objects become associated or disassociated with one or more identified business transactions - such as the purchase / shipment of goods between buyer and seller.", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$defs": { + "TransactionEvent": { + "type": "object", + "additionalProperties": false, + "properties": { + "sourceParty": { + "$ref": "#/$defs/Party", + "description": "The source party for this supply chain transaction - typically the seller party" + }, + "destinationParty": { + "$ref": "#/$defs/Party", + "description": "The destination party for this supply chain transaction - typically the buyer party." + }, + "epcList": { + "type": "array", + "items": { "$ref": "#/$defs/Item" }, + "description": "The list of uniquely identified trade items included in this supply chain transaction." + }, + "quantityList": { + "type": "array", + "items": { "$ref": "#/$defs/QuantityElement" }, + "description": "List of quantified product classes that are included in this transaction. Used when the trade items do not have unique identifiers (eg 100 reels of yarn)" + }, + "referenceDocument": { + "$ref": "#/$defs/TradeDocument", + "description": "The supply chain document reference for this transaction event - eg the invoice, order, or dispatch advice" + }, + "eventID": { + "x-jargon-isKey": true, + "readOnly": true, + "type": "string", + "description": "The unique identifier of this event - SHOULD be a UUID" + }, + "eventTime": { + "type": "string", + "format": "date-time", + "description": "The ISO-8601 date time when the event occurred." + }, + "action": { + "type": "string", + "enum": ["observe", "add", "delete"], + "example": "observe", + "description": "Code describing how an event relates to the lifecycle of the entity impacted by the event." + }, + "disposition": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/Disp", + "description": "Disposition code describing the state of the item after the event. \n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/Disp\n " + }, + "bizStep": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/BizStep", + "description": "A business step code drawn from a controlled vocabulary. \n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/BizStep\n " + }, + "bizLocation": { + "type": "string", + "format": "uri", + "description": "A Business Location is a uniquely identified and discretely recorded geospatial location that is meant to designate the specific place where an object is assumed to be following an EPCIS event until it is reported to be at a different Business Location by a subsequent EPCIS event. The bizLocation must be a resolvable URI that links to facility information and geolocation data." + }, + "sensorElementList": { + "type": "array", + "items": { "$ref": "#/$defs/SensorElement" }, + "description": "An array (one for each sensor) of sensor device data sets associated with the event. " + } + }, + "description": "Transaction represents an event in which one or more objects become associated or disassociated with one or more identified business transactions - such as the purchase / shipment of goods between buyer and seller." + }, + "Party": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "string", + "description": "The decentralised identifier of the party - must be a W3C DID." + }, + "name": { + "type": "string", + "description": "The name of the organization or company, represented as a text string." + }, + "identifiers": { + "type": "array", + "items": { "$ref": "#/$defs/Identifier" }, + "description": "A list of unique business identifiers assigned to the party - such as tax registration numbers." + } + }, + "description": "The Party class represents an entity such as an organization, or a company that manufactured the product." + }, + "Identifier": { + "type": "object", + "additionalProperties": false, + "properties": { + "scheme": { + "type": "string", + "format": "uri", + "description": "the identifier scheme as defined by the registrar that manages the identifier registry. If the identifier scheme is registered with UNTP then this URI can use used to dicsover the resolution method (to get more data) and the verification method (to prove ownership)." + }, + "identifierValue": { + "type": "string", + "description": "The value of the identifier within the scheme" + }, + "binding": { + "$ref": "#/$defs/Evidence", + "description": "Link to evidence that attests to the validity and ownership of the identifer. " + } + }, + "description": "An identifier of a party, product, or facility that is defined by an identifier scheme and idenfier value and, optinally, verification evidence " + }, + "Evidence": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": ["w3c_vc", "iso_mdl", "document", "website", "other"], + "example": "w3c_vc", + "description": "Format of the evidence (verifiable credential, document, website, etc)" + }, + "assuranceLevel": { + "type": "string", + "enum": ["Self", "Commercial", "Buyer", "Membership", "Unspecified", "3rdParty"], + "example": "Self", + "description": "The assurance level of the evidence (self declaration, 2nd party, 3rd party, accredited auditor)" + }, + "reference": { + "type": "string", + "format": "uri", + "description": "The URL at which the evidence data can be found. " + } + }, + "description": "Evidence to support a conformity or identity claim. " + }, + "Item": { + "type": "object", + "additionalProperties": false, + "properties": { + "itemID": { + "x-jargon-isKey": true, + "type": "string", + "format": "uri", + "description": "The globally unique identifier (eg GS1 GTIN or digital link) of the product item. " + }, + "name": { + "type": "string", + "description": "The name of the product class to which the product item belongs. " + } + }, + "description": "A specific trade item /product code which could be either a product serial number or a consignment identifier " + }, + "QuantityElement": { + "type": "object", + "additionalProperties": false, + "properties": { + "epcClass": { + "type": "string", + "format": "uri", + "description": "THe identifier of a product class (as opposed to a product instance) such as a GTIN code for a manufactured product." + }, + "quantity": { + "type": "number", + "description": "The numeric quantity of the product class (eg 100 kg of cotton)" + }, + "uom": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/UnitMeasureCode", + "description": "The unit of measure for the quantity value (eg Kg or meters etc) using the UNECE Rec 20 unit of measure codelist.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/UnitMeasureCode\n " + } + }, + "description": "The quantity element is used to define the quantities (eg 100), units of measure (eg Kg) and product class (eg GTIN or other class identifier) of products that are inputs or outputs or the subject of supply chain events. ", + "required": ["quantity"] + }, + "TradeDocument": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/BTT", + "description": "The document type representing the trade transaction drawn from the business transaction type vocabulary.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/BTT\n " + }, + "identifier": { + "type": "string", + "description": "The identifier of the trade transaction document - eg an invoice number or bill of lading number. Must be unique for a given source party" + }, + "documentURL": { + "type": "string", + "format": "uri", + "description": "The URL of the referenced trade document. For integrity reasons, it is recommended (but not required) that the documentURL is a hashlink (https://w3c-ccg.github.io/hashlink/) so that if the document the URL is changed then the hash verification will fail." + } + }, + "description": "A trade transaction between two parties such as an invoice, purchase order, or shipping notification." + }, + "SensorElement": { + "type": "object", + "additionalProperties": false, + "properties": { + "sensorMetadata": { + "$ref": "#/$defs/Sensor", + "description": "Data that describes the physical sensor that recorded the sensor data set." + }, + "sensorReport": { + "type": "array", + "items": { "$ref": "#/$defs/SensorData" }, + "description": "A list of sensor readings from the given sensor relevant to the traceability event context." + }, + "sensorIntegrityProof": { + "type": "string", + "format": "uri", + "description": "An optional reference to a verifiable credential signed by the sensor device or device manufacturer that contains the digitally signed raw data associated with this sensor report." + } + }, + "description": "A SensorElement is used to carry data related to an event that is captured one sensor such as an IoT device. Include one sensor property and an array of sensor data values." + }, + "Sensor": { + "type": "object", + "additionalProperties": false, + "properties": { + "device": { + "$ref": "#/$defs/Item", + "description": "The device Identifier for the sensor as a URI (typically an EPC)" + }, + "dataProcessingMethod": { + "type": "string", + "format": "uri", + "description": "The data processing method used by the sensor - should reference a documented standard criteria as a URI" + } + }, + "description": "A physical sensor that records a sensor data set." + }, + "SensorData": { + "type": "object", + "additionalProperties": false, + "properties": { + "time": { + "type": "string", + "format": "date-time", + "description": "the timestamp at which the sensor reading was made." + }, + "type": { + "type": "string", + "format": "uri", + "description": "the measurement type of the sensor reading, as a URI reference to a measurement method specification." + }, + "value": { "type": "number", "description": "the sensor reading" }, + "uom": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/UnitMeasureCode", + "description": "the unit of measure for the sensor reading\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/UnitMeasureCode\n " + } + }, + "description": "A data point read by a sensor." + } + } + } + }, + "constructData": { + "mappingFields": [ + { + "sourcePath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue", + "destinationPath": "/eventID" + }, + { + "sourcePath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue", + "destinationPath": "/epcList/index/name" + }, + { + "sourcePath": "/linkResolver", + "destinationPath": "/epcList/index/itemID" + } + ], + "dummyFields": [ + { + "path": "/action", + "data": "observe" + }, + { + "path": "/disposition", + "data": "https://ref.gs1.org/cbv/Disp/in_transit" + }, + { + "path": "/bizStep", + "data": "https://ref.gs1.org/cbv/BizStep/receiving" + }, + { + "path": "/bizLocation", + "data": "https://example.com/warehouse" + }, + { + "path": "/sourceParty", + "data": { + "id": "did:web:143f-2406-2d40-4106-2b10-38c6-9732-f2d9-bb1c.ngrok-free.app", + "name": "Cherries Farm", + "identifiers": [ + { + "scheme": "https://example.com/scheme/source", + "identifierValue": "SRC123456", + "binding": { + "type": "w3c_vc", + "assuranceLevel": "3rdParty", + "reference": "https://example.com/source_evidence" + } + } + ] + } + }, + { + "path": "/destinationParty", + "data": { + "id": "did:web:143f-2406-2d40-4106-2b10-38c6-9732-f2d9-bb1c.ngrok-free.app", + "name": "Cherries Processor", + "identifiers": [ + { + "scheme": "https://example.com/scheme/destination", + "identifierValue": "DST7891011", + "binding": { + "type": "w3c_vc", + "assuranceLevel": "3rdParty", + "reference": "https://example.com/destination_evidence" + } + } + ] + } + } + ], + "generationFields": [ + { + "path": "/eventID", + "handler": "generateIdWithSerialNumber" + }, + { + "path": "/eventTime", + "handler": "generateCurrentDatetime" + } + ] + } + } + ] + } + }, + { + "name": "CustomButton", + "type": "Submit", + "props": { + "includeDownload": true, + "downloadFileName": "transaction" + } + } + ], + "services": [ + { + "name": "processTransactionEvent", + "parameters": [ + { + "vckit": { + "vckitAPIUrl": "http://localhost:3332/v2", + "issuer": "did:web:60c5-115-79-212-164.ngrok-free.app" + }, + "epcisTransactionEvent": { + "context": ["https://dpp-json-ld.s3.ap-southeast-2.amazonaws.com/transaction-event-ld.json"], + "renderTemplate": [ + { + "template": "Transaction Event

TRACEABILITY EVENT

Transaction

EVENT ISSUED BY

{{issuer.name}}

{{#each issuer.identifiers}}
Industry
Needs to be replaced...
Business identifier
Needs to be replaced...
Identity verification
{{identiferValue}}
Verifiable credential
{{/each}}

Event description

Event ID
{{credentialSubject.eventID}}
Event type
Needs to be replaced...
Description
Needs to be replaced...
Time and date
{{credentialSubject.eventTime}}
Lifecycle action
{{credentialSubject.action}}
Product disposition
{{credentialSubject.disposition}}
Business step
{{credentialSubject.bizStep}}

Transaction

{{credentialSubject.sourceParty.name}}

SOURCE

{{credentialSubject.sourceParty.identifiers.0.identifierValue}}

Transferred

{{credentialSubject.destinationParty.name}}

DESTINATION

{{credentialSubject.destinationParty.partyID}}

Object list

{{#each credentialSubject.epcList}}

{{name}}

{{itemID}}

Product class name

Sustainability 0%
Confidence 0%
View
{{/each}}

Sensor

{{#each credentialSubject.sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}

{{time}}

Data type

{{value}} {{uom}}

{{/each}}{{sensorIntegrityProof}}
Other evidence
{{/each}}
", + "@type": "WebRenderingTemplate2022" + } + ], + "type": ["TransactionEventCredential"], + "dlrLinkTitle": "Transaction Event", + "dlrIdentificationKeyType": "gtin", + "dlrVerificationPage": "http://localhost:3003/verify" + }, + "dlr": { + "dlrAPIUrl": "http://localhost:3000", + "dlrAPIKey": "test123", + "namespace": "gs1", + "linkRegisterPath": "/api/resolver" + }, + "storage": { + "url": "http://localhost:3334/v1/documents", + "params": { + "resultPath": "/uri", + "bucket": "verifiable-credentials" + }, + "options": { + "method": "POST", + "headers": { + "Content-Type": "application/json" + } + } + }, + "identifierKeyPath": "/eventID", + "localStorageParams": { "storageKey": "CherriesFarm_dpps", "keyPath": "/epcList/index/name" } + } + ] + }, + { + "name": "mergeToLocalStorage", + "parameters": [ + { + "storageKey": "orchard_facility_transaction_event", + "objectKeyPath": "/decodedEnvelopedVC/credentialSubject/eventID" + } + ] + } + ] + } + ] + }, + { + "name": "Packhouse Facility", + "type": "producer", + "assets": { + "logo": "Cherries-farm-logo.webp", + "brandTitle": "Packhouse Facility" + }, + "styles": { + "primaryColor": "#b5651d", + "secondaryColor": "#391561", + "tertiaryColor": "#ffffff" + }, + "features": [ + { + "name": "Issue DPP", + "id": "produce_product", + "components": [ + { + "name": "LocalStorageLoader", + "type": "EntryData", + "props": { + "storageKey": "orchard_facility_transaction_event", + "nestedComponents": [ + { + "name": "JsonForm", + "type": "EntryData", + "props": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "productIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An array of unique identifiers assigned to the product or model. " + }, + "batchIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "Information regarding the specific production batch of the product." + }, + "itemIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An array of identifiers representing a specific serialised item of the product." + }, + "classification": { + "type": "array", + "items": { + "$ref": "#/$defs/Classification" + }, + "description": "A code representing the product's class, typically using the UN CPC (United Nations Central Product Classification) https://unstats.un.org/unsd/classifications/Econ/cpc" + }, + "modelName": { + "type": "string", + "description": "The model name or number of the product, represented as text." + }, + "image": { + "$ref": "#/$defs/BinaryFile", + "description": "A unique identifier (URI) pointing to an image of the product." + }, + "description": { + "type": "string", + "description": "A textual description providing details about the product." + }, + "furtherInformation": { + "type": "string", + "format": "uri", + "description": "A URL pointing to further human readable information about the product." + }, + "manufacturedDate": { + "type": "string", + "format": "date", + "description": "The ISO 8601 date on which the product batch was manufactured." + }, + "dimension": { + "$ref": "#/$defs/Dimension", + "description": "The physical dimensions of the product. Not every dimension is relevant to every products. For example bulk materials may have wieght and volume but not length, with, or height." + }, + "characteristic": { + "$ref": "#/$defs/Characteristic", + "description": "" + }, + "manufacturer": { + "$ref": "#/$defs/Party", + "description": "The Party entity that manufactured the product." + }, + "manufacturedAt": { + "$ref": "#/$defs/Facility", + "description": "The Facility where the product batch was manufactured." + }, + "materialsProvenance": { + "type": "array", + "items": { + "$ref": "#/$defs/Material" + }, + "description": "An array of Provenance objects providing details on the origin and mass fraction of components or ingredients of the product batch." + }, + "conformityClaim": { + "type": "array", + "items": { + "$ref": "#/$defs/Claim" + }, + "description": "An array of claim objects representing various product conformity claims about the product / batch. These can be sustainability claims, circularity claims, or any other claim type within the conformity topic list." + }, + "recyclingInstruction": { + "type": "string", + "format": "uri", + "description": "A URI pointing to information regarding the recycling aspects of the product." + }, + "traceabilityInformation": { + "type": "array", + "items": { + "$ref": "#/$defs/TraceabilityEvent" + }, + "description": "An array of TraceabilityEvent objects detailing EPCIS events related to the traceability of the product batch." + } + }, + "description": "The ProductInformation class encapsulates detailed information regarding a specific product, including its identification details, manufacturer, and other pertinent details.", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$defs": { + "Product": { + "type": "object", + "additionalProperties": false, + "properties": { + "productIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An array of unique identifiers assigned to the product or model. " + }, + "batchIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "Information regarding the specific production batch of the product." + }, + "itemIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An array of identifiers representing a specific serialised item of the product." + }, + "classification": { + "type": "array", + "items": { + "$ref": "#/$defs/Classification" + }, + "description": "A code representing the product's class, typically using the UN CPC (United Nations Central Product Classification) https://unstats.un.org/unsd/classifications/Econ/cpc" + }, + "modelName": { + "type": "string", + "description": "The model name or number of the product, represented as text." + }, + "image": { + "$ref": "#/$defs/BinaryFile", + "description": "A unique identifier (URI) pointing to an image of the product." + }, + "description": { + "type": "string", + "description": "A textual description providing details about the product." + }, + "furtherInformation": { + "type": "string", + "format": "uri", + "description": "A URL pointing to further human readable information about the product." + }, + "manufacturedDate": { + "type": "string", + "format": "date", + "description": "The ISO 8601 date on which the product batch was manufactured." + }, + "dimension": { + "$ref": "#/$defs/Dimension", + "description": "The physical dimensions of the product. Not every dimension is relevant to every products. For example bulk materials may have wieght and volume but not length, with, or height." + }, + "characteristic": { + "$ref": "#/$defs/Characteristic", + "description": "" + }, + "manufacturer": { + "$ref": "#/$defs/Party", + "description": "The Party entity that manufactured the product." + }, + "manufacturedAt": { + "$ref": "#/$defs/Facility", + "description": "The Facility where the product batch was manufactured." + }, + "materialsProvenance": { + "type": "array", + "items": { + "$ref": "#/$defs/Material" + }, + "description": "An array of Provenance objects providing details on the origin and mass fraction of components or ingredients of the product batch." + }, + "conformityClaim": { + "type": "array", + "items": { + "$ref": "#/$defs/Claim" + }, + "description": "An array of claim objects representing various product conformity claims about the product / batch. These can be sustainability claims, circularity claims, or any other claim type within the conformity topic list." + }, + "recyclingInstruction": { + "type": "string", + "format": "uri", + "description": "A URI pointing to information regarding the recycling aspects of the product." + }, + "traceabilityInformation": { + "type": "array", + "items": { + "$ref": "#/$defs/TraceabilityEvent" + }, + "description": "An array of TraceabilityEvent objects detailing EPCIS events related to the traceability of the product batch." + } + }, + "description": "The ProductInformation class encapsulates detailed information regarding a specific product, including its identification details, manufacturer, and other pertinent details." + }, + "Identifier": { + "type": "object", + "additionalProperties": false, + "properties": { + "scheme": { + "type": "string", + "format": "uri", + "description": "the identifier scheme as defined by the registrar that manages the identifier registry. If the identifier scheme is registered with UNTP then this URI can use used to dicsover the resolution method (to get more data) and the verification method (to prove ownership)." + }, + "identifierValue": { + "type": "string", + "description": "The value of the identifier within the scheme" + }, + "binding": { + "$ref": "#/$defs/Evidence", + "description": "Link to evidence that attests to the validity and ownership of the identifer. " + } + }, + "description": "An identifier of a party, product, or facility that is defined by an identifier scheme and idenfier value and, optinally, verification evidence " + }, + "Evidence": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": ["w3c_vc", "iso_mdl", "document", "website", "other"], + "example": "w3c_vc", + "description": "Format of the evidence (verifiable credential, document, website, etc)" + }, + "assuranceLevel": { + "type": "string", + "enum": ["Self", "Commercial", "Buyer", "Membership", "Unspecified", "3rdParty"], + "example": "Self", + "description": "The assurance level of the evidence (self declaration, 2nd party, 3rd party, accredited auditor)" + }, + "reference": { + "type": "string", + "format": "uri", + "description": "The URL at which the evidence data can be found. " + } + }, + "description": "Evidence to support a conformity or identity claim. " + }, + "Classification": { + "type": "object", + "additionalProperties": false, + "properties": { + "scheme": { + "type": "string", + "format": "uri", + "description": "Classification scheme - eg https://unstats.un.org/unsd/classifications/Econ/cpc " + }, + "classifierValue": { + "type": "string", + "description": "classifier value within the scheme - eg \"01211\" in UN CPC" + }, + "classifierName": { + "type": "string", + "description": "Name of the classifier - eg \"Asparagus\" for code \"01211\" in UNCPC" + }, + "classifierURL": { + "type": "string", + "format": "uri", + "description": "Linked data URL to a web vocabulary entery for this classificaiton code. When this property is provided, the scheme, value, and name properties of the classifer are not required. eg https://vocabulary.uncefact.org/unlocode#AUBNE represensign the port of Brisbane in the UN/LOCODE classification scheme." + } + }, + "description": "A classification scheme and code / name representing a category value for a product, entity, or facility." + }, + "BinaryFile": { + "type": "object", + "additionalProperties": false, + "properties": { + "fileHash": { + "x-jargon-isKey": true, + "type": "string", + "description": "The MD5 hash of the file." + }, + "fileLocation": { + "type": "string", + "format": "uri", + "description": "The location of the evidence file." + }, + "fileType": { + "type": "string", + "x-external-enumeration": "https://mimetype.io/all-types", + "description": "The type of file, represented as a MIME type.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://mimetype.io/all-types\n " + } + }, + "description": "A file representing a data snapshot that is used to infomr the conformity assessment." + }, + "Dimension": { + "type": "object", + "additionalProperties": false, + "properties": { + "weight": { + "$ref": "#/$defs/Measure", + "description": "the weight of the product" + }, + "length": { + "$ref": "#/$defs/Measure", + "description": "The length of the product or packaging" + }, + "width": { + "$ref": "#/$defs/Measure", + "description": "The width of the product or packaging" + }, + "height": { + "$ref": "#/$defs/Measure", + "description": "The height of the product or packaging" + }, + "volume": { + "$ref": "#/$defs/Measure", + "description": "The displacement volume of the product." + } + }, + "description": "Overall (length, width, height) dimensions and weight/volume of an item." + }, + "Measure": { + "type": "object", + "additionalProperties": false, + "properties": { + "value": { + "type": "number", + "description": "The numeric value of the measure" + }, + "unit": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/UnitMeasureCode", + "description": "Unit of measure drawn from the UNECE rec20 measure code list.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/UnitMeasureCode\n " + } + }, + "description": "The measure class defines a numeric measured value (eg 10) and a coded unit of measure (eg KG)." + }, + "Characteristic": { + "type": "object", + "additionalProperties": false, + "properties": {}, + "description": "Product specific characteristics. This class is an extension point for industry specific product characteristics or performance information such as clothing size or battery capacity." + }, + "Party": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "string", + "description": "The decentralised identifier of the party - must be a W3C DID." + }, + "name": { + "type": "string", + "description": "The name of the organization or company, represented as a text string." + }, + "identifiers": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "A list of unique business identifiers assigned to the party - such as tax registration numbers." + } + }, + "description": "The Party class represents an entity such as an organization, or a company that manufactured the product." + }, + "Facility": { + "type": "object", + "additionalProperties": false, + "properties": { + "identifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "A unique identifier (URI) assigned to the facility. (Link Resolver - GS1 GLN?)" + }, + "name": { + "type": "string", + "description": "The name of the facility, represented as a text string." + }, + "location": { + "type": "string", + "format": "uri", + "description": "" + }, + "operatedBy": { + "$ref": "#/$defs/Party", + "description": "The Party entity responsible for operating the facility." + } + }, + "description": "The physical site (eg farm or factory) where the product or materials was produced." + }, + "Material": { + "type": "object", + "additionalProperties": false, + "properties": { + "originCountry": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/CountryId", + "description": "A ISO 3166-1 code representing the country of origin of the component or ingredient.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/CountryId\n " + }, + "materialType": { + "$ref": "#/$defs/Classification", + "description": "The type of this material - as a value drawn from a controlled vocabulary eg textileexchange.org/materials/rm01014 - representing organic cotton." + }, + "massFraction": { + "type": "number", + "description": "A numeric value representing the mass fraction of the product represented by this material. The sum of all mass fraction values for a given passport should be 100." + }, + "recycled": { + "type": "boolean", + "description": "Indicator is true if this material input is from a recycled source." + }, + "hazardous": { + "type": "boolean", + "description": "Indicates whether this material is hazardous. If true then " + } + }, + "description": "The material class encapsulates details about the origin or source of raw materials in a product, including the country of origin and the mass fraction." + }, + "Claim": { + "type": "object", + "additionalProperties": false, + "properties": { + "topic": { + "type": "string", + "enum": [ + "environment.energy", + "environment.emissions", + "environment.water", + "environment.waste", + "environment.deforestation", + "environment.biodiversity", + "circularity.content", + "circularity.design", + "social.labour", + "social.rights", + "social.community", + "social.safety", + "governance.ethics", + "governance.compliance", + "governance.transparency" + ], + "example": "environment.energy", + "description": "A code representing the topic of the sustainability claim. E.g. environment.deforestation, environment.ghg-emission-intensity, etc.. Drawn from a standard code list. " + }, + "standardOrRegulation": { + "type": "string", + "format": "uri", + "description": "The standard or regulation against which this conformity claim is made. Expressed as a URI and should match a value in the UN catalogue of reference vocabularies. " + }, + "criteriaReference": { + "type": "string", + "format": "uri", + "description": "A URI pointing to the specific criteria within the standard or regulation against which this claim is made." + }, + "claimedValues": { + "type": "array", + "items": { + "$ref": "#/$defs/Metric" + }, + "description": "One or more actual measures supporting the claim. For example for GHG emissions there may be a metric for total emissions intensity and also a metric for amount of offsets included." + }, + "benchmarkValue": { + "$ref": "#/$defs/Metric", + "description": "A benchmark value against which the claimed value can be assessed. THis could be a value specified by a standard or regulation or could be an industry benchmark." + }, + "benchmarkReference": { + "type": "string", + "format": "uri", + "description": "A refernce to evidence to support the benchmark value." + }, + "conformance": { + "type": "boolean", + "description": "and indicator (boolean) that expresses whether or not this product has achieved compliance against the criteria. for example, if the topic is environment.deforstation and the criteria is EU.2023.1115 then the product is conformant if it has not touched any facility throughout it's lifecycle that is not deforestation free since dec 2020." + }, + "conformityEvidence": { + "$ref": "#/$defs/Evidence", + "description": "A URI pointing to the evidence supporting the claim. Most likely in the form of a verifiable credential." + } + }, + "description": "The SustainabilityClaim class represents specific claims regarding the sustainability of a product, providing details about the metrics, thresholds, and evidences supporting the claim." + }, + "Metric": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "description": "A human readable name for this metric" + }, + "value": { + "$ref": "#/$defs/Measure", + "description": "A numeric value representing the measurement or evaluation outcome for the claim." + }, + "accuracy": { + "type": "number", + "description": "A percentage represented as a numeric between 0 and 1 indicating the rage of accuracy of the claimed value (eg 0.05 means that the actual value is within 5% of the claimed value.)" + } + }, + "description": "A specific measure of performance against the criteria that governs the claim. Expressed as an array of metric (ie unit of emasure) / value (ie the actual numeric value) pairs. " + }, + "TraceabilityEvent": { + "type": "object", + "additionalProperties": false, + "properties": { + "eventReference": { + "type": "string", + "format": "uri", + "description": "A URI pointing to the detailed information about the EPCIS event. Most likely in the form of a verifiable credential." + }, + "eventType": { + "type": "string", + "enum": ["aggregation", "transformation", "object", "transaction", "association"], + "example": "aggregation", + "description": "A code representing the type of EPCIS event. ObjectEvent, AggregationEvent, TransactionEvent, TransformationEvent, ObjectEvent." + } + }, + "description": "The TraceabilityEvent class represents a specific EPCIS event in the traceability chain of a product, including details about the event type and reference." + } + } + }, + "data": { + "image": "data:image/jpg;base64,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", + "productIdentifier": [ + { + "scheme": "https://id.gs1.org/gtin", + "identifierValue": "0105012345678900", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://id.gs1.org/gtin/05012345678900/binding" + } + } + ], + "batchIdentifier": [ + { + "scheme": "https://Cherriesfarm.example.org/batch", + "identifierValue": "BATCH-2024-001", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://Cherriesfarm.example.org/batch/2024-001/binding" + } + } + ], + "itemIdentifier": [ + { + "scheme": "https://Cherriesfarm.example.org/item", + "identifierValue": "TRF-24-0001", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://Cherriesfarm.example.org/item/TRF-24-0001/binding" + } + } + ], + "classification": [ + { + "scheme": "https://www.unspsc.org", + "classifierValue": "50383710", + "classifierName": "Cherriess", + "classifierURL": "https://www.unspsc.org/search-code/50383710" + } + ], + "modelName": "Black Cherries", + "description": "Premium Black Cherriess harvested from our sustainable Cherries orchards.", + "furtherInformation": "https://Cherriesfarm.example.org/products/black_perigord", + "manufacturedDate": "2024-01-15", + "dimension": { + "weight": { "value": 50, "unit": "GRM" } + }, + "materialsProvenance": [ + { + "originCountry": "AU", + "materialType": { + "scheme": "https://www.gs1.org/gpc", + "classifierValue": "10005953", + "classifierName": "Cherriess (Fresh)", + "classifierURL": "https://www.gs1.org/gpc/10005953" + }, + "massFraction": 100, + "recycled": false, + "hazardous": false + } + ], + "characteristic": { + "variety": "Tuber melanosporum", + "grade": "Extra", + "aroma": "Intense, earthy", + "flavor": "Rich, complex" + }, + "manufacturer": { + "id": "did:example:123456789abcdefghi", + "name": "Gourmet Cherries Farm", + "identifiers": [ + { + "scheme": "https://identifier.example.org/company", + "identifierValue": "COMP-12345", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://identifier.example.org/company/12345/binding" + } + } + ] + }, + "manufacturedAt": { + "identifier": [ + { + "scheme": "https://identifier.example.org/facility", + "identifierValue": "FAC-5678", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://identifier.example.org/facility/5678/binding" + } + } + ], + "name": "Cherries Orchard", + "location": "https://Cherriesfarm.example.org/locations/perigord_orchard", + "operatedBy": { + "id": "did:example:123456789abcdefghi", + "name": "Gourmet Cherries Farm", + "identifiers": [ + { + "scheme": "https://identifier.example.org/company", + "identifierValue": "COMP-12345", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://identifier.example.org/company/12345/binding" + } + } + ] + } + } + }, + "className": "json-form", + "style": { + "margin": "40px auto", + "paddingTop": "40px", + "width": "80%" + } + }, + "constructData": { + "mappingFields": [ + { + "sourcePath": "/linkResolver", + "destinationPath": "/traceabilityInformation/0/eventReference" + } + ], + "dummyFields": [ + { + "path": "/traceabilityInformation/0/eventType", + "data": "transaction" + } + ], + "generationFields": [] + } + } + ] + } + }, + { + "name": "CustomButton", + "type": "Submit", + "props": {} + } + ], + "services": [ + { + "name": "processDPP", + "parameters": [ + { + "vckit": { + "vckitAPIUrl": "http://localhost:3332/v2", + "issuer": "did:web:60c5-115-79-212-164.ngrok-free.app" + }, + "dpp": { + "context": ["https://dpp-json-ld.s3.ap-southeast-2.amazonaws.com/dppld.json"], + "renderTemplate": [ + { + "template": " Digital Product Passport

PRODUCT PASSPORT

{{credentialSubject.modelName}}

{{#each credentialSubject.batchIdentifier}} {{/each}} {{#each credentialSubject.productIdentifier}} {{/each}}

Sustainability

100%

Confidence

100%

PASSPORT ISSUED BY

{{issuer.name}}

Industry

Agriculture

Business identifier
75 859 224 235
Location
Rooty Hill, NSW
Identity verification
75 859 224 235
Other evidence

Conformity credentials

Conformity credentials are usually issued by independent third parties and provide a trusted assessment of product ESG performance against credible standards or regulations

{{#each credentialSubject.conformityClaim}}

{{topic}}

{{!-- {{#if (eq conformityEvidence.type 'w3c_vc')}} --}}
Verifiable credential
{{!-- {{/if}} --}}

View details

{{/each}}

Product composition

A complete list of materials that make up the composition of this product.

{{#each credentialSubject.materialsProvenance}}

{{massFraction}}%

ID {{materialType.classifierValue}}

{{materialType.classifierName}}

{{#if recycled}}

Recycled

{{/if}} {{#if hazardous}}

Hazard

{{/if}}
{{originCountry}}
{{/each}}

Product information

Harvest Date

{{credentialSubject.manufacturedDate}}

Batch No.

{{credentialSubject.batchIdentifier.0.identifierValue}}

Weight

{{credentialSubject.dimension.weight.value}}{{credentialSubject.dimension.weight.unit}}

Description

{{credentialSubject.description}}

", + "@type": "WebRenderingTemplate2022" + } + ], + "type": ["VerifiableCredential", "DigitalProductPassport"], + "dlrLinkTitle": "Cherries Product Passport", + "dlrIdentificationKeyType": "gtin", + "dlrVerificationPage": "http://localhost:3003/verify" + }, + "dlr": { + "dlrAPIUrl": "http://localhost:3000", + "dlrAPIKey": "test123", + "namespace": "gs1", + "linkRegisterPath": "/api/resolver" + }, + "storage": { + "url": "http://localhost:3334/v1/documents", + "params": { + "resultPath": "/uri", + "bucket": "verifiable-credentials" + }, + "options": { + "method": "POST", + "headers": { + "Content-Type": "application/json" + } + } + }, + "identifierKeyPath": "/productIdentifier/0/identifierValue" + } + ] + }, + { + "name": "mergeToLocalStorage", + "parameters": [ + { + "storageKey": "CherriesFarm_dpps", + "objectKeyPath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue" + } + ] + } + ] + }, + { + "name": "Move to Next Facility", + "id": "transaction_product", + "components": [ + { + "name": "LocalStorageLoader", + "type": "EntryData", + "props": { + "storageKey": "CherriesFarm_dpps", + "nestedComponents": [ + { + "name": "JsonForm", + "type": "EntryData", + "props": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "sourceParty": { + "$ref": "#/$defs/Party", + "description": "The source party for this supply chain transaction - typically the seller party" + }, + "destinationParty": { + "$ref": "#/$defs/Party", + "description": "The destination party for this supply chain transaction - typically the buyer party." + }, + "epcList": { + "type": "array", + "items": { "$ref": "#/$defs/Item" }, + "description": "The list of uniquely identified trade items included in this supply chain transaction." + }, + "quantityList": { + "type": "array", + "items": { "$ref": "#/$defs/QuantityElement" }, + "description": "List of quantified product classes that are included in this transaction. Used when the trade items do not have unique identifiers (eg 100 reels of yarn)" + }, + "referenceDocument": { + "$ref": "#/$defs/TradeDocument", + "description": "The supply chain document reference for this transaction event - eg the invoice, order, or dispatch advice" + }, + "eventID": { + "x-jargon-isKey": true, + "readOnly": true, + "type": "string", + "description": "The unique identifier of this event - SHOULD be a UUID" + }, + "eventTime": { + "type": "string", + "format": "date-time", + "description": "The ISO-8601 date time when the event occurred." + }, + "action": { + "type": "string", + "enum": ["observe", "add", "delete"], + "example": "observe", + "description": "Code describing how an event relates to the lifecycle of the entity impacted by the event." + }, + "disposition": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/Disp", + "description": "Disposition code describing the state of the item after the event. \n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/Disp\n " + }, + "bizStep": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/BizStep", + "description": "A business step code drawn from a controlled vocabulary. \n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/BizStep\n " + }, + "bizLocation": { + "type": "string", + "format": "uri", + "description": "A Business Location is a uniquely identified and discretely recorded geospatial location that is meant to designate the specific place where an object is assumed to be following an EPCIS event until it is reported to be at a different Business Location by a subsequent EPCIS event. The bizLocation must be a resolvable URI that links to facility information and geolocation data." + }, + "sensorElementList": { + "type": "array", + "items": { "$ref": "#/$defs/SensorElement" }, + "description": "An array (one for each sensor) of sensor device data sets associated with the event. " + } + }, + "description": "Transaction represents an event in which one or more objects become associated or disassociated with one or more identified business transactions - such as the purchase / shipment of goods between buyer and seller.", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$defs": { + "TransactionEvent": { + "type": "object", + "additionalProperties": false, + "properties": { + "sourceParty": { + "$ref": "#/$defs/Party", + "description": "The source party for this supply chain transaction - typically the seller party" + }, + "destinationParty": { + "$ref": "#/$defs/Party", + "description": "The destination party for this supply chain transaction - typically the buyer party." + }, + "epcList": { + "type": "array", + "items": { "$ref": "#/$defs/Item" }, + "description": "The list of uniquely identified trade items included in this supply chain transaction." + }, + "quantityList": { + "type": "array", + "items": { "$ref": "#/$defs/QuantityElement" }, + "description": "List of quantified product classes that are included in this transaction. Used when the trade items do not have unique identifiers (eg 100 reels of yarn)" + }, + "referenceDocument": { + "$ref": "#/$defs/TradeDocument", + "description": "The supply chain document reference for this transaction event - eg the invoice, order, or dispatch advice" + }, + "eventID": { + "x-jargon-isKey": true, + "readOnly": true, + "type": "string", + "description": "The unique identifier of this event - SHOULD be a UUID" + }, + "eventTime": { + "type": "string", + "format": "date-time", + "description": "The ISO-8601 date time when the event occurred." + }, + "action": { + "type": "string", + "enum": ["observe", "add", "delete"], + "example": "observe", + "description": "Code describing how an event relates to the lifecycle of the entity impacted by the event." + }, + "disposition": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/Disp", + "description": "Disposition code describing the state of the item after the event. \n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/Disp\n " + }, + "bizStep": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/BizStep", + "description": "A business step code drawn from a controlled vocabulary. \n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/BizStep\n " + }, + "bizLocation": { + "type": "string", + "format": "uri", + "description": "A Business Location is a uniquely identified and discretely recorded geospatial location that is meant to designate the specific place where an object is assumed to be following an EPCIS event until it is reported to be at a different Business Location by a subsequent EPCIS event. The bizLocation must be a resolvable URI that links to facility information and geolocation data." + }, + "sensorElementList": { + "type": "array", + "items": { "$ref": "#/$defs/SensorElement" }, + "description": "An array (one for each sensor) of sensor device data sets associated with the event. " + } + }, + "description": "Transaction represents an event in which one or more objects become associated or disassociated with one or more identified business transactions - such as the purchase / shipment of goods between buyer and seller." + }, + "Party": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "string", + "description": "The decentralised identifier of the party - must be a W3C DID." + }, + "name": { + "type": "string", + "description": "The name of the organization or company, represented as a text string." + }, + "identifiers": { + "type": "array", + "items": { "$ref": "#/$defs/Identifier" }, + "description": "A list of unique business identifiers assigned to the party - such as tax registration numbers." + } + }, + "description": "The Party class represents an entity such as an organization, or a company that manufactured the product." + }, + "Identifier": { + "type": "object", + "additionalProperties": false, + "properties": { + "scheme": { + "type": "string", + "format": "uri", + "description": "the identifier scheme as defined by the registrar that manages the identifier registry. If the identifier scheme is registered with UNTP then this URI can use used to dicsover the resolution method (to get more data) and the verification method (to prove ownership)." + }, + "identifierValue": { + "type": "string", + "description": "The value of the identifier within the scheme" + }, + "binding": { + "$ref": "#/$defs/Evidence", + "description": "Link to evidence that attests to the validity and ownership of the identifer. " + } + }, + "description": "An identifier of a party, product, or facility that is defined by an identifier scheme and idenfier value and, optinally, verification evidence " + }, + "Evidence": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": ["w3c_vc", "iso_mdl", "document", "website", "other"], + "example": "w3c_vc", + "description": "Format of the evidence (verifiable credential, document, website, etc)" + }, + "assuranceLevel": { + "type": "string", + "enum": ["Self", "Commercial", "Buyer", "Membership", "Unspecified", "3rdParty"], + "example": "Self", + "description": "The assurance level of the evidence (self declaration, 2nd party, 3rd party, accredited auditor)" + }, + "reference": { + "type": "string", + "format": "uri", + "description": "The URL at which the evidence data can be found. " + } + }, + "description": "Evidence to support a conformity or identity claim. " + }, + "Item": { + "type": "object", + "additionalProperties": false, + "properties": { + "itemID": { + "x-jargon-isKey": true, + "type": "string", + "format": "uri", + "description": "The globally unique identifier (eg GS1 GTIN or digital link) of the product item. " + }, + "name": { + "type": "string", + "description": "The name of the product class to which the product item belongs. " + } + }, + "description": "A specific trade item /product code which could be either a product serial number or a consignment identifier " + }, + "QuantityElement": { + "type": "object", + "additionalProperties": false, + "properties": { + "epcClass": { + "type": "string", + "format": "uri", + "description": "THe identifier of a product class (as opposed to a product instance) such as a GTIN code for a manufactured product." + }, + "quantity": { + "type": "number", + "description": "The numeric quantity of the product class (eg 100 kg of cotton)" + }, + "uom": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/UnitMeasureCode", + "description": "The unit of measure for the quantity value (eg Kg or meters etc) using the UNECE Rec 20 unit of measure codelist.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/UnitMeasureCode\n " + } + }, + "description": "The quantity element is used to define the quantities (eg 100), units of measure (eg Kg) and product class (eg GTIN or other class identifier) of products that are inputs or outputs or the subject of supply chain events. ", + "required": ["quantity"] + }, + "TradeDocument": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/BTT", + "description": "The document type representing the trade transaction drawn from the business transaction type vocabulary.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/BTT\n " + }, + "identifier": { + "type": "string", + "description": "The identifier of the trade transaction document - eg an invoice number or bill of lading number. Must be unique for a given source party" + }, + "documentURL": { + "type": "string", + "format": "uri", + "description": "The URL of the referenced trade document. For integrity reasons, it is recommended (but not required) that the documentURL is a hashlink (https://w3c-ccg.github.io/hashlink/) so that if the document the URL is changed then the hash verification will fail." + } + }, + "description": "A trade transaction between two parties such as an invoice, purchase order, or shipping notification." + }, + "SensorElement": { + "type": "object", + "additionalProperties": false, + "properties": { + "sensorMetadata": { + "$ref": "#/$defs/Sensor", + "description": "Data that describes the physical sensor that recorded the sensor data set." + }, + "sensorReport": { + "type": "array", + "items": { "$ref": "#/$defs/SensorData" }, + "description": "A list of sensor readings from the given sensor relevant to the traceability event context." + }, + "sensorIntegrityProof": { + "type": "string", + "format": "uri", + "description": "An optional reference to a verifiable credential signed by the sensor device or device manufacturer that contains the digitally signed raw data associated with this sensor report." + } + }, + "description": "A SensorElement is used to carry data related to an event that is captured one sensor such as an IoT device. Include one sensor property and an array of sensor data values." + }, + "Sensor": { + "type": "object", + "additionalProperties": false, + "properties": { + "device": { + "$ref": "#/$defs/Item", + "description": "The device Identifier for the sensor as a URI (typically an EPC)" + }, + "dataProcessingMethod": { + "type": "string", + "format": "uri", + "description": "The data processing method used by the sensor - should reference a documented standard criteria as a URI" + } + }, + "description": "A physical sensor that records a sensor data set." + }, + "SensorData": { + "type": "object", + "additionalProperties": false, + "properties": { + "time": { + "type": "string", + "format": "date-time", + "description": "the timestamp at which the sensor reading was made." + }, + "type": { + "type": "string", + "format": "uri", + "description": "the measurement type of the sensor reading, as a URI reference to a measurement method specification." + }, + "value": { "type": "number", "description": "the sensor reading" }, + "uom": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/UnitMeasureCode", + "description": "the unit of measure for the sensor reading\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/UnitMeasureCode\n " + } + }, + "description": "A data point read by a sensor." + } + } + } + }, + "constructData": { + "mappingFields": [ + { + "sourcePath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue", + "destinationPath": "/eventID" + }, + { + "sourcePath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue", + "destinationPath": "/epcList/index/name" + }, + { + "sourcePath": "/linkResolver", + "destinationPath": "/epcList/index/itemID" + } + ], + "dummyFields": [ + { + "path": "/action", + "data": "observe" + }, + { + "path": "/disposition", + "data": "https://ref.gs1.org/cbv/Disp/in_transit" + }, + { + "path": "/bizStep", + "data": "https://ref.gs1.org/cbv/BizStep/receiving" + }, + { + "path": "/bizLocation", + "data": "https://example.com/warehouse" + }, + { + "path": "/sourceParty", + "data": { + "id": "did:web:143f-2406-2d40-4106-2b10-38c6-9732-f2d9-bb1c.ngrok-free.app", + "name": "Cherries Farm", + "identifiers": [ + { + "scheme": "https://example.com/scheme/source", + "identifierValue": "SRC123456", + "binding": { + "type": "w3c_vc", + "assuranceLevel": "3rdParty", + "reference": "https://example.com/source_evidence" + } + } + ] + } + }, + { + "path": "/destinationParty", + "data": { + "id": "did:web:143f-2406-2d40-4106-2b10-38c6-9732-f2d9-bb1c.ngrok-free.app", + "name": "Cherries Processor", + "identifiers": [ + { + "scheme": "https://example.com/scheme/destination", + "identifierValue": "DST7891011", + "binding": { + "type": "w3c_vc", + "assuranceLevel": "3rdParty", + "reference": "https://example.com/destination_evidence" + } + } + ] + } + } + ], + "generationFields": [ + { + "path": "/eventID", + "handler": "generateIdWithSerialNumber" + }, + { + "path": "/eventTime", + "handler": "generateCurrentDatetime" + } + ] + } + } + ] + } + }, + { + "name": "CustomButton", + "type": "Submit", + "props": { + "includeDownload": true, + "downloadFileName": "transaction" + } + } + ], + "services": [ + { + "name": "processTransactionEvent", + "parameters": [ + { + "vckit": { + "vckitAPIUrl": "http://localhost:3332/v2", + "issuer": "did:web:60c5-115-79-212-164.ngrok-free.app" + }, + "epcisTransactionEvent": { + "context": ["https://dpp-json-ld.s3.ap-southeast-2.amazonaws.com/transaction-event-ld.json"], + "renderTemplate": [ + { + "template": "Transaction Event

TRACEABILITY EVENT

Transaction

EVENT ISSUED BY

{{issuer.name}}

{{#each issuer.identifiers}}
Industry
Needs to be replaced...
Business identifier
Needs to be replaced...
Identity verification
{{identiferValue}}
Verifiable credential
{{/each}}

Event description

Event ID
{{credentialSubject.eventID}}
Event type
Needs to be replaced...
Description
Needs to be replaced...
Time and date
{{credentialSubject.eventTime}}
Lifecycle action
{{credentialSubject.action}}
Product disposition
{{credentialSubject.disposition}}
Business step
{{credentialSubject.bizStep}}

Transaction

{{credentialSubject.sourceParty.name}}

SOURCE

{{credentialSubject.sourceParty.identifiers.0.identifierValue}}

Transferred

{{credentialSubject.destinationParty.name}}

DESTINATION

{{credentialSubject.destinationParty.partyID}}

Object list

{{#each credentialSubject.epcList}}

{{name}}

{{itemID}}

Product class name

Sustainability 0%
Confidence 0%
View
{{/each}}

Sensor

{{#each credentialSubject.sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}

{{time}}

Data type

{{value}} {{uom}}

{{/each}}{{sensorIntegrityProof}}
Other evidence
{{/each}}
", + "@type": "WebRenderingTemplate2022" + } + ], + "type": ["TransactionEventCredential"], + "dlrLinkTitle": "Transaction Event", + "dlrIdentificationKeyType": "gtin", + "dlrVerificationPage": "http://localhost:3003/verify" + }, + "dlr": { + "dlrAPIUrl": "http://localhost:3000", + "dlrAPIKey": "test123", + "namespace": "gs1", + "linkRegisterPath": "/api/resolver" + }, + "storage": { + "url": "http://localhost:3334/v1/documents", + "params": { + "resultPath": "/uri", + "bucket": "verifiable-credentials" + }, + "options": { + "method": "POST", + "headers": { + "Content-Type": "application/json" + } + } + }, + "identifierKeyPath": "/eventID", + "localStorageParams": { "storageKey": "CherriesFarm_dpps", "keyPath": "/epcList/index/name" } + } + ] + }, + { + "name": "mergeToLocalStorage", + "parameters": [ + { + "storageKey": "packhouse_facility_transaction_event", + "objectKeyPath": "/decodedEnvelopedVC/credentialSubject/eventID" + } + ] + } + ] + } + ] + }, + { + "name": "Fumigation and Freight Forwarding Facility", + "type": "producer", + "assets": { + "logo": "Cherries-farm-logo.webp", + "brandTitle": "Fumigation and Freight Forwarding Facility" + }, + "styles": { + "primaryColor": "#b5651d", + "secondaryColor": "#391561", + "tertiaryColor": "#ffffff" + }, + "features": [ + { + "name": "Issue DPP", + "id": "produce_product", + "components": [ + { + "name": "LocalStorageLoader", + "type": "EntryData", + "props": { + "storageKey": "packhouse_facility_transaction_event", + "nestedComponents": [ + { + "name": "JsonForm", + "type": "EntryData", + "props": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "productIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An array of unique identifiers assigned to the product or model. " + }, + "batchIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "Information regarding the specific production batch of the product." + }, + "itemIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An array of identifiers representing a specific serialised item of the product." + }, + "classification": { + "type": "array", + "items": { + "$ref": "#/$defs/Classification" + }, + "description": "A code representing the product's class, typically using the UN CPC (United Nations Central Product Classification) https://unstats.un.org/unsd/classifications/Econ/cpc" + }, + "modelName": { + "type": "string", + "description": "The model name or number of the product, represented as text." + }, + "image": { + "$ref": "#/$defs/BinaryFile", + "description": "A unique identifier (URI) pointing to an image of the product." + }, + "description": { + "type": "string", + "description": "A textual description providing details about the product." + }, + "furtherInformation": { + "type": "string", + "format": "uri", + "description": "A URL pointing to further human readable information about the product." + }, + "manufacturedDate": { + "type": "string", + "format": "date", + "description": "The ISO 8601 date on which the product batch was manufactured." + }, + "dimension": { + "$ref": "#/$defs/Dimension", + "description": "The physical dimensions of the product. Not every dimension is relevant to every products. For example bulk materials may have wieght and volume but not length, with, or height." + }, + "characteristic": { + "$ref": "#/$defs/Characteristic", + "description": "" + }, + "manufacturer": { + "$ref": "#/$defs/Party", + "description": "The Party entity that manufactured the product." + }, + "manufacturedAt": { + "$ref": "#/$defs/Facility", + "description": "The Facility where the product batch was manufactured." + }, + "materialsProvenance": { + "type": "array", + "items": { + "$ref": "#/$defs/Material" + }, + "description": "An array of Provenance objects providing details on the origin and mass fraction of components or ingredients of the product batch." + }, + "conformityClaim": { + "type": "array", + "items": { + "$ref": "#/$defs/Claim" + }, + "description": "An array of claim objects representing various product conformity claims about the product / batch. These can be sustainability claims, circularity claims, or any other claim type within the conformity topic list." + }, + "recyclingInstruction": { + "type": "string", + "format": "uri", + "description": "A URI pointing to information regarding the recycling aspects of the product." + }, + "traceabilityInformation": { + "type": "array", + "items": { + "$ref": "#/$defs/TraceabilityEvent" + }, + "description": "An array of TraceabilityEvent objects detailing EPCIS events related to the traceability of the product batch." + } + }, + "description": "The ProductInformation class encapsulates detailed information regarding a specific product, including its identification details, manufacturer, and other pertinent details.", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$defs": { + "Product": { + "type": "object", + "additionalProperties": false, + "properties": { + "productIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An array of unique identifiers assigned to the product or model. " + }, + "batchIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "Information regarding the specific production batch of the product." + }, + "itemIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An array of identifiers representing a specific serialised item of the product." + }, + "classification": { + "type": "array", + "items": { + "$ref": "#/$defs/Classification" + }, + "description": "A code representing the product's class, typically using the UN CPC (United Nations Central Product Classification) https://unstats.un.org/unsd/classifications/Econ/cpc" + }, + "modelName": { + "type": "string", + "description": "The model name or number of the product, represented as text." + }, + "image": { + "$ref": "#/$defs/BinaryFile", + "description": "A unique identifier (URI) pointing to an image of the product." + }, + "description": { + "type": "string", + "description": "A textual description providing details about the product." + }, + "furtherInformation": { + "type": "string", + "format": "uri", + "description": "A URL pointing to further human readable information about the product." + }, + "manufacturedDate": { + "type": "string", + "format": "date", + "description": "The ISO 8601 date on which the product batch was manufactured." + }, + "dimension": { + "$ref": "#/$defs/Dimension", + "description": "The physical dimensions of the product. Not every dimension is relevant to every products. For example bulk materials may have wieght and volume but not length, with, or height." + }, + "characteristic": { + "$ref": "#/$defs/Characteristic", + "description": "" + }, + "manufacturer": { + "$ref": "#/$defs/Party", + "description": "The Party entity that manufactured the product." + }, + "manufacturedAt": { + "$ref": "#/$defs/Facility", + "description": "The Facility where the product batch was manufactured." + }, + "materialsProvenance": { + "type": "array", + "items": { + "$ref": "#/$defs/Material" + }, + "description": "An array of Provenance objects providing details on the origin and mass fraction of components or ingredients of the product batch." + }, + "conformityClaim": { + "type": "array", + "items": { + "$ref": "#/$defs/Claim" + }, + "description": "An array of claim objects representing various product conformity claims about the product / batch. These can be sustainability claims, circularity claims, or any other claim type within the conformity topic list." + }, + "recyclingInstruction": { + "type": "string", + "format": "uri", + "description": "A URI pointing to information regarding the recycling aspects of the product." + }, + "traceabilityInformation": { + "type": "array", + "items": { + "$ref": "#/$defs/TraceabilityEvent" + }, + "description": "An array of TraceabilityEvent objects detailing EPCIS events related to the traceability of the product batch." + } + }, + "description": "The ProductInformation class encapsulates detailed information regarding a specific product, including its identification details, manufacturer, and other pertinent details." + }, + "Identifier": { + "type": "object", + "additionalProperties": false, + "properties": { + "scheme": { + "type": "string", + "format": "uri", + "description": "the identifier scheme as defined by the registrar that manages the identifier registry. If the identifier scheme is registered with UNTP then this URI can use used to dicsover the resolution method (to get more data) and the verification method (to prove ownership)." + }, + "identifierValue": { + "type": "string", + "description": "The value of the identifier within the scheme" + }, + "binding": { + "$ref": "#/$defs/Evidence", + "description": "Link to evidence that attests to the validity and ownership of the identifer. " + } + }, + "description": "An identifier of a party, product, or facility that is defined by an identifier scheme and idenfier value and, optinally, verification evidence " + }, + "Evidence": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": ["w3c_vc", "iso_mdl", "document", "website", "other"], + "example": "w3c_vc", + "description": "Format of the evidence (verifiable credential, document, website, etc)" + }, + "assuranceLevel": { + "type": "string", + "enum": ["Self", "Commercial", "Buyer", "Membership", "Unspecified", "3rdParty"], + "example": "Self", + "description": "The assurance level of the evidence (self declaration, 2nd party, 3rd party, accredited auditor)" + }, + "reference": { + "type": "string", + "format": "uri", + "description": "The URL at which the evidence data can be found. " + } + }, + "description": "Evidence to support a conformity or identity claim. " + }, + "Classification": { + "type": "object", + "additionalProperties": false, + "properties": { + "scheme": { + "type": "string", + "format": "uri", + "description": "Classification scheme - eg https://unstats.un.org/unsd/classifications/Econ/cpc " + }, + "classifierValue": { + "type": "string", + "description": "classifier value within the scheme - eg \"01211\" in UN CPC" + }, + "classifierName": { + "type": "string", + "description": "Name of the classifier - eg \"Asparagus\" for code \"01211\" in UNCPC" + }, + "classifierURL": { + "type": "string", + "format": "uri", + "description": "Linked data URL to a web vocabulary entery for this classificaiton code. When this property is provided, the scheme, value, and name properties of the classifer are not required. eg https://vocabulary.uncefact.org/unlocode#AUBNE represensign the port of Brisbane in the UN/LOCODE classification scheme." + } + }, + "description": "A classification scheme and code / name representing a category value for a product, entity, or facility." + }, + "BinaryFile": { + "type": "object", + "additionalProperties": false, + "properties": { + "fileHash": { + "x-jargon-isKey": true, + "type": "string", + "description": "The MD5 hash of the file." + }, + "fileLocation": { + "type": "string", + "format": "uri", + "description": "The location of the evidence file." + }, + "fileType": { + "type": "string", + "x-external-enumeration": "https://mimetype.io/all-types", + "description": "The type of file, represented as a MIME type.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://mimetype.io/all-types\n " + } + }, + "description": "A file representing a data snapshot that is used to infomr the conformity assessment." + }, + "Dimension": { + "type": "object", + "additionalProperties": false, + "properties": { + "weight": { + "$ref": "#/$defs/Measure", + "description": "the weight of the product" + }, + "length": { + "$ref": "#/$defs/Measure", + "description": "The length of the product or packaging" + }, + "width": { + "$ref": "#/$defs/Measure", + "description": "The width of the product or packaging" + }, + "height": { + "$ref": "#/$defs/Measure", + "description": "The height of the product or packaging" + }, + "volume": { + "$ref": "#/$defs/Measure", + "description": "The displacement volume of the product." + } + }, + "description": "Overall (length, width, height) dimensions and weight/volume of an item." + }, + "Measure": { + "type": "object", + "additionalProperties": false, + "properties": { + "value": { + "type": "number", + "description": "The numeric value of the measure" + }, + "unit": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/UnitMeasureCode", + "description": "Unit of measure drawn from the UNECE rec20 measure code list.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/UnitMeasureCode\n " + } + }, + "description": "The measure class defines a numeric measured value (eg 10) and a coded unit of measure (eg KG)." + }, + "Characteristic": { + "type": "object", + "additionalProperties": false, + "properties": {}, + "description": "Product specific characteristics. This class is an extension point for industry specific product characteristics or performance information such as clothing size or battery capacity." + }, + "Party": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "string", + "description": "The decentralised identifier of the party - must be a W3C DID." + }, + "name": { + "type": "string", + "description": "The name of the organization or company, represented as a text string." + }, + "identifiers": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "A list of unique business identifiers assigned to the party - such as tax registration numbers." + } + }, + "description": "The Party class represents an entity such as an organization, or a company that manufactured the product." + }, + "Facility": { + "type": "object", + "additionalProperties": false, + "properties": { + "identifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "A unique identifier (URI) assigned to the facility. (Link Resolver - GS1 GLN?)" + }, + "name": { + "type": "string", + "description": "The name of the facility, represented as a text string." + }, + "location": { + "type": "string", + "format": "uri", + "description": "" + }, + "operatedBy": { + "$ref": "#/$defs/Party", + "description": "The Party entity responsible for operating the facility." + } + }, + "description": "The physical site (eg farm or factory) where the product or materials was produced." + }, + "Material": { + "type": "object", + "additionalProperties": false, + "properties": { + "originCountry": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/CountryId", + "description": "A ISO 3166-1 code representing the country of origin of the component or ingredient.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/CountryId\n " + }, + "materialType": { + "$ref": "#/$defs/Classification", + "description": "The type of this material - as a value drawn from a controlled vocabulary eg textileexchange.org/materials/rm01014 - representing organic cotton." + }, + "massFraction": { + "type": "number", + "description": "A numeric value representing the mass fraction of the product represented by this material. The sum of all mass fraction values for a given passport should be 100." + }, + "recycled": { + "type": "boolean", + "description": "Indicator is true if this material input is from a recycled source." + }, + "hazardous": { + "type": "boolean", + "description": "Indicates whether this material is hazardous. If true then " + } + }, + "description": "The material class encapsulates details about the origin or source of raw materials in a product, including the country of origin and the mass fraction." + }, + "Claim": { + "type": "object", + "additionalProperties": false, + "properties": { + "topic": { + "type": "string", + "enum": [ + "environment.energy", + "environment.emissions", + "environment.water", + "environment.waste", + "environment.deforestation", + "environment.biodiversity", + "circularity.content", + "circularity.design", + "social.labour", + "social.rights", + "social.community", + "social.safety", + "governance.ethics", + "governance.compliance", + "governance.transparency" + ], + "example": "environment.energy", + "description": "A code representing the topic of the sustainability claim. E.g. environment.deforestation, environment.ghg-emission-intensity, etc.. Drawn from a standard code list. " + }, + "standardOrRegulation": { + "type": "string", + "format": "uri", + "description": "The standard or regulation against which this conformity claim is made. Expressed as a URI and should match a value in the UN catalogue of reference vocabularies. " + }, + "criteriaReference": { + "type": "string", + "format": "uri", + "description": "A URI pointing to the specific criteria within the standard or regulation against which this claim is made." + }, + "claimedValues": { + "type": "array", + "items": { + "$ref": "#/$defs/Metric" + }, + "description": "One or more actual measures supporting the claim. For example for GHG emissions there may be a metric for total emissions intensity and also a metric for amount of offsets included." + }, + "benchmarkValue": { + "$ref": "#/$defs/Metric", + "description": "A benchmark value against which the claimed value can be assessed. THis could be a value specified by a standard or regulation or could be an industry benchmark." + }, + "benchmarkReference": { + "type": "string", + "format": "uri", + "description": "A refernce to evidence to support the benchmark value." + }, + "conformance": { + "type": "boolean", + "description": "and indicator (boolean) that expresses whether or not this product has achieved compliance against the criteria. for example, if the topic is environment.deforstation and the criteria is EU.2023.1115 then the product is conformant if it has not touched any facility throughout it's lifecycle that is not deforestation free since dec 2020." + }, + "conformityEvidence": { + "$ref": "#/$defs/Evidence", + "description": "A URI pointing to the evidence supporting the claim. Most likely in the form of a verifiable credential." + } + }, + "description": "The SustainabilityClaim class represents specific claims regarding the sustainability of a product, providing details about the metrics, thresholds, and evidences supporting the claim." + }, + "Metric": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "description": "A human readable name for this metric" + }, + "value": { + "$ref": "#/$defs/Measure", + "description": "A numeric value representing the measurement or evaluation outcome for the claim." + }, + "accuracy": { + "type": "number", + "description": "A percentage represented as a numeric between 0 and 1 indicating the rage of accuracy of the claimed value (eg 0.05 means that the actual value is within 5% of the claimed value.)" + } + }, + "description": "A specific measure of performance against the criteria that governs the claim. Expressed as an array of metric (ie unit of emasure) / value (ie the actual numeric value) pairs. " + }, + "TraceabilityEvent": { + "type": "object", + "additionalProperties": false, + "properties": { + "eventReference": { + "type": "string", + "format": "uri", + "description": "A URI pointing to the detailed information about the EPCIS event. Most likely in the form of a verifiable credential." + }, + "eventType": { + "type": "string", + "enum": ["aggregation", "transformation", "object", "transaction", "association"], + "example": "aggregation", + "description": "A code representing the type of EPCIS event. ObjectEvent, AggregationEvent, TransactionEvent, TransformationEvent, ObjectEvent." + } + }, + "description": "The TraceabilityEvent class represents a specific EPCIS event in the traceability chain of a product, including details about the event type and reference." + } + } + }, + "data": { + "image": "data:image/jpg;base64,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", + "productIdentifier": [ + { + "scheme": "https://id.gs1.org/gtin", + "identifierValue": "0105012345678900", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://id.gs1.org/gtin/05012345678900/binding" + } + } + ], + "batchIdentifier": [ + { + "scheme": "https://Cherriesfarm.example.org/batch", + "identifierValue": "BATCH-2024-001", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://Cherriesfarm.example.org/batch/2024-001/binding" + } + } + ], + "itemIdentifier": [ + { + "scheme": "https://Cherriesfarm.example.org/item", + "identifierValue": "TRF-24-0001", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://Cherriesfarm.example.org/item/TRF-24-0001/binding" + } + } + ], + "classification": [ + { + "scheme": "https://www.unspsc.org", + "classifierValue": "50383710", + "classifierName": "Cherriess", + "classifierURL": "https://www.unspsc.org/search-code/50383710" + } + ], + "modelName": "Black Cherries", + "description": "Premium Black Cherriess harvested from our sustainable Cherries orchards.", + "furtherInformation": "https://Cherriesfarm.example.org/products/black_perigord", + "manufacturedDate": "2024-01-15", + "dimension": { + "weight": { "value": 50, "unit": "GRM" } + }, + "materialsProvenance": [ + { + "originCountry": "AU", + "materialType": { + "scheme": "https://www.gs1.org/gpc", + "classifierValue": "10005953", + "classifierName": "Cherriess (Fresh)", + "classifierURL": "https://www.gs1.org/gpc/10005953" + }, + "massFraction": 100, + "recycled": false, + "hazardous": false + } + ], + "characteristic": { + "variety": "Tuber melanosporum", + "grade": "Extra", + "aroma": "Intense, earthy", + "flavor": "Rich, complex" + }, + "manufacturer": { + "id": "did:example:123456789abcdefghi", + "name": "Gourmet Cherries Farm", + "identifiers": [ + { + "scheme": "https://identifier.example.org/company", + "identifierValue": "COMP-12345", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://identifier.example.org/company/12345/binding" + } + } + ] + }, + "manufacturedAt": { + "identifier": [ + { + "scheme": "https://identifier.example.org/facility", + "identifierValue": "FAC-5678", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://identifier.example.org/facility/5678/binding" + } + } + ], + "name": "Cherries Orchard", + "location": "https://Cherriesfarm.example.org/locations/perigord_orchard", + "operatedBy": { + "id": "did:example:123456789abcdefghi", + "name": "Gourmet Cherries Farm", + "identifiers": [ + { + "scheme": "https://identifier.example.org/company", + "identifierValue": "COMP-12345", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://identifier.example.org/company/12345/binding" + } + } + ] + } + } + }, + "className": "json-form", + "style": { + "margin": "40px auto", + "paddingTop": "40px", + "width": "80%" + } + }, + "constructData": { + "mappingFields": [ + { + "sourcePath": "/linkResolver", + "destinationPath": "/traceabilityInformation/0/eventReference" + } + ], + "dummyFields": [ + { + "path": "/traceabilityInformation/0/eventType", + "data": "transaction" + } + ], + "generationFields": [] + } + } + ] + } + }, + { + "name": "CustomButton", + "type": "Submit", + "props": {} + } + ], + "services": [ + { + "name": "processDPP", + "parameters": [ + { + "vckit": { + "vckitAPIUrl": "http://localhost:3332/v2", + "issuer": "did:web:60c5-115-79-212-164.ngrok-free.app" + }, + "dpp": { + "context": ["https://dpp-json-ld.s3.ap-southeast-2.amazonaws.com/dppld.json"], + "renderTemplate": [ + { + "template": " Digital Product Passport

PRODUCT PASSPORT

{{credentialSubject.modelName}}

{{#each credentialSubject.batchIdentifier}} {{/each}} {{#each credentialSubject.productIdentifier}} {{/each}}

Sustainability

100%

Confidence

100%

PASSPORT ISSUED BY

{{issuer.name}}

Industry

Agriculture

Business identifier
75 859 224 235
Location
Rooty Hill, NSW
Identity verification
75 859 224 235
Other evidence

Conformity credentials

Conformity credentials are usually issued by independent third parties and provide a trusted assessment of product ESG performance against credible standards or regulations

{{#each credentialSubject.conformityClaim}}

{{topic}}

{{!-- {{#if (eq conformityEvidence.type 'w3c_vc')}} --}}
Verifiable credential
{{!-- {{/if}} --}}

View details

{{/each}}

Product composition

A complete list of materials that make up the composition of this product.

{{#each credentialSubject.materialsProvenance}}

{{massFraction}}%

ID {{materialType.classifierValue}}

{{materialType.classifierName}}

{{#if recycled}}

Recycled

{{/if}} {{#if hazardous}}

Hazard

{{/if}}
{{originCountry}}
{{/each}}

Product information

Harvest Date

{{credentialSubject.manufacturedDate}}

Batch No.

{{credentialSubject.batchIdentifier.0.identifierValue}}

Weight

{{credentialSubject.dimension.weight.value}}{{credentialSubject.dimension.weight.unit}}

Description

{{credentialSubject.description}}

", + "@type": "WebRenderingTemplate2022" + } + ], + "type": ["VerifiableCredential", "DigitalProductPassport"], + "dlrLinkTitle": "Cherries Product Passport", + "dlrIdentificationKeyType": "gtin", + "dlrVerificationPage": "http://localhost:3003/verify" + }, + "dlr": { + "dlrAPIUrl": "http://localhost:3000", + "dlrAPIKey": "test123", + "namespace": "gs1", + "linkRegisterPath": "/api/resolver" + }, + "storage": { + "url": "http://localhost:3334/v1/documents", + "params": { + "resultPath": "/uri", + "bucket": "verifiable-credentials" + }, + "options": { + "method": "POST", + "headers": { + "Content-Type": "application/json" + } + } + }, + "identifierKeyPath": "/productIdentifier/0/identifierValue" + } + ] + }, + { + "name": "mergeToLocalStorage", + "parameters": [ + { + "storageKey": "CherriesFarm_dpps", + "objectKeyPath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue" + } + ] + } + ] + }, + { + "name": "Move to Next Facility", + "id": "transaction_product", + "components": [ + { + "name": "LocalStorageLoader", + "type": "EntryData", + "props": { + "storageKey": "CherriesFarm_dpps", + "nestedComponents": [ + { + "name": "JsonForm", + "type": "EntryData", + "props": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "sourceParty": { + "$ref": "#/$defs/Party", + "description": "The source party for this supply chain transaction - typically the seller party" + }, + "destinationParty": { + "$ref": "#/$defs/Party", + "description": "The destination party for this supply chain transaction - typically the buyer party." + }, + "epcList": { + "type": "array", + "items": { "$ref": "#/$defs/Item" }, + "description": "The list of uniquely identified trade items included in this supply chain transaction." + }, + "quantityList": { + "type": "array", + "items": { "$ref": "#/$defs/QuantityElement" }, + "description": "List of quantified product classes that are included in this transaction. Used when the trade items do not have unique identifiers (eg 100 reels of yarn)" + }, + "referenceDocument": { + "$ref": "#/$defs/TradeDocument", + "description": "The supply chain document reference for this transaction event - eg the invoice, order, or dispatch advice" + }, + "eventID": { + "x-jargon-isKey": true, + "readOnly": true, + "type": "string", + "description": "The unique identifier of this event - SHOULD be a UUID" + }, + "eventTime": { + "type": "string", + "format": "date-time", + "description": "The ISO-8601 date time when the event occurred." + }, + "action": { + "type": "string", + "enum": ["observe", "add", "delete"], + "example": "observe", + "description": "Code describing how an event relates to the lifecycle of the entity impacted by the event." + }, + "disposition": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/Disp", + "description": "Disposition code describing the state of the item after the event. \n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/Disp\n " + }, + "bizStep": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/BizStep", + "description": "A business step code drawn from a controlled vocabulary. \n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/BizStep\n " + }, + "bizLocation": { + "type": "string", + "format": "uri", + "description": "A Business Location is a uniquely identified and discretely recorded geospatial location that is meant to designate the specific place where an object is assumed to be following an EPCIS event until it is reported to be at a different Business Location by a subsequent EPCIS event. The bizLocation must be a resolvable URI that links to facility information and geolocation data." + }, + "sensorElementList": { + "type": "array", + "items": { "$ref": "#/$defs/SensorElement" }, + "description": "An array (one for each sensor) of sensor device data sets associated with the event. " + } + }, + "description": "Transaction represents an event in which one or more objects become associated or disassociated with one or more identified business transactions - such as the purchase / shipment of goods between buyer and seller.", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$defs": { + "TransactionEvent": { + "type": "object", + "additionalProperties": false, + "properties": { + "sourceParty": { + "$ref": "#/$defs/Party", + "description": "The source party for this supply chain transaction - typically the seller party" + }, + "destinationParty": { + "$ref": "#/$defs/Party", + "description": "The destination party for this supply chain transaction - typically the buyer party." + }, + "epcList": { + "type": "array", + "items": { "$ref": "#/$defs/Item" }, + "description": "The list of uniquely identified trade items included in this supply chain transaction." + }, + "quantityList": { + "type": "array", + "items": { "$ref": "#/$defs/QuantityElement" }, + "description": "List of quantified product classes that are included in this transaction. Used when the trade items do not have unique identifiers (eg 100 reels of yarn)" + }, + "referenceDocument": { + "$ref": "#/$defs/TradeDocument", + "description": "The supply chain document reference for this transaction event - eg the invoice, order, or dispatch advice" + }, + "eventID": { + "x-jargon-isKey": true, + "readOnly": true, + "type": "string", + "description": "The unique identifier of this event - SHOULD be a UUID" + }, + "eventTime": { + "type": "string", + "format": "date-time", + "description": "The ISO-8601 date time when the event occurred." + }, + "action": { + "type": "string", + "enum": ["observe", "add", "delete"], + "example": "observe", + "description": "Code describing how an event relates to the lifecycle of the entity impacted by the event." + }, + "disposition": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/Disp", + "description": "Disposition code describing the state of the item after the event. \n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/Disp\n " + }, + "bizStep": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/BizStep", + "description": "A business step code drawn from a controlled vocabulary. \n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/BizStep\n " + }, + "bizLocation": { + "type": "string", + "format": "uri", + "description": "A Business Location is a uniquely identified and discretely recorded geospatial location that is meant to designate the specific place where an object is assumed to be following an EPCIS event until it is reported to be at a different Business Location by a subsequent EPCIS event. The bizLocation must be a resolvable URI that links to facility information and geolocation data." + }, + "sensorElementList": { + "type": "array", + "items": { "$ref": "#/$defs/SensorElement" }, + "description": "An array (one for each sensor) of sensor device data sets associated with the event. " + } + }, + "description": "Transaction represents an event in which one or more objects become associated or disassociated with one or more identified business transactions - such as the purchase / shipment of goods between buyer and seller." + }, + "Party": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "string", + "description": "The decentralised identifier of the party - must be a W3C DID." + }, + "name": { + "type": "string", + "description": "The name of the organization or company, represented as a text string." + }, + "identifiers": { + "type": "array", + "items": { "$ref": "#/$defs/Identifier" }, + "description": "A list of unique business identifiers assigned to the party - such as tax registration numbers." + } + }, + "description": "The Party class represents an entity such as an organization, or a company that manufactured the product." + }, + "Identifier": { + "type": "object", + "additionalProperties": false, + "properties": { + "scheme": { + "type": "string", + "format": "uri", + "description": "the identifier scheme as defined by the registrar that manages the identifier registry. If the identifier scheme is registered with UNTP then this URI can use used to dicsover the resolution method (to get more data) and the verification method (to prove ownership)." + }, + "identifierValue": { + "type": "string", + "description": "The value of the identifier within the scheme" + }, + "binding": { + "$ref": "#/$defs/Evidence", + "description": "Link to evidence that attests to the validity and ownership of the identifer. " + } + }, + "description": "An identifier of a party, product, or facility that is defined by an identifier scheme and idenfier value and, optinally, verification evidence " + }, + "Evidence": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": ["w3c_vc", "iso_mdl", "document", "website", "other"], + "example": "w3c_vc", + "description": "Format of the evidence (verifiable credential, document, website, etc)" + }, + "assuranceLevel": { + "type": "string", + "enum": ["Self", "Commercial", "Buyer", "Membership", "Unspecified", "3rdParty"], + "example": "Self", + "description": "The assurance level of the evidence (self declaration, 2nd party, 3rd party, accredited auditor)" + }, + "reference": { + "type": "string", + "format": "uri", + "description": "The URL at which the evidence data can be found. " + } + }, + "description": "Evidence to support a conformity or identity claim. " + }, + "Item": { + "type": "object", + "additionalProperties": false, + "properties": { + "itemID": { + "x-jargon-isKey": true, + "type": "string", + "format": "uri", + "description": "The globally unique identifier (eg GS1 GTIN or digital link) of the product item. " + }, + "name": { + "type": "string", + "description": "The name of the product class to which the product item belongs. " + } + }, + "description": "A specific trade item /product code which could be either a product serial number or a consignment identifier " + }, + "QuantityElement": { + "type": "object", + "additionalProperties": false, + "properties": { + "epcClass": { + "type": "string", + "format": "uri", + "description": "THe identifier of a product class (as opposed to a product instance) such as a GTIN code for a manufactured product." + }, + "quantity": { + "type": "number", + "description": "The numeric quantity of the product class (eg 100 kg of cotton)" + }, + "uom": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/UnitMeasureCode", + "description": "The unit of measure for the quantity value (eg Kg or meters etc) using the UNECE Rec 20 unit of measure codelist.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/UnitMeasureCode\n " + } + }, + "description": "The quantity element is used to define the quantities (eg 100), units of measure (eg Kg) and product class (eg GTIN or other class identifier) of products that are inputs or outputs or the subject of supply chain events. ", + "required": ["quantity"] + }, + "TradeDocument": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/BTT", + "description": "The document type representing the trade transaction drawn from the business transaction type vocabulary.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/BTT\n " + }, + "identifier": { + "type": "string", + "description": "The identifier of the trade transaction document - eg an invoice number or bill of lading number. Must be unique for a given source party" + }, + "documentURL": { + "type": "string", + "format": "uri", + "description": "The URL of the referenced trade document. For integrity reasons, it is recommended (but not required) that the documentURL is a hashlink (https://w3c-ccg.github.io/hashlink/) so that if the document the URL is changed then the hash verification will fail." + } + }, + "description": "A trade transaction between two parties such as an invoice, purchase order, or shipping notification." + }, + "SensorElement": { + "type": "object", + "additionalProperties": false, + "properties": { + "sensorMetadata": { + "$ref": "#/$defs/Sensor", + "description": "Data that describes the physical sensor that recorded the sensor data set." + }, + "sensorReport": { + "type": "array", + "items": { "$ref": "#/$defs/SensorData" }, + "description": "A list of sensor readings from the given sensor relevant to the traceability event context." + }, + "sensorIntegrityProof": { + "type": "string", + "format": "uri", + "description": "An optional reference to a verifiable credential signed by the sensor device or device manufacturer that contains the digitally signed raw data associated with this sensor report." + } + }, + "description": "A SensorElement is used to carry data related to an event that is captured one sensor such as an IoT device. Include one sensor property and an array of sensor data values." + }, + "Sensor": { + "type": "object", + "additionalProperties": false, + "properties": { + "device": { + "$ref": "#/$defs/Item", + "description": "The device Identifier for the sensor as a URI (typically an EPC)" + }, + "dataProcessingMethod": { + "type": "string", + "format": "uri", + "description": "The data processing method used by the sensor - should reference a documented standard criteria as a URI" + } + }, + "description": "A physical sensor that records a sensor data set." + }, + "SensorData": { + "type": "object", + "additionalProperties": false, + "properties": { + "time": { + "type": "string", + "format": "date-time", + "description": "the timestamp at which the sensor reading was made." + }, + "type": { + "type": "string", + "format": "uri", + "description": "the measurement type of the sensor reading, as a URI reference to a measurement method specification." + }, + "value": { "type": "number", "description": "the sensor reading" }, + "uom": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/UnitMeasureCode", + "description": "the unit of measure for the sensor reading\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/UnitMeasureCode\n " + } + }, + "description": "A data point read by a sensor." + } + } + } + }, + "constructData": { + "mappingFields": [ + { + "sourcePath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue", + "destinationPath": "/eventID" + }, + { + "sourcePath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue", + "destinationPath": "/epcList/index/name" + }, + { + "sourcePath": "/linkResolver", + "destinationPath": "/epcList/index/itemID" + } + ], + "dummyFields": [ + { + "path": "/action", + "data": "observe" + }, + { + "path": "/disposition", + "data": "https://ref.gs1.org/cbv/Disp/in_transit" + }, + { + "path": "/bizStep", + "data": "https://ref.gs1.org/cbv/BizStep/receiving" + }, + { + "path": "/bizLocation", + "data": "https://example.com/warehouse" + }, + { + "path": "/sourceParty", + "data": { + "id": "did:web:143f-2406-2d40-4106-2b10-38c6-9732-f2d9-bb1c.ngrok-free.app", + "name": "Cherries Farm", + "identifiers": [ + { + "scheme": "https://example.com/scheme/source", + "identifierValue": "SRC123456", + "binding": { + "type": "w3c_vc", + "assuranceLevel": "3rdParty", + "reference": "https://example.com/source_evidence" + } + } + ] + } + }, + { + "path": "/destinationParty", + "data": { + "id": "did:web:143f-2406-2d40-4106-2b10-38c6-9732-f2d9-bb1c.ngrok-free.app", + "name": "Cherries Processor", + "identifiers": [ + { + "scheme": "https://example.com/scheme/destination", + "identifierValue": "DST7891011", + "binding": { + "type": "w3c_vc", + "assuranceLevel": "3rdParty", + "reference": "https://example.com/destination_evidence" + } + } + ] + } + } + ], + "generationFields": [ + { + "path": "/eventID", + "handler": "generateIdWithSerialNumber" + }, + { + "path": "/eventTime", + "handler": "generateCurrentDatetime" + } + ] + } + } + ] + } + }, + { + "name": "CustomButton", + "type": "Submit", + "props": { + "includeDownload": true, + "downloadFileName": "transaction" + } + } + ], + "services": [ + { + "name": "processTransactionEvent", + "parameters": [ + { + "vckit": { + "vckitAPIUrl": "http://localhost:3332/v2", + "issuer": "did:web:60c5-115-79-212-164.ngrok-free.app" + }, + "epcisTransactionEvent": { + "context": ["https://dpp-json-ld.s3.ap-southeast-2.amazonaws.com/transaction-event-ld.json"], + "renderTemplate": [ + { + "template": "Transaction Event

TRACEABILITY EVENT

Transaction

EVENT ISSUED BY

{{issuer.name}}

{{#each issuer.identifiers}}
Industry
Needs to be replaced...
Business identifier
Needs to be replaced...
Identity verification
{{identiferValue}}
Verifiable credential
{{/each}}

Event description

Event ID
{{credentialSubject.eventID}}
Event type
Needs to be replaced...
Description
Needs to be replaced...
Time and date
{{credentialSubject.eventTime}}
Lifecycle action
{{credentialSubject.action}}
Product disposition
{{credentialSubject.disposition}}
Business step
{{credentialSubject.bizStep}}

Transaction

{{credentialSubject.sourceParty.name}}

SOURCE

{{credentialSubject.sourceParty.identifiers.0.identifierValue}}

Transferred

{{credentialSubject.destinationParty.name}}

DESTINATION

{{credentialSubject.destinationParty.partyID}}

Object list

{{#each credentialSubject.epcList}}

{{name}}

{{itemID}}

Product class name

Sustainability 0%
Confidence 0%
View
{{/each}}

Sensor

{{#each credentialSubject.sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}

{{time}}

Data type

{{value}} {{uom}}

{{/each}}{{sensorIntegrityProof}}
Other evidence
{{/each}}
", + "@type": "WebRenderingTemplate2022" + } + ], + "type": ["TransactionEventCredential"], + "dlrLinkTitle": "Transaction Event", + "dlrIdentificationKeyType": "gtin", + "dlrVerificationPage": "http://localhost:3003/verify" + }, + "dlr": { + "dlrAPIUrl": "http://localhost:3000", + "dlrAPIKey": "test123", + "namespace": "gs1", + "linkRegisterPath": "/api/resolver" + }, + "storage": { + "url": "http://localhost:3334/v1/documents", + "params": { + "resultPath": "/uri", + "bucket": "verifiable-credentials" + }, + "options": { + "method": "POST", + "headers": { + "Content-Type": "application/json" + } + } + }, + "identifierKeyPath": "/eventID", + "localStorageParams": { "storageKey": "CherriesFarm_dpps", "keyPath": "/epcList/index/name" } + } + ] + }, + { + "name": "mergeToLocalStorage", + "parameters": [ + { + "storageKey": "fumigation_and_freight_forwarding_facility_transaction_event", + "objectKeyPath": "/decodedEnvelopedVC/credentialSubject/eventID" + } + ] + } + ] + } + ] + } + ], + "identifyProvider": { + "type": "gs1", + "url": "http://localhost:3001", + "namespace": "gs1" + }, + "defaultVerificationServiceLink": { + "title": "Default Verification Service", + "context": "Default Verification Service", + "type": "application/json", + "href": "http://localhost:3332/agent/routeVerificationCredential", + "hreflang": ["en"], + "apiKey": "test123" + } +} diff --git a/packages/mock-app/src/components/Header/Header.tsx b/packages/mock-app/src/components/Header/Header.tsx index 674afc9e..1ca7b82e 100644 --- a/packages/mock-app/src/components/Header/Header.tsx +++ b/packages/mock-app/src/components/Header/Header.tsx @@ -1,4 +1,4 @@ -import React, { useContext, useEffect, useState } from 'react'; +import React, { useEffect, useState } from 'react'; import { Link, useLocation, useNavigate } from 'react-router-dom'; import { AppBar, @@ -24,7 +24,7 @@ import DialpadIcon from '@mui/icons-material/Dialpad'; import appConfig from '../../constants/app-config.json'; import { convertPathToString, convertStringToPath } from '../../utils'; -import { GlobalContext } from '../../hooks/GlobalContext'; +import { useGlobalContext } from '../../hooks/GlobalContext'; type ConfigAppType = typeof appConfig; @@ -45,7 +45,7 @@ const iconConfig: { [key: string]: JSX.Element } = { function Header() { const location = useLocation(); const navigate = useNavigate(); - const { theme } = useContext(GlobalContext); + const { theme } = useGlobalContext() as any; const [open, setOpen] = useState(false); const [headerBrandInfo, setHeaderBrandInfo] = useState({ @@ -186,6 +186,7 @@ function Header() { useContext(GlobalContext); From ee2f61c7b9651e64f5512b5248acfb3ba616f8b1 Mon Sep 17 00:00:00 2001 From: Nam Hoang Date: Thu, 24 Oct 2024 15:40:31 +0700 Subject: [PATCH 05/17] chore: configure jest for lerna Signed-off-by: Nam Hoang --- .github/workflows/build_test.yml | 6 +- jest.config.base.js | 7 + jest.config.mjs | 87 ----------- lerna.json | 3 +- package.json | 7 +- packages/components/jest.config.js | 2 + packages/events/package.json | 12 -- packages/mock-app/jest.config.js | 2 + packages/services/jest.config.js | 20 +++ packages/services/package.json | 22 --- packages/untp-test-suite/jest.config.js | 2 + packages/vc-test-suite/jest.config.js | 3 + yarn.lock | 192 ++++++++++++++++++++++-- 13 files changed, 227 insertions(+), 138 deletions(-) create mode 100644 jest.config.base.js delete mode 100644 jest.config.mjs delete mode 100644 packages/events/package.json create mode 100644 packages/services/jest.config.js diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index 11815bef..02db8fd5 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -33,14 +33,14 @@ jobs: - name: Run tests run: | - yarn jest --changedSince=origin/next --ci --json --coverage --testLocationInResults --outputFile=report.json + yarn test:coverage - name: Coverage uses: artiomtr/jest-coverage-report-action@v2 with: github-token: ${{ secrets.GITHUB_TOKEN }} - coverage-file: report.json - base-coverage-file: report.json + coverage-file: ./coverage/coverage-final.json + base-coverage-file: ./coverage/coverage-final.json threshold: 80 - name: Build diff --git a/jest.config.base.js b/jest.config.base.js new file mode 100644 index 00000000..bb256fe0 --- /dev/null +++ b/jest.config.base.js @@ -0,0 +1,7 @@ +module.exports = { + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], + collectCoverageFrom: ['/src/**/*.{ts,tsx}', '!**/*.d.ts'], + coverageDirectory: '/coverage', + coverageReporters: ['json', 'text', 'lcov'], + verbose: true, +}; diff --git a/jest.config.mjs b/jest.config.mjs deleted file mode 100644 index b6ea6625..00000000 --- a/jest.config.mjs +++ /dev/null @@ -1,87 +0,0 @@ -import { defaults } from 'jest-config'; -import ComponentPkg from './packages/components/package.json' assert { type: 'json' }; -import MockAppPkg from './packages/mock-app/package.json' assert { type: 'json' }; - -export default { - rootDir: './', - moduleFileExtensions: [...defaults.moduleFileExtensions, 'mts'], - collectCoverage: false, - collectCoverageFrom: [ - 'packages/**/src/**/*.ts', - '!**/examples/**', - '!**/types/**', - '!**/build/**', - '!**/node_modules/**', - '!packages/services/src/identityProviders/GS1Provider.ts' // This file call a function that is not exported - ], - coverageReporters: ['text', 'lcov', 'json'], - coverageProvider: 'v8', - coverageDirectory: './coverage', - extensionsToTreatAsEsm: ['.ts'], - testMatch: ['**/__tests__/**/*.test.*'], - testPathIgnorePatterns: [ - '/node_modules/', - ], - testEnvironment: 'node', - automock: false, - extensionsToTreatAsEsm: ['.ts'], - projects: [ - { - preset: 'ts-jest', - testEnvironment: 'jsdom', - setupFilesAfterEnv: ['/packages/components/src/setupTests.ts'], - displayName: ComponentPkg.name, - testMatch: ['/packages/components/**/?(*.)+(spec|test).[jt]s?(x)'], - transform: { - '^.+\\.m?tsx?$': [ - 'ts-jest', - { - useESM: true, - tsconfig: '/packages/components/tsconfig.json', - }, - ], - }, - }, - { - preset: 'ts-jest', - testEnvironment: 'jsdom', - setupFilesAfterEnv: ['/packages/mock-app/jest.config.js'], - displayName: MockAppPkg.name, - testMatch: ['/packages/mock-app/jest.config.js'], - transform: { - '^.+\\.m?tsx?$': [ - 'ts-jest', - { - useESM: true, - tsconfig: '/packages/mock-app/tsconfig.json', - }, - ], - }, - }, - { - // Default Node.js environment tests for all other packages - preset: 'ts-jest', - displayName: 'Node.js environment', - testEnvironment: 'node', - testMatch: ['/packages/**/src/**/?(*.)+(spec|test).[jt]s?(x)'], - testPathIgnorePatterns: [ - '/node_modules/', - '/packages/components', - '/packages/mock-app', - '/packages/services/src/__tests__/gs1.test.ts' // This file call a library that is not exported, so it is ignored - ], - transform: { - '^.+\\.m?tsx?$': [ - 'ts-jest', - { - useESM: true, - tsconfig: '/packages/tsconfig.settings.json', - }, - ], - }, - moduleNameMapper: { - '^(\\.{1,2}/.*)\\.js$': '$1', - } - }, - ], -}; diff --git a/lerna.json b/lerna.json index 12cdad43..62ce4f22 100644 --- a/lerna.json +++ b/lerna.json @@ -9,6 +9,5 @@ "gitRemote": "origin", "message": "chore(release): %s [skip ci]" } - }, - "useWorkspaces": true + } } diff --git a/package.json b/package.json index 1d10e978..6f1282a1 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "build:components": "cd packages/components && yarn run build", "build:untp-test-suite": "cd packages/untp-test-suite && yarn run build", "build-clean": "rimraf --glob ./yarn.lock ./node_modules ./packages/*/tsconfig.tsbuildinfo ./packages/*/build ./packages/*/node_modules", - "test": "yarn run test:services && yarn run test:components && yarn run test:mock-app", + "test": "lerna exec -- yarn jest", + "test:coverage": "lerna exec -- yarn jest --coverage && istanbul-merge --out coverage/coverage-final.json packages/*/coverage/coverage-final.json && nyc report --reporter=html --temp-dir=./coverage", "test:components": "cd packages/components && yarn run test", "test:services": "cd packages/services && yarn run test", "test:mock-app": "cd packages/mock-app && yarn run test", @@ -57,6 +58,8 @@ "node": ">= 20.12.2" }, "dependencies": { - "rimraf": "^5.0.5" + "rimraf": "^5.0.5", + "istanbul-merge": "2.0.0", + "nyc": "17.1.0" } } diff --git a/packages/components/jest.config.js b/packages/components/jest.config.js index 544aee62..1c50bb54 100644 --- a/packages/components/jest.config.js +++ b/packages/components/jest.config.js @@ -1,4 +1,6 @@ +import base from '../../jest.config.base.js'; const jestConfig = { + ...base, preset: 'ts-jest', testEnvironment: 'jsdom', extensionsToTreatAsEsm: ['.ts'], diff --git a/packages/events/package.json b/packages/events/package.json deleted file mode 100644 index def3acd1..00000000 --- a/packages/events/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "@mock-app/events", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC" -} diff --git a/packages/mock-app/jest.config.js b/packages/mock-app/jest.config.js index 674d4b13..1b561df9 100644 --- a/packages/mock-app/jest.config.js +++ b/packages/mock-app/jest.config.js @@ -1,4 +1,6 @@ +const base = require('../../jest.config.base'); const jestConfig = { + ...base, preset: 'ts-jest', testEnvironment: 'jsdom', extensionsToTreatAsEsm: ['.ts'], diff --git a/packages/services/jest.config.js b/packages/services/jest.config.js new file mode 100644 index 00000000..e8c7f4c3 --- /dev/null +++ b/packages/services/jest.config.js @@ -0,0 +1,20 @@ +import base from '../../jest.config.base.js'; +const jestConfig = { + ...base, + testEnvironment: 'jsdom', + testPathIgnorePatterns: ['/node_modules/', '/build/', '/__tests__/mocks/'], + transform: { + '\\.[jt]sx?$': 'ts-jest', + }, + globals: { + 'ts-jest': { + useESM: true, + }, + }, + moduleNameMapper: { + '(.+)\\.js': '$1', + }, + extensionsToTreatAsEsm: ['.ts'], +}; + +export default jestConfig; diff --git a/packages/services/package.json b/packages/services/package.json index f0888c4e..8cfc7691 100644 --- a/packages/services/package.json +++ b/packages/services/package.json @@ -33,27 +33,5 @@ "devDependencies": { "axios-mock-adapter": "^1.19.0", "typescript": "^5.3.3" - }, - "jest": { - "testEnvironment": "jsdom", - "testPathIgnorePatterns": [ - "/node_modules/", - "/build/", - "/__tests__/mocks/" - ], - "transform": { - "\\.[jt]sx?$": "ts-jest" - }, - "globals": { - "ts-jest": { - "useESM": true - } - }, - "moduleNameMapper": { - "(.+)\\.js": "$1" - }, - "extensionsToTreatAsEsm": [ - ".ts" - ] } } diff --git a/packages/untp-test-suite/jest.config.js b/packages/untp-test-suite/jest.config.js index c58bf4bf..fd698551 100644 --- a/packages/untp-test-suite/jest.config.js +++ b/packages/untp-test-suite/jest.config.js @@ -1,6 +1,8 @@ import { defaults } from 'jest-config'; +import base from '../../jest.config.base.js'; export default { + ...base, rootDir: './', moduleFileExtensions: [...defaults.moduleFileExtensions, 'mts'], collectCoverage: false, diff --git a/packages/vc-test-suite/jest.config.js b/packages/vc-test-suite/jest.config.js index 7a36d8df..c5b2dfbf 100644 --- a/packages/vc-test-suite/jest.config.js +++ b/packages/vc-test-suite/jest.config.js @@ -1,4 +1,7 @@ +const base = require('../../jest.config.base'); module.exports = { + ...base, + collectCoverageFrom: ['/tests/**/*.{ts,tsx}', '!**/*.d.ts'], preset: 'ts-jest', testEnvironment: 'node', roots: [''], diff --git a/yarn.lock b/yarn.lock index d91b4c2a..d260674a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5566,11 +5566,23 @@ app-root-dir@^1.0.2: resolved "https://registry.yarnpkg.com/app-root-dir/-/app-root-dir-1.0.2.tgz#38187ec2dea7577fff033ffcb12172692ff6e118" integrity sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g== +append-transform@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" + integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== + dependencies: + default-require-extensions "^3.0.0" + "aproba@^1.0.3 || ^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== + are-we-there-yet@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" @@ -5694,7 +5706,7 @@ array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.flatmap@^1.3.2: +array.prototype.flatmap@^1.3.1, array.prototype.flatmap@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== @@ -6466,6 +6478,16 @@ cacache@^18.0.0: tar "^6.1.11" unique-filename "^3.0.0" +caching-transform@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" + integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== + dependencies: + hasha "^5.0.0" + make-dir "^3.0.0" + package-hash "^4.0.0" + write-file-atomic "^3.0.0" + call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" @@ -7638,6 +7660,13 @@ default-gateway@^6.0.3: dependencies: execa "^5.0.0" +default-require-extensions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.1.tgz#bfae00feeaeada68c2ae256c62540f60b80625bd" + integrity sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw== + dependencies: + strip-bom "^4.0.0" + defaults@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" @@ -8347,6 +8376,11 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es6-error@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + esbuild-plugin-alias@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/esbuild-plugin-alias/-/esbuild-plugin-alias-0.2.1.tgz#45a86cb941e20e7c2bc68a2bea53562172494fcb" @@ -9085,7 +9119,7 @@ find-cache-dir@^2.0.0: make-dir "^2.0.0" pkg-dir "^3.0.0" -find-cache-dir@^3.0.0, find-cache-dir@^3.3.1: +find-cache-dir@^3.0.0, find-cache-dir@^3.2.0, find-cache-dir@^3.3.1: version "3.3.2" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== @@ -9181,7 +9215,15 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" -foreground-child@^3.1.0: +foreground-child@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" + integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^3.0.2" + +foreground-child@^3.1.0, foreground-child@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== @@ -9259,6 +9301,11 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== +fromentries@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" + integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== + fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" @@ -9553,7 +9600,7 @@ glob@^10.0.0, glob@^10.2.2, glob@^10.3.10, glob@^10.3.7: package-json-from-dist "^1.0.0" path-scurry "^1.11.1" -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.3: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -9766,6 +9813,14 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hasha@^5.0.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" + integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== + dependencies: + is-stream "^2.0.0" + type-fest "^0.8.0" + hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" @@ -10601,6 +10656,11 @@ is-weakset@^2.0.3: call-bind "^1.0.7" get-intrinsic "^1.2.4" +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" @@ -10656,6 +10716,13 @@ istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== +istanbul-lib-hook@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" + integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== + dependencies: + append-transform "^2.0.0" + istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: version "5.2.1" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" @@ -10667,7 +10734,7 @@ istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: istanbul-lib-coverage "^3.2.0" semver "^6.3.0" -istanbul-lib-instrument@^6.0.0: +istanbul-lib-instrument@^6.0.0, istanbul-lib-instrument@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== @@ -10678,6 +10745,18 @@ istanbul-lib-instrument@^6.0.0: istanbul-lib-coverage "^3.2.0" semver "^7.5.4" +istanbul-lib-processinfo@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz#366d454cd0dcb7eb6e0e419378e60072c8626169" + integrity sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg== + dependencies: + archy "^1.0.0" + cross-spawn "^7.0.3" + istanbul-lib-coverage "^3.2.0" + p-map "^3.0.0" + rimraf "^3.0.0" + uuid "^8.3.2" + istanbul-lib-report@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" @@ -10696,7 +10775,19 @@ istanbul-lib-source-maps@^4.0.0: istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" -istanbul-reports@^3.1.3: +istanbul-merge@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/istanbul-merge/-/istanbul-merge-2.0.0.tgz#996c93e8591315584775b7685ff6b679aec572b6" + integrity sha512-Y812/uTdnF5Qc2qWxA7jQOTkqpFLEr7BHy8mzUQFRJstTjPigNS1Bh3q06AbOhBZ7tZqrI4MZdMgG34KVnUn6w== + dependencies: + array.prototype.flatmap "^1.3.1" + for-each "^0.3.3" + glob "^7.2.3" + istanbul-lib-coverage "^3.2.0" + mkdirp "^0.5.6" + yargs "^15.4.1" + +istanbul-reports@^3.0.2, istanbul-reports@^3.1.3: version "3.1.7" resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== @@ -12159,6 +12250,11 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.flattendeep@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" + integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ== + lodash.ismatch@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" @@ -12276,7 +12372,7 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.2, make-dir@^3.1.0: +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== @@ -12695,7 +12791,7 @@ mkdirp-classic@^0.5.2: resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== -mkdirp@^0.5.4, mkdirp@~0.5.1: +mkdirp@^0.5.4, mkdirp@^0.5.6, mkdirp@~0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== @@ -12937,6 +13033,13 @@ node-machine-id@1.1.12: resolved "https://registry.yarnpkg.com/node-machine-id/-/node-machine-id-1.1.12.tgz#37904eee1e59b320bb9c5d6c0a59f3b469cb6267" integrity sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ== +node-preload@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" + integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== + dependencies: + process-on-spawn "^1.0.0" + node-releases@^2.0.18: version "2.0.18" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" @@ -13211,6 +13314,39 @@ nx@17.3.2, "nx@>=17.1.2 < 18": "@nx/nx-win32-arm64-msvc" "17.3.2" "@nx/nx-win32-x64-msvc" "17.3.2" +nyc@17.1.0: + version "17.1.0" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-17.1.0.tgz#b6349a401a62ffeb912bd38ea9a018839fdb6eb1" + integrity sha512-U42vQ4czpKa0QdI1hu950XuNhYqgoM+ZF1HT+VuUHL9hPfDPVvNQyltmMqdE9bUHMVa+8yNbc3QKTj8zQhlVxQ== + dependencies: + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + caching-transform "^4.0.0" + convert-source-map "^1.7.0" + decamelize "^1.2.0" + find-cache-dir "^3.2.0" + find-up "^4.1.0" + foreground-child "^3.3.0" + get-package-type "^0.1.0" + glob "^7.1.6" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-hook "^3.0.0" + istanbul-lib-instrument "^6.0.2" + istanbul-lib-processinfo "^2.0.2" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.0.2" + make-dir "^3.0.0" + node-preload "^0.2.1" + p-map "^3.0.0" + process-on-spawn "^1.0.0" + resolve-from "^5.0.0" + rimraf "^3.0.0" + signal-exit "^3.0.2" + spawn-wrap "^2.0.0" + test-exclude "^6.0.0" + yargs "^15.0.2" + nypm@^0.3.8: version "0.3.12" resolved "https://registry.yarnpkg.com/nypm/-/nypm-0.3.12.tgz#37541bec0af3a37d3acd81d6662c6666e650b22e" @@ -13563,6 +13699,16 @@ p-waterfall@2.1.1: dependencies: p-reduce "^2.0.0" +package-hash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" + integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== + dependencies: + graceful-fs "^4.1.15" + hasha "^5.0.0" + lodash.flattendeep "^4.4.0" + release-zalgo "^1.0.0" + package-json-from-dist@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" @@ -14558,6 +14704,13 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +process-on-spawn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" + integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== + dependencies: + fromentries "^1.2.0" + process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" @@ -15300,6 +15453,13 @@ relateurl@^0.2.7: resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== +release-zalgo@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" + integrity sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA== + dependencies: + es6-error "^4.0.1" + remark-external-links@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/remark-external-links/-/remark-external-links-8.0.0.tgz#308de69482958b5d1cd3692bc9b725ce0240f345" @@ -15966,6 +16126,18 @@ space-separated-tokens@^1.0.0: resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== +spawn-wrap@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" + integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== + dependencies: + foreground-child "^2.0.0" + is-windows "^1.0.2" + make-dir "^3.0.0" + rimraf "^3.0.0" + signal-exit "^3.0.2" + which "^2.0.1" + spdx-correct@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" @@ -16923,7 +17095,7 @@ type-fest@^0.6.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== -type-fest@^0.8.1: +type-fest@^0.8.0, type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== @@ -18160,7 +18332,7 @@ yargs@17.7.2, yargs@^17.1.0, yargs@^17.3.1, yargs@^17.6.2, yargs@^17.7.2: y18n "^5.0.5" yargs-parser "^21.1.1" -yargs@^15.3.1: +yargs@^15.0.2, yargs@^15.3.1, yargs@^15.4.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== From 3a5813371d0ec5e6986f14a226fa873401895ffd Mon Sep 17 00:00:00 2001 From: Nam Hoang Date: Thu, 24 Oct 2024 15:50:17 +0700 Subject: [PATCH 06/17] chore: trigger the CI test Signed-off-by: Nam Hoang --- .github/workflows/build_test.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index 02db8fd5..bc56a753 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -4,6 +4,8 @@ on: pull_request: branches: - next + - fix/decode-jwt + workflow_dispatch: jobs: test_and_build: From de6ce1606be771080c2701807d63151a7f5b317d Mon Sep 17 00:00:00 2001 From: Nam Hoang Date: Thu, 24 Oct 2024 16:03:44 +0700 Subject: [PATCH 07/17] fix: json import file Signed-off-by: Nam Hoang --- packages/services/src/__tests__/vckit.service.test.ts | 5 +++-- packages/services/src/vckit.service.ts | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/services/src/__tests__/vckit.service.test.ts b/packages/services/src/__tests__/vckit.service.test.ts index fc76e41e..5a4680bb 100644 --- a/packages/services/src/__tests__/vckit.service.test.ts +++ b/packages/services/src/__tests__/vckit.service.test.ts @@ -1,8 +1,8 @@ import { issueVC, issueCredentialStatus } from '../vckit.service'; import { privateAPI } from '../utils/httpService'; import { decodeJwt } from 'jose'; -import appConfig from '../../../mock-app/src/constants/app-config.json'; import { decodeEnvelopedVC, verifyVC } from '../vckit.service'; +import appConfig from '../../../../app-config.json'; jest.mock('jose', () => ({ decodeJwt: jest.fn(), @@ -278,7 +278,8 @@ describe('vckit.service', () => { }); }); }); -jest.mock('../../../mock-app/src/constants/app-config.json', () => ({ + +jest.mock('../../../../app-config.json', () => ({ defaultVerificationServiceLink: { href: 'https://example.com/credentials/verify', apiKey: '123', diff --git a/packages/services/src/vckit.service.ts b/packages/services/src/vckit.service.ts index 2d304bac..a93a64eb 100644 --- a/packages/services/src/vckit.service.ts +++ b/packages/services/src/vckit.service.ts @@ -10,6 +10,7 @@ import { import { decodeJwt } from 'jose'; import { privateAPI } from './utils/httpService.js'; import { isPlainObject, every, isString } from 'lodash'; +import appConfig from '../../../app-config.json'; export const contextDefault = [ 'https://www.w3.org/ns/credentials/v2', From 18fbd81fcbc4b08dd9fcb714de656c241a2cb37e Mon Sep 17 00:00:00 2001 From: Nam Hoang Date: Thu, 24 Oct 2024 17:29:55 +0700 Subject: [PATCH 08/17] test: update unit test --- .../mock-app/src/__tests__/Verify.test.tsx | 26 ++++++++++++------- .../src/__tests__/aggregationEvent.test.ts | 6 ++++- .../services/src/__tests__/processDPP.test.ts | 3 +++ .../src/__tests__/transactionEvent.test.ts | 1 + .../src/epcisEvents/aggregationEvent.ts | 4 +-- 5 files changed, 27 insertions(+), 13 deletions(-) diff --git a/packages/mock-app/src/__tests__/Verify.test.tsx b/packages/mock-app/src/__tests__/Verify.test.tsx index 9bfc6561..3c5170bb 100644 --- a/packages/mock-app/src/__tests__/Verify.test.tsx +++ b/packages/mock-app/src/__tests__/Verify.test.tsx @@ -2,7 +2,7 @@ import { act, render, screen, waitFor } from '@testing-library/react'; import { createMemoryHistory } from 'history'; import { Router as RouterDom } from 'react-router-dom'; import { Verify } from '../pages'; -import { privateAPI, publicAPI } from '@mock-app/services'; +import { privateAPI, publicAPI, verifyVC } from '@mock-app/services'; import { VerifiableCredential } from '@vckit/core-types'; console.error = jest.fn(); @@ -15,12 +15,13 @@ jest.mock('@mock-app/services', () => ({ getDlrPassport: jest.fn(), IdentityProvider: jest.fn(), getProviderByType: jest.fn(), + decryptCredential: jest.fn(), + computeHash: jest.fn(), + verifyVC: jest.fn(), publicAPI: { get: jest.fn() }, privateAPI: { post: jest.fn(), setBearerTokenAuthorizationHeaders: jest.fn() }, })); -jest.mock('@veramo/utils', () => ({ - computeEntryHash: jest.fn(), -})); + jest.mock('jose', () => ({ decodeJwt: jest.fn(), })); @@ -96,12 +97,12 @@ describe('Verify', () => { it('should render failure screen due to no matching proofs', async () => { jest.spyOn(publicAPI, 'get').mockResolvedValueOnce(mockEncryptedCredential); // Simulate the response of a verify VC request failing due to no matching proofs. - jest.spyOn(privateAPI, 'post').mockResolvedValueOnce({ + (verifyVC as jest.Mock).mockImplementation(() => ({ verified: false, error: { message: 'No matching proofs found in the given document.', }, - }); + })); await act(async () => { render( @@ -119,12 +120,13 @@ describe('Verify', () => { it('should render failure screen for revoked credential', async () => { jest.spyOn(publicAPI, 'get').mockResolvedValueOnce(mockEncryptedCredential); // Simulate the response of a verify VC request failing due to the revoked status. - jest.spyOn(privateAPI, 'post').mockResolvedValueOnce({ + + (verifyVC as jest.Mock).mockImplementation(() => ({ verified: false, error: { message: 'revoked: The credential was revoked by the issuer', }, - }); + })); await act(async () => { render( @@ -142,7 +144,9 @@ describe('Verify', () => { it('should render success screen for active credential', async () => { jest.spyOn(publicAPI, 'get').mockResolvedValueOnce(mockEncryptedCredential); // Simulate the response of a verify VC request succeeding due to the active status. - jest.spyOn(privateAPI, 'post').mockResolvedValueOnce({ verified: true }); + (verifyVC as jest.Mock).mockImplementation(() => ({ + verified: true, + })); await act(async () => { render( @@ -163,7 +167,9 @@ describe('Verify', () => { const { credentialStatus, ...mockEncryptedCredentialWithoutStatus } = mockEncryptedCredential; jest.spyOn(publicAPI, 'get').mockResolvedValueOnce(mockEncryptedCredentialWithoutStatus); // Simulate the response of a verify VC request succeeding without a credential status. - jest.spyOn(privateAPI, 'post').mockResolvedValueOnce({ verified: true }); + (verifyVC as jest.Mock).mockImplementation(() => ({ + verified: true, + })); await act(async () => { render( diff --git a/packages/services/src/__tests__/aggregationEvent.test.ts b/packages/services/src/__tests__/aggregationEvent.test.ts index 482eede5..edfab2d0 100644 --- a/packages/services/src/__tests__/aggregationEvent.test.ts +++ b/packages/services/src/__tests__/aggregationEvent.test.ts @@ -239,7 +239,11 @@ describe('processAggregationEvent', () => { const aggregationVC = await processAggregationEvent(aggregationEvent, contextWithHeaders); - expect(aggregationVC).toBe(aggregationVCMock); + expect(aggregationVC).toEqual({ + vc: aggregationVCMock, + decodedEnvelopedVC: aggregationVCMock, + linkResolver: aggregationEventDLRMock, + }); expect(vckitService.issueVC).toHaveBeenCalledWith( expect.objectContaining({ headers: customHeaders, diff --git a/packages/services/src/__tests__/processDPP.test.ts b/packages/services/src/__tests__/processDPP.test.ts index 4ef11cdb..517010ed 100644 --- a/packages/services/src/__tests__/processDPP.test.ts +++ b/packages/services/src/__tests__/processDPP.test.ts @@ -144,6 +144,9 @@ describe('processDPP', () => { expect(vc).toEqual({ vc: expectVCResult, + decodedEnvelopedVC: { + credentialSubject: { id: 'https://example.com/123' }, + }, linkResolver: expect.any(String), }); diff --git a/packages/services/src/__tests__/transactionEvent.test.ts b/packages/services/src/__tests__/transactionEvent.test.ts index a4989abc..b838eead 100644 --- a/packages/services/src/__tests__/transactionEvent.test.ts +++ b/packages/services/src/__tests__/transactionEvent.test.ts @@ -215,6 +215,7 @@ describe('processTransactionEvent', () => { expect(transactionVC).toEqual({ vc: transactionVCMock, + decodedEnvelopedVC: transactionVCMock, linkResolver: transactionEventDLRMock, }); expect(vckitService.issueVC).toHaveBeenCalledWith( diff --git a/packages/services/src/epcisEvents/aggregationEvent.ts b/packages/services/src/epcisEvents/aggregationEvent.ts index e0bc71f0..e7c29cb8 100644 --- a/packages/services/src/epcisEvents/aggregationEvent.ts +++ b/packages/services/src/epcisEvents/aggregationEvent.ts @@ -51,7 +51,7 @@ export const processAggregationEvent: IService = async ( const decodedEnvelopedVC = decodeEnvelopedVC(aggregationVC); const aggregationVCLink = await uploadData(storage, aggregationVC, generateUUID()); - await registerLinkResolver( + const aggregationLinkResolver = await registerLinkResolver( aggregationVCLink, epcisAggregationEvent.dlrIdentificationKeyType, identifier, @@ -64,5 +64,5 @@ export const processAggregationEvent: IService = async ( qualifierPath, ); - return { vc: aggregationVC, decodedEnvelopedVC, linkResolver: aggregationVCLink }; + return { vc: aggregationVC, decodedEnvelopedVC, linkResolver: aggregationLinkResolver }; }; From ec321520955338c3a590418609cb41ee4a3f23f4 Mon Sep 17 00:00:00 2001 From: Nam Hoang Date: Thu, 24 Oct 2024 17:30:38 +0700 Subject: [PATCH 09/17] chore: update jest config --- packages/vc-test-suite/jest.config.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/vc-test-suite/jest.config.js b/packages/vc-test-suite/jest.config.js index c5b2dfbf..396b375f 100644 --- a/packages/vc-test-suite/jest.config.js +++ b/packages/vc-test-suite/jest.config.js @@ -1,5 +1,5 @@ -const base = require('../../jest.config.base'); -module.exports = { +import base from '../../jest.config.base.js'; +const jestConfig = { ...base, collectCoverageFrom: ['/tests/**/*.{ts,tsx}', '!**/*.d.ts'], preset: 'ts-jest', @@ -7,3 +7,5 @@ module.exports = { roots: [''], testMatch: ['**/__tests__/**/*.test.ts'], }; + +export default jestConfig; From c11f2904e329efa17995d900c865c98c4e1937ba Mon Sep 17 00:00:00 2001 From: Nam Hoang Date: Thu, 24 Oct 2024 17:52:48 +0700 Subject: [PATCH 10/17] refactor: import module services --- .../components/src/components/ConformityCredential/utils.ts | 2 +- packages/components/src/types/conformityCredential.types.ts | 2 +- packages/mock-app/src/__tests__/Verify.test.tsx | 2 +- packages/mock-app/src/pages/Verify.tsx | 2 +- packages/services/src/index.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/components/src/components/ConformityCredential/utils.ts b/packages/components/src/components/ConformityCredential/utils.ts index ea00854e..7c24c88e 100644 --- a/packages/components/src/components/ConformityCredential/utils.ts +++ b/packages/components/src/components/ConformityCredential/utils.ts @@ -1,5 +1,5 @@ import _ from 'lodash'; -import { StorageServiceConfig } from '@mock-app/services/build/types/storage.js'; +import { StorageServiceConfig } from '@mock-app/services'; export type Result = { ok: true; value: T } | { ok: false; value: string }; diff --git a/packages/components/src/types/conformityCredential.types.ts b/packages/components/src/types/conformityCredential.types.ts index 2f62c75a..c9d99734 100644 --- a/packages/components/src/types/conformityCredential.types.ts +++ b/packages/components/src/types/conformityCredential.types.ts @@ -1,4 +1,4 @@ -import { StorageServiceConfig } from "@mock-app/services/build/types"; +import { StorageServiceConfig } from '@mock-app/services'; export type FetchOptions = { method: 'POST' | 'GET'; diff --git a/packages/mock-app/src/__tests__/Verify.test.tsx b/packages/mock-app/src/__tests__/Verify.test.tsx index 3c5170bb..a4269df0 100644 --- a/packages/mock-app/src/__tests__/Verify.test.tsx +++ b/packages/mock-app/src/__tests__/Verify.test.tsx @@ -1,7 +1,7 @@ import { act, render, screen, waitFor } from '@testing-library/react'; import { createMemoryHistory } from 'history'; import { Router as RouterDom } from 'react-router-dom'; -import { Verify } from '../pages'; +import Verify from '../pages/Verify'; import { privateAPI, publicAPI, verifyVC } from '@mock-app/services'; import { VerifiableCredential } from '@vckit/core-types'; diff --git a/packages/mock-app/src/pages/Verify.tsx b/packages/mock-app/src/pages/Verify.tsx index ac33f41b..3bf8e266 100644 --- a/packages/mock-app/src/pages/Verify.tsx +++ b/packages/mock-app/src/pages/Verify.tsx @@ -1,5 +1,5 @@ import { Status } from '@mock-app/components'; -import { computeHash, decryptCredential, privateAPI, publicAPI, verifyVC } from '@mock-app/services'; +import { computeHash, decryptCredential, publicAPI, verifyVC } from '@mock-app/services'; import { IVerifyResult, VerifiableCredential } from '@vckit/core-types'; import * as jose from 'jose'; import React, { useCallback, useEffect, useState } from 'react'; diff --git a/packages/services/src/index.ts b/packages/services/src/index.ts index 9cdc626f..b5d9133e 100644 --- a/packages/services/src/index.ts +++ b/packages/services/src/index.ts @@ -1,4 +1,4 @@ -export * from './types/types.js'; +export * from './types/index.js'; export * from './epcisEvents/index.js'; export * from './processDPP.service.js'; export * from './processDigitalIdentityAnchor.service.js'; From 8820932aece02df7d9a679708b494ac1c98fb798 Mon Sep 17 00:00:00 2001 From: Nam Hoang Date: Fri, 25 Oct 2024 09:01:58 +0700 Subject: [PATCH 11/17] chore: update yarn lock --- yarn.lock | 1710 ++++++++++++++++++++++++++--------------------------- 1 file changed, 855 insertions(+), 855 deletions(-) diff --git a/yarn.lock b/yarn.lock index d260674a..ddd5159b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -36,34 +36,34 @@ dependencies: default-browser-id "3.0.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.25.7", "@babel/code-frame@^7.8.3": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.25.7.tgz#438f2c524071531d643c6f0188e1e28f130cebc7" - integrity sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.8.3": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.25.9.tgz#895b6c7e04a7271a0cbfd575d2e8131751914cc7" + integrity sha512-z88xeGxnzehn2sqZ8UdGQEvYErF1odv2CftxInpSYJt6uHuPe9YjahKZITGs3l5LeI9d2ROG+obuDAoSlqbNfQ== dependencies: - "@babel/highlight" "^7.25.7" + "@babel/highlight" "^7.25.9" picocolors "^1.0.0" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.7", "@babel/compat-data@^7.25.8": - version "7.25.8" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.8.tgz#0376e83df5ab0eb0da18885c0140041f0747a402" - integrity sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.9.tgz#24b01c5db6a3ebf85661b4fb4a946a9bccc72ac8" + integrity sha512-yD+hEuJ/+wAJ4Ox2/rpNv5HIuPG82x3ZlQvYVn8iYCprdxzE7P1udpGF1jyjQVBU4dgznN+k2h103vxZ7NdPyw== "@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.18.9", "@babel/core@^7.23.0", "@babel/core@^7.23.2", "@babel/core@^7.23.9", "@babel/core@^7.7.2", "@babel/core@^7.8.0": - version "7.25.8" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.8.tgz#a57137d2a51bbcffcfaeba43cb4dd33ae3e0e1c6" - integrity sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.9.tgz#855a4cddcec4158f3f7afadacdab2a7de8af7434" + integrity sha512-WYvQviPw+Qyib0v92AwNIrdLISTp7RfDkM7bPqBvpbnhY4wq8HvHBZREVdYDXk98C8BkOIVnHAY3yvj7AVISxQ== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.25.7" - "@babel/generator" "^7.25.7" - "@babel/helper-compilation-targets" "^7.25.7" - "@babel/helper-module-transforms" "^7.25.7" - "@babel/helpers" "^7.25.7" - "@babel/parser" "^7.25.8" - "@babel/template" "^7.25.7" - "@babel/traverse" "^7.25.7" - "@babel/types" "^7.25.8" + "@babel/code-frame" "^7.25.9" + "@babel/generator" "^7.25.9" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helpers" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -71,69 +71,69 @@ semver "^6.3.1" "@babel/eslint-parser@^7.16.3": - version "7.25.8" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.25.8.tgz#0119dec46be547d7a339978dedb9d29e517c2443" - integrity sha512-Po3VLMN7fJtv0nsOjBDSbO1J71UhzShE9MuOSkWEV9IZQXzhZklYtzKZ8ZD/Ij3a0JBv1AG3Ny2L3jvAHQVOGg== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.25.9.tgz#603c68a63078796527bc9d0833f5e52dd5f9224c" + integrity sha512-5UXfgpK0j0Xr/xIdgdLEhOFxaDZ0bRPWJJchRpqOSur/3rZoPbqqki5mm0p4NE2cs28krBEiSM2MB7//afRSQQ== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.23.0", "@babel/generator@^7.25.7", "@babel/generator@^7.7.2": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.7.tgz#de86acbeb975a3e11ee92dd52223e6b03b479c56" - integrity sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA== +"@babel/generator@^7.23.0", "@babel/generator@^7.25.9", "@babel/generator@^7.7.2": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.9.tgz#c7e828ebe0c2baba103b712924699c9e8a6e32f0" + integrity sha512-omlUGkr5EaoIJrhLf9CJ0TvjBRpd9+AXRG//0GEQ9THSo8wPiTlbpy1/Ow8ZTrbXpjd9FHXfbFQx32I04ht0FA== dependencies: - "@babel/types" "^7.25.7" + "@babel/types" "^7.25.9" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" -"@babel/helper-annotate-as-pure@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz#63f02dbfa1f7cb75a9bdb832f300582f30bb8972" - integrity sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA== +"@babel/helper-annotate-as-pure@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz#d8eac4d2dc0d7b6e11fa6e535332e0d3184f06b4" + integrity sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g== dependencies: - "@babel/types" "^7.25.7" + "@babel/types" "^7.25.9" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.7.tgz#d721650c1f595371e0a23ee816f1c3c488c0d622" - integrity sha512-12xfNeKNH7jubQNm7PAkzlLwEmCs1tfuX3UjIw6vP6QXi+leKh6+LyC/+Ed4EIQermwd58wsyh070yjDHFlNGg== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz#f41752fe772a578e67286e6779a68a5a92de1ee9" + integrity sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g== dependencies: - "@babel/traverse" "^7.25.7" - "@babel/types" "^7.25.7" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" -"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz#11260ac3322dda0ef53edfae6e97b961449f5fa4" - integrity sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A== +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875" + integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ== dependencies: - "@babel/compat-data" "^7.25.7" - "@babel/helper-validator-option" "^7.25.7" + "@babel/compat-data" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" browserslist "^4.24.0" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz#5d65074c76cae75607421c00d6bd517fe1892d6b" - integrity sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.25.7" - "@babel/helper-member-expression-to-functions" "^7.25.7" - "@babel/helper-optimise-call-expression" "^7.25.7" - "@babel/helper-replace-supers" "^7.25.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" - "@babel/traverse" "^7.25.7" +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz#7644147706bb90ff613297d49ed5266bde729f83" + integrity sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-member-expression-to-functions" "^7.25.9" + "@babel/helper-optimise-call-expression" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/traverse" "^7.25.9" semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.7.tgz#dcb464f0e2cdfe0c25cc2a0a59c37ab940ce894e" - integrity sha512-byHhumTj/X47wJ6C6eLpK7wW/WBEcnUeb7D0FNc/jFQnQVw7DOso3Zz5u9x/zLrFVkHa89ZGDbkAa1D54NdrCQ== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz#3e8999db94728ad2b2458d7a470e7770b7764e26" + integrity sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw== dependencies: - "@babel/helper-annotate-as-pure" "^7.25.7" + "@babel/helper-annotate-as-pure" "^7.25.9" regexpu-core "^6.1.1" semver "^6.3.1" @@ -148,165 +148,165 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" -"@babel/helper-member-expression-to-functions@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz#541a33b071f0355a63a0fa4bdf9ac360116b8574" - integrity sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA== - dependencies: - "@babel/traverse" "^7.25.7" - "@babel/types" "^7.25.7" - -"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz#dba00d9523539152906ba49263e36d7261040472" - integrity sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw== - dependencies: - "@babel/traverse" "^7.25.7" - "@babel/types" "^7.25.7" - -"@babel/helper-module-transforms@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz#2ac9372c5e001b19bc62f1fe7d96a18cb0901d1a" - integrity sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ== - dependencies: - "@babel/helper-module-imports" "^7.25.7" - "@babel/helper-simple-access" "^7.25.7" - "@babel/helper-validator-identifier" "^7.25.7" - "@babel/traverse" "^7.25.7" - -"@babel/helper-optimise-call-expression@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz#1de1b99688e987af723eed44fa7fc0ee7b97d77a" - integrity sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng== - dependencies: - "@babel/types" "^7.25.7" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.25.7", "@babel/helper-plugin-utils@^7.8.0": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz#8ec5b21812d992e1ef88a9b068260537b6f0e36c" - integrity sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw== - -"@babel/helper-remap-async-to-generator@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.7.tgz#9efdc39df5f489bcd15533c912b6c723a0a65021" - integrity sha512-kRGE89hLnPfcz6fTrlNU+uhgcwv0mBE4Gv3P9Ke9kLVJYpi4AMVVEElXvB5CabrPZW4nCM8P8UyyjrzCM0O2sw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.25.7" - "@babel/helper-wrap-function" "^7.25.7" - "@babel/traverse" "^7.25.7" - -"@babel/helper-replace-supers@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz#38cfda3b6e990879c71d08d0fef9236b62bd75f5" - integrity sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.25.7" - "@babel/helper-optimise-call-expression" "^7.25.7" - "@babel/traverse" "^7.25.7" - -"@babel/helper-simple-access@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz#5eb9f6a60c5d6b2e0f76057004f8dacbddfae1c0" - integrity sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ== - dependencies: - "@babel/traverse" "^7.25.7" - "@babel/types" "^7.25.7" - -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz#382831c91038b1a6d32643f5f49505b8442cb87c" - integrity sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA== - dependencies: - "@babel/traverse" "^7.25.7" - "@babel/types" "^7.25.7" - -"@babel/helper-string-parser@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz#d50e8d37b1176207b4fe9acedec386c565a44a54" - integrity sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g== - -"@babel/helper-validator-identifier@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz#77b7f60c40b15c97df735b38a66ba1d7c3e93da5" - integrity sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg== - -"@babel/helper-validator-option@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz#97d1d684448228b30b506d90cace495d6f492729" - integrity sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ== - -"@babel/helper-wrap-function@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.7.tgz#9f6021dd1c4fdf4ad515c809967fc4bac9a70fe7" - integrity sha512-MA0roW3JF2bD1ptAaJnvcabsVlNQShUaThyJbCDD4bCp8NEgiFvpoqRI2YS22hHlc2thjO/fTg2ShLMC3jygAg== - dependencies: - "@babel/template" "^7.25.7" - "@babel/traverse" "^7.25.7" - "@babel/types" "^7.25.7" - -"@babel/helpers@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.7.tgz#091b52cb697a171fe0136ab62e54e407211f09c2" - integrity sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA== - dependencies: - "@babel/template" "^7.25.7" - "@babel/types" "^7.25.7" - -"@babel/highlight@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.25.7.tgz#20383b5f442aa606e7b5e3043b0b1aafe9f37de5" - integrity sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw== - dependencies: - "@babel/helper-validator-identifier" "^7.25.7" +"@babel/helper-member-expression-to-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz#9dfffe46f727005a5ea29051ac835fb735e4c1a3" + integrity sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" + integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-module-transforms@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.9.tgz#12e4fb2969197ef6d78ea8a2f24375ce85b425fb" + integrity sha512-TvLZY/F3+GvdRYFZFyxMvnsKi+4oJdgZzU3BoGN9Uc2d9C6zfNwJcKKhjqLAhK8i46mv93jsO74fDh3ih6rpHA== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-simple-access" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/helper-optimise-call-expression@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz#3324ae50bae7e2ab3c33f60c9a877b6a0146b54e" + integrity sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ== + dependencies: + "@babel/types" "^7.25.9" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46" + integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== + +"@babel/helper-remap-async-to-generator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz#e53956ab3d5b9fb88be04b3e2f31b523afd34b92" + integrity sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-wrap-function" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/helper-replace-supers@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz#ba447224798c3da3f8713fc272b145e33da6a5c5" + integrity sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.25.9" + "@babel/helper-optimise-call-expression" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/helper-simple-access@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz#6d51783299884a2c74618d6ef0f86820ec2e7739" + integrity sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz#0b2e1b62d560d6b1954893fd2b705dc17c91f0c9" + integrity sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== + +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== + +"@babel/helper-validator-option@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" + integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== + +"@babel/helper-wrap-function@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz#d99dfd595312e6c894bd7d237470025c85eea9d0" + integrity sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g== + dependencies: + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helpers@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.9.tgz#9e26aa6fbefdbca4f8c8a1d66dc6f1c00ddadb0a" + integrity sha512-oKWp3+usOJSzDZOucZUAMayhPz/xVjzymyDzUN8dk0Wd3RWMlGLXi07UCQ/CgQVb8LvXx3XBajJH4XGgkt7H7g== + dependencies: + "@babel/template" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/highlight@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.25.9.tgz#8141ce68fc73757946f983b343f1231f4691acc6" + integrity sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw== + dependencies: + "@babel/helper-validator-identifier" "^7.25.9" chalk "^2.4.2" js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.0", "@babel/parser@^7.23.9", "@babel/parser@^7.25.7", "@babel/parser@^7.25.8": - version "7.25.8" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.8.tgz#f6aaf38e80c36129460c1657c0762db584c9d5e2" - integrity sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.0", "@babel/parser@^7.23.9", "@babel/parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.9.tgz#8fcaa079ac7458facfddc5cd705cc8005e4d3817" + integrity sha512-aI3jjAAO1fh7vY/pBGsn1i9LDbRP43+asrRlkPuTXW5yHXtd1NgTEMudbBoDDxrf1daEEfPJqR+JBMakzrR4Dg== dependencies: - "@babel/types" "^7.25.8" + "@babel/types" "^7.25.9" -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.7.tgz#93969ac50ef4d68b2504b01b758af714e4cbdd64" - integrity sha512-UV9Lg53zyebzD1DwQoT9mzkEKa922LNUp5YkTJ6Uta0RbyXaQNUgcvSt7qIu1PpPzVb6rd10OVNTzkyBGeVmxQ== +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz#cc2e53ebf0a0340777fff5ed521943e253b4d8fe" + integrity sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/traverse" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.7.tgz#a338d611adb9dcd599b8b1efa200c88ebeffe046" - integrity sha512-GDDWeVLNxRIkQTnJn2pDOM1pkCgYdSqPeT1a9vh9yIqu2uzzgw1zcqEb+IJOhy+dTBMlNdThrDIksr2o09qrrQ== +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz#af9e4fb63ccb8abcb92375b2fcfe36b60c774d30" + integrity sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.7.tgz#c5f755e911dfac7ef6957300c0f9c4a8c18c06f4" - integrity sha512-wxyWg2RYaSUYgmd9MR0FyRGyeOMQE/Uzr1wzd/g5cf5bwi9A4v6HFdDm7y1MgDtod/fLOSTZY6jDgV0xU9d5bA== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz#e8dc26fcd616e6c5bf2bd0d5a2c151d4f92a9137" + integrity sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.7.tgz#3b7ea04492ded990978b6deaa1dfca120ad4455a" - integrity sha512-Xwg6tZpLxc4iQjorYsyGMyfJE7nP5MV8t/Ka58BgiA7Jw0fRqQNcANlLfdJ/yvBt9z9LD2We+BEkT7vLqZRWng== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz#807a667f9158acac6f6164b4beb85ad9ebc9e1d1" + integrity sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" - "@babel/plugin-transform-optional-chaining" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/plugin-transform-optional-chaining" "^7.25.9" -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.7.tgz#9622b1d597a703aa3a921e6f58c9c2d9a028d2c5" - integrity sha512-UVATLMidXrnH+GMUIuxq55nejlj02HP7F5ETyBONzP6G87fPBogG4CH6kxrSrdIuAjdwNO9VzyaYsrZPscWUrw== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz#de7093f1e7deaf68eadd7cc6b07f2ab82543269e" + integrity sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/traverse" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" "@babel/plugin-proposal-class-properties@^7.16.0": version "7.18.6" @@ -317,13 +317,13 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-decorators@^7.16.4": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.7.tgz#dabfd82df5dff3a8fc61a434233bf8227c88402c" - integrity sha512-q1mqqqH0e1lhmsEQHV5U8OmdueBC2y0RFr2oUzZoFRtN3MvPmt2fsFRcNQAoGLTSNdHBFUYGnlgcRFhkBbKjPw== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz#8680707f943d1a3da2cd66b948179920f097e254" + integrity sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g== dependencies: - "@babel/helper-create-class-features-plugin" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/plugin-syntax-decorators" "^7.25.7" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-decorators" "^7.25.9" "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0": version "7.18.6" @@ -391,33 +391,33 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.7.tgz#cf26fdde4e750688e133c0e33ead2506377e88f7" - integrity sha512-oXduHo642ZhstLVYTe2z2GSJIruU0c/W3/Ghr6A5yGMsVrvdnxO1z+3pbTcT7f3/Clnt+1z8D/w1r1f1SHaCHw== +"@babel/plugin-syntax-decorators@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz#986b4ca8b7b5df3f67cee889cedeffc2e2bf14b3" + integrity sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-flow@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.25.7.tgz#7d1255201b55d7644c57e0eb354aaf9f8b8d2d02" - integrity sha512-fyoj6/YdVtlv2ROig/J0fP7hh/wNO1MJGm1NR70Pg7jbkF+jOUL9joorqaCOQh06Y+LfgTagHzC8KqZ3MF782w== +"@babel/plugin-syntax-flow@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.25.9.tgz#30ddd09b4ad822f291efbbeb3bc4c5d3027af61d" + integrity sha512-F3FVgxwamIRS3+kfjNaPARX0DSAiH1exrQUVajXiR34hkdA9eyK+8rJbnu55DQjKL/ayuXqjNr2HDXwBEMEtFQ== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-import-assertions@^7.23.3", "@babel/plugin-syntax-import-assertions@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.7.tgz#8ce248f9f4ed4b7ed4cb2e0eb4ed9efd9f52921f" - integrity sha512-ZvZQRmME0zfJnDQnVBKYzHxXT7lYBB3Revz1GuS7oLXWMgqUPX4G+DDbT30ICClht9WKV34QVrZhSw6WdklwZQ== +"@babel/plugin-syntax-import-assertions@^7.23.3", "@babel/plugin-syntax-import-assertions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.9.tgz#631686872fac3d4d1f1ae9a406a8fd1c482c7b2a" + integrity sha512-4GHX5uzr5QMOOuzV0an9MFju4hKlm0OyePl/lHhcsTVae5t/IKVHnb8W67Vr6FuLlk5lPqLB7n7O+K5R46emYg== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-import-attributes@^7.24.7", "@babel/plugin-syntax-import-attributes@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.7.tgz#d78dd0499d30df19a598e63ab895e21b909bc43f" - integrity sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw== +"@babel/plugin-syntax-import-attributes@^7.24.7", "@babel/plugin-syntax-import-attributes@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.9.tgz#29c9643445deea4533c05e6ac6c39d15424bbe78" + integrity sha512-u3EN9ub8LyYvgTnrgp8gboElouayiwPdnM7x5tcnW3iSt09/lQYPwMNK40I9IUxo7QOZhAsPHCmmuO7EPdruqg== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" @@ -433,12 +433,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.25.7", "@babel/plugin-syntax-jsx@^7.7.2": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz#5352d398d11ea5e7ef330c854dea1dae0bf18165" - integrity sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw== +"@babel/plugin-syntax-jsx@^7.25.9", "@babel/plugin-syntax-jsx@^7.7.2": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz#a34313a178ea56f1951599b929c1ceacee719290" + integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" @@ -496,12 +496,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.25.7", "@babel/plugin-syntax-typescript@^7.7.2": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.7.tgz#bfc05b0cc31ebd8af09964650cee723bb228108b" - integrity sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g== +"@babel/plugin-syntax-typescript@^7.25.9", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz#67dda2b74da43727cf21d46cf9afef23f4365399" + integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" @@ -511,525 +511,525 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.7.tgz#1b9ed22e6890a0e9ff470371c73b8c749bcec386" - integrity sha512-EJN2mKxDwfOUCPxMO6MUI58RN3ganiRAG/MS/S3HfB6QFNjroAMelQo/gybyYq97WerCBAZoyrAoW8Tzdq2jWg== +"@babel/plugin-transform-arrow-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz#7821d4410bee5daaadbb4cdd9a6649704e176845" + integrity sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-async-generator-functions@^7.25.8": - version "7.25.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.8.tgz#3331de02f52cc1f2c75b396bec52188c85b0b1ec" - integrity sha512-9ypqkozyzpG+HxlH4o4gdctalFGIjjdufzo7I2XPda0iBnZ6a+FO0rIEQcdSPXp02CkvGsII1exJhmROPQd5oA== +"@babel/plugin-transform-async-generator-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz#1b18530b077d18a407c494eb3d1d72da505283a2" + integrity sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-remap-async-to-generator" "^7.25.7" - "@babel/traverse" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-remap-async-to-generator" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/plugin-transform-async-to-generator@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.7.tgz#a44c7323f8d4285a6c568dd43c5c361d6367ec52" - integrity sha512-ZUCjAavsh5CESCmi/xCpX1qcCaAglzs/7tmuvoFnJgA1dM7gQplsguljoTg+Ru8WENpX89cQyAtWoaE0I3X3Pg== +"@babel/plugin-transform-async-to-generator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz#c80008dacae51482793e5a9c08b39a5be7e12d71" + integrity sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ== dependencies: - "@babel/helper-module-imports" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-remap-async-to-generator" "^7.25.7" + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-remap-async-to-generator" "^7.25.9" -"@babel/plugin-transform-block-scoped-functions@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.7.tgz#e0b8843d5571719a2f1bf7e284117a3379fcc17c" - integrity sha512-xHttvIM9fvqW+0a3tZlYcZYSBpSWzGBFIt/sYG3tcdSzBB8ZeVgz2gBP7Df+sM0N1850jrviYSSeUuc+135dmQ== +"@babel/plugin-transform-block-scoped-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz#5700691dbd7abb93de300ca7be94203764fce458" + integrity sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-block-scoping@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.7.tgz#6dab95e98adf780ceef1b1c3ab0e55cd20dd410a" - integrity sha512-ZEPJSkVZaeTFG/m2PARwLZQ+OG0vFIhPlKHK/JdIMy8DbRJ/htz6LRrTFtdzxi9EHmcwbNPAKDnadpNSIW+Aow== +"@babel/plugin-transform-block-scoping@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz#c33665e46b06759c93687ca0f84395b80c0473a1" + integrity sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-class-properties@^7.22.5", "@babel/plugin-transform-class-properties@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.7.tgz#a389cfca7a10ac80e3ff4c75fca08bd097ad1523" - integrity sha512-mhyfEW4gufjIqYFo9krXHJ3ElbFLIze5IDp+wQTxoPd+mwFb1NxatNAwmv8Q8Iuxv7Zc+q8EkiMQwc9IhyGf4g== +"@babel/plugin-transform-class-properties@^7.22.5", "@babel/plugin-transform-class-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz#a8ce84fedb9ad512549984101fa84080a9f5f51f" + integrity sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q== dependencies: - "@babel/helper-create-class-features-plugin" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-class-static-block@^7.25.8": - version "7.25.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.8.tgz#a8af22028920fe404668031eceb4c3aadccb5262" - integrity sha512-e82gl3TCorath6YLf9xUwFehVvjvfqFhdOo4+0iVIVju+6XOi5XHkqB3P2AXnSwoeTX0HBoXq5gJFtvotJzFnQ== +"@babel/plugin-transform-class-static-block@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.9.tgz#1cab37c4278a563409d74c1e4f08fb77de5d7a5c" + integrity sha512-UIf+72C7YJ+PJ685/PpATbCz00XqiFEzHX5iysRwfvNT0Ko+FaXSvRgLytFSp8xUItrG9pFM/KoBBZDrY/cYyg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-classes@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.7.tgz#5103206cf80d02283bbbd044509ea3b65d0906bb" - integrity sha512-9j9rnl+YCQY0IGoeipXvnk3niWicIB6kCsWRGLwX241qSXpbA4MKxtp/EdvFxsc4zI5vqfLxzOd0twIJ7I99zg== +"@babel/plugin-transform-classes@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz#7152457f7880b593a63ade8a861e6e26a4469f52" + integrity sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg== dependencies: - "@babel/helper-annotate-as-pure" "^7.25.7" - "@babel/helper-compilation-targets" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-replace-supers" "^7.25.7" - "@babel/traverse" "^7.25.7" + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" + "@babel/traverse" "^7.25.9" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.7.tgz#7f621f0aa1354b5348a935ab12e3903842466f65" - integrity sha512-QIv+imtM+EtNxg/XBKL3hiWjgdLjMOmZ+XzQwSgmBfKbfxUjBzGgVPklUuE55eq5/uVoh8gg3dqlrwR/jw3ZeA== +"@babel/plugin-transform-computed-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz#db36492c78460e534b8852b1d5befe3c923ef10b" + integrity sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/template" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/template" "^7.25.9" -"@babel/plugin-transform-destructuring@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.7.tgz#f6f26a9feefb5aa41fd45b6f5838901b5333d560" - integrity sha512-xKcfLTlJYUczdaM1+epcdh1UGewJqr9zATgrNHcLBcV2QmfvPPEixo/sK/syql9cEmbr7ulu5HMFG5vbbt/sEA== +"@babel/plugin-transform-destructuring@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz#966ea2595c498224340883602d3cfd7a0c79cea1" + integrity sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-dotall-regex@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.7.tgz#9d775c4a3ff1aea64045300fcd4309b4a610ef02" - integrity sha512-kXzXMMRzAtJdDEgQBLF4oaiT6ZCU3oWHgpARnTKDAqPkDJ+bs3NrZb310YYevR5QlRo3Kn7dzzIdHbZm1VzJdQ== +"@babel/plugin-transform-dotall-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz#bad7945dd07734ca52fe3ad4e872b40ed09bb09a" + integrity sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-duplicate-keys@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.7.tgz#fbba7d1155eab76bd4f2a038cbd5d65883bd7a93" - integrity sha512-by+v2CjoL3aMnWDOyCIg+yxU9KXSRa9tN6MbqggH5xvymmr9p4AMjYkNlQy4brMceBnUyHZ9G8RnpvT8wP7Cfg== +"@babel/plugin-transform-duplicate-keys@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz#8850ddf57dce2aebb4394bb434a7598031059e6d" + integrity sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.7.tgz#102b31608dcc22c08fbca1894e104686029dc141" - integrity sha512-HvS6JF66xSS5rNKXLqkk7L9c/jZ/cdIVIcoPVrnl8IsVpLggTjXs8OWekbLHs/VtYDDh5WXnQyeE3PPUGm22MA== +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz#6f7259b4de127721a08f1e5165b852fcaa696d31" + integrity sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-dynamic-import@^7.25.8": - version "7.25.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.8.tgz#f1edbe75b248cf44c70c8ca8ed3818a668753aaa" - integrity sha512-gznWY+mr4ZQL/EWPcbBQUP3BXS5FwZp8RUOw06BaRn8tQLzN4XLIxXejpHN9Qo8x8jjBmAAKp6FoS51AgkSA/A== +"@babel/plugin-transform-dynamic-import@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz#23e917de63ed23c6600c5dd06d94669dce79f7b8" + integrity sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-exponentiation-operator@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.7.tgz#5961a3a23a398faccd6cddb34a2182807d75fb5f" - integrity sha512-yjqtpstPfZ0h/y40fAXRv2snciYr0OAoMXY/0ClC7tm4C/nG5NJKmIItlaYlLbIVAWNfrYuy9dq1bE0SbX0PEg== +"@babel/plugin-transform-exponentiation-operator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz#ece47b70d236c1d99c263a1e22b62dc20a4c8b0f" + integrity sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-export-namespace-from@^7.25.8": - version "7.25.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.8.tgz#d1988c3019a380b417e0516418b02804d3858145" - integrity sha512-sPtYrduWINTQTW7FtOy99VCTWp4H23UX7vYcut7S4CIMEXU+54zKX9uCoGkLsWXteyaMXzVHgzWbLfQ1w4GZgw== +"@babel/plugin-transform-export-namespace-from@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz#90745fe55053394f554e40584cda81f2c8a402a2" + integrity sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-flow-strip-types@^7.16.0", "@babel/plugin-transform-flow-strip-types@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.7.tgz#32be871a80e10bbe6d8b1c8a7eeedbbc896d5e80" - integrity sha512-q8Td2PPc6/6I73g96SreSUCKEcwMXCwcXSIAVTyTTN6CpJe0dMj8coxu1fg1T9vfBLi6Rsi6a4ECcFBbKabS5w== +"@babel/plugin-transform-flow-strip-types@^7.16.0", "@babel/plugin-transform-flow-strip-types@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.9.tgz#85879b42a8f5948fd6317069978e98f23ef8aec1" + integrity sha512-/VVukELzPDdci7UUsWQaSkhgnjIWXnIyRpM02ldxaVoFK96c41So8JcKT3m0gYjyv7j5FNPGS5vfELrWalkbDA== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/plugin-syntax-flow" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-flow" "^7.25.9" -"@babel/plugin-transform-for-of@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.7.tgz#0acfea0f27aa290818b5b48a5a44b3f03fc13669" - integrity sha512-n/TaiBGJxYFWvpJDfsxSj9lEEE44BFM1EPGz4KEiTipTgkoFVVcCmzAL3qA7fdQU96dpo4gGf5HBx/KnDvqiHw== +"@babel/plugin-transform-for-of@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz#4bdc7d42a213397905d89f02350c5267866d5755" + integrity sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" -"@babel/plugin-transform-function-name@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.7.tgz#7e394ccea3693902a8b50ded8b6ae1fa7b8519fd" - integrity sha512-5MCTNcjCMxQ63Tdu9rxyN6cAWurqfrDZ76qvVPrGYdBxIj+EawuuxTu/+dgJlhK5eRz3v1gLwp6XwS8XaX2NiQ== +"@babel/plugin-transform-function-name@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz#939d956e68a606661005bfd550c4fc2ef95f7b97" + integrity sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA== dependencies: - "@babel/helper-compilation-targets" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/traverse" "^7.25.7" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/plugin-transform-json-strings@^7.25.8": - version "7.25.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.8.tgz#6fb3ec383a2ea92652289fdba653e3f9de722694" - integrity sha512-4OMNv7eHTmJ2YXs3tvxAfa/I43di+VcF+M4Wt66c88EAED1RoGaf1D64cL5FkRpNL+Vx9Hds84lksWvd/wMIdA== +"@babel/plugin-transform-json-strings@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz#c86db407cb827cded902a90c707d2781aaa89660" + integrity sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-literals@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.7.tgz#70cbdc742f2cfdb1a63ea2cbd018d12a60b213c3" - integrity sha512-fwzkLrSu2fESR/cm4t6vqd7ebNIopz2QHGtjoU+dswQo/P6lwAG04Q98lliE3jkz/XqnbGFLnUcE0q0CVUf92w== +"@babel/plugin-transform-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz#1a1c6b4d4aa59bc4cad5b6b3a223a0abd685c9de" + integrity sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-logical-assignment-operators@^7.25.8": - version "7.25.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.8.tgz#01868ff92daa9e525b4c7902aa51979082a05710" - integrity sha512-f5W0AhSbbI+yY6VakT04jmxdxz+WsID0neG7+kQZbCOjuyJNdL5Nn4WIBm4hRpKnUcO9lP0eipUhFN12JpoH8g== +"@babel/plugin-transform-logical-assignment-operators@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz#b19441a8c39a2fda0902900b306ea05ae1055db7" + integrity sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-member-expression-literals@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.7.tgz#0a36c3fbd450cc9e6485c507f005fa3d1bc8fca5" - integrity sha512-Std3kXwpXfRV0QtQy5JJcRpkqP8/wG4XL7hSKZmGlxPlDqmpXtEPRmhF7ztnlTCtUN3eXRUJp+sBEZjaIBVYaw== +"@babel/plugin-transform-member-expression-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz#63dff19763ea64a31f5e6c20957e6a25e41ed5de" + integrity sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-amd@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.7.tgz#bb4e543b5611f6c8c685a2fd485408713a3adf3d" - integrity sha512-CgselSGCGzjQvKzghCvDTxKHP3iooenLpJDO842ehn5D2G5fJB222ptnDwQho0WjEvg7zyoxb9P+wiYxiJX5yA== +"@babel/plugin-transform-modules-amd@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz#49ba478f2295101544abd794486cd3088dddb6c5" + integrity sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw== dependencies: - "@babel/helper-module-transforms" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-commonjs@^7.23.0", "@babel/plugin-transform-modules-commonjs@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz#173f0c791bb7407c092ce6d77ee90eb3f2d1d2fd" - integrity sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg== +"@babel/plugin-transform-modules-commonjs@^7.23.0", "@babel/plugin-transform-modules-commonjs@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz#d165c8c569a080baf5467bda88df6425fc060686" + integrity sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg== dependencies: - "@babel/helper-module-transforms" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-simple-access" "^7.25.7" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-simple-access" "^7.25.9" -"@babel/plugin-transform-modules-systemjs@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.7.tgz#8b14d319a177cc9c85ef8b0512afd429d9e2e60b" - integrity sha512-t9jZIvBmOXJsiuyOwhrIGs8dVcD6jDyg2icw1VL4A/g+FnWyJKwUfSSU2nwJuMV2Zqui856El9u+ElB+j9fV1g== +"@babel/plugin-transform-modules-systemjs@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz#8bd1b43836269e3d33307151a114bcf3ba6793f8" + integrity sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA== dependencies: - "@babel/helper-module-transforms" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-validator-identifier" "^7.25.7" - "@babel/traverse" "^7.25.7" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/plugin-transform-modules-umd@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.7.tgz#00ee7a7e124289549381bfb0e24d87fd7f848367" - integrity sha512-p88Jg6QqsaPh+EB7I9GJrIqi1Zt4ZBHUQtjw3z1bzEXcLh6GfPqzZJ6G+G1HBGKUNukT58MnKG7EN7zXQBCODw== +"@babel/plugin-transform-modules-umd@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz#6710079cdd7c694db36529a1e8411e49fcbf14c9" + integrity sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw== dependencies: - "@babel/helper-module-transforms" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-named-capturing-groups-regex@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.7.tgz#a2f3f6d7f38693b462542951748f0a72a34d196d" - integrity sha512-BtAT9LzCISKG3Dsdw5uso4oV1+v2NlVXIIomKJgQybotJY3OwCwJmkongjHgwGKoZXd0qG5UZ12JUlDQ07W6Ow== +"@babel/plugin-transform-named-capturing-groups-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz#454990ae6cc22fd2a0fa60b3a2c6f63a38064e6a" + integrity sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-new-target@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.7.tgz#52b2bde523b76c548749f38dc3054f1f45e82bc9" - integrity sha512-CfCS2jDsbcZaVYxRFo2qtavW8SpdzmBXC2LOI4oO0rP+JSRDxxF3inF4GcPsLgfb5FjkhXG5/yR/lxuRs2pySA== +"@babel/plugin-transform-new-target@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz#42e61711294b105c248336dcb04b77054ea8becd" + integrity sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-nullish-coalescing-operator@^7.22.11", "@babel/plugin-transform-nullish-coalescing-operator@^7.25.8": - version "7.25.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.8.tgz#befb4900c130bd52fccf2b926314557987f1b552" - integrity sha512-Z7WJJWdQc8yCWgAmjI3hyC+5PXIubH9yRKzkl9ZEG647O9szl9zvmKLzpbItlijBnVhTUf1cpyWBsZ3+2wjWPQ== +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.11", "@babel/plugin-transform-nullish-coalescing-operator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz#bcb1b0d9e948168102d5f7104375ca21c3266949" + integrity sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-numeric-separator@^7.25.8": - version "7.25.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.8.tgz#91e370486371637bd42161052f2602c701386891" - integrity sha512-rm9a5iEFPS4iMIy+/A/PiS0QN0UyjPIeVvbU5EMZFKJZHt8vQnasbpo3T3EFcxzCeYO0BHfc4RqooCZc51J86Q== +"@babel/plugin-transform-numeric-separator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz#bfed75866261a8b643468b0ccfd275f2033214a1" + integrity sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-object-rest-spread@^7.25.8": - version "7.25.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.8.tgz#0904ac16bcce41df4db12d915d6780f85c7fb04b" - integrity sha512-LkUu0O2hnUKHKE7/zYOIjByMa4VRaV2CD/cdGz0AxU9we+VA3kDDggKEzI0Oz1IroG+6gUP6UmWEHBMWZU316g== +"@babel/plugin-transform-object-rest-spread@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz#0203725025074164808bcf1a2cfa90c652c99f18" + integrity sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg== dependencies: - "@babel/helper-compilation-targets" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/plugin-transform-parameters" "^7.25.7" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-parameters" "^7.25.9" -"@babel/plugin-transform-object-super@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.7.tgz#582a9cea8cf0a1e02732be5b5a703a38dedf5661" - integrity sha512-pWT6UXCEW3u1t2tcAGtE15ornCBvopHj9Bps9D2DsH15APgNVOTwwczGckX+WkAvBmuoYKRCFa4DK+jM8vh5AA== +"@babel/plugin-transform-object-super@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz#385d5de135162933beb4a3d227a2b7e52bb4cf03" + integrity sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-replace-supers" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" -"@babel/plugin-transform-optional-catch-binding@^7.25.8": - version "7.25.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.8.tgz#2649b86a3bb202c6894ec81a6ddf41b94d8f3103" - integrity sha512-EbQYweoMAHOn7iJ9GgZo14ghhb9tTjgOc88xFgYngifx7Z9u580cENCV159M4xDh3q/irbhSjZVpuhpC2gKBbg== +"@babel/plugin-transform-optional-catch-binding@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz#10e70d96d52bb1f10c5caaac59ac545ea2ba7ff3" + integrity sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-optional-chaining@^7.23.0", "@babel/plugin-transform-optional-chaining@^7.25.7", "@babel/plugin-transform-optional-chaining@^7.25.8": - version "7.25.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.8.tgz#f46283b78adcc5b6ab988a952f989e7dce70653f" - integrity sha512-q05Bk7gXOxpTHoQ8RSzGSh/LHVB9JEIkKnk3myAWwZHnYiTGYtbdrYkIsS8Xyh4ltKf7GNUSgzs/6P2bJtBAQg== +"@babel/plugin-transform-optional-chaining@^7.23.0", "@babel/plugin-transform-optional-chaining@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz#e142eb899d26ef715435f201ab6e139541eee7dd" + integrity sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" -"@babel/plugin-transform-parameters@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.7.tgz#80c38b03ef580f6d6bffe1c5254bb35986859ac7" - integrity sha512-FYiTvku63me9+1Nz7TOx4YMtW3tWXzfANZtrzHhUZrz4d47EEtMQhzFoZWESfXuAMMT5mwzD4+y1N8ONAX6lMQ== +"@babel/plugin-transform-parameters@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz#b856842205b3e77e18b7a7a1b94958069c7ba257" + integrity sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-private-methods@^7.22.5", "@babel/plugin-transform-private-methods@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.7.tgz#c790a04f837b4bd61d6b0317b43aa11ff67dce80" - integrity sha512-KY0hh2FluNxMLwOCHbxVOKfdB5sjWG4M183885FmaqWWiGMhRZq4DQRKH6mHdEucbJnyDyYiZNwNG424RymJjA== +"@babel/plugin-transform-private-methods@^7.22.5", "@babel/plugin-transform-private-methods@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz#847f4139263577526455d7d3223cd8bda51e3b57" + integrity sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-private-property-in-object@^7.25.8": - version "7.25.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.8.tgz#1234f856ce85e061f9688764194e51ea7577c434" - integrity sha512-8Uh966svuB4V8RHHg0QJOB32QK287NBksJOByoKmHMp1TAobNniNalIkI2i5IPj5+S9NYCG4VIjbEuiSN8r+ow== +"@babel/plugin-transform-private-property-in-object@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz#9c8b73e64e6cc3cbb2743633885a7dd2c385fe33" + integrity sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw== dependencies: - "@babel/helper-annotate-as-pure" "^7.25.7" - "@babel/helper-create-class-features-plugin" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-property-literals@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.7.tgz#a8612b4ea4e10430f00012ecf0155662c7d6550d" - integrity sha512-lQEeetGKfFi0wHbt8ClQrUSUMfEeI3MMm74Z73T9/kuz990yYVtfofjf3NuA42Jy3auFOpbjDyCSiIkTs1VIYw== +"@babel/plugin-transform-property-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz#d72d588bd88b0dec8b62e36f6fda91cedfe28e3f" + integrity sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-react-constant-elements@^7.12.1": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.25.7.tgz#b7f18dcdfac137a635a3f1242ea7c931df82a666" - integrity sha512-/qXt69Em8HgsjCLu7G3zdIQn7A2QwmYND7Wa0LTp09Na+Zn8L5d0A7wSXrKi18TJRc/Q5S1i1De/SU1LzVkSvA== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.25.9.tgz#08a1de35a301929b60fdf2788a54b46cd8ecd0ef" + integrity sha512-Ncw2JFsJVuvfRsa2lSHiC55kETQVLSnsYGQ1JDDwkUeWGTL/8Tom8aLTnlqgoeuopWrbbGndrc9AlLYrIosrow== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.7.tgz#2753e875a1b702fb1d806c4f5d4c194d64cadd88" - integrity sha512-r0QY7NVU8OnrwE+w2IWiRom0wwsTbjx4+xH2RTd7AVdof3uurXOF+/mXHQDRk+2jIvWgSaCHKMgggfvM4dyUGA== +"@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz#4b79746b59efa1f38c8695065a92a9f5afb24f7d" + integrity sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-react-jsx-development@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.7.tgz#2fbd77887b8fa2942d7cb61edf1029ea1b048554" - integrity sha512-5yd3lH1PWxzW6IZj+p+Y4OLQzz0/LzlOG8vGqonHfVR3euf1vyzyMUJk9Ac+m97BH46mFc/98t9PmYLyvgL3qg== +"@babel/plugin-transform-react-jsx-development@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz#8fd220a77dd139c07e25225a903b8be8c829e0d7" + integrity sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw== dependencies: - "@babel/plugin-transform-react-jsx" "^7.25.7" + "@babel/plugin-transform-react-jsx" "^7.25.9" -"@babel/plugin-transform-react-jsx@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.7.tgz#f5e2af6020a562fe048dd343e571c4428e6c5632" - integrity sha512-vILAg5nwGlR9EXE8JIOX4NHXd49lrYbN8hnjffDtoULwpL9hUx/N55nqh2qd0q6FyNDfjl9V79ecKGvFbcSA0Q== +"@babel/plugin-transform-react-jsx@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz#06367940d8325b36edff5e2b9cbe782947ca4166" + integrity sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw== dependencies: - "@babel/helper-annotate-as-pure" "^7.25.7" - "@babel/helper-module-imports" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/plugin-syntax-jsx" "^7.25.7" - "@babel/types" "^7.25.7" + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-jsx" "^7.25.9" + "@babel/types" "^7.25.9" -"@babel/plugin-transform-react-pure-annotations@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.7.tgz#6d0b8dadb2d3c5cbb8ade68c5efd49470b0d65f7" - integrity sha512-6YTHJ7yjjgYqGc8S+CbEXhLICODk0Tn92j+vNJo07HFk9t3bjFgAKxPLFhHwF2NjmQVSI1zBRfBWUeVBa2osfA== +"@babel/plugin-transform-react-pure-annotations@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz#ea1c11b2f9dbb8e2d97025f43a3b5bc47e18ae62" + integrity sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg== dependencies: - "@babel/helper-annotate-as-pure" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-regenerator@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.7.tgz#6eb006e6d26f627bc2f7844a9f19770721ad6f3e" - integrity sha512-mgDoQCRjrY3XK95UuV60tZlFCQGXEtMg8H+IsW72ldw1ih1jZhzYXbJvghmAEpg5UVhhnCeia1CkGttUvCkiMQ== +"@babel/plugin-transform-regenerator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz#03a8a4670d6cebae95305ac6defac81ece77740b" + integrity sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" regenerator-transform "^0.15.2" -"@babel/plugin-transform-reserved-words@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.7.tgz#dc56b25e02afaabef3ce0c5b06b0916e8523e995" - integrity sha512-3OfyfRRqiGeOvIWSagcwUTVk2hXBsr/ww7bLn6TRTuXnexA+Udov2icFOxFX9abaj4l96ooYkcNN1qi2Zvqwng== +"@babel/plugin-transform-reserved-words@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz#0398aed2f1f10ba3f78a93db219b27ef417fb9ce" + integrity sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-runtime@^7.16.4": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.7.tgz#435a4fab67273f00047dc806e05069c9c6344e12" - integrity sha512-Y9p487tyTzB0yDYQOtWnC+9HGOuogtP3/wNpun1xJXEEvI6vip59BSBTsHnekZLqxmPcgsrAKt46HAAb//xGhg== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz#62723ea3f5b31ffbe676da9d6dae17138ae580ea" + integrity sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ== dependencies: - "@babel/helper-module-imports" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" babel-plugin-polyfill-corejs2 "^0.4.10" babel-plugin-polyfill-corejs3 "^0.10.6" babel-plugin-polyfill-regenerator "^0.6.1" semver "^6.3.1" -"@babel/plugin-transform-shorthand-properties@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.7.tgz#92690a9c671915602d91533c278cc8f6bf12275f" - integrity sha512-uBbxNwimHi5Bv3hUccmOFlUy3ATO6WagTApenHz9KzoIdn0XeACdB12ZJ4cjhuB2WSi80Ez2FWzJnarccriJeA== +"@babel/plugin-transform-shorthand-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz#bb785e6091f99f826a95f9894fc16fde61c163f2" + integrity sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-spread@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.7.tgz#df83e899a9fc66284ee601a7b738568435b92998" - integrity sha512-Mm6aeymI0PBh44xNIv/qvo8nmbkpZze1KvR8MkEqbIREDxoiWTi18Zr2jryfRMwDfVZF9foKh060fWgni44luw== +"@babel/plugin-transform-spread@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz#24a35153931b4ba3d13cec4a7748c21ab5514ef9" + integrity sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" -"@babel/plugin-transform-sticky-regex@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.7.tgz#341c7002bef7f29037be7fb9684e374442dd0d17" - integrity sha512-ZFAeNkpGuLnAQ/NCsXJ6xik7Id+tHuS+NT+ue/2+rn/31zcdnupCdmunOizEaP0JsUmTFSTOPoQY7PkK2pttXw== +"@babel/plugin-transform-sticky-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz#c7f02b944e986a417817b20ba2c504dfc1453d32" + integrity sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-template-literals@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.7.tgz#e566c581bb16d8541dd8701093bb3457adfce16b" - integrity sha512-SI274k0nUsFFmyQupiO7+wKATAmMFf8iFgq2O+vVFXZ0SV9lNfT1NGzBEhjquFmD8I9sqHLguH+gZVN3vww2AA== +"@babel/plugin-transform-template-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz#6dbd4a24e8fad024df76d1fac6a03cf413f60fe1" + integrity sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-typeof-symbol@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.7.tgz#debb1287182efd20488f126be343328c679b66eb" - integrity sha512-OmWmQtTHnO8RSUbL0NTdtpbZHeNTnm68Gj5pA4Y2blFNh+V4iZR68V1qL9cI37J21ZN7AaCnkfdHtLExQPf2uA== +"@babel/plugin-transform-typeof-symbol@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz#224ba48a92869ddbf81f9b4a5f1204bbf5a2bc4b" + integrity sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-typescript@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.7.tgz#8fc7c3d28ddd36bce45b9b48594129d0e560cfbe" - integrity sha512-VKlgy2vBzj8AmEzunocMun2fF06bsSWV+FvVXohtL6FGve/+L217qhHxRTVGHEDO/YR8IANcjzgJsd04J8ge5Q== +"@babel/plugin-transform-typescript@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz#69267905c2b33c2ac6d8fe765e9dc2ddc9df3849" + integrity sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.25.7" - "@babel/helper-create-class-features-plugin" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" - "@babel/plugin-syntax-typescript" "^7.25.7" + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/plugin-syntax-typescript" "^7.25.9" -"@babel/plugin-transform-unicode-escapes@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.7.tgz#973592b6d13a914794e1de8cf1383e50e0f87f81" - integrity sha512-BN87D7KpbdiABA+t3HbVqHzKWUDN3dymLaTnPFAMyc8lV+KN3+YzNhVRNdinaCPA4AUqx7ubXbQ9shRjYBl3SQ== +"@babel/plugin-transform-unicode-escapes@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz#a75ef3947ce15363fccaa38e2dd9bc70b2788b82" + integrity sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-unicode-property-regex@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.7.tgz#25349197cce964b1343f74fa7cfdf791a1b1919e" - integrity sha512-IWfR89zcEPQGB/iB408uGtSPlQd3Jpq11Im86vUgcmSTcoWAiQMCTOa2K2yNNqFJEBVICKhayctee65Ka8OB0w== +"@babel/plugin-transform-unicode-property-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz#a901e96f2c1d071b0d1bb5dc0d3c880ce8f53dd3" + integrity sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-unicode-regex@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.7.tgz#f93a93441baf61f713b6d5552aaa856bfab34809" - integrity sha512-8JKfg/hiuA3qXnlLx8qtv5HWRbgyFx2hMMtpDDuU2rTckpKkGu4ycK5yYHwuEa16/quXfoxHBIApEsNyMWnt0g== +"@babel/plugin-transform-unicode-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz#5eae747fe39eacf13a8bd006a4fb0b5d1fa5e9b1" + integrity sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-unicode-sets-regex@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.7.tgz#d1b3295d29e0f8f4df76abc909ad1ebee919560c" - integrity sha512-YRW8o9vzImwmh4Q3Rffd09bH5/hvY0pxg+1H1i0f7APoUeg12G7+HhLj9ZFNIrYkgBXhIijPJ+IXypN0hLTIbw== +"@babel/plugin-transform-unicode-sets-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz#65114c17b4ffc20fa5b163c63c70c0d25621fabe" + integrity sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4", "@babel/preset-env@^7.23.2", "@babel/preset-env@^7.23.9": - version "7.25.8" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.25.8.tgz#dc6b719627fb29cd9cccbbbe041802fd575b524c" - integrity sha512-58T2yulDHMN8YMUxiLq5YmWUnlDCyY1FsHM+v12VMx+1/FlrUj5tY50iDCpofFQEM8fMYOaY9YRvym2jcjn1Dg== - dependencies: - "@babel/compat-data" "^7.25.8" - "@babel/helper-compilation-targets" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-validator-option" "^7.25.7" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.7" - "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.7" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.7" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.25.7" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.7" + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.25.9.tgz#fc8a68705e02553cdeeeb5477bf241e12b9c3cd9" + integrity sha512-XqDEt+hfsQukahSX9JOBDHhpUHDhj2zGSxoqWQFCMajOSBnbhBdgON/bU/5PkBA1yX5tqW6tTzuIPVsZTQ7h5Q== + dependencies: + "@babel/compat-data" "^7.25.9" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.9" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.9" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.9" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.25.9" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.9" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-import-assertions" "^7.25.7" - "@babel/plugin-syntax-import-attributes" "^7.25.7" + "@babel/plugin-syntax-import-assertions" "^7.25.9" + "@babel/plugin-syntax-import-attributes" "^7.25.9" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.25.7" - "@babel/plugin-transform-async-generator-functions" "^7.25.8" - "@babel/plugin-transform-async-to-generator" "^7.25.7" - "@babel/plugin-transform-block-scoped-functions" "^7.25.7" - "@babel/plugin-transform-block-scoping" "^7.25.7" - "@babel/plugin-transform-class-properties" "^7.25.7" - "@babel/plugin-transform-class-static-block" "^7.25.8" - "@babel/plugin-transform-classes" "^7.25.7" - "@babel/plugin-transform-computed-properties" "^7.25.7" - "@babel/plugin-transform-destructuring" "^7.25.7" - "@babel/plugin-transform-dotall-regex" "^7.25.7" - "@babel/plugin-transform-duplicate-keys" "^7.25.7" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.7" - "@babel/plugin-transform-dynamic-import" "^7.25.8" - "@babel/plugin-transform-exponentiation-operator" "^7.25.7" - "@babel/plugin-transform-export-namespace-from" "^7.25.8" - "@babel/plugin-transform-for-of" "^7.25.7" - "@babel/plugin-transform-function-name" "^7.25.7" - "@babel/plugin-transform-json-strings" "^7.25.8" - "@babel/plugin-transform-literals" "^7.25.7" - "@babel/plugin-transform-logical-assignment-operators" "^7.25.8" - "@babel/plugin-transform-member-expression-literals" "^7.25.7" - "@babel/plugin-transform-modules-amd" "^7.25.7" - "@babel/plugin-transform-modules-commonjs" "^7.25.7" - "@babel/plugin-transform-modules-systemjs" "^7.25.7" - "@babel/plugin-transform-modules-umd" "^7.25.7" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.25.7" - "@babel/plugin-transform-new-target" "^7.25.7" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.25.8" - "@babel/plugin-transform-numeric-separator" "^7.25.8" - "@babel/plugin-transform-object-rest-spread" "^7.25.8" - "@babel/plugin-transform-object-super" "^7.25.7" - "@babel/plugin-transform-optional-catch-binding" "^7.25.8" - "@babel/plugin-transform-optional-chaining" "^7.25.8" - "@babel/plugin-transform-parameters" "^7.25.7" - "@babel/plugin-transform-private-methods" "^7.25.7" - "@babel/plugin-transform-private-property-in-object" "^7.25.8" - "@babel/plugin-transform-property-literals" "^7.25.7" - "@babel/plugin-transform-regenerator" "^7.25.7" - "@babel/plugin-transform-reserved-words" "^7.25.7" - "@babel/plugin-transform-shorthand-properties" "^7.25.7" - "@babel/plugin-transform-spread" "^7.25.7" - "@babel/plugin-transform-sticky-regex" "^7.25.7" - "@babel/plugin-transform-template-literals" "^7.25.7" - "@babel/plugin-transform-typeof-symbol" "^7.25.7" - "@babel/plugin-transform-unicode-escapes" "^7.25.7" - "@babel/plugin-transform-unicode-property-regex" "^7.25.7" - "@babel/plugin-transform-unicode-regex" "^7.25.7" - "@babel/plugin-transform-unicode-sets-regex" "^7.25.7" + "@babel/plugin-transform-arrow-functions" "^7.25.9" + "@babel/plugin-transform-async-generator-functions" "^7.25.9" + "@babel/plugin-transform-async-to-generator" "^7.25.9" + "@babel/plugin-transform-block-scoped-functions" "^7.25.9" + "@babel/plugin-transform-block-scoping" "^7.25.9" + "@babel/plugin-transform-class-properties" "^7.25.9" + "@babel/plugin-transform-class-static-block" "^7.25.9" + "@babel/plugin-transform-classes" "^7.25.9" + "@babel/plugin-transform-computed-properties" "^7.25.9" + "@babel/plugin-transform-destructuring" "^7.25.9" + "@babel/plugin-transform-dotall-regex" "^7.25.9" + "@babel/plugin-transform-duplicate-keys" "^7.25.9" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.9" + "@babel/plugin-transform-dynamic-import" "^7.25.9" + "@babel/plugin-transform-exponentiation-operator" "^7.25.9" + "@babel/plugin-transform-export-namespace-from" "^7.25.9" + "@babel/plugin-transform-for-of" "^7.25.9" + "@babel/plugin-transform-function-name" "^7.25.9" + "@babel/plugin-transform-json-strings" "^7.25.9" + "@babel/plugin-transform-literals" "^7.25.9" + "@babel/plugin-transform-logical-assignment-operators" "^7.25.9" + "@babel/plugin-transform-member-expression-literals" "^7.25.9" + "@babel/plugin-transform-modules-amd" "^7.25.9" + "@babel/plugin-transform-modules-commonjs" "^7.25.9" + "@babel/plugin-transform-modules-systemjs" "^7.25.9" + "@babel/plugin-transform-modules-umd" "^7.25.9" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.25.9" + "@babel/plugin-transform-new-target" "^7.25.9" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.25.9" + "@babel/plugin-transform-numeric-separator" "^7.25.9" + "@babel/plugin-transform-object-rest-spread" "^7.25.9" + "@babel/plugin-transform-object-super" "^7.25.9" + "@babel/plugin-transform-optional-catch-binding" "^7.25.9" + "@babel/plugin-transform-optional-chaining" "^7.25.9" + "@babel/plugin-transform-parameters" "^7.25.9" + "@babel/plugin-transform-private-methods" "^7.25.9" + "@babel/plugin-transform-private-property-in-object" "^7.25.9" + "@babel/plugin-transform-property-literals" "^7.25.9" + "@babel/plugin-transform-regenerator" "^7.25.9" + "@babel/plugin-transform-reserved-words" "^7.25.9" + "@babel/plugin-transform-shorthand-properties" "^7.25.9" + "@babel/plugin-transform-spread" "^7.25.9" + "@babel/plugin-transform-sticky-regex" "^7.25.9" + "@babel/plugin-transform-template-literals" "^7.25.9" + "@babel/plugin-transform-typeof-symbol" "^7.25.9" + "@babel/plugin-transform-unicode-escapes" "^7.25.9" + "@babel/plugin-transform-unicode-property-regex" "^7.25.9" + "@babel/plugin-transform-unicode-regex" "^7.25.9" + "@babel/plugin-transform-unicode-sets-regex" "^7.25.9" "@babel/preset-modules" "0.1.6-no-external-plugins" babel-plugin-polyfill-corejs2 "^0.4.10" babel-plugin-polyfill-corejs3 "^0.10.6" @@ -1038,13 +1038,13 @@ semver "^6.3.1" "@babel/preset-flow@^7.22.15": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.25.7.tgz#a9460677c182c2e105c32567a036d360c86668a9" - integrity sha512-q2x3g0YHzo/Ohsr51KOYS/BtZMsvkzVd8qEyhZAyTatYdobfgXCuyppTqTuIhdq5kR/P3nyyVvZ6H5dMc4PnCQ== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.25.9.tgz#ef8b5e7e3f24a42b3711e77fb14919b87dffed0a" + integrity sha512-EASHsAhE+SSlEzJ4bzfusnXSHiU+JfAYzj+jbw2vgQKgq5HrUr8qs+vgtiEL5dOH6sEweI+PNt2D7AqrDSHyqQ== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-validator-option" "^7.25.7" - "@babel/plugin-transform-flow-strip-types" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-transform-flow-strip-types" "^7.25.9" "@babel/preset-modules@0.1.6-no-external-plugins": version "0.1.6-no-external-plugins" @@ -1056,32 +1056,32 @@ esutils "^2.0.2" "@babel/preset-react@^7.12.5", "@babel/preset-react@^7.16.0", "@babel/preset-react@^7.22.15", "@babel/preset-react@^7.7.0": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.25.7.tgz#081cbe1dea363b732764d06a0fdda67ffa17735d" - integrity sha512-GjV0/mUEEXpi1U5ZgDprMRRgajGMRW3G5FjMr5KLKD8nT2fTG8+h/klV3+6Dm5739QE+K5+2e91qFKAYI3pmRg== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.25.9.tgz#5f473035dc2094bcfdbc7392d0766bd42dce173e" + integrity sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-validator-option" "^7.25.7" - "@babel/plugin-transform-react-display-name" "^7.25.7" - "@babel/plugin-transform-react-jsx" "^7.25.7" - "@babel/plugin-transform-react-jsx-development" "^7.25.7" - "@babel/plugin-transform-react-pure-annotations" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-transform-react-display-name" "^7.25.9" + "@babel/plugin-transform-react-jsx" "^7.25.9" + "@babel/plugin-transform-react-jsx-development" "^7.25.9" + "@babel/plugin-transform-react-pure-annotations" "^7.25.9" "@babel/preset-typescript@^7.16.0", "@babel/preset-typescript@^7.22.5", "@babel/preset-typescript@^7.23.0", "@babel/preset-typescript@^7.23.3": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.25.7.tgz#43c5b68eccb856ae5b52274b77b1c3c413cde1b7" - integrity sha512-rkkpaXJZOFN45Fb+Gki0c+KMIglk4+zZXOoMJuyEK8y8Kkc8Jd3BDmP7qPsz0zQMJj+UD7EprF+AqAXcILnexw== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.25.9.tgz#bb82f26cda46dc2eb1ee10bf72fa994e759a08ba" + integrity sha512-XWxw1AcKk36kgxf4C//fl0ikjLeqGUWn062/Fd8GtpTfDJOX6Ud95FK+4JlDA36BX4bNGndXi3a6Vr4Jo5/61A== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-validator-option" "^7.25.7" - "@babel/plugin-syntax-jsx" "^7.25.7" - "@babel/plugin-transform-modules-commonjs" "^7.25.7" - "@babel/plugin-transform-typescript" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-syntax-jsx" "^7.25.9" + "@babel/plugin-transform-modules-commonjs" "^7.25.9" + "@babel/plugin-transform-typescript" "^7.25.9" "@babel/register@^7.22.15": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.25.7.tgz#75ec0d3a8f843d344c51bf2f18fcc03f3a4c9117" - integrity sha512-qHTd2Rhn/rKhSUwdY6+n98FmwXN+N+zxSVx3zWqRe9INyvTpv+aQ5gDV2+43ACd3VtMBzPPljbb0gZb8u5ma6Q== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.25.9.tgz#1c465acf7dc983d70ccc318eb5b887ecb04f021b" + integrity sha512-8D43jXtGsYmEeDvm4MWHYUpWf8iiXgWYx3fW7E7Wb7Oe6FWqJPl5K6TuFW0dOwNZzEE5rjlaSJYH9JjrUKJszA== dependencies: clone-deep "^4.0.1" find-cache-dir "^2.0.0" @@ -1090,42 +1090,41 @@ source-map-support "^0.5.16" "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.3", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.8", "@babel/runtime@^7.23.9", "@babel/runtime@^7.25.7", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.7.tgz#7ffb53c37a8f247c8c4d335e89cdf16a2e0d0fb6" - integrity sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.9.tgz#65884fd6dc255a775402cc1d9811082918f4bf00" + integrity sha512-4zpTHZ9Cm6L9L+uIqghQX8ZXg8HKFcjYO3qHoO8zTmRm6HQUJ8SSJ+KRvbMBZn0EGVlT4DRYeQ/6hjlyXBh+Kg== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.25.7", "@babel/template@^7.3.3", "@babel/template@^7.4.4": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.7.tgz#27f69ce382855d915b14ab0fe5fb4cbf88fa0769" - integrity sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA== - dependencies: - "@babel/code-frame" "^7.25.7" - "@babel/parser" "^7.25.7" - "@babel/types" "^7.25.7" - -"@babel/traverse@^7.18.9", "@babel/traverse@^7.23.2", "@babel/traverse@^7.25.7", "@babel/traverse@^7.7.2": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.7.tgz#83e367619be1cab8e4f2892ef30ba04c26a40fa8" - integrity sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg== - dependencies: - "@babel/code-frame" "^7.25.7" - "@babel/generator" "^7.25.7" - "@babel/parser" "^7.25.7" - "@babel/template" "^7.25.7" - "@babel/types" "^7.25.7" +"@babel/template@^7.25.9", "@babel/template@^7.3.3", "@babel/template@^7.4.4": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" + integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/traverse@^7.18.9", "@babel/traverse@^7.23.2", "@babel/traverse@^7.25.9", "@babel/traverse@^7.7.2": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" + integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/generator" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/template" "^7.25.9" + "@babel/types" "^7.25.9" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.18.9", "@babel/types@^7.20.7", "@babel/types@^7.23.0", "@babel/types@^7.25.7", "@babel/types@^7.25.8", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.25.8" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.8.tgz#5cf6037258e8a9bcad533f4979025140cb9993e1" - integrity sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg== +"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.18.9", "@babel/types@^7.20.7", "@babel/types@^7.23.0", "@babel/types@^7.25.9", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.9.tgz#620f35ea1f4233df529ec9a2668d2db26574deee" + integrity sha512-OwS2CM5KocvQ/k7dFJa8i5bNGJP0hXWfVCfDkqRFP1IreH1JDC7wG6eCYCi0+McbfT8OR/kNqsI0UU0xP9H6PQ== dependencies: - "@babel/helper-string-parser" "^7.25.7" - "@babel/helper-validator-identifier" "^7.25.7" - to-fast-properties "^2.0.0" + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" "@base2/pretty-print-object@1.0.1": version "1.0.1" @@ -2122,9 +2121,9 @@ "@jridgewell/sourcemap-codec" "^1.4.14" "@jsonforms/core@^3.2.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@jsonforms/core/-/core-3.4.0.tgz#00e280b6280c868fe00cb71a9bcd7daa86188b90" - integrity sha512-jeU98XLru6G2WVGmJqG19W2rmSLX4im/gOWbptTzQJYj8tS38cqDoYcIRuBmAQYASj2ogJDHQnDgIXARSL8vJA== + version "3.4.1" + resolved "https://registry.yarnpkg.com/@jsonforms/core/-/core-3.4.1.tgz#436d565164720e32a3df30792156e6152403d356" + integrity sha512-4p0fu2g4HfjHu8LFAL2d78O+9okyyVU4wvKHAEXnM39Rv9Opj5Ih6OF4/xXwld8169ri5aJSLISi+/Bsc6Xc4g== dependencies: "@types/json-schema" "^7.0.3" ajv "^8.6.1" @@ -2132,18 +2131,18 @@ lodash "^4.17.21" "@jsonforms/material-renderers@^3.2.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@jsonforms/material-renderers/-/material-renderers-3.4.0.tgz#2da82e082ea88735f4cb4ef9db592d0b1e660e95" - integrity sha512-0cacbfiYPng0xrSKenCIKBMm3gNKKOGHbhV7IzgmDhBwmpT6KGIARCaIClRjni6gOvbE00ynSM7/gXKr3nd1TQ== + version "3.4.1" + resolved "https://registry.yarnpkg.com/@jsonforms/material-renderers/-/material-renderers-3.4.1.tgz#ca046ce89d53dacdfc578778212b79c37f162ba1" + integrity sha512-gwYv+0IUx8+l6mO9rk6yP0uH3MS3KpW2xaVuARFB1htkEbm691D0eLghJsnv2H4xsm/dC7vgPjgwMzyT+J/QIw== dependencies: "@date-io/dayjs" "^3.0.0" dayjs "1.10.7" lodash "^4.17.21" "@jsonforms/react@^3.2.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@jsonforms/react/-/react-3.4.0.tgz#f15cb67314b927a597ce2afae14c35041b4b6846" - integrity sha512-uDL1fptUxkemXGLUFaCTPUA3iMvEMUs2g8pQ8da0kPNiH6D1n7oEq3+rsVKMJ1lQLVJZT2MxUJl71DdGJ5OOmA== + version "3.4.1" + resolved "https://registry.yarnpkg.com/@jsonforms/react/-/react-3.4.1.tgz#25e8c33fb6316bc8876c30f7bc2ab9442b2de1ea" + integrity sha512-n7hkc7/sRBSwTSu10lM1UhiXyuc/7DuWHTTentk/5evqahE0BF4cmNXusWf7LNuan0OQx3ULoofvO1eXu97rNg== dependencies: lodash "^4.17.21" @@ -2249,14 +2248,14 @@ prop-types "^15.8.1" "@mui/base@^5.0.0-beta.22": - version "5.0.0-beta.59" - resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-beta.59.tgz#c50a35fb03f4c6f2da31242bc200cbdb75e6149a" - integrity sha512-LQZ2907rPMut/2Lq6qSnyP+nqOHLO3buMv91m7SdLpqp/lXU5+8vUXcf5oOwTNis6hfSvYGSQJ493Q00OzxDmQ== + version "5.0.0-beta.60" + resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-beta.60.tgz#0b4642089106fa76553024d96ed44476c9f52969" + integrity sha512-w8twR3qCUI+uJHO5xDOuc1yB5l46KFbvNsTwIvEW9tQkKxVaiEFf2GAXHuvFJiHfZLqjzett6drZjghy8D1Z1A== dependencies: "@babel/runtime" "^7.25.7" "@floating-ui/react-dom" "^2.1.1" "@mui/types" "^7.2.18" - "@mui/utils" "^6.1.4" + "@mui/utils" "^6.1.5" "@popperjs/core" "^2.11.8" clsx "^2.1.1" prop-types "^15.8.1" @@ -2354,10 +2353,10 @@ prop-types "^15.8.1" react-is "^18.3.1" -"@mui/utils@^6.1.4": - version "6.1.4" - resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-6.1.4.tgz#44deebc8e576695836c9bda870d755c8f079e54d" - integrity sha512-v0wXkyh3/Hpw48ivlNvgs4ZT6M8BIEAMdLgvct59rQBggYFhoAVKyliKDzdj37CnIlYau3DYIn7x5bHlRYFBow== +"@mui/utils@^6.1.5": + version "6.1.5" + resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-6.1.5.tgz#a5c75ac48f9913340670ebeba2907568a6ee8c49" + integrity sha512-vp2WfNDY+IbKUIGg+eqX1Ry4t/BilMjzp6p9xO1rfqpYjH1mj8coQxxDfKxcQLzBQkmBJjymjoGOak5VUYwXug== dependencies: "@babel/runtime" "^7.25.7" "@mui/types" "^7.2.18" @@ -4272,74 +4271,74 @@ "@svgr/plugin-svgo" "^5.5.0" loader-utils "^2.0.0" -"@swc/core-darwin-arm64@1.7.36": - version "1.7.36" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.36.tgz#f50ecd4db72a8759c67c1eb93f942c6331e6cfe9" - integrity sha512-8vDczXzCgv3ceTPhEivlpGprN44YlrCK1nbfU9g2TrhV/Aiqi09W/eM5zLesdoM1Z3mJl492gc/8nlTkpDdusw== - -"@swc/core-darwin-x64@1.7.36": - version "1.7.36" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.7.36.tgz#14c7e5c0a9bee4ffcf05a5a62caa179ee01a68c2" - integrity sha512-Pa2Gao7+Wf5m3SsK4abKRtd48AtoUnJInvaC3d077swBfgZjbjUbQvcpdc2dOeQtWwo49rFqUZJonMsL0jnPgQ== - -"@swc/core-linux-arm-gnueabihf@1.7.36": - version "1.7.36" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.36.tgz#19d9a66606ae9fc09f3e087a1ef49d75ffd769e7" - integrity sha512-3YsMWd7V+WZEjbfBnLkkz/olcRBa8nyoK0iIOnNARJBMcYaJxjkJSMZpmSojCnIVwvjA1N83CPAbUL+W+fCnHg== - -"@swc/core-linux-arm64-gnu@1.7.36": - version "1.7.36" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.36.tgz#9834e507e75d1689913fc56d401d5921eb75be67" - integrity sha512-lqM3aBB7kJazJYOwHeA5OGNLqXoQPZ/76b3dV+XcjN1GhD0CcXz6mW5PRYVin6OSN1eKrKBKJjtDA1mqADDEvw== - -"@swc/core-linux-arm64-musl@1.7.36": - version "1.7.36" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.36.tgz#548abbec7581f06ab9f38bd6c289bd7fc9983452" - integrity sha512-bqei2YDzvUfG0pth5W2xJaj0eG4XWYk0d/NJ75vBX6bkIzK6dC8iuKQ41jOfUWonnrAs7rTDDJW0sTn/evvRdw== - -"@swc/core-linux-x64-gnu@1.7.36": - version "1.7.36" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.36.tgz#d2a4a8edcdb3b7646dade9783d6502d01ff9364c" - integrity sha512-03maXTUyaBjeCxlDltmdzHje1ryQt1C4OWmmNgSSRXjLb+GNnAenwOJMSrcvHP/aNClD2pwsFCnYKDGy+sYE6w== - -"@swc/core-linux-x64-musl@1.7.36": - version "1.7.36" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.36.tgz#ea4197cbcc23b1202cdbec82a05bee9b29aa341b" - integrity sha512-XXysqLkvjtQnXm1zHqLhy00UYPv/gk5OtwR732X+piNisnEbcJBqI8Qp9O7YvLWllRcoP8IMBGDWLGdGLSpViA== - -"@swc/core-win32-arm64-msvc@1.7.36": - version "1.7.36" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.36.tgz#1b100b809457d0ed5710956d7efb4fd0427dc2c8" - integrity sha512-k7+dmb13a/zPw+E4XYfPmLZFWJgcOcBRKIjYl9nQErtYsgsg3Ji6TBbsvJVETy23lNHyewZ17V5Vq6NzaG0hzg== - -"@swc/core-win32-ia32-msvc@1.7.36": - version "1.7.36" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.36.tgz#577e7f25a7a8496c16e9b14486cd849765bccba5" - integrity sha512-ridD3ay6YM2PEYHZXXFN+edYEv0FOynaqOBP+NSnGNHA35azItIjoIe+KNi4WltGtAjpKCHSpjGCNfna12wdYQ== - -"@swc/core-win32-x64-msvc@1.7.36": - version "1.7.36" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.36.tgz#f85ace043925a746ff40af2da1ff9ff9760525bb" - integrity sha512-j1z2Z1Ln9d0E3dHsPkC1K9XDh0ojhRPwV+GfRTu4D61PE+aYhYLvbJC6xPvL4/204QrStRS7eDu3m+BcDp3rgQ== +"@swc/core-darwin-arm64@1.7.39": + version "1.7.39" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.39.tgz#8954552632e8100e30625dba3b926fb861f37209" + integrity sha512-o2nbEL6scMBMCTvY9OnbyVXtepLuNbdblV9oNJEFia5v5eGj9WMrnRQiylH3Wp/G2NYkW7V1/ZVW+kfvIeYe9A== + +"@swc/core-darwin-x64@1.7.39": + version "1.7.39" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.7.39.tgz#bd4699cca0b104629422eabaea1bc09afcd1ccc2" + integrity sha512-qMlv3XPgtPi/Fe11VhiPDHSLiYYk2dFYl747oGsHZPq+6tIdDQjIhijXPcsUHIXYDyG7lNpODPL8cP/X1sc9MA== + +"@swc/core-linux-arm-gnueabihf@1.7.39": + version "1.7.39" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.39.tgz#921603cd294734d673b292efd6385d13ffb075ed" + integrity sha512-NP+JIkBs1ZKnpa3Lk2W1kBJMwHfNOxCUJXuTa2ckjFsuZ8OUu2gwdeLFkTHbR43dxGwH5UzSmuGocXeMowra/Q== + +"@swc/core-linux-arm64-gnu@1.7.39": + version "1.7.39" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.39.tgz#d751faf13b575bb0eb422a283a9e61c11e547dc8" + integrity sha512-cPc+/HehyHyHcvAsk3ML/9wYcpWVIWax3YBaA+ScecJpSE04l/oBHPfdqKUPslqZ+Gcw0OWnIBGJT/fBZW2ayw== + +"@swc/core-linux-arm64-musl@1.7.39": + version "1.7.39" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.39.tgz#ac9b346dd5891798956e6b573f5111126c00fe17" + integrity sha512-8RxgBC6ubFem66bk9XJ0vclu3exJ6eD7x7CwDhp5AD/tulZslTYXM7oNPjEtje3xxabXuj/bEUMNvHZhQRFdqA== + +"@swc/core-linux-x64-gnu@1.7.39": + version "1.7.39" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.39.tgz#1a0bb356bc83cc3c6c88e0a35281fd0c57aa27cc" + integrity sha512-3gtCPEJuXLQEolo9xsXtuPDocmXQx12vewEyFFSMSjOfakuPOBmOQMa0sVL8Wwius8C1eZVeD1fgk0omMqeC+Q== + +"@swc/core-linux-x64-musl@1.7.39": + version "1.7.39" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.39.tgz#800dc36a964e04bd04944934218506eff19cc158" + integrity sha512-mg39pW5x/eqqpZDdtjZJxrUvQNSvJF4O8wCl37fbuFUqOtXs4TxsjZ0aolt876HXxxhsQl7rS+N4KioEMSgTZw== + +"@swc/core-win32-arm64-msvc@1.7.39": + version "1.7.39" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.39.tgz#91dcd6a9996714a78005984f08e8cc8dcdf8a90f" + integrity sha512-NZwuS0mNJowH3e9bMttr7B1fB8bW5svW/yyySigv9qmV5VcQRNz1kMlCvrCLYRsa93JnARuiaBI6FazSeG8mpA== + +"@swc/core-win32-ia32-msvc@1.7.39": + version "1.7.39" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.39.tgz#464bd804d92d3e09cb72cc9764ea3a53e58e8405" + integrity sha512-qFmvv5UExbJPXhhvCVDBnjK5Duqxr048dlVB6ZCgGzbRxuarOlawCzzLK4N172230pzlAWGLgn9CWl3+N6zfHA== + +"@swc/core-win32-x64-msvc@1.7.39": + version "1.7.39" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.39.tgz#a30d68b49ffdd325d676d5d2d5ff8d5edc6ff761" + integrity sha512-o+5IMqgOtj9+BEOp16atTfBgCogVak9svhBpwsbcJQp67bQbxGYhAPPDW/hZ2rpSSF7UdzbY9wudoX9G4trcuQ== "@swc/core@^1.3.82": - version "1.7.36" - resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.7.36.tgz#369b67cfe7be039dac2ab2180b44da8f2f8c2af0" - integrity sha512-bu7ymMX+LCJOSSrKank25Jaq66ymLVA9fOUuy4ck3/6rbXdLw+pIJPnIDKQ9uNcxww8KDxOuJk9Ui9pqR+aGFw== + version "1.7.39" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.7.39.tgz#8f830dce7c31b2def931701ec1c0f8ed203024d0" + integrity sha512-jns6VFeOT49uoTKLWIEfiQqJAlyqldNAt80kAr8f7a5YjX0zgnG3RBiLMpksx4Ka4SlK4O6TJ/lumIM3Trp82g== dependencies: "@swc/counter" "^0.1.3" "@swc/types" "^0.1.13" optionalDependencies: - "@swc/core-darwin-arm64" "1.7.36" - "@swc/core-darwin-x64" "1.7.36" - "@swc/core-linux-arm-gnueabihf" "1.7.36" - "@swc/core-linux-arm64-gnu" "1.7.36" - "@swc/core-linux-arm64-musl" "1.7.36" - "@swc/core-linux-x64-gnu" "1.7.36" - "@swc/core-linux-x64-musl" "1.7.36" - "@swc/core-win32-arm64-msvc" "1.7.36" - "@swc/core-win32-ia32-msvc" "1.7.36" - "@swc/core-win32-x64-msvc" "1.7.36" + "@swc/core-darwin-arm64" "1.7.39" + "@swc/core-darwin-x64" "1.7.39" + "@swc/core-linux-arm-gnueabihf" "1.7.39" + "@swc/core-linux-arm64-gnu" "1.7.39" + "@swc/core-linux-arm64-musl" "1.7.39" + "@swc/core-linux-x64-gnu" "1.7.39" + "@swc/core-linux-x64-musl" "1.7.39" + "@swc/core-win32-arm64-msvc" "1.7.39" + "@swc/core-win32-ia32-msvc" "1.7.39" + "@swc/core-win32-x64-msvc" "1.7.39" "@swc/counter@^0.1.3": version "0.1.3" @@ -4756,9 +4755,9 @@ "@types/node" "*" "@types/lodash@^4.14.167": - version "4.17.10" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.10.tgz#64f3edf656af2fe59e7278b73d3e62404144a6e6" - integrity sha512-YpS0zzoduEhuOWjAotS6A5AVCva7X4lVlYLF0FYHAY9sdraBfnatttHItlWeZdGhuEkf+OzMNg2ZYAx8t+52uQ== + version "4.17.12" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.12.tgz#25d71312bf66512105d71e55d42e22c36bcfc689" + integrity sha512-sviUmCE8AYdaF/KIHLDJBQgeYzPBI0vf/17NaYehBJfYD1j6/L95Slh07NlyK2iNyBNaEkb3En2jRt+a8y3xZQ== "@types/mdx@^2.0.0": version "2.0.13" @@ -4806,9 +4805,9 @@ "@types/node" "*" "@types/node@*": - version "22.7.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.6.tgz#3ec3e2b071e136cd11093c19128405e1d1f92f33" - integrity sha512-/d7Rnj0/ExXDMcioS78/kf1lMzYk4BZV8MZGTBKzTGZ6/406ukkbYlIsZmMPhcR5KlkunDHQLrtAVmSq7r+mSw== + version "22.7.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.9.tgz#2bf2797b5e84702d8262ea2cf843c3c3c880d0e9" + integrity sha512-jrTfRC7FM6nChvU7X2KqcrgquofrWLFDeYC1hKfwNWomVvrn7JIksqf344WN2X/y8xrgqBd2dJATZV4GbatBfg== dependencies: undici-types "~6.19.2" @@ -4820,14 +4819,14 @@ undici-types "~5.26.4" "@types/node@^16.18.72": - version "16.18.114" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.114.tgz#794d93059fd94a85503484e111aa820b3ebb4d4b" - integrity sha512-7oAtnxrgkMNzyzT443UDWwzkmYew81F1ZSPm3/lsITJfW/WludaSOpegTvUG+UdapcbrtWOtY/E4LyTkhPGJ5Q== + version "16.18.115" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.115.tgz#0bb385c4b1a1a996d6bf9d79e5ae786ce03cae51" + integrity sha512-NF5ajYn+dq0tRfswdyp8Df75h7D9z+L8TCIwrXoh46ZLK6KZVXkRhf/luXaZytvm/keUo9vU4m1Bg39St91a5w== "@types/node@^18.0.0": - version "18.19.56" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.56.tgz#e46d3e6e5417d3b89e89ee6207d3c2cba7ad1ef2" - integrity sha512-4EMJlWwwGnVPflJAtM14p9eVSa6BOv5b92mCsh5zcM1UagNtEtrbbtaE6WE1tw2TabavatnwqXjlIpcAEuJJNg== + version "18.19.59" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.59.tgz#2de1b95b0b468089b616b2feb809755d70a74949" + integrity sha512-vizm2EqwV/7Zay+A6J3tGl9Lhr7CjZe2HmWS988sefiEmsyP9CeXEleho6i4hJk/8UtZAo0bWN4QPZZr83RxvQ== dependencies: undici-types "~5.26.4" @@ -4893,9 +4892,9 @@ "@types/react" "*" "@types/react@*", "@types/react@>=16", "@types/react@^18.2.15", "@types/react@^18.2.48": - version "18.3.11" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.11.tgz#9d530601ff843ee0d7030d4227ea4360236bd537" - integrity sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ== + version "18.3.12" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.12.tgz#99419f182ccd69151813b7ee24b792fe08774f60" + integrity sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw== dependencies: "@types/prop-types" "*" csstype "^3.0.2" @@ -5620,14 +5619,14 @@ aria-hidden@^1.1.1: dependencies: tslib "^2.0.0" -aria-query@5.1.3, aria-query@~5.1.3: +aria-query@5.1.3: version "5.1.3" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== dependencies: deep-equal "^2.0.5" -aria-query@^5.0.0: +aria-query@^5.0.0, aria-query@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz#93f81a43480e33a338f19163a3d10a50c01dcd59" integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== @@ -5860,9 +5859,9 @@ available-typed-arrays@^1.0.7: possible-typed-array-names "^1.0.0" axe-core@^4.10.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.10.1.tgz#7d2589b0183f05b0f23e55c2f4cdf97b5bdc66d9" - integrity sha512-qPC9o+kD8Tir0lzNGLeghbOrWMr3ZJpaRlCIb6Uobt/7N4FiEDvqUMnxzCHRHmg8vOg14kr5gVNyScRmbMaJ9g== + version "4.10.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.10.2.tgz#85228e3e1d8b8532a27659b332e39b7fa0e022df" + integrity sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w== axios-mock-adapter@^1.19.0: version "1.22.0" @@ -6280,7 +6279,7 @@ browserify-aes@^1.0.4, browserify-aes@^1.2.0: inherits "^2.0.1" safe-buffer "^5.0.1" -browserify-cipher@^1.0.0: +browserify-cipher@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== @@ -6308,7 +6307,7 @@ browserify-rsa@^4.0.0, browserify-rsa@^4.1.0: randombytes "^2.1.0" safe-buffer "^5.2.1" -browserify-sign@^4.0.0: +browserify-sign@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.3.tgz#7afe4c01ec7ee59a89a558a4b75bd85ae62d4208" integrity sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw== @@ -6332,14 +6331,14 @@ browserify-zlib@^0.1.4: pako "~0.2.0" browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.23.3, browserslist@^4.24.0: - version "4.24.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.0.tgz#a1325fe4bc80b64fda169629fc01b3d6cecd38d4" - integrity sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A== + version "4.24.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.2.tgz#f5845bc91069dbd55ee89faf9822e1d885d16580" + integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg== dependencies: - caniuse-lite "^1.0.30001663" - electron-to-chromium "^1.5.28" + caniuse-lite "^1.0.30001669" + electron-to-chromium "^1.5.41" node-releases "^2.0.18" - update-browserslist-db "^1.1.0" + update-browserslist-db "^1.1.1" bs-logger@0.x: version "0.2.6" @@ -6546,7 +6545,7 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001663: +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001669: version "1.0.30001669" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz#fda8f1d29a8bfdc42de0c170d7f34a9cf19ed7a3" integrity sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w== @@ -7178,7 +7177,7 @@ cosmiconfig@^8.2.0: parse-json "^5.2.0" path-type "^4.0.0" -create-ecdh@^4.0.0: +create-ecdh@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== @@ -7197,7 +7196,7 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: ripemd160 "^2.0.1" sha.js "^2.4.0" -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: +create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== @@ -7259,21 +7258,22 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: which "^2.0.1" crypto-browserify@^3.12.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + version "3.12.1" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.1.tgz#bb8921bec9acc81633379aa8f52d69b0b69e0dac" + integrity sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ== dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" + browserify-cipher "^1.0.1" + browserify-sign "^4.2.3" + create-ecdh "^4.0.4" + create-hash "^1.2.0" + create-hmac "^1.1.7" + diffie-hellman "^5.0.3" + hash-base "~3.0.4" + inherits "^2.0.4" + pbkdf2 "^3.1.2" + public-encrypt "^4.0.3" + randombytes "^2.1.0" + randomfill "^1.0.4" crypto-random-string@^2.0.0: version "2.0.0" @@ -7883,7 +7883,7 @@ diff@^5.2.0: resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== -diffie-hellman@^5.0.0: +diffie-hellman@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== @@ -8095,10 +8095,10 @@ ejs@^3.1.6, ejs@^3.1.7, ejs@^3.1.8: dependencies: jake "^10.8.5" -electron-to-chromium@^1.5.28: - version "1.5.41" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.41.tgz#eae1ba6c49a1a61d84cf8263351d3513b2bcc534" - integrity sha512-dfdv/2xNjX0P8Vzme4cfzHqnPm5xsZXwsolTYr0eyW18IUmNyG08vL+fttvinTfhKfIKdRoqkDIC9e9iWQCNYQ== +electron-to-chromium@^1.5.41: + version "1.5.45" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.45.tgz#fa592ce6a88b44d23acbc7453a2feab98996e6c9" + integrity sha512-vOzZS6uZwhhbkZbcRyiy99Wg+pYFV5hk+5YaECvx0+Z31NR3Tt5zS6dze2OepT6PCTzVzT0dIJItti+uAW5zmw== elliptic@^6.5.3, elliptic@^6.5.4, elliptic@^6.5.5: version "6.5.7" @@ -8319,7 +8319,7 @@ es-get-iterator@^1.1.3: isarray "^2.0.5" stop-iteration-iterator "^1.0.0" -es-iterator-helpers@^1.0.19: +es-iterator-helpers@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz#f6d745d342aea214fe09497e7152170dc333a7a6" integrity sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw== @@ -8546,11 +8546,11 @@ eslint-plugin-jest@^25.3.0: "@typescript-eslint/experimental-utils" "^5.0.0" eslint-plugin-jsx-a11y@^6.5.1: - version "6.10.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.0.tgz#36fb9dead91cafd085ddbe3829602fb10ef28339" - integrity sha512-ySOHvXX8eSN6zz8Bywacm7CvGNhUtdjvqfQDVe6020TUK34Cywkw7m0KsCCk1Qtm9G1FayfTN1/7mMYnYO2Bhg== + version "6.10.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.1.tgz#87003835bad8875e023aa5db26f41a0c9e6a8fa9" + integrity sha512-zHByM9WTUMnfsDTafGXRiqxp6lFtNoSOWBY6FonVRn3A+BUwN1L/tdBXT40BcBJi0cZjOGTXZ0eD/rTG9fEJ0g== dependencies: - aria-query "~5.1.3" + aria-query "^5.3.2" array-includes "^3.1.8" array.prototype.flatmap "^1.3.2" ast-types-flow "^0.0.8" @@ -8558,14 +8558,14 @@ eslint-plugin-jsx-a11y@^6.5.1: axobject-query "^4.1.0" damerau-levenshtein "^1.0.8" emoji-regex "^9.2.2" - es-iterator-helpers "^1.0.19" + es-iterator-helpers "^1.1.0" hasown "^2.0.2" jsx-ast-utils "^3.3.5" language-tags "^1.0.9" minimatch "^3.1.2" object.fromentries "^2.0.8" safe-regex-test "^1.0.3" - string.prototype.includes "^2.0.0" + string.prototype.includes "^2.0.1" eslint-plugin-prettier@^5.1.3: version "5.2.1" @@ -8581,16 +8581,16 @@ eslint-plugin-react-hooks@^4.3.0: integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== eslint-plugin-react@^7.27.1: - version "7.37.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.1.tgz#56493d7d69174d0d828bc83afeffe96903fdadbd" - integrity sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg== + version "7.37.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz#cd0935987876ba2900df2f58339f6d92305acc7a" + integrity sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w== dependencies: array-includes "^3.1.8" array.prototype.findlast "^1.2.5" array.prototype.flatmap "^1.3.2" array.prototype.tosorted "^1.1.4" doctrine "^2.1.0" - es-iterator-helpers "^1.0.19" + es-iterator-helpers "^1.1.0" estraverse "^5.3.0" hasown "^2.0.2" jsx-ast-utils "^2.4.1 || ^3.0.0" @@ -9797,7 +9797,7 @@ hash-base@^3.0.0: readable-stream "^3.6.0" safe-buffer "^5.2.0" -hash-base@~3.0: +hash-base@~3.0, hash-base@~3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" integrity sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow== @@ -9952,9 +9952,9 @@ html-tags@^3.1.0: integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== html-webpack-plugin@^5.5.0: - version "5.6.2" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.2.tgz#174a67c8e55aa3fa2ba94c8e8e42894bfe4978ea" - integrity sha512-q7xp/FO9RGBVoTKNItkdX1jKLscLFkgn/dLVFNYbHVbfHLBk6DYW5nsQ8kCzIWcgKP/kUBocetjvav6lD8YfCQ== + version "5.6.3" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz#a31145f0fee4184d53a794f9513147df1e653685" + integrity sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg== dependencies: "@types/html-minifier-terser" "^6.0.0" html-minifier-terser "^6.0.2" @@ -11713,9 +11713,9 @@ jiti@^1.21.0: integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== jose@^5.9.3: - version "5.9.4" - resolved "https://registry.yarnpkg.com/jose/-/jose-5.9.4.tgz#70cd388f1e651bc23d138533758f287d777ff6ea" - integrity sha512-WBBl6au1qg6OHj67yCffCgFR3BADJBXN8MdRvCgJDuMv3driV2nHr7jdGvaKX9IolosAsn+M0XRArqLXUhyJHQ== + version "5.9.6" + resolved "https://registry.yarnpkg.com/jose/-/jose-5.9.6.tgz#77f1f901d88ebdc405e57cce08d2a91f47521883" + integrity sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ== js-sha3@^0.8.0: version "0.8.0" @@ -12945,11 +12945,16 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -negotiator@0.6.3, negotiator@^0.6.2, negotiator@^0.6.3: +negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +negotiator@^0.6.2, negotiator@^0.6.3: + version "0.6.4" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== + neo-async@^2.5.0, neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" @@ -13914,7 +13919,7 @@ pathval@^1.1.1: resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== -pbkdf2@^3.0.3, pbkdf2@^3.1.2: +pbkdf2@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== @@ -14793,7 +14798,7 @@ psl@^1.1.33: resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== -public-encrypt@^4.0.0: +public-encrypt@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== @@ -14928,7 +14933,7 @@ randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -randomfill@^1.0.3: +randomfill@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== @@ -15019,9 +15024,9 @@ react-docgen-typescript@^2.2.2: integrity sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg== react-docgen@^7.0.0: - version "7.0.3" - resolved "https://registry.yarnpkg.com/react-docgen/-/react-docgen-7.0.3.tgz#f811b785f07b1f2023cb899b6bcf9d522b21b95d" - integrity sha512-i8aF1nyKInZnANZ4uZrH49qn1paRgBZ7wZiCNBMnenlPzEv0mRl+ShpTVEI6wZNl8sSc79xZkivtgLKQArcanQ== + version "7.1.0" + resolved "https://registry.yarnpkg.com/react-docgen/-/react-docgen-7.1.0.tgz#4b41e557dab939a5157be09ee532fd09c07d99fc" + integrity sha512-APPU8HB2uZnpl6Vt/+0AFoVYgSRtfiP6FLrZgPPTDmqSb2R4qZRbgd0A3VzIFxDt5e+Fozjx79WjLWnF69DK8g== dependencies: "@babel/core" "^7.18.9" "@babel/traverse" "^7.18.9" @@ -15052,9 +15057,9 @@ react-element-to-jsx-string@^15.0.0: react-is "18.1.0" react-error-boundary@^4.0.12: - version "4.1.1" - resolved "https://registry.yarnpkg.com/react-error-boundary/-/react-error-boundary-4.1.1.tgz#ee078a0dae8532bdff09c7e6839fc6cdfa182366" - integrity sha512-EOAEsbVm2EQD8zPS4m24SiaR/506RPC3CjMcjJ5JWKECsctyLsDTKxB26Hvl7jcz7KweSOkBYAcY/hmMpMn2jA== + version "4.1.2" + resolved "https://registry.yarnpkg.com/react-error-boundary/-/react-error-boundary-4.1.2.tgz#bc750ad962edb8b135d6ae922c046051eb58f289" + integrity sha512-GQDxZ5Jd+Aq/qUxbCm1UtzmL/s++V7zKgE8yMktJiCQXCCFZnMZh9ng+6/Ne6PjNSXH0L9CjeOEREfRnq6Duag== dependencies: "@babel/runtime" "^7.12.5" @@ -16351,7 +16356,7 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string.prototype.includes@^2.0.0: +string.prototype.includes@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz#eceef21283640761a81dbe16d6c7171a4edf7d92" integrity sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg== @@ -16866,11 +16871,6 @@ tmpl@1.0.5: resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -17354,7 +17354,7 @@ upath@^1.2.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.1.0: +update-browserslist-db@^1.1.1: 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== From 86da91e2d376839056007d57a920be4d821084ea Mon Sep 17 00:00:00 2001 From: Nam Hoang Date: Fri, 25 Oct 2024 10:26:53 +0700 Subject: [PATCH 12/17] chore: update CI to built previous test --- .github/workflows/build_test.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index bc56a753..8bb54b10 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -33,6 +33,9 @@ jobs: - name: Check linting run: yarn lint + - name: Build + run: yarn build + - name: Run tests run: | yarn test:coverage @@ -44,6 +47,3 @@ jobs: coverage-file: ./coverage/coverage-final.json base-coverage-file: ./coverage/coverage-final.json threshold: 80 - - - name: Build - run: yarn build From df88f72bb4844ac2245f87502926ec5f2c693126 Mon Sep 17 00:00:00 2001 From: Nam Hoang Date: Fri, 25 Oct 2024 10:34:33 +0700 Subject: [PATCH 13/17] chore: remove git ignore app-config --- .gitignore | 1 - .../mock-app/src/constants/app-config.json | 6542 +++++++++++++++++ 2 files changed, 6542 insertions(+), 1 deletion(-) create mode 100644 packages/mock-app/src/constants/app-config.json diff --git a/.gitignore b/.gitignore index 1992ebaa..c6fca0ba 100644 --- a/.gitignore +++ b/.gitignore @@ -73,7 +73,6 @@ tmp/ # logs /logs packages/services/tsconfig.tsbuildinfo -packages/mock-app/src/constants/app-config.json packages/untp-test-suite/credentials.json packages/untp-test-suite/data # vc-test-suite diff --git a/packages/mock-app/src/constants/app-config.json b/packages/mock-app/src/constants/app-config.json new file mode 100644 index 00000000..3fc251b8 --- /dev/null +++ b/packages/mock-app/src/constants/app-config.json @@ -0,0 +1,6542 @@ +{ + "name": "CHERRIES SUPPLY CHAIN TRACEABILITY", + "styles": { + "primaryColor": "rgb(35, 138, 186)", + "secondaryColor": "black", + "tertiaryColor": "black" + }, + "generalFeatures": [ + { + "name": "General features", + "type": "", + "styles": { + "primaryColor": "rgb(35, 138, 186)", + "secondaryColor": "black", + "tertiaryColor": "black" + }, + "features": [] + } + ], + "apps": [ + { + "name": "Orchard Facility", + "type": "producer", + "assets": { + "logo": "Cherries-farm-logo.webp", + "brandTitle": "Orchard Facility" + }, + "styles": { + "primaryColor": "#b5651d", + "secondaryColor": "#391561", + "tertiaryColor": "#ffffff" + }, + "features": [ + { + "name": "Issue DPP", + "id": "produce_product", + "components": [ + { + "name": "JsonForm", + "type": "EntryData", + "props": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "productIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An array of unique identifiers assigned to the product or model. " + }, + "batchIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "Information regarding the specific production batch of the product." + }, + "itemIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An array of identifiers representing a specific serialised item of the product." + }, + "classification": { + "type": "array", + "items": { + "$ref": "#/$defs/Classification" + }, + "description": "A code representing the product's class, typically using the UN CPC (United Nations Central Product Classification) https://unstats.un.org/unsd/classifications/Econ/cpc" + }, + "modelName": { + "type": "string", + "description": "The model name or number of the product, represented as text." + }, + "image": { + "$ref": "#/$defs/BinaryFile", + "description": "A unique identifier (URI) pointing to an image of the product." + }, + "description": { + "type": "string", + "description": "A textual description providing details about the product." + }, + "furtherInformation": { + "type": "string", + "format": "uri", + "description": "A URL pointing to further human readable information about the product." + }, + "manufacturedDate": { + "type": "string", + "format": "date", + "description": "The ISO 8601 date on which the product batch was manufactured." + }, + "dimension": { + "$ref": "#/$defs/Dimension", + "description": "The physical dimensions of the product. Not every dimension is relevant to every products. For example bulk materials may have wieght and volume but not length, with, or height." + }, + "characteristic": { + "$ref": "#/$defs/Characteristic", + "description": "" + }, + "manufacturer": { + "$ref": "#/$defs/Party", + "description": "The Party entity that manufactured the product." + }, + "manufacturedAt": { + "$ref": "#/$defs/Facility", + "description": "The Facility where the product batch was manufactured." + }, + "materialsProvenance": { + "type": "array", + "items": { + "$ref": "#/$defs/Material" + }, + "description": "An array of Provenance objects providing details on the origin and mass fraction of components or ingredients of the product batch." + }, + "conformityClaim": { + "type": "array", + "items": { + "$ref": "#/$defs/Claim" + }, + "description": "An array of claim objects representing various product conformity claims about the product / batch. These can be sustainability claims, circularity claims, or any other claim type within the conformity topic list." + }, + "recyclingInstruction": { + "type": "string", + "format": "uri", + "description": "A URI pointing to information regarding the recycling aspects of the product." + }, + "traceabilityInformation": { + "type": "array", + "items": { + "$ref": "#/$defs/TraceabilityEvent" + }, + "description": "An array of TraceabilityEvent objects detailing EPCIS events related to the traceability of the product batch." + } + }, + "description": "The ProductInformation class encapsulates detailed information regarding a specific product, including its identification details, manufacturer, and other pertinent details.", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$defs": { + "Product": { + "type": "object", + "additionalProperties": false, + "properties": { + "productIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An array of unique identifiers assigned to the product or model. " + }, + "batchIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "Information regarding the specific production batch of the product." + }, + "itemIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An array of identifiers representing a specific serialised item of the product." + }, + "classification": { + "type": "array", + "items": { + "$ref": "#/$defs/Classification" + }, + "description": "A code representing the product's class, typically using the UN CPC (United Nations Central Product Classification) https://unstats.un.org/unsd/classifications/Econ/cpc" + }, + "modelName": { + "type": "string", + "description": "The model name or number of the product, represented as text." + }, + "image": { + "$ref": "#/$defs/BinaryFile", + "description": "A unique identifier (URI) pointing to an image of the product." + }, + "description": { + "type": "string", + "description": "A textual description providing details about the product." + }, + "furtherInformation": { + "type": "string", + "format": "uri", + "description": "A URL pointing to further human readable information about the product." + }, + "manufacturedDate": { + "type": "string", + "format": "date", + "description": "The ISO 8601 date on which the product batch was manufactured." + }, + "dimension": { + "$ref": "#/$defs/Dimension", + "description": "The physical dimensions of the product. Not every dimension is relevant to every products. For example bulk materials may have wieght and volume but not length, with, or height." + }, + "characteristic": { + "$ref": "#/$defs/Characteristic", + "description": "" + }, + "manufacturer": { + "$ref": "#/$defs/Party", + "description": "The Party entity that manufactured the product." + }, + "manufacturedAt": { + "$ref": "#/$defs/Facility", + "description": "The Facility where the product batch was manufactured." + }, + "materialsProvenance": { + "type": "array", + "items": { + "$ref": "#/$defs/Material" + }, + "description": "An array of Provenance objects providing details on the origin and mass fraction of components or ingredients of the product batch." + }, + "conformityClaim": { + "type": "array", + "items": { + "$ref": "#/$defs/Claim" + }, + "description": "An array of claim objects representing various product conformity claims about the product / batch. These can be sustainability claims, circularity claims, or any other claim type within the conformity topic list." + }, + "recyclingInstruction": { + "type": "string", + "format": "uri", + "description": "A URI pointing to information regarding the recycling aspects of the product." + }, + "traceabilityInformation": { + "type": "array", + "items": { + "$ref": "#/$defs/TraceabilityEvent" + }, + "description": "An array of TraceabilityEvent objects detailing EPCIS events related to the traceability of the product batch." + } + }, + "description": "The ProductInformation class encapsulates detailed information regarding a specific product, including its identification details, manufacturer, and other pertinent details." + }, + "Identifier": { + "type": "object", + "additionalProperties": false, + "properties": { + "scheme": { + "type": "string", + "format": "uri", + "description": "the identifier scheme as defined by the registrar that manages the identifier registry. If the identifier scheme is registered with UNTP then this URI can use used to dicsover the resolution method (to get more data) and the verification method (to prove ownership)." + }, + "identifierValue": { + "type": "string", + "description": "The value of the identifier within the scheme" + }, + "binding": { + "$ref": "#/$defs/Evidence", + "description": "Link to evidence that attests to the validity and ownership of the identifer. " + } + }, + "description": "An identifier of a party, product, or facility that is defined by an identifier scheme and idenfier value and, optinally, verification evidence " + }, + "Evidence": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": ["w3c_vc", "iso_mdl", "document", "website", "other"], + "example": "w3c_vc", + "description": "Format of the evidence (verifiable credential, document, website, etc)" + }, + "assuranceLevel": { + "type": "string", + "enum": ["Self", "Commercial", "Buyer", "Membership", "Unspecified", "3rdParty"], + "example": "Self", + "description": "The assurance level of the evidence (self declaration, 2nd party, 3rd party, accredited auditor)" + }, + "reference": { + "type": "string", + "format": "uri", + "description": "The URL at which the evidence data can be found. " + } + }, + "description": "Evidence to support a conformity or identity claim. " + }, + "Classification": { + "type": "object", + "additionalProperties": false, + "properties": { + "scheme": { + "type": "string", + "format": "uri", + "description": "Classification scheme - eg https://unstats.un.org/unsd/classifications/Econ/cpc " + }, + "classifierValue": { + "type": "string", + "description": "classifier value within the scheme - eg \"01211\" in UN CPC" + }, + "classifierName": { + "type": "string", + "description": "Name of the classifier - eg \"Asparagus\" for code \"01211\" in UNCPC" + }, + "classifierURL": { + "type": "string", + "format": "uri", + "description": "Linked data URL to a web vocabulary entery for this classificaiton code. When this property is provided, the scheme, value, and name properties of the classifer are not required. eg https://vocabulary.uncefact.org/unlocode#AUBNE represensign the port of Brisbane in the UN/LOCODE classification scheme." + } + }, + "description": "A classification scheme and code / name representing a category value for a product, entity, or facility." + }, + "BinaryFile": { + "type": "object", + "additionalProperties": false, + "properties": { + "fileHash": { + "x-jargon-isKey": true, + "type": "string", + "description": "The MD5 hash of the file." + }, + "fileLocation": { + "type": "string", + "format": "uri", + "description": "The location of the evidence file." + }, + "fileType": { + "type": "string", + "x-external-enumeration": "https://mimetype.io/all-types", + "description": "The type of file, represented as a MIME type.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://mimetype.io/all-types\n " + } + }, + "description": "A file representing a data snapshot that is used to infomr the conformity assessment." + }, + "Dimension": { + "type": "object", + "additionalProperties": false, + "properties": { + "weight": { + "$ref": "#/$defs/Measure", + "description": "the weight of the product" + }, + "length": { + "$ref": "#/$defs/Measure", + "description": "The length of the product or packaging" + }, + "width": { + "$ref": "#/$defs/Measure", + "description": "The width of the product or packaging" + }, + "height": { + "$ref": "#/$defs/Measure", + "description": "The height of the product or packaging" + }, + "volume": { + "$ref": "#/$defs/Measure", + "description": "The displacement volume of the product." + } + }, + "description": "Overall (length, width, height) dimensions and weight/volume of an item." + }, + "Measure": { + "type": "object", + "additionalProperties": false, + "properties": { + "value": { + "type": "number", + "description": "The numeric value of the measure" + }, + "unit": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/UnitMeasureCode", + "description": "Unit of measure drawn from the UNECE rec20 measure code list.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/UnitMeasureCode\n " + } + }, + "description": "The measure class defines a numeric measured value (eg 10) and a coded unit of measure (eg KG)." + }, + "Characteristic": { + "type": "object", + "additionalProperties": false, + "properties": {}, + "description": "Product specific characteristics. This class is an extension point for industry specific product characteristics or performance information such as clothing size or battery capacity." + }, + "Party": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "string", + "description": "The decentralised identifier of the party - must be a W3C DID." + }, + "name": { + "type": "string", + "description": "The name of the organization or company, represented as a text string." + }, + "identifiers": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "A list of unique business identifiers assigned to the party - such as tax registration numbers." + } + }, + "description": "The Party class represents an entity such as an organization, or a company that manufactured the product." + }, + "Facility": { + "type": "object", + "additionalProperties": false, + "properties": { + "identifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "A unique identifier (URI) assigned to the facility. (Link Resolver - GS1 GLN?)" + }, + "name": { + "type": "string", + "description": "The name of the facility, represented as a text string." + }, + "location": { + "type": "string", + "format": "uri", + "description": "" + }, + "operatedBy": { + "$ref": "#/$defs/Party", + "description": "The Party entity responsible for operating the facility." + } + }, + "description": "The physical site (eg farm or factory) where the product or materials was produced." + }, + "Material": { + "type": "object", + "additionalProperties": false, + "properties": { + "originCountry": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/CountryId", + "description": "A ISO 3166-1 code representing the country of origin of the component or ingredient.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/CountryId\n " + }, + "materialType": { + "$ref": "#/$defs/Classification", + "description": "The type of this material - as a value drawn from a controlled vocabulary eg textileexchange.org/materials/rm01014 - representing organic cotton." + }, + "massFraction": { + "type": "number", + "description": "A numeric value representing the mass fraction of the product represented by this material. The sum of all mass fraction values for a given passport should be 100." + }, + "recycled": { + "type": "boolean", + "description": "Indicator is true if this material input is from a recycled source." + }, + "hazardous": { + "type": "boolean", + "description": "Indicates whether this material is hazardous. If true then " + } + }, + "description": "The material class encapsulates details about the origin or source of raw materials in a product, including the country of origin and the mass fraction." + }, + "Claim": { + "type": "object", + "additionalProperties": false, + "properties": { + "topic": { + "type": "string", + "enum": [ + "environment.energy", + "environment.emissions", + "environment.water", + "environment.waste", + "environment.deforestation", + "environment.biodiversity", + "circularity.content", + "circularity.design", + "social.labour", + "social.rights", + "social.community", + "social.safety", + "governance.ethics", + "governance.compliance", + "governance.transparency" + ], + "example": "environment.energy", + "description": "A code representing the topic of the sustainability claim. E.g. environment.deforestation, environment.ghg-emission-intensity, etc.. Drawn from a standard code list. " + }, + "standardOrRegulation": { + "type": "string", + "format": "uri", + "description": "The standard or regulation against which this conformity claim is made. Expressed as a URI and should match a value in the UN catalogue of reference vocabularies. " + }, + "criteriaReference": { + "type": "string", + "format": "uri", + "description": "A URI pointing to the specific criteria within the standard or regulation against which this claim is made." + }, + "claimedValues": { + "type": "array", + "items": { + "$ref": "#/$defs/Metric" + }, + "description": "One or more actual measures supporting the claim. For example for GHG emissions there may be a metric for total emissions intensity and also a metric for amount of offsets included." + }, + "benchmarkValue": { + "$ref": "#/$defs/Metric", + "description": "A benchmark value against which the claimed value can be assessed. THis could be a value specified by a standard or regulation or could be an industry benchmark." + }, + "benchmarkReference": { + "type": "string", + "format": "uri", + "description": "A refernce to evidence to support the benchmark value." + }, + "conformance": { + "type": "boolean", + "description": "and indicator (boolean) that expresses whether or not this product has achieved compliance against the criteria. for example, if the topic is environment.deforstation and the criteria is EU.2023.1115 then the product is conformant if it has not touched any facility throughout it's lifecycle that is not deforestation free since dec 2020." + }, + "conformityEvidence": { + "$ref": "#/$defs/Evidence", + "description": "A URI pointing to the evidence supporting the claim. Most likely in the form of a verifiable credential." + } + }, + "description": "The SustainabilityClaim class represents specific claims regarding the sustainability of a product, providing details about the metrics, thresholds, and evidences supporting the claim." + }, + "Metric": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "description": "A human readable name for this metric" + }, + "value": { + "$ref": "#/$defs/Measure", + "description": "A numeric value representing the measurement or evaluation outcome for the claim." + }, + "accuracy": { + "type": "number", + "description": "A percentage represented as a numeric between 0 and 1 indicating the rage of accuracy of the claimed value (eg 0.05 means that the actual value is within 5% of the claimed value.)" + } + }, + "description": "A specific measure of performance against the criteria that governs the claim. Expressed as an array of metric (ie unit of emasure) / value (ie the actual numeric value) pairs. " + }, + "TraceabilityEvent": { + "type": "object", + "additionalProperties": false, + "properties": { + "eventReference": { + "type": "string", + "format": "uri", + "description": "A URI pointing to the detailed information about the EPCIS event. Most likely in the form of a verifiable credential." + }, + "eventType": { + "type": "string", + "enum": ["aggregation", "transformation", "object", "transaction", "association"], + "example": "aggregation", + "description": "A code representing the type of EPCIS event. ObjectEvent, AggregationEvent, TransactionEvent, TransformationEvent, ObjectEvent." + } + }, + "description": "The TraceabilityEvent class represents a specific EPCIS event in the traceability chain of a product, including details about the event type and reference." + } + } + }, + "data": { + "image": "data:image/jpg;base64,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", + "productIdentifier": [ + { + "scheme": "https://id.gs1.org/gtin", + "identifierValue": "05012345678900", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://id.gs1.org/gtin/05012345678900/binding" + } + } + ], + "batchIdentifier": [ + { + "scheme": "https://Cherriesfarm.example.org/batch", + "identifierValue": "2024001", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://Cherriesfarm.example.org/batch/2024-001/binding" + } + } + ], + "itemIdentifier": [ + { + "scheme": "https://Cherriesfarm.example.org/item", + "identifierValue": "TRF240001", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://Cherriesfarm.example.org/item/TRF-24-0001/binding" + } + } + ], + "classification": [ + { + "scheme": "https://www.unspsc.org", + "classifierValue": "50383710", + "classifierName": "Cherriess", + "classifierURL": "https://www.unspsc.org/search-code/50383710" + } + ], + "modelName": "Black Cherries", + "description": "Premium Black Cherriess harvested from our sustainable Cherries orchards.", + "furtherInformation": "https://Cherriesfarm.example.org/products/black_perigord", + "manufacturedDate": "2024-01-15", + "dimension": { + "weight": { "value": 50, "unit": "GRM" } + }, + "materialsProvenance": [ + { + "originCountry": "AU", + "materialType": { + "scheme": "https://www.gs1.org/gpc", + "classifierValue": "10005953", + "classifierName": "Cherriess (Fresh)", + "classifierURL": "https://www.gs1.org/gpc/10005953" + }, + "massFraction": 100, + "recycled": false, + "hazardous": false + } + ], + "characteristic": { + "variety": "Tuber melanosporum", + "grade": "Extra", + "aroma": "Intense, earthy", + "flavor": "Rich, complex" + }, + "manufacturer": { + "id": "did:example:123456789abcdefghi", + "name": "Gourmet Cherries Farm", + "identifiers": [ + { + "scheme": "https://identifier.example.org/company", + "identifierValue": "COMP-12345", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://identifier.example.org/company/12345/binding" + } + } + ] + }, + "manufacturedAt": { + "identifier": [ + { + "scheme": "https://identifier.example.org/facility", + "identifierValue": "FAC-5678", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://identifier.example.org/facility/5678/binding" + } + } + ], + "name": "Cherries Orchard", + "location": "https://Cherriesfarm.example.org/locations/perigord_orchard", + "operatedBy": { + "id": "did:example:123456789abcdefghi", + "name": "Gourmet Cherries Farm", + "identifiers": [ + { + "scheme": "https://identifier.example.org/company", + "identifierValue": "COMP-12345", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://identifier.example.org/company/12345/binding" + } + } + ] + } + } + }, + "constructData": { + "mappingFields": [], + "dummyFields": [], + "generationFields": [ + { + "path": "/eventID", + "handler": "generateIdWithSerialNumber" + } + ] + }, + "className": "json-form", + "style": { + "margin": "40px auto", + "paddingTop": "40px", + "width": "80%" + } + } + }, + { + "name": "CustomButton", + "type": "Submit", + "props": {} + } + ], + "services": [ + { + "name": "processDPP", + "parameters": [ + { + "vckit": { + "vckitAPIUrl": "http://localhost:3332/v2", + "issuer": "did:web:60c5-115-79-212-164.ngrok-free.app" + }, + "dpp": { + "context": ["https://dpp-json-ld.s3.ap-southeast-2.amazonaws.com/dppld.json"], + "renderTemplate": [ + { + "template": " Digital Product Passport

PRODUCT PASSPORT

{{credentialSubject.modelName}}

{{#each credentialSubject.batchIdentifier}} {{/each}} {{#each credentialSubject.productIdentifier}} {{/each}}

Sustainability

100%

Confidence

100%

PASSPORT ISSUED BY

{{issuer.name}}

Industry

Agriculture

Business identifier
75 859 224 235
Location
Rooty Hill, NSW
Identity verification
75 859 224 235
Other evidence

Conformity credentials

Conformity credentials are usually issued by independent third parties and provide a trusted assessment of product ESG performance against credible standards or regulations

{{#each credentialSubject.conformityClaim}}

{{topic}}

{{!-- {{#if (eq conformityEvidence.type 'w3c_vc')}} --}}
Verifiable credential
{{!-- {{/if}} --}}

View details

{{/each}}

Product composition

A complete list of materials that make up the composition of this product.

{{#each credentialSubject.materialsProvenance}}

{{massFraction}}%

ID {{materialType.classifierValue}}

{{materialType.classifierName}}

{{#if recycled}}

Recycled

{{/if}} {{#if hazardous}}

Hazard

{{/if}}
{{originCountry}}
{{/each}}

Product information

Harvest Date

{{credentialSubject.manufacturedDate}}

Batch No.

{{credentialSubject.batchIdentifier.0.identifierValue}}

Weight

{{credentialSubject.dimension.weight.value}}{{credentialSubject.dimension.weight.unit}}

Description

{{credentialSubject.description}}

", + "@type": "WebRenderingTemplate2022" + } + ], + "type": ["VerifiableCredential", "DigitalProductPassport"], + "dlrLinkTitle": "Cherries Product Passport", + "dlrIdentificationKeyType": "gtin", + "dlrVerificationPage": "http://localhost:3003/verify" + }, + "dlr": { + "dlrAPIUrl": "http://localhost:3000", + "dlrAPIKey": "test123", + "namespace": "gs1", + "linkRegisterPath": "/api/resolver" + }, + "storage": { + "url": "http://localhost:3334/v1/documents", + "params": { + "resultPath": "/uri", + "bucket": "verifiable-credentials" + }, + "options": { + "method": "POST", + "headers": { + "Content-Type": "application/json" + } + } + }, + "identifierKeyPath": { + "function": "concatService", + "args": [ + { "type": "text", "value": "(01)" }, + { "type": "path", "value": "/productIdentifier/0/identifierValue" }, + { "type": "text", "value": "(10)" }, + { "type": "path", "value": "/batchIdentifier/0/identifierValue" }, + { "type": "text", "value": "(21)" }, + { "type": "path", "value": "/itemIdentifier/0/identifierValue" } + ] + } + } + ] + }, + { + "name": "mergeToLocalStorage", + "parameters": [ + { + "storageKey": "CherriesFarm_dpps", + "objectKeyPath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue" + } + ] + } + ] + }, + { + "name": "Issue Object Event", + "id": "issue_object_event", + "components": [ + { + "name": "JsonForm", + "type": "EntryData", + "props": { + "schema": { + "url": "https://jargon.sh/user/unece/traceabilityEvents/v/0.4.0/artefacts/jsonSchemas/ObjectEvent.json?class=ObjectEvent" + }, + "data": { + "type": "transformation", + "id": "https://events.sample.com/01/05012345678900/21/951350380", + "processType": "Weaving", + "eventTime": "2024-09-01T12:00:00", + "action": "Add", + "disposition": "010501234567890021951350380", + "bizStep": "https://ref.gs1.org/cbv/BizStep-commissioning", + "bizLocation": "https://id.gs1.org/414/9520123456788", + "sensorElementList": [ + { + "sensorMetadata": { + "device": { + "type": ["Item"], + "id": "https://id.gs1.org/01/09520123456788/21/12345", + "name": "EV battery 300Ah." + }, + "dataProcessingMethod": "https://standards.org/sensorMethod#1234" + }, + "sensorReport": [ + { + "time": "2024-07-24T12:00:00", + "sensorType": "https://samplesensors.com/model1234", + "value": 25, + "uom": "KGM" + }, + { + "time": "2024-07-24T12:00:00", + "sensorType": "https://samplesensors.com/model1234", + "value": 25, + "uom": "KGM" + } + ], + "sensorIntegrityProof": "https://jargon.sh" + }, + { + "sensorMetadata": { + "device": { + "type": ["Item"], + "id": "https://id.gs1.org/01/09520123456788/21/12345", + "name": "EV battery 300Ah." + }, + "dataProcessingMethod": "https://standards.org/sensorMethod#1234" + }, + "sensorReport": [ + { + "time": "2024-07-24T12:00:00", + "sensorType": "https://samplesensors.com/model1234", + "value": 25, + "uom": "KGM" + }, + { + "time": "2024-07-24T12:00:00", + "sensorType": "https://samplesensors.com/model1234", + "value": 25, + "uom": "KGM" + } + ], + "sensorIntegrityProof": "https://jargon.sh" + } + ], + "epcList": [ + { + "type": ["Item"], + "id": "https://id.gs1.org/01/09520123456788/21/12345", + "name": "EV battery 300Ah." + }, + { + "type": ["Item"], + "id": "https://id.gs1.org/01/09520123456788/21/12345", + "name": "EV battery 300Ah." + } + ], + "quantityList": [ + { + "productId": "https://id.gs1.org/01/09520123456788/21/12345", + "productName": "EV battery 300Ah.", + "quantity": 20, + "uom": "KGM" + }, + { + "productId": "https://id.gs1.org/01/09520123456788/21/12345", + "productName": "EV battery 300Ah.", + "quantity": 20, + "uom": "KGM" + } + ] + }, + "constructData": { + "mappingFields": [], + "dummyFields": [], + "generationFields": [ + { + "path": "/eventID", + "handler": "generateIdWithSerialNumber" + } + ] + }, + "className": "json-form", + "style": { + "margin": "40px auto", + "paddingTop": "40px", + "width": "80%" + } + } + }, + { + "name": "CustomButton", + "type": "Submit", + "props": {} + } + ], + "services": [ + { + "name": "processObjectEvent", + "parameters": [ + { + "vckit": { + "vckitAPIUrl": "http://localhost:3332/v2", + "issuer": "did:web:60c5-115-79-212-164.ngrok-free.app" + }, + "epcisObjectEvent": { + "context": ["https://dpp-json-ld.s3.ap-southeast-2.amazonaws.com/dppld.json"], + "renderTemplate": [ + { + "template": "

Object Event

", + "@type": "WebRenderingTemplate2022" + } + ], + "type": ["VerifiableCredential", "DigitalTraceabilityEvent"], + "dlrLinkTitle": "Object Event", + "dlrIdentificationKeyType": "gtin", + "dlrVerificationPage": "http://localhost:3003/verify" + }, + "dlr": { + "dlrAPIUrl": "http://localhost:3000", + "dlrAPIKey": "test123", + "namespace": "gs1", + "linkRegisterPath": "/api/resolver" + }, + "storage": { + "url": "http://localhost:3334/v1/documents", + "params": { + "resultPath": "/uri", + "bucket": "verifiable-credentials" + }, + "options": { + "method": "POST", + "headers": { + "Content-Type": "application/json" + } + } + }, + "identifierKeyPath": "/id" + } + ] + } + ] + }, + { + "name": "Issue DIA", + "id": "produce_product", + "components": [ + { + "name": "JsonForm", + "type": "EntryData", + "props": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "default": "Entity", + "enum": ["Entity"] + }, + "id": { + "example": "https://id.gs1.org/01/09520123456788/21/12345", + "type": "string", + "format": "uri", + "description": "The globally unique ID of the entity as a resolvable URL according to ISO 18975. ExamplesProduct - id.gs1.org/01/09520123456788/21/12345 Party - abr.business.gov.au/ABN/View?abn=90664869327. Facility - did:web:facilities.example-company.com:123. " + }, + "name": { + "example": "EV battery 300Ah.", + "type": "string", + "description": "The registered name of the entity within the identifier scheme. Examplesproduct - EV battery 300Ahparty - Sample Company Pty Ltd. facility - Greenacres battery factory" + }, + "registeredId": { + "example": "90664869327", + "type": "string", + "description": "The registration number (alphanumeric) of the entity within the register. Unique within the register." + }, + "idScheme": { + "$ref": "#/$defs/IdentifierScheme", + "description": "The identifier scheme. Exampleproduct - id.gs1.org/01. party - business.gov.au/abn facility - did:web:facilities.acme.com. " + } + }, + "description": "The ID and Name of an identified entity such qs a product, facility, party, standard, etc. If the identifier is a W3C DID then the corresponding DID document SHOULD include a serviceEndpoint of type \"IdentityResolver\". If the identifier is not a W3C DID then the id peroperty SHOULD be an identity resolver URL.", + "required": ["id", "name"], + "$defs": { + "CredentialIssuer": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "default": "CredentialIssuer", + "enum": ["CredentialIssuer"] + }, + "id": { + "example": "did:web:identifiers.example-company.com:12345", + "type": "string", + "format": "uri", + "description": "The W3C DID of the issuer - should be a did:web or did:tdw" + }, + "name": { + "example": "Example Company Pty Ltd", + "type": "string", + "description": "The name of the issuer person or organisation" + }, + "otherIdentifiers": { + "type": "array", + "items": { + "$ref": "#/$defs/Entity" + }, + "description": "An optional list of other registered identifiers for this credential issuer " + } + }, + "description": "The issuer party ()person or orgnaition) of a verifiable credential.", + "required": ["id", "name"] + }, + "Entity": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "default": "Entity", + "enum": ["Entity"] + }, + "id": { + "example": "https://id.gs1.org/01/09520123456788/21/12345", + "type": "string", + "format": "uri", + "description": "The globally unique ID of the entity as a resolvable URL according to ISO 18975. ExamplesProduct - id.gs1.org/01/09520123456788/21/12345 Party - abr.business.gov.au/ABN/View?abn=90664869327. Facility - did:web:facilities.example-company.com:123. " + }, + "name": { + "example": "EV battery 300Ah.", + "type": "string", + "description": "The registered name of the entity within the identifier scheme. Examplesproduct - EV battery 300Ahparty - Sample Company Pty Ltd. facility - Greenacres battery factory" + }, + "registeredId": { + "example": "90664869327", + "type": "string", + "description": "The registration number (alphanumeric) of the entity within the register. Unique within the register." + }, + "idScheme": { + "$ref": "#/$defs/IdentifierScheme", + "description": "The identifier scheme. Exampleproduct - id.gs1.org/01. party - business.gov.au/abn facility - did:web:facilities.acme.com. " + } + }, + "description": "The ID and Name of an identified entity such qs a product, facility, party, standard, etc. If the identifier is a W3C DID then the corresponding DID document SHOULD include a serviceEndpoint of type \"IdentityResolver\". If the identifier is not a W3C DID then the id peroperty SHOULD be an identity resolver URL.", + "required": ["id", "name"] + }, + "IdentifierScheme": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "default": "IdentifierScheme", + "enum": ["IdentifierScheme"] + }, + "id": { + "example": "https://id.gs1.org/01/", + "type": "string", + "format": "uri", + "description": "The globally unique identifier of the registration scheme. The scheme should be registered and discoverable from vocabulary.uncefact.org/identifierSchemes" + }, + "name": { + "example": "Global Trade Identification Number (GTIN)", + "type": "string", + "description": "The name of the identifier scheme. " + } + }, + "description": "An identifier registration scheme for products, facilities, or organisations. Typically operated by a state, national or gloabl authority." + } + } + }, + "data": { + "type": ["Entity"], + "id": "0105012345678900", + "registeredId": "123456789", + "name": "Sample business Ltd", + "idScheme": { + "type": ["IdentifierScheme"], + "id": "https://id.gs1.org/01/", + "name": "Global Trade Identification Number (GTIN)" + }, + "verifiedDIDList": ["did:web:samplebusiness.com:key7", "did:web:samplebusiness.com:key7"], + "registrationScopeList": [ + "https://abr.business.gov.au/Help/EntityTypeDescription?Id=19", + "https://abr.business.gov.au/Help/EntityTypeDescription?Id=19" + ] + }, + "constructData": { + "mappingFields": [], + "dummyFields": [], + "generationFields": [ + { + "path": "/eventID", + "handler": "generateIdWithSerialNumber" + } + ] + }, + "className": "json-form", + "style": { + "margin": "40px auto", + "paddingTop": "40px", + "width": "80%" + } + } + }, + { + "name": "CustomButton", + "type": "Submit", + "props": {} + } + ], + "services": [ + { + "name": "processDigitalIdentityAnchor", + "parameters": [ + { + "vckit": { + "vckitAPIUrl": "http://localhost:3332/v2", + "issuer": "did:web:60c5-115-79-212-164.ngrok-free.app" + }, + "digitalIdentityAnchor": { + "context": ["https://dpp-json-ld.s3.ap-southeast-2.amazonaws.com/dppld.json"], + "renderTemplate": [ + { + "template": "
Digital Identity Anchor
", + "@type": "WebRenderingTemplate2022" + } + ], + "type": ["VerifiableCredential", "DigitalIdentityAnchor"], + "dlrLinkTitle": "DigitalIdentityAnchor", + "dlrIdentificationKeyType": "gtin", + "dlrVerificationPage": "http://localhost:3003/verify" + }, + "dlr": { + "dlrAPIUrl": "http://localhost:3000", + "dlrAPIKey": "test123", + "namespace": "gs1", + "linkRegisterPath": "/api/resolver" + }, + "storage": { + "url": "http://localhost:3334/v1/documents", + "params": { + "resultPath": "/uri", + "bucket": "verifiable-credentials" + }, + "options": { + "method": "POST", + "headers": { + "Content-Type": "application/json" + } + } + }, + "identifierKeyPath": "/id" + } + ] + } + ] + }, + { + "name": "Issue DFR", + "id": "produce_product", + "components": [ + { + "name": "JsonForm", + "type": "EntryData", + "props": { + "schema": { + "type": "object", + "additionalProperties": true, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["Facility"], + "default": ["Facility"], + "items": { + "type": "string", + "enum": ["Facility"] + } + }, + "id": { + "example": "https://id.gs1.org/gln/0614141123452", + "type": "string", + "format": "uri", + "description": "The globally unique ID of the facility as URI, ideally as a resolvable URL." + }, + "registeredId": { + "example": "0614141123452", + "type": "string", + "description": "The registration number (alphanumeric) of the facility within the identifier scheme. Unique within the register." + }, + "description": { + "example": "LiFePO4 Battery plant number 7", + "type": "string", + "description": "An optional short description of the facility" + }, + "name": { + "example": "Example facility 7", + "type": "string", + "description": "The registered name of the facility within the identifier scheme. " + }, + "idScheme": { + "$ref": "#/$defs/IdentifierScheme", + "description": "The ID scheme of the facility. eg a GS1 GLN or a National land registry scheme. If self issued then use the party ID of the facility owner. " + }, + "countryOfOperation": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/CountryId", + "description": "The country in which this facility is operating.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/CountryId\n " + }, + "processCategory": { + "type": "array", + "items": { + "$ref": "#/$defs/Classification" + }, + "description": "The industrial or production processes performed by this facility. Example unstats.un.org/isic/1030." + }, + "operatedByParty": { + "$ref": "#/$defs/Identifier", + "description": "The Party entity responsible for operating the facility.An object structure that uniquely identifies the party within a known party identification scheme. " + }, + "otherIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An optional list of other registered identifiers for this facility - eg GLNs or other schemes." + }, + "address": { + "$ref": "#/$defs/Address", + "description": "The Postal address of the location." + }, + "locationInformation": { + "$ref": "#/$defs/Location", + "description": "Physical location details" + }, + "conformityClaim": { + "type": "array", + "items": { + "$ref": "#/$defs/Claim" + }, + "description": "A list of conformity declarations against specific criteria from recognised standards or regulations. " + } + }, + "description": "The physical site (eg farm or factory) where the product or materials was produced. Including the facility sustainability performance record.", + "required": ["id", "name"], + "$defs": { + "CredentialIssuer": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["CredentialIssuer"], + "default": ["CredentialIssuer"], + "items": { + "type": "string", + "enum": ["CredentialIssuer"] + } + }, + "id": { + "example": "did:web:identifiers.example-company.com:12345", + "type": "string", + "format": "uri", + "description": "The W3C DID of the issuer - should be a did:web or did:tdw" + }, + "name": { + "example": "Example Company Pty Ltd", + "type": "string", + "description": "The name of the issuer person or organisation" + }, + "otherIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An optional list of other registered identifiers for this credential issuer " + } + }, + "description": "The issuer party (person or organisation) of a verifiable credential.", + "required": ["id", "name"] + }, + "Identifier": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["Identifier"], + "default": ["Identifier"], + "items": { + "type": "string", + "enum": ["Identifier"] + } + }, + "id": { + "example": "https://id.gs1.org/01/09520123456788/21/12345", + "type": "string", + "format": "uri", + "description": "The globally unique ID of the entity as a resolvable URL according to ISO 18975. ExamplesProduct - id.gs1.org/01/09520123456788/21/12345 Party - abr.business.gov.au/ABN/View?abn=90664869327. Facility - did:web:facilities.example-company.com:123. " + }, + "name": { + "example": "EV battery 300Ah.", + "type": "string", + "description": "The registered name of the entity within the identifier scheme. Examples: product - EV battery 300Ah, Party - Sample Company Pty Ltd, Facility - Green Acres battery factory" + }, + "registeredId": { + "example": "90664869327", + "type": "string", + "description": "The registration number (alphanumeric) of the entity within the register. Unique within the register." + }, + "idScheme": { + "$ref": "#/$defs/IdentifierScheme", + "description": "The identifier scheme. Examples : Product - id.gs1.org/01, Party - business.gov.au/abn, Facility - did:web:facilities.acme.com. " + } + }, + "description": "The ID and Name of an identified entity such as a product, facility, party, standard, etc. If the identifier is a W3C DID then the corresponding DID document SHOULD include a serviceEndpoint of type \"IdentityResolver\". If the identifier is not a W3C DID then the id property SHOULD be an identity resolver URL.", + "required": ["id", "name"] + }, + "IdentifierScheme": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["IdentifierScheme"], + "default": ["IdentifierScheme"], + "items": { + "type": "string", + "enum": ["IdentifierScheme"] + } + }, + "id": { + "example": "https://id.gs1.org/01/", + "type": "string", + "format": "uri", + "description": "The globally unique identifier of the registration scheme. The scheme should be registered and discoverable from vocabulary.uncefact.org/identifierSchemes" + }, + "name": { + "example": "Global Trade Identification Number (GTIN)", + "type": "string", + "description": "The name of the identifier scheme. " + } + }, + "description": "An identifier registration scheme for products, facilities, or organisations. Typically operated by a state, national or global authority." + }, + "Facility": { + "type": "object", + "additionalProperties": true, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["Facility"], + "default": ["Facility"], + "items": { + "type": "string", + "enum": ["Facility"] + } + }, + "id": { + "example": "https://id.gs1.org/gln/0614141123452", + "type": "string", + "format": "uri", + "description": "The globally unique ID of the facility as URI, ideally as a resolvable URL." + }, + "registeredId": { + "example": "0614141123452", + "type": "string", + "description": "The registration number (alphanumeric) of the facility within the identifier scheme. Unique within the register." + }, + "description": { + "example": "LiFePO4 Battery plant number 7", + "type": "string", + "description": "An optional short description of the facility" + }, + "name": { + "example": "Example facility 7", + "type": "string", + "description": "The registered name of the facility within the identifier scheme. " + }, + "idScheme": { + "$ref": "#/$defs/IdentifierScheme", + "description": "The ID scheme of the facility. eg a GS1 GLN or a National land registry scheme. If self issued then use the party ID of the facility owner. " + }, + "countryOfOperation": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/CountryId", + "description": "The country in which this facility is operating.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/CountryId\n " + }, + "processCategory": { + "type": "array", + "items": { + "$ref": "#/$defs/Classification" + }, + "description": "The industrial or production processes performed by this facility. Example unstats.un.org/isic/1030." + }, + "operatedByParty": { + "$ref": "#/$defs/Identifier", + "description": "The Party entity responsible for operating the facility.An object structure that uniquely identifies the party within a known party identification scheme. " + }, + "otherIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An optional list of other registered identifiers for this facility - eg GLNs or other schemes." + }, + "address": { + "$ref": "#/$defs/Address", + "description": "The Postal address of the location." + }, + "locationInformation": { + "$ref": "#/$defs/Location", + "description": "Physical location details" + }, + "conformityClaim": { + "type": "array", + "items": { + "$ref": "#/$defs/Claim" + }, + "description": "A list of conformity declarations against specific criteria from recognised standards or regulations. " + } + }, + "description": "The physical site (eg farm or factory) where the product or materials was produced. Including the facility sustainability performance record.", + "required": ["id", "name"] + }, + "Classification": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["Classification"], + "default": ["Classification"], + "items": { + "type": "string", + "enum": ["Classification"] + } + }, + "id": { + "example": "https://unstats.un.org/unsd/classifications/Econ/cpc/46410", + "type": "string", + "format": "uri", + "description": "The globally unique URI representing the specific classifier value" + }, + "code": { + "example": "46410", + "type": "string", + "description": "classification code within the scheme" + }, + "name": { + "example": "Primary cells and primary batteries", + "type": "string", + "description": "Name of the classification represented by the code" + }, + "schemeID": { + "example": "https://unstats.un.org/unsd/classifications/Econ/cpc/", + "type": "string", + "format": "uri", + "description": "Classification scheme ID" + }, + "schemeName": { + "example": "UN Central Product Classification (CPC)", + "type": "string", + "description": "The name of the classification scheme" + } + }, + "description": "A classification scheme and code / name representing a category value for a product, entity, or facility.", + "required": ["id", "name"] + }, + "Address": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["Address"], + "default": ["Address"], + "items": { + "type": "string", + "enum": ["Address"] + } + }, + "streetAddress": { + "example": "level 11, 15 London Circuit", + "type": "string", + "description": "the street address as an unstructured string." + }, + "postalCode": { + "example": "2601", + "type": "string", + "description": "The postal code or zip code for this address." + }, + "addressLocality": { + "example": "Acton", + "type": "string", + "description": "The city, suburb or township name." + }, + "addressRegion": { + "example": "ACT", + "type": "string", + "description": "The state or territory or province" + }, + "addressCountry": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/CountryId", + "description": "The address country as an ISO-3166 two letter country code.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/CountryId\n " + } + }, + "description": "A postal address." + }, + "Location": { + "type": "object", + "additionalProperties": true, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["Location"], + "default": ["Location"], + "items": { + "type": "string", + "enum": ["Location"] + } + }, + "plusCode": { + "example": "https://plus.codes/8CGRC78W+MM", + "type": "string", + "format": "uri", + "description": "An open location code (https://maps.google.com/pluscodes/) representing this geographic location or region. Open location codes can represent any sized area from a point to a large region and are easily resolved to a visual map location. " + }, + "geoLocation": { + "$ref": "#/$defs/Point", + "description": "The latitude and longitude coordinates that best represent the specified location. Using GeoJSON Point notation." + }, + "geoBoundary": { + "$ref": "#/$defs/Polygon", + "description": "The list of ordered coordinates that define a closed area polygon as a location boundary using GeoJSON polygon notation." + } + }, + "description": "Location information including address and geo-location of points, areas, and boundaries" + }, + "Point": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": ["Point"], + "example": "Point", + "description": "" + }, + "coordinates": { + "$ref": "#/$defs/Point3D", + "description": "Coordinates property of type Point3D" + } + }, + "description": "Represents a Point geometry", + "required": ["type"] + }, + "Point3D": { + "description": "Point in 3d space", + "oneOf": [ + { + "type": "array", + "readOnly": true, + "const": ["Point3D"], + "default": ["Point3D"], + "items": { + "type": "string", + "enum": ["Point3D"] + } + }, + { + "type": "array", + "items": { + "type": "number", + "format": "float" + }, + "description": "Array of decimal values" + } + ] + }, + "Polygon": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": ["Polygon"], + "example": "Polygon", + "description": "" + }, + "coordinates": { + "type": "array", + "items": { + "$ref": "#/$defs/Point3DWrapper" + }, + "description": "Array of PolygonCoordinates" + } + }, + "description": "Represents a Polygon geometry", + "required": ["type"] + }, + "Point3DWrapper": { + "description": "", + "oneOf": [ + { + "type": "array", + "readOnly": true, + "const": ["Point3DWrapper"], + "default": ["Point3DWrapper"], + "items": { + "type": "string", + "enum": ["Point3DWrapper"] + } + }, + { + "type": "array", + "items": { + "$ref": "#/$defs/Point3D" + }, + "description": "" + } + ] + }, + "Claim": { + "type": "object", + "additionalProperties": true, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["Claim", "Declaration"], + "default": ["Claim", "Declaration"], + "items": { + "type": "string", + "enum": ["Claim", "Declaration"] + } + }, + "assessmentDate": { + "example": "2024-03-15", + "type": "string", + "format": "date", + "description": "The date on which this assessment was made. " + }, + "id": { + "example": "https://products.example-company.com/09520123456788/declarations/12345", + "type": "string", + "format": "uri", + "description": "A unique identifier for the declaration. Often this will be an extension of the product.id or attestation.id. But could be a UUID." + }, + "referenceStandard": { + "$ref": "#/$defs/Standard", + "description": "The reference to the standard that defines the specification / criteria" + }, + "referenceRegulation": { + "$ref": "#/$defs/Regulation", + "description": "The reference to the regulation that defines the assessment criteria" + }, + "assessmentCriteria": { + "type": "array", + "items": { + "$ref": "#/$defs/Criterion" + }, + "description": "The specification against which the assessment is made." + }, + "declaredValue": { + "type": "array", + "items": { + "$ref": "#/$defs/Metric" + }, + "description": "The list of specific values measured as part of this assessment (eg tensile strength)" + }, + "conformance": { + "example": "true", + "type": "boolean", + "description": "An indicator of whether or not the claim or assesment conforms to the regulatory or standard criteria." + }, + "conformityTopic": { + "type": "string", + "enum": [ + "environment.energy", + "environment.emissions", + "environment.water", + "environment.waste", + "environment.deforestation", + "environment.biodiversity", + "circularity.content", + "circularity.design", + "social.labour", + "social.rights", + "social.community", + "social.safety", + "governance.ethics", + "governance.compliance", + "governance.transparency" + ], + "example": "environment.energy", + "description": "The conformity topic category for this assessment (eg vocabulary.uncefact.org/sustainability/emissions)" + }, + "conformityEvidence": { + "$ref": "#/$defs/SecureLink", + "description": "A binary file that is hashed ()for tamper evidence) and optionally encrypted (for confidentiality)." + } + }, + "description": "A conformity claim about the facility against a specific standard or regulation.", + "required": ["id", "conformance", "conformityTopic"] + }, + "Standard": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["Standard"], + "default": ["Standard"], + "items": { + "type": "string", + "enum": ["Standard"] + } + }, + "id": { + "example": "https://www.globalbattery.org/media/publications/gba-rulebook-v2.0-master.pdf", + "type": "string", + "format": "uri", + "description": "A unique identifier for the standard (eg https://www.iso.org/standard/60857.html)." + }, + "name": { + "example": "GBA Battery Passport Greenhouse Gas Rulebook - V.2.0", + "type": "string", + "description": "The name of the standard" + }, + "issuingParty": { + "$ref": "#/$defs/Identifier", + "description": "The party that issued the standard " + }, + "issueDate": { + "example": "2023-12-05", + "type": "string", + "format": "date", + "description": "The date when the standard was issued." + } + }, + "description": "A standard (eg ISO 14000) that specifies the criteria for conformance.", + "required": ["issuingParty"] + }, + "Regulation": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["Regulation"], + "default": ["Regulation"], + "items": { + "type": "string", + "enum": ["Regulation"] + } + }, + "id": { + "example": "https://www.legislation.gov.au/F2008L02309/latest/versions", + "type": "string", + "format": "uri", + "description": "The globally unique identifier of this regulation. " + }, + "name": { + "example": "NNational Greenhouse and Energy Reporting (Measurement) Determination", + "type": "string", + "description": "The name of the regulation or act." + }, + "jurisdictionCountry": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/CountryId", + "description": "The legal jurisdiction (country) under which the regulation is issued.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/CountryId\n " + }, + "administeredBy": { + "$ref": "#/$defs/Identifier", + "description": "the issuing body of the regulation. For example Australian Government Department of Climate Change, Energy, the Environment and Water" + }, + "effectiveDate": { + "example": "2024-03-20", + "type": "string", + "format": "date", + "description": "the date at which the regulation came into effect." + } + }, + "description": "A regulation (eg EU deforestation regulation) that defines the criteria for assessment.", + "required": ["administeredBy"] + }, + "Criterion": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["Criterion"], + "default": ["Criterion"], + "items": { + "type": "string", + "enum": ["Criterion"] + } + }, + "id": { + "example": "https://www.globalbattery.org/media/publications/gba-rulebook-v2.0-master.pdf#BatteryAssembly", + "type": "string", + "format": "uri", + "description": "A unique identifier for the criterion within the standard or regulation. For example CO2 emissions calculations for liquid fuel combustion." + }, + "name": { + "example": "GBA Battery rule book v2.0 battery assembly guidelines.", + "type": "string", + "description": "A name that describes this criteria." + }, + "thresholdValues": { + "type": "array", + "items": { + "$ref": "#/$defs/Metric" + }, + "description": "A conformity threshold defined by the specification (eg minimum compressive strength) " + } + }, + "description": "A specific rule or criterion within a standard or regulation. eg a carbon intensity calculation rule within an emissions standard.", + "required": ["id", "name"] + }, + "Metric": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["Metric"], + "default": ["Metric"], + "items": { + "type": "string", + "enum": ["Metric"] + } + }, + "metricName": { + "example": "GHG emissions intensity", + "type": "string", + "description": "A human readable name for this metric (for example \"Tensile strength\")" + }, + "metricValue": { + "$ref": "#/$defs/Measure", + "description": "A numeric value and unit of measure for this metric. Could be a measured value or a specified threshold. Eg {\"value\":400, \"unit\":\"MPA\"} as tensile strength of structural steel" + }, + "score": { + "example": "BB", + "type": "string", + "description": "A score or rank associated with this measured metric." + }, + "accuracy": { + "example": 0.05, + "type": "number", + "description": "A percentage represented as a numeric between 0 and 1 indicating the rage of accuracy of the claimed value (eg 0.05 means that the actual value is within 5% of the claimed value.)" + } + }, + "description": "A specific measure of performance against the criteria that governs the claim. Expressed as an array of metric (ie unit of measure) / value (ie the actual numeric value) pairs. ", + "required": ["metricName", "metricValue"] + }, + "Measure": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["Measure"], + "default": ["Measure"], + "items": { + "type": "string", + "enum": ["Measure"] + } + }, + "value": { + "example": 10, + "type": "number", + "description": "The numeric value of the measure" + }, + "unit": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/UnitMeasureCode", + "description": "Unit of measure drawn from the UNECE Rec20 measure code list.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/UnitMeasureCode\n " + } + }, + "description": "The measure class defines a numeric measured value (eg 10) and a coded unit of measure (eg KG).", + "required": ["value", "unit"] + }, + "SecureLink": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "array", + "readOnly": true, + "const": ["SecureLink", "Link"], + "default": ["SecureLink", "Link"], + "items": { + "type": "string", + "enum": ["SecureLink", "Link"] + } + }, + "linkURL": { + "example": "https://files.example-certifier.com/1234567.json", + "type": "string", + "format": "uri", + "description": "The URL of the target resource. " + }, + "linkName": { + "example": "GBA rule book conformity certificate", + "type": "string", + "description": "A display name for the target resource " + }, + "linkType": { + "example": "https://test.uncefact.org/vocabulary/linkTypes/dcc", + "type": "string", + "description": "The type of the target resource - drawn from a controlled vocabulary " + }, + "hashDigest": { + "example": "6239119dda5bd4c8a6ffb832fe16feaa5c27b7dba154d24c53d4470a2c69adc2", + "type": "string", + "description": "The hash of the file." + }, + "hashMethod": { + "type": "string", + "enum": ["SHA-256", "SHA-1"], + "example": "SHA-256", + "description": "The hashing algorithm used to create the target hash. SHA-265 is the recommended standard" + }, + "encryptionMethod": { + "type": "string", + "enum": ["none", "AES"], + "example": "none", + "description": "The symmetric encryption algorithm used to encrypt the link target. AES is the recommended standard. Decryption keys are expected to be passed out of bounds." + } + }, + "description": "A binary file that is hashed ()for tamper evidence) and optionally encrypted (for confidentiality)." + } + } + }, + "data": { + "type": ["Facility"], + "id": "https://id.gs1.org/gln/0614141123452", + "registeredId": "614141123452", + "description": "LiFePO4 Battery plant number 7", + "name": "Example facility 7", + "idScheme": { + "type": ["IdentifierScheme"], + "id": "https://id.gs1.org/01/", + "name": "Global Trade Identification Number (GTIN)" + }, + "countryOfOperation": "AU", + "processCategory": [ + { + "type": ["Classification"], + "id": "https://unstats.un.org/unsd/classifications/Econ/cpc/46410", + "code": "46410", + "name": "Primary cells and primary batteries", + "schemeID": "https://unstats.un.org/unsd/classifications/Econ/cpc/", + "schemeName": "UN Central Product Classification (CPC)" + }, + { + "type": ["Classification"], + "id": "https://unstats.un.org/unsd/classifications/Econ/cpc/46410", + "code": "46410", + "name": "Primary cells and primary batteries", + "schemeID": "https://unstats.un.org/unsd/classifications/Econ/cpc/", + "schemeName": "UN Central Product Classification (CPC)" + } + ], + "operatedByParty": { + "type": ["Identifier"], + "id": "https://id.gs1.org/01/09520123456788/21/12345", + "name": "EV battery 300Ah.", + "registeredId": "90664869327", + "idScheme": { + "type": ["IdentifierScheme"], + "id": "https://id.gs1.org/01/", + "name": "Global Trade Identification Number (GTIN)" + } + }, + "otherIdentifier": [ + { + "type": ["Identifier"], + "id": "https://id.gs1.org/01/09520123456788/21/12345", + "name": "EV battery 300Ah.", + "registeredId": "90664869327", + "idScheme": { + "type": ["IdentifierScheme"], + "id": "https://id.gs1.org/01/", + "name": "Global Trade Identification Number (GTIN)" + } + }, + { + "type": ["Identifier"], + "id": "https://id.gs1.org/01/09520123456788/21/12345", + "name": "EV battery 300Ah.", + "registeredId": "90664869327", + "idScheme": { + "type": ["IdentifierScheme"], + "id": "https://id.gs1.org/01/", + "name": "Global Trade Identification Number (GTIN)" + } + } + ], + "address": { + "streetAddress": "level 11, 15 London Circuit", + "postalCode": "2601", + "addressLocality": "Acton", + "addressRegion": "ACT", + "addressCountry": "AU" + }, + "locationInformation": { + "plusCode": "https://plus.codes/8CGRC78W+MM", + "geoLocation": { + "type": "Point", + "coordinates": [3.141579, 3.141579] + }, + "geoBoundary": { + "type": "Polygon", + "coordinates": [[[3.141579, 3.141579]]] + } + }, + "conformityClaim": [ + { + "type": ["Claim", "Declaration"], + "assessmentDate": "2024-03-15", + "id": "https://products.example-company.com/09520123456788/declarations/12345", + "referenceStandard": { + "type": ["Standard"], + "id": "https://www.globalbattery.org/media/publications/gba-rulebook-v2.0-master.pdf", + "name": "GBA Battery Passport Greenhouse Gas Rulebook - V.2.0", + "issuingParty": { + "type": ["Identifier"], + "id": "https://id.gs1.org/01/09520123456788/21/12345", + "name": "EV battery 300Ah.", + "registeredId": "90664869327", + "idScheme": { + "type": ["IdentifierScheme"], + "id": "https://id.gs1.org/01/", + "name": "Global Trade Identification Number (GTIN)" + } + }, + "issueDate": "2023-12-05" + }, + "referenceRegulation": { + "type": ["Regulation"], + "id": "https://www.legislation.gov.au/F2008L02309/latest/versions", + "name": "NNational Greenhouse and Energy Reporting (Measurement) Determination", + "jurisdictionCountry": "Enumeration Value", + "administeredBy": { + "type": ["Identifier"], + "id": "https://id.gs1.org/01/09520123456788/21/12345", + "name": "EV battery 300Ah.", + "registeredId": "90664869327", + "idScheme": { + "type": ["IdentifierScheme"], + "id": "https://id.gs1.org/01/", + "name": "Global Trade Identification Number (GTIN)" + } + }, + "effectiveDate": "2024-03-20" + }, + "assessmentCriteria": [ + { + "type": ["Criterion"], + "id": "https://www.globalbattery.org/media/publications/gba-rulebook-v2.0-master.pdf#BatteryAssembly", + "name": "GBA Battery rule book v2.0 battery assembly guidelines.", + "thresholdValues": [ + { + "metricName": "GHG emissions intensity", + "metricValue": { + "value": 10, + "unit": "KGM" + }, + "score": "BB", + "accuracy": 0.05 + }, + { + "metricName": "GHG emissions intensity", + "metricValue": { + "value": 10, + "unit": "KGM" + }, + "score": "BB", + "accuracy": 0.05 + } + ] + }, + { + "type": ["Criterion"], + "id": "https://www.globalbattery.org/media/publications/gba-rulebook-v2.0-master.pdf#BatteryAssembly", + "name": "GBA Battery rule book v2.0 battery assembly guidelines.", + "thresholdValues": [ + { + "metricName": "GHG emissions intensity", + "metricValue": { + "value": 10, + "unit": "KGM" + }, + "score": "BB", + "accuracy": 0.05 + }, + { + "metricName": "GHG emissions intensity", + "metricValue": { + "value": 10, + "unit": "KGM" + }, + "score": "BB", + "accuracy": 0.05 + } + ] + } + ], + "declaredValue": [ + { + "metricName": "GHG emissions intensity", + "metricValue": { + "value": 10, + "unit": "KGM" + }, + "score": "BB", + "accuracy": 0.05 + }, + { + "metricName": "GHG emissions intensity", + "metricValue": { + "value": 10, + "unit": "KGM" + }, + "score": "BB", + "accuracy": 0.05 + } + ], + "conformance": true, + "conformityTopic": "environment.emissions", + "conformityEvidence": { + "linkURL": "https://files.example-certifier.com/1234567.json", + "linkName": "GBA rule book conformity certificate", + "linkType": "https://test.uncefact.org/vocabulary/linkTypes/dcc", + "hashDigest": "6239119", + "hashMethod": "SHA-256", + "encryptionMethod": "AES" + } + }, + { + "type": ["Claim", "Declaration"], + "assessmentDate": "2024-03-15", + "id": "https://products.example-company.com/09520123456788/declarations/12345", + "referenceStandard": { + "type": ["Standard"], + "id": "https://www.globalbattery.org/media/publications/gba-rulebook-v2.0-master.pdf", + "name": "GBA Battery Passport Greenhouse Gas Rulebook - V.2.0", + "issuingParty": { + "type": ["Identifier"], + "id": "https://id.gs1.org/01/09520123456788/21/12345", + "name": "EV battery 300Ah.", + "registeredId": "90664869327", + "idScheme": { + "type": ["IdentifierScheme"], + "id": "https://id.gs1.org/01/", + "name": "Global Trade Identification Number (GTIN)" + } + }, + "issueDate": "2023-12-05" + }, + "referenceRegulation": { + "type": ["Regulation"], + "id": "https://www.legislation.gov.au/F2008L02309/latest/versions", + "name": "NNational Greenhouse and Energy Reporting (Measurement) Determination", + "jurisdictionCountry": "Enumeration Value", + "administeredBy": { + "type": ["Identifier"], + "id": "https://id.gs1.org/01/09520123456788/21/12345", + "name": "EV battery 300Ah.", + "registeredId": "90664869327", + "idScheme": { + "type": ["IdentifierScheme"], + "id": "https://id.gs1.org/01/", + "name": "Global Trade Identification Number (GTIN)" + } + }, + "effectiveDate": "2024-03-20" + }, + "assessmentCriteria": [ + { + "type": ["Criterion"], + "id": "https://www.globalbattery.org/media/publications/gba-rulebook-v2.0-master.pdf#BatteryAssembly", + "name": "GBA Battery rule book v2.0 battery assembly guidelines.", + "thresholdValues": [ + { + "metricName": "GHG emissions intensity", + "metricValue": { + "value": 10, + "unit": "KGM" + }, + "score": "BB", + "accuracy": 0.05 + }, + { + "metricName": "GHG emissions intensity", + "metricValue": { + "value": 10, + "unit": "KGM" + }, + "score": "BB", + "accuracy": 0.05 + } + ] + }, + { + "type": ["Criterion"], + "id": "https://www.globalbattery.org/media/publications/gba-rulebook-v2.0-master.pdf#BatteryAssembly", + "name": "GBA Battery rule book v2.0 battery assembly guidelines.", + "thresholdValues": [ + { + "metricName": "GHG emissions intensity", + "metricValue": { + "value": 10, + "unit": "KGM" + }, + "score": "BB", + "accuracy": 0.05 + }, + { + "metricName": "GHG emissions intensity", + "metricValue": { + "value": 10, + "unit": "KGM" + }, + "score": "BB", + "accuracy": 0.05 + } + ] + } + ], + "declaredValue": [ + { + "metricName": "GHG emissions intensity", + "metricValue": { + "value": 10, + "unit": "KGM" + }, + "score": "BB", + "accuracy": 0.05 + }, + { + "metricName": "GHG emissions intensity", + "metricValue": { + "value": 10, + "unit": "KGM" + }, + "score": "BB", + "accuracy": 0.05 + } + ], + "conformance": true, + "conformityTopic": "environment.emissions", + "conformityEvidence": { + "linkURL": "https://files.example-certifier.com/1234567.json", + "linkName": "GBA rule book conformity certificate", + "linkType": "https://test.uncefact.org/vocabulary/linkTypes/dcc", + "hashDigest": "6239119", + "hashMethod": "SHA-256", + "encryptionMethod": "AES" + } + } + ] + }, + "constructData": { + "mappingFields": [], + "dummyFields": [], + "generationFields": [ + { + "path": "/eventID", + "handler": "generateIdWithSerialNumber" + } + ] + }, + "className": "json-form", + "style": { + "margin": "40px auto", + "paddingTop": "40px", + "width": "80%" + } + } + }, + { + "name": "CustomButton", + "type": "Submit", + "props": {} + } + ], + "services": [ + { + "name": "processDigitalFacilityRecord", + "parameters": [ + { + "vckit": { + "vckitAPIUrl": "http://localhost:3332/v2", + "issuer": "did:web:9f91-58-187-62-179.ngrok-free.app" + }, + "digitalFacilityRecord": { + "context": ["https://dpp-json-ld.s3.ap-southeast-2.amazonaws.com/dppld.json"], + "renderTemplate": [ + { + "template": "
Digital Facility Record
", + "@type": "WebRenderingTemplate2022" + } + ], + "type": ["VerifiableCredential", "DigitalFacilityRecord"], + "dlrLinkTitle": "DigitalFacilityRecord", + "dlrIdentificationKeyType": "gln", + "dlrVerificationPage": "http://localhost:3003/verify" + }, + "dlr": { + "dlrAPIUrl": "http://localhost:3000", + "dlrAPIKey": "test123", + "namespace": "gs1", + "linkRegisterPath": "/api/resolver" + }, + "storage": { + "url": "http://localhost:3334/v1/documents", + "params": { + "resultPath": "/uri", + "bucket": "verifiable-credentials" + }, + "options": { + "method": "POST", + "headers": { + "Content-Type": "application/json" + } + } + }, + "identifierKeyPath": "/id" + } + ] + } + ] + }, + { + "name": "Move to Next Facility", + "id": "transaction_product", + "components": [ + { + "name": "LocalStorageLoader", + "type": "EntryData", + "props": { + "storageKey": "CherriesFarm_dpps", + "nestedComponents": [ + { + "name": "JsonForm", + "type": "EntryData", + "props": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "sourceParty": { + "$ref": "#/$defs/Party", + "description": "The source party for this supply chain transaction - typically the seller party" + }, + "destinationParty": { + "$ref": "#/$defs/Party", + "description": "The destination party for this supply chain transaction - typically the buyer party." + }, + "epcList": { + "type": "array", + "items": { "$ref": "#/$defs/Item" }, + "description": "The list of uniquely identified trade items included in this supply chain transaction." + }, + "quantityList": { + "type": "array", + "items": { "$ref": "#/$defs/QuantityElement" }, + "description": "List of quantified product classes that are included in this transaction. Used when the trade items do not have unique identifiers (eg 100 reels of yarn)" + }, + "referenceDocument": { + "$ref": "#/$defs/TradeDocument", + "description": "The supply chain document reference for this transaction event - eg the invoice, order, or dispatch advice" + }, + "eventID": { + "x-jargon-isKey": true, + "type": "string", + "description": "The unique identifier of this event - SHOULD be a UUID" + }, + "eventTime": { + "type": "string", + "format": "date-time", + "description": "The ISO-8601 date time when the event occurred." + }, + "action": { + "type": "string", + "enum": ["observe", "add", "delete"], + "example": "observe", + "description": "Code describing how an event relates to the lifecycle of the entity impacted by the event." + }, + "disposition": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/Disp", + "description": "Disposition code describing the state of the item after the event. \n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/Disp\n " + }, + "bizStep": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/BizStep", + "description": "A business step code drawn from a controlled vocabulary. \n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/BizStep\n " + }, + "bizLocation": { + "type": "string", + "format": "uri", + "description": "A Business Location is a uniquely identified and discretely recorded geospatial location that is meant to designate the specific place where an object is assumed to be following an EPCIS event until it is reported to be at a different Business Location by a subsequent EPCIS event. The bizLocation must be a resolvable URI that links to facility information and geolocation data." + }, + "sensorElementList": { + "type": "array", + "items": { "$ref": "#/$defs/SensorElement" }, + "description": "An array (one for each sensor) of sensor device data sets associated with the event. " + } + }, + "description": "Transaction represents an event in which one or more objects become associated or disassociated with one or more identified business transactions - such as the purchase / shipment of goods between buyer and seller.", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$defs": { + "TransactionEvent": { + "type": "object", + "additionalProperties": false, + "properties": { + "sourceParty": { + "$ref": "#/$defs/Party", + "description": "The source party for this supply chain transaction - typically the seller party" + }, + "destinationParty": { + "$ref": "#/$defs/Party", + "description": "The destination party for this supply chain transaction - typically the buyer party." + }, + "epcList": { + "type": "array", + "items": { "$ref": "#/$defs/Item" }, + "description": "The list of uniquely identified trade items included in this supply chain transaction." + }, + "quantityList": { + "type": "array", + "items": { "$ref": "#/$defs/QuantityElement" }, + "description": "List of quantified product classes that are included in this transaction. Used when the trade items do not have unique identifiers (eg 100 reels of yarn)" + }, + "referenceDocument": { + "$ref": "#/$defs/TradeDocument", + "description": "The supply chain document reference for this transaction event - eg the invoice, order, or dispatch advice" + }, + "eventID": { + "x-jargon-isKey": true, + "readOnly": true, + "type": "string", + "description": "The unique identifier of this event - SHOULD be a UUID" + }, + "eventTime": { + "type": "string", + "format": "date-time", + "description": "The ISO-8601 date time when the event occurred." + }, + "action": { + "type": "string", + "enum": ["observe", "add", "delete"], + "example": "observe", + "description": "Code describing how an event relates to the lifecycle of the entity impacted by the event." + }, + "disposition": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/Disp", + "description": "Disposition code describing the state of the item after the event. \n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/Disp\n " + }, + "bizStep": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/BizStep", + "description": "A business step code drawn from a controlled vocabulary. \n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/BizStep\n " + }, + "bizLocation": { + "type": "string", + "format": "uri", + "description": "A Business Location is a uniquely identified and discretely recorded geospatial location that is meant to designate the specific place where an object is assumed to be following an EPCIS event until it is reported to be at a different Business Location by a subsequent EPCIS event. The bizLocation must be a resolvable URI that links to facility information and geolocation data." + }, + "sensorElementList": { + "type": "array", + "items": { "$ref": "#/$defs/SensorElement" }, + "description": "An array (one for each sensor) of sensor device data sets associated with the event. " + } + }, + "description": "Transaction represents an event in which one or more objects become associated or disassociated with one or more identified business transactions - such as the purchase / shipment of goods between buyer and seller." + }, + "Party": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "string", + "description": "The decentralised identifier of the party - must be a W3C DID." + }, + "name": { + "type": "string", + "description": "The name of the organization or company, represented as a text string." + }, + "identifiers": { + "type": "array", + "items": { "$ref": "#/$defs/Identifier" }, + "description": "A list of unique business identifiers assigned to the party - such as tax registration numbers." + } + }, + "description": "The Party class represents an entity such as an organization, or a company that manufactured the product." + }, + "Identifier": { + "type": "object", + "additionalProperties": false, + "properties": { + "scheme": { + "type": "string", + "format": "uri", + "description": "the identifier scheme as defined by the registrar that manages the identifier registry. If the identifier scheme is registered with UNTP then this URI can use used to dicsover the resolution method (to get more data) and the verification method (to prove ownership)." + }, + "identifierValue": { + "type": "string", + "description": "The value of the identifier within the scheme" + }, + "binding": { + "$ref": "#/$defs/Evidence", + "description": "Link to evidence that attests to the validity and ownership of the identifer. " + } + }, + "description": "An identifier of a party, product, or facility that is defined by an identifier scheme and idenfier value and, optinally, verification evidence " + }, + "Evidence": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": ["w3c_vc", "iso_mdl", "document", "website", "other"], + "example": "w3c_vc", + "description": "Format of the evidence (verifiable credential, document, website, etc)" + }, + "assuranceLevel": { + "type": "string", + "enum": ["Self", "Commercial", "Buyer", "Membership", "Unspecified", "3rdParty"], + "example": "Self", + "description": "The assurance level of the evidence (self declaration, 2nd party, 3rd party, accredited auditor)" + }, + "reference": { + "type": "string", + "format": "uri", + "description": "The URL at which the evidence data can be found. " + } + }, + "description": "Evidence to support a conformity or identity claim. " + }, + "Item": { + "type": "object", + "additionalProperties": false, + "properties": { + "itemID": { + "x-jargon-isKey": true, + "type": "string", + "format": "uri", + "description": "The globally unique identifier (eg GS1 GTIN or digital link) of the product item. " + }, + "name": { + "type": "string", + "description": "The name of the product class to which the product item belongs. " + } + }, + "description": "A specific trade item /product code which could be either a product serial number or a consignment identifier " + }, + "QuantityElement": { + "type": "object", + "additionalProperties": false, + "properties": { + "epcClass": { + "type": "string", + "format": "uri", + "description": "THe identifier of a product class (as opposed to a product instance) such as a GTIN code for a manufactured product." + }, + "quantity": { + "type": "number", + "description": "The numeric quantity of the product class (eg 100 kg of cotton)" + }, + "uom": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/UnitMeasureCode", + "description": "The unit of measure for the quantity value (eg Kg or meters etc) using the UNECE Rec 20 unit of measure codelist.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/UnitMeasureCode\n " + } + }, + "description": "The quantity element is used to define the quantities (eg 100), units of measure (eg Kg) and product class (eg GTIN or other class identifier) of products that are inputs or outputs or the subject of supply chain events. ", + "required": ["quantity"] + }, + "TradeDocument": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/BTT", + "description": "The document type representing the trade transaction drawn from the business transaction type vocabulary.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/BTT\n " + }, + "identifier": { + "type": "string", + "description": "The identifier of the trade transaction document - eg an invoice number or bill of lading number. Must be unique for a given source party" + }, + "documentURL": { + "type": "string", + "format": "uri", + "description": "The URL of the referenced trade document. For integrity reasons, it is recommended (but not required) that the documentURL is a hashlink (https://w3c-ccg.github.io/hashlink/) so that if the document the URL is changed then the hash verification will fail." + } + }, + "description": "A trade transaction between two parties such as an invoice, purchase order, or shipping notification." + }, + "SensorElement": { + "type": "object", + "additionalProperties": false, + "properties": { + "sensorMetadata": { + "$ref": "#/$defs/Sensor", + "description": "Data that describes the physical sensor that recorded the sensor data set." + }, + "sensorReport": { + "type": "array", + "items": { "$ref": "#/$defs/SensorData" }, + "description": "A list of sensor readings from the given sensor relevant to the traceability event context." + }, + "sensorIntegrityProof": { + "type": "string", + "format": "uri", + "description": "An optional reference to a verifiable credential signed by the sensor device or device manufacturer that contains the digitally signed raw data associated with this sensor report." + } + }, + "description": "A SensorElement is used to carry data related to an event that is captured one sensor such as an IoT device. Include one sensor property and an array of sensor data values." + }, + "Sensor": { + "type": "object", + "additionalProperties": false, + "properties": { + "device": { + "$ref": "#/$defs/Item", + "description": "The device Identifier for the sensor as a URI (typically an EPC)" + }, + "dataProcessingMethod": { + "type": "string", + "format": "uri", + "description": "The data processing method used by the sensor - should reference a documented standard criteria as a URI" + } + }, + "description": "A physical sensor that records a sensor data set." + }, + "SensorData": { + "type": "object", + "additionalProperties": false, + "properties": { + "time": { + "type": "string", + "format": "date-time", + "description": "the timestamp at which the sensor reading was made." + }, + "type": { + "type": "string", + "format": "uri", + "description": "the measurement type of the sensor reading, as a URI reference to a measurement method specification." + }, + "value": { "type": "number", "description": "the sensor reading" }, + "uom": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/UnitMeasureCode", + "description": "the unit of measure for the sensor reading\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/UnitMeasureCode\n " + } + }, + "description": "A data point read by a sensor." + } + } + } + }, + "constructData": { + "mappingFields": [ + { + "sourcePath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue", + "destinationPath": "/eventID" + }, + { + "sourcePath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue", + "destinationPath": "/epcList/index/name" + }, + { + "sourcePath": "/linkResolver", + "destinationPath": "/epcList/index/itemID" + } + ], + "dummyFields": [ + { + "path": "/action", + "data": "observe" + }, + { + "path": "/disposition", + "data": "https://ref.gs1.org/cbv/Disp/in_transit" + }, + { + "path": "/bizStep", + "data": "https://ref.gs1.org/cbv/BizStep/receiving" + }, + { + "path": "/bizLocation", + "data": "https://example.com/warehouse" + }, + { + "path": "/sourceParty", + "data": { + "id": "did:web:143f-2406-2d40-4106-2b10-38c6-9732-f2d9-bb1c.ngrok-free.app", + "name": "Cherries Farm", + "identifiers": [ + { + "scheme": "https://example.com/scheme/source", + "identifierValue": "SRC123456", + "binding": { + "type": "w3c_vc", + "assuranceLevel": "3rdParty", + "reference": "https://example.com/source_evidence" + } + } + ] + } + }, + { + "path": "/destinationParty", + "data": { + "id": "did:web:143f-2406-2d40-4106-2b10-38c6-9732-f2d9-bb1c.ngrok-free.app", + "name": "Cherries Processor", + "identifiers": [ + { + "scheme": "https://example.com/scheme/destination", + "identifierValue": "DST7891011", + "binding": { + "type": "w3c_vc", + "assuranceLevel": "3rdParty", + "reference": "https://example.com/destination_evidence" + } + } + ] + } + } + ], + "generationFields": [ + { + "path": "/eventID", + "handler": "generateIdWithSerialNumber" + }, + { + "path": "/eventTime", + "handler": "generateCurrentDatetime" + } + ] + } + } + ] + } + }, + { + "name": "CustomButton", + "type": "Submit", + "props": { + "includeDownload": true, + "downloadFileName": "transaction" + } + } + ], + "services": [ + { + "name": "processTransactionEvent", + "parameters": [ + { + "vckit": { + "vckitAPIUrl": "http://localhost:3332/v2", + "issuer": "did:web:60c5-115-79-212-164.ngrok-free.app" + }, + "epcisTransactionEvent": { + "context": ["https://dpp-json-ld.s3.ap-southeast-2.amazonaws.com/transaction-event-ld.json"], + "renderTemplate": [ + { + "template": "Transaction Event

TRACEABILITY EVENT

Transaction

EVENT ISSUED BY

{{issuer.name}}

{{#each issuer.identifiers}}
Industry
Needs to be replaced...
Business identifier
Needs to be replaced...
Identity verification
{{identiferValue}}
Verifiable credential
{{/each}}

Event description

Event ID
{{credentialSubject.eventID}}
Event type
Needs to be replaced...
Description
Needs to be replaced...
Time and date
{{credentialSubject.eventTime}}
Lifecycle action
{{credentialSubject.action}}
Product disposition
{{credentialSubject.disposition}}
Business step
{{credentialSubject.bizStep}}

Transaction

{{credentialSubject.sourceParty.name}}

SOURCE

{{credentialSubject.sourceParty.identifiers.0.identifierValue}}

Transferred

{{credentialSubject.destinationParty.name}}

DESTINATION

{{credentialSubject.destinationParty.partyID}}

Object list

{{#each credentialSubject.epcList}}

{{name}}

{{itemID}}

Product class name

Sustainability 0%
Confidence 0%
View
{{/each}}

Sensor

{{#each credentialSubject.sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}

{{time}}

Data type

{{value}} {{uom}}

{{/each}}{{sensorIntegrityProof}}
Other evidence
{{/each}}
", + "@type": "WebRenderingTemplate2022" + } + ], + "type": ["TransactionEventCredential"], + "dlrLinkTitle": "Transaction Event", + "dlrIdentificationKeyType": "gtin", + "dlrVerificationPage": "http://localhost:3003/verify" + }, + "dlr": { + "dlrAPIUrl": "http://localhost:3000", + "dlrAPIKey": "test123", + "namespace": "gs1", + "linkRegisterPath": "/api/resolver" + }, + "storage": { + "url": "http://localhost:3334/v1/documents", + "params": { + "resultPath": "/uri", + "bucket": "verifiable-credentials" + }, + "options": { + "method": "POST", + "headers": { + "Content-Type": "application/json" + } + } + }, + "identifierKeyPath": "/eventID", + "localStorageParams": { "storageKey": "CherriesFarm_dpps", "keyPath": "/epcList/index/name" } + } + ] + }, + { + "name": "mergeToLocalStorage", + "parameters": [ + { + "storageKey": "orchard_facility_transaction_event", + "objectKeyPath": "/decodedEnvelopedVC/credentialSubject/eventID" + } + ] + } + ] + } + ] + }, + { + "name": "Packhouse Facility", + "type": "producer", + "assets": { + "logo": "Cherries-farm-logo.webp", + "brandTitle": "Packhouse Facility" + }, + "styles": { + "primaryColor": "#b5651d", + "secondaryColor": "#391561", + "tertiaryColor": "#ffffff" + }, + "features": [ + { + "name": "Issue DPP", + "id": "produce_product", + "components": [ + { + "name": "LocalStorageLoader", + "type": "EntryData", + "props": { + "storageKey": "orchard_facility_transaction_event", + "nestedComponents": [ + { + "name": "JsonForm", + "type": "EntryData", + "props": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "productIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An array of unique identifiers assigned to the product or model. " + }, + "batchIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "Information regarding the specific production batch of the product." + }, + "itemIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An array of identifiers representing a specific serialised item of the product." + }, + "classification": { + "type": "array", + "items": { + "$ref": "#/$defs/Classification" + }, + "description": "A code representing the product's class, typically using the UN CPC (United Nations Central Product Classification) https://unstats.un.org/unsd/classifications/Econ/cpc" + }, + "modelName": { + "type": "string", + "description": "The model name or number of the product, represented as text." + }, + "image": { + "$ref": "#/$defs/BinaryFile", + "description": "A unique identifier (URI) pointing to an image of the product." + }, + "description": { + "type": "string", + "description": "A textual description providing details about the product." + }, + "furtherInformation": { + "type": "string", + "format": "uri", + "description": "A URL pointing to further human readable information about the product." + }, + "manufacturedDate": { + "type": "string", + "format": "date", + "description": "The ISO 8601 date on which the product batch was manufactured." + }, + "dimension": { + "$ref": "#/$defs/Dimension", + "description": "The physical dimensions of the product. Not every dimension is relevant to every products. For example bulk materials may have wieght and volume but not length, with, or height." + }, + "characteristic": { + "$ref": "#/$defs/Characteristic", + "description": "" + }, + "manufacturer": { + "$ref": "#/$defs/Party", + "description": "The Party entity that manufactured the product." + }, + "manufacturedAt": { + "$ref": "#/$defs/Facility", + "description": "The Facility where the product batch was manufactured." + }, + "materialsProvenance": { + "type": "array", + "items": { + "$ref": "#/$defs/Material" + }, + "description": "An array of Provenance objects providing details on the origin and mass fraction of components or ingredients of the product batch." + }, + "conformityClaim": { + "type": "array", + "items": { + "$ref": "#/$defs/Claim" + }, + "description": "An array of claim objects representing various product conformity claims about the product / batch. These can be sustainability claims, circularity claims, or any other claim type within the conformity topic list." + }, + "recyclingInstruction": { + "type": "string", + "format": "uri", + "description": "A URI pointing to information regarding the recycling aspects of the product." + }, + "traceabilityInformation": { + "type": "array", + "items": { + "$ref": "#/$defs/TraceabilityEvent" + }, + "description": "An array of TraceabilityEvent objects detailing EPCIS events related to the traceability of the product batch." + } + }, + "description": "The ProductInformation class encapsulates detailed information regarding a specific product, including its identification details, manufacturer, and other pertinent details.", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$defs": { + "Product": { + "type": "object", + "additionalProperties": false, + "properties": { + "productIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An array of unique identifiers assigned to the product or model. " + }, + "batchIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "Information regarding the specific production batch of the product." + }, + "itemIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An array of identifiers representing a specific serialised item of the product." + }, + "classification": { + "type": "array", + "items": { + "$ref": "#/$defs/Classification" + }, + "description": "A code representing the product's class, typically using the UN CPC (United Nations Central Product Classification) https://unstats.un.org/unsd/classifications/Econ/cpc" + }, + "modelName": { + "type": "string", + "description": "The model name or number of the product, represented as text." + }, + "image": { + "$ref": "#/$defs/BinaryFile", + "description": "A unique identifier (URI) pointing to an image of the product." + }, + "description": { + "type": "string", + "description": "A textual description providing details about the product." + }, + "furtherInformation": { + "type": "string", + "format": "uri", + "description": "A URL pointing to further human readable information about the product." + }, + "manufacturedDate": { + "type": "string", + "format": "date", + "description": "The ISO 8601 date on which the product batch was manufactured." + }, + "dimension": { + "$ref": "#/$defs/Dimension", + "description": "The physical dimensions of the product. Not every dimension is relevant to every products. For example bulk materials may have wieght and volume but not length, with, or height." + }, + "characteristic": { + "$ref": "#/$defs/Characteristic", + "description": "" + }, + "manufacturer": { + "$ref": "#/$defs/Party", + "description": "The Party entity that manufactured the product." + }, + "manufacturedAt": { + "$ref": "#/$defs/Facility", + "description": "The Facility where the product batch was manufactured." + }, + "materialsProvenance": { + "type": "array", + "items": { + "$ref": "#/$defs/Material" + }, + "description": "An array of Provenance objects providing details on the origin and mass fraction of components or ingredients of the product batch." + }, + "conformityClaim": { + "type": "array", + "items": { + "$ref": "#/$defs/Claim" + }, + "description": "An array of claim objects representing various product conformity claims about the product / batch. These can be sustainability claims, circularity claims, or any other claim type within the conformity topic list." + }, + "recyclingInstruction": { + "type": "string", + "format": "uri", + "description": "A URI pointing to information regarding the recycling aspects of the product." + }, + "traceabilityInformation": { + "type": "array", + "items": { + "$ref": "#/$defs/TraceabilityEvent" + }, + "description": "An array of TraceabilityEvent objects detailing EPCIS events related to the traceability of the product batch." + } + }, + "description": "The ProductInformation class encapsulates detailed information regarding a specific product, including its identification details, manufacturer, and other pertinent details." + }, + "Identifier": { + "type": "object", + "additionalProperties": false, + "properties": { + "scheme": { + "type": "string", + "format": "uri", + "description": "the identifier scheme as defined by the registrar that manages the identifier registry. If the identifier scheme is registered with UNTP then this URI can use used to dicsover the resolution method (to get more data) and the verification method (to prove ownership)." + }, + "identifierValue": { + "type": "string", + "description": "The value of the identifier within the scheme" + }, + "binding": { + "$ref": "#/$defs/Evidence", + "description": "Link to evidence that attests to the validity and ownership of the identifer. " + } + }, + "description": "An identifier of a party, product, or facility that is defined by an identifier scheme and idenfier value and, optinally, verification evidence " + }, + "Evidence": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": ["w3c_vc", "iso_mdl", "document", "website", "other"], + "example": "w3c_vc", + "description": "Format of the evidence (verifiable credential, document, website, etc)" + }, + "assuranceLevel": { + "type": "string", + "enum": ["Self", "Commercial", "Buyer", "Membership", "Unspecified", "3rdParty"], + "example": "Self", + "description": "The assurance level of the evidence (self declaration, 2nd party, 3rd party, accredited auditor)" + }, + "reference": { + "type": "string", + "format": "uri", + "description": "The URL at which the evidence data can be found. " + } + }, + "description": "Evidence to support a conformity or identity claim. " + }, + "Classification": { + "type": "object", + "additionalProperties": false, + "properties": { + "scheme": { + "type": "string", + "format": "uri", + "description": "Classification scheme - eg https://unstats.un.org/unsd/classifications/Econ/cpc " + }, + "classifierValue": { + "type": "string", + "description": "classifier value within the scheme - eg \"01211\" in UN CPC" + }, + "classifierName": { + "type": "string", + "description": "Name of the classifier - eg \"Asparagus\" for code \"01211\" in UNCPC" + }, + "classifierURL": { + "type": "string", + "format": "uri", + "description": "Linked data URL to a web vocabulary entery for this classificaiton code. When this property is provided, the scheme, value, and name properties of the classifer are not required. eg https://vocabulary.uncefact.org/unlocode#AUBNE represensign the port of Brisbane in the UN/LOCODE classification scheme." + } + }, + "description": "A classification scheme and code / name representing a category value for a product, entity, or facility." + }, + "BinaryFile": { + "type": "object", + "additionalProperties": false, + "properties": { + "fileHash": { + "x-jargon-isKey": true, + "type": "string", + "description": "The MD5 hash of the file." + }, + "fileLocation": { + "type": "string", + "format": "uri", + "description": "The location of the evidence file." + }, + "fileType": { + "type": "string", + "x-external-enumeration": "https://mimetype.io/all-types", + "description": "The type of file, represented as a MIME type.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://mimetype.io/all-types\n " + } + }, + "description": "A file representing a data snapshot that is used to infomr the conformity assessment." + }, + "Dimension": { + "type": "object", + "additionalProperties": false, + "properties": { + "weight": { + "$ref": "#/$defs/Measure", + "description": "the weight of the product" + }, + "length": { + "$ref": "#/$defs/Measure", + "description": "The length of the product or packaging" + }, + "width": { + "$ref": "#/$defs/Measure", + "description": "The width of the product or packaging" + }, + "height": { + "$ref": "#/$defs/Measure", + "description": "The height of the product or packaging" + }, + "volume": { + "$ref": "#/$defs/Measure", + "description": "The displacement volume of the product." + } + }, + "description": "Overall (length, width, height) dimensions and weight/volume of an item." + }, + "Measure": { + "type": "object", + "additionalProperties": false, + "properties": { + "value": { + "type": "number", + "description": "The numeric value of the measure" + }, + "unit": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/UnitMeasureCode", + "description": "Unit of measure drawn from the UNECE rec20 measure code list.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/UnitMeasureCode\n " + } + }, + "description": "The measure class defines a numeric measured value (eg 10) and a coded unit of measure (eg KG)." + }, + "Characteristic": { + "type": "object", + "additionalProperties": false, + "properties": {}, + "description": "Product specific characteristics. This class is an extension point for industry specific product characteristics or performance information such as clothing size or battery capacity." + }, + "Party": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "string", + "description": "The decentralised identifier of the party - must be a W3C DID." + }, + "name": { + "type": "string", + "description": "The name of the organization or company, represented as a text string." + }, + "identifiers": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "A list of unique business identifiers assigned to the party - such as tax registration numbers." + } + }, + "description": "The Party class represents an entity such as an organization, or a company that manufactured the product." + }, + "Facility": { + "type": "object", + "additionalProperties": false, + "properties": { + "identifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "A unique identifier (URI) assigned to the facility. (Link Resolver - GS1 GLN?)" + }, + "name": { + "type": "string", + "description": "The name of the facility, represented as a text string." + }, + "location": { + "type": "string", + "format": "uri", + "description": "" + }, + "operatedBy": { + "$ref": "#/$defs/Party", + "description": "The Party entity responsible for operating the facility." + } + }, + "description": "The physical site (eg farm or factory) where the product or materials was produced." + }, + "Material": { + "type": "object", + "additionalProperties": false, + "properties": { + "originCountry": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/CountryId", + "description": "A ISO 3166-1 code representing the country of origin of the component or ingredient.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/CountryId\n " + }, + "materialType": { + "$ref": "#/$defs/Classification", + "description": "The type of this material - as a value drawn from a controlled vocabulary eg textileexchange.org/materials/rm01014 - representing organic cotton." + }, + "massFraction": { + "type": "number", + "description": "A numeric value representing the mass fraction of the product represented by this material. The sum of all mass fraction values for a given passport should be 100." + }, + "recycled": { + "type": "boolean", + "description": "Indicator is true if this material input is from a recycled source." + }, + "hazardous": { + "type": "boolean", + "description": "Indicates whether this material is hazardous. If true then " + } + }, + "description": "The material class encapsulates details about the origin or source of raw materials in a product, including the country of origin and the mass fraction." + }, + "Claim": { + "type": "object", + "additionalProperties": false, + "properties": { + "topic": { + "type": "string", + "enum": [ + "environment.energy", + "environment.emissions", + "environment.water", + "environment.waste", + "environment.deforestation", + "environment.biodiversity", + "circularity.content", + "circularity.design", + "social.labour", + "social.rights", + "social.community", + "social.safety", + "governance.ethics", + "governance.compliance", + "governance.transparency" + ], + "example": "environment.energy", + "description": "A code representing the topic of the sustainability claim. E.g. environment.deforestation, environment.ghg-emission-intensity, etc.. Drawn from a standard code list. " + }, + "standardOrRegulation": { + "type": "string", + "format": "uri", + "description": "The standard or regulation against which this conformity claim is made. Expressed as a URI and should match a value in the UN catalogue of reference vocabularies. " + }, + "criteriaReference": { + "type": "string", + "format": "uri", + "description": "A URI pointing to the specific criteria within the standard or regulation against which this claim is made." + }, + "claimedValues": { + "type": "array", + "items": { + "$ref": "#/$defs/Metric" + }, + "description": "One or more actual measures supporting the claim. For example for GHG emissions there may be a metric for total emissions intensity and also a metric for amount of offsets included." + }, + "benchmarkValue": { + "$ref": "#/$defs/Metric", + "description": "A benchmark value against which the claimed value can be assessed. THis could be a value specified by a standard or regulation or could be an industry benchmark." + }, + "benchmarkReference": { + "type": "string", + "format": "uri", + "description": "A refernce to evidence to support the benchmark value." + }, + "conformance": { + "type": "boolean", + "description": "and indicator (boolean) that expresses whether or not this product has achieved compliance against the criteria. for example, if the topic is environment.deforstation and the criteria is EU.2023.1115 then the product is conformant if it has not touched any facility throughout it's lifecycle that is not deforestation free since dec 2020." + }, + "conformityEvidence": { + "$ref": "#/$defs/Evidence", + "description": "A URI pointing to the evidence supporting the claim. Most likely in the form of a verifiable credential." + } + }, + "description": "The SustainabilityClaim class represents specific claims regarding the sustainability of a product, providing details about the metrics, thresholds, and evidences supporting the claim." + }, + "Metric": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "description": "A human readable name for this metric" + }, + "value": { + "$ref": "#/$defs/Measure", + "description": "A numeric value representing the measurement or evaluation outcome for the claim." + }, + "accuracy": { + "type": "number", + "description": "A percentage represented as a numeric between 0 and 1 indicating the rage of accuracy of the claimed value (eg 0.05 means that the actual value is within 5% of the claimed value.)" + } + }, + "description": "A specific measure of performance against the criteria that governs the claim. Expressed as an array of metric (ie unit of emasure) / value (ie the actual numeric value) pairs. " + }, + "TraceabilityEvent": { + "type": "object", + "additionalProperties": false, + "properties": { + "eventReference": { + "type": "string", + "format": "uri", + "description": "A URI pointing to the detailed information about the EPCIS event. Most likely in the form of a verifiable credential." + }, + "eventType": { + "type": "string", + "enum": ["aggregation", "transformation", "object", "transaction", "association"], + "example": "aggregation", + "description": "A code representing the type of EPCIS event. ObjectEvent, AggregationEvent, TransactionEvent, TransformationEvent, ObjectEvent." + } + }, + "description": "The TraceabilityEvent class represents a specific EPCIS event in the traceability chain of a product, including details about the event type and reference." + } + } + }, + "data": { + "image": "data:image/jpg;base64,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", + "productIdentifier": [ + { + "scheme": "https://id.gs1.org/gtin", + "identifierValue": "0105012345678900", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://id.gs1.org/gtin/05012345678900/binding" + } + } + ], + "batchIdentifier": [ + { + "scheme": "https://Cherriesfarm.example.org/batch", + "identifierValue": "BATCH-2024-001", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://Cherriesfarm.example.org/batch/2024-001/binding" + } + } + ], + "itemIdentifier": [ + { + "scheme": "https://Cherriesfarm.example.org/item", + "identifierValue": "TRF-24-0001", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://Cherriesfarm.example.org/item/TRF-24-0001/binding" + } + } + ], + "classification": [ + { + "scheme": "https://www.unspsc.org", + "classifierValue": "50383710", + "classifierName": "Cherriess", + "classifierURL": "https://www.unspsc.org/search-code/50383710" + } + ], + "modelName": "Black Cherries", + "description": "Premium Black Cherriess harvested from our sustainable Cherries orchards.", + "furtherInformation": "https://Cherriesfarm.example.org/products/black_perigord", + "manufacturedDate": "2024-01-15", + "dimension": { + "weight": { "value": 50, "unit": "GRM" } + }, + "materialsProvenance": [ + { + "originCountry": "AU", + "materialType": { + "scheme": "https://www.gs1.org/gpc", + "classifierValue": "10005953", + "classifierName": "Cherriess (Fresh)", + "classifierURL": "https://www.gs1.org/gpc/10005953" + }, + "massFraction": 100, + "recycled": false, + "hazardous": false + } + ], + "characteristic": { + "variety": "Tuber melanosporum", + "grade": "Extra", + "aroma": "Intense, earthy", + "flavor": "Rich, complex" + }, + "manufacturer": { + "id": "did:example:123456789abcdefghi", + "name": "Gourmet Cherries Farm", + "identifiers": [ + { + "scheme": "https://identifier.example.org/company", + "identifierValue": "COMP-12345", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://identifier.example.org/company/12345/binding" + } + } + ] + }, + "manufacturedAt": { + "identifier": [ + { + "scheme": "https://identifier.example.org/facility", + "identifierValue": "FAC-5678", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://identifier.example.org/facility/5678/binding" + } + } + ], + "name": "Cherries Orchard", + "location": "https://Cherriesfarm.example.org/locations/perigord_orchard", + "operatedBy": { + "id": "did:example:123456789abcdefghi", + "name": "Gourmet Cherries Farm", + "identifiers": [ + { + "scheme": "https://identifier.example.org/company", + "identifierValue": "COMP-12345", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://identifier.example.org/company/12345/binding" + } + } + ] + } + } + }, + "className": "json-form", + "style": { + "margin": "40px auto", + "paddingTop": "40px", + "width": "80%" + } + }, + "constructData": { + "mappingFields": [ + { + "sourcePath": "/linkResolver", + "destinationPath": "/traceabilityInformation/0/eventReference" + } + ], + "dummyFields": [ + { + "path": "/traceabilityInformation/0/eventType", + "data": "transaction" + } + ], + "generationFields": [] + } + } + ] + } + }, + { + "name": "CustomButton", + "type": "Submit", + "props": {} + } + ], + "services": [ + { + "name": "processDPP", + "parameters": [ + { + "vckit": { + "vckitAPIUrl": "http://localhost:3332/v2", + "issuer": "did:web:60c5-115-79-212-164.ngrok-free.app" + }, + "dpp": { + "context": ["https://dpp-json-ld.s3.ap-southeast-2.amazonaws.com/dppld.json"], + "renderTemplate": [ + { + "template": " Digital Product Passport

PRODUCT PASSPORT

{{credentialSubject.modelName}}

{{#each credentialSubject.batchIdentifier}} {{/each}} {{#each credentialSubject.productIdentifier}} {{/each}}

Sustainability

100%

Confidence

100%

PASSPORT ISSUED BY

{{issuer.name}}

Industry

Agriculture

Business identifier
75 859 224 235
Location
Rooty Hill, NSW
Identity verification
75 859 224 235
Other evidence

Conformity credentials

Conformity credentials are usually issued by independent third parties and provide a trusted assessment of product ESG performance against credible standards or regulations

{{#each credentialSubject.conformityClaim}}

{{topic}}

{{!-- {{#if (eq conformityEvidence.type 'w3c_vc')}} --}}
Verifiable credential
{{!-- {{/if}} --}}

View details

{{/each}}

Product composition

A complete list of materials that make up the composition of this product.

{{#each credentialSubject.materialsProvenance}}

{{massFraction}}%

ID {{materialType.classifierValue}}

{{materialType.classifierName}}

{{#if recycled}}

Recycled

{{/if}} {{#if hazardous}}

Hazard

{{/if}}
{{originCountry}}
{{/each}}

Product information

Harvest Date

{{credentialSubject.manufacturedDate}}

Batch No.

{{credentialSubject.batchIdentifier.0.identifierValue}}

Weight

{{credentialSubject.dimension.weight.value}}{{credentialSubject.dimension.weight.unit}}

Description

{{credentialSubject.description}}

", + "@type": "WebRenderingTemplate2022" + } + ], + "type": ["VerifiableCredential", "DigitalProductPassport"], + "dlrLinkTitle": "Cherries Product Passport", + "dlrIdentificationKeyType": "gtin", + "dlrVerificationPage": "http://localhost:3003/verify" + }, + "dlr": { + "dlrAPIUrl": "http://localhost:3000", + "dlrAPIKey": "test123", + "namespace": "gs1", + "linkRegisterPath": "/api/resolver" + }, + "storage": { + "url": "http://localhost:3334/v1/documents", + "params": { + "resultPath": "/uri", + "bucket": "verifiable-credentials" + }, + "options": { + "method": "POST", + "headers": { + "Content-Type": "application/json" + } + } + }, + "identifierKeyPath": "/productIdentifier/0/identifierValue" + } + ] + }, + { + "name": "mergeToLocalStorage", + "parameters": [ + { + "storageKey": "CherriesFarm_dpps", + "objectKeyPath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue" + } + ] + } + ] + }, + { + "name": "Move to Next Facility", + "id": "transaction_product", + "components": [ + { + "name": "LocalStorageLoader", + "type": "EntryData", + "props": { + "storageKey": "CherriesFarm_dpps", + "nestedComponents": [ + { + "name": "JsonForm", + "type": "EntryData", + "props": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "sourceParty": { + "$ref": "#/$defs/Party", + "description": "The source party for this supply chain transaction - typically the seller party" + }, + "destinationParty": { + "$ref": "#/$defs/Party", + "description": "The destination party for this supply chain transaction - typically the buyer party." + }, + "epcList": { + "type": "array", + "items": { "$ref": "#/$defs/Item" }, + "description": "The list of uniquely identified trade items included in this supply chain transaction." + }, + "quantityList": { + "type": "array", + "items": { "$ref": "#/$defs/QuantityElement" }, + "description": "List of quantified product classes that are included in this transaction. Used when the trade items do not have unique identifiers (eg 100 reels of yarn)" + }, + "referenceDocument": { + "$ref": "#/$defs/TradeDocument", + "description": "The supply chain document reference for this transaction event - eg the invoice, order, or dispatch advice" + }, + "eventID": { + "x-jargon-isKey": true, + "readOnly": true, + "type": "string", + "description": "The unique identifier of this event - SHOULD be a UUID" + }, + "eventTime": { + "type": "string", + "format": "date-time", + "description": "The ISO-8601 date time when the event occurred." + }, + "action": { + "type": "string", + "enum": ["observe", "add", "delete"], + "example": "observe", + "description": "Code describing how an event relates to the lifecycle of the entity impacted by the event." + }, + "disposition": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/Disp", + "description": "Disposition code describing the state of the item after the event. \n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/Disp\n " + }, + "bizStep": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/BizStep", + "description": "A business step code drawn from a controlled vocabulary. \n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/BizStep\n " + }, + "bizLocation": { + "type": "string", + "format": "uri", + "description": "A Business Location is a uniquely identified and discretely recorded geospatial location that is meant to designate the specific place where an object is assumed to be following an EPCIS event until it is reported to be at a different Business Location by a subsequent EPCIS event. The bizLocation must be a resolvable URI that links to facility information and geolocation data." + }, + "sensorElementList": { + "type": "array", + "items": { "$ref": "#/$defs/SensorElement" }, + "description": "An array (one for each sensor) of sensor device data sets associated with the event. " + } + }, + "description": "Transaction represents an event in which one or more objects become associated or disassociated with one or more identified business transactions - such as the purchase / shipment of goods between buyer and seller.", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$defs": { + "TransactionEvent": { + "type": "object", + "additionalProperties": false, + "properties": { + "sourceParty": { + "$ref": "#/$defs/Party", + "description": "The source party for this supply chain transaction - typically the seller party" + }, + "destinationParty": { + "$ref": "#/$defs/Party", + "description": "The destination party for this supply chain transaction - typically the buyer party." + }, + "epcList": { + "type": "array", + "items": { "$ref": "#/$defs/Item" }, + "description": "The list of uniquely identified trade items included in this supply chain transaction." + }, + "quantityList": { + "type": "array", + "items": { "$ref": "#/$defs/QuantityElement" }, + "description": "List of quantified product classes that are included in this transaction. Used when the trade items do not have unique identifiers (eg 100 reels of yarn)" + }, + "referenceDocument": { + "$ref": "#/$defs/TradeDocument", + "description": "The supply chain document reference for this transaction event - eg the invoice, order, or dispatch advice" + }, + "eventID": { + "x-jargon-isKey": true, + "readOnly": true, + "type": "string", + "description": "The unique identifier of this event - SHOULD be a UUID" + }, + "eventTime": { + "type": "string", + "format": "date-time", + "description": "The ISO-8601 date time when the event occurred." + }, + "action": { + "type": "string", + "enum": ["observe", "add", "delete"], + "example": "observe", + "description": "Code describing how an event relates to the lifecycle of the entity impacted by the event." + }, + "disposition": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/Disp", + "description": "Disposition code describing the state of the item after the event. \n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/Disp\n " + }, + "bizStep": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/BizStep", + "description": "A business step code drawn from a controlled vocabulary. \n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/BizStep\n " + }, + "bizLocation": { + "type": "string", + "format": "uri", + "description": "A Business Location is a uniquely identified and discretely recorded geospatial location that is meant to designate the specific place where an object is assumed to be following an EPCIS event until it is reported to be at a different Business Location by a subsequent EPCIS event. The bizLocation must be a resolvable URI that links to facility information and geolocation data." + }, + "sensorElementList": { + "type": "array", + "items": { "$ref": "#/$defs/SensorElement" }, + "description": "An array (one for each sensor) of sensor device data sets associated with the event. " + } + }, + "description": "Transaction represents an event in which one or more objects become associated or disassociated with one or more identified business transactions - such as the purchase / shipment of goods between buyer and seller." + }, + "Party": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "string", + "description": "The decentralised identifier of the party - must be a W3C DID." + }, + "name": { + "type": "string", + "description": "The name of the organization or company, represented as a text string." + }, + "identifiers": { + "type": "array", + "items": { "$ref": "#/$defs/Identifier" }, + "description": "A list of unique business identifiers assigned to the party - such as tax registration numbers." + } + }, + "description": "The Party class represents an entity such as an organization, or a company that manufactured the product." + }, + "Identifier": { + "type": "object", + "additionalProperties": false, + "properties": { + "scheme": { + "type": "string", + "format": "uri", + "description": "the identifier scheme as defined by the registrar that manages the identifier registry. If the identifier scheme is registered with UNTP then this URI can use used to dicsover the resolution method (to get more data) and the verification method (to prove ownership)." + }, + "identifierValue": { + "type": "string", + "description": "The value of the identifier within the scheme" + }, + "binding": { + "$ref": "#/$defs/Evidence", + "description": "Link to evidence that attests to the validity and ownership of the identifer. " + } + }, + "description": "An identifier of a party, product, or facility that is defined by an identifier scheme and idenfier value and, optinally, verification evidence " + }, + "Evidence": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": ["w3c_vc", "iso_mdl", "document", "website", "other"], + "example": "w3c_vc", + "description": "Format of the evidence (verifiable credential, document, website, etc)" + }, + "assuranceLevel": { + "type": "string", + "enum": ["Self", "Commercial", "Buyer", "Membership", "Unspecified", "3rdParty"], + "example": "Self", + "description": "The assurance level of the evidence (self declaration, 2nd party, 3rd party, accredited auditor)" + }, + "reference": { + "type": "string", + "format": "uri", + "description": "The URL at which the evidence data can be found. " + } + }, + "description": "Evidence to support a conformity or identity claim. " + }, + "Item": { + "type": "object", + "additionalProperties": false, + "properties": { + "itemID": { + "x-jargon-isKey": true, + "type": "string", + "format": "uri", + "description": "The globally unique identifier (eg GS1 GTIN or digital link) of the product item. " + }, + "name": { + "type": "string", + "description": "The name of the product class to which the product item belongs. " + } + }, + "description": "A specific trade item /product code which could be either a product serial number or a consignment identifier " + }, + "QuantityElement": { + "type": "object", + "additionalProperties": false, + "properties": { + "epcClass": { + "type": "string", + "format": "uri", + "description": "THe identifier of a product class (as opposed to a product instance) such as a GTIN code for a manufactured product." + }, + "quantity": { + "type": "number", + "description": "The numeric quantity of the product class (eg 100 kg of cotton)" + }, + "uom": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/UnitMeasureCode", + "description": "The unit of measure for the quantity value (eg Kg or meters etc) using the UNECE Rec 20 unit of measure codelist.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/UnitMeasureCode\n " + } + }, + "description": "The quantity element is used to define the quantities (eg 100), units of measure (eg Kg) and product class (eg GTIN or other class identifier) of products that are inputs or outputs or the subject of supply chain events. ", + "required": ["quantity"] + }, + "TradeDocument": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/BTT", + "description": "The document type representing the trade transaction drawn from the business transaction type vocabulary.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/BTT\n " + }, + "identifier": { + "type": "string", + "description": "The identifier of the trade transaction document - eg an invoice number or bill of lading number. Must be unique for a given source party" + }, + "documentURL": { + "type": "string", + "format": "uri", + "description": "The URL of the referenced trade document. For integrity reasons, it is recommended (but not required) that the documentURL is a hashlink (https://w3c-ccg.github.io/hashlink/) so that if the document the URL is changed then the hash verification will fail." + } + }, + "description": "A trade transaction between two parties such as an invoice, purchase order, or shipping notification." + }, + "SensorElement": { + "type": "object", + "additionalProperties": false, + "properties": { + "sensorMetadata": { + "$ref": "#/$defs/Sensor", + "description": "Data that describes the physical sensor that recorded the sensor data set." + }, + "sensorReport": { + "type": "array", + "items": { "$ref": "#/$defs/SensorData" }, + "description": "A list of sensor readings from the given sensor relevant to the traceability event context." + }, + "sensorIntegrityProof": { + "type": "string", + "format": "uri", + "description": "An optional reference to a verifiable credential signed by the sensor device or device manufacturer that contains the digitally signed raw data associated with this sensor report." + } + }, + "description": "A SensorElement is used to carry data related to an event that is captured one sensor such as an IoT device. Include one sensor property and an array of sensor data values." + }, + "Sensor": { + "type": "object", + "additionalProperties": false, + "properties": { + "device": { + "$ref": "#/$defs/Item", + "description": "The device Identifier for the sensor as a URI (typically an EPC)" + }, + "dataProcessingMethod": { + "type": "string", + "format": "uri", + "description": "The data processing method used by the sensor - should reference a documented standard criteria as a URI" + } + }, + "description": "A physical sensor that records a sensor data set." + }, + "SensorData": { + "type": "object", + "additionalProperties": false, + "properties": { + "time": { + "type": "string", + "format": "date-time", + "description": "the timestamp at which the sensor reading was made." + }, + "type": { + "type": "string", + "format": "uri", + "description": "the measurement type of the sensor reading, as a URI reference to a measurement method specification." + }, + "value": { "type": "number", "description": "the sensor reading" }, + "uom": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/UnitMeasureCode", + "description": "the unit of measure for the sensor reading\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/UnitMeasureCode\n " + } + }, + "description": "A data point read by a sensor." + } + } + } + }, + "constructData": { + "mappingFields": [ + { + "sourcePath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue", + "destinationPath": "/eventID" + }, + { + "sourcePath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue", + "destinationPath": "/epcList/index/name" + }, + { + "sourcePath": "/linkResolver", + "destinationPath": "/epcList/index/itemID" + } + ], + "dummyFields": [ + { + "path": "/action", + "data": "observe" + }, + { + "path": "/disposition", + "data": "https://ref.gs1.org/cbv/Disp/in_transit" + }, + { + "path": "/bizStep", + "data": "https://ref.gs1.org/cbv/BizStep/receiving" + }, + { + "path": "/bizLocation", + "data": "https://example.com/warehouse" + }, + { + "path": "/sourceParty", + "data": { + "id": "did:web:143f-2406-2d40-4106-2b10-38c6-9732-f2d9-bb1c.ngrok-free.app", + "name": "Cherries Farm", + "identifiers": [ + { + "scheme": "https://example.com/scheme/source", + "identifierValue": "SRC123456", + "binding": { + "type": "w3c_vc", + "assuranceLevel": "3rdParty", + "reference": "https://example.com/source_evidence" + } + } + ] + } + }, + { + "path": "/destinationParty", + "data": { + "id": "did:web:143f-2406-2d40-4106-2b10-38c6-9732-f2d9-bb1c.ngrok-free.app", + "name": "Cherries Processor", + "identifiers": [ + { + "scheme": "https://example.com/scheme/destination", + "identifierValue": "DST7891011", + "binding": { + "type": "w3c_vc", + "assuranceLevel": "3rdParty", + "reference": "https://example.com/destination_evidence" + } + } + ] + } + } + ], + "generationFields": [ + { + "path": "/eventID", + "handler": "generateIdWithSerialNumber" + }, + { + "path": "/eventTime", + "handler": "generateCurrentDatetime" + } + ] + } + } + ] + } + }, + { + "name": "CustomButton", + "type": "Submit", + "props": { + "includeDownload": true, + "downloadFileName": "transaction" + } + } + ], + "services": [ + { + "name": "processTransactionEvent", + "parameters": [ + { + "vckit": { + "vckitAPIUrl": "http://localhost:3332/v2", + "issuer": "did:web:60c5-115-79-212-164.ngrok-free.app" + }, + "epcisTransactionEvent": { + "context": ["https://dpp-json-ld.s3.ap-southeast-2.amazonaws.com/transaction-event-ld.json"], + "renderTemplate": [ + { + "template": "Transaction Event

TRACEABILITY EVENT

Transaction

EVENT ISSUED BY

{{issuer.name}}

{{#each issuer.identifiers}}
Industry
Needs to be replaced...
Business identifier
Needs to be replaced...
Identity verification
{{identiferValue}}
Verifiable credential
{{/each}}

Event description

Event ID
{{credentialSubject.eventID}}
Event type
Needs to be replaced...
Description
Needs to be replaced...
Time and date
{{credentialSubject.eventTime}}
Lifecycle action
{{credentialSubject.action}}
Product disposition
{{credentialSubject.disposition}}
Business step
{{credentialSubject.bizStep}}

Transaction

{{credentialSubject.sourceParty.name}}

SOURCE

{{credentialSubject.sourceParty.identifiers.0.identifierValue}}

Transferred

{{credentialSubject.destinationParty.name}}

DESTINATION

{{credentialSubject.destinationParty.partyID}}

Object list

{{#each credentialSubject.epcList}}

{{name}}

{{itemID}}

Product class name

Sustainability 0%
Confidence 0%
View
{{/each}}

Sensor

{{#each credentialSubject.sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}

{{time}}

Data type

{{value}} {{uom}}

{{/each}}{{sensorIntegrityProof}}
Other evidence
{{/each}}
", + "@type": "WebRenderingTemplate2022" + } + ], + "type": ["TransactionEventCredential"], + "dlrLinkTitle": "Transaction Event", + "dlrIdentificationKeyType": "gtin", + "dlrVerificationPage": "http://localhost:3003/verify" + }, + "dlr": { + "dlrAPIUrl": "http://localhost:3000", + "dlrAPIKey": "test123", + "namespace": "gs1", + "linkRegisterPath": "/api/resolver" + }, + "storage": { + "url": "http://localhost:3334/v1/documents", + "params": { + "resultPath": "/uri", + "bucket": "verifiable-credentials" + }, + "options": { + "method": "POST", + "headers": { + "Content-Type": "application/json" + } + } + }, + "identifierKeyPath": "/eventID", + "localStorageParams": { "storageKey": "CherriesFarm_dpps", "keyPath": "/epcList/index/name" } + } + ] + }, + { + "name": "mergeToLocalStorage", + "parameters": [ + { + "storageKey": "packhouse_facility_transaction_event", + "objectKeyPath": "/decodedEnvelopedVC/credentialSubject/eventID" + } + ] + } + ] + } + ] + }, + { + "name": "Fumigation and Freight Forwarding Facility", + "type": "producer", + "assets": { + "logo": "Cherries-farm-logo.webp", + "brandTitle": "Fumigation and Freight Forwarding Facility" + }, + "styles": { + "primaryColor": "#b5651d", + "secondaryColor": "#391561", + "tertiaryColor": "#ffffff" + }, + "features": [ + { + "name": "Issue DPP", + "id": "produce_product", + "components": [ + { + "name": "LocalStorageLoader", + "type": "EntryData", + "props": { + "storageKey": "packhouse_facility_transaction_event", + "nestedComponents": [ + { + "name": "JsonForm", + "type": "EntryData", + "props": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "productIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An array of unique identifiers assigned to the product or model. " + }, + "batchIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "Information regarding the specific production batch of the product." + }, + "itemIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An array of identifiers representing a specific serialised item of the product." + }, + "classification": { + "type": "array", + "items": { + "$ref": "#/$defs/Classification" + }, + "description": "A code representing the product's class, typically using the UN CPC (United Nations Central Product Classification) https://unstats.un.org/unsd/classifications/Econ/cpc" + }, + "modelName": { + "type": "string", + "description": "The model name or number of the product, represented as text." + }, + "image": { + "$ref": "#/$defs/BinaryFile", + "description": "A unique identifier (URI) pointing to an image of the product." + }, + "description": { + "type": "string", + "description": "A textual description providing details about the product." + }, + "furtherInformation": { + "type": "string", + "format": "uri", + "description": "A URL pointing to further human readable information about the product." + }, + "manufacturedDate": { + "type": "string", + "format": "date", + "description": "The ISO 8601 date on which the product batch was manufactured." + }, + "dimension": { + "$ref": "#/$defs/Dimension", + "description": "The physical dimensions of the product. Not every dimension is relevant to every products. For example bulk materials may have wieght and volume but not length, with, or height." + }, + "characteristic": { + "$ref": "#/$defs/Characteristic", + "description": "" + }, + "manufacturer": { + "$ref": "#/$defs/Party", + "description": "The Party entity that manufactured the product." + }, + "manufacturedAt": { + "$ref": "#/$defs/Facility", + "description": "The Facility where the product batch was manufactured." + }, + "materialsProvenance": { + "type": "array", + "items": { + "$ref": "#/$defs/Material" + }, + "description": "An array of Provenance objects providing details on the origin and mass fraction of components or ingredients of the product batch." + }, + "conformityClaim": { + "type": "array", + "items": { + "$ref": "#/$defs/Claim" + }, + "description": "An array of claim objects representing various product conformity claims about the product / batch. These can be sustainability claims, circularity claims, or any other claim type within the conformity topic list." + }, + "recyclingInstruction": { + "type": "string", + "format": "uri", + "description": "A URI pointing to information regarding the recycling aspects of the product." + }, + "traceabilityInformation": { + "type": "array", + "items": { + "$ref": "#/$defs/TraceabilityEvent" + }, + "description": "An array of TraceabilityEvent objects detailing EPCIS events related to the traceability of the product batch." + } + }, + "description": "The ProductInformation class encapsulates detailed information regarding a specific product, including its identification details, manufacturer, and other pertinent details.", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$defs": { + "Product": { + "type": "object", + "additionalProperties": false, + "properties": { + "productIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An array of unique identifiers assigned to the product or model. " + }, + "batchIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "Information regarding the specific production batch of the product." + }, + "itemIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An array of identifiers representing a specific serialised item of the product." + }, + "classification": { + "type": "array", + "items": { + "$ref": "#/$defs/Classification" + }, + "description": "A code representing the product's class, typically using the UN CPC (United Nations Central Product Classification) https://unstats.un.org/unsd/classifications/Econ/cpc" + }, + "modelName": { + "type": "string", + "description": "The model name or number of the product, represented as text." + }, + "image": { + "$ref": "#/$defs/BinaryFile", + "description": "A unique identifier (URI) pointing to an image of the product." + }, + "description": { + "type": "string", + "description": "A textual description providing details about the product." + }, + "furtherInformation": { + "type": "string", + "format": "uri", + "description": "A URL pointing to further human readable information about the product." + }, + "manufacturedDate": { + "type": "string", + "format": "date", + "description": "The ISO 8601 date on which the product batch was manufactured." + }, + "dimension": { + "$ref": "#/$defs/Dimension", + "description": "The physical dimensions of the product. Not every dimension is relevant to every products. For example bulk materials may have wieght and volume but not length, with, or height." + }, + "characteristic": { + "$ref": "#/$defs/Characteristic", + "description": "" + }, + "manufacturer": { + "$ref": "#/$defs/Party", + "description": "The Party entity that manufactured the product." + }, + "manufacturedAt": { + "$ref": "#/$defs/Facility", + "description": "The Facility where the product batch was manufactured." + }, + "materialsProvenance": { + "type": "array", + "items": { + "$ref": "#/$defs/Material" + }, + "description": "An array of Provenance objects providing details on the origin and mass fraction of components or ingredients of the product batch." + }, + "conformityClaim": { + "type": "array", + "items": { + "$ref": "#/$defs/Claim" + }, + "description": "An array of claim objects representing various product conformity claims about the product / batch. These can be sustainability claims, circularity claims, or any other claim type within the conformity topic list." + }, + "recyclingInstruction": { + "type": "string", + "format": "uri", + "description": "A URI pointing to information regarding the recycling aspects of the product." + }, + "traceabilityInformation": { + "type": "array", + "items": { + "$ref": "#/$defs/TraceabilityEvent" + }, + "description": "An array of TraceabilityEvent objects detailing EPCIS events related to the traceability of the product batch." + } + }, + "description": "The ProductInformation class encapsulates detailed information regarding a specific product, including its identification details, manufacturer, and other pertinent details." + }, + "Identifier": { + "type": "object", + "additionalProperties": false, + "properties": { + "scheme": { + "type": "string", + "format": "uri", + "description": "the identifier scheme as defined by the registrar that manages the identifier registry. If the identifier scheme is registered with UNTP then this URI can use used to dicsover the resolution method (to get more data) and the verification method (to prove ownership)." + }, + "identifierValue": { + "type": "string", + "description": "The value of the identifier within the scheme" + }, + "binding": { + "$ref": "#/$defs/Evidence", + "description": "Link to evidence that attests to the validity and ownership of the identifer. " + } + }, + "description": "An identifier of a party, product, or facility that is defined by an identifier scheme and idenfier value and, optinally, verification evidence " + }, + "Evidence": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": ["w3c_vc", "iso_mdl", "document", "website", "other"], + "example": "w3c_vc", + "description": "Format of the evidence (verifiable credential, document, website, etc)" + }, + "assuranceLevel": { + "type": "string", + "enum": ["Self", "Commercial", "Buyer", "Membership", "Unspecified", "3rdParty"], + "example": "Self", + "description": "The assurance level of the evidence (self declaration, 2nd party, 3rd party, accredited auditor)" + }, + "reference": { + "type": "string", + "format": "uri", + "description": "The URL at which the evidence data can be found. " + } + }, + "description": "Evidence to support a conformity or identity claim. " + }, + "Classification": { + "type": "object", + "additionalProperties": false, + "properties": { + "scheme": { + "type": "string", + "format": "uri", + "description": "Classification scheme - eg https://unstats.un.org/unsd/classifications/Econ/cpc " + }, + "classifierValue": { + "type": "string", + "description": "classifier value within the scheme - eg \"01211\" in UN CPC" + }, + "classifierName": { + "type": "string", + "description": "Name of the classifier - eg \"Asparagus\" for code \"01211\" in UNCPC" + }, + "classifierURL": { + "type": "string", + "format": "uri", + "description": "Linked data URL to a web vocabulary entery for this classificaiton code. When this property is provided, the scheme, value, and name properties of the classifer are not required. eg https://vocabulary.uncefact.org/unlocode#AUBNE represensign the port of Brisbane in the UN/LOCODE classification scheme." + } + }, + "description": "A classification scheme and code / name representing a category value for a product, entity, or facility." + }, + "BinaryFile": { + "type": "object", + "additionalProperties": false, + "properties": { + "fileHash": { + "x-jargon-isKey": true, + "type": "string", + "description": "The MD5 hash of the file." + }, + "fileLocation": { + "type": "string", + "format": "uri", + "description": "The location of the evidence file." + }, + "fileType": { + "type": "string", + "x-external-enumeration": "https://mimetype.io/all-types", + "description": "The type of file, represented as a MIME type.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://mimetype.io/all-types\n " + } + }, + "description": "A file representing a data snapshot that is used to infomr the conformity assessment." + }, + "Dimension": { + "type": "object", + "additionalProperties": false, + "properties": { + "weight": { + "$ref": "#/$defs/Measure", + "description": "the weight of the product" + }, + "length": { + "$ref": "#/$defs/Measure", + "description": "The length of the product or packaging" + }, + "width": { + "$ref": "#/$defs/Measure", + "description": "The width of the product or packaging" + }, + "height": { + "$ref": "#/$defs/Measure", + "description": "The height of the product or packaging" + }, + "volume": { + "$ref": "#/$defs/Measure", + "description": "The displacement volume of the product." + } + }, + "description": "Overall (length, width, height) dimensions and weight/volume of an item." + }, + "Measure": { + "type": "object", + "additionalProperties": false, + "properties": { + "value": { + "type": "number", + "description": "The numeric value of the measure" + }, + "unit": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/UnitMeasureCode", + "description": "Unit of measure drawn from the UNECE rec20 measure code list.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/UnitMeasureCode\n " + } + }, + "description": "The measure class defines a numeric measured value (eg 10) and a coded unit of measure (eg KG)." + }, + "Characteristic": { + "type": "object", + "additionalProperties": false, + "properties": {}, + "description": "Product specific characteristics. This class is an extension point for industry specific product characteristics or performance information such as clothing size or battery capacity." + }, + "Party": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "string", + "description": "The decentralised identifier of the party - must be a W3C DID." + }, + "name": { + "type": "string", + "description": "The name of the organization or company, represented as a text string." + }, + "identifiers": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "A list of unique business identifiers assigned to the party - such as tax registration numbers." + } + }, + "description": "The Party class represents an entity such as an organization, or a company that manufactured the product." + }, + "Facility": { + "type": "object", + "additionalProperties": false, + "properties": { + "identifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "A unique identifier (URI) assigned to the facility. (Link Resolver - GS1 GLN?)" + }, + "name": { + "type": "string", + "description": "The name of the facility, represented as a text string." + }, + "location": { + "type": "string", + "format": "uri", + "description": "" + }, + "operatedBy": { + "$ref": "#/$defs/Party", + "description": "The Party entity responsible for operating the facility." + } + }, + "description": "The physical site (eg farm or factory) where the product or materials was produced." + }, + "Material": { + "type": "object", + "additionalProperties": false, + "properties": { + "originCountry": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/CountryId", + "description": "A ISO 3166-1 code representing the country of origin of the component or ingredient.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/CountryId\n " + }, + "materialType": { + "$ref": "#/$defs/Classification", + "description": "The type of this material - as a value drawn from a controlled vocabulary eg textileexchange.org/materials/rm01014 - representing organic cotton." + }, + "massFraction": { + "type": "number", + "description": "A numeric value representing the mass fraction of the product represented by this material. The sum of all mass fraction values for a given passport should be 100." + }, + "recycled": { + "type": "boolean", + "description": "Indicator is true if this material input is from a recycled source." + }, + "hazardous": { + "type": "boolean", + "description": "Indicates whether this material is hazardous. If true then " + } + }, + "description": "The material class encapsulates details about the origin or source of raw materials in a product, including the country of origin and the mass fraction." + }, + "Claim": { + "type": "object", + "additionalProperties": false, + "properties": { + "topic": { + "type": "string", + "enum": [ + "environment.energy", + "environment.emissions", + "environment.water", + "environment.waste", + "environment.deforestation", + "environment.biodiversity", + "circularity.content", + "circularity.design", + "social.labour", + "social.rights", + "social.community", + "social.safety", + "governance.ethics", + "governance.compliance", + "governance.transparency" + ], + "example": "environment.energy", + "description": "A code representing the topic of the sustainability claim. E.g. environment.deforestation, environment.ghg-emission-intensity, etc.. Drawn from a standard code list. " + }, + "standardOrRegulation": { + "type": "string", + "format": "uri", + "description": "The standard or regulation against which this conformity claim is made. Expressed as a URI and should match a value in the UN catalogue of reference vocabularies. " + }, + "criteriaReference": { + "type": "string", + "format": "uri", + "description": "A URI pointing to the specific criteria within the standard or regulation against which this claim is made." + }, + "claimedValues": { + "type": "array", + "items": { + "$ref": "#/$defs/Metric" + }, + "description": "One or more actual measures supporting the claim. For example for GHG emissions there may be a metric for total emissions intensity and also a metric for amount of offsets included." + }, + "benchmarkValue": { + "$ref": "#/$defs/Metric", + "description": "A benchmark value against which the claimed value can be assessed. THis could be a value specified by a standard or regulation or could be an industry benchmark." + }, + "benchmarkReference": { + "type": "string", + "format": "uri", + "description": "A refernce to evidence to support the benchmark value." + }, + "conformance": { + "type": "boolean", + "description": "and indicator (boolean) that expresses whether or not this product has achieved compliance against the criteria. for example, if the topic is environment.deforstation and the criteria is EU.2023.1115 then the product is conformant if it has not touched any facility throughout it's lifecycle that is not deforestation free since dec 2020." + }, + "conformityEvidence": { + "$ref": "#/$defs/Evidence", + "description": "A URI pointing to the evidence supporting the claim. Most likely in the form of a verifiable credential." + } + }, + "description": "The SustainabilityClaim class represents specific claims regarding the sustainability of a product, providing details about the metrics, thresholds, and evidences supporting the claim." + }, + "Metric": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "description": "A human readable name for this metric" + }, + "value": { + "$ref": "#/$defs/Measure", + "description": "A numeric value representing the measurement or evaluation outcome for the claim." + }, + "accuracy": { + "type": "number", + "description": "A percentage represented as a numeric between 0 and 1 indicating the rage of accuracy of the claimed value (eg 0.05 means that the actual value is within 5% of the claimed value.)" + } + }, + "description": "A specific measure of performance against the criteria that governs the claim. Expressed as an array of metric (ie unit of emasure) / value (ie the actual numeric value) pairs. " + }, + "TraceabilityEvent": { + "type": "object", + "additionalProperties": false, + "properties": { + "eventReference": { + "type": "string", + "format": "uri", + "description": "A URI pointing to the detailed information about the EPCIS event. Most likely in the form of a verifiable credential." + }, + "eventType": { + "type": "string", + "enum": ["aggregation", "transformation", "object", "transaction", "association"], + "example": "aggregation", + "description": "A code representing the type of EPCIS event. ObjectEvent, AggregationEvent, TransactionEvent, TransformationEvent, ObjectEvent." + } + }, + "description": "The TraceabilityEvent class represents a specific EPCIS event in the traceability chain of a product, including details about the event type and reference." + } + } + }, + "data": { + "image": "data:image/jpg;base64,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", + "productIdentifier": [ + { + "scheme": "https://id.gs1.org/gtin", + "identifierValue": "0105012345678900", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://id.gs1.org/gtin/05012345678900/binding" + } + } + ], + "batchIdentifier": [ + { + "scheme": "https://Cherriesfarm.example.org/batch", + "identifierValue": "BATCH-2024-001", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://Cherriesfarm.example.org/batch/2024-001/binding" + } + } + ], + "itemIdentifier": [ + { + "scheme": "https://Cherriesfarm.example.org/item", + "identifierValue": "TRF-24-0001", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://Cherriesfarm.example.org/item/TRF-24-0001/binding" + } + } + ], + "classification": [ + { + "scheme": "https://www.unspsc.org", + "classifierValue": "50383710", + "classifierName": "Cherriess", + "classifierURL": "https://www.unspsc.org/search-code/50383710" + } + ], + "modelName": "Black Cherries", + "description": "Premium Black Cherriess harvested from our sustainable Cherries orchards.", + "furtherInformation": "https://Cherriesfarm.example.org/products/black_perigord", + "manufacturedDate": "2024-01-15", + "dimension": { + "weight": { "value": 50, "unit": "GRM" } + }, + "materialsProvenance": [ + { + "originCountry": "AU", + "materialType": { + "scheme": "https://www.gs1.org/gpc", + "classifierValue": "10005953", + "classifierName": "Cherriess (Fresh)", + "classifierURL": "https://www.gs1.org/gpc/10005953" + }, + "massFraction": 100, + "recycled": false, + "hazardous": false + } + ], + "characteristic": { + "variety": "Tuber melanosporum", + "grade": "Extra", + "aroma": "Intense, earthy", + "flavor": "Rich, complex" + }, + "manufacturer": { + "id": "did:example:123456789abcdefghi", + "name": "Gourmet Cherries Farm", + "identifiers": [ + { + "scheme": "https://identifier.example.org/company", + "identifierValue": "COMP-12345", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://identifier.example.org/company/12345/binding" + } + } + ] + }, + "manufacturedAt": { + "identifier": [ + { + "scheme": "https://identifier.example.org/facility", + "identifierValue": "FAC-5678", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://identifier.example.org/facility/5678/binding" + } + } + ], + "name": "Cherries Orchard", + "location": "https://Cherriesfarm.example.org/locations/perigord_orchard", + "operatedBy": { + "id": "did:example:123456789abcdefghi", + "name": "Gourmet Cherries Farm", + "identifiers": [ + { + "scheme": "https://identifier.example.org/company", + "identifierValue": "COMP-12345", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://identifier.example.org/company/12345/binding" + } + } + ] + } + } + }, + "className": "json-form", + "style": { + "margin": "40px auto", + "paddingTop": "40px", + "width": "80%" + } + }, + "constructData": { + "mappingFields": [ + { + "sourcePath": "/linkResolver", + "destinationPath": "/traceabilityInformation/0/eventReference" + } + ], + "dummyFields": [ + { + "path": "/traceabilityInformation/0/eventType", + "data": "transaction" + } + ], + "generationFields": [] + } + } + ] + } + }, + { + "name": "CustomButton", + "type": "Submit", + "props": {} + } + ], + "services": [ + { + "name": "processDPP", + "parameters": [ + { + "vckit": { + "vckitAPIUrl": "http://localhost:3332/v2", + "issuer": "did:web:60c5-115-79-212-164.ngrok-free.app" + }, + "dpp": { + "context": ["https://dpp-json-ld.s3.ap-southeast-2.amazonaws.com/dppld.json"], + "renderTemplate": [ + { + "template": " Digital Product Passport

PRODUCT PASSPORT

{{credentialSubject.modelName}}

{{#each credentialSubject.batchIdentifier}} {{/each}} {{#each credentialSubject.productIdentifier}} {{/each}}

Sustainability

100%

Confidence

100%

PASSPORT ISSUED BY

{{issuer.name}}

Industry

Agriculture

Business identifier
75 859 224 235
Location
Rooty Hill, NSW
Identity verification
75 859 224 235
Other evidence

Conformity credentials

Conformity credentials are usually issued by independent third parties and provide a trusted assessment of product ESG performance against credible standards or regulations

{{#each credentialSubject.conformityClaim}}

{{topic}}

{{!-- {{#if (eq conformityEvidence.type 'w3c_vc')}} --}}
Verifiable credential
{{!-- {{/if}} --}}

View details

{{/each}}

Product composition

A complete list of materials that make up the composition of this product.

{{#each credentialSubject.materialsProvenance}}

{{massFraction}}%

ID {{materialType.classifierValue}}

{{materialType.classifierName}}

{{#if recycled}}

Recycled

{{/if}} {{#if hazardous}}

Hazard

{{/if}}
{{originCountry}}
{{/each}}

Product information

Harvest Date

{{credentialSubject.manufacturedDate}}

Batch No.

{{credentialSubject.batchIdentifier.0.identifierValue}}

Weight

{{credentialSubject.dimension.weight.value}}{{credentialSubject.dimension.weight.unit}}

Description

{{credentialSubject.description}}

", + "@type": "WebRenderingTemplate2022" + } + ], + "type": ["VerifiableCredential", "DigitalProductPassport"], + "dlrLinkTitle": "Cherries Product Passport", + "dlrIdentificationKeyType": "gtin", + "dlrVerificationPage": "http://localhost:3003/verify" + }, + "dlr": { + "dlrAPIUrl": "http://localhost:3000", + "dlrAPIKey": "test123", + "namespace": "gs1", + "linkRegisterPath": "/api/resolver" + }, + "storage": { + "url": "http://localhost:3334/v1/documents", + "params": { + "resultPath": "/uri", + "bucket": "verifiable-credentials" + }, + "options": { + "method": "POST", + "headers": { + "Content-Type": "application/json" + } + } + }, + "identifierKeyPath": "/productIdentifier/0/identifierValue" + } + ] + }, + { + "name": "mergeToLocalStorage", + "parameters": [ + { + "storageKey": "CherriesFarm_dpps", + "objectKeyPath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue" + } + ] + } + ] + }, + { + "name": "Move to Next Facility", + "id": "transaction_product", + "components": [ + { + "name": "LocalStorageLoader", + "type": "EntryData", + "props": { + "storageKey": "CherriesFarm_dpps", + "nestedComponents": [ + { + "name": "JsonForm", + "type": "EntryData", + "props": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "sourceParty": { + "$ref": "#/$defs/Party", + "description": "The source party for this supply chain transaction - typically the seller party" + }, + "destinationParty": { + "$ref": "#/$defs/Party", + "description": "The destination party for this supply chain transaction - typically the buyer party." + }, + "epcList": { + "type": "array", + "items": { "$ref": "#/$defs/Item" }, + "description": "The list of uniquely identified trade items included in this supply chain transaction." + }, + "quantityList": { + "type": "array", + "items": { "$ref": "#/$defs/QuantityElement" }, + "description": "List of quantified product classes that are included in this transaction. Used when the trade items do not have unique identifiers (eg 100 reels of yarn)" + }, + "referenceDocument": { + "$ref": "#/$defs/TradeDocument", + "description": "The supply chain document reference for this transaction event - eg the invoice, order, or dispatch advice" + }, + "eventID": { + "x-jargon-isKey": true, + "readOnly": true, + "type": "string", + "description": "The unique identifier of this event - SHOULD be a UUID" + }, + "eventTime": { + "type": "string", + "format": "date-time", + "description": "The ISO-8601 date time when the event occurred." + }, + "action": { + "type": "string", + "enum": ["observe", "add", "delete"], + "example": "observe", + "description": "Code describing how an event relates to the lifecycle of the entity impacted by the event." + }, + "disposition": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/Disp", + "description": "Disposition code describing the state of the item after the event. \n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/Disp\n " + }, + "bizStep": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/BizStep", + "description": "A business step code drawn from a controlled vocabulary. \n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/BizStep\n " + }, + "bizLocation": { + "type": "string", + "format": "uri", + "description": "A Business Location is a uniquely identified and discretely recorded geospatial location that is meant to designate the specific place where an object is assumed to be following an EPCIS event until it is reported to be at a different Business Location by a subsequent EPCIS event. The bizLocation must be a resolvable URI that links to facility information and geolocation data." + }, + "sensorElementList": { + "type": "array", + "items": { "$ref": "#/$defs/SensorElement" }, + "description": "An array (one for each sensor) of sensor device data sets associated with the event. " + } + }, + "description": "Transaction represents an event in which one or more objects become associated or disassociated with one or more identified business transactions - such as the purchase / shipment of goods between buyer and seller.", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$defs": { + "TransactionEvent": { + "type": "object", + "additionalProperties": false, + "properties": { + "sourceParty": { + "$ref": "#/$defs/Party", + "description": "The source party for this supply chain transaction - typically the seller party" + }, + "destinationParty": { + "$ref": "#/$defs/Party", + "description": "The destination party for this supply chain transaction - typically the buyer party." + }, + "epcList": { + "type": "array", + "items": { "$ref": "#/$defs/Item" }, + "description": "The list of uniquely identified trade items included in this supply chain transaction." + }, + "quantityList": { + "type": "array", + "items": { "$ref": "#/$defs/QuantityElement" }, + "description": "List of quantified product classes that are included in this transaction. Used when the trade items do not have unique identifiers (eg 100 reels of yarn)" + }, + "referenceDocument": { + "$ref": "#/$defs/TradeDocument", + "description": "The supply chain document reference for this transaction event - eg the invoice, order, or dispatch advice" + }, + "eventID": { + "x-jargon-isKey": true, + "readOnly": true, + "type": "string", + "description": "The unique identifier of this event - SHOULD be a UUID" + }, + "eventTime": { + "type": "string", + "format": "date-time", + "description": "The ISO-8601 date time when the event occurred." + }, + "action": { + "type": "string", + "enum": ["observe", "add", "delete"], + "example": "observe", + "description": "Code describing how an event relates to the lifecycle of the entity impacted by the event." + }, + "disposition": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/Disp", + "description": "Disposition code describing the state of the item after the event. \n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/Disp\n " + }, + "bizStep": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/BizStep", + "description": "A business step code drawn from a controlled vocabulary. \n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/BizStep\n " + }, + "bizLocation": { + "type": "string", + "format": "uri", + "description": "A Business Location is a uniquely identified and discretely recorded geospatial location that is meant to designate the specific place where an object is assumed to be following an EPCIS event until it is reported to be at a different Business Location by a subsequent EPCIS event. The bizLocation must be a resolvable URI that links to facility information and geolocation data." + }, + "sensorElementList": { + "type": "array", + "items": { "$ref": "#/$defs/SensorElement" }, + "description": "An array (one for each sensor) of sensor device data sets associated with the event. " + } + }, + "description": "Transaction represents an event in which one or more objects become associated or disassociated with one or more identified business transactions - such as the purchase / shipment of goods between buyer and seller." + }, + "Party": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "string", + "description": "The decentralised identifier of the party - must be a W3C DID." + }, + "name": { + "type": "string", + "description": "The name of the organization or company, represented as a text string." + }, + "identifiers": { + "type": "array", + "items": { "$ref": "#/$defs/Identifier" }, + "description": "A list of unique business identifiers assigned to the party - such as tax registration numbers." + } + }, + "description": "The Party class represents an entity such as an organization, or a company that manufactured the product." + }, + "Identifier": { + "type": "object", + "additionalProperties": false, + "properties": { + "scheme": { + "type": "string", + "format": "uri", + "description": "the identifier scheme as defined by the registrar that manages the identifier registry. If the identifier scheme is registered with UNTP then this URI can use used to dicsover the resolution method (to get more data) and the verification method (to prove ownership)." + }, + "identifierValue": { + "type": "string", + "description": "The value of the identifier within the scheme" + }, + "binding": { + "$ref": "#/$defs/Evidence", + "description": "Link to evidence that attests to the validity and ownership of the identifer. " + } + }, + "description": "An identifier of a party, product, or facility that is defined by an identifier scheme and idenfier value and, optinally, verification evidence " + }, + "Evidence": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": ["w3c_vc", "iso_mdl", "document", "website", "other"], + "example": "w3c_vc", + "description": "Format of the evidence (verifiable credential, document, website, etc)" + }, + "assuranceLevel": { + "type": "string", + "enum": ["Self", "Commercial", "Buyer", "Membership", "Unspecified", "3rdParty"], + "example": "Self", + "description": "The assurance level of the evidence (self declaration, 2nd party, 3rd party, accredited auditor)" + }, + "reference": { + "type": "string", + "format": "uri", + "description": "The URL at which the evidence data can be found. " + } + }, + "description": "Evidence to support a conformity or identity claim. " + }, + "Item": { + "type": "object", + "additionalProperties": false, + "properties": { + "itemID": { + "x-jargon-isKey": true, + "type": "string", + "format": "uri", + "description": "The globally unique identifier (eg GS1 GTIN or digital link) of the product item. " + }, + "name": { + "type": "string", + "description": "The name of the product class to which the product item belongs. " + } + }, + "description": "A specific trade item /product code which could be either a product serial number or a consignment identifier " + }, + "QuantityElement": { + "type": "object", + "additionalProperties": false, + "properties": { + "epcClass": { + "type": "string", + "format": "uri", + "description": "THe identifier of a product class (as opposed to a product instance) such as a GTIN code for a manufactured product." + }, + "quantity": { + "type": "number", + "description": "The numeric quantity of the product class (eg 100 kg of cotton)" + }, + "uom": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/UnitMeasureCode", + "description": "The unit of measure for the quantity value (eg Kg or meters etc) using the UNECE Rec 20 unit of measure codelist.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/UnitMeasureCode\n " + } + }, + "description": "The quantity element is used to define the quantities (eg 100), units of measure (eg Kg) and product class (eg GTIN or other class identifier) of products that are inputs or outputs or the subject of supply chain events. ", + "required": ["quantity"] + }, + "TradeDocument": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/BTT", + "description": "The document type representing the trade transaction drawn from the business transaction type vocabulary.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/BTT\n " + }, + "identifier": { + "type": "string", + "description": "The identifier of the trade transaction document - eg an invoice number or bill of lading number. Must be unique for a given source party" + }, + "documentURL": { + "type": "string", + "format": "uri", + "description": "The URL of the referenced trade document. For integrity reasons, it is recommended (but not required) that the documentURL is a hashlink (https://w3c-ccg.github.io/hashlink/) so that if the document the URL is changed then the hash verification will fail." + } + }, + "description": "A trade transaction between two parties such as an invoice, purchase order, or shipping notification." + }, + "SensorElement": { + "type": "object", + "additionalProperties": false, + "properties": { + "sensorMetadata": { + "$ref": "#/$defs/Sensor", + "description": "Data that describes the physical sensor that recorded the sensor data set." + }, + "sensorReport": { + "type": "array", + "items": { "$ref": "#/$defs/SensorData" }, + "description": "A list of sensor readings from the given sensor relevant to the traceability event context." + }, + "sensorIntegrityProof": { + "type": "string", + "format": "uri", + "description": "An optional reference to a verifiable credential signed by the sensor device or device manufacturer that contains the digitally signed raw data associated with this sensor report." + } + }, + "description": "A SensorElement is used to carry data related to an event that is captured one sensor such as an IoT device. Include one sensor property and an array of sensor data values." + }, + "Sensor": { + "type": "object", + "additionalProperties": false, + "properties": { + "device": { + "$ref": "#/$defs/Item", + "description": "The device Identifier for the sensor as a URI (typically an EPC)" + }, + "dataProcessingMethod": { + "type": "string", + "format": "uri", + "description": "The data processing method used by the sensor - should reference a documented standard criteria as a URI" + } + }, + "description": "A physical sensor that records a sensor data set." + }, + "SensorData": { + "type": "object", + "additionalProperties": false, + "properties": { + "time": { + "type": "string", + "format": "date-time", + "description": "the timestamp at which the sensor reading was made." + }, + "type": { + "type": "string", + "format": "uri", + "description": "the measurement type of the sensor reading, as a URI reference to a measurement method specification." + }, + "value": { "type": "number", "description": "the sensor reading" }, + "uom": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/UnitMeasureCode", + "description": "the unit of measure for the sensor reading\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/UnitMeasureCode\n " + } + }, + "description": "A data point read by a sensor." + } + } + } + }, + "constructData": { + "mappingFields": [ + { + "sourcePath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue", + "destinationPath": "/eventID" + }, + { + "sourcePath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue", + "destinationPath": "/epcList/index/name" + }, + { + "sourcePath": "/linkResolver", + "destinationPath": "/epcList/index/itemID" + } + ], + "dummyFields": [ + { + "path": "/action", + "data": "observe" + }, + { + "path": "/disposition", + "data": "https://ref.gs1.org/cbv/Disp/in_transit" + }, + { + "path": "/bizStep", + "data": "https://ref.gs1.org/cbv/BizStep/receiving" + }, + { + "path": "/bizLocation", + "data": "https://example.com/warehouse" + }, + { + "path": "/sourceParty", + "data": { + "id": "did:web:143f-2406-2d40-4106-2b10-38c6-9732-f2d9-bb1c.ngrok-free.app", + "name": "Cherries Farm", + "identifiers": [ + { + "scheme": "https://example.com/scheme/source", + "identifierValue": "SRC123456", + "binding": { + "type": "w3c_vc", + "assuranceLevel": "3rdParty", + "reference": "https://example.com/source_evidence" + } + } + ] + } + }, + { + "path": "/destinationParty", + "data": { + "id": "did:web:143f-2406-2d40-4106-2b10-38c6-9732-f2d9-bb1c.ngrok-free.app", + "name": "Cherries Processor", + "identifiers": [ + { + "scheme": "https://example.com/scheme/destination", + "identifierValue": "DST7891011", + "binding": { + "type": "w3c_vc", + "assuranceLevel": "3rdParty", + "reference": "https://example.com/destination_evidence" + } + } + ] + } + } + ], + "generationFields": [ + { + "path": "/eventID", + "handler": "generateIdWithSerialNumber" + }, + { + "path": "/eventTime", + "handler": "generateCurrentDatetime" + } + ] + } + } + ] + } + }, + { + "name": "CustomButton", + "type": "Submit", + "props": { + "includeDownload": true, + "downloadFileName": "transaction" + } + } + ], + "services": [ + { + "name": "processTransactionEvent", + "parameters": [ + { + "vckit": { + "vckitAPIUrl": "http://localhost:3332/v2", + "issuer": "did:web:60c5-115-79-212-164.ngrok-free.app" + }, + "epcisTransactionEvent": { + "context": ["https://dpp-json-ld.s3.ap-southeast-2.amazonaws.com/transaction-event-ld.json"], + "renderTemplate": [ + { + "template": "Transaction Event

TRACEABILITY EVENT

Transaction

EVENT ISSUED BY

{{issuer.name}}

{{#each issuer.identifiers}}
Industry
Needs to be replaced...
Business identifier
Needs to be replaced...
Identity verification
{{identiferValue}}
Verifiable credential
{{/each}}

Event description

Event ID
{{credentialSubject.eventID}}
Event type
Needs to be replaced...
Description
Needs to be replaced...
Time and date
{{credentialSubject.eventTime}}
Lifecycle action
{{credentialSubject.action}}
Product disposition
{{credentialSubject.disposition}}
Business step
{{credentialSubject.bizStep}}

Transaction

{{credentialSubject.sourceParty.name}}

SOURCE

{{credentialSubject.sourceParty.identifiers.0.identifierValue}}

Transferred

{{credentialSubject.destinationParty.name}}

DESTINATION

{{credentialSubject.destinationParty.partyID}}

Object list

{{#each credentialSubject.epcList}}

{{name}}

{{itemID}}

Product class name

Sustainability 0%
Confidence 0%
View
{{/each}}

Sensor

{{#each credentialSubject.sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}

{{time}}

Data type

{{value}} {{uom}}

{{/each}}{{sensorIntegrityProof}}
Other evidence
{{/each}}
", + "@type": "WebRenderingTemplate2022" + } + ], + "type": ["TransactionEventCredential"], + "dlrLinkTitle": "Transaction Event", + "dlrIdentificationKeyType": "gtin", + "dlrVerificationPage": "http://localhost:3003/verify" + }, + "dlr": { + "dlrAPIUrl": "http://localhost:3000", + "dlrAPIKey": "test123", + "namespace": "gs1", + "linkRegisterPath": "/api/resolver" + }, + "storage": { + "url": "http://localhost:3334/v1/documents", + "params": { + "resultPath": "/uri", + "bucket": "verifiable-credentials" + }, + "options": { + "method": "POST", + "headers": { + "Content-Type": "application/json" + } + } + }, + "identifierKeyPath": "/eventID", + "localStorageParams": { "storageKey": "CherriesFarm_dpps", "keyPath": "/epcList/index/name" } + } + ] + }, + { + "name": "mergeToLocalStorage", + "parameters": [ + { + "storageKey": "fumigation_and_freight_forwarding_facility_transaction_event", + "objectKeyPath": "/decodedEnvelopedVC/credentialSubject/eventID" + } + ] + } + ] + } + ] + }, + { + "name": "Airport Terminal Facility", + "type": "producer", + "assets": { + "logo": "Cherries-farm-logo.webp", + "brandTitle": "Airport Terminal" + }, + "styles": { + "primaryColor": "#b5651d", + "secondaryColor": "#391561", + "tertiaryColor": "#ffffff" + }, + "features": [ + { + "name": "Issue DPP", + "id": "produce_product", + "components": [ + { + "name": "LocalStorageLoader", + "type": "EntryData", + "props": { + "storageKey": "fumigation_and_freight_forwarding_facility_transaction_event", + "nestedComponents": [ + { + "name": "JsonForm", + "type": "EntryData", + "props": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "productIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An array of unique identifiers assigned to the product or model. " + }, + "batchIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "Information regarding the specific production batch of the product." + }, + "itemIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An array of identifiers representing a specific serialised item of the product." + }, + "classification": { + "type": "array", + "items": { + "$ref": "#/$defs/Classification" + }, + "description": "A code representing the product's class, typically using the UN CPC (United Nations Central Product Classification) https://unstats.un.org/unsd/classifications/Econ/cpc" + }, + "modelName": { + "type": "string", + "description": "The model name or number of the product, represented as text." + }, + "image": { + "$ref": "#/$defs/BinaryFile", + "description": "A unique identifier (URI) pointing to an image of the product." + }, + "description": { + "type": "string", + "description": "A textual description providing details about the product." + }, + "furtherInformation": { + "type": "string", + "format": "uri", + "description": "A URL pointing to further human readable information about the product." + }, + "manufacturedDate": { + "type": "string", + "format": "date", + "description": "The ISO 8601 date on which the product batch was manufactured." + }, + "dimension": { + "$ref": "#/$defs/Dimension", + "description": "The physical dimensions of the product. Not every dimension is relevant to every products. For example bulk materials may have wieght and volume but not length, with, or height." + }, + "characteristic": { + "$ref": "#/$defs/Characteristic", + "description": "" + }, + "manufacturer": { + "$ref": "#/$defs/Party", + "description": "The Party entity that manufactured the product." + }, + "manufacturedAt": { + "$ref": "#/$defs/Facility", + "description": "The Facility where the product batch was manufactured." + }, + "materialsProvenance": { + "type": "array", + "items": { + "$ref": "#/$defs/Material" + }, + "description": "An array of Provenance objects providing details on the origin and mass fraction of components or ingredients of the product batch." + }, + "conformityClaim": { + "type": "array", + "items": { + "$ref": "#/$defs/Claim" + }, + "description": "An array of claim objects representing various product conformity claims about the product / batch. These can be sustainability claims, circularity claims, or any other claim type within the conformity topic list." + }, + "recyclingInstruction": { + "type": "string", + "format": "uri", + "description": "A URI pointing to information regarding the recycling aspects of the product." + }, + "traceabilityInformation": { + "type": "array", + "items": { + "$ref": "#/$defs/TraceabilityEvent" + }, + "description": "An array of TraceabilityEvent objects detailing EPCIS events related to the traceability of the product batch." + } + }, + "description": "The ProductInformation class encapsulates detailed information regarding a specific product, including its identification details, manufacturer, and other pertinent details.", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$defs": { + "Product": { + "type": "object", + "additionalProperties": false, + "properties": { + "productIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An array of unique identifiers assigned to the product or model. " + }, + "batchIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "Information regarding the specific production batch of the product." + }, + "itemIdentifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "An array of identifiers representing a specific serialised item of the product." + }, + "classification": { + "type": "array", + "items": { + "$ref": "#/$defs/Classification" + }, + "description": "A code representing the product's class, typically using the UN CPC (United Nations Central Product Classification) https://unstats.un.org/unsd/classifications/Econ/cpc" + }, + "modelName": { + "type": "string", + "description": "The model name or number of the product, represented as text." + }, + "image": { + "$ref": "#/$defs/BinaryFile", + "description": "A unique identifier (URI) pointing to an image of the product." + }, + "description": { + "type": "string", + "description": "A textual description providing details about the product." + }, + "furtherInformation": { + "type": "string", + "format": "uri", + "description": "A URL pointing to further human readable information about the product." + }, + "manufacturedDate": { + "type": "string", + "format": "date", + "description": "The ISO 8601 date on which the product batch was manufactured." + }, + "dimension": { + "$ref": "#/$defs/Dimension", + "description": "The physical dimensions of the product. Not every dimension is relevant to every products. For example bulk materials may have wieght and volume but not length, with, or height." + }, + "characteristic": { + "$ref": "#/$defs/Characteristic", + "description": "" + }, + "manufacturer": { + "$ref": "#/$defs/Party", + "description": "The Party entity that manufactured the product." + }, + "manufacturedAt": { + "$ref": "#/$defs/Facility", + "description": "The Facility where the product batch was manufactured." + }, + "materialsProvenance": { + "type": "array", + "items": { + "$ref": "#/$defs/Material" + }, + "description": "An array of Provenance objects providing details on the origin and mass fraction of components or ingredients of the product batch." + }, + "conformityClaim": { + "type": "array", + "items": { + "$ref": "#/$defs/Claim" + }, + "description": "An array of claim objects representing various product conformity claims about the product / batch. These can be sustainability claims, circularity claims, or any other claim type within the conformity topic list." + }, + "recyclingInstruction": { + "type": "string", + "format": "uri", + "description": "A URI pointing to information regarding the recycling aspects of the product." + }, + "traceabilityInformation": { + "type": "array", + "items": { + "$ref": "#/$defs/TraceabilityEvent" + }, + "description": "An array of TraceabilityEvent objects detailing EPCIS events related to the traceability of the product batch." + } + }, + "description": "The ProductInformation class encapsulates detailed information regarding a specific product, including its identification details, manufacturer, and other pertinent details." + }, + "Identifier": { + "type": "object", + "additionalProperties": false, + "properties": { + "scheme": { + "type": "string", + "format": "uri", + "description": "the identifier scheme as defined by the registrar that manages the identifier registry. If the identifier scheme is registered with UNTP then this URI can use used to dicsover the resolution method (to get more data) and the verification method (to prove ownership)." + }, + "identifierValue": { + "type": "string", + "description": "The value of the identifier within the scheme" + }, + "binding": { + "$ref": "#/$defs/Evidence", + "description": "Link to evidence that attests to the validity and ownership of the identifer. " + } + }, + "description": "An identifier of a party, product, or facility that is defined by an identifier scheme and idenfier value and, optinally, verification evidence " + }, + "Evidence": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": ["w3c_vc", "iso_mdl", "document", "website", "other"], + "example": "w3c_vc", + "description": "Format of the evidence (verifiable credential, document, website, etc)" + }, + "assuranceLevel": { + "type": "string", + "enum": ["Self", "Commercial", "Buyer", "Membership", "Unspecified", "3rdParty"], + "example": "Self", + "description": "The assurance level of the evidence (self declaration, 2nd party, 3rd party, accredited auditor)" + }, + "reference": { + "type": "string", + "format": "uri", + "description": "The URL at which the evidence data can be found. " + } + }, + "description": "Evidence to support a conformity or identity claim. " + }, + "Classification": { + "type": "object", + "additionalProperties": false, + "properties": { + "scheme": { + "type": "string", + "format": "uri", + "description": "Classification scheme - eg https://unstats.un.org/unsd/classifications/Econ/cpc " + }, + "classifierValue": { + "type": "string", + "description": "classifier value within the scheme - eg \"01211\" in UN CPC" + }, + "classifierName": { + "type": "string", + "description": "Name of the classifier - eg \"Asparagus\" for code \"01211\" in UNCPC" + }, + "classifierURL": { + "type": "string", + "format": "uri", + "description": "Linked data URL to a web vocabulary entery for this classificaiton code. When this property is provided, the scheme, value, and name properties of the classifer are not required. eg https://vocabulary.uncefact.org/unlocode#AUBNE represensign the port of Brisbane in the UN/LOCODE classification scheme." + } + }, + "description": "A classification scheme and code / name representing a category value for a product, entity, or facility." + }, + "BinaryFile": { + "type": "object", + "additionalProperties": false, + "properties": { + "fileHash": { + "x-jargon-isKey": true, + "type": "string", + "description": "The MD5 hash of the file." + }, + "fileLocation": { + "type": "string", + "format": "uri", + "description": "The location of the evidence file." + }, + "fileType": { + "type": "string", + "x-external-enumeration": "https://mimetype.io/all-types", + "description": "The type of file, represented as a MIME type.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://mimetype.io/all-types\n " + } + }, + "description": "A file representing a data snapshot that is used to infomr the conformity assessment." + }, + "Dimension": { + "type": "object", + "additionalProperties": false, + "properties": { + "weight": { + "$ref": "#/$defs/Measure", + "description": "the weight of the product" + }, + "length": { + "$ref": "#/$defs/Measure", + "description": "The length of the product or packaging" + }, + "width": { + "$ref": "#/$defs/Measure", + "description": "The width of the product or packaging" + }, + "height": { + "$ref": "#/$defs/Measure", + "description": "The height of the product or packaging" + }, + "volume": { + "$ref": "#/$defs/Measure", + "description": "The displacement volume of the product." + } + }, + "description": "Overall (length, width, height) dimensions and weight/volume of an item." + }, + "Measure": { + "type": "object", + "additionalProperties": false, + "properties": { + "value": { + "type": "number", + "description": "The numeric value of the measure" + }, + "unit": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/UnitMeasureCode", + "description": "Unit of measure drawn from the UNECE rec20 measure code list.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/UnitMeasureCode\n " + } + }, + "description": "The measure class defines a numeric measured value (eg 10) and a coded unit of measure (eg KG)." + }, + "Characteristic": { + "type": "object", + "additionalProperties": false, + "properties": {}, + "description": "Product specific characteristics. This class is an extension point for industry specific product characteristics or performance information such as clothing size or battery capacity." + }, + "Party": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "string", + "description": "The decentralised identifier of the party - must be a W3C DID." + }, + "name": { + "type": "string", + "description": "The name of the organization or company, represented as a text string." + }, + "identifiers": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "A list of unique business identifiers assigned to the party - such as tax registration numbers." + } + }, + "description": "The Party class represents an entity such as an organization, or a company that manufactured the product." + }, + "Facility": { + "type": "object", + "additionalProperties": false, + "properties": { + "identifier": { + "type": "array", + "items": { + "$ref": "#/$defs/Identifier" + }, + "description": "A unique identifier (URI) assigned to the facility. (Link Resolver - GS1 GLN?)" + }, + "name": { + "type": "string", + "description": "The name of the facility, represented as a text string." + }, + "location": { + "type": "string", + "format": "uri", + "description": "" + }, + "operatedBy": { + "$ref": "#/$defs/Party", + "description": "The Party entity responsible for operating the facility." + } + }, + "description": "The physical site (eg farm or factory) where the product or materials was produced." + }, + "Material": { + "type": "object", + "additionalProperties": false, + "properties": { + "originCountry": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/CountryId", + "description": "A ISO 3166-1 code representing the country of origin of the component or ingredient.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/CountryId\n " + }, + "materialType": { + "$ref": "#/$defs/Classification", + "description": "The type of this material - as a value drawn from a controlled vocabulary eg textileexchange.org/materials/rm01014 - representing organic cotton." + }, + "massFraction": { + "type": "number", + "description": "A numeric value representing the mass fraction of the product represented by this material. The sum of all mass fraction values for a given passport should be 100." + }, + "recycled": { + "type": "boolean", + "description": "Indicator is true if this material input is from a recycled source." + }, + "hazardous": { + "type": "boolean", + "description": "Indicates whether this material is hazardous. If true then " + } + }, + "description": "The material class encapsulates details about the origin or source of raw materials in a product, including the country of origin and the mass fraction." + }, + "Claim": { + "type": "object", + "additionalProperties": false, + "properties": { + "topic": { + "type": "string", + "enum": [ + "environment.energy", + "environment.emissions", + "environment.water", + "environment.waste", + "environment.deforestation", + "environment.biodiversity", + "circularity.content", + "circularity.design", + "social.labour", + "social.rights", + "social.community", + "social.safety", + "governance.ethics", + "governance.compliance", + "governance.transparency" + ], + "example": "environment.energy", + "description": "A code representing the topic of the sustainability claim. E.g. environment.deforestation, environment.ghg-emission-intensity, etc.. Drawn from a standard code list. " + }, + "standardOrRegulation": { + "type": "string", + "format": "uri", + "description": "The standard or regulation against which this conformity claim is made. Expressed as a URI and should match a value in the UN catalogue of reference vocabularies. " + }, + "criteriaReference": { + "type": "string", + "format": "uri", + "description": "A URI pointing to the specific criteria within the standard or regulation against which this claim is made." + }, + "claimedValues": { + "type": "array", + "items": { + "$ref": "#/$defs/Metric" + }, + "description": "One or more actual measures supporting the claim. For example for GHG emissions there may be a metric for total emissions intensity and also a metric for amount of offsets included." + }, + "benchmarkValue": { + "$ref": "#/$defs/Metric", + "description": "A benchmark value against which the claimed value can be assessed. THis could be a value specified by a standard or regulation or could be an industry benchmark." + }, + "benchmarkReference": { + "type": "string", + "format": "uri", + "description": "A refernce to evidence to support the benchmark value." + }, + "conformance": { + "type": "boolean", + "description": "and indicator (boolean) that expresses whether or not this product has achieved compliance against the criteria. for example, if the topic is environment.deforstation and the criteria is EU.2023.1115 then the product is conformant if it has not touched any facility throughout it's lifecycle that is not deforestation free since dec 2020." + }, + "conformityEvidence": { + "$ref": "#/$defs/Evidence", + "description": "A URI pointing to the evidence supporting the claim. Most likely in the form of a verifiable credential." + } + }, + "description": "The SustainabilityClaim class represents specific claims regarding the sustainability of a product, providing details about the metrics, thresholds, and evidences supporting the claim." + }, + "Metric": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "description": "A human readable name for this metric" + }, + "value": { + "$ref": "#/$defs/Measure", + "description": "A numeric value representing the measurement or evaluation outcome for the claim." + }, + "accuracy": { + "type": "number", + "description": "A percentage represented as a numeric between 0 and 1 indicating the rage of accuracy of the claimed value (eg 0.05 means that the actual value is within 5% of the claimed value.)" + } + }, + "description": "A specific measure of performance against the criteria that governs the claim. Expressed as an array of metric (ie unit of emasure) / value (ie the actual numeric value) pairs. " + }, + "TraceabilityEvent": { + "type": "object", + "additionalProperties": false, + "properties": { + "eventReference": { + "type": "string", + "format": "uri", + "description": "A URI pointing to the detailed information about the EPCIS event. Most likely in the form of a verifiable credential." + }, + "eventType": { + "type": "string", + "enum": ["aggregation", "transformation", "object", "transaction", "association"], + "example": "aggregation", + "description": "A code representing the type of EPCIS event. ObjectEvent, AggregationEvent, TransactionEvent, TransformationEvent, ObjectEvent." + } + }, + "description": "The TraceabilityEvent class represents a specific EPCIS event in the traceability chain of a product, including details about the event type and reference." + } + } + }, + "data": { + "image": "data:image/jpg;base64,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", + "productIdentifier": [ + { + "scheme": "https://id.gs1.org/gtin", + "identifierValue": "0105012345678900", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://id.gs1.org/gtin/05012345678900/binding" + } + } + ], + "batchIdentifier": [ + { + "scheme": "https://Cherriesfarm.example.org/batch", + "identifierValue": "BATCH-2024-001", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://Cherriesfarm.example.org/batch/2024-001/binding" + } + } + ], + "itemIdentifier": [ + { + "scheme": "https://Cherriesfarm.example.org/item", + "identifierValue": "TRF-24-0001", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://Cherriesfarm.example.org/item/TRF-24-0001/binding" + } + } + ], + "classification": [ + { + "scheme": "https://www.unspsc.org", + "classifierValue": "50383710", + "classifierName": "Cherriess", + "classifierURL": "https://www.unspsc.org/search-code/50383710" + } + ], + "modelName": "Black Cherries", + "description": "Premium Black Cherriess harvested from our sustainable Cherries orchards.", + "furtherInformation": "https://Cherriesfarm.example.org/products/black_perigord", + "manufacturedDate": "2024-01-15", + "dimension": { + "weight": { "value": 50, "unit": "GRM" } + }, + "materialsProvenance": [ + { + "originCountry": "AU", + "materialType": { + "scheme": "https://www.gs1.org/gpc", + "classifierValue": "10005953", + "classifierName": "Cherriess (Fresh)", + "classifierURL": "https://www.gs1.org/gpc/10005953" + }, + "massFraction": 100, + "recycled": false, + "hazardous": false + } + ], + "characteristic": { + "variety": "Tuber melanosporum", + "grade": "Extra", + "aroma": "Intense, earthy", + "flavor": "Rich, complex" + }, + "manufacturer": { + "id": "did:example:123456789abcdefghi", + "name": "Gourmet Cherries Farm", + "identifiers": [ + { + "scheme": "https://identifier.example.org/company", + "identifierValue": "COMP-12345", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://identifier.example.org/company/12345/binding" + } + } + ] + }, + "manufacturedAt": { + "identifier": [ + { + "scheme": "https://identifier.example.org/facility", + "identifierValue": "FAC-5678", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://identifier.example.org/facility/5678/binding" + } + } + ], + "name": "Cherries Orchard", + "location": "https://Cherriesfarm.example.org/locations/perigord_orchard", + "operatedBy": { + "id": "did:example:123456789abcdefghi", + "name": "Gourmet Cherries Farm", + "identifiers": [ + { + "scheme": "https://identifier.example.org/company", + "identifierValue": "COMP-12345", + "binding": { + "type": "document", + "assuranceLevel": "3rdParty", + "reference": "https://identifier.example.org/company/12345/binding" + } + } + ] + } + } + }, + "className": "json-form", + "style": { + "margin": "40px auto", + "paddingTop": "40px", + "width": "80%" + } + }, + "constructData": { + "mappingFields": [ + { + "sourcePath": "/linkResolver", + "destinationPath": "/traceabilityInformation/0/eventReference" + } + ], + "dummyFields": [ + { + "path": "/traceabilityInformation/0/eventType", + "data": "transaction" + } + ], + "generationFields": [] + } + } + ] + } + }, + { + "name": "CustomButton", + "type": "Submit", + "props": {} + } + ], + "services": [ + { + "name": "processDPP", + "parameters": [ + { + "vckit": { + "vckitAPIUrl": "http://localhost:3332/v2", + "issuer": "did:web:60c5-115-79-212-164.ngrok-free.app" + }, + "dpp": { + "context": ["https://dpp-json-ld.s3.ap-southeast-2.amazonaws.com/dppld.json"], + "renderTemplate": [ + { + "template": " Digital Product Passport

PRODUCT PASSPORT

{{credentialSubject.modelName}}

{{#each credentialSubject.batchIdentifier}} {{/each}} {{#each credentialSubject.productIdentifier}} {{/each}}

Sustainability

100%

Confidence

100%

PASSPORT ISSUED BY

{{issuer.name}}

Industry

Agriculture

Business identifier
75 859 224 235
Location
Rooty Hill, NSW
Identity verification
75 859 224 235
Other evidence

Conformity credentials

Conformity credentials are usually issued by independent third parties and provide a trusted assessment of product ESG performance against credible standards or regulations

{{#each credentialSubject.conformityClaim}}

{{topic}}

{{!-- {{#if (eq conformityEvidence.type 'w3c_vc')}} --}}
Verifiable credential
{{!-- {{/if}} --}}

View details

{{/each}}

Product composition

A complete list of materials that make up the composition of this product.

{{#each credentialSubject.materialsProvenance}}

{{massFraction}}%

ID {{materialType.classifierValue}}

{{materialType.classifierName}}

{{#if recycled}}

Recycled

{{/if}} {{#if hazardous}}

Hazard

{{/if}}
{{originCountry}}
{{/each}}

Product information

Harvest Date

{{credentialSubject.manufacturedDate}}

Batch No.

{{credentialSubject.batchIdentifier.0.identifierValue}}

Weight

{{credentialSubject.dimension.weight.value}}{{credentialSubject.dimension.weight.unit}}

Description

{{credentialSubject.description}}

", + "@type": "WebRenderingTemplate2022" + } + ], + "type": ["VerifiableCredential", "DigitalProductPassport"], + "dlrLinkTitle": "Cherries Product Passport", + "dlrIdentificationKeyType": "gtin", + "dlrVerificationPage": "http://localhost:3003/verify" + }, + "dlr": { + "dlrAPIUrl": "http://localhost:3000", + "dlrAPIKey": "test123", + "namespace": "gs1", + "linkRegisterPath": "/api/resolver" + }, + "storage": { + "url": "http://localhost:3334/v1/documents", + "params": { + "resultPath": "/uri", + "bucket": "verifiable-credentials" + }, + "options": { + "method": "POST", + "headers": { + "Content-Type": "application/json" + } + } + }, + "identifierKeyPath": "/productIdentifier/0/identifierValue" + } + ] + }, + { + "name": "mergeToLocalStorage", + "parameters": [ + { + "storageKey": "CherriesFarm_dpps", + "objectKeyPath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue" + } + ] + } + ] + }, + { + "name": "Move to Next Facility", + "id": "transaction_product", + "components": [ + { + "name": "LocalStorageLoader", + "type": "EntryData", + "props": { + "storageKey": "CherriesFarm_dpps", + "nestedComponents": [ + { + "name": "JsonForm", + "type": "EntryData", + "props": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "sourceParty": { + "$ref": "#/$defs/Party", + "description": "The source party for this supply chain transaction - typically the seller party" + }, + "destinationParty": { + "$ref": "#/$defs/Party", + "description": "The destination party for this supply chain transaction - typically the buyer party." + }, + "epcList": { + "type": "array", + "items": { "$ref": "#/$defs/Item" }, + "description": "The list of uniquely identified trade items included in this supply chain transaction." + }, + "quantityList": { + "type": "array", + "items": { "$ref": "#/$defs/QuantityElement" }, + "description": "List of quantified product classes that are included in this transaction. Used when the trade items do not have unique identifiers (eg 100 reels of yarn)" + }, + "referenceDocument": { + "$ref": "#/$defs/TradeDocument", + "description": "The supply chain document reference for this transaction event - eg the invoice, order, or dispatch advice" + }, + "eventID": { + "x-jargon-isKey": true, + "readOnly": true, + "type": "string", + "description": "The unique identifier of this event - SHOULD be a UUID" + }, + "eventTime": { + "type": "string", + "format": "date-time", + "description": "The ISO-8601 date time when the event occurred." + }, + "action": { + "type": "string", + "enum": ["observe", "add", "delete"], + "example": "observe", + "description": "Code describing how an event relates to the lifecycle of the entity impacted by the event." + }, + "disposition": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/Disp", + "description": "Disposition code describing the state of the item after the event. \n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/Disp\n " + }, + "bizStep": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/BizStep", + "description": "A business step code drawn from a controlled vocabulary. \n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/BizStep\n " + }, + "bizLocation": { + "type": "string", + "format": "uri", + "description": "A Business Location is a uniquely identified and discretely recorded geospatial location that is meant to designate the specific place where an object is assumed to be following an EPCIS event until it is reported to be at a different Business Location by a subsequent EPCIS event. The bizLocation must be a resolvable URI that links to facility information and geolocation data." + }, + "sensorElementList": { + "type": "array", + "items": { "$ref": "#/$defs/SensorElement" }, + "description": "An array (one for each sensor) of sensor device data sets associated with the event. " + } + }, + "description": "Transaction represents an event in which one or more objects become associated or disassociated with one or more identified business transactions - such as the purchase / shipment of goods between buyer and seller.", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$defs": { + "TransactionEvent": { + "type": "object", + "additionalProperties": false, + "properties": { + "sourceParty": { + "$ref": "#/$defs/Party", + "description": "The source party for this supply chain transaction - typically the seller party" + }, + "destinationParty": { + "$ref": "#/$defs/Party", + "description": "The destination party for this supply chain transaction - typically the buyer party." + }, + "epcList": { + "type": "array", + "items": { "$ref": "#/$defs/Item" }, + "description": "The list of uniquely identified trade items included in this supply chain transaction." + }, + "quantityList": { + "type": "array", + "items": { "$ref": "#/$defs/QuantityElement" }, + "description": "List of quantified product classes that are included in this transaction. Used when the trade items do not have unique identifiers (eg 100 reels of yarn)" + }, + "referenceDocument": { + "$ref": "#/$defs/TradeDocument", + "description": "The supply chain document reference for this transaction event - eg the invoice, order, or dispatch advice" + }, + "eventID": { + "x-jargon-isKey": true, + "readOnly": true, + "type": "string", + "description": "The unique identifier of this event - SHOULD be a UUID" + }, + "eventTime": { + "type": "string", + "format": "date-time", + "description": "The ISO-8601 date time when the event occurred." + }, + "action": { + "type": "string", + "enum": ["observe", "add", "delete"], + "example": "observe", + "description": "Code describing how an event relates to the lifecycle of the entity impacted by the event." + }, + "disposition": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/Disp", + "description": "Disposition code describing the state of the item after the event. \n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/Disp\n " + }, + "bizStep": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/BizStep", + "description": "A business step code drawn from a controlled vocabulary. \n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/BizStep\n " + }, + "bizLocation": { + "type": "string", + "format": "uri", + "description": "A Business Location is a uniquely identified and discretely recorded geospatial location that is meant to designate the specific place where an object is assumed to be following an EPCIS event until it is reported to be at a different Business Location by a subsequent EPCIS event. The bizLocation must be a resolvable URI that links to facility information and geolocation data." + }, + "sensorElementList": { + "type": "array", + "items": { "$ref": "#/$defs/SensorElement" }, + "description": "An array (one for each sensor) of sensor device data sets associated with the event. " + } + }, + "description": "Transaction represents an event in which one or more objects become associated or disassociated with one or more identified business transactions - such as the purchase / shipment of goods between buyer and seller." + }, + "Party": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "string", + "description": "The decentralised identifier of the party - must be a W3C DID." + }, + "name": { + "type": "string", + "description": "The name of the organization or company, represented as a text string." + }, + "identifiers": { + "type": "array", + "items": { "$ref": "#/$defs/Identifier" }, + "description": "A list of unique business identifiers assigned to the party - such as tax registration numbers." + } + }, + "description": "The Party class represents an entity such as an organization, or a company that manufactured the product." + }, + "Identifier": { + "type": "object", + "additionalProperties": false, + "properties": { + "scheme": { + "type": "string", + "format": "uri", + "description": "the identifier scheme as defined by the registrar that manages the identifier registry. If the identifier scheme is registered with UNTP then this URI can use used to dicsover the resolution method (to get more data) and the verification method (to prove ownership)." + }, + "identifierValue": { + "type": "string", + "description": "The value of the identifier within the scheme" + }, + "binding": { + "$ref": "#/$defs/Evidence", + "description": "Link to evidence that attests to the validity and ownership of the identifer. " + } + }, + "description": "An identifier of a party, product, or facility that is defined by an identifier scheme and idenfier value and, optinally, verification evidence " + }, + "Evidence": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": ["w3c_vc", "iso_mdl", "document", "website", "other"], + "example": "w3c_vc", + "description": "Format of the evidence (verifiable credential, document, website, etc)" + }, + "assuranceLevel": { + "type": "string", + "enum": ["Self", "Commercial", "Buyer", "Membership", "Unspecified", "3rdParty"], + "example": "Self", + "description": "The assurance level of the evidence (self declaration, 2nd party, 3rd party, accredited auditor)" + }, + "reference": { + "type": "string", + "format": "uri", + "description": "The URL at which the evidence data can be found. " + } + }, + "description": "Evidence to support a conformity or identity claim. " + }, + "Item": { + "type": "object", + "additionalProperties": false, + "properties": { + "itemID": { + "x-jargon-isKey": true, + "type": "string", + "format": "uri", + "description": "The globally unique identifier (eg GS1 GTIN or digital link) of the product item. " + }, + "name": { + "type": "string", + "description": "The name of the product class to which the product item belongs. " + } + }, + "description": "A specific trade item /product code which could be either a product serial number or a consignment identifier " + }, + "QuantityElement": { + "type": "object", + "additionalProperties": false, + "properties": { + "epcClass": { + "type": "string", + "format": "uri", + "description": "THe identifier of a product class (as opposed to a product instance) such as a GTIN code for a manufactured product." + }, + "quantity": { + "type": "number", + "description": "The numeric quantity of the product class (eg 100 kg of cotton)" + }, + "uom": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/UnitMeasureCode", + "description": "The unit of measure for the quantity value (eg Kg or meters etc) using the UNECE Rec 20 unit of measure codelist.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/UnitMeasureCode\n " + } + }, + "description": "The quantity element is used to define the quantities (eg 100), units of measure (eg Kg) and product class (eg GTIN or other class identifier) of products that are inputs or outputs or the subject of supply chain events. ", + "required": ["quantity"] + }, + "TradeDocument": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "x-external-enumeration": "https://ref.gs1.org/cbv/BTT", + "description": "The document type representing the trade transaction drawn from the business transaction type vocabulary.\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://ref.gs1.org/cbv/BTT\n " + }, + "identifier": { + "type": "string", + "description": "The identifier of the trade transaction document - eg an invoice number or bill of lading number. Must be unique for a given source party" + }, + "documentURL": { + "type": "string", + "format": "uri", + "description": "The URL of the referenced trade document. For integrity reasons, it is recommended (but not required) that the documentURL is a hashlink (https://w3c-ccg.github.io/hashlink/) so that if the document the URL is changed then the hash verification will fail." + } + }, + "description": "A trade transaction between two parties such as an invoice, purchase order, or shipping notification." + }, + "SensorElement": { + "type": "object", + "additionalProperties": false, + "properties": { + "sensorMetadata": { + "$ref": "#/$defs/Sensor", + "description": "Data that describes the physical sensor that recorded the sensor data set." + }, + "sensorReport": { + "type": "array", + "items": { "$ref": "#/$defs/SensorData" }, + "description": "A list of sensor readings from the given sensor relevant to the traceability event context." + }, + "sensorIntegrityProof": { + "type": "string", + "format": "uri", + "description": "An optional reference to a verifiable credential signed by the sensor device or device manufacturer that contains the digitally signed raw data associated with this sensor report." + } + }, + "description": "A SensorElement is used to carry data related to an event that is captured one sensor such as an IoT device. Include one sensor property and an array of sensor data values." + }, + "Sensor": { + "type": "object", + "additionalProperties": false, + "properties": { + "device": { + "$ref": "#/$defs/Item", + "description": "The device Identifier for the sensor as a URI (typically an EPC)" + }, + "dataProcessingMethod": { + "type": "string", + "format": "uri", + "description": "The data processing method used by the sensor - should reference a documented standard criteria as a URI" + } + }, + "description": "A physical sensor that records a sensor data set." + }, + "SensorData": { + "type": "object", + "additionalProperties": false, + "properties": { + "time": { + "type": "string", + "format": "date-time", + "description": "the timestamp at which the sensor reading was made." + }, + "type": { + "type": "string", + "format": "uri", + "description": "the measurement type of the sensor reading, as a URI reference to a measurement method specification." + }, + "value": { "type": "number", "description": "the sensor reading" }, + "uom": { + "type": "string", + "x-external-enumeration": "https://vocabulary.uncefact.org/UnitMeasureCode", + "description": "the unit of measure for the sensor reading\n\n This is an enumerated value, but the list of valid values are too big, or change too often to include here. You can access the list of allowable values at this URL: https://vocabulary.uncefact.org/UnitMeasureCode\n " + } + }, + "description": "A data point read by a sensor." + } + } + } + }, + "constructData": { + "mappingFields": [ + { + "sourcePath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue", + "destinationPath": "/eventID" + }, + { + "sourcePath": "/decodedEnvelopedVC/credentialSubject/productIdentifier/0/identifierValue", + "destinationPath": "/epcList/index/name" + }, + { + "sourcePath": "/linkResolver", + "destinationPath": "/epcList/index/itemID" + } + ], + "dummyFields": [ + { + "path": "/action", + "data": "observe" + }, + { + "path": "/disposition", + "data": "https://ref.gs1.org/cbv/Disp/in_transit" + }, + { + "path": "/bizStep", + "data": "https://ref.gs1.org/cbv/BizStep/receiving" + }, + { + "path": "/bizLocation", + "data": "https://example.com/warehouse" + }, + { + "path": "/sourceParty", + "data": { + "id": "did:web:143f-2406-2d40-4106-2b10-38c6-9732-f2d9-bb1c.ngrok-free.app", + "name": "Cherries Farm", + "identifiers": [ + { + "scheme": "https://example.com/scheme/source", + "identifierValue": "SRC123456", + "binding": { + "type": "w3c_vc", + "assuranceLevel": "3rdParty", + "reference": "https://example.com/source_evidence" + } + } + ] + } + }, + { + "path": "/destinationParty", + "data": { + "id": "did:web:143f-2406-2d40-4106-2b10-38c6-9732-f2d9-bb1c.ngrok-free.app", + "name": "Cherries Processor", + "identifiers": [ + { + "scheme": "https://example.com/scheme/destination", + "identifierValue": "DST7891011", + "binding": { + "type": "w3c_vc", + "assuranceLevel": "3rdParty", + "reference": "https://example.com/destination_evidence" + } + } + ] + } + } + ], + "generationFields": [ + { + "path": "/eventID", + "handler": "generateIdWithSerialNumber" + }, + { + "path": "/eventTime", + "handler": "generateCurrentDatetime" + } + ] + } + } + ] + } + }, + { + "name": "CustomButton", + "type": "Submit", + "props": { + "includeDownload": true, + "downloadFileName": "transaction" + } + } + ], + "services": [ + { + "name": "processTransactionEvent", + "parameters": [ + { + "vckit": { + "vckitAPIUrl": "http://localhost:3332/v2", + "issuer": "did:web:60c5-115-79-212-164.ngrok-free.app" + }, + "epcisTransactionEvent": { + "context": ["https://dpp-json-ld.s3.ap-southeast-2.amazonaws.com/transaction-event-ld.json"], + "renderTemplate": [ + { + "template": "Transaction Event

TRACEABILITY EVENT

Transaction

EVENT ISSUED BY

{{issuer.name}}

{{#each issuer.identifiers}}
Industry
Needs to be replaced...
Business identifier
Needs to be replaced...
Identity verification
{{identiferValue}}
Verifiable credential
{{/each}}

Event description

Event ID
{{credentialSubject.eventID}}
Event type
Needs to be replaced...
Description
Needs to be replaced...
Time and date
{{credentialSubject.eventTime}}
Lifecycle action
{{credentialSubject.action}}
Product disposition
{{credentialSubject.disposition}}
Business step
{{credentialSubject.bizStep}}

Transaction

{{credentialSubject.sourceParty.name}}

SOURCE

{{credentialSubject.sourceParty.identifiers.0.identifierValue}}

Transferred

{{credentialSubject.destinationParty.name}}

DESTINATION

{{credentialSubject.destinationParty.partyID}}

Object list

{{#each credentialSubject.epcList}}

{{name}}

{{itemID}}

Product class name

Sustainability 0%
Confidence 0%
View
{{/each}}

Sensor

{{#each credentialSubject.sensorElementList}}
{{sensorMetadata.device.name}}
{{#each sensorReport}}

{{time}}

Data type

{{value}} {{uom}}

{{/each}}{{sensorIntegrityProof}}
Other evidence
{{/each}}
", + "@type": "WebRenderingTemplate2022" + } + ], + "type": ["TransactionEventCredential"], + "dlrLinkTitle": "Transaction Event", + "dlrIdentificationKeyType": "gtin", + "dlrVerificationPage": "http://localhost:3003/verify" + }, + "dlr": { + "dlrAPIUrl": "http://localhost:3000", + "dlrAPIKey": "test123", + "namespace": "gs1", + "linkRegisterPath": "/api/resolver" + }, + "storage": { + "url": "http://localhost:3334/v1/documents", + "params": { + "resultPath": "/uri", + "bucket": "verifiable-credentials" + }, + "options": { + "method": "POST", + "headers": { + "Content-Type": "application/json" + } + } + }, + "identifierKeyPath": "/eventID", + "localStorageParams": { "storageKey": "CherriesFarm_dpps", "keyPath": "/epcList/index/name" } + } + ] + } + ] + } + ] + } + ], + "identifyProvider": { + "type": "gs1", + "url": "http://localhost:3001", + "namespace": "gs1" + }, + "defaultVerificationServiceLink": { + "title": "Default Verification Service", + "context": "Default Verification Service", + "type": "application/json", + "href": "http://localhost:3332/agent/routeVerificationCredential", + "hreflang": ["en"], + "apiKey": "test123" + } +} From a97f7c0912cdd44e8ca3f76995a938caf206be41 Mon Sep 17 00:00:00 2001 From: Nam Hoang Date: Fri, 25 Oct 2024 10:53:43 +0700 Subject: [PATCH 14/17] chore: update CI test Signed-off-by: Nam Hoang --- .github/workflows/build_test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index 8bb54b10..6858d275 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -44,6 +44,6 @@ jobs: uses: artiomtr/jest-coverage-report-action@v2 with: github-token: ${{ secrets.GITHUB_TOKEN }} - coverage-file: ./coverage/coverage-final.json - base-coverage-file: ./coverage/coverage-final.json + coverage-file: coverage/coverage-final.json + base-coverage-file: coverage/coverage-final.json threshold: 80 From 1520ab4b0c9871b5fb41cad22e02df70d55801af Mon Sep 17 00:00:00 2001 From: Nam Hoang Date: Fri, 25 Oct 2024 11:12:08 +0700 Subject: [PATCH 15/17] chore: update version Signed-off-by: Nam Hoang --- .github/workflows/build_test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index 6858d275..501232ff 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -41,7 +41,7 @@ jobs: yarn test:coverage - name: Coverage - uses: artiomtr/jest-coverage-report-action@v2 + uses: artiomtr/jest-coverage-report-action@v2.3.1 with: github-token: ${{ secrets.GITHUB_TOKEN }} coverage-file: coverage/coverage-final.json From e91c0efae077120f5de48cd871d93878c7d1ad99 Mon Sep 17 00:00:00 2001 From: Nam Hoang Date: Fri, 25 Oct 2024 11:28:16 +0700 Subject: [PATCH 16/17] chore: log the coverage file Signed-off-by: Nam Hoang --- .github/workflows/build_test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index 501232ff..be8f6a5a 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -39,7 +39,7 @@ jobs: - name: Run tests run: | yarn test:coverage - + - run: cat coverage/coverage-final.json - name: Coverage uses: artiomtr/jest-coverage-report-action@v2.3.1 with: From 34fcfbce959ab342b4b317921651579a39578692 Mon Sep 17 00:00:00 2001 From: Nam Hoang Date: Fri, 25 Oct 2024 15:42:35 +0700 Subject: [PATCH 17/17] chore: change coverage CI Signed-off-by: Nam Hoang --- .github/workflows/build_test.yml | 16 ++++++++++------ jest.config.base.js | 4 ++-- package.json | 6 ++++-- packages/untp-test-suite/jest.config.js | 2 +- 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index be8f6a5a..414e058b 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -40,10 +40,14 @@ jobs: run: | yarn test:coverage - run: cat coverage/coverage-final.json - - name: Coverage - uses: artiomtr/jest-coverage-report-action@v2.3.1 + - name: Jest Coverage Comment + uses: MishaKav/jest-coverage-comment@main with: - github-token: ${{ secrets.GITHUB_TOKEN }} - coverage-file: coverage/coverage-final.json - base-coverage-file: coverage/coverage-final.json - threshold: 80 + title: Code Coverage Report + multiple-files: | + All packages, ./coverage/coverage-summary.json + Components, ./packages/components/coverage/coverage-summary.json + Mock app, ./packages/mock-app/coverage/coverage-summary.json + Services, ./packages/services/coverage/coverage-summary.json + UNTP test suite, ./packages/untp-test-suite/coverage/coverage-summary.json + VC test suite, ./packages/vc-test-suite/coverage/coverage-summary.json diff --git a/jest.config.base.js b/jest.config.base.js index bb256fe0..aad666ba 100644 --- a/jest.config.base.js +++ b/jest.config.base.js @@ -1,7 +1,7 @@ module.exports = { moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], - collectCoverageFrom: ['/src/**/*.{ts,tsx}', '!**/*.d.ts'], + collectCoverageFrom: ['/src/**/*.{ts,tsx}', '/src/**/*.{js,jsx}', '!**/*.d.ts'], coverageDirectory: '/coverage', - coverageReporters: ['json', 'text', 'lcov'], + coverageReporters: ['json', 'json-summary', 'text', 'lcov'], verbose: true, }; diff --git a/package.json b/package.json index 6f1282a1..14fcf8ab 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,9 @@ "name": "mock-app", "version": "1.0.0", "private": true, - "workspaces": ["packages/*"], + "workspaces": [ + "packages/*" + ], "scripts": { "start": "cp app-config.json packages/mock-app/src/constants/app-config.json && cd packages/mock-app && yarn start", "build": "yarn build:services && yarn build:components && yarn build:untp-test-suite", @@ -11,7 +13,7 @@ "build:untp-test-suite": "cd packages/untp-test-suite && yarn run build", "build-clean": "rimraf --glob ./yarn.lock ./node_modules ./packages/*/tsconfig.tsbuildinfo ./packages/*/build ./packages/*/node_modules", "test": "lerna exec -- yarn jest", - "test:coverage": "lerna exec -- yarn jest --coverage && istanbul-merge --out coverage/coverage-final.json packages/*/coverage/coverage-final.json && nyc report --reporter=html --temp-dir=./coverage", + "test:coverage": "lerna exec -- yarn jest --coverage && istanbul-merge --out coverage/coverage-final.json packages/*/coverage/coverage-final.json && nyc report --temp-dir=./coverage --reporter=html --reporter=json-summary", "test:components": "cd packages/components && yarn run test", "test:services": "cd packages/services && yarn run test", "test:mock-app": "cd packages/mock-app && yarn run test", diff --git a/packages/untp-test-suite/jest.config.js b/packages/untp-test-suite/jest.config.js index fd698551..ea2315dd 100644 --- a/packages/untp-test-suite/jest.config.js +++ b/packages/untp-test-suite/jest.config.js @@ -7,7 +7,7 @@ export default { moduleFileExtensions: [...defaults.moduleFileExtensions, 'mts'], collectCoverage: false, collectCoverageFrom: ['!**/examples/**', '!**/types/**', '!**/build/**', '!**/node_modules/**', '!**/**/index.ts'], - coverageReporters: ['text', 'lcov', 'json'], + coverageReporters: ['text', 'lcov', 'json', 'json-summary'], coverageProvider: 'v8', coverageDirectory: './coverage', extensionsToTreatAsEsm: ['.ts'],