diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..e69de29 diff --git a/GOVERNANCE.md b/GOVERNANCE.md new file mode 100644 index 0000000..e69de29 diff --git a/README.md b/README.md index ee5d669..8b13789 100644 --- a/README.md +++ b/README.md @@ -1,32 +1 @@ -# Beckn-ONIX -Beckn-ONIX is [FIDE](https://fide.org/) project aimed at easing setup and maintainance of a [Beckn](https://becknprotocol.io/) Network using reference implementations. Objectives include setting up reliable, configurable and fast Beckn network as a virtual appliance. This initiative is independent of the evolution of the Beckn protocol. This effort is also aimed at inviting contributions from the community to create secure, reliable builds for production environments. - -> Disclaimer : Beckn-onix is a reference implementation of the Beckn-onix stack. It is a reference application only and has not been tested for production environmens. However, implementers can fork this repository and build it for scale. The maintainer of this repository holds no liabillity for deployments of this application in production environments. - -## GUI Installer - -There is a community contributed browser based GUI installer to install multi-node reference implementation Beckn network. Refer to the [Installation Guide](./onix-gui/GUI/README.md) and [wizard guide](./onix-gui/README.md) for details. - -Here is a [Demo Video](https://drive.google.com/file/d/1p1c1N9vCj-Rv0kBAsRIQ-KFfORTc1DjJ/view?usp=sharing) on how to use beckn-onix GUI: - -[![Beckn Onix GUI](https://mishalabdullah.xyz/images/beckn-cli-youtube.png)](https://drive.google.com/file/d/1p1c1N9vCj-Rv0kBAsRIQ-KFfORTc1DjJ/view?usp=sharing) - -## CLI Installer - -For those comfortable with CLI, there is a command line installer to install multi-node reference implementation Beckn network. Refer to the [User Guide](./docs/user_guide.md) and [Setup Walkthrough](./docs/setup_walkthrough.md) for details. - -Here is a [Demo Video](https://drive.google.com/file/d/1PfdhIpq-Qo6sDy0wAnO0zllCMGX718FW/view?usp=sharing) on how to use beckn-onix CLI: - -[![Beckn Onix CLI](https://mishalabdullah.xyz/images/beckn-gui-youtube.png)](https://drive.google.com/file/d/1PfdhIpq-Qo6sDy0wAnO0zllCMGX718FW/view?usp=sharing) - -## Other documents - -- [Release Notes](./docs/release_notes.md) -- [Known Issues](./docs/known_issues.md) -- [Frequently asked questions (FAQ)](./docs/faq.md) -- **[Note on mandatory layer 2 configuration(Important)](./docs/notes/mandatory_layer_2_config.md).** -- **[Troubleshooting doc](https://github.com/beckn/missions/blob/main/docs/troubleshoot.md).** -- **[Log Interpretation](https://github.com/beckn/missions/blob/main/docs/log-interpretation.md).** - -Experience the convenience and efficiency of Beckn-ONIX as you embark on your journey with Beckn protocols and open networks. diff --git a/artifacts/ONIX - PS Client.postman_collection.json b/artifacts/ONIX - PS Client.postman_collection.json deleted file mode 100644 index 82a2ad8..0000000 --- a/artifacts/ONIX - PS Client.postman_collection.json +++ /dev/null @@ -1,237 +0,0 @@ -{ - "info": { - "_postman_id": "cacfa6d5-ccdd-4225-9fdd-3d4a507e9884", - "name": "ONIX - PS Client", - "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", - "_exporter_id": "13127879" - }, - "item": [ - { - "name": "Industry-4.0", - "item": [ - { - "name": "Search", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"context\": {\n \"domain\": \"{{supply_chain}}\",\n \"location\": {\n \"city\": {\n \"name\": \"Bangalore\",\n \"code\": \"std:080\"\n },\n \"country\": {\n \"name\": \"India\",\n \"code\": \"IND\"\n }\n },\n \"action\": \"search\",\n \"version\": \"1.1.0\",\n \"timestamp\": \"2023-10-09T04:46:28.012Z\",\n \"bap_id\": \"{{bap_id}}\",\n \"bap_uri\": \"{{bap_uri}}\",\n \"bpp_id\": \"{{bpp_id}}\",\n \"bpp_uri\": \"{{bpp_uri}}\",\n \"transaction_id\": \"a9aaecca-10b7-4d19-b640-b047a7c62195\",\n \"message_id\": \"{{$randomUUID}}\"\n },\n \"message\": {\n \"intent\": {\n \"category\": {\n \"descriptor\": {\n \"name\": \"assembly\"\n }\n }\n }\n }\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{base_url_assembly}}/search", - "host": [ - "{{base_url_assembly}}" - ], - "path": [ - "search" - ] - } - }, - "response": [] - }, - { - "name": "Select", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"context\": {\n \"domain\": \"{{supply_chain}}\",\n \"location\": {\n \"country\": {\n \"code\": \"IND\"\n }\n },\n \"action\": \"select\",\n \"timestamp\": \"2023-05-25T05:23:03.443Z\",\n \"version\": \"1.1.0\",\n \"bap_id\": \"{{bap_id}}\",\n \"bap_uri\": \"{{bap_uri}}\",\n \"bpp_id\": \"{{bpp_id}}\",\n \"bpp_uri\": \"{{bpp_uri}}\",\n \"transaction_id\": \"a9aaecca-10b7-4d19-b640-b047a7c62195\",\n \"message_id\": \"{{$randomUUID}}\",\n \"ttl\": \"PT10M\"\n },\n \"message\": {\n \"order\": {\n \"provider\":{\n \"id\":\"6\"\n },\n \"items\": [\n {\n \"id\": \"11\"\n }\n ]\n }\n }\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{base_url_assembly}}/select", - "host": [ - "{{base_url_assembly}}" - ], - "path": [ - "select" - ] - } - }, - "response": [] - }, - { - "name": "Init", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"context\": {\n \"domain\": \"{{supply_chain}}\",\n \"location\": {\n \"country\": {\n \"code\": \"IND\"\n }\n },\n \"action\": \"init\",\n \"timestamp\": \"2023-05-25T05:23:03.443Z\",\n \"version\": \"1.1.0\",\n \"bap_id\": \"{{bap_id}}\",\n \"bap_uri\": \"{{bap_uri}}\",\n \"bpp_id\": \"{{bpp_id}}\",\n \"bpp_uri\": \"{{bpp_uri}}\",\n \"transaction_id\": \"a9aaecca-10b7-4d19-b640-b047a7c62195\",\n \"message_id\": \"{{$randomUUID}}\",\n \"ttl\": \"PT10M\"\n },\n \"message\": {\n \"order\": {\n \"provider\": {\n \"id\": \"6\"\n },\n \"items\": [\n {\n \"id\": \"11\"\n }\n ],\n \"billing\": {\n \"name\": \"Alice Smith\",\n \"address\": \"Apt 303, Maple Towers, Richmond Road, 560001\",\n \"state\": {\n \"name\": \"Jurong East\"\n },\n \"city\": {\n \"name\": \"Jurong East\"\n },\n \"email\": \"alice.smith@example.com\",\n \"phone\": \"9886098860\"\n }\n }\n }\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{base_url_assembly}}/init", - "host": [ - "{{base_url_assembly}}" - ], - "path": [ - "init" - ] - } - }, - "response": [] - }, - { - "name": "Confirm", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"context\": {\n \"domain\": \"{{supply_chain}}\",\n \"location\": {\n \"country\": {\n \"code\": \"IND\"\n }\n },\n \"action\": \"confirm\",\n \"timestamp\": \"2023-05-25T05:23:03.443Z\",\n \"version\": \"1.1.0\",\n \"bap_id\": \"{{bap_id}}\",\n \"bap_uri\": \"{{bap_uri}}\",\n \"bpp_id\": \"{{bpp_id}}\",\n \"bpp_uri\": \"{{bpp_uri}}\",\n \"transaction_id\": \"a9aaecca-10b7-4d19-b640-b047a7c62195\",\n \"message_id\": \"{{$randomUUID}}\",\n \"ttl\": \"PT10M\"\n },\n \"message\": {\n \"order\": {\n \"items\": [\n {\n \"id\": \"11\"\n }\n ],\n \"fulfillments\": [\n {\n \"id\": \"10\",\n \"customer\": {\n \"contact\": {\n \"email\": \"fox.judie61234@abc.org\",\n \"phone\": \"+91-9999999999\"\n },\n \"person\": {\n \"name\": \"Judie Fox6\"\n }\n }\n }\n ],\n \"billing\": {\n \"name\": \"Industry buyer\",\n \"address\": \"B005 aspire heights, Jurong East, SGP, 680230\",\n \"state\": {\n \"name\": \"Jurong East\"\n },\n \"city\": {\n \"name\": \"Jurong East\"\n },\n \"email\": \"nobody@nomail.com\",\n \"phone\": \"9886098860\"\n }\n }\n }\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{base_url_assembly}}/confirm", - "host": [ - "{{base_url_assembly}}" - ], - "path": [ - "confirm" - ] - } - }, - "response": [] - }, - { - "name": "Status", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"context\": {\n \"domain\": \"{{supply_chain}}\",\n \"location\": {\n \"country\": {\n \"code\": \"DE\"\n }\n },\n \"action\": \"status\",\n \"version\": \"1.1.0\",\n \"bap_id\": \"{{bap_id}}\",\n \"bap_uri\": \"{{bap_uri}}\",\n \"bpp_id\": \"{{bpp_id}}\",\n \"bpp_uri\": \"{{bpp_uri}}\",\n \"transaction_id\": \"a9aaecca-10b7-4d19-b640-b047a7c62195\",\n \"message_id\": \"{{$randomUUID}}\",\n \"timestamp\": \"2023-05-25T05:23:03.443Z\",\n \"ttl\": \"P30M\"\n },\n \"message\": {\n \"order_id\": \"9\"\n }\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{base_url_assembly}}/status", - "host": [ - "{{base_url_assembly}}" - ], - "path": [ - "status" - ] - } - }, - "response": [] - } - ] - } - ], - "event": [ - { - "listen": "prerequest", - "script": { - "type": "text/javascript", - "exec": [ - "" - ] - } - }, - { - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "" - ] - } - } - ], - "variable": [ - { - "key": "base_url_prod", - "value": "https://strapi-bpp.becknprotocol.io/beckn-bpp-adapter/health-check", - "type": "string" - }, - { - "key": "base_url_dev", - "value": "https://strapi-bpp-dev.becknprotocol.io/beckn-bpp-adapter", - "type": "string" - }, - { - "key": "base_url_local", - "value": "http://localhost:1337/beckn-bpp-adapter", - "type": "string" - }, - { - "key": "dhp_consultation", - "value": "dhp:consultation:0.1.0", - "type": "string" - }, - { - "key": "supply_chain", - "value": "supply-chain-services:assembly", - "type": "string" - }, - { - "key": "odr", - "value": "online-dispute-resolution:0.1.0", - "type": "string" - }, - { - "key": "bpp_id", - "value": "onix-bpp.becknprotocol.io", - "type": "string" - }, - { - "key": "bpp_uri", - "value": "https://onix-bpp.becknprotocol.io", - "type": "string" - }, - { - "key": "bap_id", - "value": "onix-bap.becknprotocol.io", - "type": "string" - }, - { - "key": "bap_uri", - "value": "https://onix-bap.becknprotocol.io", - "type": "string" - }, - { - "key": "core_version", - "value": "1.1.0", - "type": "string" - }, - { - "key": "uei", - "value": "uei:charging", - "type": "string" - }, - { - "key": "base_url_ev", - "value": "http://ec2-13-126-143-70.ap-south-1.compute.amazonaws.com:5001", - "type": "string" - }, - { - "key": "base_url_assembly", - "value": "https://onix-bap-client.becknprotocol.io", - "type": "string" - } - ] -} \ No newline at end of file diff --git a/artifacts/ONIX Demo Collection.postman_collection.json b/artifacts/ONIX Demo Collection.postman_collection.json deleted file mode 100644 index 46c8f30..0000000 --- a/artifacts/ONIX Demo Collection.postman_collection.json +++ /dev/null @@ -1,197 +0,0 @@ -{ - "info": { - "_postman_id": "303038a6-0aee-4094-b5c3-45fef219cdef", - "name": "ONIX Demo Collection", - "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", - "_exporter_id": "31540449" - }, - "item": [ - { - "name": "UEI", - "item": [ - { - "name": "Search", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"context\": {\n \"domain\": \"uei:charging\",\n \"location\": {\n \"city\": {\n \"name\": \"Bangalore\",\n \"code\": \"std:080\"\n },\n \"country\": {\n \"name\": \"India\",\n \"code\": \"IND\"\n }\n },\n \"action\": \"search\",\n \"version\": \"1.1.0\",\n \"transaction_id\": \"fc24f1e9-6d01-44bf-888c-d5884ca0f66f\",\n \"message_id\": \"{{$randomUUID}}\",\n \"timestamp\": \"2023-10-09T04:46:28.012Z\",\n \"bpp_id\": \"{{bpp_id}}\",\n \"bpp_uri\": \"{{bpp_uri}}\",\n \"bap_id\": \"{{bap_id}}\",\n \"bap_uri\": \"{{bap_uri}}\"\n },\n \"message\": {\n \"intent\": {\n \"location\": {\n \"circle\": {\n \"gps\": \"12.423423,77.325647\",\n \"radius\": {\n \"type\": \"CONSTANT\",\n \"value\": \"5\",\n \"unit\": \"km\"\n }\n }\n }\n }\n }\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{base_url}}/search", - "host": [ - "{{base_url}}" - ], - "path": [ - "search" - ] - } - }, - "response": [] - }, - { - "name": "Select", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"context\": {\n \"domain\": \"{{uei}}\",\n \"location\": {\n \"city\": {\n \"name\": \"Bangalore\",\n \"code\": \"std:080\"\n },\n \"country\": {\n \"name\": \"India\",\n \"code\": \"IND\"\n }\n },\n \"action\": \"select\",\n \"version\": \"1.1.0\",\n \"transaction_id\": \"fc24f1e9-6d01-44bf-888c-d5884ca0f66f\",\n \"message_id\": \"{{$randomUUID}}\",\n \"timestamp\": \"2023-10-09T04:46:28.012Z\",\n \"bpp_id\": \"{{bpp_id}}\",\n \"bpp_uri\": \"{{bpp_uri}}\",\n \"bap_id\": \"{{bap_id}}\",\n \"bap_uri\": \"{{bap_uri}}\"\n },\n \"message\": {\n \"order\": {\n \"provider\": {\n \"id\": \"1\"\n },\n \"items\": [\n {\n \"id\": \"1\"\n }\n ]\n }\n }\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{base_url}}/select", - "host": [ - "{{base_url}}" - ], - "path": [ - "select" - ] - } - }, - "response": [] - }, - { - "name": "Init", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"context\": {\n \"domain\": \"{{uei}}\",\n \"location\": {\n \"city\": {\n \"name\": \"Bangalore\",\n \"code\": \"std:080\"\n },\n \"country\": {\n \"name\": \"India\",\n \"code\": \"IND\"\n }\n },\n \"action\": \"init\",\n \"version\": \"1.1.0\",\n \"transaction_id\": \"fc24f1e9-6d01-44bf-888c-d5884ca0f66f\",\n \"message_id\": \"{{$randomUUID}}\",\n \"timestamp\": \"2023-10-09T04:46:28.012Z\",\n \"bpp_id\": \"{{bpp_id}}\",\n \"bpp_uri\": \"{{bpp_uri}}\",\n \"bap_id\": \"{{bap_id}}\",\n \"bap_uri\": \"{{bap_uri}}\"\n },\n \"message\": {\n \"order\": {\n \"provider\": {\n \"id\": \"1\"\n },\n \"items\": [\n {\n \"id\": \"1\"\n }\n ],\n \"billing\": {\n \"name\": \"Alice Smith\",\n \"address\": \"Apt 303, Maple Towers, Richmond Road, 560001\",\n \"state\": {\n \"name\": \"Jurong East\"\n },\n \"city\": {\n \"name\": \"Jurong East\"\n },\n \"email\": \"alice.smith@example.com\",\n \"phone\": \"9886098860\"\n }\n }\n }\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{base_url}}/init", - "host": [ - "{{base_url}}" - ], - "path": [ - "init" - ] - } - }, - "response": [] - }, - { - "name": "Confirm", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"context\": {\n \"domain\": \"{{uei}}\",\n \"location\": {\n \"city\": {\n \"name\": \"Bangalore\",\n \"code\": \"std:080\"\n },\n \"country\": {\n \"name\": \"India\",\n \"code\": \"IND\"\n }\n },\n \"action\": \"confirm\",\n \"version\": \"1.1.0\",\n \"transaction_id\": \"fc24f1e9-6d01-44bf-888c-d5884ca0f66f\",\n \"message_id\": \"{{$randomUUID}}\",\n \"timestamp\": \"2023-10-09T04:46:28.012Z\",\n \"bpp_id\": \"{{bpp_id}}\",\n \"bpp_uri\": \"{{bpp_uri}}\",\n \"bap_id\": \"{{bap_id}}\",\n \"bap_uri\": \"{{bap_uri}}\"\n },\n \"message\": {\n \"order\": {\n \"items\": [\n {\n \"id\": \"1\"\n }\n ],\n \"fulfillments\": [\n {\n \"id\": \"1\",\n \"customer\": {\n \"contact\": {\n \"email\": \"fox.judie61234@abc.org\",\n \"phone\": \"+91-9999999999\"\n },\n \"person\": {\n \"name\": \"Judie Fox6\"\n }\n }\n }\n ],\n \"billing\": {\n \"name\": \"Industry buyer\",\n \"address\": \"B005 aspire heights, Jurong East, SGP, 680230\",\n \"state\": {\n \"name\": \"Jurong East\"\n },\n \"city\": {\n \"name\": \"Jurong East\"\n },\n \"email\": \"nobody@nomail.com\",\n \"phone\": \"9886098860\"\n }\n }\n }\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{base_url}}/confirm", - "host": [ - "{{base_url}}" - ], - "path": [ - "confirm" - ] - } - }, - "response": [] - }, - { - "name": "Status", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"context\": {\n \"domain\": \"{{uei}}\",\n \"location\": {\n \"city\": {\n \"name\": \"Bangalore\",\n \"code\": \"std:080\"\n },\n \"country\": {\n \"name\": \"India\",\n \"code\": \"IND\"\n }\n },\n \"action\": \"status\",\n \"version\": \"1.1.0\",\n \"transaction_id\": \"fc24f1e9-6d01-44bf-888c-d5884ca0f66f\",\n \"message_id\": \"{{$randomUUID}}\",\n \"timestamp\": \"2023-10-09T04:46:28.012Z\",\n \"bpp_id\": \"{{bpp_id}}\",\n \"bpp_uri\": \"{{bpp_uri}}\",\n \"bap_id\": \"{{bap_id}}\",\n \"bap_uri\": \"{{bap_uri}}\"\n },\n \"message\": {\n \"order_id\": \"1\"\n }\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{base_url}}/status", - "host": [ - "{{base_url}}" - ], - "path": [ - "status" - ] - } - }, - "response": [] - } - ] - } - ], - "event": [ - { - "listen": "prerequest", - "script": { - "type": "text/javascript", - "exec": [ - "" - ] - } - }, - { - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "" - ] - } - } - ], - "variable": [ - { - "key": "bpp_id", - "value": "onix-bpp.becknprotocol.io", - "type": "string" - }, - { - "key": "bpp_uri", - "value": "https://onix-bpp.becknprotocol.io", - "type": "string" - }, - { - "key": "bap_id", - "value": "onix-bap.becknprotocol.io", - "type": "string" - }, - { - "key": "bap_uri", - "value": "https://onix-bap.becknprotocol.io", - "type": "string" - }, - { - "key": "core_version", - "value": "1.1.0", - "type": "string" - }, - { - "key": "base_url", - "value": "https://onix-bap-client.becknprotocol.io", - "type": "string" - } - ] -} \ No newline at end of file diff --git a/aws-cdk/.gitignore b/aws-cdk/.gitignore deleted file mode 100644 index 907b042..0000000 --- a/aws-cdk/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -*.js -!jest.config.js -*.d.ts -node_modules - -# CDK asset staging directory -.cdk.staging -cdk.out -.env diff --git a/aws-cdk/README.md b/aws-cdk/README.md deleted file mode 100644 index b739d81..0000000 --- a/aws-cdk/README.md +++ /dev/null @@ -1,44 +0,0 @@ -# Beckn-ONIX, one-click deployment on AWS - - -### Description -Beckn-ONIX is **[FIDE](https://fide.org/)** project aimed at easing setup and maintainance of a **[Beckn](https://becknprotocol.io/)** Network using reference implementations. Objectives include setting up reliable, configurable and fast Beckn network as a virtual appliance. This initiative is independent of the evolution of the Beckn protocol. This effort is also aimed at inviting contributions from the community to create secure, reliable builds for production environments. - -> **Info:** Disclaimer : Beckn-onix is a reference implementation of the Beckn-onix stack. It is a reference application only and has not been tested for production environmens. However, implementers can fork this repository and build it for scale. The maintainer of this repository holds no liabillity for deployments of this application in production environments. - - -### Packaging overview -This packaging initiative provides a robust solution for deploying and managing Beckn-ONIX services on AWS. It is designed to ensure high availability, scalability, and resilience of Beckn-ONIX components like the Gateway, Registry, BAP, and BPP, making them ready for a Kubernetes-based environment. Additionally, it allows users the flexibility to choose managed AWS services, optimizing for production-scale deployments while reducing operational overhead. - -The packaging supports a fully automated, one-click deployment solution aligned with the reference architecture, ensuring that each layer of the Beckn-ONIX stack is designed with fault tolerance, load balancing, and scaling in mind. This approach not only simplifies the deployment process but also promotes best practices in infrastructure as code, making it easier to maintain and evolve the platform in a cost-effective manner. - -### Beckn-ONIX Deployment -This repository contains the source code and configuration for deploying Beckn-ONIX services stack that leverages the power of Amazon Web Services (AWS) **[Cloud Development Kit (CDK)](https://aws.amazon.com/cdk)** for infrastructure provisioning and **[Helm](https://helm.sh)** for deploying services within an Amazon Elastic Kubernetes Service (EKS) cluster. - -Two mode of deployments, catering to different deployment scenarios. - -#### Mode One: AWS CDK + Helm -This mode offers a comprehensive solution for users who prefer a one-click deployment approach to provisioning AWS infrastructure and deploying the Beckn-ONIX services, all in automated fashion. - -* [AWS CDK One Click Deployment](documentations/01-Deployment-CDK-Beckn-ONIX.md) - -#### Mode Two: Direct Helm Chart Invocation -An alternative deployment approach accommodates users with existing essential AWS infrastructure components like Amazon RDS Postgres and an Amazon EKS cluster. This mode enables the direct installation of the Sunbird RC 2.0 Helm chart without relying on AWS CDK scripts. Alternatively, you can combine both methods, utilizing CDK for provisioning specific services like the EKS cluster. - -* [Helm Chart Deployment](documentations/02-Deployment-Helm-Beckn-ONIX.md) - -### Beckn-ONIX reference architecture -#### Mendatory AWS services -Required AWS services to deploy and operate the Beckn-ONIX services: -* Amazon VPC -* Amazon RDS for PostgreSQL (registry and gateway) -* Amazon EKS -* Amazon ALB -* Amazon EBS and EFS volumes - -#### Optional AWS services - Only for BAP and BPP -* Amazon DocumentDB with MongoDB compatibility -* Amazon Elasticache - Redis -* Amazon MQ - RabbitMQ - -![Architecture](documentations/images/Beckn-ONIX-AWS-reference-arch-master.png) diff --git a/aws-cdk/beckn-cdk/.env b/aws-cdk/beckn-cdk/.env deleted file mode 100644 index e3f3782..0000000 --- a/aws-cdk/beckn-cdk/.env +++ /dev/null @@ -1,59 +0,0 @@ -### AWS ENVIRONMENT SPECIFIC VARIABLES ### - -# AWS account ID -ACCOUNT="####" - -# AWS region to deploy services (default: "ap-south-1") -REGION="ap-south-1" - -# AWS Availability Zone count (default: 2) -MAX_AZS=2 - -# VPC CIDR block (default: "10.20.0.0/16") -CIDR="10.20.0.0/16" - -# Database user name (default: "postgres") -RDS_USER="postgres" - -# EKS cluster name (default: "eksCluster-beckn-onix") -EKS_CLUSTER_NAME="eksCluster-beckn-onix" - -# EC2 nodes count (default: 5 nodes) -EC2_NODES_COUNT="5" - -# EC2 instance type (default: "t3.large") -EC2_INSTANCE_TYPE="t3.large" - -# IAM role ARN for Amazon EKS master role -# (to be associated with the system:masters RBAC group for super-user access) -ROLE_ARN="arn:aws:iam::####:role/Admin" - - -#### BECKN-ONIX SPECIFIC MANDATORY VARIABLES #### - -# COMMON BECKN-ONIX Helm repository URL -BECKN_ONIX_HELM_REPOSITORY="https://mozammil89.github.io/beckn-onix-aws-cdk" - -# COMMON REGISTRY URL FOR GATEWAY, BAP AND BPP -# E.g. registry-cdk.beckn-onix-aws-cdk.becknprotocol.io -REGISTRY_URL="####" # it should be same as REGISTRY_EXTERNAL_DOMAIN - -# COMMON SSL certificate ARN for REGISTRY, GATEWAY, BAP AND BPP -# AWS Certificate Manager - https://aws.amazon.com/certificate-manager/ -CERT_ARN="####" # Pls check user guide for SSL public certificate creation steps through AWS Certificate Manager - -# REGISTRY -REGISTRY_EXTERNAL_DOMAIN="####" # E.g. registry-cdk.beckn-onix-aws-cdk.becknprotocol.io - -# GATEWAY -GATEWAY_EXTERNAL_DOMAIN="####" # E.g. gateway-cdk.beckn-onix-aws-cdk.becknprotocol.io - -# BAP (Buyer Application Provider) Configuration -BAP_EXTERNAL_DOMAIN="####" # E.g. bap-cdk.beckn-onix-aws-cdk.becknprotocol.io -BAP_PRIVATE_KEY="####" # Pls check user guide for key generation -BAP_PUBLIC_KEY="####" # Pls check user guide for key generation - -# BPP (Buyer Platform Provider) Configuration -BPP_EXTERNAL_DOMAIN="####" # E.g. bpp-cdk.beckn-onix-aws-cdk.becknprotocol.io -BPP_PRIVATE_KEY="####" # Pls check user guide for key generation -BPP_PUBLIC_KEY="####" # Pls check user guide for key generation diff --git a/aws-cdk/beckn-cdk/.gitignore b/aws-cdk/beckn-cdk/.gitignore deleted file mode 100644 index 4e56b7b..0000000 --- a/aws-cdk/beckn-cdk/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -*.js -!jest.config.js -*.d.ts -node_modules - -# CDK asset staging directory -.cdk.staging -cdk.out -.env -cdk.context.json \ No newline at end of file diff --git a/aws-cdk/beckn-cdk/.npmignore b/aws-cdk/beckn-cdk/.npmignore deleted file mode 100644 index c1d6d45..0000000 --- a/aws-cdk/beckn-cdk/.npmignore +++ /dev/null @@ -1,6 +0,0 @@ -*.ts -!*.d.ts - -# CDK asset staging directory -.cdk.staging -cdk.out diff --git a/aws-cdk/beckn-cdk/bin/beckn-cdk.ts b/aws-cdk/beckn-cdk/bin/beckn-cdk.ts deleted file mode 100644 index 15d012e..0000000 --- a/aws-cdk/beckn-cdk/bin/beckn-cdk.ts +++ /dev/null @@ -1,204 +0,0 @@ -#!/usr/bin/env node -import * as cdk from 'aws-cdk-lib'; -import { StackProps } from 'aws-cdk-lib'; -import { ConfigProps, getConfig } from '../lib/config'; - -import { VpcStack } from '../lib/vpc-stack'; -import { RdsStack } from '../lib/rds-stack'; -import { EksStack } from '../lib/eks-stack'; -import { RedisStack } from '../lib/redis-stack'; -import { DocumentDbStack } from '../lib/documentdb-stack'; -import { RabbitMqStack } from '../lib/rabbitmq-stack'; - -import { HelmRegistryStack } from '../lib/helm-registry'; -import { HelmGatewayStack } from '../lib/helm-gateway'; -import { HelmCommonServicesStack } from '../lib/helm-beckn-common-services'; -import { HelmBapStack } from '../lib/helm-bap'; -import { HelmBppStack } from '../lib/helm-bpp'; - - -const config = getConfig(); -const app = new cdk.App(); - -type AwsEnvStackProps = StackProps & { - config: ConfigProps; -}; - -// Retrieve AWS Account ID and Region from the environment -const accountId = config.ACCOUNT; -const region = config.REGION; - -if (!accountId || !region) { - console.error("AWS_ACCOUNT_ID or AWS_REGION is missing from .env file"); - process.exit(1); -} - -// Common environment configuration for all stacks -const env = { account: accountId, region: region }; - -// Function to deploy registry environment -const deployRegistry = () => { - var envC = "registry"; - const vpcStack = new VpcStack(app, 'RegistryVpcStack', { config: config, env }); - const eksStack = new EksStack(app, 'RegistryEksStack', { config: config, vpc: vpcStack.vpc, env }); - const rdsStack = new RdsStack(app, 'RegistryRdsStack', { config: config, vpc: vpcStack.vpc, envC: envC, env }); - - new HelmRegistryStack(app, 'HelmRegistryStack', { - config: config, - rdsHost: rdsStack.rdsHost, - rdsPassword: rdsStack.rdsPassword, - eksCluster: eksStack.cluster, - env, - }); -}; - -// Function to deploy gateway environment -const deployGateway = () => { - var envC = "gateway"; - const vpcStack = new VpcStack(app, 'GatewayVpcStack', { config: config, env }); - const eksStack = new EksStack(app, 'GatewayEksStack', { config: config, vpc: vpcStack.vpc, env }); - const rdsStack = new RdsStack(app, 'GatewayRdsStack', { config: config, vpc: vpcStack.vpc, envC: envC, env }); - - new HelmGatewayStack(app, 'HelmGatewayStack', { - config: config, - rdsHost: rdsStack.rdsHost, - rdsPassword: rdsStack.rdsPassword, - eksCluster: eksStack.cluster, - env, - }); - -}; - -// Function to deploy BAP environment -const deployBAP = () => { - const vpcStack = new VpcStack(app, 'BapVpcStack', { config: config, env }); - const eksStack = new EksStack(app, 'BapEksStack', {config: config, vpc: vpcStack.vpc, env }); - - // bitnami - common services on eks - self hosted - new HelmCommonServicesStack(app, 'HelmBapCommonServicesStack', { - config: config, - eksCluster: eksStack.cluster, - service: 'bap', - env, - }); - - new HelmBapStack(app, 'HelmBapStack', { - config: config, - eksCluster: eksStack.cluster, - vpc: vpcStack.vpc, - eksSecGrp: eksStack.eksSecGrp, - isSandbox: false, - env, - }); - -}; - -// Function to deploy BPP environment -const deployBPP = () => { - const vpcStack = new VpcStack(app, 'BppVpcStack', {config: config, env }); - const eksStack = new EksStack(app, 'BppEksStack', {config: config, vpc: vpcStack.vpc, env }); - - // if bitnami - new HelmCommonServicesStack(app, 'HelmBapCommonServicesStack', { - config: config, - eksCluster: eksStack.cluster, - service: 'bpp', - env, - }); - - new HelmBppStack(app, 'HelmBppStack', { - config: config, - eksCluster: eksStack.cluster, - vpc: vpcStack.vpc, - eksSecGrp: eksStack.eksSecGrp, - isSandbox: false, - env, - }); -}; - -// Function to deploy sandbox environment (all stacks) -const deploySandbox = () => { - var envC = "sandbox"; - const vpcStack = new VpcStack(app, 'VpcStack', {config: config, env }); - const eksStack = new EksStack(app, 'EksStack', {config: config, vpc: vpcStack.vpc, env }); - const rdsStack = new RdsStack(app, 'RdsStack', { config: config, vpc: vpcStack.vpc, envC: envC, env }); - - new HelmRegistryStack(app, 'HelmRegistryStack', { - config: config, - rdsHost: rdsStack.rdsHost, - rdsPassword: rdsStack.rdsPassword, - eksCluster: eksStack.cluster, - env, - }); - - new HelmGatewayStack(app, 'HelmGatewayStack', { - config: config, - rdsHost: rdsStack.rdsHost, - rdsPassword: rdsStack.rdsPassword, - eksCluster: eksStack.cluster, - env, - }); - - // default - bitnami - new HelmCommonServicesStack(app, 'BapHelmCommonServicesStack', { - config: config, - eksCluster: eksStack.cluster, - service: 'bap', - env, - }); - - new HelmCommonServicesStack(app, 'BppHelmCommonServicesStack', { - config: config, - eksCluster: eksStack.cluster, - service: 'bpp', - env, - }); - - new HelmBapStack(app, 'HelmBapStack', { - config: config, - eksCluster: eksStack.cluster, - vpc: vpcStack.vpc, - eksSecGrp: eksStack.eksSecGrp, - isSandbox: true, - env, - }); - - new HelmBppStack(app, 'HelmBppStack', { - config: config, - eksCluster: eksStack.cluster, - vpc: vpcStack.vpc, - eksSecGrp: eksStack.eksSecGrp, - isSandbox: true, - env, - }); -}; - -// Retrieve the environment from CDK context -const environment = app.node.tryGetContext('env'); - -// Deploy based on the selected environment -switch (environment) { - case 'sandbox': - console.log('Deploying sandbox environment...'); - deploySandbox(); - break; - case 'registry': - console.log('Deploying registry environment...'); - deployRegistry(); - break; - case 'gateway': - console.log('Deploying gateway environment...'); - deployGateway(); - break; - case 'bap': - console.log('Deploying BAP environment...'); - deployBAP(); - break; - case 'bpp': - console.log('Deploying BPP environment...'); - deployBPP(); - break; - default: - console.error('Unknown environment specified.'); - process.exit(1); -} diff --git a/aws-cdk/beckn-cdk/cdk.json b/aws-cdk/beckn-cdk/cdk.json deleted file mode 100644 index 0487806..0000000 --- a/aws-cdk/beckn-cdk/cdk.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "app": "npx ts-node --prefer-ts-exts bin/beckn-cdk.ts", - "watch": { - "include": [ - "**" - ], - "exclude": [ - "README.md", - "cdk*.json", - "**/*.d.ts", - "**/*.js", - "tsconfig.json", - "package*.json", - "yarn.lock", - "node_modules", - "test" - ] - }, - "context": { - "@aws-cdk/aws-lambda:recognizeLayerVersion": true, - "@aws-cdk/core:checkSecretUsage": true, - "@aws-cdk/core:target-partitions": [ - "aws", - "aws-cn" - ], - "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, - "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, - "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, - "@aws-cdk/aws-iam:minimizePolicies": true, - "@aws-cdk/core:validateSnapshotRemovalPolicy": true, - "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true, - "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true, - "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true, - "@aws-cdk/aws-apigateway:disableCloudWatchRole": true, - "@aws-cdk/core:enablePartitionLiterals": true, - "@aws-cdk/aws-events:eventsTargetQueueSameAccount": true, - "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, - "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": true, - "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true, - "@aws-cdk/aws-route53-patters:useCertificate": true, - "@aws-cdk/customresources:installLatestAwsSdkDefault": false, - "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": true, - "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": true, - "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": true, - "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": true, - "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": true, - "@aws-cdk/aws-redshift:columnId": true, - "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": true, - "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": true, - "@aws-cdk/aws-apigateway:requestValidatorUniqueId": true, - "@aws-cdk/aws-kms:aliasNameRef": true, - "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": true, - "@aws-cdk/core:includePrefixInUniqueNameGeneration": true, - "@aws-cdk/aws-efs:denyAnonymousAccess": true, - "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": true, - "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": true, - "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": true, - "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": true, - "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": true, - "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": true, - "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": true, - "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": true, - "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": true, - "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": true, - "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": true, - "@aws-cdk/aws-eks:nodegroupNameAttribute": true, - "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": true, - "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": true, - "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": false, - "@aws-cdk/aws-s3:keepNotificationInImportedBucket": false - } -} diff --git a/aws-cdk/beckn-cdk/jest.config.js b/aws-cdk/beckn-cdk/jest.config.js deleted file mode 100644 index 08263b8..0000000 --- a/aws-cdk/beckn-cdk/jest.config.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - testEnvironment: 'node', - roots: ['/test'], - testMatch: ['**/*.test.ts'], - transform: { - '^.+\\.tsx?$': 'ts-jest' - } -}; diff --git a/aws-cdk/beckn-cdk/lib/config.ts b/aws-cdk/beckn-cdk/lib/config.ts deleted file mode 100644 index e48a867..0000000 --- a/aws-cdk/beckn-cdk/lib/config.ts +++ /dev/null @@ -1,65 +0,0 @@ -import * as dotenv from "dotenv"; -import path = require("path"); - -dotenv.config({ path: path.resolve(__dirname, "../.env") }); - -export type ConfigProps = { - REGION: string, - ACCOUNT: string, - REPOSITORY: string, - REGISTRY_RELEASE_NAME: string; - GATEWAY_RELEASE_NAME: string; - BAP_RELEASE_NAME: string; - BPP_RELEASE_NAME: string, - RDS_USER: string, - CERT_ARN: string, - REGISTRY_URL: string, - MAX_AZS: number, - EKS_CLUSTER_NAME: string, - CIDR: string, - EC2_NODES_COUNT: number; - EC2_INSTANCE_TYPE: string; - ROLE_ARN: string; - DOCDB_PASSWORD: string; - RABBITMQ_PASSWORD: string; - NAMESPACE: string; - BAP_PUBLIC_KEY: string; - BAP_PRIVATE_KEY: string; - BPP_PUBLIC_KEY: string; - BPP_PRIVATE_KEY: string; - REGISTRY_EXTERNAL_DOMAIN: string, - GATEWAY_EXTERNAL_DOMAIN: string; - BAP_EXTERNAL_DOMAIN: string; - BPP_EXTERNAL_DOMAIN: string; - -}; - -export const getConfig = (): ConfigProps => ({ - REGION: process.env.REGION || "ap-south-1", - ACCOUNT: process.env.ACCOUNT || "", - REPOSITORY: process.env.BECKN_ONIX_HELM_REPOSITORY || "", - MAX_AZS: Number(process.env.MAZ_AZs) || 2, - REGISTRY_RELEASE_NAME: "beckn-onix-registry", - GATEWAY_RELEASE_NAME: "beckn-onix-gateway", - BAP_RELEASE_NAME: "beckn-onix-bap", - BPP_RELEASE_NAME: "beckn-onix-bpp", - RDS_USER: process.env.RDS_USER || "postgres", - CERT_ARN: process.env.CERT_ARN || "", // user must provide it - REGISTRY_URL: process.env.REGISTRY_URL || "", // beckn-onix reg url - EKS_CLUSTER_NAME: process.env.EKS_CLUSTER_NAME || "beckn-onix", - CIDR: process.env.CIDR || "10.20.0.0/16", - EC2_NODES_COUNT: Number(process.env.EC2_NODES_COUNT) || 2, - EC2_INSTANCE_TYPE: process.env.EC2_INSTANCE_TYPE || "t3.large", - ROLE_ARN: process.env.ROLE_ARN || "", - DOCDB_PASSWORD: process.env.DOCDB_PASSWORD || "", - RABBITMQ_PASSWORD: process.env.RABBITMQ_PASSWORD || "", - NAMESPACE: "-common-services", - BAP_PUBLIC_KEY: process.env.BAP_PUBLIC_KEY || "", - BAP_PRIVATE_KEY: process.env.BAP_PRIVATE_KEY || "", - BPP_PUBLIC_KEY: process.env.BPP_PUBLIC_KEY || "", - BPP_PRIVATE_KEY: process.env.BPP_PRIVATE_KEY || "", - REGISTRY_EXTERNAL_DOMAIN: process.env.REGISTRY_EXTERNAL_DOMAIN || "", // user must provide it - GATEWAY_EXTERNAL_DOMAIN: process.env.GATEWAY_EXTERNAL_DOMAIN || "", // user must provide it - BAP_EXTERNAL_DOMAIN: process.env.BAP_EXTERNAL_DOMAIN || "", // user must provide it - BPP_EXTERNAL_DOMAIN: process.env.BPP_EXTERNAL_DOMAIN || "", // user must provide it -}); \ No newline at end of file diff --git a/aws-cdk/beckn-cdk/lib/documentdb-stack.ts b/aws-cdk/beckn-cdk/lib/documentdb-stack.ts deleted file mode 100644 index 7ec2456..0000000 --- a/aws-cdk/beckn-cdk/lib/documentdb-stack.ts +++ /dev/null @@ -1,64 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import { Construct } from 'constructs'; -import * as ec2 from 'aws-cdk-lib/aws-ec2'; -import * as docdb from 'aws-cdk-lib/aws-docdb'; -import * as dotenv from 'dotenv'; -import { ConfigProps } from './config'; - -// Load environment variables from .env file -dotenv.config(); - -interface DocumentDbStackProps extends cdk.StackProps { - config: ConfigProps; - vpc: ec2.Vpc; -} - -export class DocumentDbStack extends cdk.Stack { - constructor(scope: Construct, id: string, props: DocumentDbStackProps) { - super(scope, id, props); - - // Use environment variable from .env file or fallback to a default value - const docDbPassword = new cdk.CfnParameter(this, 'DocDbPassword', { - type: 'String', - description: 'The password for the DocumentDB cluster admin user', - noEcho: true, - default: props.config.DOCDB_PASSWORD || '', // Use environment variable - }); - - // Security group for DocumentDB - const docDbSecurityGroup = new ec2.SecurityGroup(this, 'DocDbSecurityGroup', { - vpc: props.vpc, - description: 'Security group for DocumentDB', - allowAllOutbound: true, - }); - - docDbSecurityGroup.addIngressRule(ec2.Peer.ipv4(props.vpc.vpcCidrBlock), ec2.Port.tcp(27017), 'Allow DocumentDB traffic on port 27017'); - - // DocumentDB subnet group - const docDbSubnetGroup = new docdb.CfnDBSubnetGroup(this, 'DocDbSubnetGroup', { - dbSubnetGroupDescription: 'Subnet group for DocumentDB', - subnetIds: props.vpc.selectSubnets({ subnetType: ec2.SubnetType.PRIVATE_WITH_NAT }).subnetIds, - }); - - // DocumentDB cluster - const docDbCluster = new docdb.CfnDBCluster(this, 'DocDbCluster', { - masterUsername: 'beckn', - masterUserPassword: docDbPassword.valueAsString, // Password entered by the user - dbClusterIdentifier: 'MyDocDbCluster', - engineVersion: '4.0.0', - vpcSecurityGroupIds: [docDbSecurityGroup.securityGroupId], - dbSubnetGroupName: docDbSubnetGroup.ref, - }); - - // Create 2 DocumentDB instances - new docdb.CfnDBInstance(this, 'DocDbInstance1', { - dbClusterIdentifier: docDbCluster.ref, - dbInstanceClass: 'db.r5.large', - }); - - new docdb.CfnDBInstance(this, 'DocDbInstance2', { - dbClusterIdentifier: docDbCluster.ref, - dbInstanceClass: 'db.r5.large', - }); - } -} diff --git a/aws-cdk/beckn-cdk/lib/eks-stack.ts b/aws-cdk/beckn-cdk/lib/eks-stack.ts deleted file mode 100644 index 891bc63..0000000 --- a/aws-cdk/beckn-cdk/lib/eks-stack.ts +++ /dev/null @@ -1,149 +0,0 @@ -import * as ec2 from 'aws-cdk-lib/aws-ec2'; -import * as eks from 'aws-cdk-lib/aws-eks'; -import * as iam from 'aws-cdk-lib/aws-iam'; -import * as cdk from 'aws-cdk-lib'; -import { KubectlV30Layer } from '@aws-cdk/lambda-layer-kubectl-v30'; -// import { CfnAutoScalingGroup } from 'aws-cdk-lib/aws-autoscaling'; -import { Construct } from 'constructs'; -import { ConfigProps } from './config'; - -export interface EksStackProps extends cdk.StackProps { - config: ConfigProps; - vpc: ec2.Vpc; -} - -export class EksStack extends cdk.Stack { - public readonly cluster: eks.Cluster; - public readonly eksSecGrp: ec2.SecurityGroup; - - constructor(scope: Construct, id: string, props: EksStackProps) { - super(scope, id, props); - - const config = props.config; - - - const vpc = props.vpc; - const cidr = config.CIDR; // from config file - const EKS_CLUSTER_NAME = config.EKS_CLUSTER_NAME; // take it from config file - // const ROLE_ARN = 'ROLE_ARN'; // take form config file - const ROLE_ARN = config.ROLE_ARN; - - const securityGroupEKS = new ec2.SecurityGroup(this, "EKSSecurityGroup", { - vpc: vpc, - allowAllOutbound: true, - description: "Security group for EKS", - }); - - securityGroupEKS.addIngressRule( - ec2.Peer.ipv4(cidr), - ec2.Port.allTraffic(), - "Allow EKS traffic" - - ); - // securityGroupEKS.addIngressRule( - // ec2.Peer.securityGroupId(securityGroupEKS.securityGroupId), - // ec2.Port.allTraffic(), - // "Allow EKS traffic" - // ); - - const iamRole = iam.Role.fromRoleArn(this, "MyIAMRole", ROLE_ARN); - - // Create the EKS cluster - this.cluster = new eks.Cluster(this, 'EksCluster', { - vpc: vpc, - vpcSubnets: [{ subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }], - defaultCapacity: 0, - // defaultCapacityInstance: new ec2.InstanceType(config.EC2_INSTANCE_TYPE), - kubectlLayer: new KubectlV30Layer(this, 'KubectlLayer'), - version: eks.KubernetesVersion.V1_30, - securityGroup: securityGroupEKS, - endpointAccess: eks.EndpointAccess.PUBLIC_AND_PRIVATE, - ipFamily: eks.IpFamily.IP_V4, - clusterName: EKS_CLUSTER_NAME, - mastersRole: iamRole, // Assign the admin role to the cluster - outputClusterName: true, - outputConfigCommand: true, - authenticationMode: eks.AuthenticationMode.API_AND_CONFIG_MAP, - bootstrapClusterCreatorAdminPermissions: true, - - albController: { - version: eks.AlbControllerVersion.V2_8_1, - repository: "public.ecr.aws/eks/aws-load-balancer-controller", - }, - }); - - const key1 = this.cluster.openIdConnectProvider.openIdConnectProviderIssuer; - const stringEquals = new cdk.CfnJson(this, 'ConditionJson', { - value: { - [`${key1}:sub`]: ['system:serviceaccount:kube-system:ebs-csi-controller-sa', 'system:serviceaccount:kube-system:efs-csi-controller-sa'], - [`${key1}:aud`]: 'sts.amazonaws.com' - }, - }) - - const oidcEKSCSIRole = new iam.Role(this, "OIDCRole", { - assumedBy: new iam.FederatedPrincipal( - `arn:aws:iam::${this.account}:oidc-provider/${this.cluster.clusterOpenIdConnectIssuer}`, - { - StringEquals: stringEquals, - - }, - "sts:AssumeRoleWithWebIdentity" - ), - }); - - // Attach a managed policy to the role - oidcEKSCSIRole.addManagedPolicy(iam.ManagedPolicy.fromAwsManagedPolicyName("service-role/AmazonEBSCSIDriverPolicy")) - oidcEKSCSIRole.addManagedPolicy(iam.ManagedPolicy.fromAwsManagedPolicyName("service-role/AmazonEFSCSIDriverPolicy")) - - const ebscsi = new eks.CfnAddon(this, "addonEbsCsi", - { - addonName: "aws-ebs-csi-driver", - clusterName: this.cluster.clusterName, - serviceAccountRoleArn: oidcEKSCSIRole.roleArn - } - ); - - const efscsi = new eks.CfnAddon(this, "addonEfsCsi", - { - addonName: "aws-efs-csi-driver", - clusterName: this.cluster.clusterName, - serviceAccountRoleArn: oidcEKSCSIRole.roleArn - } - ); - - new cdk.CfnOutput(this, String("OIDC-issuer"), { - value: this.cluster.clusterOpenIdConnectIssuer, - }); - - new cdk.CfnOutput(this, String("OIDC-issuerURL"), { - value: this.cluster.clusterOpenIdConnectIssuerUrl, - }); - - new cdk.CfnOutput(this, "EKS Cluster Name", { - value: this.cluster.clusterName, - }); - new cdk.CfnOutput(this, "EKS Cluster Arn", { - value: this.cluster.clusterArn, - }); - - const launchTemplate = new ec2.CfnLaunchTemplate(this, 'MyLaunchTemplate', { - launchTemplateData: { - instanceType: config.EC2_INSTANCE_TYPE, - securityGroupIds: [this.cluster.clusterSecurityGroupId, securityGroupEKS.securityGroupId], - } - }); - - // Create node group using the launch template - this.cluster.addNodegroupCapacity('CustomNodeGroup', { - amiType: eks.NodegroupAmiType.AL2_X86_64, - desiredSize: config.EC2_NODES_COUNT, - launchTemplateSpec: { - id: launchTemplate.ref, - version: launchTemplate.attrLatestVersionNumber, - }, - subnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }, - }); - - this.eksSecGrp = securityGroupEKS; - } -} \ No newline at end of file diff --git a/aws-cdk/beckn-cdk/lib/helm-bap.ts b/aws-cdk/beckn-cdk/lib/helm-bap.ts deleted file mode 100644 index 8a1c08e..0000000 --- a/aws-cdk/beckn-cdk/lib/helm-bap.ts +++ /dev/null @@ -1,90 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import * as eks from 'aws-cdk-lib/aws-eks'; -import * as helm from 'aws-cdk-lib/aws-eks'; -import { Stack, StackProps } from 'aws-cdk-lib'; -import { Construct } from 'constructs'; -import { ConfigProps } from './config'; -import * as efs from 'aws-cdk-lib/aws-efs'; -import * as ec2 from 'aws-cdk-lib/aws-ec2'; -import * as iam from 'aws-cdk-lib/aws-iam'; - - -interface HelmBapStackProps extends StackProps { - config: ConfigProps; - eksCluster: eks.Cluster; - isSandbox: boolean; - eksSecGrp: ec2.SecurityGroup; - vpc: ec2.Vpc; -} - -export class HelmBapStack extends Stack { - constructor(scope: Construct, id: string, props: HelmBapStackProps) { - super(scope, id, props); - - const eksCluster = props.eksCluster; - const externalDomain = props.config.BAP_EXTERNAL_DOMAIN; - const certArn = props.config.CERT_ARN; - const releaseName = props.config.BAP_RELEASE_NAME; - const repository = props.config.REPOSITORY; - const registryUrl = props.config.REGISTRY_URL; - const bapPrivateKey = props.config.BAP_PRIVATE_KEY; - const bapPublicKey = props.config.BAP_PUBLIC_KEY; - - const isSandbox = props.isSandbox; - - const myFileSystemPolicy = new iam.PolicyDocument({ - statements: [new iam.PolicyStatement({ - actions: [ - 'elasticfilesystem:ClientRootAccess', - 'elasticfilesystem:ClientWrite', - 'elasticfilesystem:ClientMount', - ], - principals: [new iam.ArnPrincipal('*')], - resources: ['*'], - conditions: { - Bool: { - 'elasticfilesystem:AccessedViaMountTarget': 'true', - }, - }, - })], - }); - - const efsBapFileSystemId = new efs.FileSystem(this, 'Beckn-Onix-Bap', { - vpc: props.vpc, - securityGroup: props.eksSecGrp, - fileSystemPolicy: myFileSystemPolicy, - }); - - new helm.HelmChart(this, 'baphelm', { - cluster: eksCluster, - chart: 'beckn-onix-bap', - release: releaseName, - wait: false, - repository: repository, - values: { - global: { - isSandbox: isSandbox, - externalDomain: externalDomain, - registry_url: registryUrl, - bap: { - privateKey: bapPrivateKey, - publicKey: bapPublicKey, - }, - efs: { - fileSystemId: efsBapFileSystemId.fileSystemId, - }, - ingress: { - tls: { - certificateArn: certArn, - }, - }, - }, - }, - } -); - - new cdk.CfnOutput(this, String("EksFileSystemId"), { - value: efsBapFileSystemId.fileSystemId, - }); - } -} diff --git a/aws-cdk/beckn-cdk/lib/helm-beckn-common-services.ts b/aws-cdk/beckn-cdk/lib/helm-beckn-common-services.ts deleted file mode 100644 index 8540362..0000000 --- a/aws-cdk/beckn-cdk/lib/helm-beckn-common-services.ts +++ /dev/null @@ -1,90 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import * as eks from 'aws-cdk-lib/aws-eks'; -import * as helm from 'aws-cdk-lib/aws-eks'; -import { Stack, StackProps } from 'aws-cdk-lib'; -import { Construct } from 'constructs'; -import { ConfigProps } from './config'; -import * as crypto from 'crypto'; - - -interface HelmCommonServicesStackProps extends StackProps { - config: ConfigProps; - eksCluster: eks.Cluster; - service: string, -} - -export class HelmCommonServicesStack extends Stack { - constructor(scope: Construct, id: string, props: HelmCommonServicesStackProps) { - super(scope, id, props); - - const eksCluster = props.eksCluster; - const service = props.service; - const repository = "https://charts.bitnami.com/bitnami"; - const namespace = props.config.NAMESPACE; - - const generateRandomPassword = (length: number) => { - return crypto.randomBytes(length).toString('hex').slice(0, length); - }; - const rabbitMQPassword = generateRandomPassword(12); - - new helm.HelmChart(this, "RedisHelmChart", { - cluster: eksCluster, - chart: "redis", - namespace: service + namespace, - release: "redis", - wait: false, - repository: repository, - values: { - auth: { - enabled: false - }, - replica: { - replicaCount: 0 - }, - master: { - persistence: { - storageClass: "gp2" - } - } - } - }); - - new helm.HelmChart(this, "MongoDBHelmChart", { - cluster: eksCluster, - chart: "mongodb", - namespace: service + namespace, - release: "mongodb", - wait: false, - repository: repository, - values: { - persistence: { - storageClass: "gp2" - } - } - }); - - new helm.HelmChart(this, "RabbitMQHelmChart", { - cluster: eksCluster, - chart: "rabbitmq", - namespace: service + namespace, - release: "rabbitmq", - wait: false, - repository: repository, - values: { - persistence: { - enabled: true, - storageClass: "gp2" - }, - auth: { - username: "beckn", - password: "beckn1234" - } - } - }); - - // new cdk.CfnOutput(this, String("RabbimqPassword"), { - // value: rabbitMQPassword, - // }); - - } -} \ No newline at end of file diff --git a/aws-cdk/beckn-cdk/lib/helm-bpp.ts b/aws-cdk/beckn-cdk/lib/helm-bpp.ts deleted file mode 100644 index e900837..0000000 --- a/aws-cdk/beckn-cdk/lib/helm-bpp.ts +++ /dev/null @@ -1,89 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import * as eks from 'aws-cdk-lib/aws-eks'; -import * as helm from 'aws-cdk-lib/aws-eks'; -import { Stack, StackProps } from 'aws-cdk-lib'; -import { Construct } from 'constructs'; -import { ConfigProps } from './config'; -import * as ec2 from 'aws-cdk-lib/aws-ec2'; -import * as efs from 'aws-cdk-lib/aws-efs'; -import * as iam from 'aws-cdk-lib/aws-iam'; - -interface HelmBppStackProps extends StackProps { - config: ConfigProps; - vpc: ec2.Vpc; - isSandbox: boolean; - eksSecGrp: ec2.SecurityGroup; - eksCluster: eks.Cluster; -} - -export class HelmBppStack extends Stack { - constructor(scope: Construct, id: string, props: HelmBppStackProps) { - super(scope, id, props); - - const eksCluster = props.eksCluster; - const externalDomain = props.config.BPP_EXTERNAL_DOMAIN; - const certArn = props.config.CERT_ARN; - const releaseName = props.config.BPP_RELEASE_NAME; - const repository = props.config.REPOSITORY; - const registryUrl = props.config.REGISTRY_URL; - - const bppPrivateKey = props.config.BPP_PRIVATE_KEY; - const bppPublicKey = props.config.BPP_PUBLIC_KEY; - - const isSandbox = props.isSandbox; - - const myFileSystemPolicy = new iam.PolicyDocument({ - statements: [new iam.PolicyStatement({ - actions: [ - 'elasticfilesystem:ClientRootAccess', - 'elasticfilesystem:ClientWrite', - 'elasticfilesystem:ClientMount', - ], - principals: [new iam.ArnPrincipal('*')], - resources: ['*'], - conditions: { - Bool: { - 'elasticfilesystem:AccessedViaMountTarget': 'true', - }, - }, - })], - }); - - const efsBppFileSystemId = new efs.FileSystem(this, 'Beckn-Onix-Bpp', { - vpc: props.vpc, - securityGroup: props.eksSecGrp, - fileSystemPolicy: myFileSystemPolicy, - }); - - new helm.HelmChart(this, 'Bpphelm', { - cluster: eksCluster, - chart: 'beckn-onix-bpp', - release: releaseName, - wait: false, - repository: repository, - values: { - global: { - isSandbox: isSandbox, - externalDomain: externalDomain, - registry_url: registryUrl, - bpp: { - privateKey: bppPrivateKey, - publicKey: bppPublicKey, - }, - efs: { - fileSystemId: efsBppFileSystemId.fileSystemId, - }, - ingress: { - tls: { - certificateArn: certArn, - }, - }, - }, - }, - } - ); - new cdk.CfnOutput(this, String("EksFileSystemId"), { - value: efsBppFileSystemId.fileSystemId, - }); - } -} diff --git a/aws-cdk/beckn-cdk/lib/helm-gateway.ts b/aws-cdk/beckn-cdk/lib/helm-gateway.ts deleted file mode 100644 index 56ebb9d..0000000 --- a/aws-cdk/beckn-cdk/lib/helm-gateway.ts +++ /dev/null @@ -1,54 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import * as eks from 'aws-cdk-lib/aws-eks'; -import * as helm from 'aws-cdk-lib/aws-eks'; -import { Stack, StackProps } from 'aws-cdk-lib'; -import { Construct } from 'constructs'; -import { ConfigProps } from './config'; - -interface HelmGAtewayStackProps extends cdk.StackProps { - config: ConfigProps; - eksCluster: eks.Cluster; - rdsHost: string; - rdsPassword: string; - } - -export class HelmGatewayStack extends Stack { - constructor(scope: Construct, id: string, props: HelmGAtewayStackProps) { - super(scope, id, props); - - const eksCluster = props.eksCluster; - const externalDomain = props.config.GATEWAY_EXTERNAL_DOMAIN; - const certArn = props.config.CERT_ARN; - const registryUrl = props.config.REGISTRY_URL; - - const releaseName = props.config.GATEWAY_RELEASE_NAME; - const repository = props.config.REPOSITORY; - - const rdsHost = props.rdsHost; - const rdsPassword = props.rdsPassword; - - new helm.HelmChart(this, "gatewayhelm", { - cluster: eksCluster, - chart: "beckn-onix-gateway", - release: releaseName, - wait: false, - repository: repository, - values: { - externalDomain: externalDomain, - registry_url: registryUrl, - database: { - host: rdsHost, - password: rdsPassword, - }, - ingress: { - tls: - { - certificateArn: certArn, - }, - }, - } - - }); - - } -} diff --git a/aws-cdk/beckn-cdk/lib/helm-registry.ts b/aws-cdk/beckn-cdk/lib/helm-registry.ts deleted file mode 100644 index 9114bef..0000000 --- a/aws-cdk/beckn-cdk/lib/helm-registry.ts +++ /dev/null @@ -1,50 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import * as eks from 'aws-cdk-lib/aws-eks'; -import * as helm from 'aws-cdk-lib/aws-eks'; -import { Stack, StackProps } from 'aws-cdk-lib'; -import { Construct } from 'constructs'; -import { ConfigProps } from './config'; - - interface HelmRegistryStackProps extends StackProps { - config: ConfigProps; - eksCluster: eks.Cluster; - rdsHost: string; - rdsPassword: string; -} - -export class HelmRegistryStack extends Stack { - constructor(scope: Construct, id: string, props: HelmRegistryStackProps) { - super(scope, id, props); - - const eksCluster = props.eksCluster; - const externalDomain = props.config.REGISTRY_EXTERNAL_DOMAIN; - const certArn = props.config.CERT_ARN; - const releaseName = props.config.REGISTRY_RELEASE_NAME; - const repository = props.config.REPOSITORY; - - const rdsHost = props.rdsHost; - const rdsPassword = props.rdsPassword; - - new helm.HelmChart(this, "registryhelm", { - cluster: eksCluster, - chart: "beckn-onix-registry", - release: releaseName, - wait: false, - repository: repository, - values: { - externalDomain: externalDomain, - database: { - host: rdsHost, - password: rdsPassword - }, - ingress: { - tls: - { - certificateArn: certArn, - }, - }, - } - - }); - } -} diff --git a/aws-cdk/beckn-cdk/lib/rabbitmq-stack.ts b/aws-cdk/beckn-cdk/lib/rabbitmq-stack.ts deleted file mode 100644 index d617220..0000000 --- a/aws-cdk/beckn-cdk/lib/rabbitmq-stack.ts +++ /dev/null @@ -1,66 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import { Construct } from 'constructs'; -import * as ec2 from 'aws-cdk-lib/aws-ec2'; -import * as amazonmq from 'aws-cdk-lib/aws-amazonmq'; -import * as dotenv from 'dotenv'; -import { ConfigProps } from './config'; - -// Load environment variables from .env file -dotenv.config(); - -interface RabbitMqStackProps extends cdk.StackProps { - config: ConfigProps; - vpc: ec2.Vpc; -} - -export class RabbitMqStack extends cdk.Stack { - constructor(scope: Construct, id: string, props: RabbitMqStackProps) { - super(scope, id, props); - - // Prompt for the RabbitMQ admin password using environment variable - const rabbitMqPassword = new cdk.CfnParameter(this, 'RabbitMqPassword', { - type: 'String', - description: 'The password for the RabbitMQ broker admin user', - noEcho: true, // Ensure the password is hidden from the console - default: props.config.RABBITMQ_PASSWORD || '', // Use the password from .env or set a fallback - }); - - // Security group for RabbitMQ - const rabbitMqSecurityGroup = new ec2.SecurityGroup(this, 'RabbitMqSecurityGroup', { - vpc: props.vpc, - description: 'Security group for RabbitMQ broker', - allowAllOutbound: true, - }); - - rabbitMqSecurityGroup.addIngressRule(ec2.Peer.ipv4(props.vpc.vpcCidrBlock), ec2.Port.tcp(5672), 'Allow RabbitMQ traffic on port 5672'); - rabbitMqSecurityGroup.addIngressRule(ec2.Peer.ipv4(props.vpc.vpcCidrBlock), ec2.Port.tcp(15672), 'Allow RabbitMQ management traffic'); - - // Select a single private subnet for the RabbitMQ Broker - const privateSubnets = props.vpc.selectSubnets({ subnetType: ec2.SubnetType.PRIVATE_WITH_NAT }).subnets; - - // Ensure there's at least one subnet, and use the first one - if (privateSubnets.length === 0) { - throw new Error('No private subnets found in the VPC'); - } - - const selectedSubnet = privateSubnets[0]; // Use the first subnet - - // RabbitMQ Broker - new amazonmq.CfnBroker(this, 'RabbitMqBroker', { - brokerName: 'MyRabbitMqBroker', - engineType: 'RABBITMQ', - engineVersion: '3.10.25', - deploymentMode: 'SINGLE_INSTANCE', - publiclyAccessible: false, - hostInstanceType: 'mq.m5.large', // Adjust the instance type as needed - subnetIds: [selectedSubnet.subnetId], // Pass a single subnet - securityGroups: [rabbitMqSecurityGroup.securityGroupId], - users: [ - { - username: 'becknadmin', // Fixed username - password: rabbitMqPassword.valueAsString, // Password entered by the user or set from the .env file - }, - ], - }); - } -} diff --git a/aws-cdk/beckn-cdk/lib/rds-stack-dummy.ts b/aws-cdk/beckn-cdk/lib/rds-stack-dummy.ts deleted file mode 100644 index c748705..0000000 --- a/aws-cdk/beckn-cdk/lib/rds-stack-dummy.ts +++ /dev/null @@ -1,50 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import * as ec2 from 'aws-cdk-lib/aws-ec2'; -import * as rds from 'aws-cdk-lib/aws-rds'; -import { Construct } from 'constructs'; -import { ConfigProps } from './config'; -import cluster from 'cluster'; - -export interface RdsStackProps extends cdk.StackProps { - config: ConfigProps; - vpc: ec2.Vpc; -} - -export class RdsStack extends cdk.Stack { - public readonly rdsSecret: string; - public readonly rdsHost: string; - - constructor(scope: Construct, id: string, props: RdsStackProps) { - super(scope, id, props); - - // Security group for RDS - const dbSecurityGroup = new ec2.SecurityGroup(this, 'DatabaseSecurityGroup', { - vpc: props.vpc, - description: 'Security group for Aurora PostgreSQL database', - allowAllOutbound: true, - }); - - dbSecurityGroup.addIngressRule(ec2.Peer.ipv4(props.vpc.vpcCidrBlock), ec2.Port.tcp(5432), 'Allow Postgres access'); - - // Create Aurora PostgreSQL database cluster - const cluster = new rds.DatabaseCluster(this, 'AuroraCluster', { - engine: rds.DatabaseClusterEngine.auroraPostgres({ - version: rds.AuroraPostgresEngineVersion.VER_13_15, - }), - instances: 2, - instanceProps: { - vpc: props.vpc, - vpcSubnets: { - subnetType: ec2.SubnetType.PRIVATE_ISOLATED, - }, - securityGroups: [dbSecurityGroup], - instanceType: ec2.InstanceType.of(ec2.InstanceClass.BURSTABLE3, ec2.InstanceSize.MEDIUM), - }, - credentials: rds.Credentials.fromGeneratedSecret('dbadmin'), - defaultDatabaseName: 'MyDatabase', - removalPolicy: cdk.RemovalPolicy.DESTROY, // Destroy cluster when stack is deleted (useful for development) - }); - - this.rdsHost = cluster.clusterEndpoint.hostname; - } -} diff --git a/aws-cdk/beckn-cdk/lib/rds-stack.ts b/aws-cdk/beckn-cdk/lib/rds-stack.ts deleted file mode 100644 index 137c0ce..0000000 --- a/aws-cdk/beckn-cdk/lib/rds-stack.ts +++ /dev/null @@ -1,84 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import * as ec2 from 'aws-cdk-lib/aws-ec2'; -import * as rds from 'aws-cdk-lib/aws-rds'; -import { Construct } from 'constructs'; -import { ConfigProps } from './config'; -import cluster from 'cluster'; -import { Secret } from 'aws-cdk-lib/aws-secretsmanager'; - -export interface RdsStackProps extends cdk.StackProps { - config: ConfigProps; - envC: string; - vpc: ec2.Vpc; -} - -export class RdsStack extends cdk.Stack { - public readonly rdsSecret: string; - public readonly rdsHost: string; - public readonly rdsPassword: string; - - constructor(scope: Construct, id: string, props: RdsStackProps) { - super(scope, id, props); - - const vpc = props.vpc; - const dbName = props.envC; - const rdsUser = props.config.RDS_USER; // take input from user / make it - const rdsPassword = this.createPassword(); - const rdsSecGrpIngress = props.config.CIDR; - - const securityGroupRDS = new ec2.SecurityGroup(this, 'RdsSecurityGroup', { - vpc: vpc, - allowAllOutbound: true, - description: 'Security group for Aurora PostgreSQL database', - }); - - securityGroupRDS.addIngressRule( - ec2.Peer.ipv4(rdsSecGrpIngress), - ec2.Port.tcp(5432), - "Allow Postgress Access" - ); - - const creds = new Secret(this, "rdsSecret", { - secretObjectValue: { - username: cdk.SecretValue.unsafePlainText(rdsUser.toString()), - password: cdk.SecretValue.unsafePlainText(rdsPassword.toString()), - }, - }); - - const cluster = new rds.DatabaseCluster(this, 'AuroraCluster', { - engine: rds.DatabaseClusterEngine.auroraPostgres({ - version: rds.AuroraPostgresEngineVersion.VER_14_6, - }), - credentials: rds.Credentials.fromSecret(creds), - instances: 1, - instanceProps: { - vpc: props.vpc, - vpcSubnets: { - subnetType: ec2.SubnetType.PRIVATE_ISOLATED, - }, - securityGroups: [securityGroupRDS], - instanceType: ec2.InstanceType.of(ec2.InstanceClass.BURSTABLE3, ec2.InstanceSize.MEDIUM), - }, - defaultDatabaseName: dbName, - }); - - this.rdsSecret = creds.secretArn; - this.rdsHost = cluster.clusterEndpoint.hostname; - this.rdsPassword = rdsPassword; - - new cdk.CfnOutput(this, 'RDSPasswordOutput', { - value: rdsPassword, - exportName: `RDSPassword-${dbName}`, - }) - } - - //generate password function - private createPassword(length: number = 12): string { - const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+,-.:;<=>?[]^_`{|}~'; - let password = ''; - for (let i = 0; i < length; i++) { - password += characters.charAt(Math.floor(Math.random() * characters.length)); - } - return password; - } -} diff --git a/aws-cdk/beckn-cdk/lib/redis-stack.ts b/aws-cdk/beckn-cdk/lib/redis-stack.ts deleted file mode 100644 index 9450cd7..0000000 --- a/aws-cdk/beckn-cdk/lib/redis-stack.ts +++ /dev/null @@ -1,38 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import { Construct } from 'constructs'; -import * as ec2 from 'aws-cdk-lib/aws-ec2'; -import * as elasticache from 'aws-cdk-lib/aws-elasticache'; - -interface RedisStackProps extends cdk.StackProps { - vpc: ec2.Vpc; -} - -export class RedisStack extends cdk.Stack { - constructor(scope: Construct, id: string, props: RedisStackProps) { - super(scope, id, props); - - // Security group for ElastiCache - const elasticacheSecurityGroup = new ec2.SecurityGroup(this, 'ElastiCacheSecurityGroup', { - vpc: props.vpc, - description: 'Security group for Redis', - allowAllOutbound: true, - }); - - elasticacheSecurityGroup.addIngressRule(ec2.Peer.ipv4(props.vpc.vpcCidrBlock), ec2.Port.tcp(6379), 'Allow Redis traffic'); - - // Redis subnet group - const redisSubnetGroup = new elasticache.CfnSubnetGroup(this, 'RedisSubnetGroup', { - description: 'Subnet group for Redis cluster', - subnetIds: props.vpc.selectSubnets({ subnetType: ec2.SubnetType.PRIVATE_WITH_NAT }).subnetIds, - }); - - // Redis Cluster - new elasticache.CfnCacheCluster(this, 'RedisCluster', { - cacheNodeType: 'cache.t3.medium', // Adjust the node type based on your needs - engine: 'redis', - numCacheNodes: 1, - vpcSecurityGroupIds: [elasticacheSecurityGroup.securityGroupId], - cacheSubnetGroupName: redisSubnetGroup.ref, - }); - } -} diff --git a/aws-cdk/beckn-cdk/lib/vpc-stack.ts b/aws-cdk/beckn-cdk/lib/vpc-stack.ts deleted file mode 100644 index 640a2a9..0000000 --- a/aws-cdk/beckn-cdk/lib/vpc-stack.ts +++ /dev/null @@ -1,76 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import { Construct } from 'constructs'; -import * as ec2 from 'aws-cdk-lib/aws-ec2'; -import * as elb from 'aws-cdk-lib/aws-elasticloadbalancingv2'; -import { ConfigProps } from './config'; - -export interface VpcStackProps extends cdk.StackProps { - config: ConfigProps; -} - -export class VpcStack extends cdk.Stack { - public readonly vpc: ec2.Vpc; - // public readonly alb: elb.ApplicationLoadBalancer; - - constructor(scope: Construct, id: string, props: VpcStackProps) { - super(scope, id, props); - - const config = props.config; - - // Create a new VPC - this.vpc = new ec2.Vpc(this, 'beckn-onix-vpc', { - maxAzs: config.MAX_AZS, // Maximum number of availability zones - cidr: config.CIDR, - natGateways: 1, // Single NAT Gateway in the public subnet - subnetConfiguration: [ - { - cidrMask: 24, - name: 'Public', - subnetType: ec2.SubnetType.PUBLIC, - }, - { - cidrMask: 24, - name: 'AppLayer', - subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS, // Use the newer "PRIVATE_WITH_EGRESS" instead of PRIVATE_WITH_NAT - }, - { - cidrMask: 24, - name: 'DatabaseLayer', - subnetType: ec2.SubnetType.PRIVATE_ISOLATED, - } - ] - }); - - // Output the VPC CIDR block for other stacks to reference - new cdk.CfnOutput(this, 'VpcCidrBlock', { - value: this.vpc.vpcCidrBlock, - exportName: 'VpcCidrBlock-env', // Export name to reference in other stacks - }); - - // Output the VPC ID for other stacks - new cdk.CfnOutput(this, 'VpcId', { - value: this.vpc.vpcId, - exportName: 'VpcId', // Export name to reference in other stacks - }); - - // Output the Public Subnet IDs - new cdk.CfnOutput(this, 'PublicSubnetIds', { - value: this.vpc.publicSubnets.map(subnet => subnet.subnetId).join(','), - exportName: 'PublicSubnetIds', // Export name to reference in other stacks - }); - - // Output the App Layer Subnet IDs (for application instances or services) - new cdk.CfnOutput(this, 'AppLayerSubnetIds', { - value: this.vpc.selectSubnets({ subnetGroupName: 'AppLayer' }).subnetIds.join(','), - exportName: 'AppLayerSubnetIds', // Export name to reference in other stacks - }); - - // Output the Database Layer Subnet IDs (for database instances) - new cdk.CfnOutput(this, 'DatabaseSubnetIds', { - value: this.vpc.selectSubnets({ subnetGroupName: 'DatabaseLayer' }).subnetIds.join(','), - exportName: 'DatabaseSubnetIds', // Export name to reference in other stacks - }); - } -} - - diff --git a/aws-cdk/beckn-cdk/package-lock.json b/aws-cdk/beckn-cdk/package-lock.json deleted file mode 100644 index 660226c..0000000 --- a/aws-cdk/beckn-cdk/package-lock.json +++ /dev/null @@ -1,4587 +0,0 @@ -{ - "name": "beckn-cdk", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "beckn-cdk", - "version": "0.1.0", - "dependencies": { - "@aws-cdk/lambda-layer-kubectl-v30": "^2.0.1", - "aws-cdk-lib": "2.158.0", - "constructs": "^10.0.0", - "dotenv": "^16.4.5", - "source-map-support": "^0.5.21" - }, - "bin": { - "beckn-cdk": "bin/beckn-cdk.js" - }, - "devDependencies": { - "@types/jest": "^29.5.12", - "@types/node": "^22.5.4", - "aws-cdk": "2.158.0", - "jest": "^29.7.0", - "ts-jest": "^29.2.5", - "ts-node": "^10.9.2", - "typescript": "~5.6.2" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@aws-cdk/asset-awscli-v1": { - "version": "2.2.202", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.202.tgz", - "integrity": "sha512-JqlF0D4+EVugnG5dAsNZMqhu3HW7ehOXm5SDMxMbXNDMdsF0pxtQKNHRl52z1U9igsHmaFpUgSGjbhAJ+0JONg==", - "license": "Apache-2.0" - }, - "node_modules/@aws-cdk/asset-kubectl-v20": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.2.tgz", - "integrity": "sha512-3M2tELJOxQv0apCIiuKQ4pAbncz9GuLwnKFqxifWfe77wuMxyTRPmxssYHs42ePqzap1LT6GDcPygGs+hHstLg==", - "license": "Apache-2.0" - }, - "node_modules/@aws-cdk/asset-node-proxy-agent-v6": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v6/-/asset-node-proxy-agent-v6-2.1.0.tgz", - "integrity": "sha512-7bY3J8GCVxLupn/kNmpPc5VJz8grx+4RKfnnJiO1LG+uxkZfANZG3RMHhE+qQxxwkyQ9/MfPtTpf748UhR425A==", - "license": "Apache-2.0" - }, - "node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "36.3.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-36.3.0.tgz", - "integrity": "sha512-mLSYgcMFTNCXrGAD7xob95p9s47/7WwEWUJiexxM46H2GxiijhlhLQJs31AS5uRRP6Cx1DLEu4qayKAUOOVGrw==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "license": "Apache-2.0", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.6.3" - }, - "engines": { - "node": ">= 18.18.0" - } - }, - "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.6.3", - "inBundle": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/lambda-layer-kubectl-v30": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@aws-cdk/lambda-layer-kubectl-v30/-/lambda-layer-kubectl-v30-2.0.1.tgz", - "integrity": "sha512-R4N2OTq9jCxARAmrp2TBNRkVreVa01wgAC4GNRRfZ8C4UD5+Cz+vylIyyJsVPD7WWZpdBSWDidnVMpvwTpAsQQ==", - "license": "Apache-2.0", - "peerDependencies": { - "aws-cdk-lib": "^2.85.0", - "constructs": "^10.0.5" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", - "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", - "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.25.6", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", - "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", - "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", - "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.25.6" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz", - "integrity": "sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", - "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz", - "integrity": "sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", - "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.6", - "@babel/parser": "^7.25.6", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", - "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.5.13", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.13.tgz", - "integrity": "sha512-wd+MVEZCHt23V0/L642O5APvspWply/rGY5BcW4SUETo2UzPU3Z26qr8jC2qxpimI2jjx9h7+2cj2FwIr01bXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/node": { - "version": "22.5.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.4.tgz", - "integrity": "sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true, - "license": "MIT" - }, - "node_modules/aws-cdk": { - "version": "2.158.0", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.158.0.tgz", - "integrity": "sha512-UcrxBG02RACrnTvfuyZiTuOz8gqOpnqjCMTdVmdpExv5qk9hddhtRAubNaC4xleHuNJnvskYqqVW+Y3Abh6zGQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "cdk": "bin/cdk" - }, - "engines": { - "node": ">= 14.15.0" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/aws-cdk-lib": { - "version": "2.158.0", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.158.0.tgz", - "integrity": "sha512-Pl9CCLM+XRTy6nyyRJM1INEMtwIlZOib0FWyq9i9E388vurw7sNVJ6tAsfLpGIOLHsFQCbF4f6OZ0KSVxmMaiA==", - "bundleDependencies": [ - "@balena/dockerignore", - "case", - "fs-extra", - "ignore", - "jsonschema", - "minimatch", - "punycode", - "semver", - "table", - "yaml", - "mime-types" - ], - "license": "Apache-2.0", - "dependencies": { - "@aws-cdk/asset-awscli-v1": "^2.2.202", - "@aws-cdk/asset-kubectl-v20": "^2.1.2", - "@aws-cdk/asset-node-proxy-agent-v6": "^2.1.0", - "@aws-cdk/cloud-assembly-schema": "^36.0.24", - "@balena/dockerignore": "^1.0.2", - "case": "1.6.3", - "fs-extra": "^11.2.0", - "ignore": "^5.3.2", - "jsonschema": "^1.4.1", - "mime-types": "^2.1.35", - "minimatch": "^3.1.2", - "punycode": "^2.3.1", - "semver": "^7.6.3", - "table": "^6.8.2", - "yaml": "1.10.2" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "constructs": "^10.0.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/@balena/dockerignore": { - "version": "1.0.2", - "inBundle": true, - "license": "Apache-2.0" - }, - "node_modules/aws-cdk-lib/node_modules/ajv": { - "version": "8.17.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/aws-cdk-lib/node_modules/ansi-regex": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/aws-cdk-lib/node_modules/ansi-styles": { - "version": "4.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/aws-cdk-lib/node_modules/astral-regex": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/aws-cdk-lib/node_modules/balanced-match": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/brace-expansion": { - "version": "1.1.11", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/aws-cdk-lib/node_modules/case": { - "version": "1.6.3", - "inBundle": true, - "license": "(MIT OR GPL-3.0-or-later)", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/color-convert": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/color-name": { - "version": "1.1.4", - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/concat-map": { - "version": "0.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/emoji-regex": { - "version": "8.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/fast-deep-equal": { - "version": "3.1.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/fast-uri": { - "version": "3.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/fs-extra": { - "version": "11.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/aws-cdk-lib/node_modules/graceful-fs": { - "version": "4.2.11", - "inBundle": true, - "license": "ISC" - }, - "node_modules/aws-cdk-lib/node_modules/ignore": { - "version": "5.3.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/aws-cdk-lib/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/aws-cdk-lib/node_modules/json-schema-traverse": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/jsonfile": { - "version": "6.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/aws-cdk-lib/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/aws-cdk-lib/node_modules/lodash.truncate": { - "version": "4.4.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/mime-db": { - "version": "1.52.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/aws-cdk-lib/node_modules/mime-types": { - "version": "2.1.35", - "inBundle": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/aws-cdk-lib/node_modules/minimatch": { - "version": "3.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/aws-cdk-lib/node_modules/punycode": { - "version": "2.3.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/aws-cdk-lib/node_modules/require-from-string": { - "version": "2.0.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/semver": { - "version": "7.6.3", - "inBundle": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/aws-cdk-lib/node_modules/slice-ansi": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/aws-cdk-lib/node_modules/string-width": { - "version": "4.2.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/aws-cdk-lib/node_modules/strip-ansi": { - "version": "6.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/aws-cdk-lib/node_modules/table": { - "version": "6.8.2", - "inBundle": true, - "license": "BSD-3-Clause", - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/universalify": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/yaml": { - "version": "1.10.2", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", - "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001660", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001660.tgz", - "integrity": "sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", - "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/constructs": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.3.0.tgz", - "integrity": "sha512-vbK8i3rIb/xwZxSpTjz3SagHn1qq9BChLEfy5Hf6fB3/2eFbrwt2n9kHwQcS0CPTRBesreeAcsJfMq2229FnbQ==", - "license": "Apache-2.0", - "engines": { - "node": ">= 16.14.0" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dedent": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.25", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.25.tgz", - "integrity": "sha512-kMb204zvK3PsSlgvvwzI3wBIcAw15tRkYk+NQdsjdDtcQWTp2RABbMQ9rUBy8KNEOM+/E6ep+XC3AykiWZld4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jake": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", - "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner/node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-jest": { - "version": "29.2.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", - "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bs-logger": "^0.2.6", - "ejs": "^3.1.10", - "fast-json-stable-stringify": "^2.1.0", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "^4.1.2", - "make-error": "^1.3.6", - "semver": "^7.6.3", - "yargs-parser": "^21.1.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/transform": "^29.0.0", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/transform": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/ts-jest/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", - "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true, - "license": "MIT" - }, - "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "license": "MIT" - }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/aws-cdk/beckn-cdk/package.json b/aws-cdk/beckn-cdk/package.json deleted file mode 100644 index baee080..0000000 --- a/aws-cdk/beckn-cdk/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "beckn-cdk", - "version": "0.1.0", - "bin": { - "beckn-cdk": "bin/beckn-cdk.js" - }, - "scripts": { - "build": "tsc", - "watch": "tsc -w", - "test": "jest", - "cdk": "cdk" - }, - "devDependencies": { - "@types/jest": "^29.5.12", - "@types/node": "^22.5.4", - "aws-cdk": "2.158.0", - "jest": "^29.7.0", - "ts-jest": "^29.2.5", - "ts-node": "^10.9.2", - "typescript": "~5.6.2" - }, - "dependencies": { - "@aws-cdk/lambda-layer-kubectl-v30": "^2.0.1", - "aws-cdk-lib": "2.158.0", - "constructs": "^10.0.0", - "dotenv": "^16.4.5", - "source-map-support": "^0.5.21" - } -} diff --git a/aws-cdk/beckn-cdk/test/beckn-cdk.test.ts b/aws-cdk/beckn-cdk/test/beckn-cdk.test.ts deleted file mode 100644 index 4e4a7e4..0000000 --- a/aws-cdk/beckn-cdk/test/beckn-cdk.test.ts +++ /dev/null @@ -1,17 +0,0 @@ -// import * as cdk from 'aws-cdk-lib'; -// import { Template } from 'aws-cdk-lib/assertions'; -// import * as BecknCdkNew from '../lib/beckn-cdk-stack'; - -// example test. To run these tests, uncomment this file along with the -// example resource in lib/beckn-cdk-stack.ts -test('SQS Queue Created', () => { -// const app = new cdk.App(); -// // WHEN -// const stack = new BecknCdkNew.BecknCdkNewStack(app, 'MyTestStack'); -// // THEN -// const template = Template.fromStack(stack); - -// template.hasResourceProperties('AWS::SQS::Queue', { -// VisibilityTimeout: 300 -// }); -}); diff --git a/aws-cdk/beckn-cdk/tsconfig.json b/aws-cdk/beckn-cdk/tsconfig.json deleted file mode 100644 index aaa7dc5..0000000 --- a/aws-cdk/beckn-cdk/tsconfig.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020", - "module": "commonjs", - "lib": [ - "es2020", - "dom" - ], - "declaration": true, - "strict": true, - "noImplicitAny": true, - "strictNullChecks": true, - "noImplicitThis": true, - "alwaysStrict": true, - "noUnusedLocals": false, - "noUnusedParameters": false, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": false, - "inlineSourceMap": true, - "inlineSources": true, - "experimentalDecorators": true, - "strictPropertyInitialization": false, - "typeRoots": [ - "./node_modules/@types" - ] - }, - "exclude": [ - "node_modules", - "cdk.out" - ] -} diff --git a/aws-cdk/documentations/01-Deployment-CDK-Beckn-ONIX.md b/aws-cdk/documentations/01-Deployment-CDK-Beckn-ONIX.md deleted file mode 100644 index a46f9e3..0000000 --- a/aws-cdk/documentations/01-Deployment-CDK-Beckn-ONIX.md +++ /dev/null @@ -1,245 +0,0 @@ -# Beckn-ONIX AWS CDK - -This repository contains AWS CDK stacks for deploying the Beckn-ONIX services on AWS using the open-source AWS CDK IaC. The AWS CDK stacks are designed to deploy the following services: - -- **Registry**: Manages Beckn service providers and categories, and provides an additional layer of trust on the network by listing platforms that are compliant to a network’s rules and policies. -- **Gateway**: Central point for routing Beckn messages between providers and participants. -- **BAP (Beckn Application Platform)**: A consumer-facing infrastructure which captures consumers’ requests via its UI applications, converts them into beckn-compliant schemas and APIs at the server side, and fires them at the network. -- **BPP (Beckn Provider Platform)**: Other side of the network is the supply side which consists of Beckn Provider Platforms (BPPs) that maintain an active inventory, one or more catalogs of products and services, implement the supply logic and enable fulfillment of orders. - -![AWS CDK FLow](images/AWS-CDK-Flow.png) - - -## Prerequisites - -- **AWS Account**: An AWS account to deploy AWS CDK stacks -- **[AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)**: Configured with AWS account -- **Kubectl Client**: Configured with the Amazon EKS cluster. -- **Public Domain/Sub-Domain**: Along with SSL certificates for HTTPS. - -### Domain and Subdomains - -Beckn-ONIX requires a public domain to be associated with the following services: - -- Registry -- Gateway -- BAP Network -- BPP Network - -Users must obtain a public domain and create subdomains for each service. Additionally, an SSL certificate must be issued for each subdomain to enable HTTPS. You can use [AWS Certificate Manager](https://aws.amazon.com/certificate-manager/pricing/), which provides public SSL/TLS certificates at no cost. - -## Requesting a Public SSL Certificate through AWS Certificate Manager - -Gather the list of subdomains you intend to use for Beckn-ONIX services (as outlined in the pre-requisite). - -To obtain an SSL certificate through AWS Certificate Manager, follow the easy steps provided in the official [AWS ACM Documentation](https://docs.aws.amazon.com/acm/latest/userguide/gs-acm-request-public.html). - -Once a certificate is issued, copy the certificate ARN to be used in the Helm charts later. The certificate ARN follows this format: - -`arn:aws:acm:ap-south-1::certificate/` - -## Beckn-ONIX CDK Project Overview - -The AWS CDK project follows a specific folder structure for better organization: - -- **lib/**: This folder contains all the CDK stacks. Each stack represents a set of AWS resources that are deployed together. -- **bin/**: This folder contains the `beckn-cdk.ts` file, which serves as the entry point to the CDK application. -- **config.ts**: Located in the `lib/` folder, this file holds all the necessary environment variables for your stacks. -- **.env**: This file is located in the root of the AWS CDK project and contains user-specific environment variables. - -### CDK Stacks Overview - -| CDK Stack Name | Description | -|----------------------|---------------------------------------------------------------------------------------------------| -| VpcStack | This stack creates the VPC in which your resources will be deployed, along with one public subnet and two private subnets. | -| EksStack | This stack creates an Amazon EKS (Elastic Kubernetes Service) cluster for deploying Kubernetes applications. | -| RdsStack | This stack creates a PostgreSQL Aurora database cluster for your application's data storage needs. | -| HelmRegistryStack | This stack deploys Beckn-Onix Registry helm charts. | -| HelmGatewayStack | This stack deploys Beckn-Onix Gateway helm charts. | -| HelmBapStack | This stack deploys Beckn-Onix BAP helm charts. | -| HelmBppStack | This stack deploys Beckn-Onix BPP helm charts. | -| HelmCommonServicesStack | This stack deploys common services (Redis, Mongo, and RabbitMQ) from the open-source Bitnami repository into the Amazon EKS cluster required for BAP and BPP services. | - -### Optional Stacks - -| CDK Stack Name | Description | -|----------------------|---------------------------------------------------------------------------------------------------| -| RedisStack | This stack creates a Redis cluster for caching and data storage needs. | -| DocumentDbStack | This stack creates a DocumentDB cluster for document storage and retrieval. | -| RabbitMqStack | This stack creates a RabbitMQ broker for managing message queues and pub/sub messaging. | - -## AWS CDK Environment Variables - -**Note:** Depending on the Beckn-ONIX component you wish to install, please update the `.env` file with the respective environment variables. - -#### AWS SPECIFIC MANDATORY VARIABLES #### - -| Environment Variables | Example value | Description | -| --------------------- | -------------- | ---------- | -| `REGION` | `ap-south-1` | The AWS region in which to deploy all the resources | -| `ACCOUNT` | `123456789123` | Your AWS 12 digit account number | - - -#### BECKN-ONIX SPECIFIC MANDATORY VARIABLES #### - -**Note:** Depending on the Beckn-ONIX component you wish to install, please update the `.env` file with the respective environment variables. - -### Registry - -| Variable | Description | Example Value | -|-------------------------------|--------------------------------------------------------|-------------------------------------------------------------| -| `REGISTRY_EXTERNAL_DOMAIN` | External domain for the registry | `registry-cdk.beckn-onix-aws-cdk.becknprotocol.io` | -| `CERT_ARN` | SSL certificate ARN (AWS Certificate Manager) | `arn:aws:acm:ap-south-1:365975017663:certificate/04d1ef71-8407-495b-82f0-4eded8694189` | - -### Gateway - -| Variable | Description | Example Value | -|-------------------------------|--------------------------------------------------------|-------------------------------------------------------------| -| `GATEWAY_EXTERNAL_DOMAIN` | External domain for the gateway | `gateway-cdk.beckn-onix-aws-cdk.becknprotocol.io` | -| `REGISTRY_URL` | Registry URL | `gateway-cdk.beckn-onix-aws-cdk.becknprotocol.io` | -| `CERT_ARN` | SSL certificate ARN (AWS Certificate Manager) | `arn:aws:acm:ap-south-1:365975017663:certificate/04d1ef71-8407-495b-82f0-4eded8694189` | - -### BAP (Beckn Application Platform) - -| Variable | Description | Example Value | -|-------------------------------|--------------------------------------------------------|-------------------------------------------------------------| -| `BAP_EXTERNAL_DOMAIN` | External domain for the BAP | `bap-cdk.beckn-onix-aws-cdk.becknprotocol.io` | -| `BAP_PRIVATE_KEY` | Private key for the BAP | `pivurna3jQBmZGZeeOssgvD0NqMUuWedGjnM9U+hf8i5GXy3eoHVP7ZNs0CL+m7WB/Lq7L2/NvdPdiJWt9kjOQ==` | -| `BAP_PUBLIC_KEY` | Public key for the BAP | `uRl8t3qB1T+2TbNAi/pu1gfy6uy9vzb3T3YiVrfZIzk=` | -| `CERT_ARN` | SSL certificate ARN (AWS Certificate Manager) | `arn:aws:acm:ap-south-1:365975017663:certificate/04d1ef71-8407-495b-82f0-4eded8694189` | - -### BPP (Beckn Provider Platform) - -| Variable | Description | Example Value | -|-------------------------------|--------------------------------------------------------|-------------------------------------------------------------| -| `BPP_EXTERNAL_DOMAIN` | External domain for the BPP | `bpp-cdk.beckn-onix-aws-cdk.becknprotocol.io` | -| `BPP_PRIVATE_KEY` | Private key for the BPP | `pivurna3jQBmZGZeeOssgvD0NqMUuWedGjnM9U+hf8i5GXy3eoHVP7ZNs0CL+m7WB/Lq7L2/NvdPdiJWt9kjOQ==` | -| `BPP_PUBLIC_KEY` | Public key for the BPP | `uRl8t3qB1T+2TbNAi/pu1gfy6uy9vzb3T3YiVrfZIzk=` | -| `CERT_ARN` | SSL certificate ARN (AWS Certificate Manager) | `arn:aws:acm:ap-south-1:365975017663:certificate/04d1ef71-8407-495b-82f0-4eded8694189` | - -## Prepare your environment - -```bash -# Install TypeScript globally for CDK -npm i -g typescript - -# Install aws cdk -npm i -g aws-cdk - -# Clone the repository -git clone https://github.com/beckn/beckn-onix.git -cd aws-cdk/beckn-cdk - -# Install the CDK application -npm i - -# cdk bootstrap [aws:///] -cdk bootstrap aws:/// -``` - -## Deploy CDK - -After you have prepared the environment, made the relevant updates to the `.env` file as per the Beckn-ONIX component you're deploying, run the following commands to begin the deployment process. - -### Deployment by Environment - -You can now choose to deploy one of the following environments: - -1. **Registry Environment** -This will deploy the following stacks: VPC, Amazon EKS, and Amazon RDS Aurora Postgres and Registry: - -```bash -cdk list --context env=registry --all -cdk deploy --context env=registry --all -``` - -2. **Gateway Environment** -This will deploy the following stacks: VPC, Amazon EKS, Amazon RDS Aurora Postgres and Gateway: - -```bash -cdk list --context env=gateway --all -cdk deploy --context env=gateway --all -``` - -### Generate SSL Key Pair required for BAP and BPP - -The Protocol Server (BAP/BPP) provides a key generation script. - -**Note:** Ensure Node.js is installed on your system. - -```bash -curl https://raw.githubusercontent.com/beckn/protocol-server/master/scripts/generate-keys.js > generate-keys.js -npm install libsodium-wrappers -node generate-keys.js -``` - -**Note:** Copy the `publicKey` and `privateKey` from the output. You need to add keys to .env file before running CDK deploy. - -3. **BAP (Buyer Application Provider) Environment** -This will deploy the following stacks: VPC, Amazon EKS, BAP, and common services in Amazon EKS - Redis, DocumentDB, and RabbitMQ: - -```bash -cdk list --context env=bap --all -cdk deploy --context env=bap --all -``` - -4. **BPP (Buyer Platform Provider) Environment** -This will deploy the following stacks: VPC, Amazon EKS, BAP, and common services in Amazon EKS - Redis, DocumentDB, and RabbitMQ: - -```bash -cdk list --context env=bpp -all -cdk deploy --context env=bpp -all -``` - -5. **Sandbox Environment** -This environment is suitable for non-prod setup and will deploy all the stacks including - VPC, Amazon EKS, Amazon RDS Aurora Postgres, all Beckn-Onix services including common services: - -```bash -cdk list --context env=sandbox --all -cdk deploy --context env=sandbox --all -``` - -## Destroy CDK Resources - -If you wish to clean up and remove all the deployed resources, you can use the following command: - -```bash -cdk destroy --context env= --all - -Replace with the environment you wish to destroy (e.g., registry, gateway, bap, bpp, or sandbox). This command will prompt you to confirm the deletion of all resources in the specified stack. - - -## Next Steps - -After installing all Beckn-Onix services, proceed with the next steps to verify and complete the setup: - -1. **[Verify Deployments](documentations/verify-deployments.md)** - - To ensure that your Beckn-Onix services are running correctly, follow the instructions in the [Verify Deployments](documentations/verify-deployments.md) document. This will help you confirm that the services are operational and identify any issues that need to be addressed. - -2. **[Update DNS Records](documentations/post-deployment-dns-config.md)** - - To configure DNS settings for your services, follow the instructions provided in the [Post-Deployment DNS Configuration](documentations/post-deployment-dns-config.md) document. This will guide you through retrieving the necessary Load Balancer addresses and updating your DNS records. - -3. **[Register BAP and BPP with Registry](documentations/post-deployment-bap-bpp-register.md)** - - After updating your DNS records, you need to register your participants BAP and BPP network with the registry service. Follow the steps in the [BAP and BPP Registration](documentations/post-deployment-bap-bpp-register.md) document to complete this process. - - - - - - - - - - - - - - - - - - - diff --git a/aws-cdk/documentations/02-Deployment-Helm-Beckn-ONIX.md b/aws-cdk/documentations/02-Deployment-Helm-Beckn-ONIX.md deleted file mode 100644 index 0b27db5..0000000 --- a/aws-cdk/documentations/02-Deployment-Helm-Beckn-ONIX.md +++ /dev/null @@ -1,255 +0,0 @@ -# Beckn-ONIX AWS CDK Helm Charts - -This repository contains Helm charts for deploying the Beckn-ONIX services on AWS using the AWS CDK framework. The charts are designed to deploy the following applications: - -- **Registry**: Manages Beckn service providers and categories, and provides an additional layer of trust on the network by listing platforms that are compliant to a network’s rules and policies. -- **Gateway**: Central point for routing Beckn messages between providers and participants. -- **BAP (Beckn Application Platform)**: A consumer-facing infrastructure which captures consumers’ requests via its UI applications, converts them into beckn-compliant schemas and APIs at the server side, and fires them at the network. -- **BPP (Beckn Provider Platform)**: Other side of the network is the supply side which consists of Beckn Provider Platforms (BPPs) that maintain an active inventory, one or more catalogs of products and services, implement the supply logic and enable fulfillment of orders. - -## Prerequisites - -- **Amazon EKS Requirements**: - - [**Load Balancer Controller**](https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html): Required for **Registry** and **Gateway**. - - [**EBS CSI Driver**](https://docs.aws.amazon.com/eks/latest/userguide/pv-csi.html) and [**EFS CSI Driver**](https://docs.aws.amazon.com/eks/latest/userguide/efs-csi.html): Required for **BAP** and **BPP**. - - If deploying all Beckn-ONIX components on the same EKS cluster, all three add-ons are necessary. - -- **Kubectl Client**: Configured with the Amazon EKS cluster. -- **Helm 3 Client**: For managing Helm charts. -- **A PostgreSQL Database Instance**: Managed by AWS RDS Aurora in this case. -- **Public Domain/Sub-Domain**: Along with SSL certificates for HTTPS. - - -### Domain and Subdomains - -Beckn-ONIX requires a public domain to be associated with the following services: - -- Registry -- Gateway -- BAP Network -- BPP Network - -Users must obtain a public domain and create subdomains for each service. Additionally, an SSL certificate must be issued for each subdomain to enable HTTPS. You can use [AWS Certificate Manager](https://aws.amazon.com/certificate-manager/pricing/), which provides public SSL/TLS certificates at no cost. - -## Requesting a Public SSL Certificate through AWS Certificate Manager - -Gather the list of subdomains you intend to use for Beckn-ONIX services (as outlined in the pre-requisite). - -To obtain an SSL certificate through AWS Certificate Manager, follow the easy steps provided in the official [AWS ACM Documentation](https://docs.aws.amazon.com/acm/latest/userguide/gs-acm-request-public.html). - -Once a certificate is issued, copy the certificate ARN to be used in the Helm charts later. The certificate ARN follows this format: - -`arn:aws:acm:ap-south-1::certificate/` - -## Helm Parameters -Before installing the Helm chart, it’s important to familiarize yourself with all the available parameters. Each parameter allows you to customize the Helm chart according to your deployment needs. Review the descriptions and default values to understand how they will impact your setup. - -**Note:** If a parameter does not have a default value listed, you are expected to provide a value for it during Helm installation. - -### Registry Parameters - -**Note:** Default values that are empty must be provided during chart execution. - -| Name | Description | Default Value | -| ----------------------------- | --------------------------------------- | ---------------------------------------------------- | -| `externalDomain` | External domain for the Registry service, e.g.
`registry.beckn-onix-aws-cdk.becknprotocol.io`| | -| `database.host` | PostgreSQL database host, e.g.
`beckn-onix-registry.ap-south-1.rds.amazonaws.com`| | -| `database.dbname` | PostgreSQL database name | `registry` | -| `database.username` | PostgreSQL database username | `postgres` | -| `database.password` | PostgreSQL database password | | -| `ingress.tls.certificateArn` | ARN for the TLS certificate, e.g.
`arn:aws:acm:region:account-id:certificate/certificate-id`| | - ---- - -### Gateway Parameters - -**Note:** Default values that are empty must be provided during chart execution. - -| Name | Description | Default Value | -| ----------------------------- | --------------------------------------- | ---------------------------------------------------- | -| `externalDomain` | External domain for the Gateway service, e.g.
`gateway.beckn-onix-aws-cdk.becknprotocol.io`| | -| `registry_url` | Registry URL for Beckn services, e.g.
`https://registry.beckn-onix-aws-cdk.becknprotocol.io`| | -| `database.host` | PostgreSQL database host, e.g.
`beckn-onix-registry.ap-south-1.rds.amazonaws.com`| | -| `database.dbname` | PostgreSQL database name | `gateway` | -| `database.username` | PostgreSQL database username | `postgres` | -| `database.password` | PostgreSQL database password | | -| `ingress.tls.certificateArn` | ARN for the TLS certificate, e.g.
`arn:aws:acm:region:account-id:certificate/certificate-id`| | - ---- - -### BAP/BPP Parameters - -**Note:** Default values that are empty must be provided during chart execution. - -| Name | Description | Default Value | -| ----------------------------------------- | -------------------------------------------------- | --------------------------------------------------- | -| `global.externalDomain` | External domain for the BAP/BPP network service, e.g. `bap-network.beckn-onix-aws-cdk.becknprotocol.io` (BAP), `bpp-network.beckn-onix-aws-cdk.becknprotocol.io` (BPP)| | -| `global.registry_url` | Registry URL for Beckn services, e.g. `https://registry.beckn-onix-aws-cdk.becknprotocol.io`| | -| `global.responseCacheMongo.username` | MongoDB username for response caching | `root` | -| `global.responseCacheMongo.password` | MongoDB password for response caching | -| `global.responseCacheMongo.host` | MongoDB host for response caching | `mongodb.bap-common-services.svc.cluster.local` | -| `global.rabbitMQamqp.password` | RabbitMQ AMQP password for message processing | | -| `global.rabbitMQamqp.host` | RebbitMQ host | `rabbitmq.bap-common-services.svc.cluster.local` | -| `global.redisCache.host` | Redis host | `redis-master.bap-common-services.svc.cluster.local ` | -| `global.ingress.tls.certificateArn` | ARN for the TLS certificate, e.g. `arn:aws:acm:region:account-id:certificate/certificate-id`| | -| `global.bap.privateKey` or `global.bpp.privateKey` | Private key for BAP/BPP, used during registration | | -| `global.bap.publicKey` or `global.bpp.publicKey` | Public key for BAP/BPP, used during registration | | - - -## Installing the Charts - -Before installing the charts, ensure AWS RDS Aurora PostgreSQL database is running and accessible from your EKS cluster. - -### Beckn-ONIX Registry - -```bash -helm install registry . \ - --set externalDomain= \ - --set database.host= \ - --set database.password= \ - --set ingress.tls.certificateArn="aws_certificate_manager_arm" -``` -### Beckn-ONIX Gateway - -```bash -helm install gateway . \ - --set externalDomain= \ - --set registry_url=https:// \ - --set database.host= \ - --set database.password= \ - --set ingress.tls.certificateArn="aws_certificate_manager_arm" -``` - -### Common Services Charts for BAP & BPP - -BAP and BPP services require Redis, MongoDB, and RabbitMQ. These services must be installed before deploying Beckn-ONIX. You can use Bitnami Helm charts for installation: [Bitnami Helm Charts](https://github.com/bitnami/charts/tree/main/bitnami/). - -#### Install Common Services for BAP - -#### Create Namespace and Add Bitnami Helm Repository - -```bash - kubectl create namespace bap-common-services - helm repo add bitnami https://charts.bitnami.com/bitnami -``` - -#### Install Redis -```bash -helm install -n bap-common-services redis bitnami/redis \ ---set auth.enabled=false \ ---set replica.replicaCount=0 \ ---set master.persistence.storageClass="gp2" -``` - -#### Install MongoDB -```bash -helm install -n bap-common-services mongodb bitnami/mongodb \ ---set persistence.storageClass="gp2" - -# To get the Mongodb root password run: -kubectl get secret --namespace bap-common-services mongodb -o jsonpath="{.data.mongodb-root-password}" | base64 -d) -``` - -#### Install RabbitMQ -``` -helm install -n bap-common-services rabbitmq bitnami/rabbitmq \ ---set persistence.enabled=true \ ---set persistence.storageClass="gp2" \ ---set auth.username=beckn \ ---set auth.password=$(openssl rand -base64 12) -``` - -#### Install Common Services for BPP -For BPP, follow the same installation steps as for BAP, but with modifications specific to the BPP K8s namespace: - -1. **Create Namespace for BPP and Add Bitnami Helm Repository** - -```bash - kubectl create namespace bpp-common-services - helm repo add bitnami https://charts.bitnami.com/bitnami -``` -#### Install Redis -```bash -helm install -n bpp-common-services redis bitnami/redis \ ---set auth.enabled=false \ ---set replica.replicaCount=0 \ ---set master.persistence.storageClass="gp2" -``` - -#### Install MongoDB -```bash -helm install -n bpp-common-services mongodb bitnami/mongodb \ ---set persistence.storageClass="gp2" - -# To get the Mongodb root password run: -kubectl get secret --namespace bap-common-services mongodb -o jsonpath="{.data.mongodb-root-password}" | base64 -d) -``` - -#### Install RabbitMQ -``` -helm install -n bpp-common-services rabbitmq bitnami/rabbitmq \ ---set persistence.enabled=true \ ---set persistence.storageClass="gp2" \ ---set auth.username=beckn \ ---set auth.password=$(openssl rand -base64 12) -``` - -### Proceed to Install Beckn-ONIX BAP & BPP - -#### Generate SSL Key Pair -The Protocol Server (BAP/BPP) provides a key generation script. - -**Note:** Ensure Node.js is installed on your system. - -```bash -curl https://raw.githubusercontent.com/beckn/protocol-server/master/scripts/generate-keys.js > generate-keys.js -npm install libsodium-wrappers -node generate-keys.js -``` - -Copy the `publicKey` and `privateKey` from the output. You need to pass keys to following Helm install command. These keys are also added into the K8s secrets via Helm chart. - -> **Info:** AWS CDK automates this process by using the same key generation script and passing the keys directly to the Helm chart. - -#### Beck-ONIX BAP - -```bash -helm install beckn-onix-bap . \ - --set global.externalDomain= \ - --set global.registry_url=https:// \ - --set global.ingress.tls.certificateArn="aws_certificate_manager_arm" \ - --set global.bap.privateKey="private-key" \ - --set global.bap.publicKey="public-key" \ - --set global.efs.fileSystemId="efs-systemId" -``` - -#### Beckn-ONIX BPP - -```bash -helm install beckn-onix-bpp . \ - --set global.externalDomain= \ - --set global.registry_url=https:// \ - --set global.ingress.tls.certificateArn="aws_certificate_manager_arm" - --set global.bpp.privateKey="private-key" \ - --set global.bpp.publicKey="public-key" \ - --set global.efs.fileSystemId="efs-systemId" -``` - -## Next Steps - -After installing all Beckn-Onix services, proceed with the next steps to complete the setup: - -1. **[Verify Deployments](documentations/verify-deployments.md)** - - To ensure that your Beckn-Onix services are running correctly, follow the instructions in the [Verify Deployments](documentations/verify-deployments.md) document. This will help you confirm that the services are operational and identify any issues that need to be addressed. - -2. **[Update DNS Records](documentations/post-deployment-dns-config.md)** - - To configure DNS settings for your services, follow the instructions provided in the [Post-Deployment DNS Configuration](documentations/post-deployment-dns-config.md) document. This will guide you through retrieving the necessary Load Balancer addresses and updating your DNS records. - -3. **[Register BAP and BPP with Registry](documentations/post-deployment-bap-bpp-register.md)** - - After updating your DNS records, you need to register your participants BAP and BPP network with the registry service. Follow the steps in the [BAP and BPP Registration](documentations/post-deployment-bap-bpp-register.md) document to complete this process. - -Make sure to follow the detailed steps in the linked documents to complete the setup and ensure your services are correctly configured and registered. diff --git a/aws-cdk/documentations/helm-updates-release-process.md b/aws-cdk/documentations/helm-updates-release-process.md deleted file mode 100644 index 0f0bfa2..0000000 --- a/aws-cdk/documentations/helm-updates-release-process.md +++ /dev/null @@ -1,89 +0,0 @@ -# Updating Helm Charts and Creating Releases - -## Overview -This guide provides instructions on how to update Helm charts and create a new release. Follow these steps to ensure your updates are applied and released correctly. - -If AWS CDK is used to provision the Beckn-ONIX services, new version of Helm chart needs to be configured in AWS CDK properties as well. - -## Prerequisites -- Helm installed and configured on your local machine. -- Access to the Helm chart repository and necessary permissions. - -## Steps to Update Helm Charts - -1. **Clone the Repository** - ```bash - git clone https://github.com/beckn/beckn-onix.git - cd aws-cdk/helm - ``` -2. **Create a New Branch for Updates** - ```bash - git checkout -b - ``` - -3. Update Helm Chart - * Navigate to the Helm chart directory: helm/registry - * Modify the necessary files (e.g., values.yaml, templates/, Chart.yaml) - -Example change in values.yaml: `replicaCount: 3` - -4. Test Your Changes Locally - -**Note: *** Make sure to supply necessary inputs to Helm charts with `--set` - -```bash -cd registry -helm lint registry . -helm --dry-run install registry . -helm --dry-run upgrade registry . -``` - -5. Update Chart Version -* Check the current version and increment the version in Chart.yaml - -```bash -version: 1.1.0 -``` - -6. Create a Pull Request to push your changes - - -## Creating a Release - -### Packaging Helm Charts - -1. Package the Helm Chart Navigate to the Helm chart directory and create a package of the chart. - -```bash -helm package registry -``` -This command will create a .tgz file in the current directory. - -2. Move the Package to the Packages Folder Move the generated package file to a packages folder located parallel to the helm folder: - -```bash -mv registry-1.1.0.tgz ../packages/ -``` - -### Creating an Index File - -1. Navigate to the `packages` directory and generate an index file that contains metadata about the packaged Helm charts. - -```bash -cd ../packages -helm repo index . --url https://github.com/beckn/beckn-onix/packages -``` -This command creates an `index.yaml` file in the packages directory. - -### Pushing Changes to GitHub - -1. Add Changes to Git Stage the newly created package and index file for commit. - -```bash -git add ../packages/registry-1.1.0.tgz ../packages/index.yaml -git commit -m "Add Helm chart version 1.1.0 and update index file" -git push origin -``` - -2. Create a Pull Request Go to your GitHub repository and create a pull request for the changes. - diff --git a/aws-cdk/documentations/images/AWS-CDK-Flow.png b/aws-cdk/documentations/images/AWS-CDK-Flow.png deleted file mode 100644 index d28c950..0000000 Binary files a/aws-cdk/documentations/images/AWS-CDK-Flow.png and /dev/null differ diff --git a/aws-cdk/documentations/images/Beckn-ONIX-AWS-reference-arch-master.png b/aws-cdk/documentations/images/Beckn-ONIX-AWS-reference-arch-master.png deleted file mode 100644 index b8a6be4..0000000 Binary files a/aws-cdk/documentations/images/Beckn-ONIX-AWS-reference-arch-master.png and /dev/null differ diff --git a/aws-cdk/documentations/images/participant-network-role.png b/aws-cdk/documentations/images/participant-network-role.png deleted file mode 100644 index b205ed1..0000000 Binary files a/aws-cdk/documentations/images/participant-network-role.png and /dev/null differ diff --git a/aws-cdk/documentations/images/participant-status-update.png b/aws-cdk/documentations/images/participant-status-update.png deleted file mode 100644 index b4c787c..0000000 Binary files a/aws-cdk/documentations/images/participant-status-update.png and /dev/null differ diff --git a/aws-cdk/documentations/images/registry-network-participants.png b/aws-cdk/documentations/images/registry-network-participants.png deleted file mode 100644 index 9b73529..0000000 Binary files a/aws-cdk/documentations/images/registry-network-participants.png and /dev/null differ diff --git a/aws-cdk/documentations/post-deployment-bap-bpp-register.md b/aws-cdk/documentations/post-deployment-bap-bpp-register.md deleted file mode 100644 index 44daf39..0000000 --- a/aws-cdk/documentations/post-deployment-bap-bpp-register.md +++ /dev/null @@ -1,100 +0,0 @@ -# BAP and BPP registration with Registry - -After updating your DNS records, you need to register the `bap-network` and `bpp-network` services with the registry service. Follow these instructions to complete the registration process: - -## 1. Register BAP or BPP Network - -### Formulate the Registration Payload - -Use the table below to create the JSON payload for registering the `bap-network` or `bpp-network`: - -| Field | Description | Example Value | -|----------------------|---------------------------------------------------------------|-------------------------------------------------------------| -| `subscriber_id` | Set this to the DNS name of the `bap-network` or `bpp-network`. | `bap-network.beckn-onix-aws-cdk.becknprotocol.io` or `bpp-network.beckn-onix-aws-cdk.becknprotocol.io` | -| `pub_key_id` | Public key that the BAP/BPP service started with. | | -| `unique_key_id` | Unique key identifier, usually in the format `subscriber_id.k1`. | `bap-network.beckn-onix-aws-cdk.becknprotocol.io.k1` or `bpp-network.beckn-onix-aws-cdk.becknprotocol.io.k1` | -| `subscriber_url` | URL of the `bap-network` or `bpp-network`. | `https://bap-network.beckn-onix-aws-cdk.becknprotocol.io` or `https://bpp-network.beckn-onix-aws-cdk.becknprotocol.io` | -| `domain` | Leave this as an empty string if not used. Or check if a domain has been configured on Registry. | ` ` | -| `extended_attributes`| Additional attributes if any. | `{"domains": []}` | -| `encr_public_key` | Encryption public key that the BAP/BPP service uses. This is same as `pub_key_id` | | -| `signing_public_key` | Signing public key that the BAP/BPP service uses. This is same as `pub_key_id` | | -| `valid_from` | Start date and time in ISO 8601 format. | `2024-09-05T09:27:57.630Z` | -| `valid_until` | Expiration date and time in ISO 8601 format. | `2027-09-06T09:28:40.494Z` | -| `type` | Set to `BAP` or `BPP` based on the service. | `BAP` or `BPP` | -| `country` | Country code. | `IND` | -| `status` | Use `SUBSCRIBED` to indicate that the registration is complete. | `SUBSCRIBED` | - -**Example `curl` Command for BAP Network:** - -```bash -curl --location --request POST 'https://registry.beckn-onix-aws-cdk.becknprotocol.io/subscribers/register' \ ---header "Content-Type: application/json" \ ---data-raw '{ - "subscriber_id": "subscriber_id", - "pub_key_id": "public_key", - "unique_key_id": "subscriber_id.k1", - "subscriber_url": "https://url_bap_network", - "domain": " ", - "extended_attributes": {"domains": []}, - "encr_public_key": "public_key", - "signing_public_key": "public_key", - "valid_from": "2024-09-05T09:27:57.630Z", - "valid_until": "2027-09-06T09:28:40.494Z", - "type": "BAP", - "country": "IND", - "status": "SUBSCRIBED" -}' -``` - -**Example `curl` Command for BPP Network:** - -```bash -curl --location --request POST 'https://registry.beckn-onix-aws-cdk.becknprotocol.io/subscribers/register' \ ---header "Content-Type: application/json" \ ---data-raw '{ - "subscriber_id": "subscriber_id", - "pub_key_id": "public_key", - "unique_key_id": "subscriber_id.k1", - "subscriber_url": "https://url-bpp-network", - "domain": " ", - "extended_attributes": {"domains": []}, - "encr_public_key": "public_key", - "signing_public_key": "public_key", - "valid_from": "2024-09-05T09:27:57.630Z", - "valid_until": "2027-09-06T09:28:40.494Z", - "type": "BPP", - "country": "IND", - "status": "SUBSCRIBED" -}' -``` - -### Update Status in Registry UI - -After sending the registration request, you need to manually update the status in the registry service UI. The auto-registration feature of BAP and BPP with Registry is in the backlog. Follow these steps: - -1. **Login into the Registry** - - Navigate to the **Admin** section, and click on **Network Participant**. - - Admin - Network Participant - -2. **Open BAP or BPP Participant** - - Find and select the **BAP** or **BPP** participant you registered earlier. - - Open BAP or BPP Participant - -3. **Navigate to Network Role Tab and Edit** - - Go to the **Network Role** tab and click **Edit**. - - Network Role Tab - -4. **Edit Status and Select SUBSCRIBE** - - Update the status from `INITIATED` to `SUBSCRIBED`, then save your changes. - - Edit Status - - - diff --git a/aws-cdk/documentations/post-deployment-dns-config.md b/aws-cdk/documentations/post-deployment-dns-config.md deleted file mode 100644 index 9e5669f..0000000 --- a/aws-cdk/documentations/post-deployment-dns-config.md +++ /dev/null @@ -1,50 +0,0 @@ -# Beckn-ONIX DNS Configuration - -After verifying that the Beckn-Onix services (`registry`, `gateway`, `bap-network`, and `bap-client`) are successfully deployed, you need to update your DNS settings to ensure proper routing of traffic. Follow these steps to configure your DNS records. - -### Retrieve the Amazon ALB's DNS Addresses -Run following commands to extract the external DNS name of the Amazon ALB attached with Ingress across all Beckn-ONIX services. - -Alternatively, you can retrieve the DNS names of the Amazon ALBs associated with the Ingress resources from the AWS Management Console or using the AWS CLI. - -#### Registry - - ```bash - kubectl -n beckn-onix-registry get ingress -o jsonpath='{.items[*].status.loadBalancer.ingress[*].hostname}' - ``` - -#### Gateway - ```bash - kubectl -n beckn-onix-registry get ingress -o jsonpath='{.items[*].status.loadBalancer.ingress[*].hostname}' - ``` - -#### BAP Network - ```bash - kubectl -n beckn-onix-bap get ingress -o jsonpath='{.items[*].status.loadBalancer.ingress[*].hostname}' - ``` - -#### BPP Network - ```bash - kubectl -n beckn-onix-bpp get ingress -o jsonpath='{.items[*].status.loadBalancer.ingress[*].hostname}' - ``` - -### Update DNS Records - -#### 1. Log in to Your DNS Provider - -Access the management console of your domain registrar or DNS hosting provider. For instance, if using Amazon Route 53, go to the Route 53 dashboard in the AWS Management Console. - -#### 2. Add DNS Records - -Create or update DNS records for each service. You need to set up the following DNS records for your services: - -- **Type:** CNAME (or Alias record if using Route 53) -- **Name:** The subdomain you want to use (e.g., `registry.beckn-onix-aws-cdk.becknprotocol.io`, `gateway.beckn-onix-aws-cdk.becknprotocol.io`, etc.) -- **Value:** The respective DNS name of the Amazon ALB retrieved in the previous step. - -## Next Steps - -After updating your DNS records, you need to register your participants BAP and BPP network with the registry service. Follow the steps in the [BAP and BPP Registration](documentations/post-deployment-bap-bpp-register.md) document to complete this process. - -**[Register BAP and BPP with Registry](documentations/post-deployment-bap-bpp-register.md)** - diff --git a/aws-cdk/documentations/verify-deployments.md b/aws-cdk/documentations/verify-deployments.md deleted file mode 100644 index 60711ab..0000000 --- a/aws-cdk/documentations/verify-deployments.md +++ /dev/null @@ -1,116 +0,0 @@ -### Verifying Deployed Beckn-ONIX Services in Amazon EKS - -Once the Helm charts are successfully deployed (manually or through AWS CDK), you can verify that the services (Registry, Gateway, Redis, MongoDB, RabbitMQ, BAP and BPP) are running correctly in your Amazon EKS cluster by using the following commands. - -**Configure [Kubectl client](https://docs.aws.amazon.com/eks/latest/userguide/create-kubeconfig.html) with Amazon EKS Cluster** - -#### 1. Verify Namespaces -Run the following command to check `namespaces`. - -**Note:** This output is from the Sandbox environment, so you will see that all services are deployed. However, you may observe namespaces in your environment based on the specific Beckn-ONIX service you are deploying. - -```bash -$ kubectl get namespaces -NAME STATUS AGE -bap-common-services Active 5d21h -beckn-onix-bap Active 5d21h -beckn-onix-bpp Active 4d20h -beckn-onix-gateway Active 6d19h -beckn-onix-registry Active 6d20h -bpp-common-services Active 4d21h -``` - -#### 2. Verify Pods Status - -Run the following command to check the status of all pods in the `namespace` where the services are deployed: - -```bash -$ kubectl -n beckn-onix-registry get pod -NAME READY STATUS RESTARTS AGE -beckn-onix-registry-5f96f7b755-49nz6 1/1 Running 0 2d1h -``` - -```bash -$ kubectl -n beckn-onix-gateway get pod -NAME READY STATUS RESTARTS AGE -beckn-onix-gateway-574d67df98-qbvtb 1/1 Running 0 2d1h -``` - -```bash -$ kubectl -n bap-common-services get pod -NAME READY STATUS RESTARTS AGE -mongodb-597955cb85-kctrd 1/1 Running 0 5d21h -rabbitmq-0 1/1 Running 0 2d1h -redis-master-0 1/1 Running 0 5d21h -``` - -```bash -$ kubectl -n bpp-common-services get pod -NAME READY STATUS RESTARTS AGE -mongodb-597955cb85-nqs4r 1/1 Running 0 4d21h -rabbitmq-0 1/1 Running 0 2d1h -redis-master-0 1/1 Running 0 2d1h -``` - -```bash -$ kubectl -n beckn-onix-bap get pod -NAME READY STATUS RESTARTS AGE -bap-client-84c5d6b6fd-cb9qr 1/1 Running 0 2d1h -bap-network-d875cdb9c-btjcl 1/1 Running 0 2d1h -``` - -```bash -$ kubectl -n beckn-onix-bpp get pod -NAME READY STATUS RESTARTS AGE -bpp-client-59f976cb94-4cmwh 1/1 Running 0 2d1h -bpp-network-5f88bb75d9-jc7g4 1/1 Running 0 2d1h -``` - -#### 3. Verify Ingress and Kubernetes Service -The Ingress resource provisions an Amazon Application Load Balancer (ALB) that routes external traffic to the appropriate Kubernetes service, which then directs the traffic to the underlying service pods. - -```bash -$ kubectl -n beckn-onix-registry get ingress,svc -NAME CLASS HOSTS ADDRESS PORTS AGE -ingress.networking.k8s.io/beckn-onix-registry-ingress alb * beckn-onix-registry-1902090994.ap-south-1.elb.amazonaws.com 80 6d20h - -NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -service/beckn-onix-registry-svc ClusterIP 10.100.55.190 3030/TCP 6d20h -``` - -```bash -$ kubectl -n beckn-onix-gateway get ingress,svc -NAME CLASS HOSTS ADDRESS PORTS AGE -ingress.networking.k8s.io/beckn-onix-gateway-ingress alb * beckn-onix-gateway-1452877031.ap-south-1.elb.amazonaws.com 80 6d19h - -NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -service/beckn-onix-gateway-svc ClusterIP 10.100.44.118 4030/TCP 6d19h -``` - -```bash -$ kubectl -n beckn-onix-bap get ingress,svc -NAME CLASS HOSTS ADDRESS PORTS AGE -ingress.networking.k8s.io/bap-network-ingress alb * beckn-onix-bap-network-1610405288.ap-south-1.elb.amazonaws.com 80 5d20h - -NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -service/bap-network-svc ClusterIP 10.100.36.244 5001/TCP 5d21h -``` - -```bash -$ kubectl -n beckn-onix-bpp get ingress,svc -NAME CLASS HOSTS ADDRESS PORTS AGE -ingress.networking.k8s.io/bpp-network-ingress alb * beckn-onix-bpp-network-736891093.ap-south-1.elb.amazonaws.com 80 4d21h - -NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -service/bpp-network-svc ClusterIP 10.100.130.43 6001/TCP 4d21h -``` - -## Next Steps - -After verifying that all Beckn-Onix services have been deployed successfully, proceed with the next steps to complete the setup: - -1. **[Update DNS Records](post-deployment-dns-config.md)** - - To configure DNS settings for your services, follow the instructions provided in the [Post-Deployment DNS Configuration](post-deployment-dns-config.md) document. This will guide you through retrieving the necessary Load Balancer addresses and updating your DNS records. - -Make sure to follow the detailed steps in the linked document to ensure that your DNS records are correctly configured for proper service routing. diff --git a/aws-cdk/helm/beckn-onix-bap/Chart.yaml b/aws-cdk/helm/beckn-onix-bap/Chart.yaml deleted file mode 100644 index ebd5534..0000000 --- a/aws-cdk/helm/beckn-onix-bap/Chart.yaml +++ /dev/null @@ -1,24 +0,0 @@ -apiVersion: v2 -name: beckn-onix-bap -description: Beckn ONIX BAP Helm chart for Kubernetes - -# A chart can be either an 'application' or a 'library' chart. -# -# Application charts are a collection of templates that can be packaged into versioned archives -# to be deployed. -# -# Library charts provide useful utilities or functions for the chart developer. They're included as -# a dependency of application charts to inject those utilities and functions into the rendering -# pipeline. Library charts do not define any templates and therefore cannot be deployed. -type: application - -# This is the chart version. This version number should be incremented each time you make changes -# to the chart and its templates, including the app version. -# Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.1.0 - -# This is the version number of the application being deployed. This version number should be -# incremented each time you make changes to the application. Versions are not expected to -# follow Semantic Versioning. They should reflect the version the application is using. -# It is recommended to use it with quotes. -appVersion: "1.0.0" \ No newline at end of file diff --git a/aws-cdk/helm/beckn-onix-bap/charts/bap-client/Chart.yaml b/aws-cdk/helm/beckn-onix-bap/charts/bap-client/Chart.yaml deleted file mode 100644 index 9280a58..0000000 --- a/aws-cdk/helm/beckn-onix-bap/charts/bap-client/Chart.yaml +++ /dev/null @@ -1,24 +0,0 @@ -apiVersion: v2 -name: bap-client -description: BAP Client Helm chart for Kubernetes - -# A chart can be either an 'application' or a 'library' chart. -# -# Application charts are a collection of templates that can be packaged into versioned archives -# to be deployed. -# -# Library charts provide useful utilities or functions for the chart developer. They're included as -# a dependency of application charts to inject those utilities and functions into the rendering -# pipeline. Library charts do not define any templates and therefore cannot be deployed. -type: application - -# This is the chart version. This version number should be incremented each time you make changes -# to the chart and its templates, including the app version. -# Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.1.0 - -# This is the version number of the application being deployed. This version number should be -# incremented each time you make changes to the application. Versions are not expected to -# follow Semantic Versioning. They should reflect the version the application is using. -# It is recommended to use it with quotes. -appVersion: "1.0.0" diff --git a/aws-cdk/helm/beckn-onix-bap/charts/bap-client/ingress.yaml b/aws-cdk/helm/beckn-onix-bap/charts/bap-client/ingress.yaml deleted file mode 100644 index eb51c71..0000000 --- a/aws-cdk/helm/beckn-onix-bap/charts/bap-client/ingress.yaml +++ /dev/null @@ -1,31 +0,0 @@ -{{- if .Values.global.ingress.enabled }} -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: {{ include "common.name" . }}-ingress - namespace: {{ .Values.global.namespace }} - labels: - {{- include "common.labels" . | nindent 4 }} - annotations: - alb.ingress.kubernetes.io/scheme: internet-facing - alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]' - alb.ingress.kubernetes.io/ssl-policy: ELBSecurityPolicy-TLS-1-1-2017-01 - alb.ingress.kubernetes.io/certificate-arn: {{ .Values.global.ingress.tls.certificateArn | quote }} - alb.ingress.kubernetes.io/ssl-redirect: '443' - alb.ingress.kubernetes.io/load-balancer-name: beckn-onix-bap-client - alb.ingress.kubernetes.io/target-group-attributes: stickiness.enabled=true,stickiness.lb_cookie.duration_seconds=300 - alb.ingress.kubernetes.io/target-type: ip - alb.ingress.kubernetes.io/success-codes: 200,302 -spec: - ingressClassName: alb - rules: - - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: {{ include "common.name" . }}-svc - port: - number: {{ .Values.service.port }} -{{- end }} \ No newline at end of file diff --git a/aws-cdk/helm/beckn-onix-bap/charts/bap-client/templates/NOTES.txt b/aws-cdk/helm/beckn-onix-bap/charts/bap-client/templates/NOTES.txt deleted file mode 100644 index 833abc0..0000000 --- a/aws-cdk/helm/beckn-onix-bap/charts/bap-client/templates/NOTES.txt +++ /dev/null @@ -1,11 +0,0 @@ -{{ "\n" }} -Get the Beckn-ONIX BAP Client (Protocol Server) URL by running these commands: -{{ "\n" }} -{{- if .Values.global.ingress.enabled }} - export INGRESS_HOST=$(kubectl get ingress {{ include "common.name" . }}-ingress -n {{ .Values.namespace }} -o jsonpath="{.status.loadBalancer.ingress[0].hostname}") - {{- if .Values.global.ingress.tls.enabled }} - echo "https://$INGRESS_HOST" - {{- else }} - echo "http://$INGRESS_HOST" - {{- end }} -{{- end }} diff --git a/aws-cdk/helm/beckn-onix-bap/charts/bap-client/templates/_helpers.tpl b/aws-cdk/helm/beckn-onix-bap/charts/bap-client/templates/_helpers.tpl deleted file mode 100644 index e8c3f44..0000000 --- a/aws-cdk/helm/beckn-onix-bap/charts/bap-client/templates/_helpers.tpl +++ /dev/null @@ -1,93 +0,0 @@ -{{/* -Expand the name of the chart or use a provided override. -*/}} -{{- define "common.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name, with truncation to 63 characters. -*/}} -{{- define "common.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Generate a chart name and version label. -*/}} -{{- define "common.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels to be used in all charts. -*/}} -{{- define "common.labels" -}} -helm.sh/chart: {{ include "common.chart" . }} -{{ include "common.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -app.kubernetes.io/release: {{ .Release.Revision | quote }} -{{- end }} - -{{/* -Common selector labels. -*/}} -{{- define "common.selectorLabels" -}} -app.kubernetes.io/name: {{ include "common.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Helper for creating service account names. -*/}} -{{- define "common.serviceAccountName" -}} -{{- if .Values.serviceAccount.create }} -{{- default (include "common.fullname" .) .Values.serviceAccount.name }} -{{- else }} -{{- default "default" .Values.serviceAccount.name }} -{{- end }} -{{- end }} - -{{/* -Helper for image names and tags. -*/}} -{{- define "common.image" -}} -{{ printf "%s:%s" .Values.image.repository .Values.image.tag }} -{{- end }} - -{{/* -Helper for constructing resource names with prefixes or suffixes. -*/}} -{{- define "common.resourceName" -}} -{{- printf "%s-%s" (include "common.fullname" .) .Values.suffix | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{- define "getSecretValue" -}} -{{- $secretName := .secretName -}} -{{- $namespace := .namespace -}} -{{- $key := .key -}} -{{- $secret := (lookup "v1" "Secret" $namespace $secretName) -}} -{{- if $secret -}} -{{- $data := $secret.data -}} -{{- if $data -}} -{{- $value := index $data $key | b64dec -}} -{{- $value -}} -{{- else -}} -{{- printf "Error: Secret data for %s not found" $key -}} -{{- end -}} -{{- else -}} -{{- printf "Error: Secret %s not found in namespace %s" $secretName $namespace -}} -{{- end -}} -{{- end -}} \ No newline at end of file diff --git a/aws-cdk/helm/beckn-onix-bap/charts/bap-client/templates/configmap.yaml b/aws-cdk/helm/beckn-onix-bap/charts/bap-client/templates/configmap.yaml deleted file mode 100644 index bc8360b..0000000 --- a/aws-cdk/helm/beckn-onix-bap/charts/bap-client/templates/configmap.yaml +++ /dev/null @@ -1,144 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "common.name" . }}-config - namespace: {{ .Values.global.namespace }} -data: - default.yaml: | - # Mandatory - server: - port: {{ .Values.service.port }} - - # Redis connection details - cache: - host: {{ .Values.global.redisCache.host }} - port: {{ .Values.global.redisCache.port }} - ttl: "PT10M" - # Optional. Default is 0. - db: 1 - - # Mongodb connection details - responseCache: - # By default password is picked from MongoDB POD if not supplied through Helm values. - mongoURL: "mongodb://{{ .Values.global.responseCacheMongo.username }}:{{ if .Values.global.responseCacheMongo.password }}{{ .Values.global.responseCacheMongo.password }}{{ else }}{{ include "getSecretValue" (dict "secretName" "mongodb" "namespace" "bap-common-services" "key" "mongodb-root-password") }}{{ end }}@{{ .Values.global.responseCacheMongo.host }}:{{ .Values.global.responseCacheMongo.port }}/{{ .Values.global.responseCacheMongo.dbname }}?authSource=admin" - ttl: "PT10M" - - # Priority order will be - # 1. Synchronous - # 2. webhook - # 3. pubSub - - client: - synchronous: - # By default password is picked from MongoDB POD if not supplied through Helm values. - mongoURL: "mongodb://{{ .Values.global.responseCacheMongo.username }}:{{ if .Values.global.responseCacheMongo.password }}{{ .Values.global.responseCacheMongo.password }}{{ else }}{{ include "getSecretValue" (dict "secretName" "mongodb" "namespace" "bap-common-services" "key" "mongodb-root-password") }}{{ end }}@{{ .Values.global.responseCacheMongo.host }}:{{ .Values.global.responseCacheMongo.port }}/{{ .Values.global.responseCacheMongo.dbname }}?authSource=admin" - ttl: "PT10M" - - # Only required for BPP - # webhook: - # url: "https://beckn.free.beeceptor.com/clientURL" - - app: - # Supported mode - bap and bpp - mode: {{ .Values.app.mode }} - - # Two types of gateway mode present - client and network - gateway: - mode: {{ .Values.app.gateway.mode }} - inboxQueue: "inbox" - outboxQueue: "outbox" - - # RabbitMQ connection details - # By default password is picked from RabbitMQ POD if not supplied through Helm values. - amqpURL: "amqp://{{ .Values.global.rabbitMQamqp.username }}:{{ if .Values.global.rabbitMQamqp.password }}{{ .Values.global.rabbitMQamqp.password }}{{ else }}{{ include "getSecretValue" (dict "secretName" "rabbitmq" "namespace" "bap-common-services" "key" "rabbitmq-password") }}{{ end }}@{{ .Values.global.rabbitMQamqp.host }}:{{ .Values.global.rabbitMQamqp.port }}" - - # Mandatory. - actions: - requests: - search: - ttl : "PT15S" - init: - ttl : "PT10S" - select: - ttl : "PT10S" - confirm: - ttl : "PT10S" - status: - ttl : "PT10S" - track: - ttl : "PT10S" - cancel: - ttl : "PT10S" - update: - ttl : "PT10S" - rating: - ttl : "PT10S" - support: - ttl : "PT10S" - get_cancellation_reasons: - ttl : "PT10S" - get_rating_categories: - ttl : "PT10S" - cancellation: - ttl : "PT10S" - - responses: - on_search: - ttl: "PT15S" - on_init: - ttl: "PT10S" - on_select: - ttl: "PT10S" - on_confirm: - ttl: "PT10S" - on_status: - ttl: "PT10S" - on_track: - ttl: "PT10S" - on_cancel: - ttl: "PT10S" - on_update: - ttl: "PT10S" - on_rating: - ttl: "PT10S" - on_support: - ttl: "PT10S" - cancellation_reasons: - ttl: "PT10S" - rating_categories: - ttl: "PT10S" - - # Mandatory keys - privateKey: {{ .Values.global.bap.privateKey }} - publicKey: {{ .Values.global.bap.publicKey }} - - # Subscriber details - subscriberId: "{{ .Values.global.subscriber_id | default .Values.global.externalDomain }}" - subscriberUri: "https://{{ .Values.global.externalDomain }}" - - # Registry - registryUrl: "{{ .Values.global.registry_url }}/subscribers" - auth: false - # BAP client key ID - uniqueKey: "{{ .Values.global.externalDomain }}.k1" - - # Mandatory - city: "std:080" - country: "IND" - - # Mandatory - ttl: "PT10M" - - # Mandatory - httpTimeout: "PT3S" - httpRetryCount: 2 - telemetry: - enabled: false - url: "" - batchSize: 100 - # In minutes - syncInterval: 30 - redis_db: 3 - - useLayer2Config: true - mandateLayer2Config: true \ No newline at end of file diff --git a/aws-cdk/helm/beckn-onix-bap/charts/bap-client/templates/deployment.yaml b/aws-cdk/helm/beckn-onix-bap/charts/bap-client/templates/deployment.yaml deleted file mode 100644 index 50202c3..0000000 --- a/aws-cdk/helm/beckn-onix-bap/charts/bap-client/templates/deployment.yaml +++ /dev/null @@ -1,72 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "common.name" . }} - namespace: {{ .Values.global.namespace }} - labels: - {{- include "common.labels" . | nindent 4 }} -spec: - {{- if not .Values.autoscaling.enabled }} - replicas: {{ .Values.replicaCount }} - {{- end }} - selector: - matchLabels: - {{- include "common.selectorLabels" . | nindent 6 }} - template: - metadata: - annotations: - {{- with .Values.podAnnotations }} - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - {{- include "common.labels" . | nindent 8 }} - {{- with .Values.podLabels }} - {{- toYaml . | nindent 8 }} - {{- end }} - spec: - {{- with .Values.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - serviceAccountName: {{ include "common.serviceAccountName" . }} - securityContext: - {{- toYaml .Values.podSecurityContext | nindent 8 }} - containers: - - name: {{ .Chart.Name }} - image: {{ .Values.global.image.repository }} - imagePullPolicy: {{ .Values.global.image.pullPolicy }} - ports: - - name: bap-client-port - containerPort: {{ .Values.service.port }} - protocol: TCP - {{- if .Values.livenessProbe }} - livenessProbe: - {{- toYaml .Values.livenessProbe | nindent 12 }} - {{- end }} - {{- if .Values.readinessProbe }} - readinessProbe: - {{- toYaml .Values.readinessProbe | nindent 12 }} - {{- end }} - resources: - {{- toYaml .Values.resources | nindent 12 }} - volumeMounts: - - name: bap-client-config - mountPath: "/usr/src/app/config/default.yaml" - subPath: default.yaml - readOnly: true - # EFS volumes for L2 schemas - - name: bap-schemas-efs-volume - mountPath: /usr/src/app/schemas - # EBS volumes for logs - - name: bap-client-logs-ebs-volume - mountPath: /usr/src/app/logs - volumes: - - name: bap-client-config - configMap: - name: {{ include "common.name" . }}-config - - name: bap-schemas-efs-volume - persistentVolumeClaim: - claimName: beckn-onix-bap-efs-pvc - - name: bap-client-logs-ebs-volume - persistentVolumeClaim: - claimName: {{ include "common.name" . }}-logs-pvc \ No newline at end of file diff --git a/aws-cdk/helm/beckn-onix-bap/charts/bap-client/templates/ingress.yaml b/aws-cdk/helm/beckn-onix-bap/charts/bap-client/templates/ingress.yaml deleted file mode 100644 index eb51c71..0000000 --- a/aws-cdk/helm/beckn-onix-bap/charts/bap-client/templates/ingress.yaml +++ /dev/null @@ -1,31 +0,0 @@ -{{- if .Values.global.ingress.enabled }} -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: {{ include "common.name" . }}-ingress - namespace: {{ .Values.global.namespace }} - labels: - {{- include "common.labels" . | nindent 4 }} - annotations: - alb.ingress.kubernetes.io/scheme: internet-facing - alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]' - alb.ingress.kubernetes.io/ssl-policy: ELBSecurityPolicy-TLS-1-1-2017-01 - alb.ingress.kubernetes.io/certificate-arn: {{ .Values.global.ingress.tls.certificateArn | quote }} - alb.ingress.kubernetes.io/ssl-redirect: '443' - alb.ingress.kubernetes.io/load-balancer-name: beckn-onix-bap-client - alb.ingress.kubernetes.io/target-group-attributes: stickiness.enabled=true,stickiness.lb_cookie.duration_seconds=300 - alb.ingress.kubernetes.io/target-type: ip - alb.ingress.kubernetes.io/success-codes: 200,302 -spec: - ingressClassName: alb - rules: - - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: {{ include "common.name" . }}-svc - port: - number: {{ .Values.service.port }} -{{- end }} \ No newline at end of file diff --git a/aws-cdk/helm/beckn-onix-bap/charts/bap-client/templates/logs-pvc.yaml b/aws-cdk/helm/beckn-onix-bap/charts/bap-client/templates/logs-pvc.yaml deleted file mode 100644 index 9cdb6f2..0000000 --- a/aws-cdk/helm/beckn-onix-bap/charts/bap-client/templates/logs-pvc.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: {{ include "common.name" . }}-logs-pvc - namespace: {{ .Values.global.namespace }} -spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 5Gi - storageClassName: gp2 diff --git a/aws-cdk/helm/beckn-onix-bap/charts/bap-client/templates/service.yaml b/aws-cdk/helm/beckn-onix-bap/charts/bap-client/templates/service.yaml deleted file mode 100644 index 245b8a9..0000000 --- a/aws-cdk/helm/beckn-onix-bap/charts/bap-client/templates/service.yaml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ include "common.name" . }}-svc - namespace: {{ .Values.global.namespace }} - labels: - {{- include "common.labels" . | nindent 4 }} -spec: - type: {{ .Values.service.type }} - ports: - - port: {{ .Values.service.port }} - targetPort: bap-client-port - protocol: TCP - name: http - selector: - {{- include "common.selectorLabels" . | nindent 4 }} diff --git a/aws-cdk/helm/beckn-onix-bap/charts/bap-client/values.yaml b/aws-cdk/helm/beckn-onix-bap/charts/bap-client/values.yaml deleted file mode 100644 index b2695ec..0000000 --- a/aws-cdk/helm/beckn-onix-bap/charts/bap-client/values.yaml +++ /dev/null @@ -1,74 +0,0 @@ -# Default values for registry. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -replicaCount: 1 - -service: - type: ClusterIP - port: 5002 - -# Supported app mode - bap or bpp. Gateway mode to be either client or network. -app: - mode: bap - gateway: - mode: client - -resources: - # Adjust it as per desired POD resource demand - requests: - cpu: "0.5" - memory: "1Gi" - limits: - cpu: "0.5" - memory: "1Gi" - -livenessProbe: {} - # httpGet: - # path: / - # port: http -readinessProbe: {} - # httpGet: - # path: / - # port: http - -# To configure HPA -autoscaling: - enabled: false - minReplicas: 1 - maxReplicas: 2 - targetCPUUtilizationPercentage: 80 - # targetMemoryUtilizationPercentage: 80 - -serviceAccount: - # Specifies whether a service account should be created - create: false - # Automatically mount a ServiceAccount's API credentials? - automount: true - # Annotations to add to the service account - annotations: {} - # The name of the service account to use. - # If not set and create is true, a name is generated using the fullname template - name: "" - -podAnnotations: {} -podLabels: {} - -podSecurityContext: {} - # fsGroup: 2000 - -securityContext: {} - # capabilities: - # drop: - # - ALL - # readOnlyRootFilesystem: true - # runAsNonRoot: true - # runAsUser: 1000 - -nodeSelector: {} - -tolerations: [] - -affinity: {} - - diff --git a/aws-cdk/helm/beckn-onix-bap/charts/bap-network/Chart.yaml b/aws-cdk/helm/beckn-onix-bap/charts/bap-network/Chart.yaml deleted file mode 100644 index d9606ec..0000000 --- a/aws-cdk/helm/beckn-onix-bap/charts/bap-network/Chart.yaml +++ /dev/null @@ -1,24 +0,0 @@ -apiVersion: v2 -name: bap-network -description: BAP Network Helm chart for Kubernetes - -# A chart can be either an 'application' or a 'library' chart. -# -# Application charts are a collection of templates that can be packaged into versioned archives -# to be deployed. -# -# Library charts provide useful utilities or functions for the chart developer. They're included as -# a dependency of application charts to inject those utilities and functions into the rendering -# pipeline. Library charts do not define any templates and therefore cannot be deployed. -type: application - -# This is the chart version. This version number should be incremented each time you make changes -# to the chart and its templates, including the app version. -# Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.1.0 - -# This is the version number of the application being deployed. This version number should be -# incremented each time you make changes to the application. Versions are not expected to -# follow Semantic Versioning. They should reflect the version the application is using. -# It is recommended to use it with quotes. -appVersion: "1.0.0" diff --git a/aws-cdk/helm/beckn-onix-bap/charts/bap-network/templates/NOTES.txt b/aws-cdk/helm/beckn-onix-bap/charts/bap-network/templates/NOTES.txt deleted file mode 100644 index ae8bf1d..0000000 --- a/aws-cdk/helm/beckn-onix-bap/charts/bap-network/templates/NOTES.txt +++ /dev/null @@ -1,11 +0,0 @@ -{{ "\n" }} -Get the Beckn-ONIX BAP Network (Protocol Server) URL by running these commands: -{{ "\n" }} -{{- if .Values.global.ingress.enabled }} - export INGRESS_HOST=$(kubectl get ingress {{ include "common.name" . }}-ingress -n {{ .Values.namespace }} -o jsonpath="{.status.loadBalancer.ingress[0].hostname}") - {{- if .Values.global.ingress.tls.enabled }} - echo "https://$INGRESS_HOST" - {{- else }} - echo "http://$INGRESS_HOST" - {{- end }} -{{- end }} diff --git a/aws-cdk/helm/beckn-onix-bap/charts/bap-network/templates/_helpers.tpl b/aws-cdk/helm/beckn-onix-bap/charts/bap-network/templates/_helpers.tpl deleted file mode 100644 index aba87bd..0000000 --- a/aws-cdk/helm/beckn-onix-bap/charts/bap-network/templates/_helpers.tpl +++ /dev/null @@ -1,94 +0,0 @@ -{{/* -Expand the name of the chart or use a provided override. -*/}} -{{- define "common.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name, with truncation to 63 characters. -*/}} -{{- define "common.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Generate a chart name and version label. -*/}} -{{- define "common.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels to be used in all charts. -*/}} -{{- define "common.labels" -}} -helm.sh/chart: {{ include "common.chart" . }} -{{ include "common.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -app.kubernetes.io/release: {{ .Release.Revision | quote }} -{{- end }} - -{{/* -Common selector labels. -*/}} -{{- define "common.selectorLabels" -}} -app.kubernetes.io/name: {{ include "common.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Helper for creating service account names. -*/}} -{{- define "common.serviceAccountName" -}} -{{- if .Values.serviceAccount.create }} -{{- default (include "common.fullname" .) .Values.serviceAccount.name }} -{{- else }} -{{- default "default" .Values.serviceAccount.name }} -{{- end }} -{{- end }} - -{{/* -Helper for image names and tags. -*/}} -{{- define "common.image" -}} -{{ printf "%s:%s" .Values.image.repository .Values.image.tag }} -{{- end }} - -{{/* -Helper for constructing resource names with prefixes or suffixes. -*/}} -{{- define "common.resourceName" -}} -{{- printf "%s-%s" (include "common.fullname" .) .Values.suffix | trunc 63 | trimSuffix "-" }} -{{- end }} - - -{{- define "getSecretValue" -}} -{{- $secretName := .secretName -}} -{{- $namespace := .namespace -}} -{{- $key := .key -}} -{{- $secret := (lookup "v1" "Secret" $namespace $secretName) -}} -{{- if $secret -}} -{{- $data := $secret.data -}} -{{- if $data -}} -{{- $value := index $data $key | b64dec -}} -{{- $value -}} -{{- else -}} -{{- printf "Error: Secret data for %s not found" $key -}} -{{- end -}} -{{- else -}} -{{- printf "Error: Secret %s not found in namespace %s" $secretName $namespace -}} -{{- end -}} -{{- end -}} \ No newline at end of file diff --git a/aws-cdk/helm/beckn-onix-bap/charts/bap-network/templates/configmap.yaml b/aws-cdk/helm/beckn-onix-bap/charts/bap-network/templates/configmap.yaml deleted file mode 100644 index 320dafa..0000000 --- a/aws-cdk/helm/beckn-onix-bap/charts/bap-network/templates/configmap.yaml +++ /dev/null @@ -1,144 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "common.name" . }}-config - namespace: {{ .Values.global.namespace }} -data: - default.yaml: | - # Mandatory - server: - port: {{ .Values.service.port }} - - # Redis connection details - cache: - host: {{ .Values.global.redisCache.host }} - port: {{ .Values.global.redisCache.port }} - ttl: "PT10M" - # Optional. Default is 0. - db: 1 - - # Mongodb connection details - responseCache: - # By default password is picked from MongoDB POD if not supplied through Helm values. - mongoURL: "mongodb://{{ .Values.global.responseCacheMongo.username }}:{{ if .Values.global.responseCacheMongo.password }}{{ .Values.global.responseCacheMongo.password }}{{ else }}{{ include "getSecretValue" (dict "secretName" "mongodb" "namespace" "bap-common-services" "key" "mongodb-root-password") }}{{ end }}@{{ .Values.global.responseCacheMongo.host }}:{{ .Values.global.responseCacheMongo.port }}/{{ .Values.global.responseCacheMongo.dbname }}?authSource=admin" - ttl: "PT10M" - - # Priority order will be - # 1. Synchronous - # 2. webhook - # 3. pubSub - - client: - synchronous: - # By default password is picked from MongoDB POD if not supplied through Helm values. - mongoURL: "mongodb://{{ .Values.global.responseCacheMongo.username }}:{{ if .Values.global.responseCacheMongo.password }}{{ .Values.global.responseCacheMongo.password }}{{ else }}{{ include "getSecretValue" (dict "secretName" "mongodb" "namespace" "bap-common-services" "key" "mongodb-root-password") }}{{ end }}@{{ .Values.global.responseCacheMongo.host }}:{{ .Values.global.responseCacheMongo.port }}/{{ .Values.global.responseCacheMongo.dbname }}?authSource=admin" - - # Only required for BPP - # webhook: - # url: "https://beckn.free.beeceptor.com/clientURL" - - app: - # Supported mode - bap and bpp - mode: {{ .Values.app.mode }} - - # Two types of gateway mode present - client and network - gateway: - mode: {{ .Values.app.gateway.mode }} - inboxQueue: "inbox" - outboxQueue: "outbox" - - # RabbitMQ connection details - # By default password is picked from RabbitMQ POD if not supplied through Helm values. - amqpURL: "amqp://{{ .Values.global.rabbitMQamqp.username }}:{{ if .Values.global.rabbitMQamqp.password }}{{ .Values.global.rabbitMQamqp.password }}{{ else }}{{ include "getSecretValue" (dict "secretName" "rabbitmq" "namespace" "bap-common-services" "key" "rabbitmq-password") }}{{ end }}@{{ .Values.global.rabbitMQamqp.host }}:{{ .Values.global.rabbitMQamqp.port }}" - - - # Mandatory. - actions: - requests: - search: - ttl : "PT15S" - init: - ttl : "PT10S" - select: - ttl : "PT10S" - confirm: - ttl : "PT10S" - status: - ttl : "PT10S" - track: - ttl : "PT10S" - cancel: - ttl : "PT10S" - update: - ttl : "PT10S" - rating: - ttl : "PT10S" - support: - ttl : "PT10S" - get_cancellation_reasons: - ttl : "PT10S" - get_rating_categories: - ttl : "PT10S" - cancellation: - ttl : "PT10S" - - responses: - on_search: - ttl: "PT15S" - on_init: - ttl: "PT10S" - on_select: - ttl: "PT10S" - on_confirm: - ttl: "PT10S" - on_status: - ttl: "PT10S" - on_track: - ttl: "PT10S" - on_cancel: - ttl: "PT10S" - on_update: - ttl: "PT10S" - on_rating: - ttl: "PT10S" - on_support: - ttl: "PT10S" - cancellation_reasons: - ttl: "PT10S" - rating_categories: - ttl: "PT10S" - - # Mandatory keys - privateKey: {{ .Values.global.bap.privateKey }} - publicKey: {{ .Values.global.bap.publicKey }} - - # Subscriber details - subscriberId: "{{ .Values.global.subscriber_id | default .Values.global.externalDomain }}" - subscriberUri: "https://{{ .Values.global.externalDomain }}" - - # Registry - registryUrl: "{{ .Values.global.registry_url }}/subscribers" - auth: false - # BAP client key ID - uniqueKey: "{{ .Values.global.externalDomain }}.k1" - - # Mandatory - city: "std:080" - country: "IND" - - # Mandatory - ttl: "PT10M" - - # Mandatory - httpTimeout: "PT3S" - httpRetryCount: 2 - telemetry: - enabled: false - url: "" - batchSize: 100 - # In minutes - syncInterval: 30 - redis_db: 3 - - useLayer2Config: true - mandateLayer2Config: true \ No newline at end of file diff --git a/aws-cdk/helm/beckn-onix-bap/charts/bap-network/templates/deployment.yaml b/aws-cdk/helm/beckn-onix-bap/charts/bap-network/templates/deployment.yaml deleted file mode 100644 index 4593d4b..0000000 --- a/aws-cdk/helm/beckn-onix-bap/charts/bap-network/templates/deployment.yaml +++ /dev/null @@ -1,80 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "common.name" . }} - namespace: {{ .Values.global.namespace }} - labels: - {{- include "common.labels" . | nindent 4 }} -spec: - {{- if not .Values.autoscaling.enabled }} - replicas: {{ .Values.replicaCount }} - {{- end }} - selector: - matchLabels: - {{- include "common.selectorLabels" . | nindent 6 }} - template: - metadata: - annotations: - {{- with .Values.podAnnotations }} - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - {{- include "common.labels" . | nindent 8 }} - {{- with .Values.podLabels }} - {{- toYaml . | nindent 8 }} - {{- end }} - spec: - {{- with .Values.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - serviceAccountName: {{ include "common.serviceAccountName" . }} - securityContext: - {{- toYaml .Values.podSecurityContext | nindent 8 }} - initContainers: - - name: retain-schemas-content-ebs-volume - image: {{ .Values.global.image.repository }} - imagePullPolicy: {{ .Values.global.image.pullPolicy }} - command: ['sh', '-c', 'cp -r /usr/src/app/schemas/* /mnt/schemas/'] - volumeMounts: - - name: bap-schemas-efs-volume - mountPath: /mnt/schemas - containers: - - name: {{ .Chart.Name }} - image: {{ .Values.global.image.repository }} - imagePullPolicy: {{ .Values.global.image.pullPolicy }} - ports: - - name: bap-net-port - containerPort: {{ .Values.service.port }} - protocol: TCP - {{- if .Values.livenessProbe }} - livenessProbe: - {{- toYaml .Values.livenessProbe | nindent 12 }} - {{- end }} - {{- if .Values.readinessProbe }} - readinessProbe: - {{- toYaml .Values.readinessProbe | nindent 12 }} - {{- end }} - resources: - {{- toYaml .Values.resources | nindent 12 }} - volumeMounts: - - name: bap-network-config - mountPath: "/usr/src/app/config/default.yaml" - subPath: default.yaml - readOnly: true - # EFS volumes for L2 schemas - - name: bap-schemas-efs-volume - mountPath: /usr/src/app/schemas - # EBS volumes for logs - - name: bap-network-logs-ebs-volume - mountPath: /usr/src/app/logs - volumes: - - name: bap-network-config - configMap: - name: {{ include "common.name" . }}-config - - name: bap-schemas-efs-volume - persistentVolumeClaim: - claimName: beckn-onix-bap-efs-pvc - - name: bap-network-logs-ebs-volume - persistentVolumeClaim: - claimName: {{ include "common.name" . }}-logs-pvc \ No newline at end of file diff --git a/aws-cdk/helm/beckn-onix-bap/charts/bap-network/templates/ingress.yaml b/aws-cdk/helm/beckn-onix-bap/charts/bap-network/templates/ingress.yaml deleted file mode 100644 index e829e17..0000000 --- a/aws-cdk/helm/beckn-onix-bap/charts/bap-network/templates/ingress.yaml +++ /dev/null @@ -1,31 +0,0 @@ -{{- if .Values.global.ingress.enabled }} -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: {{ include "common.name" . }}-ingress - namespace: {{ .Values.global.namespace }} - labels: - {{- include "common.labels" . | nindent 4 }} - annotations: - alb.ingress.kubernetes.io/scheme: internet-facing - alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]' - alb.ingress.kubernetes.io/ssl-policy: ELBSecurityPolicy-TLS-1-1-2017-01 - alb.ingress.kubernetes.io/certificate-arn: {{ .Values.global.ingress.tls.certificateArn | quote }} - alb.ingress.kubernetes.io/ssl-redirect: '443' - alb.ingress.kubernetes.io/load-balancer-name: beckn-onix-bap-network - alb.ingress.kubernetes.io/target-group-attributes: stickiness.enabled=true,stickiness.lb_cookie.duration_seconds=300 - alb.ingress.kubernetes.io/target-type: ip - alb.ingress.kubernetes.io/success-codes: 200,302 -spec: - ingressClassName: alb - rules: - - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: {{ include "common.name" . }}-svc - port: - number: {{ .Values.service.port }} -{{- end }} \ No newline at end of file diff --git a/aws-cdk/helm/beckn-onix-bap/charts/bap-network/templates/logs-pvc.yaml b/aws-cdk/helm/beckn-onix-bap/charts/bap-network/templates/logs-pvc.yaml deleted file mode 100644 index 9cdb6f2..0000000 --- a/aws-cdk/helm/beckn-onix-bap/charts/bap-network/templates/logs-pvc.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: {{ include "common.name" . }}-logs-pvc - namespace: {{ .Values.global.namespace }} -spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 5Gi - storageClassName: gp2 diff --git a/aws-cdk/helm/beckn-onix-bap/charts/bap-network/templates/service.yaml b/aws-cdk/helm/beckn-onix-bap/charts/bap-network/templates/service.yaml deleted file mode 100644 index 3bcccf4..0000000 --- a/aws-cdk/helm/beckn-onix-bap/charts/bap-network/templates/service.yaml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ include "common.name" . }}-svc - namespace: {{ .Values.global.namespace }} - labels: - {{- include "common.labels" . | nindent 4 }} -spec: - type: {{ .Values.service.type }} - ports: - - port: {{ .Values.service.port }} - targetPort: bap-net-port - protocol: TCP - name: http - selector: - {{- include "common.selectorLabels" . | nindent 4 }} diff --git a/aws-cdk/helm/beckn-onix-bap/charts/bap-network/values.yaml b/aws-cdk/helm/beckn-onix-bap/charts/bap-network/values.yaml deleted file mode 100644 index 351951f..0000000 --- a/aws-cdk/helm/beckn-onix-bap/charts/bap-network/values.yaml +++ /dev/null @@ -1,64 +0,0 @@ -replicaCount: 1 - -service: - type: ClusterIP - port: 5001 - -# Supported app mode - bap or bpp. Gateway mode to be either client or network. -app: - mode: bap - gateway: - mode: network - -resources: - # Adjust it as per desired POD resource demand - requests: - cpu: "0.5" - memory: "1Gi" - limits: - cpu: "0.5" - memory: "1Gi" - -livenessProbe: {} - # httpGet: - # path: / - # port: http -readinessProbe: {} - # httpGet: - # path: / - # port: http - -# To configure HPA -autoscaling: - enabled: false - minReplicas: 1 - maxReplicas: 2 - targetCPUUtilizationPercentage: 80 - # targetMemoryUtilizationPercentage: 80 - -serviceAccount: - # Specifies whether a service account should be created - create: false - # Automatically mount a ServiceAccount's API credentials? - automount: true - # Annotations to add to the service account - annotations: {} - # The name of the service account to use. - # If not set and create is true, a name is generated using the fullname template - name: "" - -podAnnotations: {} -podLabels: {} - -podSecurityContext: {} - # fsGroup: 2000 - -securityContext: {} - # capabilities: - # drop: - # - ALL - # readOnlyRootFilesystem: true - # runAsNonRoot: true - # runAsUser: 1000 - - diff --git a/aws-cdk/helm/beckn-onix-bap/package-lock.json b/aws-cdk/helm/beckn-onix-bap/package-lock.json deleted file mode 100644 index 776de63..0000000 --- a/aws-cdk/helm/beckn-onix-bap/package-lock.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "beckn-onix-bap", - "lockfileVersion": 3, - "requires": true, - "packages": {} -} diff --git a/aws-cdk/helm/beckn-onix-bap/templates/efs-pvc.yaml b/aws-cdk/helm/beckn-onix-bap/templates/efs-pvc.yaml deleted file mode 100644 index b1f3b80..0000000 --- a/aws-cdk/helm/beckn-onix-bap/templates/efs-pvc.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: beckn-onix-bap-efs-pvc - namespace: {{ .Values.global.namespace }} -spec: - accessModes: - - ReadWriteMany - storageClassName: {{ include "common.name" . }}-efs-storageclass - resources: - requests: - storage: 5Gi \ No newline at end of file diff --git a/aws-cdk/helm/beckn-onix-bap/templates/efs-storage-class.yaml b/aws-cdk/helm/beckn-onix-bap/templates/efs-storage-class.yaml deleted file mode 100644 index 8d78bb7..0000000 --- a/aws-cdk/helm/beckn-onix-bap/templates/efs-storage-class.yaml +++ /dev/null @@ -1,9 +0,0 @@ -kind: StorageClass -apiVersion: storage.k8s.io/v1 -metadata: - name: {{ include "common.name" . }}-efs-storageclass -provisioner: efs.csi.aws.com -parameters: - provisioningMode: efs-ap - fileSystemId: {{ .Values.global.efs.fileSystemId }} - directoryPerms: "755" diff --git a/aws-cdk/helm/beckn-onix-bap/templates/namespace.yaml b/aws-cdk/helm/beckn-onix-bap/templates/namespace.yaml deleted file mode 100644 index 0bd7be4..0000000 --- a/aws-cdk/helm/beckn-onix-bap/templates/namespace.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: {{ .Values.global.namespace }} - labels: - {{- include "common.labels" . | nindent 4 }} diff --git a/aws-cdk/helm/beckn-onix-bap/templates/secret.yaml b/aws-cdk/helm/beckn-onix-bap/templates/secret.yaml deleted file mode 100644 index beba8c1..0000000 --- a/aws-cdk/helm/beckn-onix-bap/templates/secret.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - name: beckn-onix-bap-secret - namespace: {{ .Values.global.namespace }} -type: Opaque -data: - privateKey: {{ .Values.global.bap.publicKey | b64enc | quote }} - publicKey: {{ .Values.global.bap.privateKey | b64enc | quote }} diff --git a/aws-cdk/helm/beckn-onix-bap/values.schema.json b/aws-cdk/helm/beckn-onix-bap/values.schema.json deleted file mode 100644 index ecbaec5..0000000 --- a/aws-cdk/helm/beckn-onix-bap/values.schema.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "properties": { - "global": { - "type": "object", - "properties": { - "externalDomain": { - "type": "string", - "description": "The external domain for the BAP network." - }, - "registry_url": { - "type": "string", - "description": "The URL for the registry." - }, - "ingress": { - "type": "object", - "properties": { - "tls": { - "type": "object", - "properties": { - "certificateArn": { - "type": "string", - "description": "The ARN of the TLS certificate for ingress." - } - }, - "required": ["certificateArn"], - "description": "TLS configuration for ingress." - } - }, - "required": ["tls"], - "description": "Ingress-related configuration." - }, - "efs": { - "type": "object", - "properties": { - "fileSystemId": { - "type": "string", - "description": "The EFS FileSystem ID." - } - }, - "required": ["fileSystemId"], - "description": "EFS-related configuration." - }, - "bap": { - "type": "object", - "properties": { - "privateKey": { - "type": "string", - "description": "The private key for BAP." - }, - "publicKey": { - "type": "string", - "description": "The public key for BAP." - } - }, - "required": ["privateKey", "publicKey"], - "description": "Keys for BAP, including both private and public keys." - } - }, - "required": [ - "externalDomain", - "registry_url", - "ingress", - "efs", - "bap" - ] - } - } -} diff --git a/aws-cdk/helm/beckn-onix-bap/values.yaml b/aws-cdk/helm/beckn-onix-bap/values.yaml deleted file mode 100644 index 1701ea4..0000000 --- a/aws-cdk/helm/beckn-onix-bap/values.yaml +++ /dev/null @@ -1,63 +0,0 @@ -# Default values for registry. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -global: - namespace: beckn-onix-bap - image: - repository: fidedocker/protocol-server - pullPolicy: IfNotPresent - # Overrides the image tag whose default is the chart appVersion. - # tag: "" - -# Redis connection details - redisCache: - host: redis-master.bap-common-services.svc.cluster.local - port: 6379 - -# Mongodb connection details - responseCacheMongo: - host: mongodb.bap-common-services.svc.cluster.local - port: 27017 - dbname: protocol_server - username: root - password: - -# RabbitMQ connection details - rabbitMQamqp: - host: rabbitmq.bap-common-services.svc.cluster.local - port: 5672 - username: beckn - password: - -# Ingress definition for AWS Application Loadbalancer. -# This is required for each component available over the public network. - ingress: - enabled: true # If enabled, ALB will be provisioned as per ingress.yaml. Without ingress service will be scoped to K8s cluster. - tls: - # SSL certificate location from AWS Certificate Manager - https://aws.amazon.com/certificate-manager/ - certificateArn: - sslRedirect: true # Set to true to enable SSL redirection, useful for UI redirection. - - # Must be set while installing Helm chart - externalDomain: - registry_url: - bpp: - privateKey: - publicKey: - efs: - fileSystemId: - -# BPP subscribe_id. Default to externalDomain value. - subscriber_id: - - imagePullSecrets: [] - nameOverride: "" - fullnameOverride: "" - - nodeSelector: {} - - tolerations: [] - - affinity: {} - \ No newline at end of file diff --git a/aws-cdk/helm/beckn-onix-bpp/Chart.yaml b/aws-cdk/helm/beckn-onix-bpp/Chart.yaml deleted file mode 100644 index 0d125d1..0000000 --- a/aws-cdk/helm/beckn-onix-bpp/Chart.yaml +++ /dev/null @@ -1,24 +0,0 @@ -apiVersion: v2 -name: beckn-onix-bpp -description: Beckn ONIX BPP Helm chart for Kubernetes - -# A chart can be either an 'application' or a 'library' chart. -# -# Application charts are a collection of templates that can be packaged into versioned archives -# to be deployed. -# -# Library charts provide useful utilities or functions for the chart developer. They're included as -# a dependency of application charts to inject those utilities and functions into the rendering -# pipeline. Library charts do not define any templates and therefore cannot be deployed. -type: application - -# This is the chart version. This version number should be incremented each time you make changes -# to the chart and its templates, including the app version. -# Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.1.0 - -# This is the version number of the application being deployed. This version number should be -# incremented each time you make changes to the application. Versions are not expected to -# follow Semantic Versioning. They should reflect the version the application is using. -# It is recommended to use it with quotes. -appVersion: "1.0.0" diff --git a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/Chart.yaml b/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/Chart.yaml deleted file mode 100644 index 476cbe1..0000000 --- a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/Chart.yaml +++ /dev/null @@ -1,24 +0,0 @@ -apiVersion: v2 -name: bpp-client -description: BPP Client Helm chart for Kubernetes - -# A chart can be either an 'application' or a 'library' chart. -# -# Application charts are a collection of templates that can be packaged into versioned archives -# to be deployed. -# -# Library charts provide useful utilities or functions for the chart developer. They're included as -# a dependency of application charts to inject those utilities and functions into the rendering -# pipeline. Library charts do not define any templates and therefore cannot be deployed. -type: application - -# This is the chart version. This version number should be incremented each time you make changes -# to the chart and its templates, including the app version. -# Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.1.0 - -# This is the version number of the application being deployed. This version number should be -# incremented each time you make changes to the application. Versions are not expected to -# follow Semantic Versioning. They should reflect the version the application is using. -# It is recommended to use it with quotes. -appVersion: "1.0.0" diff --git a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/templates/NOTES.txt b/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/templates/NOTES.txt deleted file mode 100644 index b97f572..0000000 --- a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/templates/NOTES.txt +++ /dev/null @@ -1,11 +0,0 @@ -{{ "\n" }} -Get the Beckn-ONIX BPP Client (Protocol Server) URL by running these commands: -{{ "\n" }} -{{- if .Values.global.ingress.enabled }} - export INGRESS_HOST=$(kubectl get ingress {{ include "common.name" . }}-ingress -n {{ .Values.namespace }} -o jsonpath="{.status.loadBalancer.ingress[0].hostname}") - {{- if .Values.global.ingress.tls.enabled }} - echo "https://$INGRESS_HOST" - {{- else }} - echo "http://$INGRESS_HOST" - {{- end }} -{{- end }} diff --git a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/templates/_helpers.tpl b/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/templates/_helpers.tpl deleted file mode 100644 index a60a2c5..0000000 --- a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/templates/_helpers.tpl +++ /dev/null @@ -1,75 +0,0 @@ -{{/* -Expand the name of the chart or use a provided override. -*/}} -{{- define "common.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name, with truncation to 63 characters. -*/}} -{{- define "common.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Generate a chart name and version label. -*/}} -{{- define "common.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels to be used in all charts. -*/}} -{{- define "common.labels" -}} -helm.sh/chart: {{ include "common.chart" . }} -{{ include "common.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -app.kubernetes.io/release: {{ .Release.Revision | quote }} -{{- end }} - -{{/* -Common selector labels. -*/}} -{{- define "common.selectorLabels" -}} -app.kubernetes.io/name: {{ include "common.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Helper for creating service account names. -*/}} -{{- define "common.serviceAccountName" -}} -{{- if .Values.serviceAccount.create }} -{{- default (include "common.fullname" .) .Values.serviceAccount.name }} -{{- else }} -{{- default "default" .Values.serviceAccount.name }} -{{- end }} -{{- end }} - -{{/* -Helper for image names and tags. -*/}} -{{- define "common.image" -}} -{{ printf "%s:%s" .Values.image.repository .Values.image.tag }} -{{- end }} - -{{/* -Helper for constructing resource names with prefixes or suffixes. -*/}} -{{- define "common.resourceName" -}} -{{- printf "%s-%s" (include "common.fullname" .) .Values.suffix | trunc 63 | trimSuffix "-" }} -{{- end }} diff --git a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/templates/configmap.yaml b/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/templates/configmap.yaml deleted file mode 100644 index f35864d..0000000 --- a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/templates/configmap.yaml +++ /dev/null @@ -1,135 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "common.name" . }}-config - namespace: {{ .Values.global.namespace }} -data: - default.yaml: | - # Mandatory - server: - port: {{ .Values.service.port }} - - # Redis connection details - cache: - host: {{ .Values.global.redisCache.host }} - port: {{ .Values.global.redisCache.port }} - ttl: "PT10M" - # Optional. Default is 0. - db: 1 - - # Mongodb connection details - responseCache: - # By default password is picked from MongoDB POD if not supplied through Helm values. - mongoURL: "mongodb://{{ .Values.global.responseCacheMongo.username }}:{{ if .Values.global.responseCacheMongo.password }}{{ .Values.global.responseCacheMongo.password }}{{ else }}{{ include "getSecretValue" (dict "secretName" "mongodb" "namespace" "bpp-common-services" "key" "mongodb-root-password") }}{{ end }}@{{ .Values.global.responseCacheMongo.host }}:{{ .Values.global.responseCacheMongo.port }}/{{ .Values.global.responseCacheMongo.dbname }}?authSource=admin" - ttl: "PT10M" - - # synchronous only required for BPP - client: - # Only required for BPP - webhook: - url: "http://sandbox.beckn-onix-aws-cdk.becknprotocol.io" - - # Supported mode - bap and bpp - app: - mode: {{ .Values.app.mode }} - - # Two types of gateway mode present - client and network - gateway: - mode: {{ .Values.app.gateway.mode }} - inboxQueue: "inbox-bpp" - outboxQueue: "outbox-bpp" - - # RabbitMQ connection details - # By default password is picked from RabbitMQ POD if not supplied through Helm values. - amqpURL: "amqp://{{ .Values.global.rabbitMQamqp.username }}:{{ if .Values.global.rabbitMQamqp.password }}{{ .Values.global.rabbitMQamqp.password }}{{ else }}{{ include "getSecretValue" (dict "secretName" "rabbitmq" "namespace" "bpp-common-services" "key" "rabbitmq-password") }}{{ end }}@{{ .Values.global.rabbitMQamqp.host }}:{{ .Values.global.rabbitMQamqp.port }}" - - # Mandatory. - actions: - requests: - search: - ttl : "PT15S" - init: - ttl : "PT10S" - select: - ttl : "PT10S" - confirm: - ttl : "PT10S" - status: - ttl : "PT10S" - track: - ttl : "PT10S" - cancel: - ttl : "PT10S" - update: - ttl : "PT10S" - rating: - ttl : "PT10S" - support: - ttl : "PT10S" - get_cancellation_reasons: - ttl : "PT10S" - get_rating_categories: - ttl : "PT10S" - cancellation: - ttl : "PT10S" - - responses: - on_search: - ttl: "PT15S" - on_init: - ttl: "PT10S" - on_select: - ttl: "PT10S" - on_confirm: - ttl: "PT10S" - on_status: - ttl: "PT10S" - on_track: - ttl: "PT10S" - on_cancel: - ttl: "PT10S" - on_update: - ttl: "PT10S" - on_rating: - ttl: "PT10S" - on_support: - ttl: "PT10S" - cancellation_reasons: - ttl: "PT10S" - rating_categories: - ttl: "PT10S" - - # Mandatory keys - privateKey: {{ .Values.global.bpp.privateKey }} - publicKey: {{ .Values.global.bpp.publicKey }} - - # Subscriber details - subscriberId: "{{ .Values.global.subscriber_id | default .Values.global.externalDomain }}" - subscriberUri: "https://{{ .Values.global.externalDomain }}" - - # Registry - registryUrl: "{{ .Values.global.registry_url }}/subscribers" - auth: false - # BPP client key ID - uniqueKey: "{{ .Values.global.externalDomain }}.k1" - - # Mandatory - city: "std:080" - country: "IND" - - # Mandatory - ttl: "PT10M" - - # Mandatory - httpTimeout: "PT3S" - httpRetryCount: 2 - telemetry: - enabled: false - url: "" - batchSize: 100 - # In minutes - syncInterval: 30 - redis_db: 3 - - useLayer2Config: true - mandateLayer2Config: true \ No newline at end of file diff --git a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/templates/deployment.yaml b/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/templates/deployment.yaml deleted file mode 100644 index 1cf608e..0000000 --- a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/templates/deployment.yaml +++ /dev/null @@ -1,74 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "common.name" . }} - namespace: {{ .Values.global.namespace }} - labels: - {{- include "common.labels" . | nindent 4 }} -spec: - {{- if not .Values.autoscaling.enabled }} - replicas: {{ .Values.replicaCount }} - {{- end }} - strategy: - type: Recreate - selector: - matchLabels: - {{- include "common.selectorLabels" . | nindent 6 }} - template: - metadata: - annotations: - {{- with .Values.podAnnotations }} - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - {{- include "common.labels" . | nindent 8 }} - {{- with .Values.podLabels }} - {{- toYaml . | nindent 8 }} - {{- end }} - spec: - {{- with .Values.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - serviceAccountName: {{ include "common.serviceAccountName" . }} - securityContext: - {{- toYaml .Values.podSecurityContext | nindent 8 }} - containers: - - name: {{ .Chart.Name }} - image: {{ .Values.global.image.repository }} - imagePullPolicy: {{ .Values.global.image.pullPolicy }} - ports: - - name: bpp-client-port - containerPort: {{ .Values.service.port }} - protocol: TCP - {{- if .Values.livenessProbe }} - livenessProbe: - {{- toYaml .Values.livenessProbe | nindent 12 }} - {{- end }} - {{- if .Values.readinessProbe }} - readinessProbe: - {{- toYaml .Values.readinessProbe | nindent 12 }} - {{- end }} - resources: - {{- toYaml .Values.resources | nindent 12 }} - volumeMounts: - - name: bpp-client-config - mountPath: "/usr/src/app/config/default.yaml" - subPath: default.yaml - readOnly: true - # EFS volumes for L2 schemas - - name: bpp-schemas-efs-volume - mountPath: /usr/src/app/schemas - # EBS volumes for logs - - name: bpp-client-logs-ebs-volume - mountPath: /usr/src/app/logs - volumes: - - name: bpp-client-config - configMap: - name: {{ include "common.name" . }}-config - - name: bpp-schemas-efs-volume - persistentVolumeClaim: - claimName: beckn-onix-bpp-efs-pvc - - name: bpp-client-logs-ebs-volume - persistentVolumeClaim: - claimName: {{ include "common.name" . }}-logs-pvc \ No newline at end of file diff --git a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/templates/ingress.yaml b/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/templates/ingress.yaml deleted file mode 100644 index 5b0be7c..0000000 --- a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/templates/ingress.yaml +++ /dev/null @@ -1,31 +0,0 @@ -{{- if .Values.global.ingress.enabled }} -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: {{ include "common.name" . }}-ingress - namespace: {{ .Values.global.namespace }} - labels: - {{- include "common.labels" . | nindent 4 }} - annotations: - alb.ingress.kubernetes.io/scheme: internet-facing - alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]' - alb.ingress.kubernetes.io/ssl-policy: ELBSecurityPolicy-TLS-1-1-2017-01 - alb.ingress.kubernetes.io/certificate-arn: {{ .Values.global.ingress.tls.certificateArn | quote }} - alb.ingress.kubernetes.io/ssl-redirect: '443' - alb.ingress.kubernetes.io/load-balancer-name: beckn-onix-bpp-client - alb.ingress.kubernetes.io/target-group-attributes: stickiness.enabled=true,stickiness.lb_cookie.duration_seconds=300 - alb.ingress.kubernetes.io/target-type: ip - alb.ingress.kubernetes.io/success-codes: 200,302 -spec: - ingressClassName: alb - rules: - - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: {{ include "common.name" . }}-svc - port: - number: {{ .Values.service.port }} -{{- end }} \ No newline at end of file diff --git a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/templates/logs-pvc.yaml b/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/templates/logs-pvc.yaml deleted file mode 100644 index 9cdb6f2..0000000 --- a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/templates/logs-pvc.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: {{ include "common.name" . }}-logs-pvc - namespace: {{ .Values.global.namespace }} -spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 5Gi - storageClassName: gp2 diff --git a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/templates/service.yaml b/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/templates/service.yaml deleted file mode 100644 index f25d5ba..0000000 --- a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/templates/service.yaml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ include "common.name" . }}-svc - namespace: {{ .Values.global.namespace }} - labels: - {{- include "common.labels" . | nindent 4 }} -spec: - type: {{ .Values.service.type }} - ports: - - port: {{ .Values.service.port }} - targetPort: bpp-client-port - protocol: TCP - name: http - selector: - {{- include "common.selectorLabels" . | nindent 4 }} diff --git a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/templates/serviceaccount.yaml b/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/templates/serviceaccount.yaml deleted file mode 100644 index e569d78..0000000 --- a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/templates/serviceaccount.yaml +++ /dev/null @@ -1,14 +0,0 @@ -{{- if .Values.serviceAccount.create -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ include "common.serviceAccountName" . }} - namespace: {{ .Values.global.namespace }} - labels: - {{- include "common.labels" . | nindent 4 }} - {{- with .Values.serviceAccount.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -automountServiceAccountToken: {{ .Values.serviceAccount.automount }} -{{- end }} diff --git a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/values.yaml b/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/values.yaml deleted file mode 100644 index f04095e..0000000 --- a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-client/values.yaml +++ /dev/null @@ -1,72 +0,0 @@ -# Default values for registry. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -replicaCount: 1 - -service: - type: ClusterIP - port: 6002 - -# Supported app mode - bap or bpp. Gateway mode to be either client or network. -app: - mode: bpp - gateway: - mode: client - -resources: - # Adjust it as per desired POD resource demand - requests: - cpu: "0.5" - memory: "1Gi" - limits: - cpu: "0.5" - memory: "1Gi" - -livenessProbe: {} - # httpGet: - # path: / - # port: http -readinessProbe: {} - # httpGet: - # path: / - # port: http - -# To configure HPA -autoscaling: - enabled: false - minReplicas: 1 - maxReplicas: 2 - targetCPUUtilizationPercentage: 80 - # targetMemoryUtilizationPercentage: 80 - -serviceAccount: - # Specifies whether a service account should be created - create: false - # Automatically mount a ServiceAccount's API credentials? - automount: true - # Annotations to add to the service account - annotations: {} - # The name of the service account to use. - # If not set and create is true, a name is generated using the fullname template - name: "" - -podAnnotations: {} -podLabels: {} - -podSecurityContext: {} - # fsGroup: 2000 - -securityContext: {} - # capabilities: - # drop: - # - ALL - # readOnlyRootFilesystem: true - # runAsNonRoot: true - # runAsUser: 1000 - -nodeSelector: {} - -tolerations: [] - -affinity: {} \ No newline at end of file diff --git a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/Chart.yaml b/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/Chart.yaml deleted file mode 100644 index 398c4c2..0000000 --- a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/Chart.yaml +++ /dev/null @@ -1,24 +0,0 @@ -apiVersion: v2 -name: bpp-network -description: BPP Network Helm chart for Kubernetes - -# A chart can be either an 'application' or a 'library' chart. -# -# Application charts are a collection of templates that can be packaged into versioned archives -# to be deployed. -# -# Library charts provide useful utilities or functions for the chart developer. They're included as -# a dependency of application charts to inject those utilities and functions into the rendering -# pipeline. Library charts do not define any templates and therefore cannot be deployed. -type: application - -# This is the chart version. This version number should be incremented each time you make changes -# to the chart and its templates, including the app version. -# Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.1.0 - -# This is the version number of the application being deployed. This version number should be -# incremented each time you make changes to the application. Versions are not expected to -# follow Semantic Versioning. They should reflect the version the application is using. -# It is recommended to use it with quotes. -appVersion: "1.0.0" diff --git a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/templates/NOTES.txt b/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/templates/NOTES.txt deleted file mode 100644 index a2ccd65..0000000 --- a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/templates/NOTES.txt +++ /dev/null @@ -1,11 +0,0 @@ -{{ "\n" }} -Get the Beckn-ONIX BPP Network (Protocol Server) URL by running these commands: -{{ "\n" }} -{{- if .Values.global.ingress.enabled }} - export INGRESS_HOST=$(kubectl get ingress {{ include "common.name" . }}-ingress -n {{ .Values.namespace }} -o jsonpath="{.status.loadBalancer.ingress[0].hostname}") - {{- if .Values.global.ingress.tls.enabled }} - echo "https://$INGRESS_HOST" - {{- else }} - echo "http://$INGRESS_HOST" - {{- end }} -{{- end }} diff --git a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/templates/_helpers.tpl b/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/templates/_helpers.tpl deleted file mode 100644 index 50cc6b7..0000000 --- a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/templates/_helpers.tpl +++ /dev/null @@ -1,95 +0,0 @@ -{{/* -Expand the name of the chart or use a provided override. -*/}} -{{- define "common.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name, with truncation to 63 characters. -*/}} -{{- define "common.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Generate a chart name and version label. -*/}} -{{- define "common.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels to be used in all charts. -*/}} -{{- define "common.labels" -}} -helm.sh/chart: {{ include "common.chart" . }} -{{ include "common.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -app.kubernetes.io/release: {{ .Release.Revision | quote }} -{{- end }} - -{{/* -Common selector labels. -*/}} -{{- define "common.selectorLabels" -}} -app.kubernetes.io/name: {{ include "common.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Helper for creating service account names. -*/}} -{{- define "common.serviceAccountName" -}} -{{- if .Values.serviceAccount.create }} -{{- default (include "common.fullname" .) .Values.serviceAccount.name }} -{{- else }} -{{- default "default" .Values.serviceAccount.name }} -{{- end }} -{{- end }} - -{{/* -Helper for image names and tags. -*/}} -{{- define "common.image" -}} -{{ printf "%s:%s" .Values.image.repository .Values.image.tag }} -{{- end }} - -{{/* -Helper for constructing resource names with prefixes or suffixes. -*/}} -{{- define "common.resourceName" -}} -{{- printf "%s-%s" (include "common.fullname" .) .Values.suffix | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{- define "getSecretValue" -}} -{{- $secretName := .secretName -}} -{{- $namespace := .namespace -}} -{{- $key := .key -}} -{{- $secret := (lookup "v1" "Secret" $namespace $secretName) -}} -{{- if $secret -}} -{{- $data := $secret.data -}} -{{- if $data -}} -{{- $value := index $data $key | b64dec -}} -{{- $value -}} -{{- else -}} -{{- printf "Error: Secret data for %s not found" $key -}} -{{- end -}} -{{- else -}} -{{- printf "Error: Secret %s not found in namespace %s" $secretName $namespace -}} -{{- end -}} -{{- end -}} - - diff --git a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/templates/configmap.yaml b/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/templates/configmap.yaml deleted file mode 100644 index 3fb2cfa..0000000 --- a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/templates/configmap.yaml +++ /dev/null @@ -1,135 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "common.name" . }}-config - namespace: {{ .Values.global.namespace }} -data: - default.yaml: | - # Mandatory - server: - port: {{ .Values.service.port }} - - # Redis connection details - cache: - host: {{ .Values.global.redisCache.host }} - port: {{ .Values.global.redisCache.port }} - ttl: "PT10M" - # Optional. Default is 0. - db: 1 - - # Mongodb connection details - responseCache: - # By default password is picked from MongoDB POD if not supplied through Helm values. - mongoURL: "mongodb://{{ .Values.global.responseCacheMongo.username }}:{{ if .Values.global.responseCacheMongo.password }}{{ .Values.global.responseCacheMongo.password }}{{ else }}{{ include "getSecretValue" (dict "secretName" "mongodb" "namespace" "bpp-common-services" "key" "mongodb-root-password") }}{{ end }}@{{ .Values.global.responseCacheMongo.host }}:{{ .Values.global.responseCacheMongo.port }}/{{ .Values.global.responseCacheMongo.dbname }}?authSource=admin" - ttl: "PT10M" - - - client: - # Only required for BPP - webhook: - url: "http://sandbox.beckn-onix-aws-cdk.becknprotocol.io" - - # Supported mode - bap and bpp - app: - mode: {{ .Values.app.mode }} - - # Two types of gateway mode present - client and network - gateway: - mode: {{ .Values.app.gateway.mode }} - inboxQueue: "inbox-bpp" - outboxQueue: "outbox-bpp" - - # RabbitMQ connection details - # By default password is picked from RabbitMQ POD if not supplied through Helm values. - amqpURL: "amqp://{{ .Values.global.rabbitMQamqp.username }}:{{ if .Values.global.rabbitMQamqp.password }}{{ .Values.global.rabbitMQamqp.password }}{{ else }}{{ include "getSecretValue" (dict "secretName" "rabbitmq" "namespace" "bpp-common-services" "key" "rabbitmq-password") }}{{ end }}@{{ .Values.global.rabbitMQamqp.host }}:{{ .Values.global.rabbitMQamqp.port }}" - - # Mandatory. - actions: - requests: - search: - ttl : "PT15S" - init: - ttl : "PT10S" - select: - ttl : "PT10S" - confirm: - ttl : "PT10S" - status: - ttl : "PT10S" - track: - ttl : "PT10S" - cancel: - ttl : "PT10S" - update: - ttl : "PT10S" - rating: - ttl : "PT10S" - support: - ttl : "PT10S" - get_cancellation_reasons: - ttl : "PT10S" - get_rating_categories: - ttl : "PT10S" - cancellation: - ttl : "PT10S" - - responses: - on_search: - ttl: "PT15S" - on_init: - ttl: "PT10S" - on_select: - ttl: "PT10S" - on_confirm: - ttl: "PT10S" - on_status: - ttl: "PT10S" - on_track: - ttl: "PT10S" - on_cancel: - ttl: "PT10S" - on_update: - ttl: "PT10S" - on_rating: - ttl: "PT10S" - on_support: - ttl: "PT10S" - cancellation_reasons: - ttl: "PT10S" - rating_categories: - ttl: "PT10S" - - # Mandatory keys - privateKey: {{ .Values.global.bpp.privateKey }} - publicKey: {{ .Values.global.bpp.publicKey }} - - # Subscriber details - subscriberId: "{{ .Values.global.subscriber_id | default .Values.global.externalDomain }}" - subscriberUri: "https://{{ .Values.global.externalDomain }}" - - # Registry - registryUrl: "{{ .Values.global.registry_url }}/subscribers" - auth: false - # BPP client key ID - uniqueKey: "{{ .Values.global.externalDomain }}.k1" - - # Mandatory - city: "std:080" - country: "IND" - - # Mandatory - ttl: "PT10M" - - # Mandatory - httpTimeout: "PT3S" - httpRetryCount: 2 - telemetry: - enabled: false - url: "" - batchSize: 100 - # In minutes - syncInterval: 30 - redis_db: 3 - - useLayer2Config: true - mandateLayer2Config: true \ No newline at end of file diff --git a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/templates/deployment.yaml b/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/templates/deployment.yaml deleted file mode 100644 index d8affe3..0000000 --- a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/templates/deployment.yaml +++ /dev/null @@ -1,82 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "common.name" . }} - namespace: {{ .Values.global.namespace }} - labels: - {{- include "common.labels" . | nindent 4 }} -spec: - {{- if not .Values.autoscaling.enabled }} - replicas: {{ .Values.replicaCount }} - strategy: - type: Recreate - {{- end }} - selector: - matchLabels: - {{- include "common.selectorLabels" . | nindent 6 }} - template: - metadata: - annotations: - {{- with .Values.podAnnotations }} - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - {{- include "common.labels" . | nindent 8 }} - {{- with .Values.podLabels }} - {{- toYaml . | nindent 8 }} - {{- end }} - spec: - {{- with .Values.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - serviceAccountName: {{ include "common.serviceAccountName" . }} - securityContext: - {{- toYaml .Values.podSecurityContext | nindent 8 }} - initContainers: - - name: retain-schemas-content-ebs-volume - image: {{ .Values.global.image.repository }} - imagePullPolicy: {{ .Values.global.image.pullPolicy }} - command: ['sh', '-c', 'cp -r /usr/src/app/schemas/* /mnt/schemas/'] - volumeMounts: - - name: bpp-schemas-efs-volume - mountPath: /mnt/schemas - containers: - - name: {{ .Chart.Name }} - image: {{ .Values.global.image.repository }} - imagePullPolicy: {{ .Values.global.image.pullPolicy }} - ports: - - name: bpp-net-port - containerPort: {{ .Values.service.port }} - protocol: TCP - {{- if .Values.livenessProbe }} - livenessProbe: - {{- toYaml .Values.livenessProbe | nindent 12 }} - {{- end }} - {{- if .Values.readinessProbe }} - readinessProbe: - {{- toYaml .Values.readinessProbe | nindent 12 }} - {{- end }} - resources: - {{- toYaml .Values.resources | nindent 12 }} - volumeMounts: - - name: bpp-network-config - mountPath: "/usr/src/app/config/default.yaml" - subPath: default.yaml - readOnly: true - # EFS volumes for L2 schemas - - name: bpp-schemas-efs-volume - mountPath: /usr/src/app/schemas - # EBS volumes for logs - - name: bpp-network-logs-ebs-volume - mountPath: /usr/src/app/logs - volumes: - - name: bpp-network-config - configMap: - name: {{ include "common.name" . }}-config - - name: bpp-schemas-efs-volume - persistentVolumeClaim: - claimName: beckn-onix-bpp-efs-pvc - - name: bpp-network-logs-ebs-volume - persistentVolumeClaim: - claimName: {{ include "common.name" . }}-logs-pvc \ No newline at end of file diff --git a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/templates/ingress.yaml b/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/templates/ingress.yaml deleted file mode 100644 index f322109..0000000 --- a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/templates/ingress.yaml +++ /dev/null @@ -1,31 +0,0 @@ -{{- if .Values.global.ingress.enabled }} -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: {{ include "common.name" . }}-ingress - namespace: {{ .Values.global.namespace }} - labels: - {{- include "common.labels" . | nindent 4 }} - annotations: - alb.ingress.kubernetes.io/scheme: internet-facing - alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]' - alb.ingress.kubernetes.io/ssl-policy: ELBSecurityPolicy-TLS-1-1-2017-01 - alb.ingress.kubernetes.io/certificate-arn: {{ .Values.global.ingress.tls.certificateArn | quote }} - alb.ingress.kubernetes.io/ssl-redirect: '443' - alb.ingress.kubernetes.io/load-balancer-name: beckn-onix-bpp-network - alb.ingress.kubernetes.io/target-group-attributes: stickiness.enabled=true,stickiness.lb_cookie.duration_seconds=300 - alb.ingress.kubernetes.io/target-type: ip - alb.ingress.kubernetes.io/success-codes: 200,302 -spec: - ingressClassName: alb - rules: - - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: {{ include "common.name" . }}-svc - port: - number: {{ .Values.service.port }} -{{- end }} \ No newline at end of file diff --git a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/templates/logs-pvc.yaml b/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/templates/logs-pvc.yaml deleted file mode 100644 index 9cdb6f2..0000000 --- a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/templates/logs-pvc.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: {{ include "common.name" . }}-logs-pvc - namespace: {{ .Values.global.namespace }} -spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 5Gi - storageClassName: gp2 diff --git a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/templates/service.yaml b/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/templates/service.yaml deleted file mode 100644 index abb6b08..0000000 --- a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/templates/service.yaml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ include "common.name" . }}-svc - namespace: {{ .Values.global.namespace }} - labels: - {{- include "common.labels" . | nindent 4 }} -spec: - type: {{ .Values.service.type }} - ports: - - port: {{ .Values.service.port }} - targetPort: bpp-net-port - protocol: TCP - name: http - selector: - {{- include "common.selectorLabels" . | nindent 4 }} diff --git a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/templates/serviceaccount.yaml b/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/templates/serviceaccount.yaml deleted file mode 100644 index e569d78..0000000 --- a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/templates/serviceaccount.yaml +++ /dev/null @@ -1,14 +0,0 @@ -{{- if .Values.serviceAccount.create -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ include "common.serviceAccountName" . }} - namespace: {{ .Values.global.namespace }} - labels: - {{- include "common.labels" . | nindent 4 }} - {{- with .Values.serviceAccount.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -automountServiceAccountToken: {{ .Values.serviceAccount.automount }} -{{- end }} diff --git a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/values.yaml b/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/values.yaml deleted file mode 100644 index a379360..0000000 --- a/aws-cdk/helm/beckn-onix-bpp/charts/bpp-network/values.yaml +++ /dev/null @@ -1,65 +0,0 @@ -replicaCount: 1 - -service: - type: ClusterIP - port: 6001 - -# Supported app mode - bap or bpp. Gateway mode to be either client or network. -app: - mode: bpp - gateway: - mode: network - -resources: - # Adjust it as per desired POD resource demand - requests: - cpu: "0.5" - memory: "1Gi" - limits: - cpu: "0.5" - memory: "1Gi" - -livenessProbe: {} - # httpGet: - # path: / - # port: http -readinessProbe: {} - # httpGet: - # path: / - # port: http - -# To configure HPA -autoscaling: - enabled: false - minReplicas: 1 - maxReplicas: 2 - targetCPUUtilizationPercentage: 80 - # targetMemoryUtilizationPercentage: 80 - -serviceAccount: - # Specifies whether a service account should be created - create: false - # Automatically mount a ServiceAccount's API credentials? - automount: true - # Annotations to add to the service account - annotations: {} - # The name of the service account to use. - # If not set and create is true, a name is generated using the fullname template - name: "" - -podAnnotations: {} -podLabels: {} - -podSecurityContext: {} - # fsGroup: 2000 - -securityContext: {} - # capabilities: - # drop: - # - ALL - # readOnlyRootFilesystem: true - # runAsNonRoot: true - # runAsUser: 1000 - -# Default to externalDomain value -subscriber_id: diff --git a/aws-cdk/helm/beckn-onix-bpp/templates/efs-pvc.yaml b/aws-cdk/helm/beckn-onix-bpp/templates/efs-pvc.yaml deleted file mode 100644 index 30b38bc..0000000 --- a/aws-cdk/helm/beckn-onix-bpp/templates/efs-pvc.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: beckn-onix-bpp-efs-pvc - namespace: {{ .Values.global.namespace }} -spec: - accessModes: - - ReadWriteMany - storageClassName: {{ include "common.name" . }}-efs-storageclass - resources: - requests: - storage: 5Gi \ No newline at end of file diff --git a/aws-cdk/helm/beckn-onix-bpp/templates/efs-storage-class.yaml b/aws-cdk/helm/beckn-onix-bpp/templates/efs-storage-class.yaml deleted file mode 100644 index 8d78bb7..0000000 --- a/aws-cdk/helm/beckn-onix-bpp/templates/efs-storage-class.yaml +++ /dev/null @@ -1,9 +0,0 @@ -kind: StorageClass -apiVersion: storage.k8s.io/v1 -metadata: - name: {{ include "common.name" . }}-efs-storageclass -provisioner: efs.csi.aws.com -parameters: - provisioningMode: efs-ap - fileSystemId: {{ .Values.global.efs.fileSystemId }} - directoryPerms: "755" diff --git a/aws-cdk/helm/beckn-onix-bpp/templates/namespace.yaml b/aws-cdk/helm/beckn-onix-bpp/templates/namespace.yaml deleted file mode 100644 index 0bd7be4..0000000 --- a/aws-cdk/helm/beckn-onix-bpp/templates/namespace.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: {{ .Values.global.namespace }} - labels: - {{- include "common.labels" . | nindent 4 }} diff --git a/aws-cdk/helm/beckn-onix-bpp/templates/secret.yaml b/aws-cdk/helm/beckn-onix-bpp/templates/secret.yaml deleted file mode 100644 index 73dbb0e..0000000 --- a/aws-cdk/helm/beckn-onix-bpp/templates/secret.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - name: beckn-onix-bpp-secret - namespace: {{ .Values.global.namespace }} -type: Opaque -data: - privateKey: {{ .Values.global.bpp.publicKey | b64enc | quote }} - publicKey: {{ .Values.global.bpp.privateKey | b64enc | quote }} diff --git a/aws-cdk/helm/beckn-onix-bpp/values.schema.json b/aws-cdk/helm/beckn-onix-bpp/values.schema.json deleted file mode 100644 index f3da319..0000000 --- a/aws-cdk/helm/beckn-onix-bpp/values.schema.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "properties": { - "global": { - "type": "object", - "properties": { - "externalDomain": { - "type": "string", - "description": "The external domain for the BPP network." - }, - "registry_url": { - "type": "string", - "description": "The URL for the registry." - }, - "ingress": { - "type": "object", - "properties": { - "tls": { - "type": "object", - "properties": { - "certificateArn": { - "type": "string", - "description": "The ARN of the TLS certificate for ingress." - } - }, - "required": ["certificateArn"], - "description": "TLS configuration for ingress." - } - }, - "required": ["tls"], - "description": "Ingress-related configuration." - }, - "efs": { - "type": "object", - "properties": { - "fileSystemId": { - "type": "string", - "description": "The EFS FileSystem ID." - } - }, - "required": ["fileSystemId"], - "description": "EFS-related configuration." - }, - "bpp": { - "type": "object", - "properties": { - "privateKey": { - "type": "string", - "description": "The private key for BPP." - }, - "publicKey": { - "type": "string", - "description": "The public key for BPP." - } - }, - "required": ["privateKey", "publicKey"], - "description": "Keys for BPP, including both private and public keys." - } - }, - "required": [ - "externalDomain", - "registry_url", - "ingress", - "efs", - "bpp" - ] - } - } -} diff --git a/aws-cdk/helm/beckn-onix-bpp/values.yaml b/aws-cdk/helm/beckn-onix-bpp/values.yaml deleted file mode 100644 index 7342644..0000000 --- a/aws-cdk/helm/beckn-onix-bpp/values.yaml +++ /dev/null @@ -1,63 +0,0 @@ -# Default values for registry. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -global: - namespace: beckn-onix-bpp - image: - repository: fidedocker/protocol-server - pullPolicy: IfNotPresent - # Overrides the image tag whose default is the chart appVersion. - # tag: "" - -# Redis connection details - redisCache: - host: redis-master.bpp-common-services.svc.cluster.local - port: 6379 - -# Mongodb connection details - responseCacheMongo: - host: mongodb.bpp-common-services.svc.cluster.local - port: 27017 - dbname: protocol_server - username: root - password: - -# RabbitMQ connection details - rabbitMQamqp: - host: rabbitmq.bpp-common-services.svc.cluster.local - port: 5672 - username: beckn - password: - -# Ingress definition for AWS Application Loadbalancer. -# This is required for each component available over the public network. - ingress: - enabled: true # If enabled, ALB will be provisioned as per ingress.yaml. Without ingress service will be scoped to K8s cluster. - tls: - # Must be set while installing Helm chart. SSL certificate ARN (e.g. arn:aws:acm:region:account-id:certificate/certificate-id) from AWS Certificate Manager - https://aws.amazon.com/certificate-manager/ - certificateArn: - sslRedirect: true # Set to true to enable SSL redirection, useful for UI redirection. - -# Must be set while installing Helm chart - externalDomain: - registry_url: - bpp: - privateKey: - publicKey: - efs: - fileSystemId: - -# BPP subscribe_id. Default to externalDomain value. - subscriber_id: - - imagePullSecrets: [] - nameOverride: "" - fullnameOverride: "" - - nodeSelector: {} - - tolerations: [] - - affinity: {} - diff --git a/aws-cdk/helm/gateway/Chart.yaml b/aws-cdk/helm/gateway/Chart.yaml deleted file mode 100644 index fd703c3..0000000 --- a/aws-cdk/helm/gateway/Chart.yaml +++ /dev/null @@ -1,24 +0,0 @@ -apiVersion: v2 -name: beckn-onix-gateway -description: Beckn ONIX Gateway Helm chart for Kubernetes - -# A chart can be either an 'application' or a 'library' chart. -# -# Application charts are a collection of templates that can be packaged into versioned archives -# to be deployed. -# -# Library charts provide useful utilities or functions for the chart developer. They're included as -# a dependency of application charts to inject those utilities and functions into the rendering -# pipeline. Library charts do not define any templates and therefore cannot be deployed. -type: application - -# This is the chart version. This version number should be incremented each time you make changes -# to the chart and its templates, including the app version. -# Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.1.0 - -# This is the version number of the application being deployed. This version number should be -# incremented each time you make changes to the application. Versions are not expected to -# follow Semantic Versioning. They should reflect the version the application is using. -# It is recommended to use it with quotes. -appVersion: "1.0.0" diff --git a/aws-cdk/helm/gateway/templates/NOTES.txt b/aws-cdk/helm/gateway/templates/NOTES.txt deleted file mode 100644 index 56f3403..0000000 --- a/aws-cdk/helm/gateway/templates/NOTES.txt +++ /dev/null @@ -1,9 +0,0 @@ -Get the Beckn-ONIX Gateway URL by running these commands: -{{- if .Values.ingress.enabled }} - export INGRESS_HOST=$(kubectl get ingress {{ include "common.name" . }}-ingress -n {{ .Values.namespace }} -o jsonpath="{.status.loadBalancer.ingress[0].hostname}"){{ "\n" }} - {{- if .Values.ingress.tls.enabled }} - echo "https://$INGRESS_HOST"{{ "\n" }} - {{- else }} - echo "http://$INGRESS_HOST"{{ "\n" }} - {{- end }} -{{- end }} diff --git a/aws-cdk/helm/gateway/templates/_helpers.tpl b/aws-cdk/helm/gateway/templates/_helpers.tpl deleted file mode 100644 index a60a2c5..0000000 --- a/aws-cdk/helm/gateway/templates/_helpers.tpl +++ /dev/null @@ -1,75 +0,0 @@ -{{/* -Expand the name of the chart or use a provided override. -*/}} -{{- define "common.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name, with truncation to 63 characters. -*/}} -{{- define "common.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Generate a chart name and version label. -*/}} -{{- define "common.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels to be used in all charts. -*/}} -{{- define "common.labels" -}} -helm.sh/chart: {{ include "common.chart" . }} -{{ include "common.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -app.kubernetes.io/release: {{ .Release.Revision | quote }} -{{- end }} - -{{/* -Common selector labels. -*/}} -{{- define "common.selectorLabels" -}} -app.kubernetes.io/name: {{ include "common.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Helper for creating service account names. -*/}} -{{- define "common.serviceAccountName" -}} -{{- if .Values.serviceAccount.create }} -{{- default (include "common.fullname" .) .Values.serviceAccount.name }} -{{- else }} -{{- default "default" .Values.serviceAccount.name }} -{{- end }} -{{- end }} - -{{/* -Helper for image names and tags. -*/}} -{{- define "common.image" -}} -{{ printf "%s:%s" .Values.image.repository .Values.image.tag }} -{{- end }} - -{{/* -Helper for constructing resource names with prefixes or suffixes. -*/}} -{{- define "common.resourceName" -}} -{{- printf "%s-%s" (include "common.fullname" .) .Values.suffix | trunc 63 | trimSuffix "-" }} -{{- end }} diff --git a/aws-cdk/helm/gateway/templates/configmap-gtw-onixjson.yaml b/aws-cdk/helm/gateway/templates/configmap-gtw-onixjson.yaml deleted file mode 100644 index 7e0e240..0000000 --- a/aws-cdk/helm/gateway/templates/configmap-gtw-onixjson.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "common.name" . }}-onixjson-config - namespace: {{ .Values.namespace }} -data: - onix.json: | - { - "core_version": "1.1.0", - "registry_id": "{{ .Values.registry_url | default "localhost" | replace "http://" "" | replace "https://" "" }}..LREG", - "search_provider_id": "{{ .Values.externalDomain }}", - "self_registration_supported": true, - "subscription_needed_post_registration": true, - "base_url": "{{ .Values.registry_url | default "localhost" }}", - "registry_url": "{{ .Values.registry_url | default "localhost" }}/subscribers", - "extension_package": "in.succinct.beckn.boc", - "wild_card": "" - } diff --git a/aws-cdk/helm/gateway/templates/configmap-swf-properties.yaml b/aws-cdk/helm/gateway/templates/configmap-swf-properties.yaml deleted file mode 100644 index f289340..0000000 --- a/aws-cdk/helm/gateway/templates/configmap-swf-properties.yaml +++ /dev/null @@ -1,34 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "common.name" . }}-config - namespace: {{ .Values.namespace }} -data: - swf.properties: | - swf.load.complete.config.tables.if.count.less.than=500 - swf.user.password.encrypted=false - swf.plugins.background.core.workers.numThreads=3 - swf.application.authentication.required=false - swf.application.requires.registration=true - swf.host={{ .Values.externalDomain }} - swf.external.port=443 - swf.external.scheme=https - swf.jdbc.dbschema=public - swf.jdbc.dbschema.setonconnection=true - swf.jdbc.set.dbschema.command=set search_path to 'public' - swf.jdbc.url=jdbc:postgresql://{{ .Values.database.host }}/{{ .Values.database.dbname }} - swf.jdbc.driver=org.postgresql.Driver - swf.jdbc.userid={{ .Values.database.username }} - swf.jdbc.password={{ .Values.database.password }} - swf.jdbc.readOnly=false - swf.api.keys.case=SNAKE - swf.api.root.required=false - swf.encryption.support=false - swf.ftl.dir=src/main/resources/templates - beckn.auth.enabled=true - in.succinct.beckn.gateway.subscriber_id={{ .Values.externalDomain }} - in.succinct.beckn.gateway.public_key_id={{ .Values.externalDomain }}.k1 - in.succinct.onet.country.iso.3=IND - in.succinct.onet.country.iso.2=IN - in.succinct.onet.name=onix - diff --git a/aws-cdk/helm/gateway/templates/deployment.yaml b/aws-cdk/helm/gateway/templates/deployment.yaml deleted file mode 100644 index 5f31f92..0000000 --- a/aws-cdk/helm/gateway/templates/deployment.yaml +++ /dev/null @@ -1,70 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "common.name" . }} - namespace: {{ .Values.namespace }} - labels: - {{- include "common.labels" . | nindent 4 }} -spec: - {{- if not .Values.autoscaling.enabled }} - replicas: {{ .Values.replicaCount }} - {{- end }} - selector: - matchLabels: - {{- include "common.selectorLabels" . | nindent 6 }} - template: - metadata: - annotations: - {{- with .Values.podAnnotations }} - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - {{- include "common.labels" . | nindent 8 }} - {{- with .Values.podLabels }} - {{- toYaml . | nindent 8 }} - {{- end }} - spec: - {{- with .Values.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - serviceAccountName: {{ include "common.serviceAccountName" . }} - securityContext: - {{- toYaml .Values.podSecurityContext | nindent 8 }} - containers: - - name: {{ .Chart.Name }} - image: {{ .Values.image.repository }} - imagePullPolicy: {{ .Values.image.pullPolicy }} - ports: - - name: gateway-port - containerPort: {{ .Values.service.port }} - protocol: TCP - - name: sec-gtw-port - containerPort: {{ .Values.service.secondaryPort }} - protocol: TCP - {{- if .Values.livenessProbe }} - livenessProbe: - {{- toYaml .Values.livenessProbe | nindent 12 }} - {{- end }} - {{- if .Values.readinessProbe }} - readinessProbe: - {{- toYaml .Values.readinessProbe | nindent 12 }} - {{- end }} - resources: - {{- toYaml .Values.resources | nindent 12 }} - volumeMounts: - - name: gateway-config - mountPath: "/gateway/overrideProperties/config/swf.properties" - subPath: swf.properties - readOnly: true - - name: onixjson-config - mountPath: "/gateway/overrideProperties/config/networks/onix.json" - subPath: onix.json - readOnly: true - volumes: - - name: gateway-config - configMap: - name: {{ include "common.name" . }}-config - - name: onixjson-config - configMap: - name: {{ include "common.name" . }}-onixjson-config diff --git a/aws-cdk/helm/gateway/templates/ingress.yaml b/aws-cdk/helm/gateway/templates/ingress.yaml deleted file mode 100644 index 0139943..0000000 --- a/aws-cdk/helm/gateway/templates/ingress.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{- if .Values.ingress.enabled }} -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: {{ include "common.name" . }}-ingress - namespace: {{ .Values.namespace }} - labels: - {{- include "common.labels" . | nindent 4 }} - annotations: - alb.ingress.kubernetes.io/scheme: internet-facing - alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]' - alb.ingress.kubernetes.io/ssl-policy: ELBSecurityPolicy-TLS-1-1-2017-01 - alb.ingress.kubernetes.io/certificate-arn: {{ .Values.ingress.tls.certificateArn | quote }} - alb.ingress.kubernetes.io/ssl-redirect: '443' - alb.ingress.kubernetes.io/group.name: beckn-onix-gateway - alb.ingress.kubernetes.io/load-balancer-name: beckn-onix-gateway - alb.ingress.kubernetes.io/target-group-attributes: stickiness.enabled=true,stickiness.lb_cookie.duration_seconds=300 - alb.ingress.kubernetes.io/target-type: ip - alb.ingress.kubernetes.io/success-codes: 200,302 -spec: - ingressClassName: alb - rules: - - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: {{ include "common.name" . }}-svc - port: - number: {{ .Values.service.port }} -{{- end }} \ No newline at end of file diff --git a/aws-cdk/helm/gateway/templates/namespace.yaml b/aws-cdk/helm/gateway/templates/namespace.yaml deleted file mode 100644 index 33da23c..0000000 --- a/aws-cdk/helm/gateway/templates/namespace.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: {{ .Values.namespace }} - labels: - {{- include "common.labels" . | nindent 4 }} diff --git a/aws-cdk/helm/gateway/templates/service.yaml b/aws-cdk/helm/gateway/templates/service.yaml deleted file mode 100644 index 13428b9..0000000 --- a/aws-cdk/helm/gateway/templates/service.yaml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ include "common.name" . }}-svc - namespace: {{ .Values.namespace }} - labels: - {{- include "common.labels" . | nindent 4 }} -spec: - type: {{ .Values.service.type }} - ports: - - port: {{ .Values.service.port }} - targetPort: gateway-port - protocol: TCP - name: http - selector: - {{- include "common.selectorLabels" . | nindent 4 }} diff --git a/aws-cdk/helm/gateway/templates/serviceaccount.yaml b/aws-cdk/helm/gateway/templates/serviceaccount.yaml deleted file mode 100644 index 8a647e8..0000000 --- a/aws-cdk/helm/gateway/templates/serviceaccount.yaml +++ /dev/null @@ -1,14 +0,0 @@ -{{- if .Values.serviceAccount.create -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ include "registry.serviceAccountName" . }} - namespace: {{- toYaml .Values.namespace | nindent 2 }} - labels: - {{- include "registry.labels" . | nindent 4 }} - {{- with .Values.serviceAccount.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -automountServiceAccountToken: {{ .Values.serviceAccount.automount }} -{{- end }} diff --git a/aws-cdk/helm/gateway/values.schema.json b/aws-cdk/helm/gateway/values.schema.json deleted file mode 100644 index f9dee8d..0000000 --- a/aws-cdk/helm/gateway/values.schema.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "properties": { - "externalDomain": { - "type": "string", - "description": "The external domain for the gateway." - }, - "registry_url": { - "type": "string", - "description": "The URL of the registry." - }, - "database": { - "type": "object", - "properties": { - "host": { - "type": "string", - "description": "The hostname of the RDS PostgreSQL database." - }, - "password": { - "type": "string", - "description": "The password for the RDS PostgreSQL database." - } - }, - "required": ["host", "password"], - "description": "Database configuration for the gateway." - }, - "ingress": { - "type": "object", - "properties": { - "tls": { - "type": "object", - "properties": { - "certificateArn": { - "type": "string", - "description": "The ARN of the TLS certificate for ingress." - } - }, - "required": ["certificateArn"], - "description": "TLS configuration for ingress." - } - }, - "required": ["tls"], - "description": "Ingress-related configuration." - } - }, - "required": [ - "externalDomain", - "registry_url", - "database", - "ingress" - ] -} diff --git a/aws-cdk/helm/gateway/values.yaml b/aws-cdk/helm/gateway/values.yaml deleted file mode 100644 index 0a3c410..0000000 --- a/aws-cdk/helm/gateway/values.yaml +++ /dev/null @@ -1,101 +0,0 @@ -# Default values for registry. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -replicaCount: 1 -namespace: beckn-onix-gateway - -image: - repository: fidedocker/gateway - pullPolicy: IfNotPresent - # Overrides the image tag whose default is the chart appVersion. - # tag: "" - -imagePullSecrets: [] -nameOverride: "" -fullnameOverride: "" - -serviceAccount: - # Specifies whether a service account should be created - create: false - # Automatically mount a ServiceAccount's API credentials? - automount: true - # Annotations to add to the service account - annotations: {} - # The name of the service account to use. - # If not set and create is true, a name is generated using the fullname template - name: "" - -podAnnotations: {} -podLabels: {} - -podSecurityContext: {} - # fsGroup: 2000 - -securityContext: {} - # capabilities: - # drop: - # - ALL - # readOnlyRootFilesystem: true - # runAsNonRoot: true - # runAsUser: 1000 - -service: - type: ClusterIP - port: 4030 - secondaryPort: 4000 - -# Ingress definition for AWS Application Loadbalancer -ingress: - enabled: true # If enabled, HTTP port 80 listener is open on AWS ALB. Set to false to disable Ingress. Without ingress service will be scoped to K8s cluster. - tls: - enabled: false # Set to true to enable TLS with Aamzon Certificate Manager (ACM) - certificateArn: arn:aws:acm:ap-south-1:365975017663:certificate/04d1ef71-8407-495b-82f0-4eded8694189 # SSL certificate location if tls is enabled - sslRedirect: true # Set to true to enable SSL redirection - -resources: - # We usually recommend not to specify default resources and to leave this as a conscious - # choice for the user. This also increases chances charts run on environments with little - # resources, such as Minikube. If you do want to specify resources, uncomment the following - # lines, adjust them as necessary, and remove the curly braces after 'resources:'. - requests: - cpu: "0.5" - memory: "1Gi" - limits: - cpu: "1" - memory: "2Gi" - -livenessProbe: {} - # httpGet: - # path: / - # port: http -readinessProbe: {} - # httpGet: - # path: / - # port: http - -autoscaling: - enabled: false - minReplicas: 1 - maxReplicas: 2 - targetCPUUtilizationPercentage: 80 - # targetMemoryUtilizationPercentage: 80 - -# Gateway AWS RDS Postgres connection details -database: - host: - dbname: gateway - username: postgres - password: - -registry_url: - -nodeSelector: {} - -tolerations: [] - -affinity: {} - -# Gateway external domain/sub-domain value. Supply the actual value during Helm install "--set externalDomain=" -externalDomain: - diff --git a/aws-cdk/helm/index.yaml b/aws-cdk/helm/index.yaml deleted file mode 100644 index 742f8e2..0000000 --- a/aws-cdk/helm/index.yaml +++ /dev/null @@ -1,3 +0,0 @@ -apiVersion: v1 -entries: {} -generated: "2024-09-19T18:47:38.402391+05:30" diff --git a/aws-cdk/helm/registry/Chart.yaml b/aws-cdk/helm/registry/Chart.yaml deleted file mode 100644 index 6152368..0000000 --- a/aws-cdk/helm/registry/Chart.yaml +++ /dev/null @@ -1,24 +0,0 @@ -apiVersion: v2 -name: beckn-onix-registry -description: Beckn ONIX Registry Helm chart for Kubernetes - -# A chart can be either an 'application' or a 'library' chart. -# -# Application charts are a collection of templates that can be packaged into versioned archives -# to be deployed. -# -# Library charts provide useful utilities or functions for the chart developer. They're included as -# a dependency of application charts to inject those utilities and functions into the rendering -# pipeline. Library charts do not define any templates and therefore cannot be deployed. -type: application - -# This is the chart version. This version number should be incremented each time you make changes -# to the chart and its templates, including the app version. -# Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.1.0 - -# This is the version number of the application being deployed. This version number should be -# incremented each time you make changes to the application. Versions are not expected to -# follow Semantic Versioning. They should reflect the version the application is using. -# It is recommended to use it with quotes. -appVersion: "1.0.0" diff --git a/aws-cdk/helm/registry/templates/NOTES.txt b/aws-cdk/helm/registry/templates/NOTES.txt deleted file mode 100644 index fce4cbd..0000000 --- a/aws-cdk/helm/registry/templates/NOTES.txt +++ /dev/null @@ -1,11 +0,0 @@ -{{ "\n" }} -Get the Beckn-ONIX Registry URL by running these commands: -{{ "\n" }} -{{- if .Values.ingress.enabled }} - export INGRESS_HOST=$(kubectl get ingress {{ include "common.name" . }}-ingress -n {{ .Values.namespace }} -o jsonpath="{.status.loadBalancer.ingress[0].hostname}") - {{- if .Values.ingress.tls.enabled }} - echo "https://$INGRESS_HOST" - {{- else }} - echo "http://$INGRESS_HOST" - {{- end }} -{{- end }} diff --git a/aws-cdk/helm/registry/templates/_helpers.tpl b/aws-cdk/helm/registry/templates/_helpers.tpl deleted file mode 100644 index a60a2c5..0000000 --- a/aws-cdk/helm/registry/templates/_helpers.tpl +++ /dev/null @@ -1,75 +0,0 @@ -{{/* -Expand the name of the chart or use a provided override. -*/}} -{{- define "common.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name, with truncation to 63 characters. -*/}} -{{- define "common.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Generate a chart name and version label. -*/}} -{{- define "common.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels to be used in all charts. -*/}} -{{- define "common.labels" -}} -helm.sh/chart: {{ include "common.chart" . }} -{{ include "common.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -app.kubernetes.io/release: {{ .Release.Revision | quote }} -{{- end }} - -{{/* -Common selector labels. -*/}} -{{- define "common.selectorLabels" -}} -app.kubernetes.io/name: {{ include "common.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Helper for creating service account names. -*/}} -{{- define "common.serviceAccountName" -}} -{{- if .Values.serviceAccount.create }} -{{- default (include "common.fullname" .) .Values.serviceAccount.name }} -{{- else }} -{{- default "default" .Values.serviceAccount.name }} -{{- end }} -{{- end }} - -{{/* -Helper for image names and tags. -*/}} -{{- define "common.image" -}} -{{ printf "%s:%s" .Values.image.repository .Values.image.tag }} -{{- end }} - -{{/* -Helper for constructing resource names with prefixes or suffixes. -*/}} -{{- define "common.resourceName" -}} -{{- printf "%s-%s" (include "common.fullname" .) .Values.suffix | trunc 63 | trimSuffix "-" }} -{{- end }} diff --git a/aws-cdk/helm/registry/templates/configmap-swf-properties.yaml b/aws-cdk/helm/registry/templates/configmap-swf-properties.yaml deleted file mode 100644 index 2ceec9a..0000000 --- a/aws-cdk/helm/registry/templates/configmap-swf-properties.yaml +++ /dev/null @@ -1,27 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "common.name" . }}-config - namespace: {{ .Values.namespace }} -data: - swf.properties: | - swf.load.complete.config.tables.if.count.less.than=500 - swf.user.password.encrypted=false - swf.plugins.background.core.workers.numThreads=3 - swf.application.authentication.required=false - swf.application.requires.registration=true - swf.host={{ .Values.externalDomain }} - swf.external.port=443 - swf.external.scheme=https - swf.jdbc.dbschema=public - swf.jdbc.dbschema.setonconnection=true - swf.jdbc.set.dbschema.command=set search_path to 'public' - swf.jdbc.url=jdbc:postgresql://{{ .Values.database.host }}/{{ .Values.database.dbname }} - swf.jdbc.driver=org.postgresql.Driver - swf.jdbc.userid={{ .Values.database.username }} - swf.jdbc.password={{ .Values.database.password }} - swf.jdbc.readOnly=false - swf.api.keys.case=SNAKE - swf.api.root.required=false - swf.encryption.support=false - swf.ftl.dir=src/main/resources/templates \ No newline at end of file diff --git a/aws-cdk/helm/registry/templates/deployment.yaml b/aws-cdk/helm/registry/templates/deployment.yaml deleted file mode 100644 index 73588ce..0000000 --- a/aws-cdk/helm/registry/templates/deployment.yaml +++ /dev/null @@ -1,63 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "common.name" . }} - namespace: {{ .Values.namespace }} - labels: - {{- include "common.labels" . | nindent 4 }} -spec: - {{- if not .Values.autoscaling.enabled }} - replicas: {{ .Values.replicaCount }} - {{- end }} - selector: - matchLabels: - {{- include "common.selectorLabels" . | nindent 6 }} - template: - metadata: - annotations: - {{- with .Values.podAnnotations }} - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - {{- include "common.labels" . | nindent 8 }} - {{- with .Values.podLabels }} - {{- toYaml . | nindent 8 }} - {{- end }} - spec: - {{- with .Values.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - serviceAccountName: {{ include "common.serviceAccountName" . }} - securityContext: - {{- toYaml .Values.podSecurityContext | nindent 8 }} - containers: - - name: {{ .Chart.Name }} - image: {{ .Values.image.repository }} - imagePullPolicy: {{ .Values.image.pullPolicy }} - ports: - - name: registry-port - containerPort: {{ .Values.service.port }} - protocol: TCP - - name: sec-reg-port - containerPort: {{ .Values.service.secondaryPort }} - protocol: TCP - {{- if .Values.livenessProbe }} - livenessProbe: - {{- toYaml .Values.livenessProbe | nindent 12 }} - {{- end }} - {{- if .Values.readinessProbe }} - readinessProbe: - {{- toYaml .Values.readinessProbe | nindent 12 }} - {{- end }} - resources: - {{- toYaml .Values.resources | nindent 12 }} - volumeMounts: - - name: registry-config - mountPath: "/registry/overrideProperties/config/swf.properties" - subPath: swf.properties - readOnly: true - volumes: - - name: registry-config - configMap: - name: {{ include "common.name" . }}-config \ No newline at end of file diff --git a/aws-cdk/helm/registry/templates/ingress.yaml b/aws-cdk/helm/registry/templates/ingress.yaml deleted file mode 100644 index 3ce2da6..0000000 --- a/aws-cdk/helm/registry/templates/ingress.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{- if .Values.ingress.enabled }} -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: {{ include "common.name" . }}-ingress - namespace: {{ .Values.namespace }} - labels: - {{- include "common.labels" . | nindent 4 }} - annotations: - alb.ingress.kubernetes.io/scheme: internet-facing - alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]' - alb.ingress.kubernetes.io/ssl-policy: ELBSecurityPolicy-TLS-1-1-2017-01 - alb.ingress.kubernetes.io/certificate-arn: {{ .Values.ingress.tls.certificateArn | quote }} - alb.ingress.kubernetes.io/ssl-redirect: '443' - alb.ingress.kubernetes.io/group.name: beckn-onix-registry - alb.ingress.kubernetes.io/load-balancer-name: beckn-onix-registry - alb.ingress.kubernetes.io/target-group-attributes: stickiness.enabled=true,stickiness.lb_cookie.duration_seconds=300 - alb.ingress.kubernetes.io/target-type: ip - alb.ingress.kubernetes.io/success-codes: 200,302 -spec: - ingressClassName: alb - rules: - - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: {{ include "common.name" . }}-svc - port: - number: {{ .Values.service.port }} -{{- end }} \ No newline at end of file diff --git a/aws-cdk/helm/registry/templates/namespace.yaml b/aws-cdk/helm/registry/templates/namespace.yaml deleted file mode 100644 index 33da23c..0000000 --- a/aws-cdk/helm/registry/templates/namespace.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: {{ .Values.namespace }} - labels: - {{- include "common.labels" . | nindent 4 }} diff --git a/aws-cdk/helm/registry/templates/service.yaml b/aws-cdk/helm/registry/templates/service.yaml deleted file mode 100644 index fd0e1c9..0000000 --- a/aws-cdk/helm/registry/templates/service.yaml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ include "common.name" . }}-svc - namespace: {{ .Values.namespace }} - labels: - {{- include "common.labels" . | nindent 4 }} -spec: - type: {{ .Values.service.type }} - ports: - - port: {{ .Values.service.port }} - targetPort: registry-port - protocol: TCP - name: http - selector: - {{- include "common.selectorLabels" . | nindent 4 }} diff --git a/aws-cdk/helm/registry/templates/serviceaccount.yaml b/aws-cdk/helm/registry/templates/serviceaccount.yaml deleted file mode 100644 index e16d161..0000000 --- a/aws-cdk/helm/registry/templates/serviceaccount.yaml +++ /dev/null @@ -1,14 +0,0 @@ -{{- if .Values.serviceAccount.create -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ include "common.serviceAccountName" . }} - namespace: {{ .Values.namespace }} - labels: - {{- include "common.labels" . | nindent 4 }} - {{- with .Values.serviceAccount.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -automountServiceAccountToken: {{ .Values.serviceAccount.automount }} -{{- end }} diff --git a/aws-cdk/helm/registry/values.schema.json b/aws-cdk/helm/registry/values.schema.json deleted file mode 100644 index 51416ce..0000000 --- a/aws-cdk/helm/registry/values.schema.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "properties": { - "externalDomain": { - "type": "string", - "description": "The external domain for the registry." - }, - "database": { - "type": "object", - "properties": { - "host": { - "type": "string", - "description": "The hostname of the RDS PostgreSQL database." - }, - "password": { - "type": "string", - "description": "The password for the RDS PostgreSQL database." - } - }, - "required": ["host", "password"], - "description": "Database configuration for the registry." - }, - "ingress": { - "type": "object", - "properties": { - "tls": { - "type": "object", - "properties": { - "certificateArn": { - "type": "string", - "description": "The ARN of the TLS certificate for ingress." - } - }, - "required": ["certificateArn"], - "description": "TLS configuration for ingress." - } - }, - "required": ["tls"], - "description": "Ingress-related configuration." - } - }, - "required": [ - "externalDomain", - "database", - "ingress" - ] -} diff --git a/aws-cdk/helm/registry/values.yaml b/aws-cdk/helm/registry/values.yaml deleted file mode 100644 index 5d4cd25..0000000 --- a/aws-cdk/helm/registry/values.yaml +++ /dev/null @@ -1,99 +0,0 @@ -# Default values for registry. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -replicaCount: 1 -namespace: beckn-onix-registry - -image: - repository: fidedocker/registry - pullPolicy: IfNotPresent - # Overrides the image tag whose default is the chart appVersion. - # tag: "" - -imagePullSecrets: [] -nameOverride: "" -fullnameOverride: "" - -serviceAccount: - # Specifies whether a service account should be created - create: false - # Automatically mount a ServiceAccount's API credentials? - automount: true - # Annotations to add to the service account - annotations: {} - # The name of the service account to use. - # If not set and create is true, a name is generated using the fullname template - name: "" - -podAnnotations: {} -podLabels: {} - -podSecurityContext: {} - # fsGroup: 2000 - -securityContext: {} - # capabilities: - # drop: - # - ALL - # readOnlyRootFilesystem: true - # runAsNonRoot: true - # runAsUser: 1000 - -service: - type: ClusterIP - port: 3030 - secondaryPort: 3000 - -# Ingress definition for AWS Application Loadbalancer -ingress: - enabled: true # If enabled, HTTP port 80 listener is open on AWS ALB. Set to false to disable Ingress. Without ingress service will be scoped to K8s cluster. - tls: - enabled: true # Set to true to enable TLS with Aamzon Certificate Manager (ACM) - # SSL certificate location if tls is enabled - certificateArn: - sslRedirect: true # Set to true to enable SSL redirection - -resources: - # We usually recommend not to specify default resources and to leave this as a conscious - # choice for the user. This also increases chances charts run on environments with little - # resources, such as Minikube. If you do want to specify resources, uncomment the following - # lines, adjust them as necessary, and remove the curly braces after 'resources:'. - requests: - cpu: "0.5" - memory: "1Gi" - limits: - cpu: "1" - memory: "2Gi" - -livenessProbe: {} - # httpGet: - # path: / - # port: http -readinessProbe: {} - # httpGet: - # path: / - # port: http - -autoscaling: - enabled: false - minReplicas: 1 - maxReplicas: 2 - targetCPUUtilizationPercentage: 80 - # targetMemoryUtilizationPercentage: 80 - -# Registry AWS RDS Postgres connection details -database: - host: - dbname: registry - username: postgres - password: - -nodeSelector: {} - -tolerations: [] - -affinity: {} - -# Registry external domain/sub-domain value. Supply the actual value during Helm install "--set externalDomain=" -externalDomain: \ No newline at end of file diff --git a/aws-cdk/index.yaml b/aws-cdk/index.yaml deleted file mode 100644 index d342798..0000000 --- a/aws-cdk/index.yaml +++ /dev/null @@ -1,47 +0,0 @@ -apiVersion: v1 -entries: - beckn-onix-bap: - - apiVersion: v2 - appVersion: 1.0.0 - created: "2024-09-16T15:45:01.486632+05:30" - description: Beckn ONIX BAP Helm chart for Kubernetes - digest: 8145e6b88a2206c92f61a6449ae70f51db4d8d558b15e54482a1bcb8f562d5d3 - name: beckn-onix-bap - type: application - urls: - - packages/beckn-onix-bap-0.1.0.tgz - version: 0.1.0 - beckn-onix-bpp: - - apiVersion: v2 - appVersion: 1.0.0 - created: "2024-09-16T15:45:01.488548+05:30" - description: Beckn ONIX BPP Helm chart for Kubernetes - digest: 2b04f19eaf8e4321ac3b687e4f25015de00cfa72afef2d7aab9df585dc0896c1 - name: beckn-onix-bpp - type: application - urls: - - packages/beckn-onix-bpp-0.1.0.tgz - version: 0.1.0 - beckn-onix-gateway: - - apiVersion: v2 - appVersion: 1.0.0 - created: "2024-09-16T15:45:01.48987+05:30" - description: Beckn ONIX Gateway Helm chart for Kubernetes - digest: 4f340faa5ba999c6724ae9b87cf3805abc24b3757b3857526ec8ff69b77d1ab7 - name: beckn-onix-gateway - type: application - urls: - - packages/beckn-onix-gateway-0.1.0.tgz - version: 0.1.0 - beckn-onix-registry: - - apiVersion: v2 - appVersion: 1.0.0 - created: "2024-09-16T15:45:01.490767+05:30" - description: Beckn ONIX Registry Helm chart for Kubernetes - digest: 332505fe26baf5e7aad676ae0a5f6faf9605c36fd0ca2aa401a1ae3c981b4319 - name: beckn-onix-registry - type: application - urls: - - packages/beckn-onix-registry-0.1.0.tgz - version: 0.1.0 -generated: "2024-09-16T15:45:01.484925+05:30" diff --git a/docs/archive/START_BECKN.md b/docs/archive/START_BECKN.md deleted file mode 100644 index 827b4bd..0000000 --- a/docs/archive/START_BECKN.md +++ /dev/null @@ -1,95 +0,0 @@ -# Beckn-ONIX Setup Script - -## Overview - -This shell script, `start_beckn_v2.sh`, automates the setup of Beckn components, including the Registry, Gateway, Protocol Server BAP, Protocol Server BPP, Sandbox, Webhook, and supporting services such as MongoDB, Redis, and RabbitMQ. - -## How to Use - -1. **Clone the Repository:** - - ```bash - git clone -b main https://github.com/beckn/onix.git - ``` - -2. **Navigate to the Script Directory:** - - ```bash - cd onix/install - ``` - -3. **Run the Setup Script:** - - ```bash - ./start_beckn_v2.sh - ``` - - The script will guide you through the installation. - -## Installation Sequence - Design - -1. **Install Required Packages:** - It will install Docker, Docker-Compose, and jq packages which are required for this setup. - - ```bash - ./package_manager.sh - ``` - -2. **Install Registry Service:** - - ```bash - ./start_container registry - ``` - -3. **Install Gateway Service:** - - ```bash - ./update_gateway_details.sh registry - ./start_container gateway - ./register_gateway.sh - ``` - -4. **Start Supporting Services:** - - - MongoDB - - RabbitMQ - - Redis - - ```bash - ./start_support_services - ``` - -5. **Install Protocol Server for BAP:** - - ```bash - ./update_bap_config.sh - ./start_container "bap-client" - ./start_container "bap-network" - ``` - -6. **Install Sandbox:** - - ```bash - ./start_container "sandbox-api" - ``` - -7. **Install Protocol Server for BPP:** - - ```bash - ./update_bpp_config.sh - ./start_container "bpp-client" - ./start_container "bpp-network" - ``` - -## Post-Installation Details - -Upon successful execution, the script provides the following details for use in the Postman collection: -For Example - -```bash -BASE_URL=http://172.18.0.7:5001/ -BAP_ID=bap-network -BAP_URI=http://172.18.0.11:5002/ -BPP_ID=bpp-network -BPP_URI=http://172.18.0.12:6002/ -``` diff --git a/docs/contribution.md b/docs/contribution.md deleted file mode 100644 index 2c60789..0000000 --- a/docs/contribution.md +++ /dev/null @@ -1,19 +0,0 @@ -## Contribution - -We welcome contribution from the community both for Beckn-ONIX project as well as initiatives to add such tools in different production environment. Use the following process to contribute to this project - -### Process to raise issues - -- Check in the [issues](https://github.com/beckn/beckn-onix/issues) section to see if a similar issue or enhancement has been already raised -- If there is an issue already present, use the comment facility in the issue to add your input -- If there is no issue and you feel it needs to be raised, use the New Issue button. A template will be present. Use it to fill the various parts. -- Track the issue you raised and communicate using comments - -### Process to fix issues - -- Once an issue has been raised and validated, any interested contributor can assign it to himself and work on it. -- Use the comment section of the issue to develop any concensus or for clarification -- Use the [forking and raising pull request](https://docs.github.com/en/get-started/exploring-projects-on-github/contributing-to-a-project) guide here for the process of making your change and asking for it to be incorporated in the project -- Use the mentions (@ symbol followed by username e.g. @jjohn) to draw attention to the maintainers of the project. Usually the person committing the last few commits on the main branch is a good candidate to approach -- Once the maintainer has agreed with the changes, he will merge the changes into the right branch based on the branching strategy of the project. -- The issue will be closed after validation. diff --git a/docs/demo_scenarios.md b/docs/demo_scenarios.md deleted file mode 100644 index 8dc6a61..0000000 --- a/docs/demo_scenarios.md +++ /dev/null @@ -1,45 +0,0 @@ -## Introduction - -The [setup walkthrough](../docs/setup_walkthrough.md) and the accompanying video shows a story where we have the following steps - -1. We install a core Beckn network using Beckn-ONIX -2. We try to conduct a retail transaction, but it fails due to layer 2 config not being present -3. We install the layer 2 config for retail from and successfully complete a retail transaction -4. We try to perform a query to find charging station nearby (energy transaction), but it fails due to the layer 2 for energy being absent -5. We install the layer 2 config for energy -6. Now the energy transaction completes. - -In this document we list a few other demo stories where we can show a similar flow but with different domains. The steps are identical, but the story changes to involve different domains. - -## Healthcare + Mobility - -Alice wants to book a wellness center appointment and then book a cab to reach the clinic. - -1. We install a core Beckn network using Beckn-ONIX -2. Alice tries to conduct a healthcare booking, but it fails due to layer 2 config not being present -3. We install the layer 2 config for healthcare `https://raw.githubusercontent.com/beckn/beckn-onix/main/layer2/samples/dhp_1.1.0.yaml` and successfully complete a healthcare appointment booking -4. She tries to book a cab to reach the clinic, but it fails due to the layer 2 for mobility not being present -5. We install the layer 2 config for mobility `https://raw.githubusercontent.com/beckn/beckn-onix/main/layer2/samples/mobility_1.1.0.yaml` -6. Now Alice can book a cab and reach the clinic. - -## Mobility + Retail - -Bob wants to book a cab back home. He wants to buy groceries so he can pick it up on the way - -1. We install a core Beckn network using Beckn-ONIX -2. Bob tries to book a cab, but it fails due to layer 2 config not being present -3. We install the layer 2 config for mobility `https://raw.githubusercontent.com/beckn/beckn-onix/main/layer2/samples/mobility_1.1.0.yaml` and successfully complete the booking -4. He now wants to buy groceries from a shop on the way, but it fails due to the layer 2 for retail not being present -5. We install the layer 2 config for retail `https://raw.githubusercontent.com/beckn/beckn-onix/main/layer2/samples/retail_1.1.0.yaml` -6. Now Bob can complete the retail order and pick it up on the way home - -## Healthcare + Energy - -Cindy wants to schedule a wellness clinic visit, find charging stations near the clinic to get her bike charged while she is attending her appointment - -1. We install a core Beckn network using Beckn-ONIX -2. Cindy tries to book a wellness clinic appointment. It fails due to healthcare layer 2 being missing -3. We install the layer 2 config for healthcare `https://raw.githubusercontent.com/beckn/beckn-onix/main/layer2/samples/dhp_1.1.0.yaml` and Cindy can successfully book the appointment -4. Now she wants to find charging stations near the clinic, but it fails as energy layer 2 config is absent. -5. We install the layer 2 config for energy `https://raw.githubusercontent.com/beckn/beckn-onix/main/layer2/samples/uei_charging_1.1.0.yaml` -6. Now Cindy can find charging stations near the clinic where she can drop the bike and have it charged while finishing her appointment diff --git a/docs/faq.md b/docs/faq.md deleted file mode 100644 index c341395..0000000 --- a/docs/faq.md +++ /dev/null @@ -1,37 +0,0 @@ -## Beckn-ONIX FAQ - -**Q: What is Beckn-ONIX?** - -**A:** Beckn-ONIX is [FIDE](https://fide.org/) project aimed at easing setup and maintainance of a [Beckn](https://becknprotocol.io/) Network using reference implementations. Objectives include setting up reliable, configurable and fast Beckn network as a virtual appliance. - -**Q: Is Beckn-ONIX a protocol? Is Beckn-ONIX a new version of Beckn?** - -**A:** No Beckn-ONIX is not a protocol. Beckn-ONIX is not a new version of Beckn. Beckn-ONIX project just helps setup and maintain a Beckn network. This initiative is independent of the evolution of Beckn - -**Q: What components are installed when we setup a Beckn network with Beckn-ONIX?** - -**A:** When you setup a new Beckn network using Beckn-ONIX, the reference implementations of [Beckn Registry](https://github.com/beckn/beckn-registry-app), [Beckn Gateway](https://github.com/beckn/beckn-gateway-app), [BAP Beckn Adapter](https://github.com/beckn/protocol-server) and [BPP Beckn Adapter](https://github.com/beckn/protocol-server) - -**Q: Do I need anything more than Beckn-ONIX to do transactions?** - -**A:** Yes. Beckn-ONIX only installs the core network components. Refer to the [Sample deployment diagram](./user_guide.md/#sample-deployment-diagram) for a simple illustration of the various components. As you see in that diagram, apart from the core network components, you would need a buyer side application and a seller side application to perform transactions. Typically you will be implementing one or both of these. If you are only implementing one side of it, you can use sample applications or postman as the other application. - -**Q: Do I have to use Beckn-ONIX to install these reference components?** - -**A:** No. If you are comfortable you can install the reference implementations of [Beckn Registry](https://github.com/beckn/beckn-registry-app), [Beckn Gateway](https://github.com/beckn/beckn-gateway-app), [BAP Beckn Adapter](https://github.com/beckn/protocol-server) and [BPP Beckn Adapter](https://github.com/beckn/protocol-server) directly from the repositories. Beckn-ONIX makes the tasks easier through guided installation. - -**Q: Do I have to use these reference components to get onto Beckn network? Can I write them myself** - -**A:** Sure. As the name suggests, these are just reference components and their objective is to get you started easily. You can however write your own implementation of the Beckn protocol using the tech stack you like. - -**Q: The user guide mentions Nginx for reverse proxy. Can I use any other program as reverse proxy** - -**A:** Yes. You can use other programs. The user guide uses Nginx primarily as an example. The instructions to configure the reverse proxy might change. In particular, for the flow we have you might need to identify how to install SSL certificates and how to proxy a request to a port based on the requested URL. - -**Q: Is Beckn-ONIX the best way to setup and manage Beckn network?** - -**A:** No. Beckn-ONIX is just one effort to kick start the process of creating tools to aid easy creation and operation of Beckn networks. We want the community to create even better tools for different production environments. - -**Q: How do I contribute to this project?** - -**A:** We welcome contributions both to this project as well as initiatives in other production environment. Refer to the [contribution guide](./contribution.md) for more details on the process. diff --git a/docs/images/message_validation_in_ba.png b/docs/images/message_validation_in_ba.png deleted file mode 100644 index 6107222..0000000 Binary files a/docs/images/message_validation_in_ba.png and /dev/null differ diff --git a/docs/images/request_flow.png b/docs/images/request_flow.png deleted file mode 100644 index 08f4e7f..0000000 Binary files a/docs/images/request_flow.png and /dev/null differ diff --git a/docs/images/reverse_proxy_configuration.png b/docs/images/reverse_proxy_configuration.png deleted file mode 100644 index 144df85..0000000 Binary files a/docs/images/reverse_proxy_configuration.png and /dev/null differ diff --git a/docs/images/sample_deployment.png b/docs/images/sample_deployment.png deleted file mode 100644 index 3343f7a..0000000 Binary files a/docs/images/sample_deployment.png and /dev/null differ diff --git a/docs/known_issues.md b/docs/known_issues.md deleted file mode 100644 index 3ea1530..0000000 --- a/docs/known_issues.md +++ /dev/null @@ -1,21 +0,0 @@ -# Known issues - -## Gateway is not working after restart - -**First Reported:** -2024-07-19 - -**Problem:** -Gateway keeps on restarting on bootup. It happened after the machine was restarted. The gateway has not been updated and still it is crashing. - -**Root Cause:** -The version of Gateway that was installed prior to July 18 2024, had hard coded a short list of standard registries. This included a registry which has been decomissioned in August. The result of this is that the gateway tries to contact this decomissioned registry during bootup and since it cannot find it, crashes and restarts. This happens with older gateways even without updating the software. If the old gateway software was restarted due to whatever reason, this issue starts to show up. - -**Solution:** -Update the gateway software with the new image (built after July 18 2024). This has removed the hard code of the decomissioned registry and everything should work ok. The following is one way of updating the gateway software. Perform these on the machine that has the gateway container within the beckn-onix/install folder after updating the beckn-onix git clone. - -``` -$ docker-compose -f docker-compose-gateway.yml down -$ docker rmi fidedocker/gateway -$ docker-compose -f docker-compose-gateway.yml up --detach -``` diff --git a/docs/notes/mandatory_layer_2_config.md b/docs/notes/mandatory_layer_2_config.md deleted file mode 100644 index e283eb7..0000000 --- a/docs/notes/mandatory_layer_2_config.md +++ /dev/null @@ -1,24 +0,0 @@ -## Note on mandatory Layer 2 Config (Important) - -This note will eventually be moved to a proper place in the documentation. It has been put here to alert people who run Beckn-ONIX in the meantime. -Beckn-ONIX mandates availability of Layer 2 Config for a particular domain before any transactions can be conducted on it. If the layer 2 config is not present, on either the BAP or the BPP, the following error is returned back to the caller. "Config error : Layer 2 config not found." - -Usually the network facilitators will host the Layer 2 config and provide a way to access it. Currently we have a small script (layer2/download_layer_2_config_bap.sh and layer2/download_layer_2_config_bpp.sh) that can download the layer 2 config from a fixed location and insert it into the docker container that runs the Protocol Server Client. - -- In case you do not have layer 2 config file with you, some sample files are hosted in this repo in this [folder](../../layer2/samples/) -- In case you do not have layer 2 config file with you, and the samples folder does not have the domain that you need, as developer machine workaround, you can copy the core_version.yaml(e.g. core_1.1.0.yaml) and rename it as the layer 2 config for a domain (e.g. for a domain named retail for core version 1.1.0, retail_1.1.0.yaml). This is strictly not recommended for production networks. -- If you have the Layer 2 config file with you and not hosted, you can use the following procedure to update it manually. - -Process to manually update layer 2 config. - -``` -docker cp "$FILENAME" "$CONTAINER_NAME":"$CONTAINER_PATH/$FILENAME" - -# example -docker cp retail_1.1.0.yaml bap-client:/usr/src/app/schemas/retail_1.1.0.yaml -docker cp retail_1.1.0.yaml bap-network:/usr/src/app/schemas/retail_1.1.0.yaml - -docker cp retail_1.1.0.yaml bpp-client:/usr/src/app/schemas/retail_1.1.0.yaml -docker cp retail_1.1.0.yaml bpp-netork:/usr/src/app/schemas/retail_1.1.0.yaml - -``` diff --git a/docs/notes/sample_nginx_configurations.md b/docs/notes/sample_nginx_configurations.md deleted file mode 100644 index 03d191e..0000000 --- a/docs/notes/sample_nginx_configurations.md +++ /dev/null @@ -1,518 +0,0 @@ -# Nginx sample configuration for the different components - -This document lists the various Nginx configuration sample files used in the demo. These use the URLs used as example in the user guide and demo walkthrough. These can be used as a reference. This diagram illustrates the proxy_pass configuration (which is the primary part required) of all the nodes. If you know reverse proxy configuration, this diagram is all you need and you can ignore the rest of this page. - -![Reverse Proxy Configuration](../images/reverse_proxy_configuration.png) - -## Nginx sample configuration for Registry - -Here is a sample Nginx configuration file for the registry. It uses the 'https://onix-registry.becnkprotocol.io' as the example Registry URL. - -``` -server { - listen 80; - listen [::]:80; - server_name onix-registry.becknprotocol.io; - - return 301 https://$host$request_uri; -} - -server { - listen 443 ssl; - listen [::]:443 ssl; - underscores_in_headers on; - gzip on; - gzip_disable "msie6"; - gzip_vary on; - gzip_proxied any; - gzip_comp_level 6; - gzip_buffers 16 8k; - gzip_http_version 1.1; - gzip_min_length 256; - gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss application/javascript text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon font/woff font/woff2 application/octet-stream font/ttf ; - - server_name onix-registry.becknprotocol.io; - - ssl_certificate /etc/letsencrypt/live/onix-registry.becknprotocol.io/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/onix-registry.becknprotocol.io/privkey.pem; - #include /etc/letsencrypt/options-ssl-nginx.conf; - #ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; - - access_log /var/log/nginx/app_beckn_registry_access.log; - error_log /var/log/nginx/app_beckn_registry_error.log debug; - client_max_body_size 10M; - - location / { - if ($uri ~* "\.(jpg|jpeg|png|gif|ico|ttf|eot|svg|woff|woff2|css|js)$") { - add_header 'Cache-Control' 'no-cache'; - } - - #aio threads=default; - - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - - #proxy_http_version 1.1; - proxy_set_header X-URIScheme https; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - - proxy_pass "http://localhost:3030"; - - - set $cors 'true'; - -# if ($http_origin ~ '^https?://(localhost|registry-energy\.becknprotocol\.io)$') { -# set $cors 'true'; -# } -# - add_header 'Access-Control-Allow-Origin' "$http_origin" always; - - if ($cors = 'true') { - add_header 'Access-Control-Allow-Credentials' 'true' always; - add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; - add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With,Range,ApiKey,pub_key_format' always; - } - - if ($request_method = 'OPTIONS') { - add_header 'Access-Control-Allow-Origin' "$http_origin" always; - add_header 'Access-Control-Allow-Credentials' 'true' always; - add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; - add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With,Range,ApiKey,pub_key_format' always; - add_header 'Access-Control-Max-Age' 1728000; - add_header 'Content-Type' 'text/plain charset=UTF-8'; - add_header 'Content-Length' 0; - return 204; - } - } -} -``` - -## Nginx sample configuration for Gateway - -Here is a sample Nginx configuration for the gateway. It uses the 'https://onix-gateway.becknprotocol.io' as the example Gateway URL. - -``` -server { - server_name onix-gateway.becknprotocol.io; - - gzip on; - gzip_disable "msie6"; - gzip_vary on; - gzip_proxied any; - gzip_comp_level 6; - gzip_buffers 16 8k; - gzip_http_version 1.1; - gzip_min_length 256; - gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss application/javascript text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon font/woff font/woff2 application/octet-stream font/ttf ; - - - - access_log /var/log/nginx/app_beckn_gateway_access.log; - error_log /var/log/nginx/app_beckn_gateway_error.log; - client_max_body_size 10M; - - ### ssl config - customize as per your setup ### -keepalive_timeout 70; -ignore_invalid_headers off; - - location / { - if ($uri ~ "^(.*)\.(jpg|jpeg|png|gif|ico|ttf|eot|svg|woff|woff2|css|js)$") { - add_header 'Cache-Control' no-cache ; - } - aio threads=default ; - - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-URIScheme https; - proxy_pass http://localhost:4030/; - set $cors ''; - if ($http_origin ~ '^https?://(localhost|onix\-gateway\.becknprotocol\.io)') { - set $cors 'true'; - } - add_header 'Access-Control-Allow-Origin' "$http_origin" always; - - if ($cors = 'true') { - #add_header 'Access-Control-Allow-Origin' "$http_origin" always; - add_header 'Access-Control-Allow-Credentials' 'true' always; - add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; - add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With,Range,ApiKey,pub_key_format' always; - } - - if ($request_method = 'OPTIONS') { - add_header 'Access-Control-Allow-Origin' "$http_origin" always; - add_header 'Access-Control-Allow-Credentials' 'true' always; - add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; - add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With,Range,ApiKey,pub_key_format' always; - # Tell client that this pre-flight info is valid for 20 days - add_header 'Access-Control-Max-Age' 1728000; - add_header 'Content-Type' 'text/plain charset=UTF-8'; - add_header 'Content-Length' 0; - return 204; - } - } - - - listen 443 ssl; # managed by Certbot - ssl_certificate /etc/letsencrypt/live/onix-gateway.becknprotocol.io/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/onix-gateway.becknprotocol.io/privkey.pem; - #include /etc/letsencrypt/options-ssl-nginx.conf; - #ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; - -} - -server { - if ($host = onix-gateway.becknprotocol.io) { - return 301 https://$host$request_uri; - } - - - listen 80; -listen [::]:80; -server_name onix-gateway.becknprotocol.io; - return 404; - - -} -``` - -## Nginx sample configuration for BAP - -The BAP requires two URLs. One is for the BAP network (e.g https://onix-bap.becknprotocol.io') which faces the Beckn network. The other is for the BAP client 'https://onix-bap-client.becknprotocol.io' which faces the buyer side applications. - -The following is a sample Nginx configuration for BAP client (e.g 'https://onix-bap-client.becknprotocol.io') - -``` -server { - listen 80; - listen [::]:80; - # Put the server name as website name . - server_name onix-bap-client.becknprotocol.io; - - location / { - # This for Host, Client and Forwarded For - #proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - - # For Web Sockets. - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - - # For Proxy. - proxy_pass "http://localhost:5001"; - } -} - -server { - listen 443 ssl http2; - listen [::]:443 ssl http2; - - # Put the server name as website name . - server_name onix-bap-client.becknprotocol.io; - - # Point it to the port in which you want to run the server http://localhost:. - location / { - # This for Host, Client and Forwarded For - #proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - - # For Web Sockets. - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - - # For Proxy. - proxy_pass "http://localhost:5001"; - } - - - # This is the path to certificate. /etc/letsencrypt/live//fullchain.pem - ssl_certificate /etc/letsencrypt/live/onix-bap-client.becknprotocol.io/fullchain.pem; - - - # This is the path to certificate. /etc/letsencrypt/live//privkey.pem - ssl_certificate_key /etc/letsencrypt/live/onix-bap-client.becknprotocol.io/privkey.pem; - - ssl_session_timeout 1d; - ssl_session_cache shared:MozSSL:10m; # about 40000 sessions - ssl_session_tickets off; - - # curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam - # ssl_dhparam /path/to/dhparam; - - # intermediate configuration - ssl_protocols TLSv1.2 TLSv1.3; - ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; - ssl_prefer_server_ciphers on; - - # HSTS (ngx_http_headers_module is required) (63072000 seconds) - add_header Strict-Transport-Security "max-age=63072000" always; - - # OCSP stapling - ssl_stapling on; - ssl_stapling_verify on; - - # verify chain of trust of OCSP response using Root CA and Intermediate certs - # ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates; - - # replace with the IP address of your resolver - resolver 8.8.8.8; -} -``` - -The following is a sample Nginx configuration for BAP Network (e.g. 'https://onix-bap.becknprotocol.io') - -``` -server { - listen 80; - listen [::]:80; - # Put the server name as website name . - server_name onix-bap.becknprotocol.io; - - location / { - # This for Host, Client and Forwarded For - #proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - - # For Web Sockets. - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - - # For Proxy. - proxy_pass "http://localhost:5002"; - } -} - -server { - listen 443 ssl http2; - listen [::]:443 ssl http2; - - # Put the server name as website name . - server_name onix-bap.becknprotocol.io; - - # Point it to the port in which you want to run the server http://localhost:. - location / { - # This for Host, Client and Forwarded For - #proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - - # For Web Sockets. - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - - # For Proxy. - proxy_pass "http://localhost:5002"; - } - - - # This is the path to certificate. /etc/letsencrypt/live//fullchain.pem - ssl_certificate /etc/letsencrypt/live/onix-bap.becknprotocol.io/fullchain.pem; - - - # This is the path to certificate. /etc/letsencrypt/live//privkey.pem - ssl_certificate_key /etc/letsencrypt/live/onix-bap.becknprotocol.io/privkey.pem; - - ssl_session_timeout 1d; - ssl_session_cache shared:MozSSL:10m; # about 40000 sessions - ssl_session_tickets off; - - # curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam - # ssl_dhparam /path/to/dhparam; - - # intermediate configuration - ssl_protocols TLSv1.2 TLSv1.3; - ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; - ssl_prefer_server_ciphers on; - - # HSTS (ngx_http_headers_module is required) (63072000 seconds) - add_header Strict-Transport-Security "max-age=63072000" always; - - # OCSP stapling - ssl_stapling on; - ssl_stapling_verify on; - - # verify chain of trust of OCSP response using Root CA and Intermediate certs - # ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates; - - # replace with the IP address of your resolver - resolver 8.8.8.8; -} -``` - -## Nginx sample configuration for BPP - -The BPP requires two URLs. One is for the BPP Network 'https://onix-bpp.becknprotocol.io' which faces the Beckn network. The other is for the BPP client 'https://onix-bpp-client.becknprotocol.io' which faces the seller side applciation. - -The following is the sample Nginx configuration for BPP client (e.g. 'https://onix-bpp-client.becknprotocol.io') - -``` -server { - listen 80; - listen [::]:80; - # Put the server name as website name . - server_name onix-bpp-client.becknprotocol.io; - - location / { - # This for Host, Client and Forwarded For - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - - # For Web Sockets. - #proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - - # For Proxy. - proxy_pass "http://localhost:6001"; - } -} - -server { - listen 443 ssl http2; - listen [::]:443 ssl http2; - - # Put the server name as website name . - server_name onix-bpp-client.becknprotocol.io; - - # Point it to the port in which you want to run the server http://localhost:. - location / { - # This for Host, Client and Forwarded For - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - - # For Web Sockets. - #proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - - # For Proxy. - proxy_pass "http://localhost:6001"; - } - - - # This is the path to certificate. /etc/letsencrypt/live//fullchain.pem - ssl_certificate /etc/letsencrypt/live/onix-bpp-client.becknprotocol.io/fullchain.pem; - - - # This is the path to certificate. /etc/letsencrypt/live//privkey.pem - ssl_certificate_key /etc/letsencrypt/live/onix-bpp-client.becknprotocol.io/privkey.pem; - - ssl_session_timeout 1d; - ssl_session_cache shared:MozSSL:10m; # about 40000 sessions - ssl_session_tickets off; - - # curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam - # ssl_dhparam /path/to/dhparam; - - # intermediate configuration - ssl_protocols TLSv1.2 TLSv1.3; - ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; - ssl_prefer_server_ciphers on; - - # HSTS (ngx_http_headers_module is required) (63072000 seconds) - add_header Strict-Transport-Security "max-age=63072000" always; - - # OCSP stapling - ssl_stapling on; - ssl_stapling_verify on; - - # verify chain of trust of OCSP response using Root CA and Intermediate certs - # ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates; - - # replace with the IP address of your resolver - resolver 8.8.8.8; -} -``` - -The following is the sample Nginx configuration for BPP Network (e.g. 'https://onix-bpp.becknprotocol.io') - -``` -server { - listen 80; - listen [::]:80; - # Put the server name as website name . - server_name onix-bpp.becknprotocol.io; - - location / { - # This for Host, Client and Forwarded For - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - - # For Web Sockets. - #proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - - # For Proxy. - proxy_pass "http://localhost:6002"; - } -} - -server { - listen 443 ssl http2; - listen [::]:443 ssl http2; - - # Put the server name as website name . - server_name onix-bpp.becknprotocol.io; - - # Point it to the port in which you want to run the server http://localhost:. - location / { - # This for Host, Client and Forwarded For - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - - # For Web Sockets. - #proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - - # For Proxy. - proxy_pass "http://localhost:6002"; - } - - - # This is the path to certificate. /etc/letsencrypt/live//fullchain.pem - ssl_certificate /etc/letsencrypt/live/onix-bpp.becknprotocol.io/fullchain.pem; - - - # This is the path to certificate. /etc/letsencrypt/live//privkey.pem - ssl_certificate_key /etc/letsencrypt/live/onix-bpp.becknprotocol.io/privkey.pem; - - ssl_session_timeout 1d; - ssl_session_cache shared:MozSSL:10m; # about 40000 sessions - ssl_session_tickets off; - - # curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam - # ssl_dhparam /path/to/dhparam; - - # intermediate configuration - ssl_protocols TLSv1.2 TLSv1.3; - ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; - ssl_prefer_server_ciphers on; - - # HSTS (ngx_http_headers_module is required) (63072000 seconds) - add_header Strict-Transport-Security "max-age=63072000" always; - - # OCSP stapling - ssl_stapling on; - ssl_stapling_verify on; - - # verify chain of trust of OCSP response using Root CA and Intermediate certs - # ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates; - - # replace with the IP address of your resolver - resolver 8.8.8.8; -} -``` diff --git a/docs/release_notes.md b/docs/release_notes.md deleted file mode 100644 index 7b98660..0000000 --- a/docs/release_notes.md +++ /dev/null @@ -1,198 +0,0 @@ -# Release Notes - -## Introduction - -Beckn-ONIX is [FIDE](https://fide.org/) project aimed at easing setup and maintainance of a [Beckn](https://becknprotocol.io/) Network using reference implementations. Objectives include setting up reliable, configurable and fast Beckn network as a virtual appliance. This initiative is independent of the evolution of the Beckn protocol. - -Experience the convenience and efficiency of Beckn-ONIX as you embark on your journey with Beckn protocols and open networks. - -| Version | Release Date | -| -------------------------------------------- | ------------ | -| [v0.4.1](#beckn-onix-version-041-2024-06-22) | 2024-06-22 | -| [v0.4.0](#beckn-onix-version-040-2024-05-06) | 2024-05-06 | -| [v0.3.0](#beckn-onix-version-030-2024-03-20) | 2024-03-20 | -| [v0.2.0](#beckn-onix-version-020-2024-03-01) | 2024-03-01 | -| [v0.1.0](#beckn-onix-version-010-2024-02-16) | 2024-02-16 | - -## Beckn-ONIX Version 0.4.1 (2024-06-22) - -- This release adds a new feature for in CLI where its will be able to merge multiple registries. - -### New Features - -- Merging registry A to registry B -- Creting a new super-registry from multiple registries. - -### Enhancements - -- None - -### Bug fixes - -- None - -### Limitations - -- None - -### Upcoming Version - -- GUI support for the Merging feature. - -### Release date - -2024-06-22 - -## Beckn-ONIX Version 0.4.0 (2024-05-06) - -- This release adds a new browser based GUI for installing Beckn network components - -### New Features - -- A new Browser based GUI installation wizard - -### Enhancements - -- Docker volumes used for data and config. Makes migration to new version of components easy -- New User Guide and Setup Walkthrough documents added to CLI installation - -### Bug fixes - -- BPP Beckn Adapter installation does not automatically install additional software (sandbox) -- Required Gateway configuration files are automatically filled (There was an error due to which this had to be manually done) - -### Limitations - -- GUI based installer only works on Ubuntu Linux -- There is a small error due to which the installation in progress toast for BAP and BPP does not stop, though the installation itself has succeeded -- The GUI installer needs Node, NPM and LocalTunnel to be installed before starting. - -### Release date - -2024-05-06 - -## Beckn-ONIX Version 0.3.0 (2024-03-20) - -- This release supports streamlined multi-node installation. -- Support added to mandata layer 2 configuration files for the domain -- The CLI has been modified to lead the user through the journey of bringing up a Beckn Network. -- Based on whether the user is setting up a new network or joining an existing one, workflow prompt is changed - -### New Features - -- Multi node installation -- New CLI interface to lead user through installation -- Layer 2 Config file is mandated before transactions can happen -- Ability to download layer 2 config file from web and install in BAP/BPP Beckn Adapter - -### Bug Fixes - -- None - -### Known Issues - -- Sometimes installation fails on machines without docker due to user not getting new group membership. Running installation again fixes the issue. -- Mount binds are used instead of docker volumes. Due to this data has to be migrated before deleting the installation folder. -- BPP installs Sandbox even when not requested. - -### Limitations - -- The beckn-onix.sh installer used for multi node. For single node installation the start_beckn.sh file has to be used. (This is not true anymore. The beckn-onix.sh has an option to install all components on a single machine) - -### Upcoming Version - -- A community driven GUI installer is in works - -### Release Date - -- 2024-03-01 - -## Beckn-ONIX Version 0.2.0 (2024-03-01) - -### New Features - -- This release focuses on enabling the installation of individual components with user-provided configurations. -- It extends support to the Windows operating system, specifically Windows 10. -- Additionally, it now supports the Mac operating system. - -This release is specifically designed to facilitate the deployment of individual components, offering users the flexibility to customize configurations. Furthermore, it ensures seamless compatibility with both Windows and Mac operating systems. - -For a comprehensive summary of the features, refer [here](https://github.com/beckn/beckn-utilities/milestone/1?closed=1) - -### Enhancements - -- Support for Windows operating system. -- Support for Mac operating system. -- Can be used to install specific components with custom configuration. - -### Bug Fixes - -- None - -### Known Issues - -- None - -### Limitations - -- The current installer is tested only for Linux (Ubuntu) / Windows (windows 10) / Mac, it might support other flavors also. -- The current version supports only vertical scaling, horizontal scaling (ECS / EKS) is planned for an upcoming release -- When installing individual components, registration with the registry has to be done manually, this is explicitly done to avoid confusion and to prevent the network from incorrect or wrong registrations. - -### Upcoming Version - -- Support for horizontal scaling using Elastic Kubernetes Cluster. - -### Release Date - -- 2024-03-01 - -## Beckn-ONIX Version 0.1.0 (2024-02-16) - -### Objective - -Beckn-ONIX - Open Network In A Box, is a utility designed to effortlessly set up all Beckn components on a machine using a one-click installer. This tool serves as a valuable resource for developers and network participants eager to explore Beckn protocols or join open networks supported by the Beckn protocol. By simplifying the installation process, Beckn-ONIX streamlines the onboarding experience. - -The current version installs all components automatically without requiring user input, facilitating a seamless setup process. However, we are committed to further enhancing Beckn-ONIX's functionality. In the upcoming release, we will introduce the capability to selectively install specific components and accommodate user-provided configurations. - -For a comprehensive summary of the features, refer [here](https://github.com/beckn/beckn-utilities/milestone/2?closed=1) - -Experience the convenience and efficiency of Beckn-ONIX as you embark on your journey with Beckn protocols and open networks. - -### New Features - -- Implemented installation support for the following Beckn components: - - Protocol Server BAP - - Protocol Server BPP - - Webhook BPP - - Sandbox - - Registry - - Gateway - - Infrastructure required for the above services - -This release is specifically tailored for deployment on Linux machines, encompassing all aforementioned components with default configurations. - -### Enhancements - -- None - -### Bug Fixes - -- None - -### Known Issues - -- None - -### Limitations - -- None - -### Upcoming Version - -- Installation of individual components with user-provided configuration. -- Support for Windows and Mac OS will be added. - -### Release Date - -- 2024-02-16 diff --git a/docs/setup_walkthrough.md b/docs/setup_walkthrough.md deleted file mode 100644 index eedcbe5..0000000 --- a/docs/setup_walkthrough.md +++ /dev/null @@ -1,421 +0,0 @@ -# Steps to setup a new Beckn network and conduct transactions on it - -## Introduction - -This document describes setting up of a [Beckn network](https://becknprotocol.io/) with Beckn-ONIX and conducting transactions in a couple of domains (retail and energy). The general flow will involve the following steps: - -- [Setup the prerequisites](#overall-prerequisites) -- [Create a new network and install the registry](#create-a-new-network-and-install-the-registry) -- [Install a gateway for the network](#install-a-gateway-for-the-network) -- [Install a Beckn Adaptor for the BAP](#install-a-beckn-adaptor-for-the-bap) -- [Install a Beckn Adaptor for the BPP](#install-a-beckn-adaptor-for-the-bpp) -- [Change the status of the BAP and BPP on the registry as Subscribed](#change-the-status-of-the-bap-and-bpp-on-registry-to-subscribed) -- [Update BAP and BPP with the layer 2 configuration files for the domains we are interested in](#update-bap-and-bpp-with-the-layer-2-configuration-files-for-the-domains-we-are-interested-in) -- [Conduct successful transactions on the network](#conduct-successful-transactions-on-the-network) - -For the sake of illustration, all the urls are shown as subdomains of becknprotocol.io. These will not be available for you to configure on your network. When you are installing on your network, replace them with your own domain name. For example when the instruction below says "https://onix-registry.becknprotocol.io", if you own a domain "example.org", then what you enter will be "https://onix-registry.example.org". Of course you can give a different subdomain than `onix-registry`. However you should be consistent in using the same URL wherever registry url is required. - -Some of the outputs listed below might be different when you run the script for the first time. The output depends on whether the required docker containers are present in the machine or not. - -Run the following two commands on all machines where the script is being run for the first time. Login to a new shell for the command to take effect and continue with the installation. Not doing so will result in docker permisssion error - -``` -sudo groupadd docker -sudo usermod -aG docker $USER -``` - -Please refer to the [Beckn-ONIX User Guide](./user_guide.md) for detailed explanation of the below steps. - -## Sample deployment diagram - -The following diagram shows a conceptual view of a multi-node Bekn network that we will be setting up. The urls shown here are the same as those used in the examples. - -![Typical deployment](./images/sample_deployment.png) - -## Overall prerequisites - -- Setup the following subdomains at the registrar. Refer to [registering or adding domain or subdomain section](./user_guide.md/#appendix-a---registering-or-adding-domain-or-subdomains) - - - https://onix-registry.becknprotocol.io - point to machine with registry - - https://onix-gateway.becknprotocol.io - point to machine with gateway - - https://onix-bap-client.becknprotocol.io - point to machine with BAP - - https://onix-bap.becknprotocol.io - point to machine with BAP - - https://onix-bpp-client.becknprotocol.io - point to machine with BPP - - https://onix-bpp.becknprotocol.io - point to machine with BPP - -- Configure the reverse proxy to have the right ssl certificate installed for all the addresses above. Refer to [configuring ssl certificates on in reverse proxy](./user_guide.md/#ssl-certificates-configured-in-reverse-proxy) for more details -- Configure the reverse proxy with proxy_pass to configure the following routes. Refer to [configuring reverse proxy using proxy_pass](./user_guide.md/#configuring-nginx-reverse-proxy-using-proxy-pass) for details. - - - https://onix-registry.becknprotocol.io to port 3030 on the machine - - https://onix-gateway.becknprotocol.io to port 4030 on the machine - - https://onix-bap-client.becknprotocol.io to port 5001 on the machine - - https://onix-bap.becknprotocol.io to port 5002 on the machine - - https://onix-bpp-client.becknprotocol.io to port 6001 on the machine - - https://onix-bpp.becknprotocol.io to port 6002 on the machine - -![Reverse Proxy Configuration Illustrated](./images/reverse_proxy_configuration.png) - -- This guide assumes you have a marketplace or a headless store and want to set it up to work with the Beckn network. It is still useful for people who are developing the buyer side software and want to set it up with the network. In such cases a [sandbox](https://github.com/beckn/beckn-sandbox) might be required to mimic a marketplace or a headless shop. - -## Create a new network and install the registry - -- ssh into the virtual server that will hold the registry, clone the repo, change into the install folder and run the beckn-onix.sh script. - -``` -git clone https://github.com/beckn/beckn-onix.git -cd beckn-onix/install -./beckn-onix.sh -``` - -- In the prompt that comes up, choose setting up a new network. - -``` -Beckn-ONIX is a platform that helps you quickly launch and configure beckn-enabled networks. - -What would you like to do? -1. Join an existing network -2. Create new production network -3. Set up a network on your local machine -4. Merge multiple networks -5. Configure Existing Network -(Press Ctrl+C to exit) -Enter your choice: 2 - -``` - -- Further choose Registry as the platform you want to install - -``` -Which platform would you like to set up? -1. Registry -2. Gateway -3. BAP -4. BPP -Enter your choice: 1 -``` - -- Input the host name where the registry will reside as https://onix-registry.becknprotocol.io - -``` -Enter publicly accessible registry URL: https://onix-registry.becknprotocol.io -``` - -- The installation will complete to indicate that the registry has been installed. - -``` -................Installing required packages................ -Docker Bash completion is already installed. -docker-compose is already installed. -Package Installation is done -onix-registry.becknprotocol.io -................Installing Registry service................ -WARN[0000] /home/ec2-user/beckn-onix/install/docker-compose-v2.yml: `version` is obsolete -[+] Running 1/1 - ✔ Container registry Started 0.5s -Registry installation successful -[Installation Logs] -Your Registry setup is complete. -You can access your Registry at https://onix-registry.becknprotocol.io -Process complete. Thank you for using Beckn-ONIX! -``` - -## Install a gateway for the network - -Please refer to the [Setting up a gateway](./user_guide.md/#setting-up-a-gateway) section of the user guide for the prerequisites and additional information. - -- On the virtual server that will hold the gateway, clone the repo - -``` -git clone https://github.com/beckn/beckn-onix.git - -``` - -- Change into the install folder and run the beckn-onix.sh script. - -``` -cd beckn-onix/install -./beckn-onix.sh - -``` - -- In the prompt that comes up, choose joining an existing network. - -``` -Beckn-ONIX is a platform that helps you quickly launch and configure beckn-enabled networks. - -What would you like to do? -1. Join an existing network -2. Create new production network -3. Set up a network on your local machine -4. Merge multiple networks -5. Configure Existing Network -(Press Ctrl+C to exit) -Enter your choice: 1 - -``` - -- Choose the component to install as Gateway - -``` -Which platform would you like to set up? -1. Gateway -2. BAP -3. BPP -Enter your choice: 1 -``` - -- Input the URL of the registry we just now installed https://onix-registry.becknprotocol.io - -``` -Enter your registry URL: https://onix-registry.becknprotocol.io -``` - -- Input the Gateway URL https://onix-gateway.becknprotocol.io - -``` -Enter publicly accessible gateway URL: https://onix-gateway.becknprotocol.io -``` - -- The installation will complete to indicate the Gateway has been installed and registered with the registry - -``` -................Installing required packages................ -Docker Bash completion is already installed. -docker-compose is already installed. -Package Installation is done - % Total % Received % Xferd Average Speed Time Time Time Current - Dload Upload Total Spent Left Speed -100 555 0 533 100 22 3551 146 --:--:-- --:--:-- --:--:-- 3724 -Signing Public Key: LlT+DXNzpEKenZuBfhaRl4vvgRxAI2wm8O7/2vmsb0E= -Encryption Public Key: qhlWmkfy6WgzSSsGFc9dDfu3Sm3ZbbFf1bYiG+2RjFw= -URL https://onix-registry.becknprotocol.io/subscribers -................Installing Gateway service................ -Creating gateway ... done -Registering Gateway in the registry -{ - "SWFHttpResponse" : { - "Message" : "" - ,"Status" : "OK" - } -} -Gateway installation successful -[Installation Logs] -Your Gateway setup is complete. -You can access your Gateway at https://onix-gateway.becknprotocol.io -Process complete. Thank you for using Beckn-ONIX! -``` - -## Install a Beckn Adaptor for the BAP - -- On the virtual server that will hold the BAP, clone the repo, change into the install folder and run the beckn-onix.sh script. - -``` -git clone https://github.com/beckn/beckn-onix.git -cd beckn-onix/install -./beckn-onix.sh - -``` - -- In the prompt that comes up, choose joining an existing network. - -``` -What would you like to do? -1. Join an existing network -2. Create new production network -3. Set up a network on your local machine -4. Merge multiple networks -5. Configure Existing Network -(Press Ctrl+C to exit) -Enter your choice: 1 -``` - -- Choose the component to install as BAP - -``` -Which platform would you like to set up? -1. Gateway -2. BAP -3. BPP -Enter your choice: 2 -``` - -- Input the BAP subscriber id - onix-bap.becknprotocol.io -- Input the BAP URL - https://onix-bap.becknprotocol.io -- Input the subscription endpoint of the registry - https://onix-registry.becknprotocol.io/subscribers - -``` -Enter BAP Subscriber ID: onix-bap.becknprotocol.io -Enter BAP Subscriber URL: https://onix-bap.becknprotocol.io -Enter the registry_url(e.g. https://registry.becknprotocol.io/subscribers)https://onix-registry.becknprotocol.io/subscribers -``` - -- The installation will complete to indicate the BAP Beckn Adaptor has installed. - -``` -................Installing required packages................ -Docker Bash completion is already installed. -docker-compose is already installed. -Package Installation is done -................Installing MongoDB................ -WARN[0000] /home/ubuntu/beckn-onix/install/docker-compose-app.yml: `version` is obsolete -[+] Running 1/1 - ✔ Container mongoDB Started 0.4s -MongoDB installation successful -................Installing RabbitMQ................ -WARN[0000] /home/ubuntu/beckn-onix/install/docker-compose-app.yml: `version` is obsolete -[+] Running 1/1 - ✔ Container rabbitmq Started 0.5s -RabbitMQ installation successful -................Installing Redis................ -WARN[0000] /home/ubuntu/beckn-onix/install/docker-compose-app.yml: `version` is obsolete -[+] Running 1/1 - ✔ Container redis Started 0.6s -Redis installation successful -Generating public/private key pair -Your Private Key: o1t1TvdFaHU1H+2wDTsCEJgMRU9zdVt20SeFRyT0nyOlZujB4B0XZX1bMlchKBUpHQ65/9BCj6aMzS0Rdf+dRw== -Your Public Key: pWboweAdF2V9WzJXISgVKR0Ouf/QQo+mjM0tEXX/nUc= -Configuring BAP protocol server -Registering BAP protocol server on the registry -Network Participant Entry is created. Please login to registry https://onix-registry.becknprotocol.io/subscribers and subscribe you Network Participant. -WARN[0000] /home/ubuntu/beckn-onix/install/docker-compose-v2.yml: `version` is obsolete -[+] Running 1/1 - ✔ Container bap-client Started 0.4s -WARN[0000] /home/ubuntu/beckn-onix/install/docker-compose-v2.yml: `version` is obsolete -[+] Running 1/1 - ✔ Container bap-network Started 0.5s -Protocol server BAP installation successful -[Installation Logs] -Your BAP setup is complete. -You can access your BAP at https://onix-bap.becknprotocol.io -Process complete. Thank you for using Beckn-ONIX! - -``` - -## Install a Beckn Adaptor for the BPP - -- On the virtual server that will hold the BPP, clone the repo, change into the install folder and run the beckn-onix.sh script. - -``` -git clone https://github.com/beckn/beckn-onix.git -cd beckn-onix/install -./beckn-onix.sh - -``` - -- In the prompt that comes up, choose joining an existing network. - -``` -What would you like to do? -1. Join an existing network -2. Create new production network -3. Set up a network on your local machine -4. Merge multiple networks -5. Configure Existing Network -(Press Ctrl+C to exit) -Enter your choice: 1 - -``` - -- Choose the component to install as BPP - -``` -Which platform would you like to set up? -1. Gateway -2. BAP -3. BPP -Enter your choice: 3 -``` - -- Input BPP subscriber id as onix-bpp.becknprotocol.io -- Input the BPP URL as https://onix-bpp.becknprotocol.io -- Input the registry URL to subscribe as https://onix-registry.becknprotocol.io/subscribers -- Input the webhook URL as the endpoint where your seller app or marketplace is. In case you do not have one, you can try 'https://unified-bpp.becknprotocol.io/beckn-bpp-adapter'. However the availability of a seller software for ever at this endpoint is not guaranteed (It currently is present) - -``` -Enter BPP Subscriber ID: onix-bpp.becknprotocol.io -Enter BPP Subscriber URL: https://onix-bpp.becknprotocol.io -Enter the registry_url(e.g. https://registry.becknprotocol.io/subscribers): https://onix-registry.becknprotocol.io/subscribers -Enter Webhook URL: https://unified-bpp.becknprotocol.io/beckn-bpp-adapter -``` - -- The installation will complete to indicate the BPP Beckn Adaptor has installed. - -``` -................Installing required packages................ -Docker Bash completion is already installed. -docker-compose is already installed. -Package Installation is done -................Installing MongoDB................ -WARN[0000] /home/ec2-user/beckn-onix/install/docker-compose-app.yml: `version` is obsolete -[+] Running 1/1 - ✔ Container mongoDB Started 0.4s -MongoDB installation successful -................Installing RabbitMQ................ -WARN[0000] /home/ec2-user/beckn-onix/install/docker-compose-app.yml: `version` is obsolete -[+] Running 1/1 - ✔ Container rabbitmq Started 0.6s -RabbitMQ installation successful -................Installing Redis................ -WARN[0000] /home/ec2-user/beckn-onix/install/docker-compose-app.yml: `version` is obsolete -[+] Running 1/1 - ✔ Container redis Started 0.6s -Redis installation successful -................Installing Protocol Server for BPP................ -Generating public/private key pair -Configuring BAP protocol server -Registering BPP protocol server on the registry -Network Participant Entry is created. Please login to registry https://onix-registry.becknprotocol.io/subscribers and subscribe you Network Participant. -WARN[0000] /home/ec2-user/beckn-onix/install/docker-compose-v2.yml: `version` is obsolete -[+] Running 1/1 - ✔ Container bpp-client Started 0.4s -WARN[0000] /home/ec2-user/beckn-onix/install/docker-compose-v2.yml: `version` is obsolete -[+] Running 1/1 - ✔ Container bpp-network Started 0.5s -Protocol server BPP installation successful -[Installation Logs] -Your BPP setup is complete. -You can access your BPP at https://onix-bpp.becknprotocol.io -Process complete. Thank you for using Beckn-ONIX! -``` - -## Change the status of the BAP and BPP on registry to Subscribed - -The newly added BAP and BPP should be transitioned to the "SUBSCRIBED" state in the registry. - -- Login to the newly installed registry (e.g. https://onix-registry.becknprotocol.io). The default username and password are root/root -- In the Admin menu, click Network Participant -- Click the pencil icon next to the onix-bap.becknprotocol.io -- Click on the Network Role tab -- Click on the pencil icon in the row of onix-bap.becknprotocol.io -- Change the status to SUBSCRIBED -- Click the Done button. - -- In the Admin menu, click Network Participant -- Click the pencil icon next to the onix-bpp.becknprotocol.io -- Click on the Network Role tab -- Click on the pencil icon in the row of onix-bpp.becknprotocol.io -- Change the status to SUBSCRIBED -- Click the Done button. - -## Update BAP and BPP with the layer 2 configuration files for the domains we are interested in - -The installation so far has installed a core Beckn network with the registry, gateway, BAP and the BPP. We cannot perform tranasctions on it till we have a layer 2 config file installed for the domains we want to transact in. - -- Login to the virtual server with the BAP -- Change into the beckn-onix/layer2 folder -- Run the download_layer_2_config_bap.sh file. -- Specify the path to the layer 2 config file for the domain of interest. For example, for retail, we have https://raw.githubusercontent.com/beckn/beckn-onix/main/layer2/samples/retail_1.1.0.yaml and for energy https://raw.githubusercontent.com/beckn/beckn-onix/main/layer2/samples/uei_charging_1.1.0.yaml - -- Login to the virtual server with the BPP -- Change into the beckn-onix/layer2 folder -- Run the download_layer_2_config_bpp.sh file. -- Specify the path to the layer 2 config file for the domain of interest. For example, for retail, we have https://raw.githubusercontent.com/beckn/beckn-onix/main/layer2/samples/retail_1.1.0.yaml and for energy https://raw.githubusercontent.com/beckn/beckn-onix/main/layer2/samples/uei_charging_1.1.0.yaml - -- Now with these layer 2 configs installed, we can conduct retail and energy transactions on the network. - -## Conduct successful transactions on the network - -- Load the collection available at `artifacts\ONIX Demo Collection.postman_collection.json` in this repo. -- Run the UEI >> Search request -- The request should succeed without any errors. -- Additional folders and tests will be addded to this collection. diff --git a/docs/user_guide.md b/docs/user_guide.md deleted file mode 100644 index 19aa960..0000000 --- a/docs/user_guide.md +++ /dev/null @@ -1,299 +0,0 @@ -# Beckn-ONIX - User Guide - -## Table of Contents - -- [Introduction](#introduction) -- [Running Beckn-ONIX on the cloud](#running-beckn-onix-on-the-cloud) - - [Sample deployment diagram](#sample-deployment-diagram) - - [Overall Prerequisites](#overall-pre-requisites) - - [Setting up a new network - Registry](#setting-up-a-new-network---registry) - - [Setting up a Gateway](#setting-up-a-gateway) - - [Setting up a BAP Beckn Adapter](#setting-up-a-bap-beckn-adapter) - - [Setting up a BPP Beckn Adapter](#setting-up-a-bpp-beckn-adapter) - - [Downloading Layer 2 Configuration for a domain](#downloading-layer-2-configuration-for-a-domain) - - [Testing transactions on the network](#testing-transactions-on-the-new-network) - - [Connecting BAP Beckn Adapter to BAP Software](#connecting-bap-beckn-adapter-to-bapbuyer-side-software) - - [Connecting BPP Beckn Adapter to BPP Software](#connecting-bpp-beckn-adapter-to-bppseller-side-software) -- [Running Beckn-ONIX locally](#running-beckn-onix-locally) -- [Upgrading to a new version](#upgrading-to-a-new-version) -- [Appendix A - subdomain/domain name configuration](#appendix-a---registering-or-adding-domain-or-subdomains) -- [Appendix B - Nginx reverse proxy configuration](#appendix-b---nginx-reverse-proxy-configuration) - -## Introduction - -Beckn-ONIX is [FIDE](https://fide.org/) project aimed at easing setup and maintainance of a [Beckn](https://becknprotocol.io/) Network using reference implementations. Objectives include setting up reliable, configurable and fast Beckn network as a virtual appliance. This initiative is independent of the evolution of the Beckn protocol. This effort is also aimed at inviting contributions from the community to create secure, reliable builds for production environments. - -This user guide provides all information necessary to setup a Beckn network and conduct transactions on it. For a better understanding of Beckn and the terminologies associated with the ecosystem, please refer to the [Beckn for Developers site](https://developers.becknprotocol.io/). - -There are two primary setups covered in this document. - -- A typical production setup with the various Beckn components on different nodes - This is explained in the Running Beckn-ONIX on the cloud section. -- A developer all in one setup - This is explained in the Running Beckn-ONIX locally section. - -## Running Beckn-ONIX on the Cloud - -Using Beckn-ONIX, we can install a Beckn network on the cloud. This will be similar to a simple production instance of Beckn network. In the sections below, we use Amazon EC2 as an example for VPS provider. The guide can be useful for other cloud environments with simple changes on methods of accessing them etc. In this part of the guide, we explain installation of the four components of Registry, Gateway, BAP and BPP Beckn Adapter on different instances of virtual servers. You can however use the same process with minimal changes to install multiple nodes on the same virtual server (e.g. Registry and Gateway on a single virtual server) - -### Sample deployment diagram - -The following diagram shows a conceptual view of a multi-node Beckn network. The urls shown here are the same as those used in the examples. - -![Typical deployment](./images/sample_deployment.png) - -The following diagram shows the reverse proxy configuration (referred to also in the individual installations below) using the URLs used in the examples. Refer to this diagram during the reverse proxy configuration steps. - -![Reverse Proxy Configuration](./images/reverse_proxy_configuration.png) - -**Use of docker and reference implementations** -Docker compose and docker are extensively used in the installation and running of the various component software. Similarly the Beckn-ONIX installer, itself being a reference implementation, installs the reference implentation of the Beckn Adapter for the BAP and BPP, reference implementation of the registry and gateway. In order to interact with the internals of these components, we will need to enter the container. Familiarity with Docker will be useful in working with the installation. To list the running containers use `docker ps`. Similarly for example to connect to a container and browse it using shell, use `docker exec -it bap-client sh` - -### Overall Pre-requisites - -- OS supported and test Beckn-ONIX installer are Ubuntu (20.04, 22.04 and 24.04), Debian (12), Amazon Linux 2, Windows with WSL support and MacOS. -- Atleast four virtual servers (EC2 instances) configured on the cloud provider with administrator login (e.g. ssh access) to them. -- Access to domain name management with ability to create domain-name/subdomains for each of the components. -- Latest docker version. -- Run the following two commands on all machines where the script is being run for the first time. Login to a new shell for the command to take effect and continue with the installation. Not doing so will result in docker permisssion error - -``` -sudo groupadd docker -sudo usermod -aG docker $USER -``` - -- Each of the various sections below list additional pre-requisites which build on these. - -### Setting up a new network - Registry - -In the Beckn ecosystem, a new network starts with the setting up of the Registry. All network participant register with the Registry with their public key. They also call the lookup endpoint on the Registry to discover and validate other network participants. - -**Prerequisites for installation** - -- A domain or subdomain where the registry will be accessible (e.g https://onix-registry.becknprotocol.io) -- A virtual server with the above mentioned domain/subdomain pointing to it. Refer [Appendix A](#appendix-a---registering-or-adding-domain-or-subdomains) for details -- SSL certificate for the server and configured in Nginx. Refer [Appendix B](#ssl-certificates-configured-in-reverse-proxy) -- Reverse proxy configured to route the traffic at the registry url (e.g. https://onix-registry.becknprotocol.io) to port 3030. Refer [Appendix B](#configuring-nginx-reverse-proxy-using-proxy-pass) - -**Installation Steps** - -- Clone the Beckn-ONIX repository `git clone https://github.com/beckn/beckn-onix.git` -- Change into the installation folder `cd beckn-onix/install` -- Run the installation script `./beckn-onix.sh` -- Specify you want to start a new network and install the registry -- Enter the publicly accessible address of the registry (e.g. https://onix-registry.becknprotocol.io) -- The registry installation will continue to completion. - -### Setting up a Gateway - -In the Beckn ecosystem, the role of the Gateway is limited to the discovery phase. When the BAP wants to search for an item, it sends it to the Gateway and the Gateway broadcasts the request to all BPPs registered for the domain. It registers itself with the registry upon installation. - -**Prerequisites** - -- Address of the registry of the network the gateway will join (e.g. https://onix-registry.becknprotocol.io) -- A domain or subdomain where the gateway will be accessible (e.g https://onix-gateway.becknprotocol.io) -- A virtual server with the above mentioned domain/subdomain pointing to it. Refer [Appendix A](#appendix-a---registering-or-adding-domain-or-subdomains) for details -- SSL certificate for the server and configured in Nginx. Refer [Appendix B](#ssl-certificates-configured-in-reverse-proxy) -- Reverse proxy configured to route the traffic at the gateway url (e.g. https://onix-gateway.becknprotocol.io) to port 4030. Refer [Appendix B](#configuring-nginx-reverse-proxy-using-proxy-pass) - -**Installation Steps** - -- Clone the Beckn-ONIX repository (git clone https://github.com/beckn/beckn-onix.git) -- Change into the installation folder `cd beckn-onix/install` -- Run the installation script `./beckn-onix.sh` -- Specify you want to join an existing network and install the gateway -- Enter the address of the registry of the network you want to join (e.g. https://onix-registry.becknprotocol.io) -- Enter the publicly accessible address of the gateway (e.g. https://onix-gateway.becknprotocol.io) -- The gateway installation will continue to completion and it will register itself with the registry as a participant with role BG(Beckn Gateway) - -### Setting up a BAP Beckn Adapter - -The BAP (Beckn Application Platform) is the bridge between buyer side applications and the Beckn Network. As part of Beckn-ONIX installation, a reference implementation of the Beckn Adapter for the BAP is installed. This adapter talks to two logical entities. On the one side you have the buyer applications which call the BAP with Beckn requests. The BAP forwards these requests to the Beckn network and other participants call back the BAP with responses. These two endpoints are referred to as client and network endpoints in this document. - -**Prerequisites** - -- Address of the registry's subscription endpoint of the network the BAP will join (e.g. https://onix-registry.becknprotocol.io/subscribers) -- A domain or subdomain where the client endpoint of BAP will be accessible (e.g https://onix-bap-client.becknprotocol.io) -- A domain or subdomain where the network endpoint of BAP will be accessible (e.g. https://onix-bap.becknprtocol.io) -- A virtual server with both the above mentioned domains/subdomains pointing to it. Refer [Appendix A](#appendix-a---registering-or-adding-domain-or-subdomains) for details -- SSL certificate for the two endpoints and configured in Nginx. Refer [Appendix B](#ssl-certificates-configured-in-reverse-proxy) -- Reverse proxy configured to route the traffic at the bap client url (e.g. https://onix-bap-client.becknprotocol.io) to port 5001. Refer [Appendix B](#configuring-nginx-reverse-proxy-using-proxy-pass) -- Reverse proxy configured to route the traffic at the bap network url (e.g. https://onix-bap.becknprotocol.io) to port 5002. Refer [Appendix B](#configuring-nginx-reverse-proxy-using-proxy-pass) - -**Installation Steps** - -- Clone the Beckn-ONIX repository (git clone https://github.com/beckn/beckn-onix.git) -- Change into the installation folder `cd beckn-onix/install` -- Run the installation script `./beckn-onix.sh` -- Specify you want to join an existing network and install the BAP. -- Enter the Subscriber id for the BAP. When setting up a new network, its value can be anything you want. However it is recommended to have it the same as the BAP URL without the https:// part (e.g. onix-bap.becknprotocol.io). In existing networks this might be further validated for uniqueness by the registry. -- Enter the Subscriber URI for the BAP. This is the network endpoint of the BAP Beckn Adapter. (e.g. https://onix-bap.becknprotocol.io) -- Enter the address of the subscription endpoint of the registry of the network you want to join (e.g. https://onix-registry.becknprotocol.io/subscribers). Note the suffix subscribers in the endpoint address. -- The BAP installation will continue to completion and it will register itself with the registry as a network participant. - -### Setting up a BPP Beckn Adapter - -The BPP (Beckn Provider Platform) is the bridge between the seller side applications such as a market place or a headless shop and the Beckn network. As part of Beckn-ONIX installation, a reference implementation of the Beckn Adapter for the BPP is installed. This adapter talks to two entities. On the one side, it talks to the seller side apps. It forwards the requests from the Beckn network to this/these software. It also recieves the responses from the seller side apps. This interface towards the seller side applications is called as BPP-Client (client within the context of BPP)within this document. The BPP adapter also receives requests from the Beckn network and returns back the responses to the requesting participant. This part of the Beckn Adapter is called the BPP Network (or just network when the BPP context is implied.) - -**Prerequisites** - -- Address of the registry's subscription endpoint of the network the BPP will join (e.g. https://onix-registry.becknprotocol.io/subscribers) -- A domain or subdomain where the client endpoint of BPP will be accessible (e.g https://onix-bpp-client.becknprotocol.io) -- A domain or subdomain where the network endpoint of BPP will be accessible (e.g. https://onix-bpp.becknprtocol.io) -- A virtual server with both the above mentioned domains/subdomains pointing to it. Refer [Appendix A](#appendix-a---registering-or-adding-domain-or-subdomains) for details -- SSL certificate for the two endpoints and configured in Nginx. Refer [Appendix B](#ssl-certificates-configured-in-reverse-proxy) -- Reverse proxy configured to route the traffic at the bpp client url (e.g. https://onix-bpp-client.becknprotocol.io) to port 6001. Refer [Appendix B](#configuring-nginx-reverse-proxy-using-proxy-pass) -- Reverse proxy configured to route the traffic at the bpp network url (e.g. https://onix-bpp.becknprotocol.io) to port 6002. Refer [Appendix B](#configuring-nginx-reverse-proxy-using-proxy-pass) - -**Installation Steps** - -- Clone the Beckn-ONIX repository (git clone https://github.com/beckn/beckn-onix.git) -- Change into the installation folder `cd beckn-onix/install` -- Run the installation script `./beckn-onix.sh` -- Specify you want to join an existing network and install the BPP. -- Enter the Subscriber id for the BPP. When setting up a new network, its value can be anything you want. However it is recommended to have it the same as the BPP URL without the https:// part (e.g. onix-bpp.becknprotocol.io). In existing networks this might be further validated for uniqueness by the registry. -- Enter the Subscriber URL for the BPP (e.g. https://onix-bpp.becknprotocol.io). This is the network endpoint of the BPP Beckn Adapter. -- Enter the webhook URL. This is the endpoint on your custom market place or headless shop which will receive Beckn requests. The endpoint usually contains the address of the market place or shop as a substring. (e.g. https://unified-bpp.becknprotocol.io/beckn-bpp-adapter) -- Enter the address of the subscription endpoint of the registry of the network you want to join (e.g. https://onix-registry.becknprotocol.io/subscribers). Note the suffix subscribers in the endpoint address. -- The BPP installation will continue to completion and it will register itself with the registry as a network participant. - -### Changing subscription status of BAP and BPP at the registry - -While the Beckn-ONIX installs network participant beckn adapter as well as registers them with the Registry, they need to be manually put to the 'Subscribed' status. Its only then that they can transact. In real networks, the network facilitator might require additional documentation or validation before transitioning the BAP/BPP to the Subscribed state. When we are setting up the entire network ourselves, we do this task ourselves. - -**Steps** - -- Log into your registry at the url you specified (e.g. https://onix-registry.becknprotocol.io). The default username, password is root/root -- Select Network Participants Under Admin menu -- Edit the BAP record. In the Network Role tab, edit the entry and change the state to 'Subscribed' -- Repeat the same for the BPP record. - -### Downloading Layer 2 Configuration for a domain - -With Beckn network setup by Beckn-ONIX, we have a core network with all required network participants. However we cannot still do any transactions on this network. In order to do transactions, we need the Layer 2 Config file for the domain in which we want to transact. Layer 2 configuration files contain - -- rules and policies agreed upon by entities operating in the domain through working group and other consultations -- rules and policies required by the network facilitator - -Currently the layer-2 config are per domain, though this might change with future evolution of the Beckn core specification. The layer 2 config file is usually hosted by the network facilitator. Participants have to get this from the hosted location and install it within the respective containers. This is currently done by a script that needs to be run and provided with address of the layer 2 config file. - -**Steps** - -- Change into the beckn-onix/layer2 folder. -- Start the `download_layer_2_config_bap.sh` -- Specify the path of the layer 2 config file for the required domain. (e.g. https://raw.githubusercontent.com/beckn/beckn-onix/main/layer2/samples/retail_1.1.0.yaml). Some sample layer 2 config files are present at `https://raw.githubusercontent.com/beckn/beckn-onix/main/layer2/samples` -- This file is downloaded and installed into the container. -- Repeat the same process for the BPP. However run the `download_layer_2_config_bpp.sh` file instead. - -### Testing transactions on the new network - -- We can use postman collection for the specific domain to test end to end communication on the domain. Some sample postman collections for testing are [present here](https://github.com/beckn/beckn-sandbox/tree/main/artefacts) -- When running postman collection from the buyer side, the base url to which the requests are sent should be the client side endpoint of the BAP Beckn Adapter instance. (e.g https://onix-bap-client.becknprotocol.io) - -### Connecting BAP Beckn Adapter to BAP(buyer side) software - -Currently Beckn ONIX only installs the reference BAP Adapter on the BAP machine. It does not install any reference buyer side software. However in real-world, buyer side BAP software will interact with this BAP Adapter to perform Beckn transactions. This section provides guidance on how to integrate the two. The following diagram shows the message flow from BAP all the way through to the BPP and back. - -![Request and response flow with BAP and BPP illustrated](./images/request_flow.png) - -The BAP software will typically be a Backend server that provides buying side functionality to users. It takes care of functionalities such as user authentication, profile management, Order flow, Order history and other functionalities common in a commerce application. Many of these functionalities are outside of Beckn scope. The Order flow is primarily where the software will use the BAP Beckn Adapter to communicate to the Beckn network. Typically the order flow within Beckn has four stages (Discovery, Order, Fulfillment and Post Fulfillment). Please refer to this [document](https://developers.becknprotocol.io/docs/introduction/beckn-protocol-specification/) for details on how the individual Beckn requests (currently ten) map to these. - -Taking an example of a user searching for an item, the user will typically enter his search request (say Arabica Coffee Powder) into the UI which will be conveyed to the BAP Backend server. The BAP backend server will call the BAP-Client endpoint with a Search request. This endpoint in the running example will be https://onix-bap-client.becknprotocol.io/search This endpoint as mentioned in the [Setting up a BAP Beckn Adapter](#setting-up-a-bap-beckn-adapter) should be configured to point to the BAP Beckn Adapter Client softare running at a port (default 5001) through Nginx configuration. The format of the message to be sent is explained in the [core specification](https://github.com/beckn/protocol-specifications/blob/master/api/transaction/build/transaction.yaml). An example is below - -``` -{ - "context": { - "domain": "retail", - "location": { - "country": { - "code": "IND" - }, - "city": { - "code": "std:080" - } - }, - "action": "search", - "version": "1.1.0", - "bap_id": "onix-bap.becknprotocol.io", - "bap_uri": "https://onix-bap.becknprotocol.io", - "transaction_id": "{{$randomUUID}}", - "message_id": "{{$randomUUID}}", - "timestamp": "{{$timestamp}}" - }, - "message": { - "intent": { - "item": { - "descriptor": { - "name": "Arabica Coffee Powder" - } - } - } - } -} -``` - -The reference implentation of the BAP Beckn Adapter will forward this to the Beckn network and return back with matching search results from different providers for the retail domain in the network. By default this happens in a synchronous manner, though it can be configured in the BAP Beckn Adapter Client Configuration (Refer to the "Protocol Server BAP Client Setup section" of this [document](https://github.com/beckn/protocol-server/blob/master/setup.md#protocol-server-bap-client-setup)) Refer to the [core protocol specification](https://github.com/beckn/protocol-specifications/blob/master/api/transaction/build/transaction.yaml) for the various other request and response formats for the rest of the order flow requests. - -### Connecting BPP Beckn Adapter to BPP(Seller side) software - -Currently Beckn-ONIX only installs the BPP Beckn Adapter reference implementation on the BPP machine. It does not install a reference implemenation of a market-place or BPP. Typically in real-world there is a backend server that provides seller functionality that talks to the BPP Beckn Adapter. This section describes how the interaction between BPP Beckn Adapter and such a server should occur. Refer to the image in the previous [section](#connecting-bap-beckn-adapter-to-bapbuyer-side-software) for an illustration of BAP and BPP integration along with message flow. - -The BPP software or market-place typically provides functionalities such as Login for shop owners, ability to manage inventory, list products, add product details, take an order, mark fulfillment of orders and aggregate post fulfillment feedback etc. While many of these functionalities are outside of the Beckn protocol, the BPP software will interact with the BPP Beckn Adapter for the order flow. The order flow typically involves Discovery, Order, Fulfillment and Post fulfillment phases and is explained in the context of Beckn [here](https://developers.becknprotocol.io/docs/introduction/beckn-protocol-specification/). The [core protocol specification](https://github.com/beckn/protocol-specifications/blob/master/api/transaction/build/transaction.yaml) explains the format of the various (currently ten) messages that need to flow between the BAP and BPP during the transaction. - -The communication between the BPP Beckn Adapter and the BPP software is asynchronous by default. [This document](https://github.com/beckn/protocol-specifications/blob/master/docs/BECKN-003-Beckn-Protocol-Communication-Draft-01.md) explains how the communication happens. In order to connect any BPP software with the BPP Beckn Adapter, we need to do two things. - -1. Configure the webhook address on the BPP Beckn Adapter to a endpoint in the BPP software. This endpoint will receive all the Beckn messages. The BPP software should identify the message through the action attribute in the context field of the request. Refer to the [Protocol Server BPP Client Setup](https://github.com/beckn/protocol-server/blob/master/setup.md#protocol-server-bpp-client-setup) section - webhook configuration for details. -2. Once the BPP software is ready with a response (say the item results for the search query), it has to call the BPP Beckn Adapter Client endpoint. In the example, that would be https://onix-bpp-client.becknprotocol.io. - -Refer to the [core specification](https://github.com/beckn/protocol-specifications/blob/master/api/transaction/build/transaction.yaml) for details on the format of other responses (on_search, on_select, on_init etc) to complete the order flow. - -## Running Beckn-ONIX locally - -- In order for people new to Beckn who want to try out Beckn on their own machine, choose the option to "Set up a network on your local machine" in the main screen. The all in one installation has preconfigured values for variables and so pretty much does not ask for any input. -- In order to run the installation on a Macintosh computer, run the following command in the terminal where you run the install before you start the installation. `export DOCKER_DEFAULT_PLATFORM=linux/amd64`. Ensure you close the terminal after installation, so this setting does not affect other docker containers you might install. - -## Upgrading to a new version - -- The following commands illustrate upgrade of the docker image for Protocol Server (here BPP). Use similar process for other components - -``` -docker compose -f docker-compose-bpp.yml down -docker rmi fidedocker/protocol-server -docker compose -f docker-compose-bpp.yml up -d -``` - -## Appendix A - Registering or adding domain or subdomains - -All the components of Beckn network need to be publicly accessible. Using domain names for them is the easiest. There are two options for domain names. One is a separate domain name for each component(e.g. registrybp.io). Second is to use subdomains for the individual componetns (e.g. onix-registry.becknprotocol.io , onix-gateway.becknprotocol.io etc). Which one of these two to use depends on the business requirement. For example if an organization is the network facilitator, they might go for a domain name for the registry instead of subdomain. In the examples given above we have primarily used subdomain approach. - -The process of registering domain names differs by the Domain Registrar. An example is here https://www.cloudflare.com/en-gb/products/registrar/ - -Similarly the process of adding subdomains differs by the Domain Registrar. An example is here https://developers.cloudflare.com/dns/manage-dns-records/how-to/create-subdomain/ - -For example in the prerequesites when it says "Subdomain name added(e.g. onix-gateway.becknprotocol.io) and point to this virtual server", what needs to be done is - -- Decide on a name (here it is onix-gateway) -- Add the name as subdomain at your registrar (here the registrar would be that of becknnprotocol.io) -- Point the record at the registrar to the machine on which you are installing the gateway - -## Appendix B - NGINX reverse proxy configuration - -All components of Beckn network need to be publicly accessible. Also it is required that they run on the https server for additional security. In addition some of the components of the reference implementation have two webservers running on the same node and require to be each publicly accessible through https. In order to achieve all of these requirements, it is recommended to install reverse-proxy on all the machines where the Beckn network components installed. This document uses Nginx as Reverse proxy, but the same can be configured through other programs. - -### SSL certificates configured in reverse proxy - -To enable https communication, SSL certificates need to be obtained and configured in Nginx. Depending on where you get the SSL certificate from, the process will vary. One such process for a provider [letsencrypt is documented here](https://letsencrypt.org/getting-started/) - -Once the SSL certificate is obtained, it needs to be configured. For Nginx, this [configuration is explained here] (https://nginx.org/en/docs/http/configuring_https_servers.html) - -When the prerequisite in this document says: "Nginx is configured with ssl certificate for the registry URL(e.g. https://onix-registry.becknprotocol.io)", it involves the following: - -- Obtain ssl certificate for `https://onix-registry.becknprotocol.io` -- Configure Nginx on the virtual server to create a server at https://onix-registry.becknprotocol.io. -- Configure this server to use the ssl certificate - -### Configuring Nginx reverse proxy using proxy pass - -In the role of reverse proxy, Nginx will forward communication that came on a particular url to a different destination (usually a server running on the same machine at a different port). This facility is used extensively in the reference Beckn components. For example the reference implementation of the BAP Protocol Server installs two servers. One at port 5001 and another at port 5002. We will need to configure two URLs (e.g. https://onix-bap-client.becknprotocol.io and https://onix-bap.becknprotocol.io) for this virtual server and Nginx should forward the first to server running on port 5001 and second to server running on port 5002. - -[This document](https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/) explains the configuration of reverse proxy using proxy_pass - -You can find sample Nginx configuration for the Registry, Gateway, BAP and BPP [here](./notes/sample_nginx_configurations.md) diff --git a/index.html b/index.html deleted file mode 100644 index d93041f..0000000 --- a/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Redirecting... - - -

If you are not redirected, click here.

- - diff --git a/install/.gitignore b/install/.gitignore deleted file mode 100644 index 6a5de0f..0000000 --- a/install/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -docker_data -gateway_data/config/swf.properties -gateway_data/config/networks/onix.json -registry_data/config/swf.properties -.vscode -gateway_data/config/networks/onix.json -gateway_data/database/standalone.mv.db -protocol-server-data/bap-client.yml -protocol-server-data/bap-network.yml -protocol-server-data/bpp-client.yml -protocol-server-data/bpp-network.yml -ENV/.env-generic-client-layer -registry.*db -gateway.*db diff --git a/install/ENV/.env-generic-client-layer-sample b/install/ENV/.env-generic-client-layer-sample deleted file mode 100644 index f92d5bd..0000000 --- a/install/ENV/.env-generic-client-layer-sample +++ /dev/null @@ -1,19 +0,0 @@ -APP_NAME="Generic Client Layer" -APP_ENV=local -APP_KEY= -APP_DEBUG=true -APP_PORT=3000 -APP_URL=http://localhost - -LOG_CHANNEL=stack -LOG_DEPRECATIONS_CHANNEL=null -LOG_LEVEL=debug - -PS_BASE_URI=BAP_CLIENT_URL -PS_BAP_ID=BAP_SUBSCRIBER_ID -PS_BAP_URI=BAP_SUBSCRIBER_URL - -PS_CITY_NAME=Bangalore -PS_CITY_CODE=std:080 -PS_COUNTRY_NAME=India -PS_COUNTRY_CODE=IND \ No newline at end of file diff --git a/install/ENV/.env-sandbox b/install/ENV/.env-sandbox deleted file mode 100644 index d71b848..0000000 --- a/install/ENV/.env-sandbox +++ /dev/null @@ -1,2 +0,0 @@ -BPPCLIENTURL=http://bpp-client:6001 -BASE_URL=http://sandbox-api:3000 diff --git a/install/ENV/.env-webhook b/install/ENV/.env-webhook deleted file mode 100644 index 880b376..0000000 --- a/install/ENV/.env-webhook +++ /dev/null @@ -1,2 +0,0 @@ -SANDBOXURL=http://sandbox-api:3000 -BPPCLIENTURL=http://bpp-client:6001 diff --git a/install/beckn-onix.sh b/install/beckn-onix.sh deleted file mode 100755 index 8850c51..0000000 --- a/install/beckn-onix.sh +++ /dev/null @@ -1,386 +0,0 @@ -#!/bin/bash -source scripts/variables.sh -source scripts/get_container_details.sh - -# Function to start a specific service inside docker-compose file -install_package(){ - echo "${GREEN}................Installing required packages................${NC}" - bash scripts/package_manager.sh - echo "Package Installation is done" - -} -start_container(){ - #ignore orphaned containers warning - export COMPOSE_IGNORE_ORPHANS=1 - docker compose -f $1 up -d $2 -} - -update_registry_details() { - if [[ $1 ]];then - if [[ $1 == https://* ]]; then - if [[ $(uname -s) == 'Darwin' ]]; then - registry_url=$(echo "$1" | sed -E 's/https:\/\///') - else - registry_url=$(echo "$1" | sed 's/https:\/\///') - fi - registry_port=443 - protocol=https - elif [[ $1 == http://* ]]; then - if [[ $(uname -s) == 'Darwin' ]]; then - registry_url=$(echo "$1" | sed -E 's/http:\/\///') - else - registry_url=$(echo "$1" | sed 's/http:\/\///') - fi - registry_port=80 - protocol=http - fi - - else - registry_url=registry - registry_port=3030 - protocol=http - fi - echo $registry_url - cp $SCRIPT_DIR/../registry_data/config/swf.properties-sample $SCRIPT_DIR/../registry_data/config/swf.properties - config_file="$SCRIPT_DIR/../registry_data/config/swf.properties" - - tmp_file=$(mktemp "tempfile.XXXXXXXXXX") - sed "s|REGISTRY_URL|$registry_url|g; s|REGISTRY_PORT|$registry_port|g; s|PROTOCOL|$protocol|g" "$config_file" > "$tmp_file" - mv "$tmp_file" "$config_file" - docker volume create registry_data_volume - docker volume create registry_database_volume - docker run --rm -v $SCRIPT_DIR/../registry_data/config:/source -v registry_data_volume:/target busybox cp /source/{envvars,logger.properties,swf.properties} /target/ - docker rmi busybox -} -# Function to start the MongoDB, Redis, and RabbitMQ Services -start_support_services(){ - #ignore orphaned containers warning - export COMPOSE_IGNORE_ORPHANS=1 - echo "${GREEN}................Installing MongoDB................${NC}" - docker compose -f docker-compose-app.yml up -d mongo_db - echo "MongoDB installation successful" - - echo "${GREEN}................Installing RabbitMQ................${NC}" - docker compose -f docker-compose-app.yml up -d queue_service - echo "RabbitMQ installation successful" - - echo "${GREEN}................Installing Redis................${NC}" - docker compose -f docker-compose-app.yml up -d redis_db - echo "Redis installation successful" -} - -install_gateway() { - if [[ $1 && $2 ]]; then - bash scripts/update_gateway_details.sh $1 $2 - else - bash scripts/update_gateway_details.sh http://registry:3030 - fi - echo "${GREEN}................Installing Gateway service................${NC}" - start_container $gateway_docker_compose_file gateway - echo "Registering Gateway in the registry" - - sleep 10 - # if [[ $1 && $2 ]]; then - # bash scripts/register_gateway.sh $2 - # else - # bash scripts/register_gateway.sh - # fi - echo " " - echo "Gateway installation successful" -} - -# Function to install Beckn Gateway and Beckn Registry -install_registry(){ - if [[ $1 ]]; then - update_registry_details $1 - else - update_registry_details - fi - - echo "${GREEN}................Installing Registry service................${NC}" - start_container $registry_docker_compose_file registry - sleep 10 - echo "Registry installation successful" -} - -# Function to install BAP Protocol Server -install_bap_protocol_server(){ - start_support_services - if [[ $1 ]];then - registry_url=$1 - bap_subscriber_id=$2 - bap_subscriber_key_id=$3 - bap_subscriber_url=$4 - bash scripts/update_bap_config.sh $registry_url $bap_subscriber_id $bap_subscriber_key_id $bap_subscriber_url - else - bash scripts/update_bap_config.sh - fi - sleep 10 - docker volume create bap_client_config_volume - docker volume create bap_network_config_volume - docker run --rm -v $SCRIPT_DIR/../protocol-server-data:/source -v bap_client_config_volume:/target busybox cp /source/bap-client.yml /target/default.yml - docker run --rm -v $SCRIPT_DIR/../protocol-server-data:/source -v bap_client_config_volume:/target busybox cp /source/bap-client.yaml-sample /target - docker run --rm -v $SCRIPT_DIR/../protocol-server-data:/source -v bap_network_config_volume:/target busybox cp /source/bap-network.yml /target/default.yml - docker run --rm -v $SCRIPT_DIR/../protocol-server-data:/source -v bap_network_config_volume:/target busybox cp /source/bap-network.yaml-sample /target - docker rmi busybox - - start_container $bap_docker_compose_file "bap-client" - start_container $bap_docker_compose_file "bap-network" - sleep 10 - echo "Protocol server BAP installation successful" -} - - -# Function to install BPP Protocol Server without Sandbox -install_bpp_protocol_server(){ - start_support_services - echo "${GREEN}................Installing Protocol Server for BPP................${NC}" - - if [[ $1 ]];then - registry_url=$1 - bpp_subscriber_id=$2 - bpp_subscriber_key_id=$3 - bpp_subscriber_url=$4 - webhook_url=$5 - bash scripts/update_bpp_config.sh $registry_url $bpp_subscriber_id $bpp_subscriber_key_id $bpp_subscriber_url $webhook_url - else - bash scripts/update_bpp_config.sh - fi - - sleep 10 - docker volume create bpp_client_config_volume - docker volume create bpp_network_config_volume - docker run --rm -v $SCRIPT_DIR/../protocol-server-data:/source -v bpp_client_config_volume:/target busybox cp /source/bpp-client.yml /target/default.yml - docker run --rm -v $SCRIPT_DIR/../protocol-server-data:/source -v bpp_client_config_volume:/target busybox cp /source/bpp-client.yaml-sample /target - docker run --rm -v $SCRIPT_DIR/../protocol-server-data:/source -v bpp_network_config_volume:/target busybox cp /source/bpp-network.yml /target/default.yml - docker run --rm -v $SCRIPT_DIR/../protocol-server-data:/source -v bpp_network_config_volume:/target busybox cp /source/bpp-network.yaml-sample /target - docker rmi busybox - - start_container $bpp_docker_compose_file "bpp-client" - start_container $bpp_docker_compose_file "bpp-network" - sleep 10 - echo "Protocol server BPP installation successful" -} - -mergingNetworks(){ - echo -e "1. Merge Two Different Registries \n2. Merge Multiple Registries into a Super Registry" - read -p "Enter your choice: " merging_network - urls=() - if [ "$merging_network" = "2" ]; then - while true; do - read -p "Enter registry URL (or 'N' to stop): " url - if [[ $url == 'N' ]]; then - break - else - urls+=("$url") - fi - done - read -p "Enter the Super Registry URL: " registry_super_url - else - read -p "Enter A registry URL: " registry_a_url - read -p "Enter B registry URL: " registry_b_url - urls+=("$registry_a_url") - - fi - if [[ ${#urls[@]} -gt 0 ]]; then - echo "Entered registry URLs:" - all_responses="" - for url in "${urls[@]}"; do - response=$(curl -s -H 'ACCEPT: application/json' -H 'CONTENT-TYPE: application/json' "$url"+/subscribers/lookup -d '{}') - all_responses+="$response" - done - for element in $(echo "$all_responses" | jq -c '.[]'); do - if [ "$merging_network" -eq 1 ]; then - curl --location "$registry_b_url"+/subscribers/register \ - --header 'Content-Type: application/json' \ - --data "$element" - echo - else - curl --location "$registry_super_url"+/subscribers/register \ - --header 'Content-Type: application/json' \ - --data "$element" - echo - fi - done - echo "Merging Multiple Registries into a Super Registry Done ..." - else - echo "No registry URLs entered." - fi - - if [ "$merging_network" = "2" ]; then - echo "Merging Multiple Registries into a Super Registry" - else - echo "Invalid option. Please restart the script and select a valid option." - exit 1 - fi -} - - - -# Function to install BPP Protocol Server with Sandbox -install_bpp_protocol_server_with_sandbox(){ - start_support_services - - docker volume create bpp_client_config_volume - docker volume create bpp_network_config_volume - - echo "${GREEN}................Installing Sandbox................${NC}" - start_container $bpp_docker_compose_file_sandbox "sandbox-api" - sleep 5 - echo "Sandbox installation successful" - - echo "${GREEN}................Installing Protocol Server for BPP................${NC}" - - if [[ $1 ]];then - registry_url=$1 - bpp_subscriber_id=$2 - bpp_subscriber_key_id=$3 - bpp_subscriber_url=$4 - webhook_url=$5 - bash scripts/update_bpp_config.sh $registry_url $bpp_subscriber_id $bpp_subscriber_key_id $bpp_subscriber_url $webhook_url - else - bash scripts/update_bpp_config.sh - fi - - sleep 10 - docker run --rm -v $SCRIPT_DIR/../protocol-server-data:/source -v bpp_client_config_volume:/target busybox cp /source/bpp-client.yml /target/default.yml - docker run --rm -v $SCRIPT_DIR/../protocol-server-data:/source -v bpp_client_config_volume:/target busybox cp /source/bpp-client.yaml-sample /target - docker run --rm -v $SCRIPT_DIR/../protocol-server-data:/source -v bpp_network_config_volume:/target busybox cp /source/bpp-network.yml /target/default.yml - docker run --rm -v $SCRIPT_DIR/../protocol-server-data:/source -v bpp_network_config_volume:/target busybox cp /source/bpp-network.yaml-sample /target - docker rmi busybox - - start_container $bpp_docker_compose_file "bpp-client" - start_container $bpp_docker_compose_file "bpp-network" - sleep 10 - echo "Protocol server BPP installation successful" -} - - -# Function to handle the setup process for each platform -completeSetup() { - platform=$1 - - public_address="https://" - - echo "Proceeding with the setup for $platform..." - - # Insert the specific commands for each platform, including requesting network config if necessary - case $platform in - "Registry") - read -p "Enter publicly accessible registry URL: " registry_url - if [[ $registry_url =~ /$ ]]; then - new_registry_url=${registry_url%/} - else - new_registry_url=$registry_url - fi - public_address=$registry_url - install_package - install_registry $new_registry_url - ;; - "Gateway"|"Beckn Gateway") - read -p "Enter your registry URL: " registry_url - read -p "Enter publicly accessible gateway URL: " gateway_url - - if [[ $registry_url =~ /$ ]]; then - new_registry_url=${registry_url%/} - else - new_registry_url=$registry_url - fi - if [[ $gateway_url =~ /$ ]]; then - gateway_url=${gateway_url%/} - fi - - public_address=$gateway_url - install_package - install_gateway $new_registry_url $gateway_url - ;; - "BAP") - echo "${GREEN}................Installing Protocol Server for BAP................${NC}" - - read -p "Enter BAP Subscriber ID: " bap_subscriber_id - read -p "Enter BAP Subscriber URL: " bap_subscriber_url - read -p "Enter the registry_url(e.g. https://registry.becknprotocol.io/subscribers): " registry_url - bap_subscriber_key_id=$bap_subscriber_id-key - public_address=$bap_subscriber_url - install_package - install_bap_protocol_server $registry_url $bap_subscriber_id $bap_subscriber_key_id $bap_subscriber_url - ;; - "BPP") - echo "${GREEN}................Installing Protocol Server for BAP................${NC}" - read -p "Enter BPP Subscriber ID: " bpp_subscriber_id - read -p "Enter BPP Subscriber URL: " bpp_subscriber_url - read -p "Enter the registry_url(e.g. https://registry.becknprotocol.io/subscribers): " registry_url - read -p "Enter Webhook URL: " webhook_url - - bpp_subscriber_key_id=$bpp_subscriber_id-key - public_address=$bpp_subscriber_url - install_package - install_bpp_protocol_server $registry_url $bpp_subscriber_id $bpp_subscriber_key_id $bpp_subscriber_url $webhook_url - ;; - *) - echo "Invalid platform selected." - exit 1 - ;; - esac - - echo "[Installation Logs]" - echo -e "${boldGreen}Your $platform setup is complete.${reset}" - echo -e "${boldGreen}You can access your $platform at $public_address ${reset}" - # Key generation and subscription logic follows here -} - - -# MAIN SCRIPT STARTS HERE - -echo "Welcome to Beckn-ONIX!" -if [ -f ./onix_ascii_art.txt ]; then - cat ./onix_ascii_art.txt -else - echo "[Display Beckn-ONIX ASCII Art]" -fi - -echo "Beckn-ONIX is a platform that helps you quickly launch and configure beckn-enabled networks." -echo -e "\nWhat would you like to do?\n1. Join an existing network\n2. Create new production network\n3. Set up a network on your local machine\n4. Merge multiple networks\n5. Configure Existing Network\n(Press Ctrl+C to exit)" -read -p "Enter your choice: " choice - -boldGreen="\e[1m\e[92m" -reset="\e[0m" -if [[ $choice -eq 3 ]]; then - echo "Installing all components on the local machine" - install_package - install_registry - install_gateway - install_bap_protocol_server - install_bpp_protocol_server_with_sandbox -elif [[ $choice -eq 4 ]]; then - echo "Determining the platforms available based on the initial choice" - mergingNetworks -else - # Determine the platforms available based on the initial choice - platforms=("Gateway" "BAP" "BPP") - [ "$choice" -eq 2 ] && platforms=("Registry" "${platforms[@]}") # Add Registry for new network setups - - echo "Great choice! Get ready." - echo -e "\nWhich platform would you like to set up?" - for i in "${!platforms[@]}"; do - echo "$((i+1)). ${platforms[$i]}" - done - - read -p "Enter your choice: " platform_choice - - selected_platform="${platforms[$((platform_choice-1))]}" - - if [[ -n $selected_platform ]]; then - completeSetup "$selected_platform" - else - echo "Invalid option. Please restart the script and select a valid option." - exit 1 - fi -fi - -echo "Process complete. Thank you for using Beckn-ONIX!" - - -echo "Process complete. Thank you for using Beckn-ONIX!" - - diff --git a/install/docker-compose-app.yml b/install/docker-compose-app.yml deleted file mode 100644 index c986658..0000000 --- a/install/docker-compose-app.yml +++ /dev/null @@ -1,58 +0,0 @@ -services: - mongo_db: - image: mongo - restart: unless-stopped - container_name: mongoDB - volumes: - - beckn_mongo_db:/data/db - - beckn_mongo_config:/data/configdb - networks: - - beckn_network - ports: - - "27017:27017" - environment: - - MONGO_INITDB_ROOT_USERNAME=beckn - - MONGO_INITDB_ROOT_PASSWORD=beckn123 - - MONGO_INITDB_DATABASE=protocol_server - - redis_db: - image: redis:6.2.5-alpine - restart: unless-stopped - container_name: redis - networks: - - beckn_network - ports: - - "6379:6379" - volumes: - - beckn_redis:/data - - queue_service: - image: rabbitmq:3.9.11-management-alpine - restart: unless-stopped - container_name: rabbitmq - networks: - - beckn_network - ports: - - "5672:5672" - - "15672:15672" - volumes: - - beckn_rabbitmq:/var/lib/rabbitmq - environment: - AMQP_URL: "amqp://queue_service?connection_attempts=3&retry_delay=5" - RABBITMQ_DEFAULT_USER: beckn - RABBITMQ_DEFAULT_PASS: beckn123 - -networks: - beckn_network: - name: beckn_network - driver: bridge - -volumes: - beckn_mongo_db: - name: beckn_mongo_db - beckn_mongo_config: - name: beckn_mongo_config - beckn_redis: - name: beckn_redis - beckn_rabbitmq: - name: beckn_rabbitmq diff --git a/install/docker-compose-bap.yml b/install/docker-compose-bap.yml deleted file mode 100644 index d9bb6a8..0000000 --- a/install/docker-compose-bap.yml +++ /dev/null @@ -1,49 +0,0 @@ -services: - bap-client: - image: fidedocker/protocol-server - container_name: bap-client - platform: linux/amd64 - networks: - - beckn_network - ports: - - 5001:5001 - restart: unless-stopped - volumes: - - bap_client_config_volume:/usr/src/app/config - - bap_client_schemas_volume:/usr/src/app/schemas - - bap_client_logs_volume:/usr/src/app/logs - - bap-network: - image: fidedocker/protocol-server - container_name: bap-network - platform: linux/amd64 - networks: - - beckn_network - ports: - - 5002:5002 - restart: unless-stopped - volumes: - - bap_network_config_volume:/usr/src/app/config - - bap_network_schemas_volume:/usr/src/app/schemas - - bap_network_logs_volume:/usr/src/app/logs - -networks: - beckn_network: - name: beckn_network - driver: bridge - -volumes: - bap_client_config_volume: - name: bap_client_config_volume - external: true - bap_client_schemas_volume: - name: bap_client_schemas_volume - bap_client_logs_volume: - name: bap_client_logs_volume - bap_network_config_volume: - name: bap_network_config_volume - external: true - bap_network_schemas_volume: - name: bap_network_schemas_volume - bap_network_logs_volume: - name: bap_network_logs_volume diff --git a/install/docker-compose-bpp-with-sandbox.yml b/install/docker-compose-bpp-with-sandbox.yml deleted file mode 100644 index cd242d1..0000000 --- a/install/docker-compose-bpp-with-sandbox.yml +++ /dev/null @@ -1,61 +0,0 @@ -services: - bpp-client: - image: fidedocker/protocol-server - container_name: bpp-client - platform: linux/amd64 - networks: - - beckn_network - ports: - - 6001:6001 - restart: unless-stopped - volumes: - - bpp_client_config_volume:/usr/src/app/config - - bpp_client_schemas_volume:/usr/src/app/schemas - - bpp_client_logs_volume:/usr/src/app/logs - - bpp-network: - image: fidedocker/protocol-server - container_name: bpp-network - platform: linux/amd64 - networks: - - beckn_network - ports: - - 6002:6002 - restart: unless-stopped - volumes: - - bpp_network_config_volume:/usr/src/app/config - - bpp_network_schemas_volume:/usr/src/app/schemas - - bpp_network_logs_volume:/usr/src/app/logs - - sandbox-api: - image: fidedocker/sandbox-api - container_name: sandbox-api - platform: linux/amd64 - networks: - - beckn_network - ports: - - 4010:4000 - restart: unless-stopped - volumes: - - ./ENV/.env-sandbox:/usr/src/app/.env - -networks: - beckn_network: - name: beckn_network - driver: bridge - -volumes: - bpp_client_config_volume: - name: bpp_client_config_volume - external: true - bpp_client_schemas_volume: - name: bpp_client_schemas_volume - bpp_client_logs_volume: - name: bpp_client_logs_volume - bpp_network_config_volume: - name: bpp_network_config_volume - external: true - bpp_network_schemas_volume: - name: bpp_network_schemas_volume - bpp_network_logs_volume: - name: bpp_network_logs_volume diff --git a/install/docker-compose-bpp.yml b/install/docker-compose-bpp.yml deleted file mode 100644 index 5282b8b..0000000 --- a/install/docker-compose-bpp.yml +++ /dev/null @@ -1,49 +0,0 @@ -services: - bpp-client: - image: fidedocker/protocol-server - container_name: bpp-client - platform: linux/amd64 - networks: - - beckn_network - ports: - - 6001:6001 - restart: unless-stopped - volumes: - - bpp_client_config_volume:/usr/src/app/config - - bpp_client_schemas_volume:/usr/src/app/schemas - - bpp_client_logs_volume:/usr/src/app/logs - - bpp-network: - image: fidedocker/protocol-server - container_name: bpp-network - platform: linux/amd64 - networks: - - beckn_network - ports: - - 6002:6002 - restart: unless-stopped - volumes: - - bpp_network_config_volume:/usr/src/app/config - - bpp_network_schemas_volume:/usr/src/app/schemas - - bpp_network_logs_volume:/usr/src/app/logs - -networks: - beckn_network: - name: beckn_network - driver: bridge - -volumes: - bpp_client_config_volume: - name: bpp_client_config_volume - external: true - bpp_client_schemas_volume: - name: bpp_client_schemas_volume - bpp_client_logs_volume: - name: bpp_client_logs_volume - bpp_network_config_volume: - name: bpp_network_config_volume - external: true - bpp_network_schemas_volume: - name: bpp_network_schemas_volume - bpp_network_logs_volume: - name: bpp_network_logs_volume diff --git a/install/docker-compose-gateway.yml b/install/docker-compose-gateway.yml deleted file mode 100644 index c45ca9a..0000000 --- a/install/docker-compose-gateway.yml +++ /dev/null @@ -1,30 +0,0 @@ -services: - gateway: - image: fidedocker/gateway - container_name: gateway - platform: linux/amd64 - networks: - - beckn_network - ports: - - 4000:4000 - - 4030:4030 - restart: unless-stopped - volumes: - - gateway_data_volume:/gateway/overrideProperties/config - - gateway_database_volume:/gateway/database - - gateway_logs_volume:/gateway/tmp - -networks: - beckn_network: - name: beckn_network - driver: bridge - -volumes: - gateway_data_volume: - name: gateway_data_volume - external: true - gateway_database_volume: - name: gateway_database_volume - external: true - gateway_logs_volume: - name: gateway_logs_volume diff --git a/install/docker-compose-gcl.yml b/install/docker-compose-gcl.yml deleted file mode 100644 index aa0953c..0000000 --- a/install/docker-compose-gcl.yml +++ /dev/null @@ -1,119 +0,0 @@ -services: - registry: - image: fidedocker/registry - container_name: registry - platform: linux/amd64 - networks: - - beckn_network - ports: - - 3000:3000 - - 3030:3030 - restart: unless-stopped - volumes: - - registry_data_volume:/registry/overrideProperties/config - - registry_database_volume:/registry/database - - gateway: - image: fidedocker/gateway - container_name: gateway - platform: linux/amd64 - networks: - - beckn_network - ports: - - 4000:4000 - - 4030:4030 - restart: unless-stopped - volumes: - - gateway_data_volume:/gateway/overrideProperties/config - - gateway_database_volume:/gateway/database - - bap-client: - image: fidedocker/protocol-server - container_name: bap-client - platform: linux/amd64 - networks: - - beckn_network - ports: - - 5001:5001 - restart: unless-stopped - volumes: - - ./protocol-server-data/bap-client.yml:/usr/src/app/config/default.yml - - bap-network: - image: fidedocker/protocol-server - container_name: bap-network - platform: linux/amd64 - networks: - - beckn_network - ports: - - 5002:5002 - restart: unless-stopped - volumes: - - ./protocol-server-data/bap-network.yml:/usr/src/app/config/default.yml - - sandbox-api: - image: fidedocker/sandbox-api - container_name: sandbox-api - platform: linux/amd64 - networks: - - beckn_network - ports: - - 4010:4000 - restart: unless-stopped - volumes: - - ./ENV/.env-sandbox:/usr/src/app/.env - - bpp-client: - image: fidedocker/protocol-server - container_name: bpp-client - platform: linux/amd64 - networks: - - beckn_network - ports: - - 6001:6001 - restart: unless-stopped - volumes: - - ./protocol-server-data/bpp-client.yml:/usr/src/app/config/default.yml - - bpp-network: - image: fidedocker/protocol-server - container_name: bpp-network - platform: linux/amd64 - networks: - - beckn_network - ports: - - 6002:6002 - restart: unless-stopped - volumes: - - ./protocol-server-data/bpp-network.yml:/usr/src/app/config/default.yml - - generic-client-layer: - image: fidedocker/generic-client-layer - container_name: generic-client-layer - platform: linux/amd64 - networks: - - beckn_network - ports: - - 3015:3000 - restart: unless-stopped - volumes: - - ./ENV/.env-generic-client-layer:/app/.env - -networks: - beckn_network: - name: beckn_network - driver: bridge - -volumes: - registry_data_volume: - name: registry_data_volume - external: true - registry_database_volume: - name: registry_database_volume - external: true - gateway_data_volume: - name: gateway_data_volume - external: true - gateway_database_volume: - name: gateway_database_volume - external: true diff --git a/install/docker-compose-registry.yml b/install/docker-compose-registry.yml deleted file mode 100644 index f90ce56..0000000 --- a/install/docker-compose-registry.yml +++ /dev/null @@ -1,30 +0,0 @@ -services: - registry: - image: fidedocker/registry - container_name: registry - platform: linux/amd64 - networks: - - beckn_network - ports: - - 3000:3000 - - 3030:3030 - restart: unless-stopped - volumes: - - registry_data_volume:/registry/overrideProperties/config - - registry_database_volume:/registry/database - - registry_logs_volume:/registry/tmp - -networks: - beckn_network: - name: beckn_network - driver: bridge - -volumes: - registry_data_volume: - name: registry_data_volume - external: true - registry_database_volume: - name: registry_database_volume - external: true - registry_logs_volume: - name: registry_logs_volume diff --git a/install/docker-compose-v2.yml b/install/docker-compose-v2.yml deleted file mode 100644 index aa0953c..0000000 --- a/install/docker-compose-v2.yml +++ /dev/null @@ -1,119 +0,0 @@ -services: - registry: - image: fidedocker/registry - container_name: registry - platform: linux/amd64 - networks: - - beckn_network - ports: - - 3000:3000 - - 3030:3030 - restart: unless-stopped - volumes: - - registry_data_volume:/registry/overrideProperties/config - - registry_database_volume:/registry/database - - gateway: - image: fidedocker/gateway - container_name: gateway - platform: linux/amd64 - networks: - - beckn_network - ports: - - 4000:4000 - - 4030:4030 - restart: unless-stopped - volumes: - - gateway_data_volume:/gateway/overrideProperties/config - - gateway_database_volume:/gateway/database - - bap-client: - image: fidedocker/protocol-server - container_name: bap-client - platform: linux/amd64 - networks: - - beckn_network - ports: - - 5001:5001 - restart: unless-stopped - volumes: - - ./protocol-server-data/bap-client.yml:/usr/src/app/config/default.yml - - bap-network: - image: fidedocker/protocol-server - container_name: bap-network - platform: linux/amd64 - networks: - - beckn_network - ports: - - 5002:5002 - restart: unless-stopped - volumes: - - ./protocol-server-data/bap-network.yml:/usr/src/app/config/default.yml - - sandbox-api: - image: fidedocker/sandbox-api - container_name: sandbox-api - platform: linux/amd64 - networks: - - beckn_network - ports: - - 4010:4000 - restart: unless-stopped - volumes: - - ./ENV/.env-sandbox:/usr/src/app/.env - - bpp-client: - image: fidedocker/protocol-server - container_name: bpp-client - platform: linux/amd64 - networks: - - beckn_network - ports: - - 6001:6001 - restart: unless-stopped - volumes: - - ./protocol-server-data/bpp-client.yml:/usr/src/app/config/default.yml - - bpp-network: - image: fidedocker/protocol-server - container_name: bpp-network - platform: linux/amd64 - networks: - - beckn_network - ports: - - 6002:6002 - restart: unless-stopped - volumes: - - ./protocol-server-data/bpp-network.yml:/usr/src/app/config/default.yml - - generic-client-layer: - image: fidedocker/generic-client-layer - container_name: generic-client-layer - platform: linux/amd64 - networks: - - beckn_network - ports: - - 3015:3000 - restart: unless-stopped - volumes: - - ./ENV/.env-generic-client-layer:/app/.env - -networks: - beckn_network: - name: beckn_network - driver: bridge - -volumes: - registry_data_volume: - name: registry_data_volume - external: true - registry_database_volume: - name: registry_database_volume - external: true - gateway_data_volume: - name: gateway_data_volume - external: true - gateway_database_volume: - name: gateway_database_volume - external: true diff --git a/install/docker-compose.yml b/install/docker-compose.yml deleted file mode 100644 index deeec38..0000000 --- a/install/docker-compose.yml +++ /dev/null @@ -1,103 +0,0 @@ -services: - registry: - image: fidedocker/registry - container_name: registry - networks: - - beckn_network - ports: - - 3000:3000 - - 3030:3030 - restart: unless-stopped - volumes: - - ./registry_data/config/swf.properties:/registry/overrideProperties/config/swf.properties - - ./registry_data/database:/registry/database - - gateway: - image: fidedocker/gateway - depends_on: - - registry - container_name: gateway - networks: - - beckn_network - ports: - - 4000:4000 - - 4030:4030 - restart: unless-stopped - volumes: - - ./gateway_data/config/swf.properties:/gateway/overrideProperties/config/swf.properties - - ./gateway_data/database:/gateway/database - - bap-client: - image: fidedocker/protocol-server - depends_on: - - registry - - gateway - container_name: bap-client - networks: - - beckn_network - ports: - - 5001:5001 - restart: unless-stopped - volumes: - - ./protocol-server-data/bap-client.yml:/usr/src/app/config/default.yml - - bap-network: - image: fidedocker/protocol-server - depends_on: - - registry - - gateway - container_name: bap-network - networks: - - beckn_network - ports: - - 5002:5002 - restart: unless-stopped - volumes: - - ./protocol-server-data/bap-network.yml:/usr/src/app/config/default.yml - - sandbox-api: - image: fidedocker/sandbox-api - depends_on: - - registry - - gateway - container_name: sandbox-api - networks: - - beckn_network - ports: - - 4010:4000 - restart: unless-stopped - volumes: - - ./ENV/.env-sandbox:/usr/src/app/.env - - bpp-client: - image: fidedocker/protocol-server - depends_on: - - registry - - gateway - container_name: bpp-client - networks: - - beckn_network - ports: - - 6001:6001 - restart: unless-stopped - volumes: - - ./protocol-server-data/bpp-client.yml:/usr/src/app/config/default.yml - - bpp-network: - image: fidedocker/protocol-server - depends_on: - - registry - - gateway - container_name: bpp-network - networks: - - beckn_network - ports: - - 6002:6002 - restart: unless-stopped - volumes: - - ./protocol-server-data/bpp-network.yml:/usr/src/app/config/default.yml - -networks: - beckn_network: - name: beckn_network - driver: bridge diff --git a/install/gateway_data/config/envvars b/install/gateway_data/config/envvars deleted file mode 100644 index b078dd9..0000000 --- a/install/gateway_data/config/envvars +++ /dev/null @@ -1,2 +0,0 @@ -export dport=4000 -export wport=4030 diff --git a/install/gateway_data/config/logger.properties b/install/gateway_data/config/logger.properties deleted file mode 100644 index a9711be..0000000 --- a/install/gateway_data/config/logger.properties +++ /dev/null @@ -1,20 +0,0 @@ -com.venky.core.log.InfoFileHandler.limit=500000 -com.venky.core.log.InfoFileHandler.count=2 -com.venky.core.log.InfoFileHandler.formatter=java.util.logging.SimpleFormatter -com.venky.core.log.InfoFileHandler.pattern=tmp/java_info%u.log -com.venky.core.log.InfoFileHandler.level=ALL - -com.venky.core.log.WarningFileHandler.limit=500000 -com.venky.core.log.WarningFileHandler.count=2 -com.venky.core.log.WarningFileHandler.formatter=java.util.logging.SimpleFormatter -com.venky.core.log.WarningFileHandler.pattern=tmp/java_warn%u.log -com.venky.core.log.WarningFileHandler.level=WARNING - - -handlers=com.venky.core.log.WarningFileHandler com.venky.core.log.InfoFileHandler -logger.useParentHandlers=false - -.level=INFO -com.venky.swf.plugins.background.core.level=FINEST -com.venky.swf.db.Database.level=FINEST -#com.venky.core.log.TimerStatistics.level=FINE diff --git a/install/gateway_data/config/networks/onix.json b/install/gateway_data/config/networks/onix.json deleted file mode 100644 index 2bb446a..0000000 --- a/install/gateway_data/config/networks/onix.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "core_version" : "1.1.0", - "registry_id": "registry-dev.becknprotocol.io..LREG", - "search_provider_id" : "gateway-dev.becknprotocol.io", - "self_registration_supported": true, - "subscription_needed_post_registration" : true, - "base_url": "https://registry-dev.becknprotocol.io", - "registry_url" : "https://registry-dev.becknprotocol.io/subscribers", - "extension_package": "in.succinct.beckn.boc", - "wild_card" : "" -} \ No newline at end of file diff --git a/install/gateway_data/config/networks/onix.json-sample b/install/gateway_data/config/networks/onix.json-sample deleted file mode 100644 index 8990d63..0000000 --- a/install/gateway_data/config/networks/onix.json-sample +++ /dev/null @@ -1,11 +0,0 @@ -{ - "core_version" : "1.1.0", - "registry_id": "REGISTRY_ID..LREG", - "search_provider_id" : "GATEWAY_ID", - "self_registration_supported": true, - "subscription_needed_post_registration" : true, - "base_url": "REGISTRY_URL", - "registry_url" : "REGISTRY_URL/subscribers", - "extension_package": "in.succinct.beckn.boc", - "wild_card" : "" -} diff --git a/install/gateway_data/config/swf.properties-sample b/install/gateway_data/config/swf.properties-sample deleted file mode 100644 index 64c1c08..0000000 --- a/install/gateway_data/config/swf.properties-sample +++ /dev/null @@ -1,43 +0,0 @@ -swf.load.complete.config.tables.if.count.less.than=500 -swf.user.password.encrypted=false -swf.plugins.background.core.workers.numThreads=1 -swf.application.authentication.required=false - -swf.encryption.support=false -swf.key.store.directory=./.keystore -swf.key.store.password=venky12 -swf.key.entry.succinct.password=succinct12 - - -swf.host=GATEWAY_URL -swf.external.port=GATEWAY_PORT -swf.external.scheme=PROTOCOL - -swf.jdbc.driver=org.h2.Driver -swf.jdbc.url=jdbc:h2:./database/standalone;AUTO_SERVER=TRUE; -swf.jdbc.userid=standalone -swf.jdbc.password=standalone -swf.jdbc.validationQuery=values(1) -swf.jdbc.dbschema=PUBLIC -swf.jdbc.dbschema.setonconnection=true -swf.jdbc.set.dbschema.command=set schema public - - -# These keys are needed if you want to in.succinct.beckn.gateway.subscriber_iduse push notifications. -# you can generate this from https://d3v.one/vapid-key-generator/ or similiar sites. -# you also need to specify the public key in src/main/resources/scripts/application.js - -#push.server.private.key=your_private_key -#push.server.public.key=your_public_key - -## Beckn Gateway configurations. - -beckn.auth.enabled=true - -in.succinct.beckn.gateway.subscriber_id=SUBSCRIBER_ID -in.succinct.beckn.gateway.public_key_id=SUBSCRIBER_ID.k1 - - -in.succinct.onet.country.iso.3=IND -in.succinct.onet.country.iso.2=IN -in.succinct.onet.name=onix diff --git a/install/gateway_data/database/.gitignore b/install/gateway_data/database/.gitignore deleted file mode 100644 index 38d6f13..0000000 --- a/install/gateway_data/database/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -docker_data -gateway_data/config/swf.properties -registry_data/config/swf.properties -.vscode -protocol-server-data/bap-client.yml -protocol-server-data/bap-network.yml -protocol-server-data/bpp-client.yml -protocol-server-data/bpp-network.yml -ENV/.env-generic-client-layer -registry.lock* -gateway.lock* diff --git a/install/onix_ascii_art.txt b/install/onix_ascii_art.txt deleted file mode 100644 index f8975a8..0000000 --- a/install/onix_ascii_art.txt +++ /dev/null @@ -1,27 +0,0 @@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@::;;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:;;;;:;;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@;;::;:::;;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@......@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@;:;;;;:;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@::::@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@..................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@.........,,::,,.........@@@@@........@@.......@@@@@@@........@.........@@@@@........@@@@@@@ -@@@@@@.........,,::;;;;::,.........@@@...................@@@@@........@..........@@@.........@@@@@@@ -@@@@@@.......,::;;;:,::;;;::,......@@@....................@@@@........@@..........@.........@@@@@@@@ -@@@@@@.....,:;;;::,....,::;;;:,....@@@.....................@@@........@@@..................@@@@@@@@@ -@@@@@@.....:;;:,..........,:;;,....@@@.....................@@@........@@@@................@@@@@@@@@@ -@@@@@@.....:;;:............:;;,....@@@........@@@@@........@@@........@@@@@@.............@@@@@@@@@@@ -@@@@@@.....:;;:............:;;,....@@@........@@@@@........@@@........@@@@@@@..........@@@@@@@@@@@@@ -@@@@@@.....:;;:............:;;,....@@@........@@@@@........@@@........@@@@@@............@@@@@@@@@@@@ -@@@@@@.....:;;:............:;;,....@@@........@@@@@........@@@........@@@@@..............@@@@@@@@@@@ -@@@@@@.....,;;;:,,......,::;;;,....@@@........@@@@@........@@@........@@@@................@@@@@@@@@@ -@@@@@@......,::;;;:,,,::;;;::,.....@@@........@@@@@........@@@........@@@..................@@@@@@@@@ -@@@@@@........,,:;;;;;;;::,........@@@........@@@@@........@@@........@@.........@@.........@@@@@@@@ -@@@@@@@@.........,,::::,,.........@@@@........@@@@@........@@@........@.........@@@@.........@@@@@@@ -@@@@@@@@@@@.........,..........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@..............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@...@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - - diff --git a/install/protocol-server-data/bap-client.yaml-sample b/install/protocol-server-data/bap-client.yaml-sample deleted file mode 100644 index ad3e1cc..0000000 --- a/install/protocol-server-data/bap-client.yaml-sample +++ /dev/null @@ -1,138 +0,0 @@ -# Mandatory -server: - port: BAP_CLIENT_PORT - -# Mandatory. -cache: - host: "REDIS_URL" - port: 6379 - ttl: "PT10M" - # Optional. Default is 0. - db: 1 - -# Optional. -responseCache: - mongoURL: "mongodb://MONGO_USERNAME:MONGO_PASSWORD@MONOG_URL/MONGO_DB_NAME?authSource=admin" - ttl: "PT10M" - -# Mandatory. -# Priority order will be -# 1. Synchronous -# 2. webhook -# 3. pubSub -client: - synchronous: - mongoURL: "mongodb://MONGO_USERNAME:MONGO_PASSWORD@MONOG_URL/MONGO_DB_NAME?authSource=admin" - - #webhook: - # url: "https://beckn.free.beeceptor.com/clientURL" - - #messageQueue: - # amqpURL: "amqp://guest:guest@localhost:5672" - # incomingQueue: "protocol-server-incoming" - # outgoingQueue: "protocol-server-outgoing" - -# Mandatory. -app: - # Mandatory. - mode: bap - - # Two types of gateway mode present. - # client and network. - gateway: - mode: client - inboxQueue: "inbox" - outboxQueue: "outbox" - amqpURL: "amqp://RABBITMQ_USERNAME:RABBITMQ_PASSWORD@RABBITMQ_URL:5672" - - # Mandatory. - actions: - requests: - search: - ttl : "PT15S" - init: - ttl : "PT10S" - select: - ttl : "PT10S" - confirm: - ttl : "PT10S" - status: - ttl : "PT10S" - track: - ttl : "PT10S" - cancel: - ttl : "PT10S" - update: - ttl : "PT10S" - rating: - ttl : "PT10S" - support: - ttl : "PT10S" - get_cancellation_reasons: - ttl : "PT10S" - get_rating_categories: - ttl : "PT10S" - cancellation: - ttl : "PT10S" - - responses: - on_search: - ttl: "PT15S" - on_init: - ttl: "PT10S" - on_select: - ttl: "PT10S" - on_confirm: - ttl: "PT10S" - on_status: - ttl: "PT10S" - on_track: - ttl: "PT10S" - on_cancel: - ttl: "PT10S" - on_update: - ttl: "PT10S" - on_rating: - ttl: "PT10S" - on_support: - ttl: "PT10S" - cancellation_reasons: - ttl: "PT10S" - rating_categories: - ttl: "PT10S" - - # Mandatory. - privateKey: "PRIVATE_KEY" - publicKey: "PUBLIC_KEY" - - # Mandatory. - subscriberId: "BAP_SUBSCRIBER_ID" - subscriberUri: "BAP_SUBSCRIBER_URL" - - # Mandatory. - registryUrl: REGISTRY_URL - auth: false - uniqueKey: "BAP_SUBSCRIBER_KEY_ID" - - # Mandatory. - city: "std:080" - country: "IND" - - # Mandatory. - ttl: "PT10M" - - # Mandatory. - httpTimeout: "PT3S" - httpRetryCount: 2 - telemetry: - enabled: false - url: "" - batchSize: 100 - # In minutes - syncInterval: 30 - redis_db: 3 - - useLayer2Config: USE_LAYER_2_CONFIG - mandateLayer2Config: MANDATE_LAYER_2_CONFIG - - diff --git a/install/protocol-server-data/bap-network.yaml-sample b/install/protocol-server-data/bap-network.yaml-sample deleted file mode 100644 index 8ed78c1..0000000 --- a/install/protocol-server-data/bap-network.yaml-sample +++ /dev/null @@ -1,136 +0,0 @@ -# Mandatory -server: - port: BAP_NETWORK_PORT - -# Mandatory. -cache: - host: "REDIS_URL" - port: 6379 - ttl: "PT10M" - # Optional. Default is 0. - db: 1 - -# Optional. -responseCache: - mongoURL: "mongodb://MONGO_USERNAME:MONGO_PASSWORD@MONOG_URL/MONGO_DB_NAME?authSource=admin" - ttl: "PT10M" - -# Mandatory. -# Priority order will be -# 1. Synchronous -# 2. webhook -# 3. pubSub -client: - synchronous: - mongoURL: "mongodb://MONGO_USERNAME:MONGO_PASSWORD@MONOG_URL/MONGO_DB_NAME?authSource=admin" - - #webhook: - # url: "https://beckn.free.beeceptor.com/clientURL" - - #messageQueue: - # amqpURL: "amqp://guest:guest@localhost:5672" - # incomingQueue: "protocol-server-incoming" - # outgoingQueue: "protocol-server-outgoing" - -# Mandatory. -app: - # Mandatory. - mode: bap - - # Two types of gateway mode present. - # client and network. - gateway: - mode: network - inboxQueue: "inbox" - outboxQueue: "outbox" - amqpURL: "amqp://RABBITMQ_USERNAME:RABBITMQ_PASSWORD@RABBITMQ_URL:5672" - - # Mandatory. - actions: - requests: - search: - ttl : "PT15S" - init: - ttl : "PT10S" - select: - ttl : "PT10S" - confirm: - ttl : "PT10S" - status: - ttl : "PT10S" - track: - ttl : "PT10S" - cancel: - ttl : "PT10S" - update: - ttl : "PT10S" - rating: - ttl : "PT10S" - support: - ttl : "PT10S" - get_cancellation_reasons: - ttl : "PT10S" - get_rating_categories: - ttl : "PT10S" - cancellation: - ttl : "PT10S" - - responses: - on_search: - ttl: "PT15S" - on_init: - ttl: "PT10S" - on_select: - ttl: "PT10S" - on_confirm: - ttl: "PT10S" - on_status: - ttl: "PT10S" - on_track: - ttl: "PT10S" - on_cancel: - ttl: "PT10S" - on_update: - ttl: "PT10S" - on_rating: - ttl: "PT10S" - on_support: - ttl: "PT10S" - cancellation_reasons: - ttl: "PT10S" - rating_categories: - ttl: "PT10S" - - # Mandatory. - privateKey: "PRIVATE_KEY" - publicKey: "PUBLIC_KEY" - - # Mandatory. - subscriberId: "BAP_SUBSCRIBER_ID" - subscriberUri: "BAP_SUBSCRIBER_URL" - - # Mandatory. - registryUrl: REGISTRY_URL - auth: false - uniqueKey: "BAP_SUBSCRIBER_KEY_ID" - - # Mandatory. - city: "std:080" - country: "IND" - - # Mandatory. - ttl: "PT10M" - - # Mandatory. - httpTimeout: "PT3S" - httpRetryCount: 2 - telemetry: - enabled: false - url: "" - batchSize: 100 - # In minutes - syncInterval: 30 - redis_db: 3 - - useLayer2Config: USE_LAYER_2_CONFIG - mandateLayer2Config: MANDATE_LAYER_2_CONFIG \ No newline at end of file diff --git a/install/protocol-server-data/bpp-client.yaml-sample b/install/protocol-server-data/bpp-client.yaml-sample deleted file mode 100644 index 2da36ac..0000000 --- a/install/protocol-server-data/bpp-client.yaml-sample +++ /dev/null @@ -1,134 +0,0 @@ -# Mandatory -server: - port: BPP_CLIENT_PORT - -# Mandatory. -cache: - host: "REDIS_URL" - port: 6379 - ttl: "PT10M" - # Optional. Default is 0. - db: 0 - -# Optional. -responseCache: - mongoURL: "mongodb://MONGO_USERNAME:MONGO_PASSWORD@MONOG_URL/MONGO_DB_NAME?authSource=admin" - ttl: "PT10M" - -# Mandatory. -# Priority order will be -# 1. Synchronous -# 2. webhook -# 3. pubSub -client: -# synchronous: -# mongoURL: "mongodb://tvast:password@mongoDB:27017/ps?authSource=admin" - - webhook: - url: "WEBHOOK_URL" - - #messageQueue: - # amqpURL: "amqp://guest:guest@localhost:5672" - # incomingQueue: "protocol-server-incoming" - # outgoingQueue: "protocol-server-outgoing" - -# Mandatory. -app: - # Mandatory. - mode: bpp - - # Two types of gateway mode present. - # client and network. - gateway: - mode: client - inboxQueue: "inbox-bpp" - outboxQueue: "outbox-bpp" - amqpURL: "amqp://RABBITMQ_USERNAME:RABBITMQ_PASSWORD@RABBITMQ_URL:5672" - - # Mandatory. - actions: - requests: - search: - ttl : "PT15S" - init: - ttl : "PT10S" - select: - ttl : "PT10S" - confirm: - ttl : "PT10S" - status: - ttl : "PT10S" - track: - ttl : "PT10S" - cancel: - ttl : "PT10S" - update: - ttl : "PT10S" - rating: - ttl : "PT10S" - support: - ttl : "PT10S" - get_cancellation_reasons: - ttl: "PT10S" - get_rating_categories: - ttl: "PT10S" - - responses: - on_search: - ttl: "PT15S" - on_init: - ttl: "PT10S" - on_select: - ttl: "PT10S" - on_confirm: - ttl: "PT10S" - on_status: - ttl: "PT10S" - on_track: - ttl: "PT10S" - on_cancel: - ttl: "PT10S" - on_update: - ttl: "PT10S" - on_rating: - ttl: "PT10S" - on_support: - ttl: "PT10S" - cancellation_reasons: - ttl: "PT10S" - rating_categories: - ttl: "PT10S" - - # Mandatory. - privateKey: "PRIVATE_KEY" - publicKey: "PUBLIC_KEY" - - # Mandatory. - subscriberId: "BPP_SUBSCRIBER_ID" - subscriberUri: "BPP_SUBSCRIBER_URL" - - # Mandatory. - registryUrl: REGISTRY_URL - auth: true - uniqueKey: "BPP_SUBSCRIBER_KEY_ID" - - # Mandatory. - city: "std:080" - country: "IND" - - # Mandatory. - ttl: "PT10M" - - # Mandatory. - httpTimeout: "PT3S" - httpRetryCount: 2 - telemetry: - enabled: false - url: "" - batchSize: 100 - # In minutes - syncInterval: 30 - redis_db: 3 - - useLayer2Config: USE_LAYER_2_CONFIG - mandateLayer2Config: MANDATE_LAYER_2_CONFIG \ No newline at end of file diff --git a/install/protocol-server-data/bpp-network.yaml-sample b/install/protocol-server-data/bpp-network.yaml-sample deleted file mode 100644 index ce7623b..0000000 --- a/install/protocol-server-data/bpp-network.yaml-sample +++ /dev/null @@ -1,134 +0,0 @@ -# Mandatory -server: - port: BPP_NETWORK_PORT - -# Mandatory. -cache: - host: "REDIS_URL" - port: 6379 - ttl: "PT10M" - # Optional. Default is 0. - db: 0 - -# Optional. -responseCache: - mongoURL: "mongodb://MONGO_USERNAME:MONGO_PASSWORD@MONOG_URL/MONGO_DB_NAME?authSource=admin" - ttl: "PT10M" - -# Mandatory. -# Priority order will be -# 1. Synchronous -# 2. webhook -# 3. pubSub -client: -# synchronous: -# mongoURL: "mongodb://tvast:password@mongoDB:27017/ps?authSource=admin" - - webhook: - url: "WEBHOOK_URL" - - #messageQueue: - # amqpURL: "amqp://guest:guest@localhost:5672" - # incomingQueue: "protocol-server-incoming" - # outgoingQueue: "protocol-server-outgoing" - -# Mandatory. -app: - # Mandatory. - mode: bpp - - # Two types of gateway mode present. - # client and network. - gateway: - mode: network - inboxQueue: "inbox-bpp" - outboxQueue: "outbox-bpp" - amqpURL: "amqp://RABBITMQ_USERNAME:RABBITMQ_PASSWORD@RABBITMQ_URL:5672" - - # Mandatory. - actions: - requests: - search: - ttl : "PT15S" - init: - ttl : "PT10S" - select: - ttl : "PT10S" - confirm: - ttl : "PT10S" - status: - ttl : "PT10S" - track: - ttl : "PT10S" - cancel: - ttl : "PT10S" - update: - ttl : "PT10S" - rating: - ttl : "PT10S" - support: - ttl : "PT10S" - get_cancellation_reasons: - ttl: "PT10S" - get_rating_categories: - ttl: "PT10S" - - responses: - on_search: - ttl: "PT15S" - on_init: - ttl: "PT10S" - on_select: - ttl: "PT10S" - on_confirm: - ttl: "PT10S" - on_status: - ttl: "PT10S" - on_track: - ttl: "PT10S" - on_cancel: - ttl: "PT10S" - on_update: - ttl: "PT10S" - on_rating: - ttl: "PT10S" - on_support: - ttl: "PT10S" - cancellation_reasons: - ttl: "PT10S" - rating_categories: - ttl: "PT10S" - - # Mandatory. - privateKey: "PRIVATE_KEY" - publicKey: "PUBLIC_KEY" - - # Mandatory. - subscriberId: "BPP_SUBSCRIBER_ID" - subscriberUri: "BPP_SUBSCRIBER_URL" - - # Mandatory. - registryUrl: REGISTRY_URL - auth: true - uniqueKey: "BPP_SUBSCRIBER_KEY_ID" - - # Mandatory. - city: "std:080" - country: "IND" - - # Mandatory. - ttl: "PT10M" - - # Mandatory. - httpTimeout: "PT3S" - httpRetryCount: 2 - telemetry: - enabled: false - url: "" - batchSize: 100 - # In minutes - syncInterval: 30 - redis_db: 3 - - useLayer2Config: USE_LAYER_2_CONFIG - mandateLayer2Config: MANDATE_LAYER_2_CONFIG \ No newline at end of file diff --git a/install/registry_data/config/envvars b/install/registry_data/config/envvars deleted file mode 100644 index 0965d04..0000000 --- a/install/registry_data/config/envvars +++ /dev/null @@ -1,2 +0,0 @@ -export dport=3000 -export wport=3030 diff --git a/install/registry_data/config/logger.properties b/install/registry_data/config/logger.properties deleted file mode 100644 index a9711be..0000000 --- a/install/registry_data/config/logger.properties +++ /dev/null @@ -1,20 +0,0 @@ -com.venky.core.log.InfoFileHandler.limit=500000 -com.venky.core.log.InfoFileHandler.count=2 -com.venky.core.log.InfoFileHandler.formatter=java.util.logging.SimpleFormatter -com.venky.core.log.InfoFileHandler.pattern=tmp/java_info%u.log -com.venky.core.log.InfoFileHandler.level=ALL - -com.venky.core.log.WarningFileHandler.limit=500000 -com.venky.core.log.WarningFileHandler.count=2 -com.venky.core.log.WarningFileHandler.formatter=java.util.logging.SimpleFormatter -com.venky.core.log.WarningFileHandler.pattern=tmp/java_warn%u.log -com.venky.core.log.WarningFileHandler.level=WARNING - - -handlers=com.venky.core.log.WarningFileHandler com.venky.core.log.InfoFileHandler -logger.useParentHandlers=false - -.level=INFO -com.venky.swf.plugins.background.core.level=FINEST -com.venky.swf.db.Database.level=FINEST -#com.venky.core.log.TimerStatistics.level=FINE diff --git a/install/registry_data/config/swf.properties-sample b/install/registry_data/config/swf.properties-sample deleted file mode 100644 index 1506f09..0000000 --- a/install/registry_data/config/swf.properties-sample +++ /dev/null @@ -1,43 +0,0 @@ -swf.load.complete.config.tables.if.count.less.than=500 -swf.user.password.encrypted=false -swf.plugins.background.core.workers.numThreads=3 -swf.application.authentication.required=false -swf.application.requires.registration=true - -#swf.host=localhost -swf.host=REGISTRY_URL -swf.external.port=REGISTRY_PORT -swf.external.scheme=PROTOCOL - - -swf.jdbc.driver=org.h2.Driver -swf.jdbc.url=jdbc:h2:./database/registry;AUTO_SERVER=TRUE; -swf.jdbc.userid=registry -swf.jdbc.password=registry -swf.jdbc.validationQuery=values(1) -swf.jdbc.dbschema=PUBLIC -swf.jdbc.dbschema.setonconnection=true -swf.jdbc.set.dbschema.command=set schema public - - -# These keys are needed if you want to use push notifications. -# you can generate this from https://d3v.one/vapid-key-generator/ or similiar sites. -# you also need to specify the public key in src/main/resources/scripts/application.js - -#push.server.private.key=your_private_key -#push.server.public.key=your_public_key - -swf.api.keys.case=SNAKE -swf.api.root.required=false - -# Needed for Google Login -#swf.GOOGLE.client.id= -#swf.GOOGLE.client.secret= - -swf.encryption.support=false -## Uncomment below if encryption is needed and set appropriate passwords -#swf.key.store.directory=./.keystore -#swf.key.store.password=venky12 -#swf.key.entry.succinct.password=succinct12 - -swf.ftl.dir=src/main/resources/templates \ No newline at end of file diff --git a/install/registry_data/database/.gitignore b/install/registry_data/database/.gitignore deleted file mode 100644 index 38d6f13..0000000 --- a/install/registry_data/database/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -docker_data -gateway_data/config/swf.properties -registry_data/config/swf.properties -.vscode -protocol-server-data/bap-client.yml -protocol-server-data/bap-network.yml -protocol-server-data/bpp-client.yml -protocol-server-data/bpp-network.yml -ENV/.env-generic-client-layer -registry.lock* -gateway.lock* diff --git a/install/scripts/banner.sh b/install/scripts/banner.sh deleted file mode 100755 index 1043418..0000000 --- a/install/scripts/banner.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -source $SCRIPT_DIR/variables.sh - -# Define the text to print in the banner -text=" - ###### ####### ##### # # # # - # # # # # # # ## # - # # # # # # # # # - ###### ##### # ### # # # - # # # # # # # # # - # # # # # # # # ## - ###### ####### ##### # # # # -" - -text2=" - ######## ######## ###### ## ## ## ## - ## ## ## ## ## ## ## ### ## - ## ## ## ## ## ## #### ## - ######## ###### ## ##### ## ## ## - ## ## ## ## ## ## ## #### - ## ## ## ## ## ## ## ## ### - ######## ######## ###### ## ## ## ## -" -# Clear the terminal screen -clear -echo "${GREEN}$text2${NC}" diff --git a/install/scripts/generate_keys.sh b/install/scripts/generate_keys.sh deleted file mode 100755 index 4f00306..0000000 --- a/install/scripts/generate_keys.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -source $SCRIPT_DIR/variables.sh - -# Run the script that generates keys and capture the output -get_keys() { - docker pull fidedocker/protocol-server > /dev/null 2>&1 - docker run --name temp -itd fidedocker/protocol-server > /dev/null 2>&1 - output=$(docker exec -i temp node /usr/src/app/scripts/generate-keys 2>&1) - docker stop temp > /dev/null 2>&1 - docker rm temp > /dev/null 2>&1 -# Check if the script executed successfully -if [ $? -eq 0 ]; then - # Extract Public Key and Private Key using grep and awk - public_key=$(echo "$output" | awk '/Your Public Key/ {getline; print $0}') - private_key=$(echo "$output" | awk '/Your Private Key/ {getline; print $0}') - # Remove leading and trailing whitespaces - public_key=$(echo "$public_key" | tr -d '[:space:]') - private_key=$(echo "$private_key" | tr -d '[:space:]') - -else - # Print an error message if the script failed - echo "${RED}Error: Key generation script failed. Please check the script output.${NC}" -fi -} - -#get_keys diff --git a/install/scripts/generic-client-layer.sh b/install/scripts/generic-client-layer.sh deleted file mode 100755 index f8dc7f4..0000000 --- a/install/scripts/generic-client-layer.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -update_env_file(){ - cp ../ENV/.env-generic-client-layer-sample ../ENV/.env-generic-client-layer - envFile=../ENV/.env-generic-client-layer - bap_subscriber_id=$1 - bap_subscriber_url=$2 - bap_client_url=$3 - - if [[ $(uname) == "Darwin" ]]; then - sed -i '' "s|BAP_SUBSCRIBER_ID|$bap_subscriber_id|" $envFile - sed -i '' "s|BAP_SUBSCRIBER_URL|$bap_subscriber_url|" $envFile - sed -i '' "s|BAP_CLIENT_URL|$bap_client_url|" $envFile - else - sed -i "s|BAP_SUBSCRIBER_ID|$bap_subscriber_id|" $envFile - sed -i "s|BAP_SUBSCRIBER_URL|$bap_subscriber_url|" $envFile - sed -i "s|BAP_CLIENT_URL|$bap_client_url|" $envFile - fi - -} - -update_env_file $1 $2 $3 \ No newline at end of file diff --git a/install/scripts/get_container_details.sh b/install/scripts/get_container_details.sh deleted file mode 100755 index 4b093e6..0000000 --- a/install/scripts/get_container_details.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -get_container_ip() { - container_name=$1 - container_ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $container_name) - echo $container_ip -} - -#get_container_ip $1 \ No newline at end of file diff --git a/install/scripts/k8s/ConfigMap.yaml b/install/scripts/k8s/ConfigMap.yaml deleted file mode 100644 index 04ef557..0000000 --- a/install/scripts/k8s/ConfigMap.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: swf-config -data: - swf.properties: | - # Content of swf.properties file for registry diff --git a/install/scripts/k8s/deployment.yaml b/install/scripts/k8s/deployment.yaml deleted file mode 100644 index 012efed..0000000 --- a/install/scripts/k8s/deployment.yaml +++ /dev/null @@ -1,59 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: registry-deployment -spec: - replicas: 1 - selector: - matchLabels: - app: registry - template: - metadata: - labels: - app: registry - spec: - containers: - - name: registry - image: fidedocker/registry - ports: - - containerPort: 3000 - - containerPort: 3030 - volumeMounts: - - name: registry-data - mountPath: /registry - volumes: - - name: registry-data - hostPath: - path: /absolute/path/to/registry_data/ - ---- - -apiVersion: apps/v1 -kind: Deployment -metadata: - name: gateway-deployment -spec: - replicas: 1 - selector: - matchLabels: - app: gateway - template: - metadata: - labels: - app: gateway - spec: - containers: - - name: gateway - image: fidedocker/gateway - ports: - - containerPort: 4000 - - containerPort: 4030 - volumeMounts: - - name: gateway-data - mountPath: /gateway - volumes: - - name: gateway-data - hostPath: - path: /path/to/gateway_data - -# Repeat the above structure for other services diff --git a/install/scripts/k8s/ingress.yaml b/install/scripts/k8s/ingress.yaml deleted file mode 100644 index 67888e5..0000000 --- a/install/scripts/k8s/ingress.yaml +++ /dev/null @@ -1,24 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: beckn-ingress -spec: - rules: - - host: localhost - http: - paths: - - path: /registry - pathType: Prefix - backend: - service: - name: registry-service - port: - number: 3000 - - path: /gateway - pathType: Prefix - backend: - service: - name: gateway-service - port: - number: 4000 - # Repeat the above structure for other services diff --git a/install/scripts/k8s/service.yaml b/install/scripts/k8s/service.yaml deleted file mode 100644 index bdd818c..0000000 --- a/install/scripts/k8s/service.yaml +++ /dev/null @@ -1,33 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: registry-service -spec: - selector: - app: registry - ports: - - protocol: TCP - port: 3000 - targetPort: 3000 - - protocol: TCP - port: 3030 - targetPort: 3030 - ---- - -apiVersion: v1 -kind: Service -metadata: - name: gateway-service -spec: - selector: - app: gateway - ports: - - protocol: TCP - port: 4000 - targetPort: 4000 - - protocol: TCP - port: 4030 - targetPort: 4030 - -# Repeat the above structure for other services diff --git a/install/scripts/package_manager.sh b/install/scripts/package_manager.sh deleted file mode 100755 index b510879..0000000 --- a/install/scripts/package_manager.sh +++ /dev/null @@ -1,172 +0,0 @@ -#!/bin/bash -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -source $SCRIPT_DIR/variables.sh - -#Required packages list as below. -package_list=("docker" "docker-compose" "jq") - -command_exists() { - command -v "$1" &>/dev/null -} - -# Redirect input from /dev/null to silence prompts -export DEBIAN_FRONTEND=noninteractive -export APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=1 - - -#Install Package -install_package() { - if [ -x "$(command -v apt-get)" ]; then - # APT (Debian/Ubuntu) - if [ "$1" == "docker" ]; then - if ! docker --version > /dev/null 2>&1; then - if [ -f /etc/debian_version ]; then - curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg - echo "deb [signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null - else - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg - echo "deb [signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null - fi - sudo apt update >/dev/null 2>&1 - sudo apt install -y docker-ce docker-ce-cli containerd.io >/dev/null 2>&1 - sudo usermod -aG docker $USER - source ~/.bashrc - sudo systemctl enable docker.service - sudo systemctl restart docker.service - else - echo "Docker is already installed." - fi - else - if ! dpkg -l | grep -q "^ii $1 "; then - sudo apt-get update >/dev/null 2>&1 - sudo apt-get install -y $1 >/dev/null 2>&1 - else - echo "$1 is already installed." - fi - fi - elif [ -x "$(command -v yum)" ]; then - # YUM (Red Hat/CentOS/Amazon Linux) - if [ "$1" == "docker" ]; then - if ! docker --version > /dev/null 2>&1; then - if [ -f /etc/centos-release ]; then - sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo - elif [ -f /etc/redhat-release ]; then - sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo - elif grep -q "Amazon Linux release 2" /etc/system-release; then - sudo amazon-linux-extras install docker -y - elif grep -q "Amazon Linux release" /etc/system-release; then - sudo yum install -y docker - fi - sudo yum install -y docker-ce docker-ce-cli containerd.io >/dev/null 2>&1 - sudo usermod -aG docker $USER - source ~/.bashrc - sudo systemctl enable docker.service - sudo systemctl restart docker.service - else - echo "Docker is already installed." - fi - else - if ! rpm -qa | grep -q "^$1-"; then - sudo yum install -y $1 >/dev/null 2>&1 - else - echo "$1 is already installed." - fi - fi - elif [ -x "$(command -v amazon-linux-extras)" ]; then - # Amazon Linux 2 specific - if [ "$1" == "docker" ]; then - if ! docker --version > /dev/null 2>&1; then - sudo amazon-linux-extras install docker -y >/dev/null 2>&1 - sudo systemctl enable docker.service - sudo systemctl start docker.service - sudo usermod -aG docker $USER - source ~/.bashrc - else - echo "Docker is already installed." - fi - else - if ! amazon-linux-extras list | grep -q "$1"; then - sudo amazon-linux-extras install $1 -y >/dev/null 2>&1 - else - echo "$1 is already installed." - fi - fi - else - echo "Unsupported package manager. Please install $1 manually." - exit 1 - fi -} - - - -remove_package(){ - if [ -x "$(command -v apt-get)" ]; then - # APT (Debian/Ubuntu) - sudo apt-get purge -y $1 >/dev/null 2>&1 - sudo apt autoremove -y >/dev/null 2>&1 - elif [ -x "$(command -v yum)" ]; then - # YUM (Red Hat/CentOS) - sudo yum remove -y $1 >/dev/null 2>&1 - sudo yum autoremove -y >/dev/null 2>&1 - fi -} - -# Function to install Docker -install_docker_bash() { - # Install Docker Bash completion - echo "Installing Docker Bash completion..." - sudo curl -L https://raw.githubusercontent.com/docker/cli/master/contrib/completion/bash/docker -o /etc/bash_completion.d/docker -} - -# Function to install Docker Compose -install_docker_compose() { - command_exists docker-compose - if [ $? -eq 0 ]; then - echo "docker-compose is already installed." - return - else - echo "Installing Docker Compose..." - sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose - sudo chmod +x /usr/local/bin/docker-compose - fi - - # Check if Docker Compose installation was successful - if [ $? -eq 0 ]; then - echo "Docker Compose installed successfully." - else - echo "${RED}Failed to install Docker Compose. Exiting.${NC}" - exit 1 - fi - - if [ -f /etc/bash_completion.d/docker-compose ]; then - echo "Docker Compose Bash completion is already installed." - else - # Install Docker Compose Bash completion - echo "Installing Docker Compose Bash completion..." - sudo curl -L https://raw.githubusercontent.com/docker/compose/master/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose - fi -} - - -# Check if package is already installed - -for package in "${package_list[@]}"; do - if ! command_exists $package; then - install_package "$package" - fi - if [ "$package" == "docker" ]; then - if [[ $(uname -s ) == 'Linux' ]];then - if [ -f /etc/bash_completion.d/docker ]; then - echo "Docker Bash completion is already installed." - else - install_docker_bash - fi - fi - fi - if [ "$package" == "docker-compose" ]; then - if [[ $(uname -s ) == 'Linux' ]];then - install_docker_compose - fi - fi -done - diff --git a/install/scripts/register_gateway.sh b/install/scripts/register_gateway.sh deleted file mode 100755 index 3d19407..0000000 --- a/install/scripts/register_gateway.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -source $SCRIPT_DIR/get_container_details.sh - -register_gw() { -cookie_file="cookies.txt" -# Step 1: Perform login and save the session cookies to a file -curl --cookie-jar $cookie_file --request POST $login_url - -curl --request GET --cookie $cookie_file $subscribe_url -rm -rf $cookie_file -} - -if [[ $(uname -s) == 'Darwin' ]]; then - ip=localhost -elif [[ $(systemd-detect-virt) == 'wsl' ]]; then - ip=$(hostname -I | awk '{print $1}') -else - ip=$(get_container_ip gateway) -fi - -if [[ $1 ]]; then - if [[ $1 == https://* ]]; then - login_url="$1/login?name=root&password=root&_LOGIN=Login" - subscribe_url="$1/bg/subscribe" - register_gw - fi -else - login_url="http://$ip:4030/login?name=root&password=root&_LOGIN=Login" - subscribe_url="http://$ip:4030/bg/subscribe" - register_gw -fi diff --git a/install/scripts/registry_entry.sh b/install/scripts/registry_entry.sh deleted file mode 100755 index 0a8f66b..0000000 --- a/install/scripts/registry_entry.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/bash -source $SCRIPT_DIR/variables.sh - -create_network_participant() { - # Set your variables - registry_url="$1" - content_type="$2" - subscriber_id="$3" - pub_key_id="$4" - subscriber_url="$5" - encr_public_key="$6" - signing_public_key="$7" - valid_from="$8" - valid_until="$9" - type="${10}" - - json_data=$(cat <&1) - - if [ $? -eq 0 ]; then - - echo "${GREEN}Network Participant Entry is created. Please login to registry $registry_url and subscribe you Network Participant.${NC}" - else - echo "${RED}Error: $response${NC}" - fi -} diff --git a/install/scripts/update_bap_config.sh b/install/scripts/update_bap_config.sh deleted file mode 100755 index be65d06..0000000 --- a/install/scripts/update_bap_config.sh +++ /dev/null @@ -1,126 +0,0 @@ -#!/bin/bash -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -source $SCRIPT_DIR/registry_entry.sh -source $SCRIPT_DIR/generate_keys.sh -source $SCRIPT_DIR/variables.sh -source $SCRIPT_DIR/get_container_details.sh - - -newClientFile=$(echo "$bapClientFile" | sed 's/yaml-sample/yml/') -newNetworkFile=$(echo "$bapNetworkFile" | sed 's/yaml-sample/yml/') - -cp $bapClientFile $newClientFile -cp $bapNetworkFile $newNetworkFile - -clientFile=$newClientFile -networkFile=$newNetworkFile - -client_port=$bap_client_port -network_port=$bap_network_port - -if [[ $(uname) == "Darwin" ]]; then - sed -i '' "s|BAP_NETWORK_PORT|$network_port|" $networkFile - sed -i '' "s|BAP_CLIENT_PORT|$client_port|" $clientFile -else - sed -i "s|BAP_NETWORK_PORT|$network_port|" $networkFile - sed -i "s|BAP_CLIENT_PORT|$client_port|" $clientFile -fi - -if [[ $1 ]]; then - registry_url=$1 - bap_subscriber_id=$2 - bap_subscriber_key_id=$3 - bap_subscriber_url=$4 -else - if [[ $(uname -s) == 'Darwin' ]]; then - ip=localhost - registry_url="http://$ip:3030/subscribers" - elif [[ $(systemd-detect-virt) == 'wsl' ]]; then - ip=$(hostname -I | awk '{print $1}') - registry_url="http://$ip:3030/subscribers" - else - registry_url="http://$(get_container_ip registry):3030/subscribers" - fi -fi - -echo "Generating public/private key pair" -get_keys -echo "Your Private Key: $private_key" -echo "Your Public Key: $public_key" - - -if [[ $(uname -s ) == 'Darwin' ]];then - valid_from=$(date -u -v-1d +"%Y-%m-%dT%H:%M:%S.%000Z") - valid_until=$(date -u -v+3y +"%Y-%m-%dT%H:%M:%S.%000Z") -else - valid_from=$(date -u -d "-1 day" +"%Y-%m-%dT%H:%M:%S.%3NZ") - valid_until=$(date -u -d "+3 year" +"%Y-%m-%dT%H:%M:%S.%3NZ") -fi - -type=BAP - - -# Define an associative array for replacements -if [[ $(uname -s ) == 'Darwin' ]];then - replacements=( - "REDIS_URL=$redisUrl" - "REGISTRY_URL=$registry_url" - "MONGO_USERNAME=$mongo_initdb_root_username" - "MONGO_PASSWORD=$mongo_initdb_root_password" - "MONGO_DB_NAME=$mongo_initdb_database" - "MONOG_URL=$mongoUrl" - "RABBITMQ_USERNAME=$rabbitmq_default_user" - "RABBITMQ_PASSWORD=$rabbitmq_default_pass" - "RABBITMQ_URL=$rabbitmqUrl" - "PRIVATE_KEY=$private_key" - "PUBLIC_KEY=$public_key" - "BAP_SUBSCRIBER_ID=$bap_subscriber_id" - "BAP_SUBSCRIBER_URL=$bap_subscriber_url" - "BAP_SUBSCRIBER_KEY_ID=$bap_subscriber_key_id" - "USE_LAYER_2_CONFIG"=true - "MANDATE_LAYER_2_CONFIG"=true - ) - - echo "Configuring BAP protocol server" - # Apply replacements in both files - for file in "$clientFile" "$networkFile"; do - for line in "${replacements[@]}"; do - key=$(echo "$line" | cut -d '=' -f1) - value=$(echo "$line" | cut -d '=' -f2) - sed -i '' "s|$key|$value|" "$file" - done - - done -else - declare -A replacements=( - ["REDIS_URL"]=$redisUrl - ["REGISTRY_URL"]=$registry_url - ["MONGO_USERNAME"]=$mongo_initdb_root_username - ["MONGO_PASSWORD"]=$mongo_initdb_root_password - ["MONGO_DB_NAME"]=$mongo_initdb_database - ["MONOG_URL"]=$mongoUrl - ["RABBITMQ_USERNAME"]=$rabbitmq_default_user - ["RABBITMQ_PASSWORD"]=$rabbitmq_default_pass - ["RABBITMQ_URL"]=$rabbitmqUrl - ["PRIVATE_KEY"]=$private_key - ["PUBLIC_KEY"]=$public_key - ["BAP_SUBSCRIBER_ID"]=$bap_subscriber_id - ["BAP_SUBSCRIBER_URL"]=$bap_subscriber_url - ["BAP_SUBSCRIBER_KEY_ID"]=$bap_subscriber_key_id - ["USE_LAYER_2_CONFIG"]=true - ["MANDATE_LAYER_2_CONFIG"]=true - ) - - echo "Configuring BAP protocol server" - # Apply replacements in both files - for file in "$clientFile" "$networkFile"; do - for key in "${!replacements[@]}"; do - sed -i "s|$key|${replacements[$key]}|" "$file" - done - done -fi - -echo "Registering BAP protocol server on the registry" - -create_network_participant "$registry_url" "application/json" "$bap_subscriber_id" "$bap_subscriber_key_id" "$bap_subscriber_url" "$public_key" "$public_key" "$valid_from" "$valid_until" "$type" \ No newline at end of file diff --git a/install/scripts/update_bpp_config.sh b/install/scripts/update_bpp_config.sh deleted file mode 100755 index e20cc3a..0000000 --- a/install/scripts/update_bpp_config.sh +++ /dev/null @@ -1,132 +0,0 @@ -#!/bin/bash -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -source $SCRIPT_DIR/registry_entry.sh -source $SCRIPT_DIR/generate_keys.sh -source $SCRIPT_DIR/variables.sh -source $SCRIPT_DIR/get_container_details.sh - - -newClientFile=$(echo "$bppClientFile" | sed 's/yaml-sample/yml/') -newNetworkFile=$(echo "$bppNetworkFile" | sed 's/yaml-sample/yml/') - -cp $bppClientFile $newClientFile -cp $bppNetworkFile $newNetworkFile - -clientFile=$newClientFile -networkFile=$newNetworkFile - -client_port=$bpp_client_port -network_port=$bpp_network_port - -if [[ $(uname) == "Darwin" ]]; then - sed -i '' "s|BPP_NETWORK_PORT|$network_port|" $networkFile - sed -i '' "s|BPP_CLIENT_PORT|$client_port|" $clientFile -else - sed -i "s|BPP_NETWORK_PORT|$network_port|" $networkFile - sed -i "s|BPP_CLIENT_PORT|$client_port|" $clientFile -fi - -if [[ $1 ]]; then - registry_url=$1 - bpp_subscriber_id=$2 - bpp_subscriber_key_id=$3 - bpp_subscriber_url=$4 - webhook_url=$5 -else - if [[ $(uname -s) == 'Darwin' ]]; then - ip=localhost - registry_url="http://$ip:3030/subscribers" - elif [[ $(systemd-detect-virt) == 'wsl' ]]; then - ip=$(hostname -I | awk '{print $1}') - registry_url="http://$ip:3030/subscribers" - else - registry_url="http://$(get_container_ip registry):3030/subscribers" - fi -fi - -echo "Generating public/private key pair" -get_keys -#echo "Your Private Key: $private_key" -#echo "Your Public Key: $public_key" - - -if [[ $(uname -s ) == 'Darwin' ]];then - valid_from=$(date -u -v-1d +"%Y-%m-%dT%H:%M:%S.%000Z") - valid_until=$(date -u -v+3y +"%Y-%m-%dT%H:%M:%S.%000Z") -else - valid_from=$(date -u -d "-1 day" +"%Y-%m-%dT%H:%M:%S.%3NZ") - valid_until=$(date -u -d "+3 year" +"%Y-%m-%dT%H:%M:%S.%3NZ") -fi - -type=BPP - - -# Define an associative array for replacements -if [[ $(uname -s ) == 'Darwin' ]];then - replacements=( - "REDIS_URL=$redisUrl" - "REGISTRY_URL=$registry_url" - "MONGO_USERNAME=$mongo_initdb_root_username" - "MONGO_PASSWORD=$mongo_initdb_root_password" - "MONGO_DB_NAME=$mongo_initdb_database" - "MONOG_URL=$mongoUrl" - "RABBITMQ_USERNAME=$rabbitmq_default_user" - "RABBITMQ_PASSWORD=$rabbitmq_default_pass" - "RABBITMQ_URL=$rabbitmqUrl" - "PRIVATE_KEY=$private_key" - "PUBLIC_KEY=$public_key" - "BPP_SUBSCRIBER_URL=$bpp_subscriber_url" - "BPP_SUBSCRIBER_ID=$bpp_subscriber_id" - "BPP_SUBSCRIBER_KEY_ID=$bpp_subscriber_key_id" - "WEBHOOK_URL=$webhook_url" - "USE_LAYER_2_CONFIG"=true - "MANDATE_LAYER_2_CONFIG"=true - - ) - - echo "Configuring BPP protocol server" - # Apply replacements in both files - for file in "$clientFile" "$networkFile"; do - for line in "${replacements[@]}"; do - key=$(echo "$line" | cut -d '=' -f1) - value=$(echo "$line" | cut -d '=' -f2) - sed -i '' "s|$key|$value|" "$file" - done - - done - -else - declare -A replacements=( - ["REDIS_URL"]=$redisUrl - ["REGISTRY_URL"]=$registry_url - ["MONGO_USERNAME"]=$mongo_initdb_root_username - ["MONGO_PASSWORD"]=$mongo_initdb_root_password - ["MONGO_DB_NAME"]=$mongo_initdb_database - ["MONOG_URL"]=$mongoUrl - ["RABBITMQ_USERNAME"]=$rabbitmq_default_user - ["RABBITMQ_PASSWORD"]=$rabbitmq_default_pass - ["RABBITMQ_URL"]=$rabbitmqUrl - ["PRIVATE_KEY"]=$private_key - ["PUBLIC_KEY"]=$public_key - ["BPP_SUBSCRIBER_URL"]=$bpp_subscriber_url - ["BPP_SUBSCRIBER_ID"]=$bpp_subscriber_id - ["BPP_SUBSCRIBER_KEY_ID"]=$bpp_subscriber_key_id - ["WEBHOOK_URL"]=$webhook_url - ["USE_LAYER_2_CONFIG"]=true - ["MANDATE_LAYER_2_CONFIG"]=true - - ) - - echo "Configuring BPP protocol server" - # Apply replacements in both files - for file in "$clientFile" "$networkFile"; do - for key in "${!replacements[@]}"; do - sed -i "s|$key|${replacements[$key]}|" "$file" - done - done -fi - -echo "Registering BPP protocol server on the registry" - -create_network_participant "$registry_url" "application/json" "$bpp_subscriber_id" "$bpp_subscriber_key_id" "$bpp_subscriber_url" "$public_key" "$public_key" "$valid_from" "$valid_until" "$type" \ No newline at end of file diff --git a/install/scripts/update_gateway_details.sh b/install/scripts/update_gateway_details.sh deleted file mode 100755 index 5bcb187..0000000 --- a/install/scripts/update_gateway_details.sh +++ /dev/null @@ -1,120 +0,0 @@ -#!/bin/bash -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -source $SCRIPT_DIR/get_container_details.sh - -gateway_id=gateway -gateway_port=4030 -protocol=http -reg_url=http://$1:3030/subscribers/lookup -registry_id=registry -registry_url=http://registry:3030 - -update_network_json(){ - cp $SCRIPT_DIR/../gateway_data/config/networks/onix.json-sample $SCRIPT_DIR/../gateway_data/config/networks/onix.json - networks_config_file="$SCRIPT_DIR/../gateway_data/config/networks/onix.json" - tmp_file=$(mktemp "tempfile.XXXXXXXXXX") - sed " s|GATEWAY_ID|$gateway_id|g; s|REGISTRY_ID|$registry_id|g; s|REGISTRY_URL|$registry_url|g" "$networks_config_file" > "$tmp_file" - mv "$tmp_file" "$networks_config_file" - docker run --rm -v $SCRIPT_DIR/../gateway_data/config:/source -v gateway_data_volume:/target busybox cp -r /source/networks /target/ -} - -get_details_registry() { - # Make the curl request and store the output in a variable - response=$(curl --location --request POST "$reg_url" \ - --header 'Content-Type: application/json' \ - --data-raw '{ - "type": "LREG" -}') - # Check if the curl command was successful (HTTP status code 2xx) - if [ $? -eq 0 ]; then - # Extract signing_public_key and encr_public_key using jq - signing_public_key=$(echo "$response" | jq -r '.[0].signing_public_key') - encr_public_key=$(echo "$response" | jq -r '.[0].encr_public_key') - subscriber_url=$(echo "$response" | jq -r '.[0].subscriber_url') - - else - echo "Error: Unable to fetch data from the server." - fi -} - -update_gateway_config() { - # Print the extracted keys - # echo "Signing Public Key: $signing_public_key" - # echo "Encryption Public Key: $encr_public_key" - # echo "URL $subscriber_url" - - cp $SCRIPT_DIR/../gateway_data/config/swf.properties-sample $SCRIPT_DIR/../gateway_data/config/swf.properties - config_file="$SCRIPT_DIR/../gateway_data/config/swf.properties" - - tmp_file=$(mktemp "tempfile.XXXXXXXXXX") - #sed " s|SUBSCRIBER_ID|$gateway_id|g; s|SIGNING_PUBLIC_KEY|$signing_public_key|g; s|ENCRYPTION_PUBLIC_KEY|$encr_public_key|g; s|GATEWAY_URL|$gateway_id|g; s|GATEWAY_PORT|$gateway_port|g; s|PROTOCOL|$protocol|g; s|REGISTRY_URL|$subscriber_url|g" "$config_file" > "$tmp_file" - sed " s|SUBSCRIBER_ID|$gateway_id|g; s|GATEWAY_URL|$gateway_id|g; s|GATEWAY_PORT|$gateway_port|g; s|PROTOCOL|$protocol|g; s|REGISTRY_URL|$subscriber_url|g" "$config_file" > "$tmp_file" - mv "$tmp_file" "$config_file" - docker volume create gateway_data_volume - docker volume create gateway_database_volume - docker run --rm -v $SCRIPT_DIR/../gateway_data/config:/source -v gateway_data_volume:/target busybox cp /source/{envvars,logger.properties,swf.properties} /target/ - update_network_json - -} - -# if [[ $1 == https://* ]]; then -# reg_url=$1/subscribers/lookup -# get_details_registry $reg_url -# else -# service_name=$1 -# if [[ $(uname -s) == 'Darwin' ]]; then -# ip=localhost -# elif [[ $(systemd-detect-virt) == 'wsl' ]]; then -# ip=$(hostname -I | awk '{print $1}') -# else -# ip=$(get_container_ip $service_name) -# fi -# reg_url=http://$ip:3030/subscribers/lookup -# get_details_registry $reg_url -# fi - -echo "Registry: $1 && Gateway: $2" - -if [[ $1 ]]; then - registry_url=$1 - if [[ $1 == https://* ]]; then - if [[ $(uname -s) == 'Darwin' ]]; then - registry_id=$(echo "$1" | sed -E 's/https:\/\///') - else - registry_id=$(echo "$1" | sed 's/https:\/\///') - fi - elif [[ $1 == http://* ]]; then - if [[ $(uname -s) == 'Darwin' ]]; then - registry_id=$(echo "$1" | sed -E 's/http:\/\///') - else - registry_id=$(echo "$1" | sed 's/http:\/\///') - fi - fi - if [[ $registry_id = "registry:3030" ]]; then - registry_id="registry" - fi -fi - -if [[ $2 ]]; then - if [[ $2 == https://* ]]; then - if [[ $(uname -s) == 'Darwin' ]]; then - gateway_id=$(echo "$2" | sed -E 's/https:\/\///') - else - gateway_id=$(echo "$2" | sed 's/https:\/\///') - fi - gateway_port=443 - protocol=https - update_gateway_config - elif [[ $2 == http://* ]]; then - if [[ $(uname -s) == 'Darwin' ]]; then - gateway_id=$(echo "$2" | sed -E 's/http:\/\///') - else - gateway_id=$(echo "$2" | sed 's/http:\/\///') - fi - gateway_port=80 - protocol=http - update_gateway_config - fi -else - update_gateway_config -fi \ No newline at end of file diff --git a/install/scripts/variables.sh b/install/scripts/variables.sh deleted file mode 100755 index fcda32f..0000000 --- a/install/scripts/variables.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/bash - -#Colour Code -RED=$(tput setaf 1) -GREEN=$(tput setaf 2) -YELLOW=$(tput setaf 3) -NC=$(tput sgr0) - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -#Comman Variables with Default values -mongo_initdb_root_username="beckn" -mongo_initdb_root_password="beckn123" -mongo_initdb_database="protocol_server" -mongoUrl="mongoDB:27017" - -rabbitmq_default_user="beckn" -rabbitmq_default_pass="beckn123" -rabbitmqUrl="rabbitmq" - -redisUrl="redis" - -registry_url="http://registry:3030/subscribers" -beckn_registry_url="https://registry.becknprotocol.io/subscribers" - -#public_key="KKHOpMKQCbJHzjme+CPKI3HQxIhzKMpcLLRGMhzf7rk=" -#private_key="W7HkCMPWvxv6/jWqHlyUI4vWX8704+rN3kCwBGIA7rcooc6kwpAJskfOOZ74I8ojcdDEiHMoylwstEYyHN/uuQ==" - -#BAP varibales. - -bapClientFile="$SCRIPT_DIR/../protocol-server-data/bap-client.yaml-sample" -bapNetworkFile="$SCRIPT_DIR/../protocol-server-data/bap-network.yaml-sample" - -bap_client_port=5001 -bap_network_port=5002 - -bap_subscriber_id="bap-network" -bap_subscriber_key_id="bap-network-key" -bap_subscriber_url="http://bap-network:5002" -bap_client_url="http://bap-client:5002" - -#BPP varibales. - -bppClientFile="$SCRIPT_DIR/../protocol-server-data/bpp-client.yaml-sample" -bppNetworkFile="$SCRIPT_DIR/../protocol-server-data/bpp-network.yaml-sample" - -bpp_client_port=6001 -bpp_network_port=6002 - -bpp_subscriber_id="bpp-network" -bpp_subscriber_key_id="bpp-network-key" -bpp_subscriber_url="http://bpp-network:6002" -webhook_url="http://sandbox-api:3000" - -bpp_docker_compose_file=docker-compose-bpp.yml -bpp_docker_compose_file_sandbox=docker-compose-bpp-with-sandbox.yml -bap_docker_compose_file=docker-compose-bap.yml -registry_docker_compose_file=docker-compose-registry.yml -gateway_docker_compose_file=docker-compose-gateway.yml -gcl_docker_compose_file=docker-compose-gcl.yml \ No newline at end of file diff --git a/layer2/docs/demo_healthcare.md b/layer2/docs/demo_healthcare.md deleted file mode 100644 index 4076a17..0000000 --- a/layer2/docs/demo_healthcare.md +++ /dev/null @@ -1,142 +0,0 @@ -# Creating a Beckn network for healthcare using Beckn-ONIX and transacting on it. - -## Introduction - -[Beckn](https://becknprotocol.io/) as a protocol allows creation of decentralised commerce network across many domains. Healthcare is one of them. Beckn-ONIX is a project aimed at easing setup and maintanence of Beckn network for different domains. It provides utilities to quickly setup the core Beckn network as well as provides tools to enable domain specific transactions. The latter is achieved through the use of layer 2 configuration files. - -The [Beckn-ONIX User Guide](./user_guide.md) provides an overall understanding of setup of the core Beckn network as well as download and ingestion of Layer 2 configuration files. The [step by step setup](./setup_walkthrough.md) walks through one such installation in great detail. The layer 2 configurations illustrated in that demo belong to the retail and energy domain. - -## Healthcare usecases on Beckn network - -A sample of the usecases that can be imagined on Beckn networks include - -- Discovery and request for ambulance service including scenarios such as - - Requesting an immediate ambulance service - - Scheduled pickup by ambulance - - Querying special ambulances for certain category of patients - - Requesting with both start and destination locations -- Blood bank related use cases including - - Finding and transacting for emergency blood - - Identifying and enrolling for donation -- Doctor consultation including - - search by location - - search by speciality -- Diagnostics related transactions including -- Pharmacy related transactions including - - Location aware search - -## Setting up Beckn network for healthcare usecases - -Setting up of a network for healthcare related use cases follows the same steps as illustrated in the [step by step setup](./setup_walkthrough.md) document. The primary differences is the layer 2 configuration file downloaded will be specific to healthcare and suited to conduct healthcare transactions. A sample layer 2 config for healthcare is available in the beckn_onix/layer2/samples folder and its path can be provided when running download_layer_2_config_bap.sh and download_layer_2_config_bpp.sh. If you are joining a network administered by a network facilitator, they might have a different layer 2 config and that should be used instead of the sample. - -The following is a conceptual view of core and layer 2 config from a perspective of validation -![Validation in Beckn Adaptor](./images/message_validation_in_ba.png) - -## Writing Layer 2 configuration file for healthcare domain - -Layer 2 configuration file addresses two primary concerns - -- The rules and policies agreed by participants from the healtcare domain and agreed upon usually through working groups or other mechanisms -- The rules and policies required by the network facilitator. - -At an implementation level, the layer 2 configuration has additional data over core in two primary areas - -- Description, examples and other non-machine enforceable information. These are useful for implementors to get the big picture, perform semantic validation and use example requests as base for their own modifications. -- Rules and policies against which incoming messages can be validated. These are over and above those in the core and cover domain specific scenarios. - -## Sample validations that can be encoded into layer 2 configuration - -1. Limiting values to a fixed set of enumerations. Examples include - -- Limiting fulfillment type to ["walk-in","doorstep service"] for diagnostics -- Limiting fulfillment type to ["IN-STORE_PICKUP","HOME-DELIVERY"] for items in pharmacy -- Limiting fulfillment type to ["EMERGENCY","NORMAL"] for blood bank related queries - -``` -type: object -properties: - type: - type: string - enum: - - EMERGENCY - - NORMAL -required: - - type -``` - -2. Limiting values using minimum and maximum - -- Setting minimum and maximum of count field of unitized object to indicate a single unit item in medicine packages - -``` -unitized: - description: This represents the quantity available in a single unit of the item - type: object - properties: - count: - type: integer - minimum: 1 - maximum: 1 - measure: - $ref: '#/components/schemas/Scalar' -``` - -3. Marking an optional field in the core as required in the layer 2 config - -- Mandating feedback form be filled after consultation during rating -- Mandating cancellation reason for appointment cancellation -- Mandating credentials of doctor be present in search - -``` -type: object -properties: - cancellation_reason: - type: string -required: - - cancellation_reason -``` - -4. Mandating custom tags to be present in the tag list - -- Requiring the symptoms field be filled before the doctor's appointment is confirmed -- Requiring the qualifications of doctor to be returned ih search results in either skills or verifiable creds - -``` -type: object -properties: - creds: - type: object - skills: - type: object -oneOf: -- required: - - skills -- required: - - creds -``` - -5. Conditional requirement based on value of a different field - -- If item is medical equipment, additinoal description should be present - -``` -type: object -properties: - code: - type: string - additional_desc: - type: string -anyOf: -- not: - properties: - code: - const: "medical-equipment" - required: - - code -- required: - - additional_desc -``` - -## Conclusion - -Multitide DHP related use cases can be implemented on the Beckn networks. The process Beckn-ONIX follows to create core Beckn network and allowing participants to download layer 2 configuration is identical across domains. Layer 2 configuration captures both domain policies and rules as well as those enforced by the network facilitators. Layer 2 configuration are both prescriptive as well as mandatory. The mandatory rules and policies can be written on top of the core spec within the layer 2 config and can be enforced by incorporating a validator in the workflow. diff --git a/layer2/docs/generating_layer2.md b/layer2/docs/generating_layer2.md deleted file mode 100644 index 549fa9c..0000000 --- a/layer2/docs/generating_layer2.md +++ /dev/null @@ -1,11 +0,0 @@ -# Steps to generate a layer 2 config - -## Introduction -There could be many ways to create a layer 2 config. This document introduces one possible way using which a layer 2 config can be created. - -## Details -In this approach we are using OpenAPI 3.1 to construct a layer 2 config. - -[This](./../samples/mobility_1.1.0.yaml) Mobility domain layer 2 configuration was created using the above approach. - -The details of how to create a layer 2 configuration using this approach is documented [here](https://github.com/beckn/mobility/blob/layer2-oas-3.1/api/l2-config/oas-3.1/ondemandride/README.md). diff --git a/layer2/download_layer_2_config_bap.sh b/layer2/download_layer_2_config_bap.sh deleted file mode 100755 index bdf53aa..0000000 --- a/layer2/download_layer_2_config_bap.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash - -read -p "Enter the path from where to download the layer 2 configuration file:" FILE_URL - -CONTAINER_NAME="bap-network" -CONTAINER_ID=`docker ps -aqf "name=$CONTAINER_NAME"` -CONTAINER_PATH="/usr/src/app/schemas" -wget -O "$(basename "$FILE_URL")" "$FILE_URL" - -echo - -if [ $? -eq 0 ]; then - echo "File downloaded successfully." - FILENAME="$(basename "$FILE_URL")" - CONTAINER_NAME="bap-network" - CONTAINER_ID=`docker ps -aqf "name=$CONTAINER_NAME"` - CONTAINER_PATH="/usr/src/app/schemas" - - docker cp "$FILENAME" "$CONTAINER_NAME":"$CONTAINER_PATH/$FILENAME" - if [ $? -eq 0 ]; then - echo "File copied to Docker container $CONTAINER_NAME successfully." - fi - - CONTAINER_NAME="bap-client" - CONTAINER_ID=`docker ps -aqf "name=$CONTAINER_NAME"` - - docker cp "$FILENAME" "$CONTAINER_NAME":"$CONTAINER_PATH/$FILENAME" - - if [ $? -eq 0 ]; then - echo "File copied to Docker container $CONTAINER_NAME successfully." - rm "$(basename "$FILE_URL")" - if [ $? -eq 0 ]; then - echo "Local copy of the file deleted successfully." - else - echo "Failed to delete the local copy of the file." - fi - else - echo "Failed to copy the file to Docker container." - fi -else - echo "Failed to download the file." -fi \ No newline at end of file diff --git a/layer2/download_layer_2_config_bpp.sh b/layer2/download_layer_2_config_bpp.sh deleted file mode 100755 index 6853be5..0000000 --- a/layer2/download_layer_2_config_bpp.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash - -read -p "Enter the path from where to download the layer 2 configuration file:" FILE_URL - -CONTAINER_NAME="bap-network" -CONTAINER_ID=`docker ps -aqf "name=$CONTAINER_NAME"` -CONTAINER_PATH="/usr/src/app/schemas" -wget -O "$(basename "$FILE_URL")" "$FILE_URL" - -echo - -if [ $? -eq 0 ]; then - echo "File downloaded successfully." - FILENAME="$(basename "$FILE_URL")" - CONTAINER_NAME="bpp-network" - CONTAINER_ID=`docker ps -aqf "name=$CONTAINER_NAME"` - CONTAINER_PATH="/usr/src/app/schemas" - - docker cp "$FILENAME" "$CONTAINER_NAME":"$CONTAINER_PATH/$FILENAME" - if [ $? -eq 0 ]; then - echo "File copied to Docker container $CONTAINER_NAME successfully." - fi - - CONTAINER_NAME="bpp-client" - CONTAINER_ID=`docker ps -aqf "name=$CONTAINER_NAME"` - - docker cp "$FILENAME" "$CONTAINER_NAME":"$CONTAINER_PATH/$FILENAME" - - if [ $? -eq 0 ]; then - echo "File copied to Docker container $CONTAINER_NAME successfully." - rm "$(basename "$FILE_URL")" - if [ $? -eq 0 ]; then - echo "Local copy of the file deleted successfully." - else - echo "Failed to delete the local copy of the file." - fi - else - echo "Failed to copy the file to Docker container." - fi -else - echo "Failed to download the file." -fi \ No newline at end of file diff --git a/layer2/samples/dhp_0.7.3_1.1.0.yaml b/layer2/samples/dhp_0.7.3_1.1.0.yaml deleted file mode 100644 index 8ce8b4f..0000000 --- a/layer2/samples/dhp_0.7.3_1.1.0.yaml +++ /dev/null @@ -1,2164 +0,0 @@ -openapi: 3.0.0 -info: - title: DHP Core API - description: DHP Core API specification. This is an adaptation of Beckn core version 1.1.0 - version: 0.7.3 -security: - - SubscriberAuth: [] -paths: - /search: - post: - tags: - - Beckn Provider Platform (BPP) - - Beckn Gateway (BG) - description: BAP declares the customer's intent to buy/avail healthcare services/products. - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - search - message: - type: object - properties: - intent: - $ref: "#/components/schemas/Intent" - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /select: - post: - tags: - - Beckn Provider Platform (BPP) - description: BAP declares the customer's cart (or equivalent) created by selecting objects from the catalog - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - select - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /init: - post: - tags: - - Beckn Provider Platform (BPP) - description: Initialize an order by providing billing and/or shipping details - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - init - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - allOf: - - $ref: "#/components/schemas/Ack" - - properties: - status: - enum: - - ACK - - NACK - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /confirm: - post: - tags: - - Beckn Provider Platform (BPP) - description: Initialize an order by providing billing and/or shipping details - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - confirm - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /status: - post: - tags: - - Beckn Provider Platform (BPP) - description: Fetch the latest order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - status - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - required: - - order_id - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /track: - post: - tags: - - Beckn Provider Platform (BPP) - description: Track an active order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - track - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - callback_url: - type: string - format: uri - required: - - order_id - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /cancel: - post: - tags: - - Beckn Provider Platform (BPP) - description: Cancel an order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - cancel - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - cancellation_reason_id: - $ref: "#/components/schemas/Option/properties/id" - descriptor: - $ref: "#/components/schemas/Descriptor" - required: - - order_id - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /update: - post: - tags: - - Beckn Provider Platform (BPP) - description: Remove object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - update - required: - - action - message: - type: object - properties: - update_target: - description: 'Comma separated values of order objects being updated. For example: ```"update_target":"item,billing,fulfillment"```' - type: string - order: - description: Updated order object - allOf: - - $ref: "#/components/schemas/Order" - required: - - update_target - - order - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /rating: - post: - tags: - - Beckn Provider Platform (BPP) - description: Provide feedback on a service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - rating - required: - - action - message: - type: object - properties: - ratings: - type: array - items: - $ref: "#/components/schemas/Rating" - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /support: - post: - tags: - - Beckn Provider Platform (BPP) - description: Contact support - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - support - required: - - action - message: - type: object - properties: - support: - $ref: "#/components/schemas/Support" - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_search: - post: - tags: - - Beckn Application Platform (BAP) - - Beckn Gateway (BG) - description: BPP sends its catalog in response to a search request. - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_search - required: - - action - message: - type: object - properties: - catalog: - $ref: "#/components/schemas/Catalog" - required: - - catalog - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_select: - post: - tags: - - Beckn Application Platform (BAP) - description: Send draft order object with quoted price for selected items - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_select - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_init: - post: - tags: - - Beckn Application Platform (BAP) - description: Send order object with payment details updated - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_init - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_confirm: - post: - tags: - - Beckn Application Platform (BAP) - description: Send active order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_confirm - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_track: - post: - tags: - - Beckn Application Platform (BAP) - description: Send tracking details of an active order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_track - required: - - action - message: - type: object - properties: - tracking: - $ref: "#/components/schemas/Tracking" - required: - - tracking - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_cancel: - post: - tags: - - Beckn Application Platform (BAP) - description: Send cancellation request_id with reasons list in case of cancellation request. Else send cancelled order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_cancel - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_update: - post: - tags: - - Beckn Application Platform (BAP) - description: Returns updated service with updated runtime object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_update - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_status: - post: - tags: - - Beckn Application Platform (BAP) - description: Fetch the status of a Service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_status - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_rating: - post: - tags: - - Beckn Application Platform (BAP) - description: Provide feedback on a service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_rating - required: - - action - message: - type: object - properties: - feedback_form: - description: A feedback form to allow the user to provide additional information on the rating provided - allOf: - - $ref: "#/components/schemas/XInput" - error: - $ref: "#/components/schemas/Error" - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_support: - post: - tags: - - Beckn Application Platform (BAP) - description: Contact Support - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_support - required: - - action - message: - type: object - properties: - support: - $ref: "#/components/schemas/Support" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" -components: - securitySchemes: - SubscriberAuth: - type: apiKey - in: header - name: Authorization - description: 'Signature of message body using BAP or BPP subscriber''s signing public key.

Format:

Authorization : Signature keyId="{subscriber_id}|{unique_key_id}|{algorithm}",algorithm="ed25519",created="1606970629",expires="1607030629",headers="(created) (expires) digest",signature="Base64(signing string)"' - schemas: - Ack: - description: "Describes the acknowledgement sent in response to an API call. If the implementation uses HTTP/S, then Ack must be returned in the same session. Every API call to a BPP must be responded to with an Ack whether the BPP intends to respond with a callback or not. This has one property called `status` that indicates the status of the Acknowledgement." - type: object - properties: - status: - type: string - description: "The status of the acknowledgement. If the request passes the validation criteria of the BPP, then this is set to ACK. If a BPP responds with status = `ACK` to a request, it is required to respond with a callback. If the request fails the validation criteria, then this is set to NACK. Additionally, if a BPP does not intend to respond with a callback even after the request meets the validation criteria, it should set this value to `NACK`." - enum: - - ACK - - NACK - tags: - description: A list of tags containing any additional information sent along with the Acknowledgement. - type: array - items: - $ref: "#/components/schemas/TagGroup" - AddOn: - description: Describes an additional item offered as a value-addition to a product or service. This does not exist independently in a catalog and is always associated with an item. - type: object - properties: - id: - description: Provider-defined ID of the add-on - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - price: - $ref: "#/components/schemas/Price" - Address: - description: Describes a postal address. - type: string - Agent: - description: "Describes the direct performer, driver or executor that fulfills an order. It is usually a person. But in some rare cases, it could be a non-living entity like a drone, or a bot. Some examples of agents are Doctor in the healthcare sector, a driver in the mobility sector, or a delivery person in the logistics sector. This object can be set at any stage of the order lifecycle. This can be set at the discovery stage when the BPP wants to provide details on the agent fulfilling the order, like in healthcare, where the doctor's name appears during search. This object can also used to search for a particular person that the customer wants fulfilling an order. Sometimes, this object gets instantiated after the order is confirmed, like in the case of on-demand taxis, where the driver is assigned after the user confirms the ride." - properties: - person: - $ref: "#/components/schemas/Person" - contact: - $ref: "#/components/schemas/Contact" - organization: - $ref: "#/components/schemas/Organization" - rating: - $ref: "#/components/schemas/Rating/properties/value" - Authorization: - description: "Describes an authorization mechanism used to start or end the fulfillment of an order. For example, in the mobility sector, the driver may require a one-time password to initiate the ride. In the healthcare sector, a patient may need to provide a password to open a video conference link during a teleconsultation." - type: object - properties: - type: - description: Type of authorization mechanism used. The allowed values for this field can be published as part of the network policy. - type: string - token: - description: "Token used for authorization. This is typically generated at the BPP. The BAP can send this value to the user via any channel that it uses to authenticate the user like SMS, Email, Push notification, or in-app rendering." - type: string - valid_from: - description: Timestamp in RFC3339 format from which token is valid - type: string - format: date-time - valid_to: - description: Timestamp in RFC3339 format until which token is valid - type: string - format: date-time - status: - description: Status of the token - type: string - Billing: - description: "Describes the billing details of an entity.
This has properties like name,organization,address,email,phone,time,tax_number, created_at,updated_at" - type: object - properties: - name: - description: Name of the billable entity - type: string - organization: - description: Details of the organization being billed. - allOf: - - $ref: "#/components/schemas/Organization" - address: - description: The address of the billable entity - allOf: - - $ref: "#/components/schemas/Address" - state: - description: The state where the billable entity resides. This is important for state-level tax calculation - allOf: - - $ref: "#/components/schemas/State" - city: - description: The city where the billable entity resides. - allOf: - - $ref: "#/components/schemas/City" - email: - description: Email address where the bill is sent to - type: string - format: email - phone: - description: Phone number of the billable entity - type: string - time: - description: Details regarding the billing period - allOf: - - $ref: "#/components/schemas/Time" - tax_id: - description: ID of the billable entity as recognized by the taxation authority - type: string - Cancellation: - description: Describes a cancellation event - type: object - properties: - time: - description: Date-time when the order was cancelled by the buyer - type: string - format: date-time - cancelled_by: - type: string - enum: - - CONSUMER - - PROVIDER - reason: - description: The reason for cancellation - allOf: - - $ref: "#/components/schemas/Option" - additional_description: - description: Any additional information regarding the nature of cancellation - allOf: - - $ref: "#/components/schemas/Descriptor" - CancellationTerm: - description: Describes the cancellation terms of an item or an order. This can be referenced at an item or order level. Item-level cancellation terms can override the terms at the order level. - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/FulfillmentState" - reason_required: - description: Indicates whether a reason is required to cancel the order - type: boolean - cancel_by: - description: Information related to the time of cancellation. - allOf: - - $ref: "#/components/schemas/Time" - cancellation_fee: - $ref: "#/components/schemas/Fee" - xinput: - $ref: "#/components/schemas/XInput" - external_ref: - $ref: "#/components/schemas/MediaFile" - Catalog: - description: "Describes the products or services offered by a BPP. This is typically sent as the response to a search intent from a BAP. The payment terms, offers and terms of fulfillment supported by the BPP can also be included here. The BPP can show hierarchical nature of products/services in its catalog using the parent_category_id in categories. The BPP can also send a ttl (time to live) in the context which is the duration for which a BAP can cache the catalog and use the cached catalog.
This has properties like bbp/descriptor,bbp/categories,bbp/fulfillments,bbp/payments,bbp/offers,bbp/providers and exp
This is used in the following situations.
  • This is typically used in the discovery stage when the BPP sends the details of the products and services it offers as response to a search intent from the BAP.
" - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - fulfillments: - description: Fulfillment modes offered at the BPP level. This is used when a BPP itself offers fulfillments on behalf of the providers it has onboarded. - type: array - items: - $ref: "#/components/schemas/Fulfillment" - payments: - description: Payment terms offered by the BPP for all transactions. This can be overriden at the provider level. - type: array - items: - $ref: "#/components/schemas/Payment" - offers: - description: Offers at the BPP-level. This is common across all providers onboarded by the BPP. - type: array - items: - $ref: "#/components/schemas/Offer" - providers: - type: array - items: - $ref: "#/components/schemas/Provider" - exp: - description: Timestamp after which catalog will expire - type: string - format: date-time - ttl: - description: Duration in seconds after which this catalog will expire - type: string - Category: - description: A label under which a collection of items can be grouped. - type: object - properties: - id: - description: ID of the category - type: string - parent_category_id: - $ref: "#/components/schemas/Category/properties/id" - descriptor: - $ref: "#/components/schemas/Descriptor" - time: - $ref: "#/components/schemas/Time" - ttl: - description: Time to live for an instance of this schema - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Circle: - description: Describes a circular region of a specified radius centered at a specified GPS coordinate. - type: object - properties: - gps: - $ref: "#/components/schemas/Gps" - radius: - $ref: "#/components/schemas/Scalar" - City: - description: Describes a city - type: object - properties: - name: - description: Name of the city - type: string - code: - description: City code - type: string - Contact: - description: Describes the contact information of an entity - type: object - properties: - phone: - type: string - email: - type: string - jcard: - type: object - description: A Jcard object as per draft-ietf-jcardcal-jcard-03 specification - Context: - description: "Every API call in beckn protocol has a context. It provides a high-level overview to the receiver about the nature of the intended transaction. Typically, it is the BAP that sets the transaction context based on the consumer's location and action on their UI. But sometimes, during unsolicited callbacks, the BPP also sets the transaction context but it is usually the same as the context of a previous full-cycle, request-callback interaction between the BAP and the BPP. The context object contains four types of fields.
  1. Demographic information about the transaction using fields like `domain`, `country`, and `region`.
  2. Addressing details like the sending and receiving platform's ID and API URL.
  3. Interoperability information like the protocol version that implemented by the sender and,
  4. Transaction details like the method being called at the receiver's endpoint, the transaction_id that represents an end-to-end user session at the BAP, a message ID to pair requests with callbacks, a timestamp to capture sending times, a ttl to specifiy the validity of the request, and a key to encrypt information if necessary.
This object must be passed in every interaction between a BAP and a BPP. In HTTP/S implementations, it is not necessary to send the context during the synchronous response. However, in asynchronous protocols, the context must be sent during all interactions," - type: object - properties: - domain: - description: Domain code that is relevant to this transaction context - allOf: - - $ref: "#/components/schemas/Domain/properties/code" - location: - description: The location where the transaction is intended to be fulfilled. - allOf: - - $ref: "#/components/schemas/Location" - action: - description: The Beckn protocol method being called by the sender and executed at the receiver. - type: string - version: - type: string - description: Version of transaction protocol being used by the sender. - bap_id: - description: Subscriber ID of the BAP - allOf: - - description: "A globally unique identifier of the platform, Typically it is the fully qualified domain name (FQDN) of the platform." - type: string - bap_uri: - description: Subscriber URL of the BAP for accepting callbacks from BPPs. - allOf: - - description: The callback URL of the Subscriber. This should necessarily contain the same domain name as set in `subscriber_id``. - type: string - format: uri - bpp_id: - description: Subscriber ID of the BPP - allOf: - - $ref: "#/components/schemas/Context/properties/bap_id/allOf/0" - bpp_uri: - description: Subscriber URL of the BPP for accepting calls from BAPs. - allOf: - - $ref: "#/components/schemas/Context/properties/bap_uri/allOf/0" - transaction_id: - description: "This is a unique value which persists across all API calls from `search` through `confirm`. This is done to indicate an active user session across multiple requests. The BPPs can use this value to push personalized recommendations, and dynamic offerings related to an ongoing transaction despite being unaware of the user active on the BAP." - type: string - format: uuid - message_id: - description: "This is a unique value which persists during a request / callback cycle. Since beckn protocol APIs are asynchronous, BAPs need a common value to match an incoming callback from a BPP to an earlier call. This value can also be used to ignore duplicate messages coming from the BPP. It is recommended to generate a fresh message_id for every new interaction. When sending unsolicited callbacks, BPPs must generate a new message_id." - type: string - format: uuid - timestamp: - description: Time of request generation in RFC3339 format - type: string - format: date-time - key: - description: The encryption public key of the sender - type: string - ttl: - description: The duration in ISO8601 format after timestamp for which this message holds valid - type: string - Country: - description: Describes a country - type: object - properties: - name: - type: string - description: Name of the country - code: - type: string - description: Country code as per ISO 3166-1 and ISO 3166-2 format - Credential: - description: Describes a credential of an entity - Person or Organization - type: object - properties: - id: - type: string - type: - type: string - default: VerifiableCredential - url: - description: URL of the credential - type: string - format: uri - Customer: - description: Describes a customer buying/availing a product or a service - type: object - properties: - person: - $ref: "#/components/schemas/Person" - contact: - $ref: "#/components/schemas/Contact" - DecimalValue: - description: Describes a numerical value in decimal form - type: string - pattern: "[+-]?([0-9]*[.])?[0-9]+" - Descriptor: - description: Physical description of something. - type: object - properties: - name: - type: string - code: - type: string - short_desc: - type: string - long_desc: - type: string - additional_desc: - type: object - properties: - url: - type: string - content_type: - type: string - enum: - - text/plain - - text/html - - application/json - media: - type: array - items: - $ref: "#/components/schemas/MediaFile" - images: - type: array - items: - $ref: "#/components/schemas/Image" - Domain: - description: "Described the industry sector or sub-sector. The network policy should contain codes for all the industry sectors supported by the network. Domains can be created in varying levels of granularity. The granularity of a domain can be decided by the participants of the network. Too broad domains will result in irrelevant search broadcast calls to BPPs that don't have services supporting the domain. Too narrow domains will result in a large number of registry entries for each BPP. It is recommended that network facilitators actively collaborate with various working groups and network participants to carefully choose domain codes keeping in mind relevance, performance, and opportunity cost. It is recommended that networks choose broad domains like mobility, logistics, healthcare etc, and progressively granularize them as and when the number of network participants for each domain grows large." - type: object - properties: - name: - description: Name of the domain - type: string - code: - description: "Standard code representing the domain. The standard is usually published as part of the network policy. Furthermore, the network facilitator should also provide a mechanism to provide the supported domains of a network." - additional_info: - description: A url that contains addtional information about that domain. - allOf: - - $ref: "#/components/schemas/MediaFile" - Duration: - description: Describes duration as per ISO8601 format - type: string - Error: - description: "Describes an error object that is returned by a BAP, BPP or BG as a response or callback to an action by another network participant. This object is sent when any request received by a network participant is unacceptable. This object can be sent either during Ack or with the callback." - type: object - properties: - code: - type: string - description: 'Standard error code. For full list of error codes, refer to docs/protocol-drafts/BECKN-005-ERROR-CODES-DRAFT-01.md of this repo"' - paths: - type: string - description: Path to json schema generating the error. Used only during json schema validation errors - message: - type: string - description: Human readable message describing the error. Used mainly for logging. Not recommended to be shown to the user. - Fee: - description: A fee applied on a particular entity - type: object - properties: - percentage: - description: Percentage of a value - allOf: - - $ref: "#/components/schemas/DecimalValue" - amount: - description: A fixed value - allOf: - - $ref: "#/components/schemas/Price" - Form: - description: Describes a form - type: object - properties: - url: - description: "The URL from where the form can be fetched. The content fetched from the url must be processed as per the mime_type specified in this object. Once fetched, the rendering platform can choosed to render the form as-is as an embeddable element; or process it further to blend with the theme of the application. In case the interface is non-visual, the the render can process the form data and reproduce it as per the standard specified in the form." - type: string - format: uri - data: - description: The form submission data - type: object - additionalProperties: - type: string - mime_type: - description: This field indicates the nature and format of the form received by querying the url. MIME types are defined and standardized in IETF's RFC 6838. - type: string - enum: - - text/html - - application/xml - submission_id: - type: string - format: uuid - Fulfillment: - description: Describes how a an order will be rendered/fulfilled to the end-customer - type: object - properties: - id: - description: Unique reference ID to the fulfillment of an order - type: string - type: - description: "A code that describes the mode of fulfillment. This is typically set when there are multiple ways an order can be fulfilled. For example, a retail order can be fulfilled either via store pickup or a home delivery. Similarly, a medical consultation can be provided either in-person or via tele-consultation. The network policy must publish standard fulfillment type codes for the different modes of fulfillment." - type: string - rateable: - description: Whether the fulfillment can be rated or not - type: boolean - rating: - description: The rating value of the fulfullment service. - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - state: - description: The current state of fulfillment. The BPP must set this value whenever the state of the order fulfillment changes and fire an unsolicited `on_status` call. - allOf: - - $ref: "#/components/schemas/FulfillmentState" - tracking: - type: boolean - description: Indicates whether the fulfillment allows tracking - default: false - customer: - description: The person that will ultimately receive the order - allOf: - - $ref: "#/components/schemas/Customer" - agent: - description: The agent that is currently handling the fulfillment of the order - allOf: - - $ref: "#/components/schemas/Agent" - contact: - $ref: "#/components/schemas/Contact" - vehicle: - $ref: "#/components/schemas/Vehicle" - stops: - description: The list of logical stops encountered during the fulfillment of an order. - type: array - items: - $ref: "#/components/schemas/Stop" - path: - description: The physical path taken by the agent that can be rendered on a map. The allowed format of this property can be set by the network. - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - FulfillmentState: - description: Describes the state of fulfillment - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - updated_at: - type: string - format: date-time - updated_by: - type: string - description: ID of entity which changed the state - Gps: - description: Describes a GPS coordinate - type: string - pattern: '^[-+]?([1-8]?\d(\.\d+)?|90(\.0+)?),\s*[-+]?(180(\.0+)?|((1[0-7]\d)|([1-9]?\d))(\.\d+)?)$' - Image: - description: Describes an image - type: object - properties: - url: - description: URL to the image. This can be a data url or an remote url - type: string - format: uri - size_type: - description: The size of the image. The network policy can define the default dimensions of each type - type: string - enum: - - xs - - sm - - md - - lg - - xl - - custom - width: - description: Width of the image in pixels - type: string - height: - description: Height of the image in pixels - type: string - Intent: - description: "The intent to buy or avail a product or a service. The BAP can declare the intent of the consumer containing
  • What they want (A product, service, offer)
  • Who they want (A seller, service provider, agent etc)
  • Where they want it and where they want it from
  • When they want it (start and end time of fulfillment
  • How they want to pay for it

This has properties like descriptor,provider,fulfillment,payment,category,offer,item,tags
This is typically used by the BAP to send the purpose of the user's search to the BPP. This will be used by the BPP to find products or services it offers that may match the user's intent.
For example, in Mobility, the mobility consumer declares a mobility intent. In this case, the mobility consumer declares information that describes various aspects of their journey like,
  • Where would they like to begin their journey (intent.fulfillment.start.location)
  • Where would they like to end their journey (intent.fulfillment.end.location)
  • When would they like to begin their journey (intent.fulfillment.start.time)
  • When would they like to end their journey (intent.fulfillment.end.time)
  • Who is the transport service provider they would like to avail services from (intent.provider)
  • Who is traveling (This is not recommended in public networks) (intent.fulfillment.customer)
  • What kind of fare product would they like to purchase (intent.item)
  • What add-on services would they like to avail
  • What offers would they like to apply on their booking (intent.offer)
  • What category of services would they like to avail (intent.category)
  • What additional luggage are they carrying
  • How would they like to pay for their journey (intent.payment)

For example, in health domain, a consumer declares the intent for a lab booking the describes various aspects of their booking like,
  • Where would they like to get their scan/test done (intent.fulfillment.start.location)
  • When would they like to get their scan/test done (intent.fulfillment.start.time)
  • When would they like to get the results of their test/scan (intent.fulfillment.end.time)
  • Who is the service provider they would like to avail services from (intent.provider)
  • Who is getting the test/scan (intent.fulfillment.customer)
  • What kind of test/scan would they like to purchase (intent.item)
  • What category of services would they like to avail (intent.category)
  • How would they like to pay for their journey (intent.payment)
" - type: object - properties: - descriptor: - description: "A raw description of the search intent. Free text search strings, raw audio, etc can be sent in this object." - allOf: - - $ref: "#/components/schemas/Descriptor" - provider: - description: The provider from which the customer wants to place to the order from - allOf: - - $ref: "#/components/schemas/Provider" - fulfillment: - description: Details on how the customer wants their order fulfilled - allOf: - - $ref: "#/components/schemas/Fulfillment" - payment: - description: Details on how the customer wants to pay for the order - allOf: - - $ref: "#/components/schemas/Payment" - category: - description: Details on the item category - allOf: - - $ref: "#/components/schemas/Category" - offer: - description: details on the offer the customer wants to avail - allOf: - - $ref: "#/components/schemas/Offer" - item: - description: Details of the item that the consumer wants to order - allOf: - - $ref: "#/components/schemas/Item" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - ItemQuantity: - description: Describes the count or amount of an item - type: object - properties: - allocated: - description: This represents the exact quantity allocated for purchase of the item. - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - available: - description: This represents the exact quantity available for purchase of the item. The buyer can only purchase multiples of this - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - maximum: - description: This represents the maximum quantity allowed for purchase of the item - type: object - properties: - count: - type: integer - minimum: 1 - measure: - $ref: "#/components/schemas/Scalar" - minimum: - description: This represents the minimum quantity allowed for purchase of the item - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - selected: - description: This represents the quantity selected for purchase of the item - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - unitized: - description: This represents the quantity available in a single unit of the item - type: object - properties: - count: - type: integer - minimum: 1 - maximum: 1 - measure: - $ref: "#/components/schemas/Scalar" - Item: - description: "Describes a product or a service offered to the end consumer by the provider. In the mobility sector, it can represent a fare product like one way journey. In the logistics sector, it can represent the delivery service offering. In the retail domain it can represent a product like a grocery item." - type: object - properties: - id: - description: ID of the item. - type: string - parent_item_id: - description: "ID of the item, this item is a variant of" - allOf: - - $ref: "#/components/schemas/Item/properties/id" - parent_item_quantity: - description: The number of units of the parent item this item is a multiple of - allOf: - - $ref: "#/components/schemas/ItemQuantity" - descriptor: - description: Physical description of the item - allOf: - - $ref: "#/components/schemas/Descriptor" - creator: - description: The creator of this item - allOf: - - $ref: "#/components/schemas/Organization" - price: - description: "The price of this item, if it has intrinsic value" - allOf: - - $ref: "#/components/schemas/Price" - quantity: - description: The selling quantity of the item - allOf: - - $ref: "#/components/schemas/ItemQuantity" - category_ids: - description: Categories this item can be listed under - type: array - items: - allOf: - - $ref: "#/components/schemas/Category/properties/id" - fulfillment_ids: - description: Modes through which this item can be fulfilled - type: array - items: - allOf: - - $ref: "#/components/schemas/Fulfillment/properties/id" - location_ids: - description: Provider Locations this item is available in - type: array - items: - allOf: - - $ref: "#/components/schemas/Location/properties/id" - payment_ids: - description: Payment modalities through which this item can be ordered - type: array - items: - allOf: - - $ref: "#/components/schemas/Payment/properties/id" - add_ons: - type: array - items: - $ref: "#/components/schemas/AddOn" - cancellation_terms: - description: Cancellation terms of this item - type: array - items: - $ref: "#/components/schemas/CancellationTerm" - refund_terms: - description: Refund terms of this item - type: array - items: - description: Refund term of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/State" - refund_eligible: - description: Indicates if cancellation will result in a refund - type: boolean - refund_within: - description: Time within which refund will be processed after successful cancellation. - allOf: - - $ref: "#/components/schemas/Time" - refund_amount: - $ref: "#/components/schemas/Price" - replacement_terms: - description: Terms that are applicable be met when this item is replaced - type: array - items: - $ref: "#/components/schemas/ReplacementTerm" - return_terms: - description: Terms that are applicable when this item is returned - type: array - items: - $ref: "#/components/schemas/ReturnTerm" - xinput: - description: Additional input required from the customer to purchase / avail this item - allOf: - - $ref: "#/components/schemas/XInput" - time: - description: Temporal attributes of this item. This property is used when the item exists on the catalog only for a limited period of time. - allOf: - - $ref: "#/components/schemas/Time" - rateable: - description: Whether this item can be rated - type: boolean - rating: - description: The rating of the item - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - matched: - description: Whether this item is an exact match of the request - type: boolean - related: - description: Whether this item is a related item to the exactly matched item - type: boolean - recommended: - description: Whether this item is a recommended item to a response - type: boolean - ttl: - description: Time to live in seconds for an instance of this schema - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Location: - description: The physical location of something - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - map_url: - description: The url to the map of the location. This can be a globally recognized map url or the one specified by the network policy. - type: string - format: uri - gps: - description: The GPS co-ordinates of this location. - allOf: - - $ref: "#/components/schemas/Gps" - address: - description: The address of this location. - allOf: - - $ref: "#/components/schemas/Address" - city: - description: "The city this location is, or is located within" - allOf: - - $ref: "#/components/schemas/City" - district: - description: "The state this location is, or is located within" - type: string - state: - description: "The state this location is, or is located within" - allOf: - - $ref: "#/components/schemas/State" - country: - description: "The country this location is, or is located within" - allOf: - - $ref: "#/components/schemas/Country" - area_code: - type: string - circle: - $ref: "#/components/schemas/Circle" - polygon: - description: The boundary polygon of this location - type: string - 3dspace: - description: The three dimensional region describing this location - type: string - rating: - description: The rating of this location - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - MediaFile: - description: This object contains a url to a media file. - type: object - properties: - mimetype: - description: "indicates the nature and format of the document, file, or assortment of bytes. MIME types are defined and standardized in IETF's RFC 6838" - type: string - url: - description: The URL of the file - type: string - format: uri - signature: - description: The digital signature of the file signed by the sender - type: string - dsa: - description: The signing algorithm used by the sender - type: string - Offer: - description: An offer associated with a catalog. This is typically used to promote a particular product and enable more purchases. - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - location_ids: - type: array - items: - $ref: "#/components/schemas/Location/properties/id" - category_ids: - type: array - items: - $ref: "#/components/schemas/Category/properties/id" - item_ids: - type: array - items: - $ref: "#/components/schemas/Item/properties/id" - time: - $ref: "#/components/schemas/Time" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Option: - description: Describes a selectable option - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - Order: - description: Describes a legal purchase order. It contains the complete details of the legal contract created between the buyer and the seller. - type: object - properties: - id: - type: string - description: Human-readable ID of the order. This is generated at the BPP layer. The BPP can either generate order id within its system or forward the order ID created at the provider level. - ref_order_ids: - description: A list of order IDs to link this order to previous orders. - type: array - items: - type: string - description: ID of a previous order - status: - description: Status of the order. Allowed values can be defined by the network policy - type: string - enum: - - ACTIVE - - COMPLETE - - CANCELLED - type: - description: "This is used to indicate the type of order being created to BPPs. Sometimes orders can be linked to previous orders, like a replacement order in a retail domain. A follow-up consultation in healthcare domain. A single order part of a subscription order. The list of order types can be standardized at the network level." - type: string - default: DEFAULT - enum: - - DRAFT - - DEFAULT - provider: - description: Details of the provider whose catalog items have been selected. - allOf: - - $ref: "#/components/schemas/Provider" - items: - description: The items purchased / availed in this order - type: array - items: - $ref: "#/components/schemas/Item" - add_ons: - description: The add-ons purchased / availed in this order - type: array - items: - $ref: "#/components/schemas/AddOn" - offers: - description: The offers applied in this order - type: array - items: - $ref: "#/components/schemas/Offer" - billing: - description: The billing details of this order - allOf: - - $ref: "#/components/schemas/Billing" - fulfillments: - description: The fulfillments involved in completing this order - type: array - items: - $ref: "#/components/schemas/Fulfillment" - cancellation: - description: The cancellation details of this order - allOf: - - $ref: "#/components/schemas/Cancellation" - cancellation_terms: - description: Cancellation terms of this item - type: array - items: - $ref: "#/components/schemas/CancellationTerm" - refund_terms: - description: Refund terms of this item - type: array - items: - $ref: "#/components/schemas/Item/properties/refund_terms/items" - replacement_terms: - description: Replacement terms of this item - type: array - items: - $ref: "#/components/schemas/ReplacementTerm" - return_terms: - description: Return terms of this item - type: array - items: - $ref: "#/components/schemas/ReturnTerm" - quote: - description: The mutually agreed upon quotation for this order. - allOf: - - $ref: "#/components/schemas/Quotation" - payments: - description: The terms of settlement for this order - type: array - items: - $ref: "#/components/schemas/Payment" - created_at: - description: The date-time of creation of this order - type: string - format: date-time - updated_at: - description: The date-time of updated of this order - type: string - format: date-time - xinput: - description: Additional input required from the customer to confirm this order - allOf: - - $ref: "#/components/schemas/XInput" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Organization: - description: An organization. Usually a recognized business entity. - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - address: - description: The postal address of the organization - allOf: - - $ref: "#/components/schemas/Address" - state: - description: The state where the organization's address is registered - allOf: - - $ref: "#/components/schemas/State" - city: - description: The city where the the organization's address is registered - allOf: - - $ref: "#/components/schemas/City" - contact: - $ref: "#/components/schemas/Contact" - Payment: - description: "Describes the terms of settlement between the BAP and the BPP for a single transaction. When instantiated, this object contains
  1. the amount that has to be settled,
  2. The payment destination destination details
  3. When the settlement should happen, and
  4. A transaction reference ID
. During a transaction, the BPP reserves the right to decide the terms of payment. However, the BAP can send its terms to the BPP first. If the BPP does not agree to those terms, it must overwrite the terms and return them to the BAP. If overridden, the BAP must either agree to the terms sent by the BPP in order to preserve the provider's autonomy, or abort the transaction. In case of such disagreements, the BAP and the BPP can perform offline negotiations on the payment terms. Once an agreement is reached, the BAP and BPP can resume transactions." - type: object - properties: - id: - description: ID of the payment term that can be referred at an item or an order level in a catalog - type: string - collected_by: - description: "This field indicates who is the collector of payment. The BAP can set this value to 'bap' if it wants to collect the payment first and settle it to the BPP. If the BPP agrees to those terms, the BPP should not send the payment url. Alternatively, the BPP can set this field with the value 'bpp' if it wants the payment to be made directly." - url: - type: string - description: "A payment url to be called by the BAP. If empty, then the payment is to be done offline. The details of payment should be present in the params object. If tl_method = http/get, then the payment details will be sent as url params. Two url param values, ```$transaction_id``` and ```$amount``` are mandatory." - format: uri - params: - type: object - properties: - transaction_id: - type: string - description: The reference transaction ID associated with a payment activity - amount: - type: string - currency: - type: string - bank_code: - type: string - bank_account_number: - type: string - virtual_payment_address: - type: string - source_bank_code: - type: string - source_bank_account_number: - type: string - source_virtual_payment_address: - type: string - type: - type: string - enum: - - PRE-ORDER - - PRE-FULFILLMENT - - ON-FULFILLMENT - - POST-FULFILLMENT - status: - type: string - enum: - - PAID - - NOT-PAID - time: - $ref: "#/components/schemas/Time" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Person: - description: Describes a person as any individual - type: object - properties: - id: - type: string - description: Describes the identity of the person - url: - description: Profile url of the person - type: string - format: uri - name: - description: the name of the person - type: string - image: - $ref: "#/components/schemas/Image" - age: - description: Age of the person - allOf: - - $ref: "#/components/schemas/Duration" - dob: - description: Date of birth of the person - type: string - format: date - gender: - type: string - description: "Gender of something, typically a Person, but possibly also fictional characters, animals, etc. While Male and Female may be used, text strings are also acceptable for people who do not identify as a binary gender.Allowed values for this field can be published in the network policy" - creds: - type: array - items: - $ref: "#/components/schemas/Credential" - languages: - type: array - items: - description: Describes a language known to the person. - type: object - properties: - code: - type: string - name: - type: string - skills: - type: array - items: - description: Describes a skill of the person. - type: object - properties: - code: - type: string - name: - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Price: - description: Describes the price of a product or service - type: object - properties: - currency: - type: string - value: - $ref: "#/components/schemas/DecimalValue" - estimated_value: - $ref: "#/components/schemas/DecimalValue" - computed_value: - $ref: "#/components/schemas/DecimalValue" - listed_value: - $ref: "#/components/schemas/DecimalValue" - offered_value: - $ref: "#/components/schemas/DecimalValue" - minimum_value: - $ref: "#/components/schemas/DecimalValue" - maximum_value: - $ref: "#/components/schemas/DecimalValue" - Provider: - description: Describes the catalog of a business. - type: object - properties: - id: - type: string - description: Id of the provider - descriptor: - $ref: "#/components/schemas/Descriptor" - category_id: - type: string - description: Category Id of the provider at the BPP-level catalog - rating: - $ref: "#/components/schemas/Rating/properties/value" - time: - $ref: "#/components/schemas/Time" - categories: - type: array - items: - $ref: "#/components/schemas/Category" - fulfillments: - type: array - items: - $ref: "#/components/schemas/Fulfillment" - payments: - type: array - items: - $ref: "#/components/schemas/Payment" - locations: - type: array - items: - $ref: "#/components/schemas/Location" - offers: - type: array - items: - $ref: "#/components/schemas/Offer" - items: - type: array - items: - $ref: "#/components/schemas/Item" - exp: - type: string - description: Time after which catalog has to be refreshed - format: date-time - rateable: - description: Whether this provider can be rated or not - type: boolean - ttl: - description: "The time-to-live in seconds, for this object. This can be overriden at deeper levels. A value of -1 indicates that this object is not cacheable." - type: integer - minimum: -1 - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Quotation: - description: "Describes a quote. It is the estimated price of products or services from the BPP.
This has properties like price, breakup, ttl" - type: object - properties: - id: - description: ID of the quote. - type: string - format: uuid - price: - description: The total quoted price - allOf: - - $ref: "#/components/schemas/Price" - breakup: - description: the breakup of the total quoted price - type: array - items: - type: object - properties: - item: - $ref: "#/components/schemas/Item" - title: - type: string - price: - $ref: "#/components/schemas/Price" - ttl: - $ref: "#/components/schemas/Duration" - Rating: - description: Describes the rating of an entity - type: object - properties: - rating_category: - description: Category of the entity being rated - type: string - enum: - - Item - - Order - - Fulfillment - - Provider - - Agent - - Support - id: - description: Id of the object being rated - type: string - value: - description: "Rating value given to the object. This can be a single value or can also contain an inequality operator like gt, gte, lt, lte. This can also contain an inequality expression containing logical operators like && and ||." - type: string - Region: - description: Describes an arbitrary region of space. The network policy should contain a published list of supported regions by the network. - type: object - properties: - dimensions: - description: "The number of dimensions that are used to describe any point inside that region. The most common dimensionality of a region is 2, that represents an area on a map. There are regions on the map that can be approximated to one-dimensional regions like roads, railway lines, or shipping lines. 3 dimensional regions are rarer, but are gaining popularity as flying drones are being adopted for various fulfillment services." - type: string - enum: - - "1" - - "2" - - "3" - type: - description: "The type of region. This is used to specify the granularity of the region represented by this object. Various examples of two-dimensional region types are city, country, state, district, and so on. The network policy should contain a list of all possible region types supported by the network." - type: string - name: - type: string - description: Name of the region as specified on the map where that region exists. - code: - type: string - description: A standard code representing the region. This should be interpreted in the same way by all network participants. - boundary: - type: string - description: "A string representing the boundary of the region. One-dimensional regions are represented by polylines. Two-dimensional regions are represented by polygons, and three-dimensional regions can represented by polyhedra." - map_url: - type: string - description: The url to the map of the region. This can be a globally recognized map or the one specified by the network policy. - ReplacementTerm: - description: The replacement policy of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/State" - replace_within: - description: "Applicable only for buyer managed returns where the buyer has to replace the item before a certain date-time, failing which they will not be eligible for replacement" - allOf: - - $ref: "#/components/schemas/Time" - external_ref: - $ref: "#/components/schemas/MediaFile" - ReturnTerm: - description: Describes the return policy of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term IETF''s applicable. - allOf: - - $ref: "#/components/schemas/State" - return_eligible: - description: Indicates whether the item is eligible for return - type: boolean - return_time: - description: "Applicable only for buyer managed returns where the buyer has to return the item to the origin before a certain date-time, failing which they will not be eligible for refund." - allOf: - - $ref: "#/components/schemas/Time" - return_location: - description: The location where the item or order must / will be returned to - allOf: - - $ref: "#/components/schemas/Location" - fulfillment_managed_by: - description: The entity that will perform the return - type: string - enum: - - CONSUMER - - PROVIDER - Scalar: - description: Describes a scalar - type: object - properties: - type: - type: string - enum: - - CONSTANT - - VARIABLE - value: - $ref: "#/components/schemas/DecimalValue" - estimated_value: - $ref: "#/components/schemas/DecimalValue" - computed_value: - $ref: "#/components/schemas/DecimalValue" - range: - type: object - properties: - min: - $ref: "#/components/schemas/DecimalValue" - max: - $ref: "#/components/schemas/DecimalValue" - unit: - type: string - Schedule: - description: "Describes schedule as a repeating time period used to describe a regularly recurring event. At a minimum a schedule will specify frequency which describes the interval between occurrences of the event. Additional information can be provided to specify the schedule more precisely. This includes identifying the timestamps(s) of when the event will take place. Schedules may also have holidays to exclude a specific day from the schedule.
This has properties like frequency, holidays, times" - type: object - properties: - frequency: - $ref: "#/components/schemas/Duration" - holidays: - type: array - items: - type: string - format: date-time - times: - type: array - items: - type: string - format: date-time - State: - description: A bounded geopolitical region of governance inside a country. - type: object - properties: - name: - type: string - description: Name of the state - code: - type: string - description: State code as per country or international standards - Stop: - description: A logical point in space and time during the fulfillment of an order. - type: object - properties: - id: - type: string - parent_stop_id: - type: string - location: - description: Location of the stop - allOf: - - $ref: "#/components/schemas/Location" - type: - description: The type of stop. Allowed values of this property can be defined by the network policy. - type: string - time: - description: Timings applicable at the stop. - allOf: - - $ref: "#/components/schemas/Time" - instructions: - description: Instructions that need to be followed at the stop - allOf: - - $ref: "#/components/schemas/Descriptor" - contact: - description: Contact details of the stop - allOf: - - $ref: "#/components/schemas/Contact" - person: - description: The details of the person present at the stop - allOf: - - $ref: "#/components/schemas/Person" - authorization: - $ref: "#/components/schemas/Authorization" - Support: - description: Details of customer support - type: object - properties: - ref_id: - type: string - callback_phone: - type: string - format: phone - phone: - type: string - format: phone - email: - type: string - format: email - url: - type: string - format: uri - Tag: - description: "Describes a tag. This is used to contain extended metadata. This object can be added as a property to any schema to describe extended attributes. For BAPs, tags can be sent during search to optimize and filter search results. BPPs can use tags to index their catalog to allow better search functionality. Tags are sent by the BPP as part of the catalog response in the `on_search` callback. Tags are also meant for display purposes. Upon receiving a tag, BAPs are meant to render them as name-value pairs. This is particularly useful when rendering tabular information about a product or service." - type: object - properties: - descriptor: - description: "Description of the Tag, can be used to store detailed information." - allOf: - - $ref: "#/components/schemas/Descriptor" - value: - description: The value of the tag. This set by the BPP and rendered as-is by the BAP. - type: string - display: - description: "This value indicates if the tag is intended for display purposes. If set to `true`, then this tag must be displayed. If it is set to `false`, it should not be displayed. This value can override the group display value." - type: boolean - TagGroup: - description: "A collection of tag objects with group level attributes. For detailed documentation on the Tags and Tag Groups schema go to https://github.com/beckn/protocol-specifications/discussions/316" - type: object - properties: - display: - description: "Indicates the display properties of the tag group. If display is set to false, then the group will not be displayed. If it is set to true, it should be displayed. However, group-level display properties can be overriden by individual tag-level display property. As this schema is purely for catalog display purposes, it is not recommended to send this value during search." - type: boolean - default: true - descriptor: - description: "Description of the TagGroup, can be used to store detailed information." - allOf: - - $ref: "#/components/schemas/Descriptor" - list: - description: "An array of Tag objects listed under this group. This property can be set by BAPs during search to narrow the `search` and achieve more relevant results. When received during `on_search`, BAPs must render this list under the heading described by the `name` property of this schema." - type: array - items: - $ref: "#/components/schemas/Tag" - Time: - description: "Describes time in its various forms. It can be a single point in time; duration; or a structured timetable of operations
This has properties like label, time stamp,duration,range, days, schedule" - type: object - properties: - label: - type: string - timestamp: - type: string - format: date-time - duration: - $ref: "#/components/schemas/Duration" - range: - type: object - properties: - start: - type: string - format: date-time - end: - type: string - format: date-time - days: - type: string - description: comma separated values representing days of the week - schedule: - $ref: "#/components/schemas/Schedule" - Tracking: - description: Contains tracking information that can be used by the BAP to track the fulfillment of an order in real-time. which is useful for knowing the location of time sensitive deliveries. - type: object - properties: - id: - description: A unique tracking reference number - type: string - url: - description: "A URL to the tracking endpoint. This can be a link to a tracking webpage, a webhook URL created by the BAP where BPP can push the tracking data, or a GET url creaed by the BPP which the BAP can poll to get the tracking data. It can also be a websocket URL where the BPP can push real-time tracking data." - type: string - format: uri - location: - description: "In case there is no real-time tracking endpoint available, this field will contain the latest location of the entity being tracked. The BPP will update this value everytime the BAP calls the track API." - allOf: - - $ref: "#/components/schemas/Location" - status: - description: "This value indicates if the tracking is currently active or not. If this value is `active`, then the BAP can begin tracking the order. If this value is `inactive`, the tracking URL is considered to be expired and the BAP should stop tracking the order." - type: string - enum: - - active - - inactive - Vehicle: - description: "Describes a vehicle is a device that is designed or used to transport people or cargo over land, water, air, or through space.
This has properties like category, capacity, make, model, size,variant,color,energy_type,registration" - type: object - properties: - category: - type: string - capacity: - type: integer - make: - type: string - model: - type: string - size: - type: string - variant: - type: string - color: - type: string - energy_type: - type: string - registration: - type: string - wheels_count: - type: string - cargo_volumne: - type: string - wheelchair_access: - type: string - code: - type: string - emission_standard: - type: string - XInput: - description: "Contains any additional or extended inputs required to confirm an order. This is typically a Form Input. Sometimes, selection of catalog elements is not enough for the BPP to confirm an order. For example, to confirm a flight ticket, the airline requires details of the passengers along with information on baggage, identity, in addition to the class of ticket. Similarly, a logistics company may require details on the nature of shipment in order to confirm the shipping. A recruiting firm may require additional details on the applicant in order to confirm a job application. For all such purposes, the BPP can choose to send this object attached to any object in the catalog that is required to be sent while placing the order. This object can typically be sent at an item level or at the order level. The item level XInput will override the Order level XInput as it indicates a special requirement of information for that particular item. Hence the BAP must render a separate form for the Item and another form at the Order level before confirmation." - type: object - properties: - form: - $ref: "#/components/schemas/Form" - required: - description: Indicates whether the form data is mandatorily required by the BPP to confirm the order. - type: boolean diff --git a/layer2/samples/dhp_1.1.0.yaml b/layer2/samples/dhp_1.1.0.yaml deleted file mode 100644 index 8ce8b4f..0000000 --- a/layer2/samples/dhp_1.1.0.yaml +++ /dev/null @@ -1,2164 +0,0 @@ -openapi: 3.0.0 -info: - title: DHP Core API - description: DHP Core API specification. This is an adaptation of Beckn core version 1.1.0 - version: 0.7.3 -security: - - SubscriberAuth: [] -paths: - /search: - post: - tags: - - Beckn Provider Platform (BPP) - - Beckn Gateway (BG) - description: BAP declares the customer's intent to buy/avail healthcare services/products. - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - search - message: - type: object - properties: - intent: - $ref: "#/components/schemas/Intent" - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /select: - post: - tags: - - Beckn Provider Platform (BPP) - description: BAP declares the customer's cart (or equivalent) created by selecting objects from the catalog - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - select - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /init: - post: - tags: - - Beckn Provider Platform (BPP) - description: Initialize an order by providing billing and/or shipping details - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - init - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - allOf: - - $ref: "#/components/schemas/Ack" - - properties: - status: - enum: - - ACK - - NACK - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /confirm: - post: - tags: - - Beckn Provider Platform (BPP) - description: Initialize an order by providing billing and/or shipping details - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - confirm - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /status: - post: - tags: - - Beckn Provider Platform (BPP) - description: Fetch the latest order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - status - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - required: - - order_id - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /track: - post: - tags: - - Beckn Provider Platform (BPP) - description: Track an active order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - track - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - callback_url: - type: string - format: uri - required: - - order_id - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /cancel: - post: - tags: - - Beckn Provider Platform (BPP) - description: Cancel an order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - cancel - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - cancellation_reason_id: - $ref: "#/components/schemas/Option/properties/id" - descriptor: - $ref: "#/components/schemas/Descriptor" - required: - - order_id - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /update: - post: - tags: - - Beckn Provider Platform (BPP) - description: Remove object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - update - required: - - action - message: - type: object - properties: - update_target: - description: 'Comma separated values of order objects being updated. For example: ```"update_target":"item,billing,fulfillment"```' - type: string - order: - description: Updated order object - allOf: - - $ref: "#/components/schemas/Order" - required: - - update_target - - order - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /rating: - post: - tags: - - Beckn Provider Platform (BPP) - description: Provide feedback on a service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - rating - required: - - action - message: - type: object - properties: - ratings: - type: array - items: - $ref: "#/components/schemas/Rating" - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /support: - post: - tags: - - Beckn Provider Platform (BPP) - description: Contact support - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - support - required: - - action - message: - type: object - properties: - support: - $ref: "#/components/schemas/Support" - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_search: - post: - tags: - - Beckn Application Platform (BAP) - - Beckn Gateway (BG) - description: BPP sends its catalog in response to a search request. - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_search - required: - - action - message: - type: object - properties: - catalog: - $ref: "#/components/schemas/Catalog" - required: - - catalog - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_select: - post: - tags: - - Beckn Application Platform (BAP) - description: Send draft order object with quoted price for selected items - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_select - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_init: - post: - tags: - - Beckn Application Platform (BAP) - description: Send order object with payment details updated - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_init - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_confirm: - post: - tags: - - Beckn Application Platform (BAP) - description: Send active order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_confirm - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_track: - post: - tags: - - Beckn Application Platform (BAP) - description: Send tracking details of an active order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_track - required: - - action - message: - type: object - properties: - tracking: - $ref: "#/components/schemas/Tracking" - required: - - tracking - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_cancel: - post: - tags: - - Beckn Application Platform (BAP) - description: Send cancellation request_id with reasons list in case of cancellation request. Else send cancelled order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_cancel - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_update: - post: - tags: - - Beckn Application Platform (BAP) - description: Returns updated service with updated runtime object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_update - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_status: - post: - tags: - - Beckn Application Platform (BAP) - description: Fetch the status of a Service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_status - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_rating: - post: - tags: - - Beckn Application Platform (BAP) - description: Provide feedback on a service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_rating - required: - - action - message: - type: object - properties: - feedback_form: - description: A feedback form to allow the user to provide additional information on the rating provided - allOf: - - $ref: "#/components/schemas/XInput" - error: - $ref: "#/components/schemas/Error" - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_support: - post: - tags: - - Beckn Application Platform (BAP) - description: Contact Support - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_support - required: - - action - message: - type: object - properties: - support: - $ref: "#/components/schemas/Support" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" -components: - securitySchemes: - SubscriberAuth: - type: apiKey - in: header - name: Authorization - description: 'Signature of message body using BAP or BPP subscriber''s signing public key.

Format:

Authorization : Signature keyId="{subscriber_id}|{unique_key_id}|{algorithm}",algorithm="ed25519",created="1606970629",expires="1607030629",headers="(created) (expires) digest",signature="Base64(signing string)"' - schemas: - Ack: - description: "Describes the acknowledgement sent in response to an API call. If the implementation uses HTTP/S, then Ack must be returned in the same session. Every API call to a BPP must be responded to with an Ack whether the BPP intends to respond with a callback or not. This has one property called `status` that indicates the status of the Acknowledgement." - type: object - properties: - status: - type: string - description: "The status of the acknowledgement. If the request passes the validation criteria of the BPP, then this is set to ACK. If a BPP responds with status = `ACK` to a request, it is required to respond with a callback. If the request fails the validation criteria, then this is set to NACK. Additionally, if a BPP does not intend to respond with a callback even after the request meets the validation criteria, it should set this value to `NACK`." - enum: - - ACK - - NACK - tags: - description: A list of tags containing any additional information sent along with the Acknowledgement. - type: array - items: - $ref: "#/components/schemas/TagGroup" - AddOn: - description: Describes an additional item offered as a value-addition to a product or service. This does not exist independently in a catalog and is always associated with an item. - type: object - properties: - id: - description: Provider-defined ID of the add-on - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - price: - $ref: "#/components/schemas/Price" - Address: - description: Describes a postal address. - type: string - Agent: - description: "Describes the direct performer, driver or executor that fulfills an order. It is usually a person. But in some rare cases, it could be a non-living entity like a drone, or a bot. Some examples of agents are Doctor in the healthcare sector, a driver in the mobility sector, or a delivery person in the logistics sector. This object can be set at any stage of the order lifecycle. This can be set at the discovery stage when the BPP wants to provide details on the agent fulfilling the order, like in healthcare, where the doctor's name appears during search. This object can also used to search for a particular person that the customer wants fulfilling an order. Sometimes, this object gets instantiated after the order is confirmed, like in the case of on-demand taxis, where the driver is assigned after the user confirms the ride." - properties: - person: - $ref: "#/components/schemas/Person" - contact: - $ref: "#/components/schemas/Contact" - organization: - $ref: "#/components/schemas/Organization" - rating: - $ref: "#/components/schemas/Rating/properties/value" - Authorization: - description: "Describes an authorization mechanism used to start or end the fulfillment of an order. For example, in the mobility sector, the driver may require a one-time password to initiate the ride. In the healthcare sector, a patient may need to provide a password to open a video conference link during a teleconsultation." - type: object - properties: - type: - description: Type of authorization mechanism used. The allowed values for this field can be published as part of the network policy. - type: string - token: - description: "Token used for authorization. This is typically generated at the BPP. The BAP can send this value to the user via any channel that it uses to authenticate the user like SMS, Email, Push notification, or in-app rendering." - type: string - valid_from: - description: Timestamp in RFC3339 format from which token is valid - type: string - format: date-time - valid_to: - description: Timestamp in RFC3339 format until which token is valid - type: string - format: date-time - status: - description: Status of the token - type: string - Billing: - description: "Describes the billing details of an entity.
This has properties like name,organization,address,email,phone,time,tax_number, created_at,updated_at" - type: object - properties: - name: - description: Name of the billable entity - type: string - organization: - description: Details of the organization being billed. - allOf: - - $ref: "#/components/schemas/Organization" - address: - description: The address of the billable entity - allOf: - - $ref: "#/components/schemas/Address" - state: - description: The state where the billable entity resides. This is important for state-level tax calculation - allOf: - - $ref: "#/components/schemas/State" - city: - description: The city where the billable entity resides. - allOf: - - $ref: "#/components/schemas/City" - email: - description: Email address where the bill is sent to - type: string - format: email - phone: - description: Phone number of the billable entity - type: string - time: - description: Details regarding the billing period - allOf: - - $ref: "#/components/schemas/Time" - tax_id: - description: ID of the billable entity as recognized by the taxation authority - type: string - Cancellation: - description: Describes a cancellation event - type: object - properties: - time: - description: Date-time when the order was cancelled by the buyer - type: string - format: date-time - cancelled_by: - type: string - enum: - - CONSUMER - - PROVIDER - reason: - description: The reason for cancellation - allOf: - - $ref: "#/components/schemas/Option" - additional_description: - description: Any additional information regarding the nature of cancellation - allOf: - - $ref: "#/components/schemas/Descriptor" - CancellationTerm: - description: Describes the cancellation terms of an item or an order. This can be referenced at an item or order level. Item-level cancellation terms can override the terms at the order level. - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/FulfillmentState" - reason_required: - description: Indicates whether a reason is required to cancel the order - type: boolean - cancel_by: - description: Information related to the time of cancellation. - allOf: - - $ref: "#/components/schemas/Time" - cancellation_fee: - $ref: "#/components/schemas/Fee" - xinput: - $ref: "#/components/schemas/XInput" - external_ref: - $ref: "#/components/schemas/MediaFile" - Catalog: - description: "Describes the products or services offered by a BPP. This is typically sent as the response to a search intent from a BAP. The payment terms, offers and terms of fulfillment supported by the BPP can also be included here. The BPP can show hierarchical nature of products/services in its catalog using the parent_category_id in categories. The BPP can also send a ttl (time to live) in the context which is the duration for which a BAP can cache the catalog and use the cached catalog.
This has properties like bbp/descriptor,bbp/categories,bbp/fulfillments,bbp/payments,bbp/offers,bbp/providers and exp
This is used in the following situations.
  • This is typically used in the discovery stage when the BPP sends the details of the products and services it offers as response to a search intent from the BAP.
" - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - fulfillments: - description: Fulfillment modes offered at the BPP level. This is used when a BPP itself offers fulfillments on behalf of the providers it has onboarded. - type: array - items: - $ref: "#/components/schemas/Fulfillment" - payments: - description: Payment terms offered by the BPP for all transactions. This can be overriden at the provider level. - type: array - items: - $ref: "#/components/schemas/Payment" - offers: - description: Offers at the BPP-level. This is common across all providers onboarded by the BPP. - type: array - items: - $ref: "#/components/schemas/Offer" - providers: - type: array - items: - $ref: "#/components/schemas/Provider" - exp: - description: Timestamp after which catalog will expire - type: string - format: date-time - ttl: - description: Duration in seconds after which this catalog will expire - type: string - Category: - description: A label under which a collection of items can be grouped. - type: object - properties: - id: - description: ID of the category - type: string - parent_category_id: - $ref: "#/components/schemas/Category/properties/id" - descriptor: - $ref: "#/components/schemas/Descriptor" - time: - $ref: "#/components/schemas/Time" - ttl: - description: Time to live for an instance of this schema - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Circle: - description: Describes a circular region of a specified radius centered at a specified GPS coordinate. - type: object - properties: - gps: - $ref: "#/components/schemas/Gps" - radius: - $ref: "#/components/schemas/Scalar" - City: - description: Describes a city - type: object - properties: - name: - description: Name of the city - type: string - code: - description: City code - type: string - Contact: - description: Describes the contact information of an entity - type: object - properties: - phone: - type: string - email: - type: string - jcard: - type: object - description: A Jcard object as per draft-ietf-jcardcal-jcard-03 specification - Context: - description: "Every API call in beckn protocol has a context. It provides a high-level overview to the receiver about the nature of the intended transaction. Typically, it is the BAP that sets the transaction context based on the consumer's location and action on their UI. But sometimes, during unsolicited callbacks, the BPP also sets the transaction context but it is usually the same as the context of a previous full-cycle, request-callback interaction between the BAP and the BPP. The context object contains four types of fields.
  1. Demographic information about the transaction using fields like `domain`, `country`, and `region`.
  2. Addressing details like the sending and receiving platform's ID and API URL.
  3. Interoperability information like the protocol version that implemented by the sender and,
  4. Transaction details like the method being called at the receiver's endpoint, the transaction_id that represents an end-to-end user session at the BAP, a message ID to pair requests with callbacks, a timestamp to capture sending times, a ttl to specifiy the validity of the request, and a key to encrypt information if necessary.
This object must be passed in every interaction between a BAP and a BPP. In HTTP/S implementations, it is not necessary to send the context during the synchronous response. However, in asynchronous protocols, the context must be sent during all interactions," - type: object - properties: - domain: - description: Domain code that is relevant to this transaction context - allOf: - - $ref: "#/components/schemas/Domain/properties/code" - location: - description: The location where the transaction is intended to be fulfilled. - allOf: - - $ref: "#/components/schemas/Location" - action: - description: The Beckn protocol method being called by the sender and executed at the receiver. - type: string - version: - type: string - description: Version of transaction protocol being used by the sender. - bap_id: - description: Subscriber ID of the BAP - allOf: - - description: "A globally unique identifier of the platform, Typically it is the fully qualified domain name (FQDN) of the platform." - type: string - bap_uri: - description: Subscriber URL of the BAP for accepting callbacks from BPPs. - allOf: - - description: The callback URL of the Subscriber. This should necessarily contain the same domain name as set in `subscriber_id``. - type: string - format: uri - bpp_id: - description: Subscriber ID of the BPP - allOf: - - $ref: "#/components/schemas/Context/properties/bap_id/allOf/0" - bpp_uri: - description: Subscriber URL of the BPP for accepting calls from BAPs. - allOf: - - $ref: "#/components/schemas/Context/properties/bap_uri/allOf/0" - transaction_id: - description: "This is a unique value which persists across all API calls from `search` through `confirm`. This is done to indicate an active user session across multiple requests. The BPPs can use this value to push personalized recommendations, and dynamic offerings related to an ongoing transaction despite being unaware of the user active on the BAP." - type: string - format: uuid - message_id: - description: "This is a unique value which persists during a request / callback cycle. Since beckn protocol APIs are asynchronous, BAPs need a common value to match an incoming callback from a BPP to an earlier call. This value can also be used to ignore duplicate messages coming from the BPP. It is recommended to generate a fresh message_id for every new interaction. When sending unsolicited callbacks, BPPs must generate a new message_id." - type: string - format: uuid - timestamp: - description: Time of request generation in RFC3339 format - type: string - format: date-time - key: - description: The encryption public key of the sender - type: string - ttl: - description: The duration in ISO8601 format after timestamp for which this message holds valid - type: string - Country: - description: Describes a country - type: object - properties: - name: - type: string - description: Name of the country - code: - type: string - description: Country code as per ISO 3166-1 and ISO 3166-2 format - Credential: - description: Describes a credential of an entity - Person or Organization - type: object - properties: - id: - type: string - type: - type: string - default: VerifiableCredential - url: - description: URL of the credential - type: string - format: uri - Customer: - description: Describes a customer buying/availing a product or a service - type: object - properties: - person: - $ref: "#/components/schemas/Person" - contact: - $ref: "#/components/schemas/Contact" - DecimalValue: - description: Describes a numerical value in decimal form - type: string - pattern: "[+-]?([0-9]*[.])?[0-9]+" - Descriptor: - description: Physical description of something. - type: object - properties: - name: - type: string - code: - type: string - short_desc: - type: string - long_desc: - type: string - additional_desc: - type: object - properties: - url: - type: string - content_type: - type: string - enum: - - text/plain - - text/html - - application/json - media: - type: array - items: - $ref: "#/components/schemas/MediaFile" - images: - type: array - items: - $ref: "#/components/schemas/Image" - Domain: - description: "Described the industry sector or sub-sector. The network policy should contain codes for all the industry sectors supported by the network. Domains can be created in varying levels of granularity. The granularity of a domain can be decided by the participants of the network. Too broad domains will result in irrelevant search broadcast calls to BPPs that don't have services supporting the domain. Too narrow domains will result in a large number of registry entries for each BPP. It is recommended that network facilitators actively collaborate with various working groups and network participants to carefully choose domain codes keeping in mind relevance, performance, and opportunity cost. It is recommended that networks choose broad domains like mobility, logistics, healthcare etc, and progressively granularize them as and when the number of network participants for each domain grows large." - type: object - properties: - name: - description: Name of the domain - type: string - code: - description: "Standard code representing the domain. The standard is usually published as part of the network policy. Furthermore, the network facilitator should also provide a mechanism to provide the supported domains of a network." - additional_info: - description: A url that contains addtional information about that domain. - allOf: - - $ref: "#/components/schemas/MediaFile" - Duration: - description: Describes duration as per ISO8601 format - type: string - Error: - description: "Describes an error object that is returned by a BAP, BPP or BG as a response or callback to an action by another network participant. This object is sent when any request received by a network participant is unacceptable. This object can be sent either during Ack or with the callback." - type: object - properties: - code: - type: string - description: 'Standard error code. For full list of error codes, refer to docs/protocol-drafts/BECKN-005-ERROR-CODES-DRAFT-01.md of this repo"' - paths: - type: string - description: Path to json schema generating the error. Used only during json schema validation errors - message: - type: string - description: Human readable message describing the error. Used mainly for logging. Not recommended to be shown to the user. - Fee: - description: A fee applied on a particular entity - type: object - properties: - percentage: - description: Percentage of a value - allOf: - - $ref: "#/components/schemas/DecimalValue" - amount: - description: A fixed value - allOf: - - $ref: "#/components/schemas/Price" - Form: - description: Describes a form - type: object - properties: - url: - description: "The URL from where the form can be fetched. The content fetched from the url must be processed as per the mime_type specified in this object. Once fetched, the rendering platform can choosed to render the form as-is as an embeddable element; or process it further to blend with the theme of the application. In case the interface is non-visual, the the render can process the form data and reproduce it as per the standard specified in the form." - type: string - format: uri - data: - description: The form submission data - type: object - additionalProperties: - type: string - mime_type: - description: This field indicates the nature and format of the form received by querying the url. MIME types are defined and standardized in IETF's RFC 6838. - type: string - enum: - - text/html - - application/xml - submission_id: - type: string - format: uuid - Fulfillment: - description: Describes how a an order will be rendered/fulfilled to the end-customer - type: object - properties: - id: - description: Unique reference ID to the fulfillment of an order - type: string - type: - description: "A code that describes the mode of fulfillment. This is typically set when there are multiple ways an order can be fulfilled. For example, a retail order can be fulfilled either via store pickup or a home delivery. Similarly, a medical consultation can be provided either in-person or via tele-consultation. The network policy must publish standard fulfillment type codes for the different modes of fulfillment." - type: string - rateable: - description: Whether the fulfillment can be rated or not - type: boolean - rating: - description: The rating value of the fulfullment service. - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - state: - description: The current state of fulfillment. The BPP must set this value whenever the state of the order fulfillment changes and fire an unsolicited `on_status` call. - allOf: - - $ref: "#/components/schemas/FulfillmentState" - tracking: - type: boolean - description: Indicates whether the fulfillment allows tracking - default: false - customer: - description: The person that will ultimately receive the order - allOf: - - $ref: "#/components/schemas/Customer" - agent: - description: The agent that is currently handling the fulfillment of the order - allOf: - - $ref: "#/components/schemas/Agent" - contact: - $ref: "#/components/schemas/Contact" - vehicle: - $ref: "#/components/schemas/Vehicle" - stops: - description: The list of logical stops encountered during the fulfillment of an order. - type: array - items: - $ref: "#/components/schemas/Stop" - path: - description: The physical path taken by the agent that can be rendered on a map. The allowed format of this property can be set by the network. - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - FulfillmentState: - description: Describes the state of fulfillment - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - updated_at: - type: string - format: date-time - updated_by: - type: string - description: ID of entity which changed the state - Gps: - description: Describes a GPS coordinate - type: string - pattern: '^[-+]?([1-8]?\d(\.\d+)?|90(\.0+)?),\s*[-+]?(180(\.0+)?|((1[0-7]\d)|([1-9]?\d))(\.\d+)?)$' - Image: - description: Describes an image - type: object - properties: - url: - description: URL to the image. This can be a data url or an remote url - type: string - format: uri - size_type: - description: The size of the image. The network policy can define the default dimensions of each type - type: string - enum: - - xs - - sm - - md - - lg - - xl - - custom - width: - description: Width of the image in pixels - type: string - height: - description: Height of the image in pixels - type: string - Intent: - description: "The intent to buy or avail a product or a service. The BAP can declare the intent of the consumer containing
  • What they want (A product, service, offer)
  • Who they want (A seller, service provider, agent etc)
  • Where they want it and where they want it from
  • When they want it (start and end time of fulfillment
  • How they want to pay for it

This has properties like descriptor,provider,fulfillment,payment,category,offer,item,tags
This is typically used by the BAP to send the purpose of the user's search to the BPP. This will be used by the BPP to find products or services it offers that may match the user's intent.
For example, in Mobility, the mobility consumer declares a mobility intent. In this case, the mobility consumer declares information that describes various aspects of their journey like,
  • Where would they like to begin their journey (intent.fulfillment.start.location)
  • Where would they like to end their journey (intent.fulfillment.end.location)
  • When would they like to begin their journey (intent.fulfillment.start.time)
  • When would they like to end their journey (intent.fulfillment.end.time)
  • Who is the transport service provider they would like to avail services from (intent.provider)
  • Who is traveling (This is not recommended in public networks) (intent.fulfillment.customer)
  • What kind of fare product would they like to purchase (intent.item)
  • What add-on services would they like to avail
  • What offers would they like to apply on their booking (intent.offer)
  • What category of services would they like to avail (intent.category)
  • What additional luggage are they carrying
  • How would they like to pay for their journey (intent.payment)

For example, in health domain, a consumer declares the intent for a lab booking the describes various aspects of their booking like,
  • Where would they like to get their scan/test done (intent.fulfillment.start.location)
  • When would they like to get their scan/test done (intent.fulfillment.start.time)
  • When would they like to get the results of their test/scan (intent.fulfillment.end.time)
  • Who is the service provider they would like to avail services from (intent.provider)
  • Who is getting the test/scan (intent.fulfillment.customer)
  • What kind of test/scan would they like to purchase (intent.item)
  • What category of services would they like to avail (intent.category)
  • How would they like to pay for their journey (intent.payment)
" - type: object - properties: - descriptor: - description: "A raw description of the search intent. Free text search strings, raw audio, etc can be sent in this object." - allOf: - - $ref: "#/components/schemas/Descriptor" - provider: - description: The provider from which the customer wants to place to the order from - allOf: - - $ref: "#/components/schemas/Provider" - fulfillment: - description: Details on how the customer wants their order fulfilled - allOf: - - $ref: "#/components/schemas/Fulfillment" - payment: - description: Details on how the customer wants to pay for the order - allOf: - - $ref: "#/components/schemas/Payment" - category: - description: Details on the item category - allOf: - - $ref: "#/components/schemas/Category" - offer: - description: details on the offer the customer wants to avail - allOf: - - $ref: "#/components/schemas/Offer" - item: - description: Details of the item that the consumer wants to order - allOf: - - $ref: "#/components/schemas/Item" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - ItemQuantity: - description: Describes the count or amount of an item - type: object - properties: - allocated: - description: This represents the exact quantity allocated for purchase of the item. - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - available: - description: This represents the exact quantity available for purchase of the item. The buyer can only purchase multiples of this - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - maximum: - description: This represents the maximum quantity allowed for purchase of the item - type: object - properties: - count: - type: integer - minimum: 1 - measure: - $ref: "#/components/schemas/Scalar" - minimum: - description: This represents the minimum quantity allowed for purchase of the item - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - selected: - description: This represents the quantity selected for purchase of the item - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - unitized: - description: This represents the quantity available in a single unit of the item - type: object - properties: - count: - type: integer - minimum: 1 - maximum: 1 - measure: - $ref: "#/components/schemas/Scalar" - Item: - description: "Describes a product or a service offered to the end consumer by the provider. In the mobility sector, it can represent a fare product like one way journey. In the logistics sector, it can represent the delivery service offering. In the retail domain it can represent a product like a grocery item." - type: object - properties: - id: - description: ID of the item. - type: string - parent_item_id: - description: "ID of the item, this item is a variant of" - allOf: - - $ref: "#/components/schemas/Item/properties/id" - parent_item_quantity: - description: The number of units of the parent item this item is a multiple of - allOf: - - $ref: "#/components/schemas/ItemQuantity" - descriptor: - description: Physical description of the item - allOf: - - $ref: "#/components/schemas/Descriptor" - creator: - description: The creator of this item - allOf: - - $ref: "#/components/schemas/Organization" - price: - description: "The price of this item, if it has intrinsic value" - allOf: - - $ref: "#/components/schemas/Price" - quantity: - description: The selling quantity of the item - allOf: - - $ref: "#/components/schemas/ItemQuantity" - category_ids: - description: Categories this item can be listed under - type: array - items: - allOf: - - $ref: "#/components/schemas/Category/properties/id" - fulfillment_ids: - description: Modes through which this item can be fulfilled - type: array - items: - allOf: - - $ref: "#/components/schemas/Fulfillment/properties/id" - location_ids: - description: Provider Locations this item is available in - type: array - items: - allOf: - - $ref: "#/components/schemas/Location/properties/id" - payment_ids: - description: Payment modalities through which this item can be ordered - type: array - items: - allOf: - - $ref: "#/components/schemas/Payment/properties/id" - add_ons: - type: array - items: - $ref: "#/components/schemas/AddOn" - cancellation_terms: - description: Cancellation terms of this item - type: array - items: - $ref: "#/components/schemas/CancellationTerm" - refund_terms: - description: Refund terms of this item - type: array - items: - description: Refund term of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/State" - refund_eligible: - description: Indicates if cancellation will result in a refund - type: boolean - refund_within: - description: Time within which refund will be processed after successful cancellation. - allOf: - - $ref: "#/components/schemas/Time" - refund_amount: - $ref: "#/components/schemas/Price" - replacement_terms: - description: Terms that are applicable be met when this item is replaced - type: array - items: - $ref: "#/components/schemas/ReplacementTerm" - return_terms: - description: Terms that are applicable when this item is returned - type: array - items: - $ref: "#/components/schemas/ReturnTerm" - xinput: - description: Additional input required from the customer to purchase / avail this item - allOf: - - $ref: "#/components/schemas/XInput" - time: - description: Temporal attributes of this item. This property is used when the item exists on the catalog only for a limited period of time. - allOf: - - $ref: "#/components/schemas/Time" - rateable: - description: Whether this item can be rated - type: boolean - rating: - description: The rating of the item - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - matched: - description: Whether this item is an exact match of the request - type: boolean - related: - description: Whether this item is a related item to the exactly matched item - type: boolean - recommended: - description: Whether this item is a recommended item to a response - type: boolean - ttl: - description: Time to live in seconds for an instance of this schema - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Location: - description: The physical location of something - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - map_url: - description: The url to the map of the location. This can be a globally recognized map url or the one specified by the network policy. - type: string - format: uri - gps: - description: The GPS co-ordinates of this location. - allOf: - - $ref: "#/components/schemas/Gps" - address: - description: The address of this location. - allOf: - - $ref: "#/components/schemas/Address" - city: - description: "The city this location is, or is located within" - allOf: - - $ref: "#/components/schemas/City" - district: - description: "The state this location is, or is located within" - type: string - state: - description: "The state this location is, or is located within" - allOf: - - $ref: "#/components/schemas/State" - country: - description: "The country this location is, or is located within" - allOf: - - $ref: "#/components/schemas/Country" - area_code: - type: string - circle: - $ref: "#/components/schemas/Circle" - polygon: - description: The boundary polygon of this location - type: string - 3dspace: - description: The three dimensional region describing this location - type: string - rating: - description: The rating of this location - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - MediaFile: - description: This object contains a url to a media file. - type: object - properties: - mimetype: - description: "indicates the nature and format of the document, file, or assortment of bytes. MIME types are defined and standardized in IETF's RFC 6838" - type: string - url: - description: The URL of the file - type: string - format: uri - signature: - description: The digital signature of the file signed by the sender - type: string - dsa: - description: The signing algorithm used by the sender - type: string - Offer: - description: An offer associated with a catalog. This is typically used to promote a particular product and enable more purchases. - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - location_ids: - type: array - items: - $ref: "#/components/schemas/Location/properties/id" - category_ids: - type: array - items: - $ref: "#/components/schemas/Category/properties/id" - item_ids: - type: array - items: - $ref: "#/components/schemas/Item/properties/id" - time: - $ref: "#/components/schemas/Time" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Option: - description: Describes a selectable option - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - Order: - description: Describes a legal purchase order. It contains the complete details of the legal contract created between the buyer and the seller. - type: object - properties: - id: - type: string - description: Human-readable ID of the order. This is generated at the BPP layer. The BPP can either generate order id within its system or forward the order ID created at the provider level. - ref_order_ids: - description: A list of order IDs to link this order to previous orders. - type: array - items: - type: string - description: ID of a previous order - status: - description: Status of the order. Allowed values can be defined by the network policy - type: string - enum: - - ACTIVE - - COMPLETE - - CANCELLED - type: - description: "This is used to indicate the type of order being created to BPPs. Sometimes orders can be linked to previous orders, like a replacement order in a retail domain. A follow-up consultation in healthcare domain. A single order part of a subscription order. The list of order types can be standardized at the network level." - type: string - default: DEFAULT - enum: - - DRAFT - - DEFAULT - provider: - description: Details of the provider whose catalog items have been selected. - allOf: - - $ref: "#/components/schemas/Provider" - items: - description: The items purchased / availed in this order - type: array - items: - $ref: "#/components/schemas/Item" - add_ons: - description: The add-ons purchased / availed in this order - type: array - items: - $ref: "#/components/schemas/AddOn" - offers: - description: The offers applied in this order - type: array - items: - $ref: "#/components/schemas/Offer" - billing: - description: The billing details of this order - allOf: - - $ref: "#/components/schemas/Billing" - fulfillments: - description: The fulfillments involved in completing this order - type: array - items: - $ref: "#/components/schemas/Fulfillment" - cancellation: - description: The cancellation details of this order - allOf: - - $ref: "#/components/schemas/Cancellation" - cancellation_terms: - description: Cancellation terms of this item - type: array - items: - $ref: "#/components/schemas/CancellationTerm" - refund_terms: - description: Refund terms of this item - type: array - items: - $ref: "#/components/schemas/Item/properties/refund_terms/items" - replacement_terms: - description: Replacement terms of this item - type: array - items: - $ref: "#/components/schemas/ReplacementTerm" - return_terms: - description: Return terms of this item - type: array - items: - $ref: "#/components/schemas/ReturnTerm" - quote: - description: The mutually agreed upon quotation for this order. - allOf: - - $ref: "#/components/schemas/Quotation" - payments: - description: The terms of settlement for this order - type: array - items: - $ref: "#/components/schemas/Payment" - created_at: - description: The date-time of creation of this order - type: string - format: date-time - updated_at: - description: The date-time of updated of this order - type: string - format: date-time - xinput: - description: Additional input required from the customer to confirm this order - allOf: - - $ref: "#/components/schemas/XInput" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Organization: - description: An organization. Usually a recognized business entity. - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - address: - description: The postal address of the organization - allOf: - - $ref: "#/components/schemas/Address" - state: - description: The state where the organization's address is registered - allOf: - - $ref: "#/components/schemas/State" - city: - description: The city where the the organization's address is registered - allOf: - - $ref: "#/components/schemas/City" - contact: - $ref: "#/components/schemas/Contact" - Payment: - description: "Describes the terms of settlement between the BAP and the BPP for a single transaction. When instantiated, this object contains
  1. the amount that has to be settled,
  2. The payment destination destination details
  3. When the settlement should happen, and
  4. A transaction reference ID
. During a transaction, the BPP reserves the right to decide the terms of payment. However, the BAP can send its terms to the BPP first. If the BPP does not agree to those terms, it must overwrite the terms and return them to the BAP. If overridden, the BAP must either agree to the terms sent by the BPP in order to preserve the provider's autonomy, or abort the transaction. In case of such disagreements, the BAP and the BPP can perform offline negotiations on the payment terms. Once an agreement is reached, the BAP and BPP can resume transactions." - type: object - properties: - id: - description: ID of the payment term that can be referred at an item or an order level in a catalog - type: string - collected_by: - description: "This field indicates who is the collector of payment. The BAP can set this value to 'bap' if it wants to collect the payment first and settle it to the BPP. If the BPP agrees to those terms, the BPP should not send the payment url. Alternatively, the BPP can set this field with the value 'bpp' if it wants the payment to be made directly." - url: - type: string - description: "A payment url to be called by the BAP. If empty, then the payment is to be done offline. The details of payment should be present in the params object. If tl_method = http/get, then the payment details will be sent as url params. Two url param values, ```$transaction_id``` and ```$amount``` are mandatory." - format: uri - params: - type: object - properties: - transaction_id: - type: string - description: The reference transaction ID associated with a payment activity - amount: - type: string - currency: - type: string - bank_code: - type: string - bank_account_number: - type: string - virtual_payment_address: - type: string - source_bank_code: - type: string - source_bank_account_number: - type: string - source_virtual_payment_address: - type: string - type: - type: string - enum: - - PRE-ORDER - - PRE-FULFILLMENT - - ON-FULFILLMENT - - POST-FULFILLMENT - status: - type: string - enum: - - PAID - - NOT-PAID - time: - $ref: "#/components/schemas/Time" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Person: - description: Describes a person as any individual - type: object - properties: - id: - type: string - description: Describes the identity of the person - url: - description: Profile url of the person - type: string - format: uri - name: - description: the name of the person - type: string - image: - $ref: "#/components/schemas/Image" - age: - description: Age of the person - allOf: - - $ref: "#/components/schemas/Duration" - dob: - description: Date of birth of the person - type: string - format: date - gender: - type: string - description: "Gender of something, typically a Person, but possibly also fictional characters, animals, etc. While Male and Female may be used, text strings are also acceptable for people who do not identify as a binary gender.Allowed values for this field can be published in the network policy" - creds: - type: array - items: - $ref: "#/components/schemas/Credential" - languages: - type: array - items: - description: Describes a language known to the person. - type: object - properties: - code: - type: string - name: - type: string - skills: - type: array - items: - description: Describes a skill of the person. - type: object - properties: - code: - type: string - name: - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Price: - description: Describes the price of a product or service - type: object - properties: - currency: - type: string - value: - $ref: "#/components/schemas/DecimalValue" - estimated_value: - $ref: "#/components/schemas/DecimalValue" - computed_value: - $ref: "#/components/schemas/DecimalValue" - listed_value: - $ref: "#/components/schemas/DecimalValue" - offered_value: - $ref: "#/components/schemas/DecimalValue" - minimum_value: - $ref: "#/components/schemas/DecimalValue" - maximum_value: - $ref: "#/components/schemas/DecimalValue" - Provider: - description: Describes the catalog of a business. - type: object - properties: - id: - type: string - description: Id of the provider - descriptor: - $ref: "#/components/schemas/Descriptor" - category_id: - type: string - description: Category Id of the provider at the BPP-level catalog - rating: - $ref: "#/components/schemas/Rating/properties/value" - time: - $ref: "#/components/schemas/Time" - categories: - type: array - items: - $ref: "#/components/schemas/Category" - fulfillments: - type: array - items: - $ref: "#/components/schemas/Fulfillment" - payments: - type: array - items: - $ref: "#/components/schemas/Payment" - locations: - type: array - items: - $ref: "#/components/schemas/Location" - offers: - type: array - items: - $ref: "#/components/schemas/Offer" - items: - type: array - items: - $ref: "#/components/schemas/Item" - exp: - type: string - description: Time after which catalog has to be refreshed - format: date-time - rateable: - description: Whether this provider can be rated or not - type: boolean - ttl: - description: "The time-to-live in seconds, for this object. This can be overriden at deeper levels. A value of -1 indicates that this object is not cacheable." - type: integer - minimum: -1 - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Quotation: - description: "Describes a quote. It is the estimated price of products or services from the BPP.
This has properties like price, breakup, ttl" - type: object - properties: - id: - description: ID of the quote. - type: string - format: uuid - price: - description: The total quoted price - allOf: - - $ref: "#/components/schemas/Price" - breakup: - description: the breakup of the total quoted price - type: array - items: - type: object - properties: - item: - $ref: "#/components/schemas/Item" - title: - type: string - price: - $ref: "#/components/schemas/Price" - ttl: - $ref: "#/components/schemas/Duration" - Rating: - description: Describes the rating of an entity - type: object - properties: - rating_category: - description: Category of the entity being rated - type: string - enum: - - Item - - Order - - Fulfillment - - Provider - - Agent - - Support - id: - description: Id of the object being rated - type: string - value: - description: "Rating value given to the object. This can be a single value or can also contain an inequality operator like gt, gte, lt, lte. This can also contain an inequality expression containing logical operators like && and ||." - type: string - Region: - description: Describes an arbitrary region of space. The network policy should contain a published list of supported regions by the network. - type: object - properties: - dimensions: - description: "The number of dimensions that are used to describe any point inside that region. The most common dimensionality of a region is 2, that represents an area on a map. There are regions on the map that can be approximated to one-dimensional regions like roads, railway lines, or shipping lines. 3 dimensional regions are rarer, but are gaining popularity as flying drones are being adopted for various fulfillment services." - type: string - enum: - - "1" - - "2" - - "3" - type: - description: "The type of region. This is used to specify the granularity of the region represented by this object. Various examples of two-dimensional region types are city, country, state, district, and so on. The network policy should contain a list of all possible region types supported by the network." - type: string - name: - type: string - description: Name of the region as specified on the map where that region exists. - code: - type: string - description: A standard code representing the region. This should be interpreted in the same way by all network participants. - boundary: - type: string - description: "A string representing the boundary of the region. One-dimensional regions are represented by polylines. Two-dimensional regions are represented by polygons, and three-dimensional regions can represented by polyhedra." - map_url: - type: string - description: The url to the map of the region. This can be a globally recognized map or the one specified by the network policy. - ReplacementTerm: - description: The replacement policy of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/State" - replace_within: - description: "Applicable only for buyer managed returns where the buyer has to replace the item before a certain date-time, failing which they will not be eligible for replacement" - allOf: - - $ref: "#/components/schemas/Time" - external_ref: - $ref: "#/components/schemas/MediaFile" - ReturnTerm: - description: Describes the return policy of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term IETF''s applicable. - allOf: - - $ref: "#/components/schemas/State" - return_eligible: - description: Indicates whether the item is eligible for return - type: boolean - return_time: - description: "Applicable only for buyer managed returns where the buyer has to return the item to the origin before a certain date-time, failing which they will not be eligible for refund." - allOf: - - $ref: "#/components/schemas/Time" - return_location: - description: The location where the item or order must / will be returned to - allOf: - - $ref: "#/components/schemas/Location" - fulfillment_managed_by: - description: The entity that will perform the return - type: string - enum: - - CONSUMER - - PROVIDER - Scalar: - description: Describes a scalar - type: object - properties: - type: - type: string - enum: - - CONSTANT - - VARIABLE - value: - $ref: "#/components/schemas/DecimalValue" - estimated_value: - $ref: "#/components/schemas/DecimalValue" - computed_value: - $ref: "#/components/schemas/DecimalValue" - range: - type: object - properties: - min: - $ref: "#/components/schemas/DecimalValue" - max: - $ref: "#/components/schemas/DecimalValue" - unit: - type: string - Schedule: - description: "Describes schedule as a repeating time period used to describe a regularly recurring event. At a minimum a schedule will specify frequency which describes the interval between occurrences of the event. Additional information can be provided to specify the schedule more precisely. This includes identifying the timestamps(s) of when the event will take place. Schedules may also have holidays to exclude a specific day from the schedule.
This has properties like frequency, holidays, times" - type: object - properties: - frequency: - $ref: "#/components/schemas/Duration" - holidays: - type: array - items: - type: string - format: date-time - times: - type: array - items: - type: string - format: date-time - State: - description: A bounded geopolitical region of governance inside a country. - type: object - properties: - name: - type: string - description: Name of the state - code: - type: string - description: State code as per country or international standards - Stop: - description: A logical point in space and time during the fulfillment of an order. - type: object - properties: - id: - type: string - parent_stop_id: - type: string - location: - description: Location of the stop - allOf: - - $ref: "#/components/schemas/Location" - type: - description: The type of stop. Allowed values of this property can be defined by the network policy. - type: string - time: - description: Timings applicable at the stop. - allOf: - - $ref: "#/components/schemas/Time" - instructions: - description: Instructions that need to be followed at the stop - allOf: - - $ref: "#/components/schemas/Descriptor" - contact: - description: Contact details of the stop - allOf: - - $ref: "#/components/schemas/Contact" - person: - description: The details of the person present at the stop - allOf: - - $ref: "#/components/schemas/Person" - authorization: - $ref: "#/components/schemas/Authorization" - Support: - description: Details of customer support - type: object - properties: - ref_id: - type: string - callback_phone: - type: string - format: phone - phone: - type: string - format: phone - email: - type: string - format: email - url: - type: string - format: uri - Tag: - description: "Describes a tag. This is used to contain extended metadata. This object can be added as a property to any schema to describe extended attributes. For BAPs, tags can be sent during search to optimize and filter search results. BPPs can use tags to index their catalog to allow better search functionality. Tags are sent by the BPP as part of the catalog response in the `on_search` callback. Tags are also meant for display purposes. Upon receiving a tag, BAPs are meant to render them as name-value pairs. This is particularly useful when rendering tabular information about a product or service." - type: object - properties: - descriptor: - description: "Description of the Tag, can be used to store detailed information." - allOf: - - $ref: "#/components/schemas/Descriptor" - value: - description: The value of the tag. This set by the BPP and rendered as-is by the BAP. - type: string - display: - description: "This value indicates if the tag is intended for display purposes. If set to `true`, then this tag must be displayed. If it is set to `false`, it should not be displayed. This value can override the group display value." - type: boolean - TagGroup: - description: "A collection of tag objects with group level attributes. For detailed documentation on the Tags and Tag Groups schema go to https://github.com/beckn/protocol-specifications/discussions/316" - type: object - properties: - display: - description: "Indicates the display properties of the tag group. If display is set to false, then the group will not be displayed. If it is set to true, it should be displayed. However, group-level display properties can be overriden by individual tag-level display property. As this schema is purely for catalog display purposes, it is not recommended to send this value during search." - type: boolean - default: true - descriptor: - description: "Description of the TagGroup, can be used to store detailed information." - allOf: - - $ref: "#/components/schemas/Descriptor" - list: - description: "An array of Tag objects listed under this group. This property can be set by BAPs during search to narrow the `search` and achieve more relevant results. When received during `on_search`, BAPs must render this list under the heading described by the `name` property of this schema." - type: array - items: - $ref: "#/components/schemas/Tag" - Time: - description: "Describes time in its various forms. It can be a single point in time; duration; or a structured timetable of operations
This has properties like label, time stamp,duration,range, days, schedule" - type: object - properties: - label: - type: string - timestamp: - type: string - format: date-time - duration: - $ref: "#/components/schemas/Duration" - range: - type: object - properties: - start: - type: string - format: date-time - end: - type: string - format: date-time - days: - type: string - description: comma separated values representing days of the week - schedule: - $ref: "#/components/schemas/Schedule" - Tracking: - description: Contains tracking information that can be used by the BAP to track the fulfillment of an order in real-time. which is useful for knowing the location of time sensitive deliveries. - type: object - properties: - id: - description: A unique tracking reference number - type: string - url: - description: "A URL to the tracking endpoint. This can be a link to a tracking webpage, a webhook URL created by the BAP where BPP can push the tracking data, or a GET url creaed by the BPP which the BAP can poll to get the tracking data. It can also be a websocket URL where the BPP can push real-time tracking data." - type: string - format: uri - location: - description: "In case there is no real-time tracking endpoint available, this field will contain the latest location of the entity being tracked. The BPP will update this value everytime the BAP calls the track API." - allOf: - - $ref: "#/components/schemas/Location" - status: - description: "This value indicates if the tracking is currently active or not. If this value is `active`, then the BAP can begin tracking the order. If this value is `inactive`, the tracking URL is considered to be expired and the BAP should stop tracking the order." - type: string - enum: - - active - - inactive - Vehicle: - description: "Describes a vehicle is a device that is designed or used to transport people or cargo over land, water, air, or through space.
This has properties like category, capacity, make, model, size,variant,color,energy_type,registration" - type: object - properties: - category: - type: string - capacity: - type: integer - make: - type: string - model: - type: string - size: - type: string - variant: - type: string - color: - type: string - energy_type: - type: string - registration: - type: string - wheels_count: - type: string - cargo_volumne: - type: string - wheelchair_access: - type: string - code: - type: string - emission_standard: - type: string - XInput: - description: "Contains any additional or extended inputs required to confirm an order. This is typically a Form Input. Sometimes, selection of catalog elements is not enough for the BPP to confirm an order. For example, to confirm a flight ticket, the airline requires details of the passengers along with information on baggage, identity, in addition to the class of ticket. Similarly, a logistics company may require details on the nature of shipment in order to confirm the shipping. A recruiting firm may require additional details on the applicant in order to confirm a job application. For all such purposes, the BPP can choose to send this object attached to any object in the catalog that is required to be sent while placing the order. This object can typically be sent at an item level or at the order level. The item level XInput will override the Order level XInput as it indicates a special requirement of information for that particular item. Hence the BAP must render a separate form for the Item and another form at the Order level before confirmation." - type: object - properties: - form: - $ref: "#/components/schemas/Form" - required: - description: Indicates whether the form data is mandatorily required by the BPP to confirm the order. - type: boolean diff --git a/layer2/samples/dsep_1.1.0.yaml b/layer2/samples/dsep_1.1.0.yaml deleted file mode 100644 index bfac183..0000000 --- a/layer2/samples/dsep_1.1.0.yaml +++ /dev/null @@ -1,3063 +0,0 @@ -openapi: 3.0.0 -info: - title: Decentralized Skilling and Education Protocol Specification - description: Adaptation of beckn protocol for the domain of skilling and education - version: 0.7.0 - -security: - - SubscriberAuth: [] - - GatewaySubscriberAuthNew: [] -paths: - /search: - post: - tags: - - Beckn Provider Platform (BPP) - - Beckn Gateway (BG) - description: This allows a BAP to discover for catalogs offering
a) Jobs and Internships
b) Trainings and Courses
c) Mentors and Coaches and,
d) Scholarships and Grants - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - search - message: - type: object - properties: - intent: - $ref: "#/components/schemas/Intent" - required: - - context - - message - examples: - Search for 'web design' jobs by category code in the region of Delhi: - value: - context: - domain: jobs - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - ttl: P10S - message: - intent: - category: - descriptor: - name: Web design jobs - code: nic2008:62012 - Search for jobs by skills like carpentry and painting: - value: - context: - domain: jobs - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/uhi/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - message: - intent: - fulfillment: - customer: - person: - skills: - - name: Painting - - name: Carpentry - tags: - - descriptor: - name: Competence - list: - - descriptor: - name: Experience - value: 12Y - - Search for jobs along with expected salary: - value: - context: - domain: jobs - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/uhi/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - message: - intent: - fulfillment: - customer: - person: - skills: - - name: Java Programming - tags: - - descriptor: - name: Competence - list: - - descriptor: - name: Experience - value: 12Y - tags: - - descriptor: - name: Expectations - list: - - descriptor: - name: expected_payment - value: 250000INR/Month - - Search for jobs offered by a specific provider: - value: - context: - domain: jobs - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/uhi/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - message: - intent: - provider: - descriptor: - name: Infosys - Search for online courses matching a specific topic: - value: - context: - domain: trainings-and-courses - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/v0/ - bpp_id: https://mymentor.com/ - bpp_uri: https://api.mymentor.com/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - ttl: P10S - message: - intent: - item: - descriptor: - name: AI basics - tags: - - descriptor: - name: course_labels - list: - - descriptor: - name: label_1 - value: AI - - descriptor: - name: label_2 - value: ML - - descriptor: - name: label_3 - value: beginners - - descriptor: - name: label_4 - value: Artifical Intelligence - - descriptor: - name: label_5 - value: machine learning - - descriptor: - name: label_6 - value: neural networks - fulfillment: - type: FULL-TIME - Search for BTech courses offered by an engineering instituition like IIT Delhi: - value: - context: - domain: trainings-and-courses - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/v0/ - bpp_id: https://mymentor.com/ - bpp_uri: https://api.mymentor.com/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - ttl: P10S - message: - intent: - provider: - descriptor: - name: IIT Delhi - tags: - - descriptor: - name: course_labels - list: - - descriptor: - name: label_1 - value: AI - - descriptor: - name: label_2 - value: ML - - descriptor: - name: label_3 - value: beginners - - descriptor: - name: label_4 - value: Artifical Intelligence - - descriptor: - name: label_5 - value: machine learning - - descriptor: - name: label_6 - value: neural networks - category: - descriptor: - name: B.Tech - code: BTECH - fulfillment: - type: FULL-TIME - Searching for a mentor by name: - value: - context: - domain: mentorship-and-coaching - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/v0/ - bpp_id: https://mymentor.com/ - bpp_uri: https://api.mymentor.com/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - ttl: P10S - message: - intent: - fulfillment: - agent: - name: Dr Rajiv Manocha - Search for scholarships: - value: - context: - domain: mentorship - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/v0/ - bpp_id: https://mymentor.com/ - bpp_uri: https://api.mymentor.com/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - ttl: P10S - message: - intent: - category: - id: "4" - descriptor: - name: Engineering and Technology - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /select: - post: - tags: - - Beckn Provider Platform (BPP) - description: API for Selecting items from the catalog. - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - select - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /init: - post: - tags: - - Beckn Provider Platform (BPP) - description: Initialize an order by providing billing and/or shipping details - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - init - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /confirm: - post: - tags: - - Beckn Provider Platform (BPP) - description: Initialize an order by providing billing and/or shipping details - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - confirm - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /status: - post: - tags: - - Beckn Provider Platform (BPP) - description: Fetch the latest order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - status - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - required: - - order_id - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /track: - post: - tags: - - Beckn Provider Platform (BPP) - description: Track an active order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - track - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - callback_url: - type: string - format: uri - required: - - order_id - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /cancel: - post: - tags: - - Beckn Provider Platform (BPP) - description: Cancel an order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - cancel - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - cancellation_reason_id: - $ref: "#/components/schemas/Option/properties/id" - descriptor: - $ref: "#/components/schemas/Descriptor" - required: - - order_id - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /update: - post: - tags: - - Beckn Provider Platform (BPP) - description: Remove object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - update - required: - - action - message: - type: object - properties: - update_target: - description: 'Comma separated values of order objects being updated. For example: ```"update_target":"item,billing,fulfillment"```' - type: string - order: - $ref: "#/components/schemas/Order" - required: - - update_target - - order - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /rating: - post: - tags: - - Beckn Provider Platform (BPP) - description: Provide feedback on a service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - rating - required: - - action - message: - type: object - properties: - ratings: - type: array - items: - $ref: "#/components/schemas/Rating" - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /support: - post: - tags: - - Beckn Provider Platform (BPP) - description: Contact support - requestBody: - description: Contact support - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - support - required: - - action - message: - type: object - properties: - support: - $ref: "#/components/schemas/Support" - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /on_search: - post: - tags: - - Beckn App Platform (BAP) - - Beckn Gateway (BG) - description: Send catalog - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_search - required: - - action - message: - type: object - properties: - catalog: - $ref: "#/components/schemas/Catalog" - required: - - catalog - error: - $ref: "#/components/schemas/Error" - required: - - context - examples: - Publish a catalog of software jobs by a software agency: - value: - context: - domain: jobs:nic2008:62XXX - location: - city: - code: "*" - country: - code: IND - action: on_search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/uhi/v0/ - bpp_id: https://naukri.com/ - bpp_uri: https://api.naukri.com/uhi/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - message: - catalog: - descriptor: - name: Naukri Recruitment Platform - providers: - - descriptor: - name: Infosys - categories: - - id: "1" - name: Frontend Jobs - - id: "2" - name: Backend Jobs - items: - - descriptor: - name: Senior Software Developer - code: SSFD - fulfillment_ids: - - "1" - category_ids: - - "1" - matched: true - - descriptor: - name: Software Consultant - On site - code: SWCO - fulfillment_ids: - - "1" - category_ids: - - "1" - matched: "false" - - descriptor: - name: Software Consultant - Remote - code: SWCR - fulfillment_ids: - - "2" - category_ids: - - "2" - matched: "false" - fulfillments: - - id: "1" - descriptor: - name: Full-time - stops: - - location: - city: - code: BLR - - id: "2" - descriptor: - name: On-site - stops: - - location: - city: - code: BLR - type: start - time: - timestamp: "2022-08-10" - - location: - city: BLR - type: end - time: - timestamp: "2022-08-10" - - id: "3" - descriptor: - name: Remote - stops: - - time: - timestamp: "2022-08-10" - type: start - - time: - timestamp: "2022-08-10" - type: end - Publish a catalog of online courses: - value: - context: - domain: trainings-and-courses - location: - city: - code: std:011 - country: - code: IND - action: on_search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/uhi/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - message: - catalog: - descriptor: - name: XAcademy - providers: - - descriptor: - name: XAcademy - categories: - - id: "1" - name: Software - - id: "2" - name: Management - items: - - id: "1" - descriptor: - name: Basics of AI - price: - value: "6000" - fulfillment_ids: - - "1" - category_ids: - - "1" - - id: "2" - descriptor: - name: AI for Data Analysis - price: - value: "7000" - fulfillment_ids: - - "1" - category_ids: - - "1" - fulfillments: - - id: "1" - type: ONLINE - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - context - /on_select: - post: - tags: - - Beckn App Platform (BAP) - description: Send draft order object with quoted price for selected items - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - $ref: "#/components/schemas/Context" - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_init: - post: - tags: - - Beckn App Platform (BAP) - description: Send order object with payment details updated - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_init - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_confirm: - post: - tags: - - Beckn App Platform (BAP) - description: Send active order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_confirm - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_track: - post: - tags: - - Beckn App Platform (BAP) - description: Send tracking details of an active order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_track - required: - - action - message: - type: object - properties: - tracking: - $ref: "#/components/schemas/Tracking" - required: - - tracking - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_cancel: - post: - tags: - - Beckn App Platform (BAP) - description: Send cancellation request_id with reasons list in case of cancellation request. Else send cancelled order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_cancel - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_update: - post: - tags: - - Beckn App Platform (BAP) - description: Returns updated service with updated runtime object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_update - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_status: - post: - tags: - - Beckn App Platform (BAP) - description: Fetch the status of a Service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_status - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_rating: - post: - tags: - - Beckn App Platform (BAP) - description: Provide feedback on a service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_rating - required: - - action - message: - type: object - properties: - feedback_form: - description: A feedback form to allow the user to provide additional information on the rating provided - allOf: - - $ref: "#/components/schemas/XInput" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_support: - post: - tags: - - Beckn App Platform (BAP) - description: Contact Support - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_support - required: - - action - message: - type: object - properties: - support: - $ref: "#/components/schemas/Support" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /get_cancellation_reasons: - post: - tags: - - BPP Meta APIs - description: Get cancellation reasons from the BPP - requestBody: - description: Context header is sent as the request - content: - application/json: - schema: - type: object - properties: - context: - $ref: "#/components/schemas/Context" - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /cancellation_reasons: - post: - tags: - - BAP Meta APIs - description: Get cancellation reasons from the BPP - requestBody: - description: List of cancellation reasons - content: - application/json: - schema: - type: object - properties: - context: - $ref: "#/components/schemas/Context" - message: - type: object - properties: - cancellation_reasons: - type: array - items: - $ref: "#/components/schemas/Option" - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /get_return_reasons: - post: - tags: - - BPP Meta APIs - description: Get return reasons from the BPP - requestBody: - description: Context header is sent as the request - content: - application/json: - schema: - type: object - properties: - context: - $ref: "#/components/schemas/Context" - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /return_reasons: - post: - tags: - - BAP Meta APIs - description: Get return reasons from the BPP - requestBody: - description: List of return reasons - content: - application/json: - schema: - type: object - properties: - context: - $ref: "#/components/schemas/Context" - return_reasons: - type: array - items: - $ref: "#/components/schemas/Option" - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /get_rating_categories: - post: - tags: - - BPP Meta APIs - description: Get a list of categories that can be rated by the BAP - requestBody: - description: Context header is sent as the request - content: - application/json: - schema: - type: object - properties: - context: - $ref: "#/components/schemas/Context" - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /rating_categories: - post: - tags: - - BAP Meta APIs - description: Get a list of categories that can be rated by the BAP - requestBody: - description: Array of categories which can be rated - content: - application/json: - schema: - type: object - properties: - context: - $ref: "#/components/schemas/Context" - rating_categories: - type: array - items: - $ref: "#/components/schemas/Rating/properties/rating_category" - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message -components: - securitySchemes: - SubscriberAuth: - type: apiKey - in: header - name: Authorization - description: 'Signature of message body using BAP or BPP subscriber''s signing public key.

Format:

Authorization : Signature keyId="{subscriber_id}|{unique_key_id}|{algorithm}",algorithm="ed25519",created="1606970629",expires="1607030629",headers="(created) (expires) digest",signature="Base64(signing string)"' - GatewaySubscriberAuth: - type: apiKey - in: header - name: Proxy-Authorization - description: 'Signature of message body + BAP/BPP''s Authorization header using BG''s signing public key. Format:

Proxy-Authorization : Signature keyId="{subscriber_id}|{unique_key_id}|{algorithm}",algorithm="ed25519",created="1606970629",expires="1607030629",headers="(created) (expires) digest",signature="Base64(signing string)"

Note:This header will be deprecated soon and will no longer be supported in future releases. New implementors are requested to use the X-Gateway-Authorization header. Existing implementations are requested to migrate their header to the new header. The deprecation date will be set after discussion as per the standard specification governance process.

' - GatewaySubscriberAuthNew: - type: apiKey - in: header - name: X-Gateway-Authorization - description: 'Signature of message body + BAP/BPP''s Authorization header using BG''s signing public key. Format:

X-Gateway-Authorization : Signature keyId="{subscriber_id}|{unique_key_id}|{algorithm}",algorithm="ed25519",created="1606970629",expires="1607030629",headers="(created) (expires) digest",signature="Base64(signing string)"' - schemas: - Ack: - description: This describes an acknowledgement of receipt of a message. Upon receiving a message, the receiver must first authenticate the sender by verifying its digital signature. Upon successful verification of the signature, the receiver must validate the schema of the message. After performing both the operations, the receiver should send an Ack object in response. - type: object - properties: - status: - type: string - description: "Describe the status of the ACK response. If the message passes the acknowledgement criteria, then the receiver shouls set this value equal to ACK else it should be set to NACK" - enum: - - ACK - - NACK - tags: - description: A list of tags containing any additional information sent along with the Acknowledgement. - type: array - items: - $ref: "#/components/schemas/TagGroup" - AddOn: - description: This is typically an optional product or service that can be offered in addition to a product or a service of type Item. Objects of type AddOn should not exist without an associated Item. If a BAP receives an Item with an add-on, it must show it to the user as a selectable object. If any AddOn object is found without an associated Item object, then the validator must throw an error 'NO-PARENT=ITEM' with message 'No parent found' - type: object - properties: - id: - type: string - description: ID of the add-on as present in the source catalog - optional: - type: boolean - default: false - description: This value indicates if the add-on is optional or required to be selected by the user along with an Item. If this value is set to true, then the BAP must ensure that the add-on is mandatorily selected by the user while creating the Order object with the Item. - descriptor: - $ref: "#/components/schemas/Descriptor" - price: - $ref: "#/components/schemas/Price" - Address: - description: Describes a postal address. - type: string - Agent: - description: "Describes a person who fulfills this order." - properties: - person: - $ref: "#/components/schemas/Person" - contact: - $ref: "#/components/schemas/Contact" - organization: - $ref: "#/components/schemas/Organization" - rating: - $ref: "#/components/schemas/Rating/properties/value" - Authorization: - description: "Describes an authorization mechanism used to start or end the fulfillment of an order. For example, in the mobility sector, the driver may require a one-time password to initiate the ride. In the healthcare sector, a patient may need to provide a password to open a video conference link during a teleconsultation." - type: object - properties: - type: - description: Type of authorization mechanism used. The allowed values for this field can be published as part of the network policy. - type: string - token: - description: "Token used for authorization. This is typically generated at the BPP. The BAP can send this value to the user via any channel that it uses to authenticate the user like SMS, Email, Push notification, or in-app rendering." - type: string - valid_from: - description: Timestamp in RFC3339 format from which token is valid - type: string - format: date-time - valid_to: - description: Timestamp in RFC3339 format until which token is valid - type: string - format: date-time - status: - description: Status of the token - type: string - Billing: - description: Describes the billing details of an order. This must be provided by BAP user before confirmation of the order. - type: object - properties: - name: - description: Name of the person under who's name the bill will be generated. - type: string - organization: - description: Name of the organization under who's name the bill will be generated. - allOf: - - $ref: "#/components/schemas/Organization" - address: - allOf: - - $ref: "#/components/schemas/Address" - state: - description: The state where the billable entity resides. This is important for state-level tax calculation - allOf: - - $ref: "#/components/schemas/State" - city: - description: The city where the billable entity resides. - allOf: - - $ref: "#/components/schemas/City" - email: - description: Email address of the person / organization being billed. The BPP must send the bill to this email address. The format of the bill may be defined in the network policy. - type: string - format: email - phone: - description: Phone number of the person / organization being billed. The BPP must send the bill to this phone number as per the format specified in the network policy. In case the bill is a downloadable file, it is recommended the bill should be sent to the phone number as a downloadable link. - type: string - time: - $ref: "#/components/schemas/Time" - tax_id: - description: This is the identity of a Tax-paying person or an organization. This number can be provided to the BPP to avail tax benefits, if applicable. The format of this string should be specified in the network policy - type: string - created_at: - description: Date and time at which this bill was generated by the BPP. - type: string - format: date-time - - Cancellation: - description: Describes a cancellation event - type: object - properties: - time: - description: Date-time when the order was cancelled by the seeker - type: string - format: date-time - cancelled_by: - type: string - enum: - - SEEKER - - PROVIDER - reason: - description: The reason for cancellation - allOf: - - $ref: "#/components/schemas/Option" - additional_description: - description: Any additional information regarding the nature of cancellation - allOf: - - $ref: "#/components/schemas/Descriptor" - - CancellationTerm: - description: Describes the cancellation terms of an order, i.e, scholarship application, course etc. This can be referenced at an item or order level. Item-level cancellation terms can override the terms at the order level. - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/FulfillmentState" - reason_required: - description: Indicates whether a reason is required to cancel the order - type: boolean - cancel_by: - description: Information related to the time of cancellation. - allOf: - - $ref: "#/components/schemas/Time" - cancellation_fee: - $ref: "#/components/schemas/Fee" - xinput: - $ref: "#/components/schemas/XInput" - external_ref: - $ref: "#/components/schemas/MediaFile" - Catalog: - description: "Describes a skilling and education catalog" - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - fulfillments: - description: Fulfillment modes offered at the BPP level. This is used when a BPP itself offers fulfillments on behalf of the providers it has onboarded. - type: array - items: - $ref: "#/components/schemas/Fulfillment" - payments: - description: Payment terms offered by the BPP for all transactions. This can be overriden at the provider level. - type: array - items: - $ref: "#/components/schemas/Payment" - offers: - description: Offers at the BPP-level. This is common across all providers onboarded by the BPP. - type: array - items: - $ref: "#/components/schemas/Offer" - providers: - type: array - items: - $ref: "#/components/schemas/Provider" - exp: - description: Timestamp after which catalog will expire - type: string - format: date-time - ttl: - description: Duration in seconds after which this catalog will expire - type: string - Category: - description: Describes a category - type: object - properties: - id: - type: string - description: Unique id of the category - parent_category_id: - $ref: "#/components/schemas/Category/properties/id" - descriptor: - $ref: "#/components/schemas/Descriptor" - time: - $ref: "#/components/schemas/Time" - ttl: - description: Time to live for an instance of this schema - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Circle: - description: Describes a circular area on the map - type: object - properties: - gps: - $ref: "#/components/schemas/Gps" - radius: - $ref: "#/components/schemas/Scalar" - City: - description: Describes a city - type: object - properties: - name: - type: string - description: Name of the city - code: - type: string - description: City code - Contact: - description: Describes the contact information of an entity - type: object - properties: - phone: - type: string - email: - type: string - jcard: - type: object - description: A Jcard object as per draft-ietf-jcardcal-jcard-03 specification - Context: - description: Describes a beckn message context - type: object - properties: - domain: - allOf: - - $ref: "#/components/schemas/Domain/properties/code" - location: - description: The location where the transaction is intended to be fulfilled. - allOf: - - $ref: "#/components/schemas/Location" - action: - type: string - description: Defines the Beckn API call type. - version: - type: string - description: Version of Beckn core API specification being used - bap_id: - type: string - description: Unique id of the BAP. By default it is the fully qualified domain name of the BAP - bap_uri: - type: string - format: uri - description: URI of the BAP for accepting callbacks. Must have the same domain name as the bap_id - bpp_id: - type: string - description: Unique id of the BPP. By default it is the fully qualified domain name of the BPP - bpp_uri: - type: string - format: uri - description: URI of the BPP. Must have the same domain name as the bap_id - transaction_id: - type: string - format: uuid - description: This is a unique value which persists across all API calls from search through confirm - message_id: - type: string - format: uuid - description: This is a unique value which persists during a request / callback cycle - timestamp: - type: string - format: date-time - description: Time of request generation in RFC3339 format - key: - type: string - description: The encryption public key of the sender - ttl: - type: string - description: The duration in ISO8601 format after timestamp for which this message holds valid - Country: - description: Describes a country. - type: object - properties: - name: - type: string - description: Name of the country - code: - type: string - description: Country code as per ISO 3166-1 and ISO 3166-2 format - Credential: - description: Describes a credential of an entity - Person or Organization - type: object - properties: - id: - type: string - type: - type: string - default: VerifiableCredential - url: - description: URL of the credential - type: string - format: uri - Customer: - description: Describes a customer buying/availing a product or a service - type: object - properties: - person: - $ref: "#/components/schemas/Person" - contact: - $ref: "#/components/schemas/Contact" - Domain: - description: "Described the industry sector or sub-sector. The network policy should contain codes for all the industry sectors supported by the network. Domains can be created in varying levels of granularity. The granularity of a domain can be decided by the participants of the network. Too broad domains will result in irrelevant search broadcast calls to BPPs that don't have services supporting the domain. Too narrow domains will result in a large number of registry entries for each BPP. It is recommended that network facilitators actively collaborate with various working groups and network participants to carefully choose domain codes keeping in mind relevance, performance, and opportunity cost. It is recommended that networks choose broad domains like mobility, logistics, healthcare etc, and progressively granularize them as and when the number of network participants for each domain grows large." - type: object - properties: - name: - description: Name of the domain - type: string - code: - description: "Standard code representing the domain. The standard is usually published as part of the network policy. Furthermore, the network facilitator should also provide a mechanism to provide the supported domains of a network." - additional_info: - description: A url that contains addtional information about that domain. - allOf: - - $ref: "#/components/schemas/MediaFile" - DecimalValue: - description: Describes a decimal value - type: string - pattern: "[+-]?([0-9]*[.])?[0-9]+" - Descriptor: - description: Physical description of something. - type: object - properties: - name: - type: string - code: - type: string - short_desc: - type: string - long_desc: - type: string - additional_desc: - type: object - properties: - url: - type: string - content_type: - type: string - enum: - - text/plain - - text/html - - application/json - media: - type: array - items: - $ref: "#/components/schemas/MediaFile" - images: - type: array - items: - $ref: "#/components/schemas/Image" - Duration: - description: Describes duration as per ISO8601 format - type: string - Error: - description: Describes an error object - type: object - properties: - type: - type: string - enum: - - CONTEXT-ERROR - - CORE-ERROR - - DOMAIN-ERROR - - POLICY-ERROR - - JSON-SCHEMA-ERROR - code: - type: string - description: "Beckn specific error code. For full list of error codes, refer to docs/protocol-drafts/BECKN-RFC-005-ERROR-CODES-DRAFT-01.md of this repo" - path: - type: string - description: Path to json schema generating the error. Used only during json schema validation errors - message: - type: string - description: Human readable message describing the error - required: - - type - - code - Fee: - description: A fee applied on a particular entity - type: object - properties: - percentage: - description: Percentage of a value - allOf: - - $ref: "#/components/schemas/DecimalValue" - amount: - description: A fixed value - allOf: - - $ref: "#/components/schemas/Price" - Form: - description: Describes a form - type: object - properties: - url: - description: "The URL from where the form can be fetched. The content fetched from the url must be processed as per the mime_type specified in this object. Once fetched, the rendering platform can choosed to render the form as-is as an embeddable element; or process it further to blend with the theme of the application. In case the interface is non-visual, the the render can process the form data and reproduce it as per the standard specified in the form." - type: string - format: uri - data: - description: The form submission data - type: object - additionalProperties: - type: string - mime_type: - description: This field indicates the nature and format of the form received by querying the url. MIME types are defined and standardized in IETF's RFC 6838. - type: string - enum: - - text/html - - application/xml - submission_id: - type: string - format: uuid - Fulfillment: - description: Describes how a an order will be rendered/fulfilled to the end-customer - type: object - properties: - id: - description: Unique reference ID to the fulfillment of an order - type: string - type: - description: "A code that describes the mode of fulfillment. This is typically set when there are multiple ways an order can be fulfilled. For example, a retail order can be fulfilled either via store pickup or a home delivery. Similarly, a medical consultation can be provided either in-person or via tele-consultation. The network policy must publish standard fulfillment type codes for the different modes of fulfillment." - type: string - rateable: - description: Whether the fulfillment can be rated or not - type: boolean - rating: - description: The rating value of the fulfullment service. - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - state: - description: The current state of fulfillment. The BPP must set this value whenever the state of the order fulfillment changes and fire an unsolicited `on_status` call. - allOf: - - $ref: "#/components/schemas/FulfillmentState" - tracking: - type: boolean - description: Indicates whether the fulfillment allows tracking - default: false - customer: - description: The person that will ultimately receive the order - allOf: - - $ref: "#/components/schemas/Customer" - agent: - description: The agent that is currently handling the fulfillment of the order - allOf: - - $ref: "#/components/schemas/Agent" - contact: - $ref: "#/components/schemas/Contact" - vehicle: - $ref: "#/components/schemas/Vehicle" - stops: - description: The list of logical stops encountered during the fulfillment of an order. - type: array - items: - $ref: "#/components/schemas/Stop" - path: - description: The physical path taken by the agent that can be rendered on a map. The allowed format of this property can be set by the network. - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - FulfillmentState: - description: Describes the state of fulfillment - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - updated_at: - type: string - format: date-time - updated_by: - type: string - description: ID of entity which changed the state - Gps: - description: Describes a GPS coordinate - type: string - pattern: '^[-+]?([1-8]?\d(\.\d+)?|90(\.0+)?),\s*[-+]?(180(\.0+)?|((1[0-7]\d)|([1-9]?\d))(\.\d+)?)$' - Image: - description: Describes an image - type: object - properties: - url: - description: URL to the image. This can be a data url or an remote url - type: string - format: uri - size_type: - description: The size of the image. The network policy can define the default dimensions of each type - type: string - enum: - - xs - - sm - - md - - lg - - xl - - custom - width: - description: Width of the image in pixels - type: string - height: - description: Height of the image in pixels - type: string - Intent: - description: "The intent to get a Learning and Career Development Resources. The BAP can declare the intent of the consumer containing
  • What they want (scholarship, job, course etc)
  • Who they want (A seller, service provider, agent etc)
  • Where they want it and where they want it from
  • When they want it (start and end time of fulfillment
  • How they want to pay for it

This has properties like descriptor,provider,fulfillment,payment,category,offer,item,tags
This is typically used by the BAP to send the purpose of the user's search to the BPP. This will be used by the BPP to find products or services it offers that may match the user's intent.
For example, in Mobility, the mobility consumer declares a mobility intent. In this case, the mobility consumer declares information that describes various aspects of their journey like,
  • Where would they like to begin their journey (intent.fulfillment.start.location)
  • Where would they like to end their journey (intent.fulfillment.end.location)
  • When would they like to begin their journey (intent.fulfillment.start.time)
  • When would they like to end their journey (intent.fulfillment.end.time)
  • Who is the transport service provider they would like to avail services from (intent.provider)
  • Who is traveling (This is not recommended in public networks) (intent.fulfillment.customer)
  • What kind of fare product would they like to purchase (intent.item)
  • What add-on services would they like to avail
  • What offers would they like to apply on their booking (intent.offer)
  • What category of services would they like to avail (intent.category)
  • What additional luggage are they carrying
  • How would they like to pay for their journey (intent.payment)

For example, in health domain, a consumer declares the intent for a lab booking the describes various aspects of their booking like,
  • Where would they like to get their scan/test done (intent.fulfillment.start.location)
  • When would they like to get their scan/test done (intent.fulfillment.start.time)
  • When would they like to get the results of their test/scan (intent.fulfillment.end.time)
  • Who is the service provider they would like to avail services from (intent.provider)
  • Who is getting the test/scan (intent.fulfillment.customer)
  • What kind of test/scan would they like to purchase (intent.item)
  • What category of services would they like to avail (intent.category)
  • How would they like to pay for their journey (intent.payment)
" - type: object - properties: - descriptor: - description: "A raw description of the search intent. Free text search strings, raw audio, etc can be sent in this object." - allOf: - - $ref: "#/components/schemas/Descriptor" - provider: - description: The provider from which the customer wants to place to the order from - allOf: - - $ref: "#/components/schemas/Provider" - fulfillment: - description: Details on how the customer wants their order fulfilled - allOf: - - $ref: "#/components/schemas/Fulfillment" - payment: - description: Details on how the customer wants to pay for the order - allOf: - - $ref: "#/components/schemas/Payment" - category: - description: Details on the item category - allOf: - - $ref: "#/components/schemas/Category" - offer: - description: details on the offer the customer wants to avail - allOf: - - $ref: "#/components/schemas/Offer" - item: - description: Details of the item that the consumer wants to order - allOf: - - $ref: "#/components/schemas/Item" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - ItemQuantity: - description: Describes the count or amount of an item - type: object - properties: - allocated: - description: This represents the exact quantity allocated for purchase of the item. - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - available: - description: This represents the exact quantity available for purchase of the item. The buyer can only purchase multiples of this - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - maximum: - description: This represents the maximum quantity allowed for purchase of the item - type: object - properties: - count: - type: integer - minimum: 1 - measure: - $ref: "#/components/schemas/Scalar" - minimum: - description: This represents the minimum quantity allowed for purchase of the item - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - selected: - description: This represents the quantity selected for purchase of the item - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - unitized: - description: This represents the quantity available in a single unit of the item - type: object - properties: - count: - type: integer - minimum: 1 - maximum: 1 - measure: - $ref: "#/components/schemas/Scalar" - Item: - description: "Describes a product or a service offered to the end consumer by the provider. In the mobility sector, it can represent a fare product like one way journey. In the logistics sector, it can represent the delivery service offering. In the retail domain it can represent a product like a grocery item." - type: object - properties: - id: - description: ID of the item. - type: string - parent_item_id: - description: "ID of the item, this item is a variant of" - allOf: - - $ref: "#/components/schemas/Item/properties/id" - parent_item_quantity: - description: The number of units of the parent item this item is a multiple of - allOf: - - $ref: "#/components/schemas/ItemQuantity" - descriptor: - description: Physical description of the item - allOf: - - $ref: "#/components/schemas/Descriptor" - creator: - description: The creator of this item - allOf: - - $ref: "#/components/schemas/Organization" - price: - description: "The price of this item, if it has intrinsic value" - allOf: - - $ref: "#/components/schemas/Price" - quantity: - description: The selling quantity of the item - allOf: - - $ref: "#/components/schemas/ItemQuantity" - category_ids: - description: Categories this item can be listed under - type: array - items: - allOf: - - $ref: "#/components/schemas/Category/properties/id" - fulfillment_ids: - description: Modes through which this item can be fulfilled - type: array - items: - allOf: - - $ref: "#/components/schemas/Fulfillment/properties/id" - location_ids: - description: Provider Locations this item is available in - type: array - items: - allOf: - - $ref: "#/components/schemas/Location/properties/id" - payment_ids: - description: Payment modalities through which this item can be ordered - type: array - items: - allOf: - - $ref: "#/components/schemas/Payment/properties/id" - add_ons: - type: array - items: - $ref: "#/components/schemas/AddOn" - cancellation_terms: - description: Cancellation terms of this item - type: array - items: - $ref: "#/components/schemas/CancellationTerm" - refund_terms: - description: Refund terms of this item - type: array - items: - description: Refund term of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/State" - refund_eligible: - description: Indicates if cancellation will result in a refund - type: boolean - refund_within: - description: Time within which refund will be processed after successful cancellation. - allOf: - - $ref: "#/components/schemas/Time" - refund_amount: - $ref: "#/components/schemas/Price" - replacement_terms: - description: Terms that are applicable be met when this item is replaced - type: array - items: - $ref: "#/components/schemas/ReplacementTerm" - return_terms: - description: Terms that are applicable when this item is returned - type: array - items: - $ref: "#/components/schemas/ReturnTerm" - xinput: - description: Additional input required from the customer to purchase / avail this item - allOf: - - $ref: "#/components/schemas/XInput" - time: - description: Temporal attributes of this item. This property is used when the item exists on the catalog only for a limited period of time. - allOf: - - $ref: "#/components/schemas/Time" - rateable: - description: Whether this item can be rated - type: boolean - rating: - description: The rating of the item - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - matched: - description: Whether this item is an exact match of the request - type: boolean - related: - description: Whether this item is a related item to the exactly matched item - type: boolean - recommended: - description: Whether this item is a recommended item to a response - type: boolean - ttl: - description: Time to live in seconds for an instance of this schema - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Location: - description: The physical location of something - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - map_url: - description: The url to the map of the location. This can be a globally recognized map url or the one specified by the network policy. - type: string - format: uri - gps: - description: The GPS co-ordinates of this location. - allOf: - - $ref: "#/components/schemas/Gps" - address: - description: The address of this location. - allOf: - - $ref: "#/components/schemas/Address" - city: - description: "The city this location is, or is located within" - allOf: - - $ref: "#/components/schemas/City" - district: - description: "The state this location is, or is located within" - type: string - state: - description: "The state this location is, or is located within" - allOf: - - $ref: "#/components/schemas/State" - country: - description: "The country this location is, or is located within" - allOf: - - $ref: "#/components/schemas/Country" - area_code: - type: string - circle: - $ref: "#/components/schemas/Circle" - polygon: - description: The boundary polygon of this location - type: string - 3dspace: - description: The three dimensional region describing this location - type: string - rating: - description: The rating of this location - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - MediaFile: - description: This object contains a url to a media file. - type: object - properties: - mimetype: - description: "indicates the nature and format of the document, file, or assortment of bytes. MIME types are defined and standardized in IETF's RFC 6838" - type: string - url: - description: The URL of the file - type: string - format: uri - signature: - description: The digital signature of the file signed by the sender - type: string - dsa: - description: The signing algorithm used by the sender - type: string - Offer: - description: An offer associated with a catalog. This is typically used to promote a particular product and enable more purchases. - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - location_ids: - type: array - items: - $ref: "#/components/schemas/Location/properties/id" - category_ids: - type: array - items: - $ref: "#/components/schemas/Category/properties/id" - item_ids: - type: array - items: - $ref: "#/components/schemas/Item/properties/id" - time: - $ref: "#/components/schemas/Time" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Option: - description: Describes a selectable option - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - Order: - description: Describes a legal purchase order. It contains the complete details of the legal contract created between the buyer and the seller. - type: object - properties: - id: - type: string - description: Human-readable ID of the order. This is generated at the BPP layer. The BPP can either generate order id within its system or forward the order ID created at the provider level. - ref_order_ids: - description: A list of order IDs to link this order to previous orders. - type: array - items: - type: string - description: ID of a previous order - status: - description: Status of the order. Allowed values can be defined by the network policy - type: string - enum: - - ACTIVE - - COMPLETE - - CANCELLED - type: - description: "This is used to indicate the type of order being created to BPPs. Sometimes orders can be linked to previous orders, like a replacement order in a retail domain. A follow-up consultation in healthcare domain. A single order part of a subscription order. The list of order types can be standardized at the network level." - type: string - default: DEFAULT - enum: - - DRAFT - - DEFAULT - provider: - description: Details of the provider whose catalog items have been selected. - allOf: - - $ref: "#/components/schemas/Provider" - items: - description: The items purchased / availed in this order - type: array - items: - $ref: "#/components/schemas/Item" - add_ons: - description: The add-ons purchased / availed in this order - type: array - items: - $ref: "#/components/schemas/AddOn" - offers: - description: The offers applied in this order - type: array - items: - $ref: "#/components/schemas/Offer" - billing: - description: The billing details of this order - allOf: - - $ref: "#/components/schemas/Billing" - fulfillments: - description: The fulfillments involved in completing this order - type: array - items: - $ref: "#/components/schemas/Fulfillment" - cancellation: - description: The cancellation details of this order - allOf: - - $ref: "#/components/schemas/Cancellation" - cancellation_terms: - description: Cancellation terms of this item - type: array - items: - $ref: "#/components/schemas/CancellationTerm" - refund_terms: - description: Refund terms of this item - type: array - items: - $ref: "#/components/schemas/Item/properties/refund_terms/items" - replacement_terms: - description: Replacement terms of this item - type: array - items: - $ref: "#/components/schemas/ReplacementTerm" - return_terms: - description: Return terms of this item - type: array - items: - $ref: "#/components/schemas/ReturnTerm" - quote: - description: The mutually agreed upon quotation for this order. - allOf: - - $ref: "#/components/schemas/Quotation" - payments: - description: The terms of settlement for this order - type: array - items: - $ref: "#/components/schemas/Payment" - created_at: - description: The date-time of creation of this order - type: string - format: date-time - updated_at: - description: The date-time of updated of this order - type: string - format: date-time - xinput: - description: Additional input required from the customer to confirm this order - allOf: - - $ref: "#/components/schemas/XInput" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Organization: - description: An organization. Usually a recognized business entity. - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - address: - description: The postal address of the organization - allOf: - - $ref: "#/components/schemas/Address" - state: - description: The state where the organization's address is registered - allOf: - - $ref: "#/components/schemas/State" - city: - description: The city where the the organization's address is registered - allOf: - - $ref: "#/components/schemas/City" - contact: - $ref: "#/components/schemas/Contact" - Payment: - description: "Describes the terms of settlement between the BAP and the BPP for a single transaction. When instantiated, this object contains
  1. the amount that has to be settled,
  2. The payment destination destination details
  3. When the settlement should happen, and
  4. A transaction reference ID
. During a transaction, the BPP reserves the right to decide the terms of payment. However, the BAP can send its terms to the BPP first. If the BPP does not agree to those terms, it must overwrite the terms and return them to the BAP. If overridden, the BAP must either agree to the terms sent by the BPP in order to preserve the provider's autonomy, or abort the transaction. In case of such disagreements, the BAP and the BPP can perform offline negotiations on the payment terms. Once an agreement is reached, the BAP and BPP can resume transactions." - type: object - properties: - id: - description: ID of the payment term that can be referred at an item or an order level in a catalog - type: string - collected_by: - description: "This field indicates who is the collector of payment. The BAP can set this value to 'bap' if it wants to collect the payment first and settle it to the BPP. If the BPP agrees to those terms, the BPP should not send the payment url. Alternatively, the BPP can set this field with the value 'bpp' if it wants the payment to be made directly." - url: - type: string - description: "A payment url to be called by the BAP. If empty, then the payment is to be done offline. The details of payment should be present in the params object. If tl_method = http/get, then the payment details will be sent as url params. Two url param values, ```$transaction_id``` and ```$amount``` are mandatory." - format: uri - params: - type: object - properties: - transaction_id: - type: string - description: The reference transaction ID associated with a payment activity - amount: - type: string - currency: - type: string - bank_code: - type: string - bank_account_number: - type: string - virtual_payment_address: - type: string - source_bank_code: - type: string - source_bank_account_number: - type: string - source_virtual_payment_address: - type: string - type: - type: string - enum: - - PRE-ORDER - - PRE-FULFILLMENT - - ON-FULFILLMENT - - POST-FULFILLMENT - status: - type: string - enum: - - PAID - - NOT-PAID - time: - $ref: "#/components/schemas/Time" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Person: - description: Describes a person as any individual - type: object - properties: - id: - type: string - description: Describes the identity of the person - url: - description: Profile url of the person - type: string - format: uri - name: - description: the name of the person - type: string - image: - $ref: "#/components/schemas/Image" - age: - description: Age of the person - allOf: - - $ref: "#/components/schemas/Duration" - dob: - description: Date of birth of the person - type: string - format: date - gender: - type: string - description: "Gender of something, typically a Person, but possibly also fictional characters, animals, etc. While Male and Female may be used, text strings are also acceptable for people who do not identify as a binary gender.Allowed values for this field can be published in the network policy" - creds: - type: array - items: - $ref: "#/components/schemas/Credential" - languages: - type: array - items: - description: Describes a language known to the person. - type: object - properties: - code: - type: string - name: - type: string - skills: - type: array - items: - description: Describes a skill of the person. - type: object - properties: - code: - type: string - name: - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Price: - description: Describes the price of a product or service - type: object - properties: - currency: - type: string - value: - $ref: "#/components/schemas/DecimalValue" - estimated_value: - $ref: "#/components/schemas/DecimalValue" - computed_value: - $ref: "#/components/schemas/DecimalValue" - listed_value: - $ref: "#/components/schemas/DecimalValue" - offered_value: - $ref: "#/components/schemas/DecimalValue" - minimum_value: - $ref: "#/components/schemas/DecimalValue" - maximum_value: - $ref: "#/components/schemas/DecimalValue" - Provider: - description: Describes the catalog of an entity, entitiy can be a scholarship facilitator, course provider etc - type: object - properties: - id: - type: string - description: Id of the provider - descriptor: - $ref: "#/components/schemas/Descriptor" - category_id: - type: string - description: Category Id of the provider at the BPP-level catalog - rating: - $ref: "#/components/schemas/Rating/properties/value" - time: - $ref: "#/components/schemas/Time" - categories: - type: array - items: - $ref: "#/components/schemas/Category" - fulfillments: - type: array - items: - $ref: "#/components/schemas/Fulfillment" - payments: - type: array - items: - $ref: "#/components/schemas/Payment" - locations: - type: array - items: - $ref: "#/components/schemas/Location" - offers: - type: array - items: - $ref: "#/components/schemas/Offer" - items: - type: array - items: - $ref: "#/components/schemas/Item" - exp: - type: string - description: Time after which catalog has to be refreshed - format: date-time - rateable: - description: Whether this provider can be rated or not - type: boolean - ttl: - description: "The time-to-live in seconds, for this object. This can be overriden at deeper levels. A value of -1 indicates that this object is not cacheable." - type: integer - minimum: -1 - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Quotation: - description: "Describes a quote. It is the estimated price of products or services from the BPP.
This has properties like price, breakup, ttl" - type: object - properties: - id: - description: ID of the quote. - type: string - format: uuid - price: - description: The total quoted price - allOf: - - $ref: "#/components/schemas/Price" - breakup: - description: the breakup of the total quoted price - type: array - items: - type: object - properties: - item: - $ref: "#/components/schemas/Item" - title: - type: string - price: - $ref: "#/components/schemas/Price" - ttl: - $ref: "#/components/schemas/Duration" - Rating: - description: Describes the rating of an entity - type: object - properties: - rating_category: - description: Category of the entity being rated - type: string - enum: - - Item - - Order - - Fulfillment - - Provider - - Agent - - Support - id: - description: Id of the object being rated - type: string - value: - description: "Rating value given to the object. This can be a single value or can also contain an inequality operator like gt, gte, lt, lte. This can also contain an inequality expression containing logical operators like && and ||." - - ReplacementTerm: - description: The replacement policy of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/State" - replace_within: - description: "Applicable only for buyer managed returns where the buyer has to replace the item before a certain date-time, failing which they will not be eligible for replacement" - allOf: - - $ref: "#/components/schemas/Time" - external_ref: - $ref: "#/components/schemas/MediaFile" - - ReturnTerm: - description: Describes the return policy of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term IETF''s applicable. - allOf: - - $ref: "#/components/schemas/State" - return_eligible: - description: Indicates whether the item is eligible for return - type: boolean - return_time: - description: "Applicable only for buyer managed returns where the buyer has to return the item to the origin before a certain date-time, failing which they will not be eligible for refund." - allOf: - - $ref: "#/components/schemas/Time" - return_location: - description: The location where the item or order must / will be returned to - allOf: - - $ref: "#/components/schemas/Location" - fulfillment_managed_by: - description: The entity that will perform the return - type: string - enum: - - CONSUMER - - PROVIDER - Scalar: - description: Describes a scalar - type: object - properties: - type: - type: string - enum: - - CONSTANT - - VARIABLE - value: - $ref: "#/components/schemas/DecimalValue" - estimated_value: - $ref: "#/components/schemas/DecimalValue" - computed_value: - $ref: "#/components/schemas/DecimalValue" - range: - type: object - properties: - min: - $ref: "#/components/schemas/DecimalValue" - max: - $ref: "#/components/schemas/DecimalValue" - unit: - type: string - Schedule: - description: "Describes schedule as a repeating time period used to describe a regularly recurring event. At a minimum a schedule will specify frequency which describes the interval between occurrences of the event. Additional information can be provided to specify the schedule more precisely. This includes identifying the timestamps(s) of when the event will take place. Schedules may also have holidays to exclude a specific day from the schedule.
This has properties like frequency, holidays, times" - type: object - properties: - frequency: - $ref: "#/components/schemas/Duration" - holidays: - type: array - items: - type: string - format: date-time - times: - type: array - items: - type: string - format: date-time - State: - description: A bounded geopolitical region of governance inside a country. - type: object - properties: - name: - type: string - description: Name of the state - code: - type: string - description: State code as per country or international standards - Stop: - description: A logical point in space and time during the fulfillment of an order. - type: object - properties: - id: - type: string - parent_stop_id: - type: string - location: - description: Location of the stop - allOf: - - $ref: "#/components/schemas/Location" - type: - description: The type of stop. Allowed values of this property can be defined by the network policy. - type: string - time: - description: Timings applicable at the stop. - allOf: - - $ref: "#/components/schemas/Time" - instructions: - description: Instructions that need to be followed at the stop - allOf: - - $ref: "#/components/schemas/Descriptor" - contact: - description: Contact details of the stop - allOf: - - $ref: "#/components/schemas/Contact" - person: - description: The details of the person present at the stop - allOf: - - $ref: "#/components/schemas/Person" - authorization: - $ref: "#/components/schemas/Authorization" - Support: - description: Details of customer support - type: object - properties: - ref_id: - type: string - callback_phone: - type: string - format: phone - phone: - type: string - format: phone - email: - type: string - format: email - url: - type: string - format: uri - Tag: - description: "Describes a tag. This is used to contain extended metadata. This object can be added as a property to any schema to describe extended attributes. For BAPs, tags can be sent during search to optimize and filter search results. BPPs can use tags to index their catalog to allow better search functionality. Tags are sent by the BPP as part of the catalog response in the `on_search` callback. Tags are also meant for display purposes. Upon receiving a tag, BAPs are meant to render them as name-value pairs. This is particularly useful when rendering tabular information about a product or service." - type: object - properties: - descriptor: - description: "Description of the Tag, can be used to store detailed information." - allOf: - - $ref: "#/components/schemas/Descriptor" - value: - description: The value of the tag. This set by the BPP and rendered as-is by the BAP. - type: string - display: - description: "This value indicates if the tag is intended for display purposes. If set to `true`, then this tag must be displayed. If it is set to `false`, it should not be displayed. This value can override the group display value." - type: boolean - TagGroup: - description: "A collection of tag objects with group level attributes. For detailed documentation on the Tags and Tag Groups schema go to https://github.com/beckn/protocol-specifications/discussions/316" - type: object - properties: - display: - description: "Indicates the display properties of the tag group. If display is set to false, then the group will not be displayed. If it is set to true, it should be displayed. However, group-level display properties can be overriden by individual tag-level display property. As this schema is purely for catalog display purposes, it is not recommended to send this value during search." - type: boolean - default: true - descriptor: - description: "Description of the TagGroup, can be used to store detailed information." - allOf: - - $ref: "#/components/schemas/Descriptor" - list: - description: "An array of Tag objects listed under this group. This property can be set by BAPs during search to narrow the `search` and achieve more relevant results. When received during `on_search`, BAPs must render this list under the heading described by the `name` property of this schema." - type: array - items: - $ref: "#/components/schemas/Tag" - Time: - description: Describes time in its various forms. It can be a single point in time; duration; or a structured timetable of operations - type: object - properties: - label: - type: string - timestamp: - type: string - format: date-time - duration: - $ref: "#/components/schemas/Duration" - range: - type: object - properties: - start: - type: string - format: date-time - end: - type: string - format: date-time - days: - type: string - description: comma separated values representing days of the week - schedule: - $ref: "#/components/schemas/Schedule" - Tracking: - description: Describes a tracking object. it can be used to track the status of a service, i.e, a scholarship application, a course etc. - type: object - properties: - id: - description: A unique tracking reference number - type: string - url: - description: "A URL to the tracking endpoint. This can be a link to a tracking webpage, a webhook URL created by the BAP where BPP can push the tracking data, or a GET url creaed by the BPP which the BAP can poll to get the tracking data. It can also be a websocket URL where the BPP can push real-time tracking data." - type: string - format: uri - location: - description: "In case there is no real-time tracking endpoint available, this field will contain the latest location of the entity being tracked. The BPP will update this value everytime the BAP calls the track API." - allOf: - - $ref: "#/components/schemas/Location" - status: - description: "This value indicates if the tracking is currently active or not. If this value is `active`, then the BAP can begin tracking the order. If this value is `inactive`, the tracking URL is considered to be expired and the BAP should stop tracking the order." - type: string - enum: - - active - - inactive - Vehicle: - description: "Describes a vehicle is a device that is designed or used to transport people or cargo over land, water, air, or through space.
This has properties like category, capacity, make, model, size,variant,color,energy_type,registration" - type: object - properties: - category: - type: string - capacity: - type: integer - make: - type: string - model: - type: string - size: - type: string - variant: - type: string - color: - type: string - energy_type: - type: string - registration: - type: string - wheels_count: - type: string - cargo_volumne: - type: string - wheelchair_access: - type: string - code: - type: string - emission_standard: - type: string - XInput: - description: "Contains any additional or extended inputs required for the order. This is typically a Form Input. Sometimes, selection of catalog elements is not enough for the BPP to confirm an order. For example, A scholarship application may require additional details on the applicant as a proof of eligibility. For all such purposes, the BPP can choose to send this object attached to any object in the catalog that is required to be sent while placing the order. This object can typically be sent at an item level or at the order level. The item level XInput will override the Order level XInput as it indicates a special requirement of information for that particular item. Hence the BAP must render a separate form for the Item and another form at the Order level before confirmation." - type: object - properties: - form: - $ref: "#/components/schemas/Form" - required: - description: Indicates whether the form data is mandatorily required by the BPP to confirm the order. - type: boolean diff --git a/layer2/samples/dsep_courses_1.1.0.yaml b/layer2/samples/dsep_courses_1.1.0.yaml deleted file mode 100644 index bfac183..0000000 --- a/layer2/samples/dsep_courses_1.1.0.yaml +++ /dev/null @@ -1,3063 +0,0 @@ -openapi: 3.0.0 -info: - title: Decentralized Skilling and Education Protocol Specification - description: Adaptation of beckn protocol for the domain of skilling and education - version: 0.7.0 - -security: - - SubscriberAuth: [] - - GatewaySubscriberAuthNew: [] -paths: - /search: - post: - tags: - - Beckn Provider Platform (BPP) - - Beckn Gateway (BG) - description: This allows a BAP to discover for catalogs offering
a) Jobs and Internships
b) Trainings and Courses
c) Mentors and Coaches and,
d) Scholarships and Grants - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - search - message: - type: object - properties: - intent: - $ref: "#/components/schemas/Intent" - required: - - context - - message - examples: - Search for 'web design' jobs by category code in the region of Delhi: - value: - context: - domain: jobs - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - ttl: P10S - message: - intent: - category: - descriptor: - name: Web design jobs - code: nic2008:62012 - Search for jobs by skills like carpentry and painting: - value: - context: - domain: jobs - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/uhi/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - message: - intent: - fulfillment: - customer: - person: - skills: - - name: Painting - - name: Carpentry - tags: - - descriptor: - name: Competence - list: - - descriptor: - name: Experience - value: 12Y - - Search for jobs along with expected salary: - value: - context: - domain: jobs - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/uhi/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - message: - intent: - fulfillment: - customer: - person: - skills: - - name: Java Programming - tags: - - descriptor: - name: Competence - list: - - descriptor: - name: Experience - value: 12Y - tags: - - descriptor: - name: Expectations - list: - - descriptor: - name: expected_payment - value: 250000INR/Month - - Search for jobs offered by a specific provider: - value: - context: - domain: jobs - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/uhi/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - message: - intent: - provider: - descriptor: - name: Infosys - Search for online courses matching a specific topic: - value: - context: - domain: trainings-and-courses - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/v0/ - bpp_id: https://mymentor.com/ - bpp_uri: https://api.mymentor.com/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - ttl: P10S - message: - intent: - item: - descriptor: - name: AI basics - tags: - - descriptor: - name: course_labels - list: - - descriptor: - name: label_1 - value: AI - - descriptor: - name: label_2 - value: ML - - descriptor: - name: label_3 - value: beginners - - descriptor: - name: label_4 - value: Artifical Intelligence - - descriptor: - name: label_5 - value: machine learning - - descriptor: - name: label_6 - value: neural networks - fulfillment: - type: FULL-TIME - Search for BTech courses offered by an engineering instituition like IIT Delhi: - value: - context: - domain: trainings-and-courses - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/v0/ - bpp_id: https://mymentor.com/ - bpp_uri: https://api.mymentor.com/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - ttl: P10S - message: - intent: - provider: - descriptor: - name: IIT Delhi - tags: - - descriptor: - name: course_labels - list: - - descriptor: - name: label_1 - value: AI - - descriptor: - name: label_2 - value: ML - - descriptor: - name: label_3 - value: beginners - - descriptor: - name: label_4 - value: Artifical Intelligence - - descriptor: - name: label_5 - value: machine learning - - descriptor: - name: label_6 - value: neural networks - category: - descriptor: - name: B.Tech - code: BTECH - fulfillment: - type: FULL-TIME - Searching for a mentor by name: - value: - context: - domain: mentorship-and-coaching - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/v0/ - bpp_id: https://mymentor.com/ - bpp_uri: https://api.mymentor.com/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - ttl: P10S - message: - intent: - fulfillment: - agent: - name: Dr Rajiv Manocha - Search for scholarships: - value: - context: - domain: mentorship - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/v0/ - bpp_id: https://mymentor.com/ - bpp_uri: https://api.mymentor.com/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - ttl: P10S - message: - intent: - category: - id: "4" - descriptor: - name: Engineering and Technology - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /select: - post: - tags: - - Beckn Provider Platform (BPP) - description: API for Selecting items from the catalog. - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - select - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /init: - post: - tags: - - Beckn Provider Platform (BPP) - description: Initialize an order by providing billing and/or shipping details - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - init - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /confirm: - post: - tags: - - Beckn Provider Platform (BPP) - description: Initialize an order by providing billing and/or shipping details - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - confirm - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /status: - post: - tags: - - Beckn Provider Platform (BPP) - description: Fetch the latest order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - status - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - required: - - order_id - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /track: - post: - tags: - - Beckn Provider Platform (BPP) - description: Track an active order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - track - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - callback_url: - type: string - format: uri - required: - - order_id - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /cancel: - post: - tags: - - Beckn Provider Platform (BPP) - description: Cancel an order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - cancel - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - cancellation_reason_id: - $ref: "#/components/schemas/Option/properties/id" - descriptor: - $ref: "#/components/schemas/Descriptor" - required: - - order_id - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /update: - post: - tags: - - Beckn Provider Platform (BPP) - description: Remove object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - update - required: - - action - message: - type: object - properties: - update_target: - description: 'Comma separated values of order objects being updated. For example: ```"update_target":"item,billing,fulfillment"```' - type: string - order: - $ref: "#/components/schemas/Order" - required: - - update_target - - order - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /rating: - post: - tags: - - Beckn Provider Platform (BPP) - description: Provide feedback on a service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - rating - required: - - action - message: - type: object - properties: - ratings: - type: array - items: - $ref: "#/components/schemas/Rating" - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /support: - post: - tags: - - Beckn Provider Platform (BPP) - description: Contact support - requestBody: - description: Contact support - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - support - required: - - action - message: - type: object - properties: - support: - $ref: "#/components/schemas/Support" - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /on_search: - post: - tags: - - Beckn App Platform (BAP) - - Beckn Gateway (BG) - description: Send catalog - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_search - required: - - action - message: - type: object - properties: - catalog: - $ref: "#/components/schemas/Catalog" - required: - - catalog - error: - $ref: "#/components/schemas/Error" - required: - - context - examples: - Publish a catalog of software jobs by a software agency: - value: - context: - domain: jobs:nic2008:62XXX - location: - city: - code: "*" - country: - code: IND - action: on_search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/uhi/v0/ - bpp_id: https://naukri.com/ - bpp_uri: https://api.naukri.com/uhi/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - message: - catalog: - descriptor: - name: Naukri Recruitment Platform - providers: - - descriptor: - name: Infosys - categories: - - id: "1" - name: Frontend Jobs - - id: "2" - name: Backend Jobs - items: - - descriptor: - name: Senior Software Developer - code: SSFD - fulfillment_ids: - - "1" - category_ids: - - "1" - matched: true - - descriptor: - name: Software Consultant - On site - code: SWCO - fulfillment_ids: - - "1" - category_ids: - - "1" - matched: "false" - - descriptor: - name: Software Consultant - Remote - code: SWCR - fulfillment_ids: - - "2" - category_ids: - - "2" - matched: "false" - fulfillments: - - id: "1" - descriptor: - name: Full-time - stops: - - location: - city: - code: BLR - - id: "2" - descriptor: - name: On-site - stops: - - location: - city: - code: BLR - type: start - time: - timestamp: "2022-08-10" - - location: - city: BLR - type: end - time: - timestamp: "2022-08-10" - - id: "3" - descriptor: - name: Remote - stops: - - time: - timestamp: "2022-08-10" - type: start - - time: - timestamp: "2022-08-10" - type: end - Publish a catalog of online courses: - value: - context: - domain: trainings-and-courses - location: - city: - code: std:011 - country: - code: IND - action: on_search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/uhi/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - message: - catalog: - descriptor: - name: XAcademy - providers: - - descriptor: - name: XAcademy - categories: - - id: "1" - name: Software - - id: "2" - name: Management - items: - - id: "1" - descriptor: - name: Basics of AI - price: - value: "6000" - fulfillment_ids: - - "1" - category_ids: - - "1" - - id: "2" - descriptor: - name: AI for Data Analysis - price: - value: "7000" - fulfillment_ids: - - "1" - category_ids: - - "1" - fulfillments: - - id: "1" - type: ONLINE - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - context - /on_select: - post: - tags: - - Beckn App Platform (BAP) - description: Send draft order object with quoted price for selected items - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - $ref: "#/components/schemas/Context" - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_init: - post: - tags: - - Beckn App Platform (BAP) - description: Send order object with payment details updated - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_init - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_confirm: - post: - tags: - - Beckn App Platform (BAP) - description: Send active order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_confirm - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_track: - post: - tags: - - Beckn App Platform (BAP) - description: Send tracking details of an active order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_track - required: - - action - message: - type: object - properties: - tracking: - $ref: "#/components/schemas/Tracking" - required: - - tracking - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_cancel: - post: - tags: - - Beckn App Platform (BAP) - description: Send cancellation request_id with reasons list in case of cancellation request. Else send cancelled order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_cancel - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_update: - post: - tags: - - Beckn App Platform (BAP) - description: Returns updated service with updated runtime object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_update - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_status: - post: - tags: - - Beckn App Platform (BAP) - description: Fetch the status of a Service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_status - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_rating: - post: - tags: - - Beckn App Platform (BAP) - description: Provide feedback on a service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_rating - required: - - action - message: - type: object - properties: - feedback_form: - description: A feedback form to allow the user to provide additional information on the rating provided - allOf: - - $ref: "#/components/schemas/XInput" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_support: - post: - tags: - - Beckn App Platform (BAP) - description: Contact Support - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_support - required: - - action - message: - type: object - properties: - support: - $ref: "#/components/schemas/Support" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /get_cancellation_reasons: - post: - tags: - - BPP Meta APIs - description: Get cancellation reasons from the BPP - requestBody: - description: Context header is sent as the request - content: - application/json: - schema: - type: object - properties: - context: - $ref: "#/components/schemas/Context" - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /cancellation_reasons: - post: - tags: - - BAP Meta APIs - description: Get cancellation reasons from the BPP - requestBody: - description: List of cancellation reasons - content: - application/json: - schema: - type: object - properties: - context: - $ref: "#/components/schemas/Context" - message: - type: object - properties: - cancellation_reasons: - type: array - items: - $ref: "#/components/schemas/Option" - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /get_return_reasons: - post: - tags: - - BPP Meta APIs - description: Get return reasons from the BPP - requestBody: - description: Context header is sent as the request - content: - application/json: - schema: - type: object - properties: - context: - $ref: "#/components/schemas/Context" - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /return_reasons: - post: - tags: - - BAP Meta APIs - description: Get return reasons from the BPP - requestBody: - description: List of return reasons - content: - application/json: - schema: - type: object - properties: - context: - $ref: "#/components/schemas/Context" - return_reasons: - type: array - items: - $ref: "#/components/schemas/Option" - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /get_rating_categories: - post: - tags: - - BPP Meta APIs - description: Get a list of categories that can be rated by the BAP - requestBody: - description: Context header is sent as the request - content: - application/json: - schema: - type: object - properties: - context: - $ref: "#/components/schemas/Context" - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /rating_categories: - post: - tags: - - BAP Meta APIs - description: Get a list of categories that can be rated by the BAP - requestBody: - description: Array of categories which can be rated - content: - application/json: - schema: - type: object - properties: - context: - $ref: "#/components/schemas/Context" - rating_categories: - type: array - items: - $ref: "#/components/schemas/Rating/properties/rating_category" - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message -components: - securitySchemes: - SubscriberAuth: - type: apiKey - in: header - name: Authorization - description: 'Signature of message body using BAP or BPP subscriber''s signing public key.

Format:

Authorization : Signature keyId="{subscriber_id}|{unique_key_id}|{algorithm}",algorithm="ed25519",created="1606970629",expires="1607030629",headers="(created) (expires) digest",signature="Base64(signing string)"' - GatewaySubscriberAuth: - type: apiKey - in: header - name: Proxy-Authorization - description: 'Signature of message body + BAP/BPP''s Authorization header using BG''s signing public key. Format:

Proxy-Authorization : Signature keyId="{subscriber_id}|{unique_key_id}|{algorithm}",algorithm="ed25519",created="1606970629",expires="1607030629",headers="(created) (expires) digest",signature="Base64(signing string)"

Note:This header will be deprecated soon and will no longer be supported in future releases. New implementors are requested to use the X-Gateway-Authorization header. Existing implementations are requested to migrate their header to the new header. The deprecation date will be set after discussion as per the standard specification governance process.

' - GatewaySubscriberAuthNew: - type: apiKey - in: header - name: X-Gateway-Authorization - description: 'Signature of message body + BAP/BPP''s Authorization header using BG''s signing public key. Format:

X-Gateway-Authorization : Signature keyId="{subscriber_id}|{unique_key_id}|{algorithm}",algorithm="ed25519",created="1606970629",expires="1607030629",headers="(created) (expires) digest",signature="Base64(signing string)"' - schemas: - Ack: - description: This describes an acknowledgement of receipt of a message. Upon receiving a message, the receiver must first authenticate the sender by verifying its digital signature. Upon successful verification of the signature, the receiver must validate the schema of the message. After performing both the operations, the receiver should send an Ack object in response. - type: object - properties: - status: - type: string - description: "Describe the status of the ACK response. If the message passes the acknowledgement criteria, then the receiver shouls set this value equal to ACK else it should be set to NACK" - enum: - - ACK - - NACK - tags: - description: A list of tags containing any additional information sent along with the Acknowledgement. - type: array - items: - $ref: "#/components/schemas/TagGroup" - AddOn: - description: This is typically an optional product or service that can be offered in addition to a product or a service of type Item. Objects of type AddOn should not exist without an associated Item. If a BAP receives an Item with an add-on, it must show it to the user as a selectable object. If any AddOn object is found without an associated Item object, then the validator must throw an error 'NO-PARENT=ITEM' with message 'No parent found' - type: object - properties: - id: - type: string - description: ID of the add-on as present in the source catalog - optional: - type: boolean - default: false - description: This value indicates if the add-on is optional or required to be selected by the user along with an Item. If this value is set to true, then the BAP must ensure that the add-on is mandatorily selected by the user while creating the Order object with the Item. - descriptor: - $ref: "#/components/schemas/Descriptor" - price: - $ref: "#/components/schemas/Price" - Address: - description: Describes a postal address. - type: string - Agent: - description: "Describes a person who fulfills this order." - properties: - person: - $ref: "#/components/schemas/Person" - contact: - $ref: "#/components/schemas/Contact" - organization: - $ref: "#/components/schemas/Organization" - rating: - $ref: "#/components/schemas/Rating/properties/value" - Authorization: - description: "Describes an authorization mechanism used to start or end the fulfillment of an order. For example, in the mobility sector, the driver may require a one-time password to initiate the ride. In the healthcare sector, a patient may need to provide a password to open a video conference link during a teleconsultation." - type: object - properties: - type: - description: Type of authorization mechanism used. The allowed values for this field can be published as part of the network policy. - type: string - token: - description: "Token used for authorization. This is typically generated at the BPP. The BAP can send this value to the user via any channel that it uses to authenticate the user like SMS, Email, Push notification, or in-app rendering." - type: string - valid_from: - description: Timestamp in RFC3339 format from which token is valid - type: string - format: date-time - valid_to: - description: Timestamp in RFC3339 format until which token is valid - type: string - format: date-time - status: - description: Status of the token - type: string - Billing: - description: Describes the billing details of an order. This must be provided by BAP user before confirmation of the order. - type: object - properties: - name: - description: Name of the person under who's name the bill will be generated. - type: string - organization: - description: Name of the organization under who's name the bill will be generated. - allOf: - - $ref: "#/components/schemas/Organization" - address: - allOf: - - $ref: "#/components/schemas/Address" - state: - description: The state where the billable entity resides. This is important for state-level tax calculation - allOf: - - $ref: "#/components/schemas/State" - city: - description: The city where the billable entity resides. - allOf: - - $ref: "#/components/schemas/City" - email: - description: Email address of the person / organization being billed. The BPP must send the bill to this email address. The format of the bill may be defined in the network policy. - type: string - format: email - phone: - description: Phone number of the person / organization being billed. The BPP must send the bill to this phone number as per the format specified in the network policy. In case the bill is a downloadable file, it is recommended the bill should be sent to the phone number as a downloadable link. - type: string - time: - $ref: "#/components/schemas/Time" - tax_id: - description: This is the identity of a Tax-paying person or an organization. This number can be provided to the BPP to avail tax benefits, if applicable. The format of this string should be specified in the network policy - type: string - created_at: - description: Date and time at which this bill was generated by the BPP. - type: string - format: date-time - - Cancellation: - description: Describes a cancellation event - type: object - properties: - time: - description: Date-time when the order was cancelled by the seeker - type: string - format: date-time - cancelled_by: - type: string - enum: - - SEEKER - - PROVIDER - reason: - description: The reason for cancellation - allOf: - - $ref: "#/components/schemas/Option" - additional_description: - description: Any additional information regarding the nature of cancellation - allOf: - - $ref: "#/components/schemas/Descriptor" - - CancellationTerm: - description: Describes the cancellation terms of an order, i.e, scholarship application, course etc. This can be referenced at an item or order level. Item-level cancellation terms can override the terms at the order level. - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/FulfillmentState" - reason_required: - description: Indicates whether a reason is required to cancel the order - type: boolean - cancel_by: - description: Information related to the time of cancellation. - allOf: - - $ref: "#/components/schemas/Time" - cancellation_fee: - $ref: "#/components/schemas/Fee" - xinput: - $ref: "#/components/schemas/XInput" - external_ref: - $ref: "#/components/schemas/MediaFile" - Catalog: - description: "Describes a skilling and education catalog" - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - fulfillments: - description: Fulfillment modes offered at the BPP level. This is used when a BPP itself offers fulfillments on behalf of the providers it has onboarded. - type: array - items: - $ref: "#/components/schemas/Fulfillment" - payments: - description: Payment terms offered by the BPP for all transactions. This can be overriden at the provider level. - type: array - items: - $ref: "#/components/schemas/Payment" - offers: - description: Offers at the BPP-level. This is common across all providers onboarded by the BPP. - type: array - items: - $ref: "#/components/schemas/Offer" - providers: - type: array - items: - $ref: "#/components/schemas/Provider" - exp: - description: Timestamp after which catalog will expire - type: string - format: date-time - ttl: - description: Duration in seconds after which this catalog will expire - type: string - Category: - description: Describes a category - type: object - properties: - id: - type: string - description: Unique id of the category - parent_category_id: - $ref: "#/components/schemas/Category/properties/id" - descriptor: - $ref: "#/components/schemas/Descriptor" - time: - $ref: "#/components/schemas/Time" - ttl: - description: Time to live for an instance of this schema - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Circle: - description: Describes a circular area on the map - type: object - properties: - gps: - $ref: "#/components/schemas/Gps" - radius: - $ref: "#/components/schemas/Scalar" - City: - description: Describes a city - type: object - properties: - name: - type: string - description: Name of the city - code: - type: string - description: City code - Contact: - description: Describes the contact information of an entity - type: object - properties: - phone: - type: string - email: - type: string - jcard: - type: object - description: A Jcard object as per draft-ietf-jcardcal-jcard-03 specification - Context: - description: Describes a beckn message context - type: object - properties: - domain: - allOf: - - $ref: "#/components/schemas/Domain/properties/code" - location: - description: The location where the transaction is intended to be fulfilled. - allOf: - - $ref: "#/components/schemas/Location" - action: - type: string - description: Defines the Beckn API call type. - version: - type: string - description: Version of Beckn core API specification being used - bap_id: - type: string - description: Unique id of the BAP. By default it is the fully qualified domain name of the BAP - bap_uri: - type: string - format: uri - description: URI of the BAP for accepting callbacks. Must have the same domain name as the bap_id - bpp_id: - type: string - description: Unique id of the BPP. By default it is the fully qualified domain name of the BPP - bpp_uri: - type: string - format: uri - description: URI of the BPP. Must have the same domain name as the bap_id - transaction_id: - type: string - format: uuid - description: This is a unique value which persists across all API calls from search through confirm - message_id: - type: string - format: uuid - description: This is a unique value which persists during a request / callback cycle - timestamp: - type: string - format: date-time - description: Time of request generation in RFC3339 format - key: - type: string - description: The encryption public key of the sender - ttl: - type: string - description: The duration in ISO8601 format after timestamp for which this message holds valid - Country: - description: Describes a country. - type: object - properties: - name: - type: string - description: Name of the country - code: - type: string - description: Country code as per ISO 3166-1 and ISO 3166-2 format - Credential: - description: Describes a credential of an entity - Person or Organization - type: object - properties: - id: - type: string - type: - type: string - default: VerifiableCredential - url: - description: URL of the credential - type: string - format: uri - Customer: - description: Describes a customer buying/availing a product or a service - type: object - properties: - person: - $ref: "#/components/schemas/Person" - contact: - $ref: "#/components/schemas/Contact" - Domain: - description: "Described the industry sector or sub-sector. The network policy should contain codes for all the industry sectors supported by the network. Domains can be created in varying levels of granularity. The granularity of a domain can be decided by the participants of the network. Too broad domains will result in irrelevant search broadcast calls to BPPs that don't have services supporting the domain. Too narrow domains will result in a large number of registry entries for each BPP. It is recommended that network facilitators actively collaborate with various working groups and network participants to carefully choose domain codes keeping in mind relevance, performance, and opportunity cost. It is recommended that networks choose broad domains like mobility, logistics, healthcare etc, and progressively granularize them as and when the number of network participants for each domain grows large." - type: object - properties: - name: - description: Name of the domain - type: string - code: - description: "Standard code representing the domain. The standard is usually published as part of the network policy. Furthermore, the network facilitator should also provide a mechanism to provide the supported domains of a network." - additional_info: - description: A url that contains addtional information about that domain. - allOf: - - $ref: "#/components/schemas/MediaFile" - DecimalValue: - description: Describes a decimal value - type: string - pattern: "[+-]?([0-9]*[.])?[0-9]+" - Descriptor: - description: Physical description of something. - type: object - properties: - name: - type: string - code: - type: string - short_desc: - type: string - long_desc: - type: string - additional_desc: - type: object - properties: - url: - type: string - content_type: - type: string - enum: - - text/plain - - text/html - - application/json - media: - type: array - items: - $ref: "#/components/schemas/MediaFile" - images: - type: array - items: - $ref: "#/components/schemas/Image" - Duration: - description: Describes duration as per ISO8601 format - type: string - Error: - description: Describes an error object - type: object - properties: - type: - type: string - enum: - - CONTEXT-ERROR - - CORE-ERROR - - DOMAIN-ERROR - - POLICY-ERROR - - JSON-SCHEMA-ERROR - code: - type: string - description: "Beckn specific error code. For full list of error codes, refer to docs/protocol-drafts/BECKN-RFC-005-ERROR-CODES-DRAFT-01.md of this repo" - path: - type: string - description: Path to json schema generating the error. Used only during json schema validation errors - message: - type: string - description: Human readable message describing the error - required: - - type - - code - Fee: - description: A fee applied on a particular entity - type: object - properties: - percentage: - description: Percentage of a value - allOf: - - $ref: "#/components/schemas/DecimalValue" - amount: - description: A fixed value - allOf: - - $ref: "#/components/schemas/Price" - Form: - description: Describes a form - type: object - properties: - url: - description: "The URL from where the form can be fetched. The content fetched from the url must be processed as per the mime_type specified in this object. Once fetched, the rendering platform can choosed to render the form as-is as an embeddable element; or process it further to blend with the theme of the application. In case the interface is non-visual, the the render can process the form data and reproduce it as per the standard specified in the form." - type: string - format: uri - data: - description: The form submission data - type: object - additionalProperties: - type: string - mime_type: - description: This field indicates the nature and format of the form received by querying the url. MIME types are defined and standardized in IETF's RFC 6838. - type: string - enum: - - text/html - - application/xml - submission_id: - type: string - format: uuid - Fulfillment: - description: Describes how a an order will be rendered/fulfilled to the end-customer - type: object - properties: - id: - description: Unique reference ID to the fulfillment of an order - type: string - type: - description: "A code that describes the mode of fulfillment. This is typically set when there are multiple ways an order can be fulfilled. For example, a retail order can be fulfilled either via store pickup or a home delivery. Similarly, a medical consultation can be provided either in-person or via tele-consultation. The network policy must publish standard fulfillment type codes for the different modes of fulfillment." - type: string - rateable: - description: Whether the fulfillment can be rated or not - type: boolean - rating: - description: The rating value of the fulfullment service. - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - state: - description: The current state of fulfillment. The BPP must set this value whenever the state of the order fulfillment changes and fire an unsolicited `on_status` call. - allOf: - - $ref: "#/components/schemas/FulfillmentState" - tracking: - type: boolean - description: Indicates whether the fulfillment allows tracking - default: false - customer: - description: The person that will ultimately receive the order - allOf: - - $ref: "#/components/schemas/Customer" - agent: - description: The agent that is currently handling the fulfillment of the order - allOf: - - $ref: "#/components/schemas/Agent" - contact: - $ref: "#/components/schemas/Contact" - vehicle: - $ref: "#/components/schemas/Vehicle" - stops: - description: The list of logical stops encountered during the fulfillment of an order. - type: array - items: - $ref: "#/components/schemas/Stop" - path: - description: The physical path taken by the agent that can be rendered on a map. The allowed format of this property can be set by the network. - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - FulfillmentState: - description: Describes the state of fulfillment - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - updated_at: - type: string - format: date-time - updated_by: - type: string - description: ID of entity which changed the state - Gps: - description: Describes a GPS coordinate - type: string - pattern: '^[-+]?([1-8]?\d(\.\d+)?|90(\.0+)?),\s*[-+]?(180(\.0+)?|((1[0-7]\d)|([1-9]?\d))(\.\d+)?)$' - Image: - description: Describes an image - type: object - properties: - url: - description: URL to the image. This can be a data url or an remote url - type: string - format: uri - size_type: - description: The size of the image. The network policy can define the default dimensions of each type - type: string - enum: - - xs - - sm - - md - - lg - - xl - - custom - width: - description: Width of the image in pixels - type: string - height: - description: Height of the image in pixels - type: string - Intent: - description: "The intent to get a Learning and Career Development Resources. The BAP can declare the intent of the consumer containing
  • What they want (scholarship, job, course etc)
  • Who they want (A seller, service provider, agent etc)
  • Where they want it and where they want it from
  • When they want it (start and end time of fulfillment
  • How they want to pay for it

This has properties like descriptor,provider,fulfillment,payment,category,offer,item,tags
This is typically used by the BAP to send the purpose of the user's search to the BPP. This will be used by the BPP to find products or services it offers that may match the user's intent.
For example, in Mobility, the mobility consumer declares a mobility intent. In this case, the mobility consumer declares information that describes various aspects of their journey like,
  • Where would they like to begin their journey (intent.fulfillment.start.location)
  • Where would they like to end their journey (intent.fulfillment.end.location)
  • When would they like to begin their journey (intent.fulfillment.start.time)
  • When would they like to end their journey (intent.fulfillment.end.time)
  • Who is the transport service provider they would like to avail services from (intent.provider)
  • Who is traveling (This is not recommended in public networks) (intent.fulfillment.customer)
  • What kind of fare product would they like to purchase (intent.item)
  • What add-on services would they like to avail
  • What offers would they like to apply on their booking (intent.offer)
  • What category of services would they like to avail (intent.category)
  • What additional luggage are they carrying
  • How would they like to pay for their journey (intent.payment)

For example, in health domain, a consumer declares the intent for a lab booking the describes various aspects of their booking like,
  • Where would they like to get their scan/test done (intent.fulfillment.start.location)
  • When would they like to get their scan/test done (intent.fulfillment.start.time)
  • When would they like to get the results of their test/scan (intent.fulfillment.end.time)
  • Who is the service provider they would like to avail services from (intent.provider)
  • Who is getting the test/scan (intent.fulfillment.customer)
  • What kind of test/scan would they like to purchase (intent.item)
  • What category of services would they like to avail (intent.category)
  • How would they like to pay for their journey (intent.payment)
" - type: object - properties: - descriptor: - description: "A raw description of the search intent. Free text search strings, raw audio, etc can be sent in this object." - allOf: - - $ref: "#/components/schemas/Descriptor" - provider: - description: The provider from which the customer wants to place to the order from - allOf: - - $ref: "#/components/schemas/Provider" - fulfillment: - description: Details on how the customer wants their order fulfilled - allOf: - - $ref: "#/components/schemas/Fulfillment" - payment: - description: Details on how the customer wants to pay for the order - allOf: - - $ref: "#/components/schemas/Payment" - category: - description: Details on the item category - allOf: - - $ref: "#/components/schemas/Category" - offer: - description: details on the offer the customer wants to avail - allOf: - - $ref: "#/components/schemas/Offer" - item: - description: Details of the item that the consumer wants to order - allOf: - - $ref: "#/components/schemas/Item" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - ItemQuantity: - description: Describes the count or amount of an item - type: object - properties: - allocated: - description: This represents the exact quantity allocated for purchase of the item. - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - available: - description: This represents the exact quantity available for purchase of the item. The buyer can only purchase multiples of this - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - maximum: - description: This represents the maximum quantity allowed for purchase of the item - type: object - properties: - count: - type: integer - minimum: 1 - measure: - $ref: "#/components/schemas/Scalar" - minimum: - description: This represents the minimum quantity allowed for purchase of the item - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - selected: - description: This represents the quantity selected for purchase of the item - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - unitized: - description: This represents the quantity available in a single unit of the item - type: object - properties: - count: - type: integer - minimum: 1 - maximum: 1 - measure: - $ref: "#/components/schemas/Scalar" - Item: - description: "Describes a product or a service offered to the end consumer by the provider. In the mobility sector, it can represent a fare product like one way journey. In the logistics sector, it can represent the delivery service offering. In the retail domain it can represent a product like a grocery item." - type: object - properties: - id: - description: ID of the item. - type: string - parent_item_id: - description: "ID of the item, this item is a variant of" - allOf: - - $ref: "#/components/schemas/Item/properties/id" - parent_item_quantity: - description: The number of units of the parent item this item is a multiple of - allOf: - - $ref: "#/components/schemas/ItemQuantity" - descriptor: - description: Physical description of the item - allOf: - - $ref: "#/components/schemas/Descriptor" - creator: - description: The creator of this item - allOf: - - $ref: "#/components/schemas/Organization" - price: - description: "The price of this item, if it has intrinsic value" - allOf: - - $ref: "#/components/schemas/Price" - quantity: - description: The selling quantity of the item - allOf: - - $ref: "#/components/schemas/ItemQuantity" - category_ids: - description: Categories this item can be listed under - type: array - items: - allOf: - - $ref: "#/components/schemas/Category/properties/id" - fulfillment_ids: - description: Modes through which this item can be fulfilled - type: array - items: - allOf: - - $ref: "#/components/schemas/Fulfillment/properties/id" - location_ids: - description: Provider Locations this item is available in - type: array - items: - allOf: - - $ref: "#/components/schemas/Location/properties/id" - payment_ids: - description: Payment modalities through which this item can be ordered - type: array - items: - allOf: - - $ref: "#/components/schemas/Payment/properties/id" - add_ons: - type: array - items: - $ref: "#/components/schemas/AddOn" - cancellation_terms: - description: Cancellation terms of this item - type: array - items: - $ref: "#/components/schemas/CancellationTerm" - refund_terms: - description: Refund terms of this item - type: array - items: - description: Refund term of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/State" - refund_eligible: - description: Indicates if cancellation will result in a refund - type: boolean - refund_within: - description: Time within which refund will be processed after successful cancellation. - allOf: - - $ref: "#/components/schemas/Time" - refund_amount: - $ref: "#/components/schemas/Price" - replacement_terms: - description: Terms that are applicable be met when this item is replaced - type: array - items: - $ref: "#/components/schemas/ReplacementTerm" - return_terms: - description: Terms that are applicable when this item is returned - type: array - items: - $ref: "#/components/schemas/ReturnTerm" - xinput: - description: Additional input required from the customer to purchase / avail this item - allOf: - - $ref: "#/components/schemas/XInput" - time: - description: Temporal attributes of this item. This property is used when the item exists on the catalog only for a limited period of time. - allOf: - - $ref: "#/components/schemas/Time" - rateable: - description: Whether this item can be rated - type: boolean - rating: - description: The rating of the item - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - matched: - description: Whether this item is an exact match of the request - type: boolean - related: - description: Whether this item is a related item to the exactly matched item - type: boolean - recommended: - description: Whether this item is a recommended item to a response - type: boolean - ttl: - description: Time to live in seconds for an instance of this schema - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Location: - description: The physical location of something - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - map_url: - description: The url to the map of the location. This can be a globally recognized map url or the one specified by the network policy. - type: string - format: uri - gps: - description: The GPS co-ordinates of this location. - allOf: - - $ref: "#/components/schemas/Gps" - address: - description: The address of this location. - allOf: - - $ref: "#/components/schemas/Address" - city: - description: "The city this location is, or is located within" - allOf: - - $ref: "#/components/schemas/City" - district: - description: "The state this location is, or is located within" - type: string - state: - description: "The state this location is, or is located within" - allOf: - - $ref: "#/components/schemas/State" - country: - description: "The country this location is, or is located within" - allOf: - - $ref: "#/components/schemas/Country" - area_code: - type: string - circle: - $ref: "#/components/schemas/Circle" - polygon: - description: The boundary polygon of this location - type: string - 3dspace: - description: The three dimensional region describing this location - type: string - rating: - description: The rating of this location - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - MediaFile: - description: This object contains a url to a media file. - type: object - properties: - mimetype: - description: "indicates the nature and format of the document, file, or assortment of bytes. MIME types are defined and standardized in IETF's RFC 6838" - type: string - url: - description: The URL of the file - type: string - format: uri - signature: - description: The digital signature of the file signed by the sender - type: string - dsa: - description: The signing algorithm used by the sender - type: string - Offer: - description: An offer associated with a catalog. This is typically used to promote a particular product and enable more purchases. - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - location_ids: - type: array - items: - $ref: "#/components/schemas/Location/properties/id" - category_ids: - type: array - items: - $ref: "#/components/schemas/Category/properties/id" - item_ids: - type: array - items: - $ref: "#/components/schemas/Item/properties/id" - time: - $ref: "#/components/schemas/Time" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Option: - description: Describes a selectable option - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - Order: - description: Describes a legal purchase order. It contains the complete details of the legal contract created between the buyer and the seller. - type: object - properties: - id: - type: string - description: Human-readable ID of the order. This is generated at the BPP layer. The BPP can either generate order id within its system or forward the order ID created at the provider level. - ref_order_ids: - description: A list of order IDs to link this order to previous orders. - type: array - items: - type: string - description: ID of a previous order - status: - description: Status of the order. Allowed values can be defined by the network policy - type: string - enum: - - ACTIVE - - COMPLETE - - CANCELLED - type: - description: "This is used to indicate the type of order being created to BPPs. Sometimes orders can be linked to previous orders, like a replacement order in a retail domain. A follow-up consultation in healthcare domain. A single order part of a subscription order. The list of order types can be standardized at the network level." - type: string - default: DEFAULT - enum: - - DRAFT - - DEFAULT - provider: - description: Details of the provider whose catalog items have been selected. - allOf: - - $ref: "#/components/schemas/Provider" - items: - description: The items purchased / availed in this order - type: array - items: - $ref: "#/components/schemas/Item" - add_ons: - description: The add-ons purchased / availed in this order - type: array - items: - $ref: "#/components/schemas/AddOn" - offers: - description: The offers applied in this order - type: array - items: - $ref: "#/components/schemas/Offer" - billing: - description: The billing details of this order - allOf: - - $ref: "#/components/schemas/Billing" - fulfillments: - description: The fulfillments involved in completing this order - type: array - items: - $ref: "#/components/schemas/Fulfillment" - cancellation: - description: The cancellation details of this order - allOf: - - $ref: "#/components/schemas/Cancellation" - cancellation_terms: - description: Cancellation terms of this item - type: array - items: - $ref: "#/components/schemas/CancellationTerm" - refund_terms: - description: Refund terms of this item - type: array - items: - $ref: "#/components/schemas/Item/properties/refund_terms/items" - replacement_terms: - description: Replacement terms of this item - type: array - items: - $ref: "#/components/schemas/ReplacementTerm" - return_terms: - description: Return terms of this item - type: array - items: - $ref: "#/components/schemas/ReturnTerm" - quote: - description: The mutually agreed upon quotation for this order. - allOf: - - $ref: "#/components/schemas/Quotation" - payments: - description: The terms of settlement for this order - type: array - items: - $ref: "#/components/schemas/Payment" - created_at: - description: The date-time of creation of this order - type: string - format: date-time - updated_at: - description: The date-time of updated of this order - type: string - format: date-time - xinput: - description: Additional input required from the customer to confirm this order - allOf: - - $ref: "#/components/schemas/XInput" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Organization: - description: An organization. Usually a recognized business entity. - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - address: - description: The postal address of the organization - allOf: - - $ref: "#/components/schemas/Address" - state: - description: The state where the organization's address is registered - allOf: - - $ref: "#/components/schemas/State" - city: - description: The city where the the organization's address is registered - allOf: - - $ref: "#/components/schemas/City" - contact: - $ref: "#/components/schemas/Contact" - Payment: - description: "Describes the terms of settlement between the BAP and the BPP for a single transaction. When instantiated, this object contains
  1. the amount that has to be settled,
  2. The payment destination destination details
  3. When the settlement should happen, and
  4. A transaction reference ID
. During a transaction, the BPP reserves the right to decide the terms of payment. However, the BAP can send its terms to the BPP first. If the BPP does not agree to those terms, it must overwrite the terms and return them to the BAP. If overridden, the BAP must either agree to the terms sent by the BPP in order to preserve the provider's autonomy, or abort the transaction. In case of such disagreements, the BAP and the BPP can perform offline negotiations on the payment terms. Once an agreement is reached, the BAP and BPP can resume transactions." - type: object - properties: - id: - description: ID of the payment term that can be referred at an item or an order level in a catalog - type: string - collected_by: - description: "This field indicates who is the collector of payment. The BAP can set this value to 'bap' if it wants to collect the payment first and settle it to the BPP. If the BPP agrees to those terms, the BPP should not send the payment url. Alternatively, the BPP can set this field with the value 'bpp' if it wants the payment to be made directly." - url: - type: string - description: "A payment url to be called by the BAP. If empty, then the payment is to be done offline. The details of payment should be present in the params object. If tl_method = http/get, then the payment details will be sent as url params. Two url param values, ```$transaction_id``` and ```$amount``` are mandatory." - format: uri - params: - type: object - properties: - transaction_id: - type: string - description: The reference transaction ID associated with a payment activity - amount: - type: string - currency: - type: string - bank_code: - type: string - bank_account_number: - type: string - virtual_payment_address: - type: string - source_bank_code: - type: string - source_bank_account_number: - type: string - source_virtual_payment_address: - type: string - type: - type: string - enum: - - PRE-ORDER - - PRE-FULFILLMENT - - ON-FULFILLMENT - - POST-FULFILLMENT - status: - type: string - enum: - - PAID - - NOT-PAID - time: - $ref: "#/components/schemas/Time" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Person: - description: Describes a person as any individual - type: object - properties: - id: - type: string - description: Describes the identity of the person - url: - description: Profile url of the person - type: string - format: uri - name: - description: the name of the person - type: string - image: - $ref: "#/components/schemas/Image" - age: - description: Age of the person - allOf: - - $ref: "#/components/schemas/Duration" - dob: - description: Date of birth of the person - type: string - format: date - gender: - type: string - description: "Gender of something, typically a Person, but possibly also fictional characters, animals, etc. While Male and Female may be used, text strings are also acceptable for people who do not identify as a binary gender.Allowed values for this field can be published in the network policy" - creds: - type: array - items: - $ref: "#/components/schemas/Credential" - languages: - type: array - items: - description: Describes a language known to the person. - type: object - properties: - code: - type: string - name: - type: string - skills: - type: array - items: - description: Describes a skill of the person. - type: object - properties: - code: - type: string - name: - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Price: - description: Describes the price of a product or service - type: object - properties: - currency: - type: string - value: - $ref: "#/components/schemas/DecimalValue" - estimated_value: - $ref: "#/components/schemas/DecimalValue" - computed_value: - $ref: "#/components/schemas/DecimalValue" - listed_value: - $ref: "#/components/schemas/DecimalValue" - offered_value: - $ref: "#/components/schemas/DecimalValue" - minimum_value: - $ref: "#/components/schemas/DecimalValue" - maximum_value: - $ref: "#/components/schemas/DecimalValue" - Provider: - description: Describes the catalog of an entity, entitiy can be a scholarship facilitator, course provider etc - type: object - properties: - id: - type: string - description: Id of the provider - descriptor: - $ref: "#/components/schemas/Descriptor" - category_id: - type: string - description: Category Id of the provider at the BPP-level catalog - rating: - $ref: "#/components/schemas/Rating/properties/value" - time: - $ref: "#/components/schemas/Time" - categories: - type: array - items: - $ref: "#/components/schemas/Category" - fulfillments: - type: array - items: - $ref: "#/components/schemas/Fulfillment" - payments: - type: array - items: - $ref: "#/components/schemas/Payment" - locations: - type: array - items: - $ref: "#/components/schemas/Location" - offers: - type: array - items: - $ref: "#/components/schemas/Offer" - items: - type: array - items: - $ref: "#/components/schemas/Item" - exp: - type: string - description: Time after which catalog has to be refreshed - format: date-time - rateable: - description: Whether this provider can be rated or not - type: boolean - ttl: - description: "The time-to-live in seconds, for this object. This can be overriden at deeper levels. A value of -1 indicates that this object is not cacheable." - type: integer - minimum: -1 - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Quotation: - description: "Describes a quote. It is the estimated price of products or services from the BPP.
This has properties like price, breakup, ttl" - type: object - properties: - id: - description: ID of the quote. - type: string - format: uuid - price: - description: The total quoted price - allOf: - - $ref: "#/components/schemas/Price" - breakup: - description: the breakup of the total quoted price - type: array - items: - type: object - properties: - item: - $ref: "#/components/schemas/Item" - title: - type: string - price: - $ref: "#/components/schemas/Price" - ttl: - $ref: "#/components/schemas/Duration" - Rating: - description: Describes the rating of an entity - type: object - properties: - rating_category: - description: Category of the entity being rated - type: string - enum: - - Item - - Order - - Fulfillment - - Provider - - Agent - - Support - id: - description: Id of the object being rated - type: string - value: - description: "Rating value given to the object. This can be a single value or can also contain an inequality operator like gt, gte, lt, lte. This can also contain an inequality expression containing logical operators like && and ||." - - ReplacementTerm: - description: The replacement policy of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/State" - replace_within: - description: "Applicable only for buyer managed returns where the buyer has to replace the item before a certain date-time, failing which they will not be eligible for replacement" - allOf: - - $ref: "#/components/schemas/Time" - external_ref: - $ref: "#/components/schemas/MediaFile" - - ReturnTerm: - description: Describes the return policy of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term IETF''s applicable. - allOf: - - $ref: "#/components/schemas/State" - return_eligible: - description: Indicates whether the item is eligible for return - type: boolean - return_time: - description: "Applicable only for buyer managed returns where the buyer has to return the item to the origin before a certain date-time, failing which they will not be eligible for refund." - allOf: - - $ref: "#/components/schemas/Time" - return_location: - description: The location where the item or order must / will be returned to - allOf: - - $ref: "#/components/schemas/Location" - fulfillment_managed_by: - description: The entity that will perform the return - type: string - enum: - - CONSUMER - - PROVIDER - Scalar: - description: Describes a scalar - type: object - properties: - type: - type: string - enum: - - CONSTANT - - VARIABLE - value: - $ref: "#/components/schemas/DecimalValue" - estimated_value: - $ref: "#/components/schemas/DecimalValue" - computed_value: - $ref: "#/components/schemas/DecimalValue" - range: - type: object - properties: - min: - $ref: "#/components/schemas/DecimalValue" - max: - $ref: "#/components/schemas/DecimalValue" - unit: - type: string - Schedule: - description: "Describes schedule as a repeating time period used to describe a regularly recurring event. At a minimum a schedule will specify frequency which describes the interval between occurrences of the event. Additional information can be provided to specify the schedule more precisely. This includes identifying the timestamps(s) of when the event will take place. Schedules may also have holidays to exclude a specific day from the schedule.
This has properties like frequency, holidays, times" - type: object - properties: - frequency: - $ref: "#/components/schemas/Duration" - holidays: - type: array - items: - type: string - format: date-time - times: - type: array - items: - type: string - format: date-time - State: - description: A bounded geopolitical region of governance inside a country. - type: object - properties: - name: - type: string - description: Name of the state - code: - type: string - description: State code as per country or international standards - Stop: - description: A logical point in space and time during the fulfillment of an order. - type: object - properties: - id: - type: string - parent_stop_id: - type: string - location: - description: Location of the stop - allOf: - - $ref: "#/components/schemas/Location" - type: - description: The type of stop. Allowed values of this property can be defined by the network policy. - type: string - time: - description: Timings applicable at the stop. - allOf: - - $ref: "#/components/schemas/Time" - instructions: - description: Instructions that need to be followed at the stop - allOf: - - $ref: "#/components/schemas/Descriptor" - contact: - description: Contact details of the stop - allOf: - - $ref: "#/components/schemas/Contact" - person: - description: The details of the person present at the stop - allOf: - - $ref: "#/components/schemas/Person" - authorization: - $ref: "#/components/schemas/Authorization" - Support: - description: Details of customer support - type: object - properties: - ref_id: - type: string - callback_phone: - type: string - format: phone - phone: - type: string - format: phone - email: - type: string - format: email - url: - type: string - format: uri - Tag: - description: "Describes a tag. This is used to contain extended metadata. This object can be added as a property to any schema to describe extended attributes. For BAPs, tags can be sent during search to optimize and filter search results. BPPs can use tags to index their catalog to allow better search functionality. Tags are sent by the BPP as part of the catalog response in the `on_search` callback. Tags are also meant for display purposes. Upon receiving a tag, BAPs are meant to render them as name-value pairs. This is particularly useful when rendering tabular information about a product or service." - type: object - properties: - descriptor: - description: "Description of the Tag, can be used to store detailed information." - allOf: - - $ref: "#/components/schemas/Descriptor" - value: - description: The value of the tag. This set by the BPP and rendered as-is by the BAP. - type: string - display: - description: "This value indicates if the tag is intended for display purposes. If set to `true`, then this tag must be displayed. If it is set to `false`, it should not be displayed. This value can override the group display value." - type: boolean - TagGroup: - description: "A collection of tag objects with group level attributes. For detailed documentation on the Tags and Tag Groups schema go to https://github.com/beckn/protocol-specifications/discussions/316" - type: object - properties: - display: - description: "Indicates the display properties of the tag group. If display is set to false, then the group will not be displayed. If it is set to true, it should be displayed. However, group-level display properties can be overriden by individual tag-level display property. As this schema is purely for catalog display purposes, it is not recommended to send this value during search." - type: boolean - default: true - descriptor: - description: "Description of the TagGroup, can be used to store detailed information." - allOf: - - $ref: "#/components/schemas/Descriptor" - list: - description: "An array of Tag objects listed under this group. This property can be set by BAPs during search to narrow the `search` and achieve more relevant results. When received during `on_search`, BAPs must render this list under the heading described by the `name` property of this schema." - type: array - items: - $ref: "#/components/schemas/Tag" - Time: - description: Describes time in its various forms. It can be a single point in time; duration; or a structured timetable of operations - type: object - properties: - label: - type: string - timestamp: - type: string - format: date-time - duration: - $ref: "#/components/schemas/Duration" - range: - type: object - properties: - start: - type: string - format: date-time - end: - type: string - format: date-time - days: - type: string - description: comma separated values representing days of the week - schedule: - $ref: "#/components/schemas/Schedule" - Tracking: - description: Describes a tracking object. it can be used to track the status of a service, i.e, a scholarship application, a course etc. - type: object - properties: - id: - description: A unique tracking reference number - type: string - url: - description: "A URL to the tracking endpoint. This can be a link to a tracking webpage, a webhook URL created by the BAP where BPP can push the tracking data, or a GET url creaed by the BPP which the BAP can poll to get the tracking data. It can also be a websocket URL where the BPP can push real-time tracking data." - type: string - format: uri - location: - description: "In case there is no real-time tracking endpoint available, this field will contain the latest location of the entity being tracked. The BPP will update this value everytime the BAP calls the track API." - allOf: - - $ref: "#/components/schemas/Location" - status: - description: "This value indicates if the tracking is currently active or not. If this value is `active`, then the BAP can begin tracking the order. If this value is `inactive`, the tracking URL is considered to be expired and the BAP should stop tracking the order." - type: string - enum: - - active - - inactive - Vehicle: - description: "Describes a vehicle is a device that is designed or used to transport people or cargo over land, water, air, or through space.
This has properties like category, capacity, make, model, size,variant,color,energy_type,registration" - type: object - properties: - category: - type: string - capacity: - type: integer - make: - type: string - model: - type: string - size: - type: string - variant: - type: string - color: - type: string - energy_type: - type: string - registration: - type: string - wheels_count: - type: string - cargo_volumne: - type: string - wheelchair_access: - type: string - code: - type: string - emission_standard: - type: string - XInput: - description: "Contains any additional or extended inputs required for the order. This is typically a Form Input. Sometimes, selection of catalog elements is not enough for the BPP to confirm an order. For example, A scholarship application may require additional details on the applicant as a proof of eligibility. For all such purposes, the BPP can choose to send this object attached to any object in the catalog that is required to be sent while placing the order. This object can typically be sent at an item level or at the order level. The item level XInput will override the Order level XInput as it indicates a special requirement of information for that particular item. Hence the BAP must render a separate form for the Item and another form at the Order level before confirmation." - type: object - properties: - form: - $ref: "#/components/schemas/Form" - required: - description: Indicates whether the form data is mandatorily required by the BPP to confirm the order. - type: boolean diff --git a/layer2/samples/dsep_jobs_1.1.0.yaml b/layer2/samples/dsep_jobs_1.1.0.yaml deleted file mode 100644 index bfac183..0000000 --- a/layer2/samples/dsep_jobs_1.1.0.yaml +++ /dev/null @@ -1,3063 +0,0 @@ -openapi: 3.0.0 -info: - title: Decentralized Skilling and Education Protocol Specification - description: Adaptation of beckn protocol for the domain of skilling and education - version: 0.7.0 - -security: - - SubscriberAuth: [] - - GatewaySubscriberAuthNew: [] -paths: - /search: - post: - tags: - - Beckn Provider Platform (BPP) - - Beckn Gateway (BG) - description: This allows a BAP to discover for catalogs offering
a) Jobs and Internships
b) Trainings and Courses
c) Mentors and Coaches and,
d) Scholarships and Grants - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - search - message: - type: object - properties: - intent: - $ref: "#/components/schemas/Intent" - required: - - context - - message - examples: - Search for 'web design' jobs by category code in the region of Delhi: - value: - context: - domain: jobs - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - ttl: P10S - message: - intent: - category: - descriptor: - name: Web design jobs - code: nic2008:62012 - Search for jobs by skills like carpentry and painting: - value: - context: - domain: jobs - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/uhi/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - message: - intent: - fulfillment: - customer: - person: - skills: - - name: Painting - - name: Carpentry - tags: - - descriptor: - name: Competence - list: - - descriptor: - name: Experience - value: 12Y - - Search for jobs along with expected salary: - value: - context: - domain: jobs - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/uhi/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - message: - intent: - fulfillment: - customer: - person: - skills: - - name: Java Programming - tags: - - descriptor: - name: Competence - list: - - descriptor: - name: Experience - value: 12Y - tags: - - descriptor: - name: Expectations - list: - - descriptor: - name: expected_payment - value: 250000INR/Month - - Search for jobs offered by a specific provider: - value: - context: - domain: jobs - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/uhi/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - message: - intent: - provider: - descriptor: - name: Infosys - Search for online courses matching a specific topic: - value: - context: - domain: trainings-and-courses - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/v0/ - bpp_id: https://mymentor.com/ - bpp_uri: https://api.mymentor.com/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - ttl: P10S - message: - intent: - item: - descriptor: - name: AI basics - tags: - - descriptor: - name: course_labels - list: - - descriptor: - name: label_1 - value: AI - - descriptor: - name: label_2 - value: ML - - descriptor: - name: label_3 - value: beginners - - descriptor: - name: label_4 - value: Artifical Intelligence - - descriptor: - name: label_5 - value: machine learning - - descriptor: - name: label_6 - value: neural networks - fulfillment: - type: FULL-TIME - Search for BTech courses offered by an engineering instituition like IIT Delhi: - value: - context: - domain: trainings-and-courses - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/v0/ - bpp_id: https://mymentor.com/ - bpp_uri: https://api.mymentor.com/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - ttl: P10S - message: - intent: - provider: - descriptor: - name: IIT Delhi - tags: - - descriptor: - name: course_labels - list: - - descriptor: - name: label_1 - value: AI - - descriptor: - name: label_2 - value: ML - - descriptor: - name: label_3 - value: beginners - - descriptor: - name: label_4 - value: Artifical Intelligence - - descriptor: - name: label_5 - value: machine learning - - descriptor: - name: label_6 - value: neural networks - category: - descriptor: - name: B.Tech - code: BTECH - fulfillment: - type: FULL-TIME - Searching for a mentor by name: - value: - context: - domain: mentorship-and-coaching - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/v0/ - bpp_id: https://mymentor.com/ - bpp_uri: https://api.mymentor.com/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - ttl: P10S - message: - intent: - fulfillment: - agent: - name: Dr Rajiv Manocha - Search for scholarships: - value: - context: - domain: mentorship - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/v0/ - bpp_id: https://mymentor.com/ - bpp_uri: https://api.mymentor.com/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - ttl: P10S - message: - intent: - category: - id: "4" - descriptor: - name: Engineering and Technology - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /select: - post: - tags: - - Beckn Provider Platform (BPP) - description: API for Selecting items from the catalog. - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - select - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /init: - post: - tags: - - Beckn Provider Platform (BPP) - description: Initialize an order by providing billing and/or shipping details - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - init - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /confirm: - post: - tags: - - Beckn Provider Platform (BPP) - description: Initialize an order by providing billing and/or shipping details - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - confirm - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /status: - post: - tags: - - Beckn Provider Platform (BPP) - description: Fetch the latest order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - status - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - required: - - order_id - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /track: - post: - tags: - - Beckn Provider Platform (BPP) - description: Track an active order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - track - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - callback_url: - type: string - format: uri - required: - - order_id - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /cancel: - post: - tags: - - Beckn Provider Platform (BPP) - description: Cancel an order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - cancel - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - cancellation_reason_id: - $ref: "#/components/schemas/Option/properties/id" - descriptor: - $ref: "#/components/schemas/Descriptor" - required: - - order_id - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /update: - post: - tags: - - Beckn Provider Platform (BPP) - description: Remove object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - update - required: - - action - message: - type: object - properties: - update_target: - description: 'Comma separated values of order objects being updated. For example: ```"update_target":"item,billing,fulfillment"```' - type: string - order: - $ref: "#/components/schemas/Order" - required: - - update_target - - order - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /rating: - post: - tags: - - Beckn Provider Platform (BPP) - description: Provide feedback on a service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - rating - required: - - action - message: - type: object - properties: - ratings: - type: array - items: - $ref: "#/components/schemas/Rating" - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /support: - post: - tags: - - Beckn Provider Platform (BPP) - description: Contact support - requestBody: - description: Contact support - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - support - required: - - action - message: - type: object - properties: - support: - $ref: "#/components/schemas/Support" - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /on_search: - post: - tags: - - Beckn App Platform (BAP) - - Beckn Gateway (BG) - description: Send catalog - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_search - required: - - action - message: - type: object - properties: - catalog: - $ref: "#/components/schemas/Catalog" - required: - - catalog - error: - $ref: "#/components/schemas/Error" - required: - - context - examples: - Publish a catalog of software jobs by a software agency: - value: - context: - domain: jobs:nic2008:62XXX - location: - city: - code: "*" - country: - code: IND - action: on_search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/uhi/v0/ - bpp_id: https://naukri.com/ - bpp_uri: https://api.naukri.com/uhi/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - message: - catalog: - descriptor: - name: Naukri Recruitment Platform - providers: - - descriptor: - name: Infosys - categories: - - id: "1" - name: Frontend Jobs - - id: "2" - name: Backend Jobs - items: - - descriptor: - name: Senior Software Developer - code: SSFD - fulfillment_ids: - - "1" - category_ids: - - "1" - matched: true - - descriptor: - name: Software Consultant - On site - code: SWCO - fulfillment_ids: - - "1" - category_ids: - - "1" - matched: "false" - - descriptor: - name: Software Consultant - Remote - code: SWCR - fulfillment_ids: - - "2" - category_ids: - - "2" - matched: "false" - fulfillments: - - id: "1" - descriptor: - name: Full-time - stops: - - location: - city: - code: BLR - - id: "2" - descriptor: - name: On-site - stops: - - location: - city: - code: BLR - type: start - time: - timestamp: "2022-08-10" - - location: - city: BLR - type: end - time: - timestamp: "2022-08-10" - - id: "3" - descriptor: - name: Remote - stops: - - time: - timestamp: "2022-08-10" - type: start - - time: - timestamp: "2022-08-10" - type: end - Publish a catalog of online courses: - value: - context: - domain: trainings-and-courses - location: - city: - code: std:011 - country: - code: IND - action: on_search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/uhi/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - message: - catalog: - descriptor: - name: XAcademy - providers: - - descriptor: - name: XAcademy - categories: - - id: "1" - name: Software - - id: "2" - name: Management - items: - - id: "1" - descriptor: - name: Basics of AI - price: - value: "6000" - fulfillment_ids: - - "1" - category_ids: - - "1" - - id: "2" - descriptor: - name: AI for Data Analysis - price: - value: "7000" - fulfillment_ids: - - "1" - category_ids: - - "1" - fulfillments: - - id: "1" - type: ONLINE - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - context - /on_select: - post: - tags: - - Beckn App Platform (BAP) - description: Send draft order object with quoted price for selected items - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - $ref: "#/components/schemas/Context" - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_init: - post: - tags: - - Beckn App Platform (BAP) - description: Send order object with payment details updated - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_init - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_confirm: - post: - tags: - - Beckn App Platform (BAP) - description: Send active order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_confirm - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_track: - post: - tags: - - Beckn App Platform (BAP) - description: Send tracking details of an active order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_track - required: - - action - message: - type: object - properties: - tracking: - $ref: "#/components/schemas/Tracking" - required: - - tracking - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_cancel: - post: - tags: - - Beckn App Platform (BAP) - description: Send cancellation request_id with reasons list in case of cancellation request. Else send cancelled order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_cancel - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_update: - post: - tags: - - Beckn App Platform (BAP) - description: Returns updated service with updated runtime object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_update - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_status: - post: - tags: - - Beckn App Platform (BAP) - description: Fetch the status of a Service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_status - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_rating: - post: - tags: - - Beckn App Platform (BAP) - description: Provide feedback on a service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_rating - required: - - action - message: - type: object - properties: - feedback_form: - description: A feedback form to allow the user to provide additional information on the rating provided - allOf: - - $ref: "#/components/schemas/XInput" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_support: - post: - tags: - - Beckn App Platform (BAP) - description: Contact Support - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_support - required: - - action - message: - type: object - properties: - support: - $ref: "#/components/schemas/Support" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /get_cancellation_reasons: - post: - tags: - - BPP Meta APIs - description: Get cancellation reasons from the BPP - requestBody: - description: Context header is sent as the request - content: - application/json: - schema: - type: object - properties: - context: - $ref: "#/components/schemas/Context" - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /cancellation_reasons: - post: - tags: - - BAP Meta APIs - description: Get cancellation reasons from the BPP - requestBody: - description: List of cancellation reasons - content: - application/json: - schema: - type: object - properties: - context: - $ref: "#/components/schemas/Context" - message: - type: object - properties: - cancellation_reasons: - type: array - items: - $ref: "#/components/schemas/Option" - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /get_return_reasons: - post: - tags: - - BPP Meta APIs - description: Get return reasons from the BPP - requestBody: - description: Context header is sent as the request - content: - application/json: - schema: - type: object - properties: - context: - $ref: "#/components/schemas/Context" - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /return_reasons: - post: - tags: - - BAP Meta APIs - description: Get return reasons from the BPP - requestBody: - description: List of return reasons - content: - application/json: - schema: - type: object - properties: - context: - $ref: "#/components/schemas/Context" - return_reasons: - type: array - items: - $ref: "#/components/schemas/Option" - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /get_rating_categories: - post: - tags: - - BPP Meta APIs - description: Get a list of categories that can be rated by the BAP - requestBody: - description: Context header is sent as the request - content: - application/json: - schema: - type: object - properties: - context: - $ref: "#/components/schemas/Context" - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /rating_categories: - post: - tags: - - BAP Meta APIs - description: Get a list of categories that can be rated by the BAP - requestBody: - description: Array of categories which can be rated - content: - application/json: - schema: - type: object - properties: - context: - $ref: "#/components/schemas/Context" - rating_categories: - type: array - items: - $ref: "#/components/schemas/Rating/properties/rating_category" - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message -components: - securitySchemes: - SubscriberAuth: - type: apiKey - in: header - name: Authorization - description: 'Signature of message body using BAP or BPP subscriber''s signing public key.

Format:

Authorization : Signature keyId="{subscriber_id}|{unique_key_id}|{algorithm}",algorithm="ed25519",created="1606970629",expires="1607030629",headers="(created) (expires) digest",signature="Base64(signing string)"' - GatewaySubscriberAuth: - type: apiKey - in: header - name: Proxy-Authorization - description: 'Signature of message body + BAP/BPP''s Authorization header using BG''s signing public key. Format:

Proxy-Authorization : Signature keyId="{subscriber_id}|{unique_key_id}|{algorithm}",algorithm="ed25519",created="1606970629",expires="1607030629",headers="(created) (expires) digest",signature="Base64(signing string)"

Note:This header will be deprecated soon and will no longer be supported in future releases. New implementors are requested to use the X-Gateway-Authorization header. Existing implementations are requested to migrate their header to the new header. The deprecation date will be set after discussion as per the standard specification governance process.

' - GatewaySubscriberAuthNew: - type: apiKey - in: header - name: X-Gateway-Authorization - description: 'Signature of message body + BAP/BPP''s Authorization header using BG''s signing public key. Format:

X-Gateway-Authorization : Signature keyId="{subscriber_id}|{unique_key_id}|{algorithm}",algorithm="ed25519",created="1606970629",expires="1607030629",headers="(created) (expires) digest",signature="Base64(signing string)"' - schemas: - Ack: - description: This describes an acknowledgement of receipt of a message. Upon receiving a message, the receiver must first authenticate the sender by verifying its digital signature. Upon successful verification of the signature, the receiver must validate the schema of the message. After performing both the operations, the receiver should send an Ack object in response. - type: object - properties: - status: - type: string - description: "Describe the status of the ACK response. If the message passes the acknowledgement criteria, then the receiver shouls set this value equal to ACK else it should be set to NACK" - enum: - - ACK - - NACK - tags: - description: A list of tags containing any additional information sent along with the Acknowledgement. - type: array - items: - $ref: "#/components/schemas/TagGroup" - AddOn: - description: This is typically an optional product or service that can be offered in addition to a product or a service of type Item. Objects of type AddOn should not exist without an associated Item. If a BAP receives an Item with an add-on, it must show it to the user as a selectable object. If any AddOn object is found without an associated Item object, then the validator must throw an error 'NO-PARENT=ITEM' with message 'No parent found' - type: object - properties: - id: - type: string - description: ID of the add-on as present in the source catalog - optional: - type: boolean - default: false - description: This value indicates if the add-on is optional or required to be selected by the user along with an Item. If this value is set to true, then the BAP must ensure that the add-on is mandatorily selected by the user while creating the Order object with the Item. - descriptor: - $ref: "#/components/schemas/Descriptor" - price: - $ref: "#/components/schemas/Price" - Address: - description: Describes a postal address. - type: string - Agent: - description: "Describes a person who fulfills this order." - properties: - person: - $ref: "#/components/schemas/Person" - contact: - $ref: "#/components/schemas/Contact" - organization: - $ref: "#/components/schemas/Organization" - rating: - $ref: "#/components/schemas/Rating/properties/value" - Authorization: - description: "Describes an authorization mechanism used to start or end the fulfillment of an order. For example, in the mobility sector, the driver may require a one-time password to initiate the ride. In the healthcare sector, a patient may need to provide a password to open a video conference link during a teleconsultation." - type: object - properties: - type: - description: Type of authorization mechanism used. The allowed values for this field can be published as part of the network policy. - type: string - token: - description: "Token used for authorization. This is typically generated at the BPP. The BAP can send this value to the user via any channel that it uses to authenticate the user like SMS, Email, Push notification, or in-app rendering." - type: string - valid_from: - description: Timestamp in RFC3339 format from which token is valid - type: string - format: date-time - valid_to: - description: Timestamp in RFC3339 format until which token is valid - type: string - format: date-time - status: - description: Status of the token - type: string - Billing: - description: Describes the billing details of an order. This must be provided by BAP user before confirmation of the order. - type: object - properties: - name: - description: Name of the person under who's name the bill will be generated. - type: string - organization: - description: Name of the organization under who's name the bill will be generated. - allOf: - - $ref: "#/components/schemas/Organization" - address: - allOf: - - $ref: "#/components/schemas/Address" - state: - description: The state where the billable entity resides. This is important for state-level tax calculation - allOf: - - $ref: "#/components/schemas/State" - city: - description: The city where the billable entity resides. - allOf: - - $ref: "#/components/schemas/City" - email: - description: Email address of the person / organization being billed. The BPP must send the bill to this email address. The format of the bill may be defined in the network policy. - type: string - format: email - phone: - description: Phone number of the person / organization being billed. The BPP must send the bill to this phone number as per the format specified in the network policy. In case the bill is a downloadable file, it is recommended the bill should be sent to the phone number as a downloadable link. - type: string - time: - $ref: "#/components/schemas/Time" - tax_id: - description: This is the identity of a Tax-paying person or an organization. This number can be provided to the BPP to avail tax benefits, if applicable. The format of this string should be specified in the network policy - type: string - created_at: - description: Date and time at which this bill was generated by the BPP. - type: string - format: date-time - - Cancellation: - description: Describes a cancellation event - type: object - properties: - time: - description: Date-time when the order was cancelled by the seeker - type: string - format: date-time - cancelled_by: - type: string - enum: - - SEEKER - - PROVIDER - reason: - description: The reason for cancellation - allOf: - - $ref: "#/components/schemas/Option" - additional_description: - description: Any additional information regarding the nature of cancellation - allOf: - - $ref: "#/components/schemas/Descriptor" - - CancellationTerm: - description: Describes the cancellation terms of an order, i.e, scholarship application, course etc. This can be referenced at an item or order level. Item-level cancellation terms can override the terms at the order level. - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/FulfillmentState" - reason_required: - description: Indicates whether a reason is required to cancel the order - type: boolean - cancel_by: - description: Information related to the time of cancellation. - allOf: - - $ref: "#/components/schemas/Time" - cancellation_fee: - $ref: "#/components/schemas/Fee" - xinput: - $ref: "#/components/schemas/XInput" - external_ref: - $ref: "#/components/schemas/MediaFile" - Catalog: - description: "Describes a skilling and education catalog" - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - fulfillments: - description: Fulfillment modes offered at the BPP level. This is used when a BPP itself offers fulfillments on behalf of the providers it has onboarded. - type: array - items: - $ref: "#/components/schemas/Fulfillment" - payments: - description: Payment terms offered by the BPP for all transactions. This can be overriden at the provider level. - type: array - items: - $ref: "#/components/schemas/Payment" - offers: - description: Offers at the BPP-level. This is common across all providers onboarded by the BPP. - type: array - items: - $ref: "#/components/schemas/Offer" - providers: - type: array - items: - $ref: "#/components/schemas/Provider" - exp: - description: Timestamp after which catalog will expire - type: string - format: date-time - ttl: - description: Duration in seconds after which this catalog will expire - type: string - Category: - description: Describes a category - type: object - properties: - id: - type: string - description: Unique id of the category - parent_category_id: - $ref: "#/components/schemas/Category/properties/id" - descriptor: - $ref: "#/components/schemas/Descriptor" - time: - $ref: "#/components/schemas/Time" - ttl: - description: Time to live for an instance of this schema - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Circle: - description: Describes a circular area on the map - type: object - properties: - gps: - $ref: "#/components/schemas/Gps" - radius: - $ref: "#/components/schemas/Scalar" - City: - description: Describes a city - type: object - properties: - name: - type: string - description: Name of the city - code: - type: string - description: City code - Contact: - description: Describes the contact information of an entity - type: object - properties: - phone: - type: string - email: - type: string - jcard: - type: object - description: A Jcard object as per draft-ietf-jcardcal-jcard-03 specification - Context: - description: Describes a beckn message context - type: object - properties: - domain: - allOf: - - $ref: "#/components/schemas/Domain/properties/code" - location: - description: The location where the transaction is intended to be fulfilled. - allOf: - - $ref: "#/components/schemas/Location" - action: - type: string - description: Defines the Beckn API call type. - version: - type: string - description: Version of Beckn core API specification being used - bap_id: - type: string - description: Unique id of the BAP. By default it is the fully qualified domain name of the BAP - bap_uri: - type: string - format: uri - description: URI of the BAP for accepting callbacks. Must have the same domain name as the bap_id - bpp_id: - type: string - description: Unique id of the BPP. By default it is the fully qualified domain name of the BPP - bpp_uri: - type: string - format: uri - description: URI of the BPP. Must have the same domain name as the bap_id - transaction_id: - type: string - format: uuid - description: This is a unique value which persists across all API calls from search through confirm - message_id: - type: string - format: uuid - description: This is a unique value which persists during a request / callback cycle - timestamp: - type: string - format: date-time - description: Time of request generation in RFC3339 format - key: - type: string - description: The encryption public key of the sender - ttl: - type: string - description: The duration in ISO8601 format after timestamp for which this message holds valid - Country: - description: Describes a country. - type: object - properties: - name: - type: string - description: Name of the country - code: - type: string - description: Country code as per ISO 3166-1 and ISO 3166-2 format - Credential: - description: Describes a credential of an entity - Person or Organization - type: object - properties: - id: - type: string - type: - type: string - default: VerifiableCredential - url: - description: URL of the credential - type: string - format: uri - Customer: - description: Describes a customer buying/availing a product or a service - type: object - properties: - person: - $ref: "#/components/schemas/Person" - contact: - $ref: "#/components/schemas/Contact" - Domain: - description: "Described the industry sector or sub-sector. The network policy should contain codes for all the industry sectors supported by the network. Domains can be created in varying levels of granularity. The granularity of a domain can be decided by the participants of the network. Too broad domains will result in irrelevant search broadcast calls to BPPs that don't have services supporting the domain. Too narrow domains will result in a large number of registry entries for each BPP. It is recommended that network facilitators actively collaborate with various working groups and network participants to carefully choose domain codes keeping in mind relevance, performance, and opportunity cost. It is recommended that networks choose broad domains like mobility, logistics, healthcare etc, and progressively granularize them as and when the number of network participants for each domain grows large." - type: object - properties: - name: - description: Name of the domain - type: string - code: - description: "Standard code representing the domain. The standard is usually published as part of the network policy. Furthermore, the network facilitator should also provide a mechanism to provide the supported domains of a network." - additional_info: - description: A url that contains addtional information about that domain. - allOf: - - $ref: "#/components/schemas/MediaFile" - DecimalValue: - description: Describes a decimal value - type: string - pattern: "[+-]?([0-9]*[.])?[0-9]+" - Descriptor: - description: Physical description of something. - type: object - properties: - name: - type: string - code: - type: string - short_desc: - type: string - long_desc: - type: string - additional_desc: - type: object - properties: - url: - type: string - content_type: - type: string - enum: - - text/plain - - text/html - - application/json - media: - type: array - items: - $ref: "#/components/schemas/MediaFile" - images: - type: array - items: - $ref: "#/components/schemas/Image" - Duration: - description: Describes duration as per ISO8601 format - type: string - Error: - description: Describes an error object - type: object - properties: - type: - type: string - enum: - - CONTEXT-ERROR - - CORE-ERROR - - DOMAIN-ERROR - - POLICY-ERROR - - JSON-SCHEMA-ERROR - code: - type: string - description: "Beckn specific error code. For full list of error codes, refer to docs/protocol-drafts/BECKN-RFC-005-ERROR-CODES-DRAFT-01.md of this repo" - path: - type: string - description: Path to json schema generating the error. Used only during json schema validation errors - message: - type: string - description: Human readable message describing the error - required: - - type - - code - Fee: - description: A fee applied on a particular entity - type: object - properties: - percentage: - description: Percentage of a value - allOf: - - $ref: "#/components/schemas/DecimalValue" - amount: - description: A fixed value - allOf: - - $ref: "#/components/schemas/Price" - Form: - description: Describes a form - type: object - properties: - url: - description: "The URL from where the form can be fetched. The content fetched from the url must be processed as per the mime_type specified in this object. Once fetched, the rendering platform can choosed to render the form as-is as an embeddable element; or process it further to blend with the theme of the application. In case the interface is non-visual, the the render can process the form data and reproduce it as per the standard specified in the form." - type: string - format: uri - data: - description: The form submission data - type: object - additionalProperties: - type: string - mime_type: - description: This field indicates the nature and format of the form received by querying the url. MIME types are defined and standardized in IETF's RFC 6838. - type: string - enum: - - text/html - - application/xml - submission_id: - type: string - format: uuid - Fulfillment: - description: Describes how a an order will be rendered/fulfilled to the end-customer - type: object - properties: - id: - description: Unique reference ID to the fulfillment of an order - type: string - type: - description: "A code that describes the mode of fulfillment. This is typically set when there are multiple ways an order can be fulfilled. For example, a retail order can be fulfilled either via store pickup or a home delivery. Similarly, a medical consultation can be provided either in-person or via tele-consultation. The network policy must publish standard fulfillment type codes for the different modes of fulfillment." - type: string - rateable: - description: Whether the fulfillment can be rated or not - type: boolean - rating: - description: The rating value of the fulfullment service. - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - state: - description: The current state of fulfillment. The BPP must set this value whenever the state of the order fulfillment changes and fire an unsolicited `on_status` call. - allOf: - - $ref: "#/components/schemas/FulfillmentState" - tracking: - type: boolean - description: Indicates whether the fulfillment allows tracking - default: false - customer: - description: The person that will ultimately receive the order - allOf: - - $ref: "#/components/schemas/Customer" - agent: - description: The agent that is currently handling the fulfillment of the order - allOf: - - $ref: "#/components/schemas/Agent" - contact: - $ref: "#/components/schemas/Contact" - vehicle: - $ref: "#/components/schemas/Vehicle" - stops: - description: The list of logical stops encountered during the fulfillment of an order. - type: array - items: - $ref: "#/components/schemas/Stop" - path: - description: The physical path taken by the agent that can be rendered on a map. The allowed format of this property can be set by the network. - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - FulfillmentState: - description: Describes the state of fulfillment - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - updated_at: - type: string - format: date-time - updated_by: - type: string - description: ID of entity which changed the state - Gps: - description: Describes a GPS coordinate - type: string - pattern: '^[-+]?([1-8]?\d(\.\d+)?|90(\.0+)?),\s*[-+]?(180(\.0+)?|((1[0-7]\d)|([1-9]?\d))(\.\d+)?)$' - Image: - description: Describes an image - type: object - properties: - url: - description: URL to the image. This can be a data url or an remote url - type: string - format: uri - size_type: - description: The size of the image. The network policy can define the default dimensions of each type - type: string - enum: - - xs - - sm - - md - - lg - - xl - - custom - width: - description: Width of the image in pixels - type: string - height: - description: Height of the image in pixels - type: string - Intent: - description: "The intent to get a Learning and Career Development Resources. The BAP can declare the intent of the consumer containing
  • What they want (scholarship, job, course etc)
  • Who they want (A seller, service provider, agent etc)
  • Where they want it and where they want it from
  • When they want it (start and end time of fulfillment
  • How they want to pay for it

This has properties like descriptor,provider,fulfillment,payment,category,offer,item,tags
This is typically used by the BAP to send the purpose of the user's search to the BPP. This will be used by the BPP to find products or services it offers that may match the user's intent.
For example, in Mobility, the mobility consumer declares a mobility intent. In this case, the mobility consumer declares information that describes various aspects of their journey like,
  • Where would they like to begin their journey (intent.fulfillment.start.location)
  • Where would they like to end their journey (intent.fulfillment.end.location)
  • When would they like to begin their journey (intent.fulfillment.start.time)
  • When would they like to end their journey (intent.fulfillment.end.time)
  • Who is the transport service provider they would like to avail services from (intent.provider)
  • Who is traveling (This is not recommended in public networks) (intent.fulfillment.customer)
  • What kind of fare product would they like to purchase (intent.item)
  • What add-on services would they like to avail
  • What offers would they like to apply on their booking (intent.offer)
  • What category of services would they like to avail (intent.category)
  • What additional luggage are they carrying
  • How would they like to pay for their journey (intent.payment)

For example, in health domain, a consumer declares the intent for a lab booking the describes various aspects of their booking like,
  • Where would they like to get their scan/test done (intent.fulfillment.start.location)
  • When would they like to get their scan/test done (intent.fulfillment.start.time)
  • When would they like to get the results of their test/scan (intent.fulfillment.end.time)
  • Who is the service provider they would like to avail services from (intent.provider)
  • Who is getting the test/scan (intent.fulfillment.customer)
  • What kind of test/scan would they like to purchase (intent.item)
  • What category of services would they like to avail (intent.category)
  • How would they like to pay for their journey (intent.payment)
" - type: object - properties: - descriptor: - description: "A raw description of the search intent. Free text search strings, raw audio, etc can be sent in this object." - allOf: - - $ref: "#/components/schemas/Descriptor" - provider: - description: The provider from which the customer wants to place to the order from - allOf: - - $ref: "#/components/schemas/Provider" - fulfillment: - description: Details on how the customer wants their order fulfilled - allOf: - - $ref: "#/components/schemas/Fulfillment" - payment: - description: Details on how the customer wants to pay for the order - allOf: - - $ref: "#/components/schemas/Payment" - category: - description: Details on the item category - allOf: - - $ref: "#/components/schemas/Category" - offer: - description: details on the offer the customer wants to avail - allOf: - - $ref: "#/components/schemas/Offer" - item: - description: Details of the item that the consumer wants to order - allOf: - - $ref: "#/components/schemas/Item" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - ItemQuantity: - description: Describes the count or amount of an item - type: object - properties: - allocated: - description: This represents the exact quantity allocated for purchase of the item. - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - available: - description: This represents the exact quantity available for purchase of the item. The buyer can only purchase multiples of this - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - maximum: - description: This represents the maximum quantity allowed for purchase of the item - type: object - properties: - count: - type: integer - minimum: 1 - measure: - $ref: "#/components/schemas/Scalar" - minimum: - description: This represents the minimum quantity allowed for purchase of the item - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - selected: - description: This represents the quantity selected for purchase of the item - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - unitized: - description: This represents the quantity available in a single unit of the item - type: object - properties: - count: - type: integer - minimum: 1 - maximum: 1 - measure: - $ref: "#/components/schemas/Scalar" - Item: - description: "Describes a product or a service offered to the end consumer by the provider. In the mobility sector, it can represent a fare product like one way journey. In the logistics sector, it can represent the delivery service offering. In the retail domain it can represent a product like a grocery item." - type: object - properties: - id: - description: ID of the item. - type: string - parent_item_id: - description: "ID of the item, this item is a variant of" - allOf: - - $ref: "#/components/schemas/Item/properties/id" - parent_item_quantity: - description: The number of units of the parent item this item is a multiple of - allOf: - - $ref: "#/components/schemas/ItemQuantity" - descriptor: - description: Physical description of the item - allOf: - - $ref: "#/components/schemas/Descriptor" - creator: - description: The creator of this item - allOf: - - $ref: "#/components/schemas/Organization" - price: - description: "The price of this item, if it has intrinsic value" - allOf: - - $ref: "#/components/schemas/Price" - quantity: - description: The selling quantity of the item - allOf: - - $ref: "#/components/schemas/ItemQuantity" - category_ids: - description: Categories this item can be listed under - type: array - items: - allOf: - - $ref: "#/components/schemas/Category/properties/id" - fulfillment_ids: - description: Modes through which this item can be fulfilled - type: array - items: - allOf: - - $ref: "#/components/schemas/Fulfillment/properties/id" - location_ids: - description: Provider Locations this item is available in - type: array - items: - allOf: - - $ref: "#/components/schemas/Location/properties/id" - payment_ids: - description: Payment modalities through which this item can be ordered - type: array - items: - allOf: - - $ref: "#/components/schemas/Payment/properties/id" - add_ons: - type: array - items: - $ref: "#/components/schemas/AddOn" - cancellation_terms: - description: Cancellation terms of this item - type: array - items: - $ref: "#/components/schemas/CancellationTerm" - refund_terms: - description: Refund terms of this item - type: array - items: - description: Refund term of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/State" - refund_eligible: - description: Indicates if cancellation will result in a refund - type: boolean - refund_within: - description: Time within which refund will be processed after successful cancellation. - allOf: - - $ref: "#/components/schemas/Time" - refund_amount: - $ref: "#/components/schemas/Price" - replacement_terms: - description: Terms that are applicable be met when this item is replaced - type: array - items: - $ref: "#/components/schemas/ReplacementTerm" - return_terms: - description: Terms that are applicable when this item is returned - type: array - items: - $ref: "#/components/schemas/ReturnTerm" - xinput: - description: Additional input required from the customer to purchase / avail this item - allOf: - - $ref: "#/components/schemas/XInput" - time: - description: Temporal attributes of this item. This property is used when the item exists on the catalog only for a limited period of time. - allOf: - - $ref: "#/components/schemas/Time" - rateable: - description: Whether this item can be rated - type: boolean - rating: - description: The rating of the item - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - matched: - description: Whether this item is an exact match of the request - type: boolean - related: - description: Whether this item is a related item to the exactly matched item - type: boolean - recommended: - description: Whether this item is a recommended item to a response - type: boolean - ttl: - description: Time to live in seconds for an instance of this schema - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Location: - description: The physical location of something - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - map_url: - description: The url to the map of the location. This can be a globally recognized map url or the one specified by the network policy. - type: string - format: uri - gps: - description: The GPS co-ordinates of this location. - allOf: - - $ref: "#/components/schemas/Gps" - address: - description: The address of this location. - allOf: - - $ref: "#/components/schemas/Address" - city: - description: "The city this location is, or is located within" - allOf: - - $ref: "#/components/schemas/City" - district: - description: "The state this location is, or is located within" - type: string - state: - description: "The state this location is, or is located within" - allOf: - - $ref: "#/components/schemas/State" - country: - description: "The country this location is, or is located within" - allOf: - - $ref: "#/components/schemas/Country" - area_code: - type: string - circle: - $ref: "#/components/schemas/Circle" - polygon: - description: The boundary polygon of this location - type: string - 3dspace: - description: The three dimensional region describing this location - type: string - rating: - description: The rating of this location - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - MediaFile: - description: This object contains a url to a media file. - type: object - properties: - mimetype: - description: "indicates the nature and format of the document, file, or assortment of bytes. MIME types are defined and standardized in IETF's RFC 6838" - type: string - url: - description: The URL of the file - type: string - format: uri - signature: - description: The digital signature of the file signed by the sender - type: string - dsa: - description: The signing algorithm used by the sender - type: string - Offer: - description: An offer associated with a catalog. This is typically used to promote a particular product and enable more purchases. - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - location_ids: - type: array - items: - $ref: "#/components/schemas/Location/properties/id" - category_ids: - type: array - items: - $ref: "#/components/schemas/Category/properties/id" - item_ids: - type: array - items: - $ref: "#/components/schemas/Item/properties/id" - time: - $ref: "#/components/schemas/Time" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Option: - description: Describes a selectable option - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - Order: - description: Describes a legal purchase order. It contains the complete details of the legal contract created between the buyer and the seller. - type: object - properties: - id: - type: string - description: Human-readable ID of the order. This is generated at the BPP layer. The BPP can either generate order id within its system or forward the order ID created at the provider level. - ref_order_ids: - description: A list of order IDs to link this order to previous orders. - type: array - items: - type: string - description: ID of a previous order - status: - description: Status of the order. Allowed values can be defined by the network policy - type: string - enum: - - ACTIVE - - COMPLETE - - CANCELLED - type: - description: "This is used to indicate the type of order being created to BPPs. Sometimes orders can be linked to previous orders, like a replacement order in a retail domain. A follow-up consultation in healthcare domain. A single order part of a subscription order. The list of order types can be standardized at the network level." - type: string - default: DEFAULT - enum: - - DRAFT - - DEFAULT - provider: - description: Details of the provider whose catalog items have been selected. - allOf: - - $ref: "#/components/schemas/Provider" - items: - description: The items purchased / availed in this order - type: array - items: - $ref: "#/components/schemas/Item" - add_ons: - description: The add-ons purchased / availed in this order - type: array - items: - $ref: "#/components/schemas/AddOn" - offers: - description: The offers applied in this order - type: array - items: - $ref: "#/components/schemas/Offer" - billing: - description: The billing details of this order - allOf: - - $ref: "#/components/schemas/Billing" - fulfillments: - description: The fulfillments involved in completing this order - type: array - items: - $ref: "#/components/schemas/Fulfillment" - cancellation: - description: The cancellation details of this order - allOf: - - $ref: "#/components/schemas/Cancellation" - cancellation_terms: - description: Cancellation terms of this item - type: array - items: - $ref: "#/components/schemas/CancellationTerm" - refund_terms: - description: Refund terms of this item - type: array - items: - $ref: "#/components/schemas/Item/properties/refund_terms/items" - replacement_terms: - description: Replacement terms of this item - type: array - items: - $ref: "#/components/schemas/ReplacementTerm" - return_terms: - description: Return terms of this item - type: array - items: - $ref: "#/components/schemas/ReturnTerm" - quote: - description: The mutually agreed upon quotation for this order. - allOf: - - $ref: "#/components/schemas/Quotation" - payments: - description: The terms of settlement for this order - type: array - items: - $ref: "#/components/schemas/Payment" - created_at: - description: The date-time of creation of this order - type: string - format: date-time - updated_at: - description: The date-time of updated of this order - type: string - format: date-time - xinput: - description: Additional input required from the customer to confirm this order - allOf: - - $ref: "#/components/schemas/XInput" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Organization: - description: An organization. Usually a recognized business entity. - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - address: - description: The postal address of the organization - allOf: - - $ref: "#/components/schemas/Address" - state: - description: The state where the organization's address is registered - allOf: - - $ref: "#/components/schemas/State" - city: - description: The city where the the organization's address is registered - allOf: - - $ref: "#/components/schemas/City" - contact: - $ref: "#/components/schemas/Contact" - Payment: - description: "Describes the terms of settlement between the BAP and the BPP for a single transaction. When instantiated, this object contains
  1. the amount that has to be settled,
  2. The payment destination destination details
  3. When the settlement should happen, and
  4. A transaction reference ID
. During a transaction, the BPP reserves the right to decide the terms of payment. However, the BAP can send its terms to the BPP first. If the BPP does not agree to those terms, it must overwrite the terms and return them to the BAP. If overridden, the BAP must either agree to the terms sent by the BPP in order to preserve the provider's autonomy, or abort the transaction. In case of such disagreements, the BAP and the BPP can perform offline negotiations on the payment terms. Once an agreement is reached, the BAP and BPP can resume transactions." - type: object - properties: - id: - description: ID of the payment term that can be referred at an item or an order level in a catalog - type: string - collected_by: - description: "This field indicates who is the collector of payment. The BAP can set this value to 'bap' if it wants to collect the payment first and settle it to the BPP. If the BPP agrees to those terms, the BPP should not send the payment url. Alternatively, the BPP can set this field with the value 'bpp' if it wants the payment to be made directly." - url: - type: string - description: "A payment url to be called by the BAP. If empty, then the payment is to be done offline. The details of payment should be present in the params object. If tl_method = http/get, then the payment details will be sent as url params. Two url param values, ```$transaction_id``` and ```$amount``` are mandatory." - format: uri - params: - type: object - properties: - transaction_id: - type: string - description: The reference transaction ID associated with a payment activity - amount: - type: string - currency: - type: string - bank_code: - type: string - bank_account_number: - type: string - virtual_payment_address: - type: string - source_bank_code: - type: string - source_bank_account_number: - type: string - source_virtual_payment_address: - type: string - type: - type: string - enum: - - PRE-ORDER - - PRE-FULFILLMENT - - ON-FULFILLMENT - - POST-FULFILLMENT - status: - type: string - enum: - - PAID - - NOT-PAID - time: - $ref: "#/components/schemas/Time" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Person: - description: Describes a person as any individual - type: object - properties: - id: - type: string - description: Describes the identity of the person - url: - description: Profile url of the person - type: string - format: uri - name: - description: the name of the person - type: string - image: - $ref: "#/components/schemas/Image" - age: - description: Age of the person - allOf: - - $ref: "#/components/schemas/Duration" - dob: - description: Date of birth of the person - type: string - format: date - gender: - type: string - description: "Gender of something, typically a Person, but possibly also fictional characters, animals, etc. While Male and Female may be used, text strings are also acceptable for people who do not identify as a binary gender.Allowed values for this field can be published in the network policy" - creds: - type: array - items: - $ref: "#/components/schemas/Credential" - languages: - type: array - items: - description: Describes a language known to the person. - type: object - properties: - code: - type: string - name: - type: string - skills: - type: array - items: - description: Describes a skill of the person. - type: object - properties: - code: - type: string - name: - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Price: - description: Describes the price of a product or service - type: object - properties: - currency: - type: string - value: - $ref: "#/components/schemas/DecimalValue" - estimated_value: - $ref: "#/components/schemas/DecimalValue" - computed_value: - $ref: "#/components/schemas/DecimalValue" - listed_value: - $ref: "#/components/schemas/DecimalValue" - offered_value: - $ref: "#/components/schemas/DecimalValue" - minimum_value: - $ref: "#/components/schemas/DecimalValue" - maximum_value: - $ref: "#/components/schemas/DecimalValue" - Provider: - description: Describes the catalog of an entity, entitiy can be a scholarship facilitator, course provider etc - type: object - properties: - id: - type: string - description: Id of the provider - descriptor: - $ref: "#/components/schemas/Descriptor" - category_id: - type: string - description: Category Id of the provider at the BPP-level catalog - rating: - $ref: "#/components/schemas/Rating/properties/value" - time: - $ref: "#/components/schemas/Time" - categories: - type: array - items: - $ref: "#/components/schemas/Category" - fulfillments: - type: array - items: - $ref: "#/components/schemas/Fulfillment" - payments: - type: array - items: - $ref: "#/components/schemas/Payment" - locations: - type: array - items: - $ref: "#/components/schemas/Location" - offers: - type: array - items: - $ref: "#/components/schemas/Offer" - items: - type: array - items: - $ref: "#/components/schemas/Item" - exp: - type: string - description: Time after which catalog has to be refreshed - format: date-time - rateable: - description: Whether this provider can be rated or not - type: boolean - ttl: - description: "The time-to-live in seconds, for this object. This can be overriden at deeper levels. A value of -1 indicates that this object is not cacheable." - type: integer - minimum: -1 - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Quotation: - description: "Describes a quote. It is the estimated price of products or services from the BPP.
This has properties like price, breakup, ttl" - type: object - properties: - id: - description: ID of the quote. - type: string - format: uuid - price: - description: The total quoted price - allOf: - - $ref: "#/components/schemas/Price" - breakup: - description: the breakup of the total quoted price - type: array - items: - type: object - properties: - item: - $ref: "#/components/schemas/Item" - title: - type: string - price: - $ref: "#/components/schemas/Price" - ttl: - $ref: "#/components/schemas/Duration" - Rating: - description: Describes the rating of an entity - type: object - properties: - rating_category: - description: Category of the entity being rated - type: string - enum: - - Item - - Order - - Fulfillment - - Provider - - Agent - - Support - id: - description: Id of the object being rated - type: string - value: - description: "Rating value given to the object. This can be a single value or can also contain an inequality operator like gt, gte, lt, lte. This can also contain an inequality expression containing logical operators like && and ||." - - ReplacementTerm: - description: The replacement policy of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/State" - replace_within: - description: "Applicable only for buyer managed returns where the buyer has to replace the item before a certain date-time, failing which they will not be eligible for replacement" - allOf: - - $ref: "#/components/schemas/Time" - external_ref: - $ref: "#/components/schemas/MediaFile" - - ReturnTerm: - description: Describes the return policy of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term IETF''s applicable. - allOf: - - $ref: "#/components/schemas/State" - return_eligible: - description: Indicates whether the item is eligible for return - type: boolean - return_time: - description: "Applicable only for buyer managed returns where the buyer has to return the item to the origin before a certain date-time, failing which they will not be eligible for refund." - allOf: - - $ref: "#/components/schemas/Time" - return_location: - description: The location where the item or order must / will be returned to - allOf: - - $ref: "#/components/schemas/Location" - fulfillment_managed_by: - description: The entity that will perform the return - type: string - enum: - - CONSUMER - - PROVIDER - Scalar: - description: Describes a scalar - type: object - properties: - type: - type: string - enum: - - CONSTANT - - VARIABLE - value: - $ref: "#/components/schemas/DecimalValue" - estimated_value: - $ref: "#/components/schemas/DecimalValue" - computed_value: - $ref: "#/components/schemas/DecimalValue" - range: - type: object - properties: - min: - $ref: "#/components/schemas/DecimalValue" - max: - $ref: "#/components/schemas/DecimalValue" - unit: - type: string - Schedule: - description: "Describes schedule as a repeating time period used to describe a regularly recurring event. At a minimum a schedule will specify frequency which describes the interval between occurrences of the event. Additional information can be provided to specify the schedule more precisely. This includes identifying the timestamps(s) of when the event will take place. Schedules may also have holidays to exclude a specific day from the schedule.
This has properties like frequency, holidays, times" - type: object - properties: - frequency: - $ref: "#/components/schemas/Duration" - holidays: - type: array - items: - type: string - format: date-time - times: - type: array - items: - type: string - format: date-time - State: - description: A bounded geopolitical region of governance inside a country. - type: object - properties: - name: - type: string - description: Name of the state - code: - type: string - description: State code as per country or international standards - Stop: - description: A logical point in space and time during the fulfillment of an order. - type: object - properties: - id: - type: string - parent_stop_id: - type: string - location: - description: Location of the stop - allOf: - - $ref: "#/components/schemas/Location" - type: - description: The type of stop. Allowed values of this property can be defined by the network policy. - type: string - time: - description: Timings applicable at the stop. - allOf: - - $ref: "#/components/schemas/Time" - instructions: - description: Instructions that need to be followed at the stop - allOf: - - $ref: "#/components/schemas/Descriptor" - contact: - description: Contact details of the stop - allOf: - - $ref: "#/components/schemas/Contact" - person: - description: The details of the person present at the stop - allOf: - - $ref: "#/components/schemas/Person" - authorization: - $ref: "#/components/schemas/Authorization" - Support: - description: Details of customer support - type: object - properties: - ref_id: - type: string - callback_phone: - type: string - format: phone - phone: - type: string - format: phone - email: - type: string - format: email - url: - type: string - format: uri - Tag: - description: "Describes a tag. This is used to contain extended metadata. This object can be added as a property to any schema to describe extended attributes. For BAPs, tags can be sent during search to optimize and filter search results. BPPs can use tags to index their catalog to allow better search functionality. Tags are sent by the BPP as part of the catalog response in the `on_search` callback. Tags are also meant for display purposes. Upon receiving a tag, BAPs are meant to render them as name-value pairs. This is particularly useful when rendering tabular information about a product or service." - type: object - properties: - descriptor: - description: "Description of the Tag, can be used to store detailed information." - allOf: - - $ref: "#/components/schemas/Descriptor" - value: - description: The value of the tag. This set by the BPP and rendered as-is by the BAP. - type: string - display: - description: "This value indicates if the tag is intended for display purposes. If set to `true`, then this tag must be displayed. If it is set to `false`, it should not be displayed. This value can override the group display value." - type: boolean - TagGroup: - description: "A collection of tag objects with group level attributes. For detailed documentation on the Tags and Tag Groups schema go to https://github.com/beckn/protocol-specifications/discussions/316" - type: object - properties: - display: - description: "Indicates the display properties of the tag group. If display is set to false, then the group will not be displayed. If it is set to true, it should be displayed. However, group-level display properties can be overriden by individual tag-level display property. As this schema is purely for catalog display purposes, it is not recommended to send this value during search." - type: boolean - default: true - descriptor: - description: "Description of the TagGroup, can be used to store detailed information." - allOf: - - $ref: "#/components/schemas/Descriptor" - list: - description: "An array of Tag objects listed under this group. This property can be set by BAPs during search to narrow the `search` and achieve more relevant results. When received during `on_search`, BAPs must render this list under the heading described by the `name` property of this schema." - type: array - items: - $ref: "#/components/schemas/Tag" - Time: - description: Describes time in its various forms. It can be a single point in time; duration; or a structured timetable of operations - type: object - properties: - label: - type: string - timestamp: - type: string - format: date-time - duration: - $ref: "#/components/schemas/Duration" - range: - type: object - properties: - start: - type: string - format: date-time - end: - type: string - format: date-time - days: - type: string - description: comma separated values representing days of the week - schedule: - $ref: "#/components/schemas/Schedule" - Tracking: - description: Describes a tracking object. it can be used to track the status of a service, i.e, a scholarship application, a course etc. - type: object - properties: - id: - description: A unique tracking reference number - type: string - url: - description: "A URL to the tracking endpoint. This can be a link to a tracking webpage, a webhook URL created by the BAP where BPP can push the tracking data, or a GET url creaed by the BPP which the BAP can poll to get the tracking data. It can also be a websocket URL where the BPP can push real-time tracking data." - type: string - format: uri - location: - description: "In case there is no real-time tracking endpoint available, this field will contain the latest location of the entity being tracked. The BPP will update this value everytime the BAP calls the track API." - allOf: - - $ref: "#/components/schemas/Location" - status: - description: "This value indicates if the tracking is currently active or not. If this value is `active`, then the BAP can begin tracking the order. If this value is `inactive`, the tracking URL is considered to be expired and the BAP should stop tracking the order." - type: string - enum: - - active - - inactive - Vehicle: - description: "Describes a vehicle is a device that is designed or used to transport people or cargo over land, water, air, or through space.
This has properties like category, capacity, make, model, size,variant,color,energy_type,registration" - type: object - properties: - category: - type: string - capacity: - type: integer - make: - type: string - model: - type: string - size: - type: string - variant: - type: string - color: - type: string - energy_type: - type: string - registration: - type: string - wheels_count: - type: string - cargo_volumne: - type: string - wheelchair_access: - type: string - code: - type: string - emission_standard: - type: string - XInput: - description: "Contains any additional or extended inputs required for the order. This is typically a Form Input. Sometimes, selection of catalog elements is not enough for the BPP to confirm an order. For example, A scholarship application may require additional details on the applicant as a proof of eligibility. For all such purposes, the BPP can choose to send this object attached to any object in the catalog that is required to be sent while placing the order. This object can typically be sent at an item level or at the order level. The item level XInput will override the Order level XInput as it indicates a special requirement of information for that particular item. Hence the BAP must render a separate form for the Item and another form at the Order level before confirmation." - type: object - properties: - form: - $ref: "#/components/schemas/Form" - required: - description: Indicates whether the form data is mandatorily required by the BPP to confirm the order. - type: boolean diff --git a/layer2/samples/dsep_scholarships_1.1.0.yaml b/layer2/samples/dsep_scholarships_1.1.0.yaml deleted file mode 100644 index bfac183..0000000 --- a/layer2/samples/dsep_scholarships_1.1.0.yaml +++ /dev/null @@ -1,3063 +0,0 @@ -openapi: 3.0.0 -info: - title: Decentralized Skilling and Education Protocol Specification - description: Adaptation of beckn protocol for the domain of skilling and education - version: 0.7.0 - -security: - - SubscriberAuth: [] - - GatewaySubscriberAuthNew: [] -paths: - /search: - post: - tags: - - Beckn Provider Platform (BPP) - - Beckn Gateway (BG) - description: This allows a BAP to discover for catalogs offering
a) Jobs and Internships
b) Trainings and Courses
c) Mentors and Coaches and,
d) Scholarships and Grants - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - search - message: - type: object - properties: - intent: - $ref: "#/components/schemas/Intent" - required: - - context - - message - examples: - Search for 'web design' jobs by category code in the region of Delhi: - value: - context: - domain: jobs - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - ttl: P10S - message: - intent: - category: - descriptor: - name: Web design jobs - code: nic2008:62012 - Search for jobs by skills like carpentry and painting: - value: - context: - domain: jobs - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/uhi/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - message: - intent: - fulfillment: - customer: - person: - skills: - - name: Painting - - name: Carpentry - tags: - - descriptor: - name: Competence - list: - - descriptor: - name: Experience - value: 12Y - - Search for jobs along with expected salary: - value: - context: - domain: jobs - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/uhi/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - message: - intent: - fulfillment: - customer: - person: - skills: - - name: Java Programming - tags: - - descriptor: - name: Competence - list: - - descriptor: - name: Experience - value: 12Y - tags: - - descriptor: - name: Expectations - list: - - descriptor: - name: expected_payment - value: 250000INR/Month - - Search for jobs offered by a specific provider: - value: - context: - domain: jobs - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/uhi/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - message: - intent: - provider: - descriptor: - name: Infosys - Search for online courses matching a specific topic: - value: - context: - domain: trainings-and-courses - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/v0/ - bpp_id: https://mymentor.com/ - bpp_uri: https://api.mymentor.com/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - ttl: P10S - message: - intent: - item: - descriptor: - name: AI basics - tags: - - descriptor: - name: course_labels - list: - - descriptor: - name: label_1 - value: AI - - descriptor: - name: label_2 - value: ML - - descriptor: - name: label_3 - value: beginners - - descriptor: - name: label_4 - value: Artifical Intelligence - - descriptor: - name: label_5 - value: machine learning - - descriptor: - name: label_6 - value: neural networks - fulfillment: - type: FULL-TIME - Search for BTech courses offered by an engineering instituition like IIT Delhi: - value: - context: - domain: trainings-and-courses - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/v0/ - bpp_id: https://mymentor.com/ - bpp_uri: https://api.mymentor.com/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - ttl: P10S - message: - intent: - provider: - descriptor: - name: IIT Delhi - tags: - - descriptor: - name: course_labels - list: - - descriptor: - name: label_1 - value: AI - - descriptor: - name: label_2 - value: ML - - descriptor: - name: label_3 - value: beginners - - descriptor: - name: label_4 - value: Artifical Intelligence - - descriptor: - name: label_5 - value: machine learning - - descriptor: - name: label_6 - value: neural networks - category: - descriptor: - name: B.Tech - code: BTECH - fulfillment: - type: FULL-TIME - Searching for a mentor by name: - value: - context: - domain: mentorship-and-coaching - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/v0/ - bpp_id: https://mymentor.com/ - bpp_uri: https://api.mymentor.com/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - ttl: P10S - message: - intent: - fulfillment: - agent: - name: Dr Rajiv Manocha - Search for scholarships: - value: - context: - domain: mentorship - location: - city: - code: std:011 - country: - code: IND - action: search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/v0/ - bpp_id: https://mymentor.com/ - bpp_uri: https://api.mymentor.com/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - ttl: P10S - message: - intent: - category: - id: "4" - descriptor: - name: Engineering and Technology - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /select: - post: - tags: - - Beckn Provider Platform (BPP) - description: API for Selecting items from the catalog. - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - select - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /init: - post: - tags: - - Beckn Provider Platform (BPP) - description: Initialize an order by providing billing and/or shipping details - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - init - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /confirm: - post: - tags: - - Beckn Provider Platform (BPP) - description: Initialize an order by providing billing and/or shipping details - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - confirm - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /status: - post: - tags: - - Beckn Provider Platform (BPP) - description: Fetch the latest order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - status - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - required: - - order_id - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /track: - post: - tags: - - Beckn Provider Platform (BPP) - description: Track an active order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - track - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - callback_url: - type: string - format: uri - required: - - order_id - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /cancel: - post: - tags: - - Beckn Provider Platform (BPP) - description: Cancel an order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - cancel - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - cancellation_reason_id: - $ref: "#/components/schemas/Option/properties/id" - descriptor: - $ref: "#/components/schemas/Descriptor" - required: - - order_id - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /update: - post: - tags: - - Beckn Provider Platform (BPP) - description: Remove object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - update - required: - - action - message: - type: object - properties: - update_target: - description: 'Comma separated values of order objects being updated. For example: ```"update_target":"item,billing,fulfillment"```' - type: string - order: - $ref: "#/components/schemas/Order" - required: - - update_target - - order - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /rating: - post: - tags: - - Beckn Provider Platform (BPP) - description: Provide feedback on a service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - rating - required: - - action - message: - type: object - properties: - ratings: - type: array - items: - $ref: "#/components/schemas/Rating" - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /support: - post: - tags: - - Beckn Provider Platform (BPP) - description: Contact support - requestBody: - description: Contact support - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - support - required: - - action - message: - type: object - properties: - support: - $ref: "#/components/schemas/Support" - required: - - context - - message - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /on_search: - post: - tags: - - Beckn App Platform (BAP) - - Beckn Gateway (BG) - description: Send catalog - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_search - required: - - action - message: - type: object - properties: - catalog: - $ref: "#/components/schemas/Catalog" - required: - - catalog - error: - $ref: "#/components/schemas/Error" - required: - - context - examples: - Publish a catalog of software jobs by a software agency: - value: - context: - domain: jobs:nic2008:62XXX - location: - city: - code: "*" - country: - code: IND - action: on_search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/uhi/v0/ - bpp_id: https://naukri.com/ - bpp_uri: https://api.naukri.com/uhi/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - message: - catalog: - descriptor: - name: Naukri Recruitment Platform - providers: - - descriptor: - name: Infosys - categories: - - id: "1" - name: Frontend Jobs - - id: "2" - name: Backend Jobs - items: - - descriptor: - name: Senior Software Developer - code: SSFD - fulfillment_ids: - - "1" - category_ids: - - "1" - matched: true - - descriptor: - name: Software Consultant - On site - code: SWCO - fulfillment_ids: - - "1" - category_ids: - - "1" - matched: "false" - - descriptor: - name: Software Consultant - Remote - code: SWCR - fulfillment_ids: - - "2" - category_ids: - - "2" - matched: "false" - fulfillments: - - id: "1" - descriptor: - name: Full-time - stops: - - location: - city: - code: BLR - - id: "2" - descriptor: - name: On-site - stops: - - location: - city: - code: BLR - type: start - time: - timestamp: "2022-08-10" - - location: - city: BLR - type: end - time: - timestamp: "2022-08-10" - - id: "3" - descriptor: - name: Remote - stops: - - time: - timestamp: "2022-08-10" - type: start - - time: - timestamp: "2022-08-10" - type: end - Publish a catalog of online courses: - value: - context: - domain: trainings-and-courses - location: - city: - code: std:011 - country: - code: IND - action: on_search - version: 1.1.0 - bap_id: https://exampleapp.io/ - bap_uri: https://api.exampleapp.io/uhi/v0/ - message_id: 5ac3dd78-829e-4c7d-9139-a15adbb582cc - timestamp: "2021-03-23T10:00:40.065Z" - message: - catalog: - descriptor: - name: XAcademy - providers: - - descriptor: - name: XAcademy - categories: - - id: "1" - name: Software - - id: "2" - name: Management - items: - - id: "1" - descriptor: - name: Basics of AI - price: - value: "6000" - fulfillment_ids: - - "1" - category_ids: - - "1" - - id: "2" - descriptor: - name: AI for Data Analysis - price: - value: "7000" - fulfillment_ids: - - "1" - category_ids: - - "1" - fulfillments: - - id: "1" - type: ONLINE - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - context - /on_select: - post: - tags: - - Beckn App Platform (BAP) - description: Send draft order object with quoted price for selected items - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - $ref: "#/components/schemas/Context" - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_init: - post: - tags: - - Beckn App Platform (BAP) - description: Send order object with payment details updated - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_init - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_confirm: - post: - tags: - - Beckn App Platform (BAP) - description: Send active order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_confirm - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_track: - post: - tags: - - Beckn App Platform (BAP) - description: Send tracking details of an active order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_track - required: - - action - message: - type: object - properties: - tracking: - $ref: "#/components/schemas/Tracking" - required: - - tracking - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_cancel: - post: - tags: - - Beckn App Platform (BAP) - description: Send cancellation request_id with reasons list in case of cancellation request. Else send cancelled order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_cancel - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_update: - post: - tags: - - Beckn App Platform (BAP) - description: Returns updated service with updated runtime object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_update - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_status: - post: - tags: - - Beckn App Platform (BAP) - description: Fetch the status of a Service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_status - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_rating: - post: - tags: - - Beckn App Platform (BAP) - description: Provide feedback on a service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_rating - required: - - action - message: - type: object - properties: - feedback_form: - description: A feedback form to allow the user to provide additional information on the rating provided - allOf: - - $ref: "#/components/schemas/XInput" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_support: - post: - tags: - - Beckn App Platform (BAP) - description: Contact Support - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_support - required: - - action - message: - type: object - properties: - support: - $ref: "#/components/schemas/Support" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /get_cancellation_reasons: - post: - tags: - - BPP Meta APIs - description: Get cancellation reasons from the BPP - requestBody: - description: Context header is sent as the request - content: - application/json: - schema: - type: object - properties: - context: - $ref: "#/components/schemas/Context" - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /cancellation_reasons: - post: - tags: - - BAP Meta APIs - description: Get cancellation reasons from the BPP - requestBody: - description: List of cancellation reasons - content: - application/json: - schema: - type: object - properties: - context: - $ref: "#/components/schemas/Context" - message: - type: object - properties: - cancellation_reasons: - type: array - items: - $ref: "#/components/schemas/Option" - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /get_return_reasons: - post: - tags: - - BPP Meta APIs - description: Get return reasons from the BPP - requestBody: - description: Context header is sent as the request - content: - application/json: - schema: - type: object - properties: - context: - $ref: "#/components/schemas/Context" - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /return_reasons: - post: - tags: - - BAP Meta APIs - description: Get return reasons from the BPP - requestBody: - description: List of return reasons - content: - application/json: - schema: - type: object - properties: - context: - $ref: "#/components/schemas/Context" - return_reasons: - type: array - items: - $ref: "#/components/schemas/Option" - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /get_rating_categories: - post: - tags: - - BPP Meta APIs - description: Get a list of categories that can be rated by the BAP - requestBody: - description: Context header is sent as the request - content: - application/json: - schema: - type: object - properties: - context: - $ref: "#/components/schemas/Context" - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /rating_categories: - post: - tags: - - BAP Meta APIs - description: Get a list of categories that can be rated by the BAP - requestBody: - description: Array of categories which can be rated - content: - application/json: - schema: - type: object - properties: - context: - $ref: "#/components/schemas/Context" - rating_categories: - type: array - items: - $ref: "#/components/schemas/Rating/properties/rating_category" - responses: - "200": - description: Acknowledgement of message received - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message -components: - securitySchemes: - SubscriberAuth: - type: apiKey - in: header - name: Authorization - description: 'Signature of message body using BAP or BPP subscriber''s signing public key.

Format:

Authorization : Signature keyId="{subscriber_id}|{unique_key_id}|{algorithm}",algorithm="ed25519",created="1606970629",expires="1607030629",headers="(created) (expires) digest",signature="Base64(signing string)"' - GatewaySubscriberAuth: - type: apiKey - in: header - name: Proxy-Authorization - description: 'Signature of message body + BAP/BPP''s Authorization header using BG''s signing public key. Format:

Proxy-Authorization : Signature keyId="{subscriber_id}|{unique_key_id}|{algorithm}",algorithm="ed25519",created="1606970629",expires="1607030629",headers="(created) (expires) digest",signature="Base64(signing string)"

Note:This header will be deprecated soon and will no longer be supported in future releases. New implementors are requested to use the X-Gateway-Authorization header. Existing implementations are requested to migrate their header to the new header. The deprecation date will be set after discussion as per the standard specification governance process.

' - GatewaySubscriberAuthNew: - type: apiKey - in: header - name: X-Gateway-Authorization - description: 'Signature of message body + BAP/BPP''s Authorization header using BG''s signing public key. Format:

X-Gateway-Authorization : Signature keyId="{subscriber_id}|{unique_key_id}|{algorithm}",algorithm="ed25519",created="1606970629",expires="1607030629",headers="(created) (expires) digest",signature="Base64(signing string)"' - schemas: - Ack: - description: This describes an acknowledgement of receipt of a message. Upon receiving a message, the receiver must first authenticate the sender by verifying its digital signature. Upon successful verification of the signature, the receiver must validate the schema of the message. After performing both the operations, the receiver should send an Ack object in response. - type: object - properties: - status: - type: string - description: "Describe the status of the ACK response. If the message passes the acknowledgement criteria, then the receiver shouls set this value equal to ACK else it should be set to NACK" - enum: - - ACK - - NACK - tags: - description: A list of tags containing any additional information sent along with the Acknowledgement. - type: array - items: - $ref: "#/components/schemas/TagGroup" - AddOn: - description: This is typically an optional product or service that can be offered in addition to a product or a service of type Item. Objects of type AddOn should not exist without an associated Item. If a BAP receives an Item with an add-on, it must show it to the user as a selectable object. If any AddOn object is found without an associated Item object, then the validator must throw an error 'NO-PARENT=ITEM' with message 'No parent found' - type: object - properties: - id: - type: string - description: ID of the add-on as present in the source catalog - optional: - type: boolean - default: false - description: This value indicates if the add-on is optional or required to be selected by the user along with an Item. If this value is set to true, then the BAP must ensure that the add-on is mandatorily selected by the user while creating the Order object with the Item. - descriptor: - $ref: "#/components/schemas/Descriptor" - price: - $ref: "#/components/schemas/Price" - Address: - description: Describes a postal address. - type: string - Agent: - description: "Describes a person who fulfills this order." - properties: - person: - $ref: "#/components/schemas/Person" - contact: - $ref: "#/components/schemas/Contact" - organization: - $ref: "#/components/schemas/Organization" - rating: - $ref: "#/components/schemas/Rating/properties/value" - Authorization: - description: "Describes an authorization mechanism used to start or end the fulfillment of an order. For example, in the mobility sector, the driver may require a one-time password to initiate the ride. In the healthcare sector, a patient may need to provide a password to open a video conference link during a teleconsultation." - type: object - properties: - type: - description: Type of authorization mechanism used. The allowed values for this field can be published as part of the network policy. - type: string - token: - description: "Token used for authorization. This is typically generated at the BPP. The BAP can send this value to the user via any channel that it uses to authenticate the user like SMS, Email, Push notification, or in-app rendering." - type: string - valid_from: - description: Timestamp in RFC3339 format from which token is valid - type: string - format: date-time - valid_to: - description: Timestamp in RFC3339 format until which token is valid - type: string - format: date-time - status: - description: Status of the token - type: string - Billing: - description: Describes the billing details of an order. This must be provided by BAP user before confirmation of the order. - type: object - properties: - name: - description: Name of the person under who's name the bill will be generated. - type: string - organization: - description: Name of the organization under who's name the bill will be generated. - allOf: - - $ref: "#/components/schemas/Organization" - address: - allOf: - - $ref: "#/components/schemas/Address" - state: - description: The state where the billable entity resides. This is important for state-level tax calculation - allOf: - - $ref: "#/components/schemas/State" - city: - description: The city where the billable entity resides. - allOf: - - $ref: "#/components/schemas/City" - email: - description: Email address of the person / organization being billed. The BPP must send the bill to this email address. The format of the bill may be defined in the network policy. - type: string - format: email - phone: - description: Phone number of the person / organization being billed. The BPP must send the bill to this phone number as per the format specified in the network policy. In case the bill is a downloadable file, it is recommended the bill should be sent to the phone number as a downloadable link. - type: string - time: - $ref: "#/components/schemas/Time" - tax_id: - description: This is the identity of a Tax-paying person or an organization. This number can be provided to the BPP to avail tax benefits, if applicable. The format of this string should be specified in the network policy - type: string - created_at: - description: Date and time at which this bill was generated by the BPP. - type: string - format: date-time - - Cancellation: - description: Describes a cancellation event - type: object - properties: - time: - description: Date-time when the order was cancelled by the seeker - type: string - format: date-time - cancelled_by: - type: string - enum: - - SEEKER - - PROVIDER - reason: - description: The reason for cancellation - allOf: - - $ref: "#/components/schemas/Option" - additional_description: - description: Any additional information regarding the nature of cancellation - allOf: - - $ref: "#/components/schemas/Descriptor" - - CancellationTerm: - description: Describes the cancellation terms of an order, i.e, scholarship application, course etc. This can be referenced at an item or order level. Item-level cancellation terms can override the terms at the order level. - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/FulfillmentState" - reason_required: - description: Indicates whether a reason is required to cancel the order - type: boolean - cancel_by: - description: Information related to the time of cancellation. - allOf: - - $ref: "#/components/schemas/Time" - cancellation_fee: - $ref: "#/components/schemas/Fee" - xinput: - $ref: "#/components/schemas/XInput" - external_ref: - $ref: "#/components/schemas/MediaFile" - Catalog: - description: "Describes a skilling and education catalog" - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - fulfillments: - description: Fulfillment modes offered at the BPP level. This is used when a BPP itself offers fulfillments on behalf of the providers it has onboarded. - type: array - items: - $ref: "#/components/schemas/Fulfillment" - payments: - description: Payment terms offered by the BPP for all transactions. This can be overriden at the provider level. - type: array - items: - $ref: "#/components/schemas/Payment" - offers: - description: Offers at the BPP-level. This is common across all providers onboarded by the BPP. - type: array - items: - $ref: "#/components/schemas/Offer" - providers: - type: array - items: - $ref: "#/components/schemas/Provider" - exp: - description: Timestamp after which catalog will expire - type: string - format: date-time - ttl: - description: Duration in seconds after which this catalog will expire - type: string - Category: - description: Describes a category - type: object - properties: - id: - type: string - description: Unique id of the category - parent_category_id: - $ref: "#/components/schemas/Category/properties/id" - descriptor: - $ref: "#/components/schemas/Descriptor" - time: - $ref: "#/components/schemas/Time" - ttl: - description: Time to live for an instance of this schema - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Circle: - description: Describes a circular area on the map - type: object - properties: - gps: - $ref: "#/components/schemas/Gps" - radius: - $ref: "#/components/schemas/Scalar" - City: - description: Describes a city - type: object - properties: - name: - type: string - description: Name of the city - code: - type: string - description: City code - Contact: - description: Describes the contact information of an entity - type: object - properties: - phone: - type: string - email: - type: string - jcard: - type: object - description: A Jcard object as per draft-ietf-jcardcal-jcard-03 specification - Context: - description: Describes a beckn message context - type: object - properties: - domain: - allOf: - - $ref: "#/components/schemas/Domain/properties/code" - location: - description: The location where the transaction is intended to be fulfilled. - allOf: - - $ref: "#/components/schemas/Location" - action: - type: string - description: Defines the Beckn API call type. - version: - type: string - description: Version of Beckn core API specification being used - bap_id: - type: string - description: Unique id of the BAP. By default it is the fully qualified domain name of the BAP - bap_uri: - type: string - format: uri - description: URI of the BAP for accepting callbacks. Must have the same domain name as the bap_id - bpp_id: - type: string - description: Unique id of the BPP. By default it is the fully qualified domain name of the BPP - bpp_uri: - type: string - format: uri - description: URI of the BPP. Must have the same domain name as the bap_id - transaction_id: - type: string - format: uuid - description: This is a unique value which persists across all API calls from search through confirm - message_id: - type: string - format: uuid - description: This is a unique value which persists during a request / callback cycle - timestamp: - type: string - format: date-time - description: Time of request generation in RFC3339 format - key: - type: string - description: The encryption public key of the sender - ttl: - type: string - description: The duration in ISO8601 format after timestamp for which this message holds valid - Country: - description: Describes a country. - type: object - properties: - name: - type: string - description: Name of the country - code: - type: string - description: Country code as per ISO 3166-1 and ISO 3166-2 format - Credential: - description: Describes a credential of an entity - Person or Organization - type: object - properties: - id: - type: string - type: - type: string - default: VerifiableCredential - url: - description: URL of the credential - type: string - format: uri - Customer: - description: Describes a customer buying/availing a product or a service - type: object - properties: - person: - $ref: "#/components/schemas/Person" - contact: - $ref: "#/components/schemas/Contact" - Domain: - description: "Described the industry sector or sub-sector. The network policy should contain codes for all the industry sectors supported by the network. Domains can be created in varying levels of granularity. The granularity of a domain can be decided by the participants of the network. Too broad domains will result in irrelevant search broadcast calls to BPPs that don't have services supporting the domain. Too narrow domains will result in a large number of registry entries for each BPP. It is recommended that network facilitators actively collaborate with various working groups and network participants to carefully choose domain codes keeping in mind relevance, performance, and opportunity cost. It is recommended that networks choose broad domains like mobility, logistics, healthcare etc, and progressively granularize them as and when the number of network participants for each domain grows large." - type: object - properties: - name: - description: Name of the domain - type: string - code: - description: "Standard code representing the domain. The standard is usually published as part of the network policy. Furthermore, the network facilitator should also provide a mechanism to provide the supported domains of a network." - additional_info: - description: A url that contains addtional information about that domain. - allOf: - - $ref: "#/components/schemas/MediaFile" - DecimalValue: - description: Describes a decimal value - type: string - pattern: "[+-]?([0-9]*[.])?[0-9]+" - Descriptor: - description: Physical description of something. - type: object - properties: - name: - type: string - code: - type: string - short_desc: - type: string - long_desc: - type: string - additional_desc: - type: object - properties: - url: - type: string - content_type: - type: string - enum: - - text/plain - - text/html - - application/json - media: - type: array - items: - $ref: "#/components/schemas/MediaFile" - images: - type: array - items: - $ref: "#/components/schemas/Image" - Duration: - description: Describes duration as per ISO8601 format - type: string - Error: - description: Describes an error object - type: object - properties: - type: - type: string - enum: - - CONTEXT-ERROR - - CORE-ERROR - - DOMAIN-ERROR - - POLICY-ERROR - - JSON-SCHEMA-ERROR - code: - type: string - description: "Beckn specific error code. For full list of error codes, refer to docs/protocol-drafts/BECKN-RFC-005-ERROR-CODES-DRAFT-01.md of this repo" - path: - type: string - description: Path to json schema generating the error. Used only during json schema validation errors - message: - type: string - description: Human readable message describing the error - required: - - type - - code - Fee: - description: A fee applied on a particular entity - type: object - properties: - percentage: - description: Percentage of a value - allOf: - - $ref: "#/components/schemas/DecimalValue" - amount: - description: A fixed value - allOf: - - $ref: "#/components/schemas/Price" - Form: - description: Describes a form - type: object - properties: - url: - description: "The URL from where the form can be fetched. The content fetched from the url must be processed as per the mime_type specified in this object. Once fetched, the rendering platform can choosed to render the form as-is as an embeddable element; or process it further to blend with the theme of the application. In case the interface is non-visual, the the render can process the form data and reproduce it as per the standard specified in the form." - type: string - format: uri - data: - description: The form submission data - type: object - additionalProperties: - type: string - mime_type: - description: This field indicates the nature and format of the form received by querying the url. MIME types are defined and standardized in IETF's RFC 6838. - type: string - enum: - - text/html - - application/xml - submission_id: - type: string - format: uuid - Fulfillment: - description: Describes how a an order will be rendered/fulfilled to the end-customer - type: object - properties: - id: - description: Unique reference ID to the fulfillment of an order - type: string - type: - description: "A code that describes the mode of fulfillment. This is typically set when there are multiple ways an order can be fulfilled. For example, a retail order can be fulfilled either via store pickup or a home delivery. Similarly, a medical consultation can be provided either in-person or via tele-consultation. The network policy must publish standard fulfillment type codes for the different modes of fulfillment." - type: string - rateable: - description: Whether the fulfillment can be rated or not - type: boolean - rating: - description: The rating value of the fulfullment service. - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - state: - description: The current state of fulfillment. The BPP must set this value whenever the state of the order fulfillment changes and fire an unsolicited `on_status` call. - allOf: - - $ref: "#/components/schemas/FulfillmentState" - tracking: - type: boolean - description: Indicates whether the fulfillment allows tracking - default: false - customer: - description: The person that will ultimately receive the order - allOf: - - $ref: "#/components/schemas/Customer" - agent: - description: The agent that is currently handling the fulfillment of the order - allOf: - - $ref: "#/components/schemas/Agent" - contact: - $ref: "#/components/schemas/Contact" - vehicle: - $ref: "#/components/schemas/Vehicle" - stops: - description: The list of logical stops encountered during the fulfillment of an order. - type: array - items: - $ref: "#/components/schemas/Stop" - path: - description: The physical path taken by the agent that can be rendered on a map. The allowed format of this property can be set by the network. - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - FulfillmentState: - description: Describes the state of fulfillment - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - updated_at: - type: string - format: date-time - updated_by: - type: string - description: ID of entity which changed the state - Gps: - description: Describes a GPS coordinate - type: string - pattern: '^[-+]?([1-8]?\d(\.\d+)?|90(\.0+)?),\s*[-+]?(180(\.0+)?|((1[0-7]\d)|([1-9]?\d))(\.\d+)?)$' - Image: - description: Describes an image - type: object - properties: - url: - description: URL to the image. This can be a data url or an remote url - type: string - format: uri - size_type: - description: The size of the image. The network policy can define the default dimensions of each type - type: string - enum: - - xs - - sm - - md - - lg - - xl - - custom - width: - description: Width of the image in pixels - type: string - height: - description: Height of the image in pixels - type: string - Intent: - description: "The intent to get a Learning and Career Development Resources. The BAP can declare the intent of the consumer containing
  • What they want (scholarship, job, course etc)
  • Who they want (A seller, service provider, agent etc)
  • Where they want it and where they want it from
  • When they want it (start and end time of fulfillment
  • How they want to pay for it

This has properties like descriptor,provider,fulfillment,payment,category,offer,item,tags
This is typically used by the BAP to send the purpose of the user's search to the BPP. This will be used by the BPP to find products or services it offers that may match the user's intent.
For example, in Mobility, the mobility consumer declares a mobility intent. In this case, the mobility consumer declares information that describes various aspects of their journey like,
  • Where would they like to begin their journey (intent.fulfillment.start.location)
  • Where would they like to end their journey (intent.fulfillment.end.location)
  • When would they like to begin their journey (intent.fulfillment.start.time)
  • When would they like to end their journey (intent.fulfillment.end.time)
  • Who is the transport service provider they would like to avail services from (intent.provider)
  • Who is traveling (This is not recommended in public networks) (intent.fulfillment.customer)
  • What kind of fare product would they like to purchase (intent.item)
  • What add-on services would they like to avail
  • What offers would they like to apply on their booking (intent.offer)
  • What category of services would they like to avail (intent.category)
  • What additional luggage are they carrying
  • How would they like to pay for their journey (intent.payment)

For example, in health domain, a consumer declares the intent for a lab booking the describes various aspects of their booking like,
  • Where would they like to get their scan/test done (intent.fulfillment.start.location)
  • When would they like to get their scan/test done (intent.fulfillment.start.time)
  • When would they like to get the results of their test/scan (intent.fulfillment.end.time)
  • Who is the service provider they would like to avail services from (intent.provider)
  • Who is getting the test/scan (intent.fulfillment.customer)
  • What kind of test/scan would they like to purchase (intent.item)
  • What category of services would they like to avail (intent.category)
  • How would they like to pay for their journey (intent.payment)
" - type: object - properties: - descriptor: - description: "A raw description of the search intent. Free text search strings, raw audio, etc can be sent in this object." - allOf: - - $ref: "#/components/schemas/Descriptor" - provider: - description: The provider from which the customer wants to place to the order from - allOf: - - $ref: "#/components/schemas/Provider" - fulfillment: - description: Details on how the customer wants their order fulfilled - allOf: - - $ref: "#/components/schemas/Fulfillment" - payment: - description: Details on how the customer wants to pay for the order - allOf: - - $ref: "#/components/schemas/Payment" - category: - description: Details on the item category - allOf: - - $ref: "#/components/schemas/Category" - offer: - description: details on the offer the customer wants to avail - allOf: - - $ref: "#/components/schemas/Offer" - item: - description: Details of the item that the consumer wants to order - allOf: - - $ref: "#/components/schemas/Item" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - ItemQuantity: - description: Describes the count or amount of an item - type: object - properties: - allocated: - description: This represents the exact quantity allocated for purchase of the item. - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - available: - description: This represents the exact quantity available for purchase of the item. The buyer can only purchase multiples of this - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - maximum: - description: This represents the maximum quantity allowed for purchase of the item - type: object - properties: - count: - type: integer - minimum: 1 - measure: - $ref: "#/components/schemas/Scalar" - minimum: - description: This represents the minimum quantity allowed for purchase of the item - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - selected: - description: This represents the quantity selected for purchase of the item - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - unitized: - description: This represents the quantity available in a single unit of the item - type: object - properties: - count: - type: integer - minimum: 1 - maximum: 1 - measure: - $ref: "#/components/schemas/Scalar" - Item: - description: "Describes a product or a service offered to the end consumer by the provider. In the mobility sector, it can represent a fare product like one way journey. In the logistics sector, it can represent the delivery service offering. In the retail domain it can represent a product like a grocery item." - type: object - properties: - id: - description: ID of the item. - type: string - parent_item_id: - description: "ID of the item, this item is a variant of" - allOf: - - $ref: "#/components/schemas/Item/properties/id" - parent_item_quantity: - description: The number of units of the parent item this item is a multiple of - allOf: - - $ref: "#/components/schemas/ItemQuantity" - descriptor: - description: Physical description of the item - allOf: - - $ref: "#/components/schemas/Descriptor" - creator: - description: The creator of this item - allOf: - - $ref: "#/components/schemas/Organization" - price: - description: "The price of this item, if it has intrinsic value" - allOf: - - $ref: "#/components/schemas/Price" - quantity: - description: The selling quantity of the item - allOf: - - $ref: "#/components/schemas/ItemQuantity" - category_ids: - description: Categories this item can be listed under - type: array - items: - allOf: - - $ref: "#/components/schemas/Category/properties/id" - fulfillment_ids: - description: Modes through which this item can be fulfilled - type: array - items: - allOf: - - $ref: "#/components/schemas/Fulfillment/properties/id" - location_ids: - description: Provider Locations this item is available in - type: array - items: - allOf: - - $ref: "#/components/schemas/Location/properties/id" - payment_ids: - description: Payment modalities through which this item can be ordered - type: array - items: - allOf: - - $ref: "#/components/schemas/Payment/properties/id" - add_ons: - type: array - items: - $ref: "#/components/schemas/AddOn" - cancellation_terms: - description: Cancellation terms of this item - type: array - items: - $ref: "#/components/schemas/CancellationTerm" - refund_terms: - description: Refund terms of this item - type: array - items: - description: Refund term of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/State" - refund_eligible: - description: Indicates if cancellation will result in a refund - type: boolean - refund_within: - description: Time within which refund will be processed after successful cancellation. - allOf: - - $ref: "#/components/schemas/Time" - refund_amount: - $ref: "#/components/schemas/Price" - replacement_terms: - description: Terms that are applicable be met when this item is replaced - type: array - items: - $ref: "#/components/schemas/ReplacementTerm" - return_terms: - description: Terms that are applicable when this item is returned - type: array - items: - $ref: "#/components/schemas/ReturnTerm" - xinput: - description: Additional input required from the customer to purchase / avail this item - allOf: - - $ref: "#/components/schemas/XInput" - time: - description: Temporal attributes of this item. This property is used when the item exists on the catalog only for a limited period of time. - allOf: - - $ref: "#/components/schemas/Time" - rateable: - description: Whether this item can be rated - type: boolean - rating: - description: The rating of the item - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - matched: - description: Whether this item is an exact match of the request - type: boolean - related: - description: Whether this item is a related item to the exactly matched item - type: boolean - recommended: - description: Whether this item is a recommended item to a response - type: boolean - ttl: - description: Time to live in seconds for an instance of this schema - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Location: - description: The physical location of something - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - map_url: - description: The url to the map of the location. This can be a globally recognized map url or the one specified by the network policy. - type: string - format: uri - gps: - description: The GPS co-ordinates of this location. - allOf: - - $ref: "#/components/schemas/Gps" - address: - description: The address of this location. - allOf: - - $ref: "#/components/schemas/Address" - city: - description: "The city this location is, or is located within" - allOf: - - $ref: "#/components/schemas/City" - district: - description: "The state this location is, or is located within" - type: string - state: - description: "The state this location is, or is located within" - allOf: - - $ref: "#/components/schemas/State" - country: - description: "The country this location is, or is located within" - allOf: - - $ref: "#/components/schemas/Country" - area_code: - type: string - circle: - $ref: "#/components/schemas/Circle" - polygon: - description: The boundary polygon of this location - type: string - 3dspace: - description: The three dimensional region describing this location - type: string - rating: - description: The rating of this location - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - MediaFile: - description: This object contains a url to a media file. - type: object - properties: - mimetype: - description: "indicates the nature and format of the document, file, or assortment of bytes. MIME types are defined and standardized in IETF's RFC 6838" - type: string - url: - description: The URL of the file - type: string - format: uri - signature: - description: The digital signature of the file signed by the sender - type: string - dsa: - description: The signing algorithm used by the sender - type: string - Offer: - description: An offer associated with a catalog. This is typically used to promote a particular product and enable more purchases. - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - location_ids: - type: array - items: - $ref: "#/components/schemas/Location/properties/id" - category_ids: - type: array - items: - $ref: "#/components/schemas/Category/properties/id" - item_ids: - type: array - items: - $ref: "#/components/schemas/Item/properties/id" - time: - $ref: "#/components/schemas/Time" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Option: - description: Describes a selectable option - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - Order: - description: Describes a legal purchase order. It contains the complete details of the legal contract created between the buyer and the seller. - type: object - properties: - id: - type: string - description: Human-readable ID of the order. This is generated at the BPP layer. The BPP can either generate order id within its system or forward the order ID created at the provider level. - ref_order_ids: - description: A list of order IDs to link this order to previous orders. - type: array - items: - type: string - description: ID of a previous order - status: - description: Status of the order. Allowed values can be defined by the network policy - type: string - enum: - - ACTIVE - - COMPLETE - - CANCELLED - type: - description: "This is used to indicate the type of order being created to BPPs. Sometimes orders can be linked to previous orders, like a replacement order in a retail domain. A follow-up consultation in healthcare domain. A single order part of a subscription order. The list of order types can be standardized at the network level." - type: string - default: DEFAULT - enum: - - DRAFT - - DEFAULT - provider: - description: Details of the provider whose catalog items have been selected. - allOf: - - $ref: "#/components/schemas/Provider" - items: - description: The items purchased / availed in this order - type: array - items: - $ref: "#/components/schemas/Item" - add_ons: - description: The add-ons purchased / availed in this order - type: array - items: - $ref: "#/components/schemas/AddOn" - offers: - description: The offers applied in this order - type: array - items: - $ref: "#/components/schemas/Offer" - billing: - description: The billing details of this order - allOf: - - $ref: "#/components/schemas/Billing" - fulfillments: - description: The fulfillments involved in completing this order - type: array - items: - $ref: "#/components/schemas/Fulfillment" - cancellation: - description: The cancellation details of this order - allOf: - - $ref: "#/components/schemas/Cancellation" - cancellation_terms: - description: Cancellation terms of this item - type: array - items: - $ref: "#/components/schemas/CancellationTerm" - refund_terms: - description: Refund terms of this item - type: array - items: - $ref: "#/components/schemas/Item/properties/refund_terms/items" - replacement_terms: - description: Replacement terms of this item - type: array - items: - $ref: "#/components/schemas/ReplacementTerm" - return_terms: - description: Return terms of this item - type: array - items: - $ref: "#/components/schemas/ReturnTerm" - quote: - description: The mutually agreed upon quotation for this order. - allOf: - - $ref: "#/components/schemas/Quotation" - payments: - description: The terms of settlement for this order - type: array - items: - $ref: "#/components/schemas/Payment" - created_at: - description: The date-time of creation of this order - type: string - format: date-time - updated_at: - description: The date-time of updated of this order - type: string - format: date-time - xinput: - description: Additional input required from the customer to confirm this order - allOf: - - $ref: "#/components/schemas/XInput" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Organization: - description: An organization. Usually a recognized business entity. - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - address: - description: The postal address of the organization - allOf: - - $ref: "#/components/schemas/Address" - state: - description: The state where the organization's address is registered - allOf: - - $ref: "#/components/schemas/State" - city: - description: The city where the the organization's address is registered - allOf: - - $ref: "#/components/schemas/City" - contact: - $ref: "#/components/schemas/Contact" - Payment: - description: "Describes the terms of settlement between the BAP and the BPP for a single transaction. When instantiated, this object contains
  1. the amount that has to be settled,
  2. The payment destination destination details
  3. When the settlement should happen, and
  4. A transaction reference ID
. During a transaction, the BPP reserves the right to decide the terms of payment. However, the BAP can send its terms to the BPP first. If the BPP does not agree to those terms, it must overwrite the terms and return them to the BAP. If overridden, the BAP must either agree to the terms sent by the BPP in order to preserve the provider's autonomy, or abort the transaction. In case of such disagreements, the BAP and the BPP can perform offline negotiations on the payment terms. Once an agreement is reached, the BAP and BPP can resume transactions." - type: object - properties: - id: - description: ID of the payment term that can be referred at an item or an order level in a catalog - type: string - collected_by: - description: "This field indicates who is the collector of payment. The BAP can set this value to 'bap' if it wants to collect the payment first and settle it to the BPP. If the BPP agrees to those terms, the BPP should not send the payment url. Alternatively, the BPP can set this field with the value 'bpp' if it wants the payment to be made directly." - url: - type: string - description: "A payment url to be called by the BAP. If empty, then the payment is to be done offline. The details of payment should be present in the params object. If tl_method = http/get, then the payment details will be sent as url params. Two url param values, ```$transaction_id``` and ```$amount``` are mandatory." - format: uri - params: - type: object - properties: - transaction_id: - type: string - description: The reference transaction ID associated with a payment activity - amount: - type: string - currency: - type: string - bank_code: - type: string - bank_account_number: - type: string - virtual_payment_address: - type: string - source_bank_code: - type: string - source_bank_account_number: - type: string - source_virtual_payment_address: - type: string - type: - type: string - enum: - - PRE-ORDER - - PRE-FULFILLMENT - - ON-FULFILLMENT - - POST-FULFILLMENT - status: - type: string - enum: - - PAID - - NOT-PAID - time: - $ref: "#/components/schemas/Time" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Person: - description: Describes a person as any individual - type: object - properties: - id: - type: string - description: Describes the identity of the person - url: - description: Profile url of the person - type: string - format: uri - name: - description: the name of the person - type: string - image: - $ref: "#/components/schemas/Image" - age: - description: Age of the person - allOf: - - $ref: "#/components/schemas/Duration" - dob: - description: Date of birth of the person - type: string - format: date - gender: - type: string - description: "Gender of something, typically a Person, but possibly also fictional characters, animals, etc. While Male and Female may be used, text strings are also acceptable for people who do not identify as a binary gender.Allowed values for this field can be published in the network policy" - creds: - type: array - items: - $ref: "#/components/schemas/Credential" - languages: - type: array - items: - description: Describes a language known to the person. - type: object - properties: - code: - type: string - name: - type: string - skills: - type: array - items: - description: Describes a skill of the person. - type: object - properties: - code: - type: string - name: - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Price: - description: Describes the price of a product or service - type: object - properties: - currency: - type: string - value: - $ref: "#/components/schemas/DecimalValue" - estimated_value: - $ref: "#/components/schemas/DecimalValue" - computed_value: - $ref: "#/components/schemas/DecimalValue" - listed_value: - $ref: "#/components/schemas/DecimalValue" - offered_value: - $ref: "#/components/schemas/DecimalValue" - minimum_value: - $ref: "#/components/schemas/DecimalValue" - maximum_value: - $ref: "#/components/schemas/DecimalValue" - Provider: - description: Describes the catalog of an entity, entitiy can be a scholarship facilitator, course provider etc - type: object - properties: - id: - type: string - description: Id of the provider - descriptor: - $ref: "#/components/schemas/Descriptor" - category_id: - type: string - description: Category Id of the provider at the BPP-level catalog - rating: - $ref: "#/components/schemas/Rating/properties/value" - time: - $ref: "#/components/schemas/Time" - categories: - type: array - items: - $ref: "#/components/schemas/Category" - fulfillments: - type: array - items: - $ref: "#/components/schemas/Fulfillment" - payments: - type: array - items: - $ref: "#/components/schemas/Payment" - locations: - type: array - items: - $ref: "#/components/schemas/Location" - offers: - type: array - items: - $ref: "#/components/schemas/Offer" - items: - type: array - items: - $ref: "#/components/schemas/Item" - exp: - type: string - description: Time after which catalog has to be refreshed - format: date-time - rateable: - description: Whether this provider can be rated or not - type: boolean - ttl: - description: "The time-to-live in seconds, for this object. This can be overriden at deeper levels. A value of -1 indicates that this object is not cacheable." - type: integer - minimum: -1 - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Quotation: - description: "Describes a quote. It is the estimated price of products or services from the BPP.
This has properties like price, breakup, ttl" - type: object - properties: - id: - description: ID of the quote. - type: string - format: uuid - price: - description: The total quoted price - allOf: - - $ref: "#/components/schemas/Price" - breakup: - description: the breakup of the total quoted price - type: array - items: - type: object - properties: - item: - $ref: "#/components/schemas/Item" - title: - type: string - price: - $ref: "#/components/schemas/Price" - ttl: - $ref: "#/components/schemas/Duration" - Rating: - description: Describes the rating of an entity - type: object - properties: - rating_category: - description: Category of the entity being rated - type: string - enum: - - Item - - Order - - Fulfillment - - Provider - - Agent - - Support - id: - description: Id of the object being rated - type: string - value: - description: "Rating value given to the object. This can be a single value or can also contain an inequality operator like gt, gte, lt, lte. This can also contain an inequality expression containing logical operators like && and ||." - - ReplacementTerm: - description: The replacement policy of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/State" - replace_within: - description: "Applicable only for buyer managed returns where the buyer has to replace the item before a certain date-time, failing which they will not be eligible for replacement" - allOf: - - $ref: "#/components/schemas/Time" - external_ref: - $ref: "#/components/schemas/MediaFile" - - ReturnTerm: - description: Describes the return policy of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term IETF''s applicable. - allOf: - - $ref: "#/components/schemas/State" - return_eligible: - description: Indicates whether the item is eligible for return - type: boolean - return_time: - description: "Applicable only for buyer managed returns where the buyer has to return the item to the origin before a certain date-time, failing which they will not be eligible for refund." - allOf: - - $ref: "#/components/schemas/Time" - return_location: - description: The location where the item or order must / will be returned to - allOf: - - $ref: "#/components/schemas/Location" - fulfillment_managed_by: - description: The entity that will perform the return - type: string - enum: - - CONSUMER - - PROVIDER - Scalar: - description: Describes a scalar - type: object - properties: - type: - type: string - enum: - - CONSTANT - - VARIABLE - value: - $ref: "#/components/schemas/DecimalValue" - estimated_value: - $ref: "#/components/schemas/DecimalValue" - computed_value: - $ref: "#/components/schemas/DecimalValue" - range: - type: object - properties: - min: - $ref: "#/components/schemas/DecimalValue" - max: - $ref: "#/components/schemas/DecimalValue" - unit: - type: string - Schedule: - description: "Describes schedule as a repeating time period used to describe a regularly recurring event. At a minimum a schedule will specify frequency which describes the interval between occurrences of the event. Additional information can be provided to specify the schedule more precisely. This includes identifying the timestamps(s) of when the event will take place. Schedules may also have holidays to exclude a specific day from the schedule.
This has properties like frequency, holidays, times" - type: object - properties: - frequency: - $ref: "#/components/schemas/Duration" - holidays: - type: array - items: - type: string - format: date-time - times: - type: array - items: - type: string - format: date-time - State: - description: A bounded geopolitical region of governance inside a country. - type: object - properties: - name: - type: string - description: Name of the state - code: - type: string - description: State code as per country or international standards - Stop: - description: A logical point in space and time during the fulfillment of an order. - type: object - properties: - id: - type: string - parent_stop_id: - type: string - location: - description: Location of the stop - allOf: - - $ref: "#/components/schemas/Location" - type: - description: The type of stop. Allowed values of this property can be defined by the network policy. - type: string - time: - description: Timings applicable at the stop. - allOf: - - $ref: "#/components/schemas/Time" - instructions: - description: Instructions that need to be followed at the stop - allOf: - - $ref: "#/components/schemas/Descriptor" - contact: - description: Contact details of the stop - allOf: - - $ref: "#/components/schemas/Contact" - person: - description: The details of the person present at the stop - allOf: - - $ref: "#/components/schemas/Person" - authorization: - $ref: "#/components/schemas/Authorization" - Support: - description: Details of customer support - type: object - properties: - ref_id: - type: string - callback_phone: - type: string - format: phone - phone: - type: string - format: phone - email: - type: string - format: email - url: - type: string - format: uri - Tag: - description: "Describes a tag. This is used to contain extended metadata. This object can be added as a property to any schema to describe extended attributes. For BAPs, tags can be sent during search to optimize and filter search results. BPPs can use tags to index their catalog to allow better search functionality. Tags are sent by the BPP as part of the catalog response in the `on_search` callback. Tags are also meant for display purposes. Upon receiving a tag, BAPs are meant to render them as name-value pairs. This is particularly useful when rendering tabular information about a product or service." - type: object - properties: - descriptor: - description: "Description of the Tag, can be used to store detailed information." - allOf: - - $ref: "#/components/schemas/Descriptor" - value: - description: The value of the tag. This set by the BPP and rendered as-is by the BAP. - type: string - display: - description: "This value indicates if the tag is intended for display purposes. If set to `true`, then this tag must be displayed. If it is set to `false`, it should not be displayed. This value can override the group display value." - type: boolean - TagGroup: - description: "A collection of tag objects with group level attributes. For detailed documentation on the Tags and Tag Groups schema go to https://github.com/beckn/protocol-specifications/discussions/316" - type: object - properties: - display: - description: "Indicates the display properties of the tag group. If display is set to false, then the group will not be displayed. If it is set to true, it should be displayed. However, group-level display properties can be overriden by individual tag-level display property. As this schema is purely for catalog display purposes, it is not recommended to send this value during search." - type: boolean - default: true - descriptor: - description: "Description of the TagGroup, can be used to store detailed information." - allOf: - - $ref: "#/components/schemas/Descriptor" - list: - description: "An array of Tag objects listed under this group. This property can be set by BAPs during search to narrow the `search` and achieve more relevant results. When received during `on_search`, BAPs must render this list under the heading described by the `name` property of this schema." - type: array - items: - $ref: "#/components/schemas/Tag" - Time: - description: Describes time in its various forms. It can be a single point in time; duration; or a structured timetable of operations - type: object - properties: - label: - type: string - timestamp: - type: string - format: date-time - duration: - $ref: "#/components/schemas/Duration" - range: - type: object - properties: - start: - type: string - format: date-time - end: - type: string - format: date-time - days: - type: string - description: comma separated values representing days of the week - schedule: - $ref: "#/components/schemas/Schedule" - Tracking: - description: Describes a tracking object. it can be used to track the status of a service, i.e, a scholarship application, a course etc. - type: object - properties: - id: - description: A unique tracking reference number - type: string - url: - description: "A URL to the tracking endpoint. This can be a link to a tracking webpage, a webhook URL created by the BAP where BPP can push the tracking data, or a GET url creaed by the BPP which the BAP can poll to get the tracking data. It can also be a websocket URL where the BPP can push real-time tracking data." - type: string - format: uri - location: - description: "In case there is no real-time tracking endpoint available, this field will contain the latest location of the entity being tracked. The BPP will update this value everytime the BAP calls the track API." - allOf: - - $ref: "#/components/schemas/Location" - status: - description: "This value indicates if the tracking is currently active or not. If this value is `active`, then the BAP can begin tracking the order. If this value is `inactive`, the tracking URL is considered to be expired and the BAP should stop tracking the order." - type: string - enum: - - active - - inactive - Vehicle: - description: "Describes a vehicle is a device that is designed or used to transport people or cargo over land, water, air, or through space.
This has properties like category, capacity, make, model, size,variant,color,energy_type,registration" - type: object - properties: - category: - type: string - capacity: - type: integer - make: - type: string - model: - type: string - size: - type: string - variant: - type: string - color: - type: string - energy_type: - type: string - registration: - type: string - wheels_count: - type: string - cargo_volumne: - type: string - wheelchair_access: - type: string - code: - type: string - emission_standard: - type: string - XInput: - description: "Contains any additional or extended inputs required for the order. This is typically a Form Input. Sometimes, selection of catalog elements is not enough for the BPP to confirm an order. For example, A scholarship application may require additional details on the applicant as a proof of eligibility. For all such purposes, the BPP can choose to send this object attached to any object in the catalog that is required to be sent while placing the order. This object can typically be sent at an item level or at the order level. The item level XInput will override the Order level XInput as it indicates a special requirement of information for that particular item. Hence the BAP must render a separate form for the Item and another form at the Order level before confirmation." - type: object - properties: - form: - $ref: "#/components/schemas/Form" - required: - description: Indicates whether the form data is mandatorily required by the BPP to confirm the order. - type: boolean diff --git a/layer2/samples/mobility_1.1.0.archived.yaml b/layer2/samples/mobility_1.1.0.archived.yaml deleted file mode 100644 index b3ae63c..0000000 --- a/layer2/samples/mobility_1.1.0.archived.yaml +++ /dev/null @@ -1,2164 +0,0 @@ -openapi: 3.0.0 -info: - title: Beckn Protocol Core - description: retail layer 2 config from core yaml - version: 1.1.0 -security: - - SubscriberAuth: [] -paths: - /search: - post: - tags: - - Beckn Provider Platform (BPP) - - Beckn Gateway (BG) - description: BAP declares the customer's intent to buy/avail products or services - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - search - message: - type: object - properties: - intent: - $ref: "#/components/schemas/Intent" - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /select: - post: - tags: - - Beckn Provider Platform (BPP) - description: BAP declares the customer's cart (or equivalent) created by selecting objects from the catalog - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - select - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /init: - post: - tags: - - Beckn Provider Platform (BPP) - description: Initialize an order by providing billing and/or shipping details - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - init - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - allOf: - - $ref: "#/components/schemas/Ack" - - properties: - status: - enum: - - ACK - - NACK - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /confirm: - post: - tags: - - Beckn Provider Platform (BPP) - description: Initialize an order by providing billing and/or shipping details - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - confirm - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /status: - post: - tags: - - Beckn Provider Platform (BPP) - description: Fetch the latest order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - status - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - required: - - order_id - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /track: - post: - tags: - - Beckn Provider Platform (BPP) - description: Track an active order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - track - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - callback_url: - type: string - format: uri - required: - - order_id - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /cancel: - post: - tags: - - Beckn Provider Platform (BPP) - description: Cancel an order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - cancel - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - cancellation_reason_id: - $ref: "#/components/schemas/Option/properties/id" - descriptor: - $ref: "#/components/schemas/Descriptor" - required: - - order_id - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /update: - post: - tags: - - Beckn Provider Platform (BPP) - description: Remove object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - update - required: - - action - message: - type: object - properties: - update_target: - description: 'Comma separated values of order objects being updated. For example: ```"update_target":"item,billing,fulfillment"```' - type: string - order: - description: Updated order object - allOf: - - $ref: "#/components/schemas/Order" - required: - - update_target - - order - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /rating: - post: - tags: - - Beckn Provider Platform (BPP) - description: Provide feedback on a service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - rating - required: - - action - message: - type: object - properties: - ratings: - type: array - items: - $ref: "#/components/schemas/Rating" - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /support: - post: - tags: - - Beckn Provider Platform (BPP) - description: Contact support - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - support - required: - - action - message: - type: object - properties: - support: - $ref: "#/components/schemas/Support" - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_search: - post: - tags: - - Beckn Application Platform (BAP) - - Beckn Gateway (BG) - description: BPP sends its catalog in response to a search request. - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_search - required: - - action - message: - type: object - properties: - catalog: - $ref: "#/components/schemas/Catalog" - required: - - catalog - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_select: - post: - tags: - - Beckn Application Platform (BAP) - description: Send draft order object with quoted price for selected items - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_select - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_init: - post: - tags: - - Beckn Application Platform (BAP) - description: Send order object with payment details updated - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_init - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_confirm: - post: - tags: - - Beckn Application Platform (BAP) - description: Send active order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_confirm - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_track: - post: - tags: - - Beckn Application Platform (BAP) - description: Send tracking details of an active order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_track - required: - - action - message: - type: object - properties: - tracking: - $ref: "#/components/schemas/Tracking" - required: - - tracking - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_cancel: - post: - tags: - - Beckn Application Platform (BAP) - description: Send cancellation request_id with reasons list in case of cancellation request. Else send cancelled order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_cancel - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_update: - post: - tags: - - Beckn Application Platform (BAP) - description: Returns updated service with updated runtime object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_update - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_status: - post: - tags: - - Beckn Application Platform (BAP) - description: Fetch the status of a Service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_status - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_rating: - post: - tags: - - Beckn Application Platform (BAP) - description: Provide feedback on a service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_rating - required: - - action - message: - type: object - properties: - feedback_form: - description: A feedback form to allow the user to provide additional information on the rating provided - allOf: - - $ref: "#/components/schemas/XInput" - error: - $ref: "#/components/schemas/Error" - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_support: - post: - tags: - - Beckn Application Platform (BAP) - description: Contact Support - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_support - required: - - action - message: - type: object - properties: - support: - $ref: "#/components/schemas/Support" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" -components: - securitySchemes: - SubscriberAuth: - type: apiKey - in: header - name: Authorization - description: 'Signature of message body using BAP or BPP subscriber''s signing public key.

Format:

Authorization : Signature keyId="{subscriber_id}|{unique_key_id}|{algorithm}",algorithm="ed25519",created="1606970629",expires="1607030629",headers="(created) (expires) digest",signature="Base64(signing string)"' - schemas: - Ack: - description: "Describes the acknowledgement sent in response to an API call. If the implementation uses HTTP/S, then Ack must be returned in the same session. Every API call to a BPP must be responded to with an Ack whether the BPP intends to respond with a callback or not. This has one property called `status` that indicates the status of the Acknowledgement." - type: object - properties: - status: - type: string - description: "The status of the acknowledgement. If the request passes the validation criteria of the BPP, then this is set to ACK. If a BPP responds with status = `ACK` to a request, it is required to respond with a callback. If the request fails the validation criteria, then this is set to NACK. Additionally, if a BPP does not intend to respond with a callback even after the request meets the validation criteria, it should set this value to `NACK`." - enum: - - ACK - - NACK - tags: - description: A list of tags containing any additional information sent along with the Acknowledgement. - type: array - items: - $ref: "#/components/schemas/TagGroup" - AddOn: - description: Describes an additional item offered as a value-addition to a product or service. This does not exist independently in a catalog and is always associated with an item. - type: object - properties: - id: - description: Provider-defined ID of the add-on - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - price: - $ref: "#/components/schemas/Price" - Address: - description: Describes a postal address. - type: string - Agent: - description: "Describes the direct performer, driver or executor that fulfills an order. It is usually a person. But in some rare cases, it could be a non-living entity like a drone, or a bot. Some examples of agents are Doctor in the healthcare sector, a driver in the mobility sector, or a delivery person in the logistics sector. This object can be set at any stage of the order lifecycle. This can be set at the discovery stage when the BPP wants to provide details on the agent fulfilling the order, like in healthcare, where the doctor's name appears during search. This object can also used to search for a particular person that the customer wants fulfilling an order. Sometimes, this object gets instantiated after the order is confirmed, like in the case of on-demand taxis, where the driver is assigned after the user confirms the ride." - properties: - person: - $ref: "#/components/schemas/Person" - contact: - $ref: "#/components/schemas/Contact" - organization: - $ref: "#/components/schemas/Organization" - rating: - $ref: "#/components/schemas/Rating/properties/value" - Authorization: - description: "Describes an authorization mechanism used to start or end the fulfillment of an order. For example, in the mobility sector, the driver may require a one-time password to initiate the ride. In the healthcare sector, a patient may need to provide a password to open a video conference link during a teleconsultation." - type: object - properties: - type: - description: Type of authorization mechanism used. The allowed values for this field can be published as part of the network policy. - type: string - token: - description: "Token used for authorization. This is typically generated at the BPP. The BAP can send this value to the user via any channel that it uses to authenticate the user like SMS, Email, Push notification, or in-app rendering." - type: string - valid_from: - description: Timestamp in RFC3339 format from which token is valid - type: string - format: date-time - valid_to: - description: Timestamp in RFC3339 format until which token is valid - type: string - format: date-time - status: - description: Status of the token - type: string - Billing: - description: "Describes the billing details of an entity.
This has properties like name,organization,address,email,phone,time,tax_number, created_at,updated_at" - type: object - properties: - name: - description: Name of the billable entity - type: string - organization: - description: Details of the organization being billed. - allOf: - - $ref: "#/components/schemas/Organization" - address: - description: The address of the billable entity - allOf: - - $ref: "#/components/schemas/Address" - state: - description: The state where the billable entity resides. This is important for state-level tax calculation - allOf: - - $ref: "#/components/schemas/State" - city: - description: The city where the billable entity resides. - allOf: - - $ref: "#/components/schemas/City" - email: - description: Email address where the bill is sent to - type: string - format: email - phone: - description: Phone number of the billable entity - type: string - time: - description: Details regarding the billing period - allOf: - - $ref: "#/components/schemas/Time" - tax_id: - description: ID of the billable entity as recognized by the taxation authority - type: string - Cancellation: - description: Describes a cancellation event - type: object - properties: - time: - description: Date-time when the order was cancelled by the buyer - type: string - format: date-time - cancelled_by: - type: string - enum: - - CONSUMER - - PROVIDER - reason: - description: The reason for cancellation - allOf: - - $ref: "#/components/schemas/Option" - additional_description: - description: Any additional information regarding the nature of cancellation - allOf: - - $ref: "#/components/schemas/Descriptor" - CancellationTerm: - description: Describes the cancellation terms of an item or an order. This can be referenced at an item or order level. Item-level cancellation terms can override the terms at the order level. - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/FulfillmentState" - reason_required: - description: Indicates whether a reason is required to cancel the order - type: boolean - cancel_by: - description: Information related to the time of cancellation. - allOf: - - $ref: "#/components/schemas/Time" - cancellation_fee: - $ref: "#/components/schemas/Fee" - xinput: - $ref: "#/components/schemas/XInput" - external_ref: - $ref: "#/components/schemas/MediaFile" - Catalog: - description: "Describes the products or services offered by a BPP. This is typically sent as the response to a search intent from a BAP. The payment terms, offers and terms of fulfillment supported by the BPP can also be included here. The BPP can show hierarchical nature of products/services in its catalog using the parent_category_id in categories. The BPP can also send a ttl (time to live) in the context which is the duration for which a BAP can cache the catalog and use the cached catalog.
This has properties like bbp/descriptor,bbp/categories,bbp/fulfillments,bbp/payments,bbp/offers,bbp/providers and exp
This is used in the following situations.
  • This is typically used in the discovery stage when the BPP sends the details of the products and services it offers as response to a search intent from the BAP.
" - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - fulfillments: - description: Fulfillment modes offered at the BPP level. This is used when a BPP itself offers fulfillments on behalf of the providers it has onboarded. - type: array - items: - $ref: "#/components/schemas/Fulfillment" - payments: - description: Payment terms offered by the BPP for all transactions. This can be overriden at the provider level. - type: array - items: - $ref: "#/components/schemas/Payment" - offers: - description: Offers at the BPP-level. This is common across all providers onboarded by the BPP. - type: array - items: - $ref: "#/components/schemas/Offer" - providers: - type: array - items: - $ref: "#/components/schemas/Provider" - exp: - description: Timestamp after which catalog will expire - type: string - format: date-time - ttl: - description: Duration in seconds after which this catalog will expire - type: string - Category: - description: A label under which a collection of items can be grouped. - type: object - properties: - id: - description: ID of the category - type: string - parent_category_id: - $ref: "#/components/schemas/Category/properties/id" - descriptor: - $ref: "#/components/schemas/Descriptor" - time: - $ref: "#/components/schemas/Time" - ttl: - description: Time to live for an instance of this schema - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Circle: - description: Describes a circular region of a specified radius centered at a specified GPS coordinate. - type: object - properties: - gps: - $ref: "#/components/schemas/Gps" - radius: - $ref: "#/components/schemas/Scalar" - City: - description: Describes a city - type: object - properties: - name: - description: Name of the city - type: string - code: - description: City code - type: string - Contact: - description: Describes the contact information of an entity - type: object - properties: - phone: - type: string - email: - type: string - jcard: - type: object - description: A Jcard object as per draft-ietf-jcardcal-jcard-03 specification - Context: - description: "Every API call in beckn protocol has a context. It provides a high-level overview to the receiver about the nature of the intended transaction. Typically, it is the BAP that sets the transaction context based on the consumer's location and action on their UI. But sometimes, during unsolicited callbacks, the BPP also sets the transaction context but it is usually the same as the context of a previous full-cycle, request-callback interaction between the BAP and the BPP. The context object contains four types of fields.
  1. Demographic information about the transaction using fields like `domain`, `country`, and `region`.
  2. Addressing details like the sending and receiving platform's ID and API URL.
  3. Interoperability information like the protocol version that implemented by the sender and,
  4. Transaction details like the method being called at the receiver's endpoint, the transaction_id that represents an end-to-end user session at the BAP, a message ID to pair requests with callbacks, a timestamp to capture sending times, a ttl to specifiy the validity of the request, and a key to encrypt information if necessary.
This object must be passed in every interaction between a BAP and a BPP. In HTTP/S implementations, it is not necessary to send the context during the synchronous response. However, in asynchronous protocols, the context must be sent during all interactions," - type: object - properties: - domain: - description: Domain code that is relevant to this transaction context - allOf: - - $ref: "#/components/schemas/Domain/properties/code" - location: - description: The location where the transaction is intended to be fulfilled. - allOf: - - $ref: "#/components/schemas/Location" - action: - description: The Beckn protocol method being called by the sender and executed at the receiver. - type: string - version: - type: string - description: Version of transaction protocol being used by the sender. - bap_id: - description: Subscriber ID of the BAP - allOf: - - description: "A globally unique identifier of the platform, Typically it is the fully qualified domain name (FQDN) of the platform." - type: string - bap_uri: - description: Subscriber URL of the BAP for accepting callbacks from BPPs. - allOf: - - description: The callback URL of the Subscriber. This should necessarily contain the same domain name as set in `subscriber_id``. - type: string - format: uri - bpp_id: - description: Subscriber ID of the BPP - allOf: - - $ref: "#/components/schemas/Context/properties/bap_id/allOf/0" - bpp_uri: - description: Subscriber URL of the BPP for accepting calls from BAPs. - allOf: - - $ref: "#/components/schemas/Context/properties/bap_uri/allOf/0" - transaction_id: - description: "This is a unique value which persists across all API calls from `search` through `confirm`. This is done to indicate an active user session across multiple requests. The BPPs can use this value to push personalized recommendations, and dynamic offerings related to an ongoing transaction despite being unaware of the user active on the BAP." - type: string - format: uuid - message_id: - description: "This is a unique value which persists during a request / callback cycle. Since beckn protocol APIs are asynchronous, BAPs need a common value to match an incoming callback from a BPP to an earlier call. This value can also be used to ignore duplicate messages coming from the BPP. It is recommended to generate a fresh message_id for every new interaction. When sending unsolicited callbacks, BPPs must generate a new message_id." - type: string - format: uuid - timestamp: - description: Time of request generation in RFC3339 format - type: string - format: date-time - key: - description: The encryption public key of the sender - type: string - ttl: - description: The duration in ISO8601 format after timestamp for which this message holds valid - type: string - Country: - description: Describes a country - type: object - properties: - name: - type: string - description: Name of the country - code: - type: string - description: Country code as per ISO 3166-1 and ISO 3166-2 format - Credential: - description: Describes a credential of an entity - Person or Organization - type: object - properties: - id: - type: string - type: - type: string - default: VerifiableCredential - url: - description: URL of the credential - type: string - format: uri - Customer: - description: Describes a customer buying/availing a product or a service - type: object - properties: - person: - $ref: "#/components/schemas/Person" - contact: - $ref: "#/components/schemas/Contact" - DecimalValue: - description: Describes a numerical value in decimal form - type: string - pattern: "[+-]?([0-9]*[.])?[0-9]+" - Descriptor: - description: Physical description of something. - type: object - properties: - name: - type: string - code: - type: string - short_desc: - type: string - long_desc: - type: string - additional_desc: - type: object - properties: - url: - type: string - content_type: - type: string - enum: - - text/plain - - text/html - - application/json - media: - type: array - items: - $ref: "#/components/schemas/MediaFile" - images: - type: array - items: - $ref: "#/components/schemas/Image" - Domain: - description: "Described the industry sector or sub-sector. The network policy should contain codes for all the industry sectors supported by the network. Domains can be created in varying levels of granularity. The granularity of a domain can be decided by the participants of the network. Too broad domains will result in irrelevant search broadcast calls to BPPs that don't have services supporting the domain. Too narrow domains will result in a large number of registry entries for each BPP. It is recommended that network facilitators actively collaborate with various working groups and network participants to carefully choose domain codes keeping in mind relevance, performance, and opportunity cost. It is recommended that networks choose broad domains like mobility, logistics, healthcare etc, and progressively granularize them as and when the number of network participants for each domain grows large." - type: object - properties: - name: - description: Name of the domain - type: string - code: - description: "Standard code representing the domain. The standard is usually published as part of the network policy. Furthermore, the network facilitator should also provide a mechanism to provide the supported domains of a network." - additional_info: - description: A url that contains addtional information about that domain. - allOf: - - $ref: "#/components/schemas/MediaFile" - Duration: - description: Describes duration as per ISO8601 format - type: string - Error: - description: "Describes an error object that is returned by a BAP, BPP or BG as a response or callback to an action by another network participant. This object is sent when any request received by a network participant is unacceptable. This object can be sent either during Ack or with the callback." - type: object - properties: - code: - type: string - description: 'Standard error code. For full list of error codes, refer to docs/protocol-drafts/BECKN-005-ERROR-CODES-DRAFT-01.md of this repo"' - paths: - type: string - description: Path to json schema generating the error. Used only during json schema validation errors - message: - type: string - description: Human readable message describing the error. Used mainly for logging. Not recommended to be shown to the user. - Fee: - description: A fee applied on a particular entity - type: object - properties: - percentage: - description: Percentage of a value - allOf: - - $ref: "#/components/schemas/DecimalValue" - amount: - description: A fixed value - allOf: - - $ref: "#/components/schemas/Price" - Form: - description: Describes a form - type: object - properties: - url: - description: "The URL from where the form can be fetched. The content fetched from the url must be processed as per the mime_type specified in this object. Once fetched, the rendering platform can choosed to render the form as-is as an embeddable element; or process it further to blend with the theme of the application. In case the interface is non-visual, the the render can process the form data and reproduce it as per the standard specified in the form." - type: string - format: uri - data: - description: The form submission data - type: object - additionalProperties: - type: string - mime_type: - description: This field indicates the nature and format of the form received by querying the url. MIME types are defined and standardized in IETF's RFC 6838. - type: string - enum: - - text/html - - application/xml - submission_id: - type: string - format: uuid - Fulfillment: - description: Describes how a an order will be rendered/fulfilled to the end-customer - type: object - properties: - id: - description: Unique reference ID to the fulfillment of an order - type: string - type: - description: "A code that describes the mode of fulfillment. This is typically set when there are multiple ways an order can be fulfilled. For example, a retail order can be fulfilled either via store pickup or a home delivery. Similarly, a medical consultation can be provided either in-person or via tele-consultation. The network policy must publish standard fulfillment type codes for the different modes of fulfillment." - type: string - rateable: - description: Whether the fulfillment can be rated or not - type: boolean - rating: - description: The rating value of the fulfullment service. - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - state: - description: The current state of fulfillment. The BPP must set this value whenever the state of the order fulfillment changes and fire an unsolicited `on_status` call. - allOf: - - $ref: "#/components/schemas/FulfillmentState" - tracking: - type: boolean - description: Indicates whether the fulfillment allows tracking - default: false - customer: - description: The person that will ultimately receive the order - allOf: - - $ref: "#/components/schemas/Customer" - agent: - description: The agent that is currently handling the fulfillment of the order - allOf: - - $ref: "#/components/schemas/Agent" - contact: - $ref: "#/components/schemas/Contact" - vehicle: - $ref: "#/components/schemas/Vehicle" - stops: - description: The list of logical stops encountered during the fulfillment of an order. - type: array - items: - $ref: "#/components/schemas/Stop" - path: - description: The physical path taken by the agent that can be rendered on a map. The allowed format of this property can be set by the network. - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - FulfillmentState: - description: Describes the state of fulfillment - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - updated_at: - type: string - format: date-time - updated_by: - type: string - description: ID of entity which changed the state - Gps: - description: Describes a GPS coordinate - type: string - pattern: '^[-+]?([1-8]?\d(\.\d+)?|90(\.0+)?),\s*[-+]?(180(\.0+)?|((1[0-7]\d)|([1-9]?\d))(\.\d+)?)$' - Image: - description: Describes an image - type: object - properties: - url: - description: URL to the image. This can be a data url or an remote url - type: string - format: uri - size_type: - description: The size of the image. The network policy can define the default dimensions of each type - type: string - enum: - - xs - - sm - - md - - lg - - xl - - custom - width: - description: Width of the image in pixels - type: string - height: - description: Height of the image in pixels - type: string - Intent: - description: "The intent to buy or avail a product or a service. The BAP can declare the intent of the consumer containing
  • What they want (A product, service, offer)
  • Who they want (A seller, service provider, agent etc)
  • Where they want it and where they want it from
  • When they want it (start and end time of fulfillment
  • How they want to pay for it

This has properties like descriptor,provider,fulfillment,payment,category,offer,item,tags
This is typically used by the BAP to send the purpose of the user's search to the BPP. This will be used by the BPP to find products or services it offers that may match the user's intent.
For example, in Mobility, the mobility consumer declares a mobility intent. In this case, the mobility consumer declares information that describes various aspects of their journey like,
  • Where would they like to begin their journey (intent.fulfillment.start.location)
  • Where would they like to end their journey (intent.fulfillment.end.location)
  • When would they like to begin their journey (intent.fulfillment.start.time)
  • When would they like to end their journey (intent.fulfillment.end.time)
  • Who is the transport service provider they would like to avail services from (intent.provider)
  • Who is traveling (This is not recommended in public networks) (intent.fulfillment.customer)
  • What kind of fare product would they like to purchase (intent.item)
  • What add-on services would they like to avail
  • What offers would they like to apply on their booking (intent.offer)
  • What category of services would they like to avail (intent.category)
  • What additional luggage are they carrying
  • How would they like to pay for their journey (intent.payment)

For example, in health domain, a consumer declares the intent for a lab booking the describes various aspects of their booking like,
  • Where would they like to get their scan/test done (intent.fulfillment.start.location)
  • When would they like to get their scan/test done (intent.fulfillment.start.time)
  • When would they like to get the results of their test/scan (intent.fulfillment.end.time)
  • Who is the service provider they would like to avail services from (intent.provider)
  • Who is getting the test/scan (intent.fulfillment.customer)
  • What kind of test/scan would they like to purchase (intent.item)
  • What category of services would they like to avail (intent.category)
  • How would they like to pay for their journey (intent.payment)
" - type: object - properties: - descriptor: - description: "A raw description of the search intent. Free text search strings, raw audio, etc can be sent in this object." - allOf: - - $ref: "#/components/schemas/Descriptor" - provider: - description: The provider from which the customer wants to place to the order from - allOf: - - $ref: "#/components/schemas/Provider" - fulfillment: - description: Details on how the customer wants their order fulfilled - allOf: - - $ref: "#/components/schemas/Fulfillment" - payment: - description: Details on how the customer wants to pay for the order - allOf: - - $ref: "#/components/schemas/Payment" - category: - description: Details on the item category - allOf: - - $ref: "#/components/schemas/Category" - offer: - description: details on the offer the customer wants to avail - allOf: - - $ref: "#/components/schemas/Offer" - item: - description: Details of the item that the consumer wants to order - allOf: - - $ref: "#/components/schemas/Item" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - ItemQuantity: - description: Describes the count or amount of an item - type: object - properties: - allocated: - description: This represents the exact quantity allocated for purchase of the item. - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - available: - description: This represents the exact quantity available for purchase of the item. The buyer can only purchase multiples of this - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - maximum: - description: This represents the maximum quantity allowed for purchase of the item - type: object - properties: - count: - type: integer - minimum: 1 - measure: - $ref: "#/components/schemas/Scalar" - minimum: - description: This represents the minimum quantity allowed for purchase of the item - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - selected: - description: This represents the quantity selected for purchase of the item - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - unitized: - description: This represents the quantity available in a single unit of the item - type: object - properties: - count: - type: integer - minimum: 1 - maximum: 1 - measure: - $ref: "#/components/schemas/Scalar" - Item: - description: "Describes a product or a service offered to the end consumer by the provider. In the mobility sector, it can represent a fare product like one way journey. In the logistics sector, it can represent the delivery service offering. In the retail domain it can represent a product like a grocery item." - type: object - properties: - id: - description: ID of the item. - type: string - parent_item_id: - description: "ID of the item, this item is a variant of" - allOf: - - $ref: "#/components/schemas/Item/properties/id" - parent_item_quantity: - description: The number of units of the parent item this item is a multiple of - allOf: - - $ref: "#/components/schemas/ItemQuantity" - descriptor: - description: Physical description of the item - allOf: - - $ref: "#/components/schemas/Descriptor" - creator: - description: The creator of this item - allOf: - - $ref: "#/components/schemas/Organization" - price: - description: "The price of this item, if it has intrinsic value" - allOf: - - $ref: "#/components/schemas/Price" - quantity: - description: The selling quantity of the item - allOf: - - $ref: "#/components/schemas/ItemQuantity" - category_ids: - description: Categories this item can be listed under - type: array - items: - allOf: - - $ref: "#/components/schemas/Category/properties/id" - fulfillment_ids: - description: Modes through which this item can be fulfilled - type: array - items: - allOf: - - $ref: "#/components/schemas/Fulfillment/properties/id" - location_ids: - description: Provider Locations this item is available in - type: array - items: - allOf: - - $ref: "#/components/schemas/Location/properties/id" - payment_ids: - description: Payment modalities through which this item can be ordered - type: array - items: - allOf: - - $ref: "#/components/schemas/Payment/properties/id" - add_ons: - type: array - items: - $ref: "#/components/schemas/AddOn" - cancellation_terms: - description: Cancellation terms of this item - type: array - items: - $ref: "#/components/schemas/CancellationTerm" - refund_terms: - description: Refund terms of this item - type: array - items: - description: Refund term of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/State" - refund_eligible: - description: Indicates if cancellation will result in a refund - type: boolean - refund_within: - description: Time within which refund will be processed after successful cancellation. - allOf: - - $ref: "#/components/schemas/Time" - refund_amount: - $ref: "#/components/schemas/Price" - replacement_terms: - description: Terms that are applicable be met when this item is replaced - type: array - items: - $ref: "#/components/schemas/ReplacementTerm" - return_terms: - description: Terms that are applicable when this item is returned - type: array - items: - $ref: "#/components/schemas/ReturnTerm" - xinput: - description: Additional input required from the customer to purchase / avail this item - allOf: - - $ref: "#/components/schemas/XInput" - time: - description: Temporal attributes of this item. This property is used when the item exists on the catalog only for a limited period of time. - allOf: - - $ref: "#/components/schemas/Time" - rateable: - description: Whether this item can be rated - type: boolean - rating: - description: The rating of the item - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - matched: - description: Whether this item is an exact match of the request - type: boolean - related: - description: Whether this item is a related item to the exactly matched item - type: boolean - recommended: - description: Whether this item is a recommended item to a response - type: boolean - ttl: - description: Time to live in seconds for an instance of this schema - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Location: - description: The physical location of something - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - map_url: - description: The url to the map of the location. This can be a globally recognized map url or the one specified by the network policy. - type: string - format: uri - gps: - description: The GPS co-ordinates of this location. - allOf: - - $ref: "#/components/schemas/Gps" - address: - description: The address of this location. - allOf: - - $ref: "#/components/schemas/Address" - city: - description: "The city this location is, or is located within" - allOf: - - $ref: "#/components/schemas/City" - district: - description: "The state this location is, or is located within" - type: string - state: - description: "The state this location is, or is located within" - allOf: - - $ref: "#/components/schemas/State" - country: - description: "The country this location is, or is located within" - allOf: - - $ref: "#/components/schemas/Country" - area_code: - type: string - circle: - $ref: "#/components/schemas/Circle" - polygon: - description: The boundary polygon of this location - type: string - 3dspace: - description: The three dimensional region describing this location - type: string - rating: - description: The rating of this location - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - MediaFile: - description: This object contains a url to a media file. - type: object - properties: - mimetype: - description: "indicates the nature and format of the document, file, or assortment of bytes. MIME types are defined and standardized in IETF's RFC 6838" - type: string - url: - description: The URL of the file - type: string - format: uri - signature: - description: The digital signature of the file signed by the sender - type: string - dsa: - description: The signing algorithm used by the sender - type: string - Offer: - description: An offer associated with a catalog. This is typically used to promote a particular product and enable more purchases. - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - location_ids: - type: array - items: - $ref: "#/components/schemas/Location/properties/id" - category_ids: - type: array - items: - $ref: "#/components/schemas/Category/properties/id" - item_ids: - type: array - items: - $ref: "#/components/schemas/Item/properties/id" - time: - $ref: "#/components/schemas/Time" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Option: - description: Describes a selectable option - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - Order: - description: Describes a legal purchase order. It contains the complete details of the legal contract created between the buyer and the seller. - type: object - properties: - id: - type: string - description: Human-readable ID of the order. This is generated at the BPP layer. The BPP can either generate order id within its system or forward the order ID created at the provider level. - ref_order_ids: - description: A list of order IDs to link this order to previous orders. - type: array - items: - type: string - description: ID of a previous order - status: - description: Status of the order. Allowed values can be defined by the network policy - type: string - enum: - - ACTIVE - - COMPLETE - - CANCELLED - type: - description: "This is used to indicate the type of order being created to BPPs. Sometimes orders can be linked to previous orders, like a replacement order in a retail domain. A follow-up consultation in healthcare domain. A single order part of a subscription order. The list of order types can be standardized at the network level." - type: string - default: DEFAULT - enum: - - DRAFT - - DEFAULT - provider: - description: Details of the provider whose catalog items have been selected. - allOf: - - $ref: "#/components/schemas/Provider" - items: - description: The items purchased / availed in this order - type: array - items: - $ref: "#/components/schemas/Item" - add_ons: - description: The add-ons purchased / availed in this order - type: array - items: - $ref: "#/components/schemas/AddOn" - offers: - description: The offers applied in this order - type: array - items: - $ref: "#/components/schemas/Offer" - billing: - description: The billing details of this order - allOf: - - $ref: "#/components/schemas/Billing" - fulfillments: - description: The fulfillments involved in completing this order - type: array - items: - $ref: "#/components/schemas/Fulfillment" - cancellation: - description: The cancellation details of this order - allOf: - - $ref: "#/components/schemas/Cancellation" - cancellation_terms: - description: Cancellation terms of this item - type: array - items: - $ref: "#/components/schemas/CancellationTerm" - refund_terms: - description: Refund terms of this item - type: array - items: - $ref: "#/components/schemas/Item/properties/refund_terms/items" - replacement_terms: - description: Replacement terms of this item - type: array - items: - $ref: "#/components/schemas/ReplacementTerm" - return_terms: - description: Return terms of this item - type: array - items: - $ref: "#/components/schemas/ReturnTerm" - quote: - description: The mutually agreed upon quotation for this order. - allOf: - - $ref: "#/components/schemas/Quotation" - payments: - description: The terms of settlement for this order - type: array - items: - $ref: "#/components/schemas/Payment" - created_at: - description: The date-time of creation of this order - type: string - format: date-time - updated_at: - description: The date-time of updated of this order - type: string - format: date-time - xinput: - description: Additional input required from the customer to confirm this order - allOf: - - $ref: "#/components/schemas/XInput" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Organization: - description: An organization. Usually a recognized business entity. - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - address: - description: The postal address of the organization - allOf: - - $ref: "#/components/schemas/Address" - state: - description: The state where the organization's address is registered - allOf: - - $ref: "#/components/schemas/State" - city: - description: The city where the the organization's address is registered - allOf: - - $ref: "#/components/schemas/City" - contact: - $ref: "#/components/schemas/Contact" - Payment: - description: "Describes the terms of settlement between the BAP and the BPP for a single transaction. When instantiated, this object contains
  1. the amount that has to be settled,
  2. The payment destination destination details
  3. When the settlement should happen, and
  4. A transaction reference ID
. During a transaction, the BPP reserves the right to decide the terms of payment. However, the BAP can send its terms to the BPP first. If the BPP does not agree to those terms, it must overwrite the terms and return them to the BAP. If overridden, the BAP must either agree to the terms sent by the BPP in order to preserve the provider's autonomy, or abort the transaction. In case of such disagreements, the BAP and the BPP can perform offline negotiations on the payment terms. Once an agreement is reached, the BAP and BPP can resume transactions." - type: object - properties: - id: - description: ID of the payment term that can be referred at an item or an order level in a catalog - type: string - collected_by: - description: "This field indicates who is the collector of payment. The BAP can set this value to 'bap' if it wants to collect the payment first and settle it to the BPP. If the BPP agrees to those terms, the BPP should not send the payment url. Alternatively, the BPP can set this field with the value 'bpp' if it wants the payment to be made directly." - url: - type: string - description: "A payment url to be called by the BAP. If empty, then the payment is to be done offline. The details of payment should be present in the params object. If tl_method = http/get, then the payment details will be sent as url params. Two url param values, ```$transaction_id``` and ```$amount``` are mandatory." - format: uri - params: - type: object - properties: - transaction_id: - type: string - description: The reference transaction ID associated with a payment activity - amount: - type: string - currency: - type: string - bank_code: - type: string - bank_account_number: - type: string - virtual_payment_address: - type: string - source_bank_code: - type: string - source_bank_account_number: - type: string - source_virtual_payment_address: - type: string - type: - type: string - enum: - - PRE-ORDER - - PRE-FULFILLMENT - - ON-FULFILLMENT - - POST-FULFILLMENT - status: - type: string - enum: - - PAID - - NOT-PAID - time: - $ref: "#/components/schemas/Time" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Person: - description: Describes a person as any individual - type: object - properties: - id: - type: string - description: Describes the identity of the person - url: - description: Profile url of the person - type: string - format: uri - name: - description: the name of the person - type: string - image: - $ref: "#/components/schemas/Image" - age: - description: Age of the person - allOf: - - $ref: "#/components/schemas/Duration" - dob: - description: Date of birth of the person - type: string - format: date - gender: - type: string - description: "Gender of something, typically a Person, but possibly also fictional characters, animals, etc. While Male and Female may be used, text strings are also acceptable for people who do not identify as a binary gender.Allowed values for this field can be published in the network policy" - creds: - type: array - items: - $ref: "#/components/schemas/Credential" - languages: - type: array - items: - description: Describes a language known to the person. - type: object - properties: - code: - type: string - name: - type: string - skills: - type: array - items: - description: Describes a skill of the person. - type: object - properties: - code: - type: string - name: - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Price: - description: Describes the price of a product or service - type: object - properties: - currency: - type: string - value: - $ref: "#/components/schemas/DecimalValue" - estimated_value: - $ref: "#/components/schemas/DecimalValue" - computed_value: - $ref: "#/components/schemas/DecimalValue" - listed_value: - $ref: "#/components/schemas/DecimalValue" - offered_value: - $ref: "#/components/schemas/DecimalValue" - minimum_value: - $ref: "#/components/schemas/DecimalValue" - maximum_value: - $ref: "#/components/schemas/DecimalValue" - Provider: - description: Describes the catalog of a business. - type: object - properties: - id: - type: string - description: Id of the provider - descriptor: - $ref: "#/components/schemas/Descriptor" - category_id: - type: string - description: Category Id of the provider at the BPP-level catalog - rating: - $ref: "#/components/schemas/Rating/properties/value" - time: - $ref: "#/components/schemas/Time" - categories: - type: array - items: - $ref: "#/components/schemas/Category" - fulfillments: - type: array - items: - $ref: "#/components/schemas/Fulfillment" - payments: - type: array - items: - $ref: "#/components/schemas/Payment" - locations: - type: array - items: - $ref: "#/components/schemas/Location" - offers: - type: array - items: - $ref: "#/components/schemas/Offer" - items: - type: array - items: - $ref: "#/components/schemas/Item" - exp: - type: string - description: Time after which catalog has to be refreshed - format: date-time - rateable: - description: Whether this provider can be rated or not - type: boolean - ttl: - description: "The time-to-live in seconds, for this object. This can be overriden at deeper levels. A value of -1 indicates that this object is not cacheable." - type: integer - minimum: -1 - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Quotation: - description: "Describes a quote. It is the estimated price of products or services from the BPP.
This has properties like price, breakup, ttl" - type: object - properties: - id: - description: ID of the quote. - type: string - format: uuid - price: - description: The total quoted price - allOf: - - $ref: "#/components/schemas/Price" - breakup: - description: the breakup of the total quoted price - type: array - items: - type: object - properties: - item: - $ref: "#/components/schemas/Item" - title: - type: string - price: - $ref: "#/components/schemas/Price" - ttl: - $ref: "#/components/schemas/Duration" - Rating: - description: Describes the rating of an entity - type: object - properties: - rating_category: - description: Category of the entity being rated - type: string - enum: - - Item - - Order - - Fulfillment - - Provider - - Agent - - Support - id: - description: Id of the object being rated - type: string - value: - description: "Rating value given to the object. This can be a single value or can also contain an inequality operator like gt, gte, lt, lte. This can also contain an inequality expression containing logical operators like && and ||." - type: string - Region: - description: Describes an arbitrary region of space. The network policy should contain a published list of supported regions by the network. - type: object - properties: - dimensions: - description: "The number of dimensions that are used to describe any point inside that region. The most common dimensionality of a region is 2, that represents an area on a map. There are regions on the map that can be approximated to one-dimensional regions like roads, railway lines, or shipping lines. 3 dimensional regions are rarer, but are gaining popularity as flying drones are being adopted for various fulfillment services." - type: string - enum: - - "1" - - "2" - - "3" - type: - description: "The type of region. This is used to specify the granularity of the region represented by this object. Various examples of two-dimensional region types are city, country, state, district, and so on. The network policy should contain a list of all possible region types supported by the network." - type: string - name: - type: string - description: Name of the region as specified on the map where that region exists. - code: - type: string - description: A standard code representing the region. This should be interpreted in the same way by all network participants. - boundary: - type: string - description: "A string representing the boundary of the region. One-dimensional regions are represented by polylines. Two-dimensional regions are represented by polygons, and three-dimensional regions can represented by polyhedra." - map_url: - type: string - description: The url to the map of the region. This can be a globally recognized map or the one specified by the network policy. - ReplacementTerm: - description: The replacement policy of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/State" - replace_within: - description: "Applicable only for buyer managed returns where the buyer has to replace the item before a certain date-time, failing which they will not be eligible for replacement" - allOf: - - $ref: "#/components/schemas/Time" - external_ref: - $ref: "#/components/schemas/MediaFile" - ReturnTerm: - description: Describes the return policy of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term IETF''s applicable. - allOf: - - $ref: "#/components/schemas/State" - return_eligible: - description: Indicates whether the item is eligible for return - type: boolean - return_time: - description: "Applicable only for buyer managed returns where the buyer has to return the item to the origin before a certain date-time, failing which they will not be eligible for refund." - allOf: - - $ref: "#/components/schemas/Time" - return_location: - description: The location where the item or order must / will be returned to - allOf: - - $ref: "#/components/schemas/Location" - fulfillment_managed_by: - description: The entity that will perform the return - type: string - enum: - - CONSUMER - - PROVIDER - Scalar: - description: Describes a scalar - type: object - properties: - type: - type: string - enum: - - CONSTANT - - VARIABLE - value: - $ref: "#/components/schemas/DecimalValue" - estimated_value: - $ref: "#/components/schemas/DecimalValue" - computed_value: - $ref: "#/components/schemas/DecimalValue" - range: - type: object - properties: - min: - $ref: "#/components/schemas/DecimalValue" - max: - $ref: "#/components/schemas/DecimalValue" - unit: - type: string - Schedule: - description: "Describes schedule as a repeating time period used to describe a regularly recurring event. At a minimum a schedule will specify frequency which describes the interval between occurrences of the event. Additional information can be provided to specify the schedule more precisely. This includes identifying the timestamps(s) of when the event will take place. Schedules may also have holidays to exclude a specific day from the schedule.
This has properties like frequency, holidays, times" - type: object - properties: - frequency: - $ref: "#/components/schemas/Duration" - holidays: - type: array - items: - type: string - format: date-time - times: - type: array - items: - type: string - format: date-time - State: - description: A bounded geopolitical region of governance inside a country. - type: object - properties: - name: - type: string - description: Name of the state - code: - type: string - description: State code as per country or international standards - Stop: - description: A logical point in space and time during the fulfillment of an order. - type: object - properties: - id: - type: string - parent_stop_id: - type: string - location: - description: Location of the stop - allOf: - - $ref: "#/components/schemas/Location" - type: - description: The type of stop. Allowed values of this property can be defined by the network policy. - type: string - time: - description: Timings applicable at the stop. - allOf: - - $ref: "#/components/schemas/Time" - instructions: - description: Instructions that need to be followed at the stop - allOf: - - $ref: "#/components/schemas/Descriptor" - contact: - description: Contact details of the stop - allOf: - - $ref: "#/components/schemas/Contact" - person: - description: The details of the person present at the stop - allOf: - - $ref: "#/components/schemas/Person" - authorization: - $ref: "#/components/schemas/Authorization" - Support: - description: Details of customer support - type: object - properties: - ref_id: - type: string - callback_phone: - type: string - format: phone - phone: - type: string - format: phone - email: - type: string - format: email - url: - type: string - format: uri - Tag: - description: "Describes a tag. This is used to contain extended metadata. This object can be added as a property to any schema to describe extended attributes. For BAPs, tags can be sent during search to optimize and filter search results. BPPs can use tags to index their catalog to allow better search functionality. Tags are sent by the BPP as part of the catalog response in the `on_search` callback. Tags are also meant for display purposes. Upon receiving a tag, BAPs are meant to render them as name-value pairs. This is particularly useful when rendering tabular information about a product or service." - type: object - properties: - descriptor: - description: "Description of the Tag, can be used to store detailed information." - allOf: - - $ref: "#/components/schemas/Descriptor" - value: - description: The value of the tag. This set by the BPP and rendered as-is by the BAP. - type: string - display: - description: "This value indicates if the tag is intended for display purposes. If set to `true`, then this tag must be displayed. If it is set to `false`, it should not be displayed. This value can override the group display value." - type: boolean - TagGroup: - description: "A collection of tag objects with group level attributes. For detailed documentation on the Tags and Tag Groups schema go to https://github.com/beckn/protocol-specifications/discussions/316" - type: object - properties: - display: - description: "Indicates the display properties of the tag group. If display is set to false, then the group will not be displayed. If it is set to true, it should be displayed. However, group-level display properties can be overriden by individual tag-level display property. As this schema is purely for catalog display purposes, it is not recommended to send this value during search." - type: boolean - default: true - descriptor: - description: "Description of the TagGroup, can be used to store detailed information." - allOf: - - $ref: "#/components/schemas/Descriptor" - list: - description: "An array of Tag objects listed under this group. This property can be set by BAPs during search to narrow the `search` and achieve more relevant results. When received during `on_search`, BAPs must render this list under the heading described by the `name` property of this schema." - type: array - items: - $ref: "#/components/schemas/Tag" - Time: - description: "Describes time in its various forms. It can be a single point in time; duration; or a structured timetable of operations
This has properties like label, time stamp,duration,range, days, schedule" - type: object - properties: - label: - type: string - timestamp: - type: string - format: date-time - duration: - $ref: "#/components/schemas/Duration" - range: - type: object - properties: - start: - type: string - format: date-time - end: - type: string - format: date-time - days: - type: string - description: comma separated values representing days of the week - schedule: - $ref: "#/components/schemas/Schedule" - Tracking: - description: Contains tracking information that can be used by the BAP to track the fulfillment of an order in real-time. which is useful for knowing the location of time sensitive deliveries. - type: object - properties: - id: - description: A unique tracking reference number - type: string - url: - description: "A URL to the tracking endpoint. This can be a link to a tracking webpage, a webhook URL created by the BAP where BPP can push the tracking data, or a GET url creaed by the BPP which the BAP can poll to get the tracking data. It can also be a websocket URL where the BPP can push real-time tracking data." - type: string - format: uri - location: - description: "In case there is no real-time tracking endpoint available, this field will contain the latest location of the entity being tracked. The BPP will update this value everytime the BAP calls the track API." - allOf: - - $ref: "#/components/schemas/Location" - status: - description: "This value indicates if the tracking is currently active or not. If this value is `active`, then the BAP can begin tracking the order. If this value is `inactive`, the tracking URL is considered to be expired and the BAP should stop tracking the order." - type: string - enum: - - active - - inactive - Vehicle: - description: "Describes a vehicle is a device that is designed or used to transport people or cargo over land, water, air, or through space.
This has properties like category, capacity, make, model, size,variant,color,energy_type,registration" - type: object - properties: - category: - type: string - capacity: - type: integer - make: - type: string - model: - type: string - size: - type: string - variant: - type: string - color: - type: string - energy_type: - type: string - registration: - type: string - wheels_count: - type: string - cargo_volumne: - type: string - wheelchair_access: - type: string - code: - type: string - emission_standard: - type: string - XInput: - description: "Contains any additional or extended inputs required to confirm an order. This is typically a Form Input. Sometimes, selection of catalog elements is not enough for the BPP to confirm an order. For example, to confirm a flight ticket, the airline requires details of the passengers along with information on baggage, identity, in addition to the class of ticket. Similarly, a logistics company may require details on the nature of shipment in order to confirm the shipping. A recruiting firm may require additional details on the applicant in order to confirm a job application. For all such purposes, the BPP can choose to send this object attached to any object in the catalog that is required to be sent while placing the order. This object can typically be sent at an item level or at the order level. The item level XInput will override the Order level XInput as it indicates a special requirement of information for that particular item. Hence the BAP must render a separate form for the Item and another form at the Order level before confirmation." - type: object - properties: - form: - $ref: "#/components/schemas/Form" - required: - description: Indicates whether the form data is mandatorily required by the BPP to confirm the order. - type: boolean diff --git a/layer2/samples/mobility_1.1.0.yaml b/layer2/samples/mobility_1.1.0.yaml deleted file mode 100644 index c346132..0000000 --- a/layer2/samples/mobility_1.1.0.yaml +++ /dev/null @@ -1,9128 +0,0 @@ -openapi: 3.1.0 -info: - description: Adaptation of beckn protocol for the mobility sector. Compatible with core version V1.1. - title: Beckn Mobility API Specification - version: 0.8.3 -security: - - SubscriberAuth: [] -servers: - - url: 'https://ps-bap-client.becknprotocol.io' - description: BOC Network -paths: - /search: - post: - description: Search for services by intent - operationId: search - tags: - - Beckn Provider Platform (BPP) - - Beckn Gateway (BG) - requestBody: - content: - application/json: - schema: - allOf: - - type: object - properties: - context: - allOf: - - $ref: '#/components/schemas/Context' - message: - properties: - intent: - $ref: '#/components/schemas/Intent' - type: object - required: - - context - - message - - allOf: - - properties: - context: - properties: - location: - properties: - city: - properties: - code: - type: string - required: - - code - country: - properties: - code: - type: string - enum: - - IND - required: - - code - bap_id: - type: string - pattern: '^(?!https?://).*$' - bpp_id: - type: string - pattern: '^(?!https?://).*$' - ttl: - type: string - format: date-time - timestamp: - type: string - format: date-time - required: - - location - - domain - - action - - message_id - - transaction_id - - timestamp - - bap_id - - bap_uri - - ttl - - properties: - context: - properties: - action: - type: string - enum: - - search - - properties: - message: - properties: - intent: - properties: - tags: - items: - properties: - list: - items: - properties: - value: - type: string - enum: - - START - - STOP - payment: - properties: - collected_by: - type: string - enum: - - BPP - - BAP - required: - - collected_by - required: - - payment - - tags - required: - - intent - - properties: - message: - properties: - intent: - properties: - payment: - properties: - tags: - items: - if: - properties: - descriptor: - properties: - code: - const: SETTLEMENT_TERMS - then: - properties: - list: - allOf: - - contains: - type: object - properties: - descriptor: - type: object - properties: - code: - const: STATIC_TERMS - required: - - code - value: - type: string - format: uri - required: - - descriptor - - value - - contains: - type: object - properties: - descriptor: - type: object - properties: - code: - const: SETTLEMENT_TYPE - required: - - code - value: - type: string - enum: - - upi - - neft - - rtgs - required: - - descriptor - - value - - contains: - type: object - properties: - descriptor: - type: object - properties: - code: - const: SETTLEMENT_WINDOW - required: - - code - value: - type: string - pattern: '^PT\d+[MH]$' - required: - - descriptor - - value - - properties: - message: - properties: - intent: - properties: - fulfillment: - properties: - stops: - allOf: - - contains: - type: object - properties: - location: - type: object - properties: - gps: - type: string - required: - - gps - type: - const: START - required: - - location - - type - - contains: - type: object - properties: - location: - type: object - properties: - gps: - type: string - required: - - gps - type: - const: END - required: - - location - - type - required: - - stops - required: - - fulfillment - examples: - Search for services in the city of Bengaluru by pickup and drop location: - value: - context: - action: search - bap_id: example-bap.com - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: 6743e9e2-4fb5-487c-92b7-13ba8018f176 - timestamp: '2023-03-23T04:41:16Z' - transaction_id: 6743e9e2-4fb5-487c-92b7-13ba8018f176 - version: 1.1.0 - message: - intent: - fulfillment: - stops: - - location: - gps: '12.923608703179461, 77.61462964117527' - type: start - - location: - gps: '12.9346302, 77.61533969999999' - type: end - Search by pickup and drop location with localization info: - value: - context: - action: search - bap_id: example-bap.com - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: 6743e9e2-4fb5-487c-92b7-13ba8018f176 - timestamp: '2023-03-23T04:41:16Z' - transaction_id: 6743e9e2-4fb5-487c-92b7-13ba8018f176 - version: 1.1.0 - message: - intent: - fulfillment: - customer: - person: - languages: - - code: en - name: English - stops: - - location: - gps: '12.923608703179461, 77.61462964117527' - type: start - - location: - gps: '12.9346302, 77.61533969999999' - type: end - responses: - '200': - content: - application/json: - schema: - properties: - error: - $ref: '#/components/schemas/Error' - message: - properties: - ack: - $ref: '#/components/schemas/Ack' - required: - - ack - type: object - required: - - message - type: object - description: Acknowledgement of message received - /select: - post: - description: Select items from the catalog and build your order - operationId: select - tags: - - Beckn Provider Platform (BPP) - requestBody: - content: - application/json: - schema: - allOf: - - type: object - properties: - context: - allOf: - - $ref: '#/components/schemas/Context' - message: - properties: - order: - allOf: - - $ref: '#/components/schemas/Order' - required: - - order - type: object - required: - - context - - message - - allOf: - - $ref: '#/paths/~1init/post/requestBody/content/application~1json/schema/allOf/1/allOf/0' - - properties: - context: - properties: - action: - type: string - enum: - - select - - $ref: '#/paths/~1init/post/requestBody/content/application~1json/schema/allOf/1/allOf/2' - examples: - Get a quote for a fare product selected from a public transit catalog: - value: - context: - action: select - bap_id: 'https://example-bap.com' - bap_uri: 'https://mock_bap.com/beckn/' - bpp_id: 'https://kmrl-bpp.com' - bpp_uri: 'https://kmrl-bpp.com/beckn/' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: fde8b8b6-c2e5-49f7-b254-720843d528bd - timestamp: '2021-03-23T10:00:40.065Z' - transaction_id: 6f339232-2bc3-44d2-915c-30d2b053ce1d - version: 1.1.0 - message: - order: - items: - - id: '1' - provider: - id: '1' - Get quote for a specific product from a mobility catalog: - value: - context: - action: select - bap_id: example-bap.com - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - bpp_id: example-bpp.com - bpp_uri: 'https://api.example-bpp.com/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - max_callbacks: 3 - message_id: 432fdfd6-0457-47b6-9fac-80cbe5c0a75b - timestamp: '2023-03-23T04:46:45Z' - transaction_id: 870782be-6757-43f1-945c-8eeaf9536259 - ttl: P120S - version: 1.1.0 - message: - order: - fulfillments: - - stops: - - location: - gps: '12.910458, 77.543089' - type: start - - location: - gps: '12.9535139, 77.5710434' - type: end - items: - - id: 5777a0bf-9a08-49aa-a97d-1e5561a9622e - provider: - id: '1' - Get quote for a specific product from a mobility catalog with gps and address details: - value: - context: - action: select - bap_id: example-bap.com - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - bpp_id: example-bpp.com - bpp_uri: 'https://api.example-bpp.com/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - max_callbacks: 3 - message_id: 432fdfd6-0457-47b6-9fac-80cbe5c0a75b - timestamp: '2023-03-23T04:46:45Z' - transaction_id: 870782be-6757-43f1-945c-8eeaf9536259 - ttl: P120S - version: 1.1.0 - message: - order: - fulfillments: - - stops: - - location: - address: '98 A, 6th Main Rd, Uttarahalli Hobli, Ramanjaneyanagar' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Ramanjaneyanagar - gps: '12.910458, 77.543089' - state: - name: Karnataka - type: start - - location: - address: 'Basavanagudi, Chikkanna Garden, Rangadore Memorial Hospital' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Chikkanna Garden - gps: '12.9535139, 77.5710434' - state: - name: Karnataka - type: end - items: - - id: 5777a0bf-9a08-49aa-a97d-1e5561a9622e - provider: - id: '1' - Get quote for a specific product from a mobility catalog with localization: - value: - context: - action: select - bap_id: example-bap.com - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - bpp_id: example-bpp.com - bpp_uri: 'https://api.example-bpp.com/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - max_callbacks: 3 - message_id: 432fdfd6-0457-47b6-9fac-80cbe5c0a75b - timestamp: '2023-03-23T04:46:45Z' - transaction_id: 870782be-6757-43f1-945c-8eeaf9536259 - ttl: P120S - version: 1.1.0 - message: - order: - fulfillments: - - customer: - person: - languages: - - code: en - name: English - stops: - - location: - address: '98 A, 6th Main Rd, Uttarahalli Hobli, Ramanjaneyanagar' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Ramanjaneyanagar - gps: '12.910458, 77.543089' - state: - name: Karnataka - type: start - - location: - address: 'Basavanagudi, Chikkanna Garden, Rangadore Memorial Hospital' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Chikkanna Garden - gps: '12.9535139, 77.5710434' - state: - name: Karnataka - type: end - items: - - id: 5777a0bf-9a08-49aa-a97d-1e5561a9622e - provider: - id: '1' - responses: - '200': - content: - application/json: - schema: - properties: - error: - $ref: '#/components/schemas/Error' - message: - properties: - ack: - $ref: '#/components/schemas/Ack' - required: - - ack - type: object - required: - - message - type: object - description: Acknowledgement of message received - /init: - post: - description: Initialize an order by providing billing and/or shipping details - operationId: init - requestBody: - content: - application/json: - schema: - allOf: - - type: object - properties: - context: - allOf: - - $ref: '#/components/schemas/Context' - message: - properties: - order: - allOf: - - $ref: '#/components/schemas/Order' - required: - - order - required: - - context - - message - - allOf: - - allOf: - - $ref: '#/paths/~1search/post/requestBody/content/application~1json/schema/allOf/1/allOf/0' - - properties: - context: - required: - - bpp_id - - bpp_uri - - properties: - context: - properties: - action: - type: string - enum: - - init - - properties: - message: - properties: - order: - type: object - properties: - provider: - type: object - properties: - id: - type: string - required: - - id - items: - type: array - items: - type: object - properties: - id: - type: string - required: - - id - required: - - provider - - items - - allOf: - - $ref: '#/paths/~1confirm/post/requestBody/content/application~1json/schema/allOf/1/allOf/3' - - $ref: '#/paths/~1on_select/post/requestBody/content/application~1json/schema/allOf/1/allOf/8' - - properties: - message: - properties: - order: - required: - - fulfillments - - allOf: - - properties: - message: - properties: - order: - properties: - payments: - type: array - items: - type: object - properties: - type: - type: string - enum: - - PRE-ORDER - - ON-FULFILLMENT - - POST-FULFILLMENT - status: - type: string - enum: - - PAID - - NOT-PAID - collected_by: - type: string - enum: - - BAP - - BPP - params: - type: object - properties: - amount: - type: string - pattern: '^\d+(\.\d{1,2})?$' - currency: - type: string - required: - - type - - status - - collected_by - - params - required: - - payments - - properties: - message: - properties: - order: - properties: - payments: - items: - properties: - params: - required: - - bank_code - - bank_account_number - - virtual_payment_address - required: - - type - - status - - collected_by - - params - required: - - payments - - properties: - message: - properties: - order: - properties: - billing: - required: - - name - required: - - billing - examples: - Initialize draft order and request for terms of service: - value: - context: - action: init - bap_id: example-bap.com - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - bpp_id: example-bpp.com - bpp_uri: 'https://api.example-bpp.com/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: 8926b747-0362-4fcc-b795-0994a6287700 - timestamp: '2023-03-23T04:48:53Z' - transaction_id: b580c989-f84d-4abe-af28-2c818aafce3b - version: 1.1.0 - message: - order: - fulfillments: - - customer: - contact: - phone: +91-9897867564 - person: - language: - code: en - name: English - name: John Doe - id: fulf_5cf064d5-4c0a-42d3-b73d-5f19a6f7468e - stops: - - location: - address: '98 A, 6th Main Rd, Uttarahalli Hobli, Ramanjaneyanagar' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Ramanjaneyanagar - gps: '12.910458, 77.543089' - state: - name: Karnataka - type: start - - location: - address: 'Basavanagudi, Chikkanna Garden, Rangadore Memorial Hospital' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Chikkanna Garden - gps: '12.9535139, 77.5710434' - state: - name: Karnataka - type: end - items: - - fulfillment_ids: - - fulf_5cf064d5-4c0a-42d3-b73d-5f19a6f7468e - id: 5777a0bf-9a08-49aa-a97d-1e5561a9622e - payment_ids: - - 7f7896dd-787e-4a0b-8675-e9e6fe93bb8f - payment: - - collected_by: BPP - id: 7f7896dd-787e-4a0b-8675-e9e6fe93bb8f - type: ON-FULFILLMENT - provider: - id: '1' - Initialize the order by providing billing details: - value: - context: - action: init - bap_id: 'https://example-bap.com' - bap_uri: 'https://mock_bap.com/beckn/' - bpp_id: 'https://kmrl-bpp.com' - bpp_uri: 'https://kmrl-bpp.com/beckn/' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: fde8b8b6-c2e5-49f7-b254-720843d528bd - timestamp: '2021-03-23T10:00:40.065Z' - transaction_id: 6f339232-2bc3-44d2-915c-30d2b053ce1d - version: 1.1.0 - message: - order: - billing: - email: john.doe@example.com - name: John Doe - items: - - id: '1' - provider: - id: '1' - description: TODO - responses: - '200': - content: - application/json: - schema: - properties: - error: - $ref: '#/components/schemas/Error' - message: - properties: - ack: - $ref: '#/components/schemas/Ack' - required: - - ack - type: object - required: - - message - type: object - description: Acknowledgement of message received - tags: - - Beckn Provider Platform (BPP) - /confirm: - post: - description: Initialize an order by providing billing and/or shipping details - operationId: confirm - requestBody: - content: - application/json: - schema: - allOf: - - properties: - context: - allOf: - - $ref: '#/components/schemas/Context' - message: - properties: - order: - allOf: - - $ref: '#/components/schemas/Order' - required: - - order - type: object - required: - - context - - message - type: object - - allOf: - - $ref: '#/paths/~1init/post/requestBody/content/application~1json/schema/allOf/1/allOf/0' - - properties: - context: - properties: - action: - type: string - enum: - - confirm - - $ref: '#/paths/~1init/post/requestBody/content/application~1json/schema/allOf/1/allOf/2' - - allOf: - - $ref: '#/paths/~1on_select/post/requestBody/content/application~1json/schema/allOf/1/allOf/6' - - properties: - message: - properties: - order: - properties: - fulfillments: - type: array - items: - allOf: - - properties: - customer: - properties: - contact: - properties: - phone: - type: string - pattern: '^\+?[1-9]\d{1,14}$' - required: - - phone - person: - properties: - name: - type: string - required: - - name - required: - - contact - - person - required: - - customer - - allOf: - - properties: - message: - properties: - order: - properties: - items: - type: array - minItems: 1 - items: - type: object - properties: - id: - type: string - descriptor: - type: object - properties: - name: - type: string - code: - type: string - enum: - - RIDE - required: - - code - price: - type: object - properties: - value: - type: string - required: - - value - fulfillment_ids: - minItems: 1 - location_ids: - minItems: 1 - required: - - id - - price - - descriptor - required: - - items - - allOf: - - properties: - message: - properties: - order: - properties: - items: - items: - properties: - tags: - items: - if: - properties: - descriptor: - properties: - code: - const: FARE_POLICY - then: - properties: - list: - type: array - items: - type: object - properties: - descriptor: - properties: - code: - type: string - enum: - - MIN_FARE - - MIN_FARE_DISTANCE_KM - - PER_KM_CHARGE - - PICKUP_CHARGE - - WAITING_CHARGE_PER_MIN - - NIGHT_CHARGE_MULTIPLIER - - NIGHT_SHIFT_START_TIME - - NIGHT_SHIFT_END_TIME - - EXTERNAL_REF - - properties: - message: - properties: - order: - properties: - items: - items: - properties: - tags: - items: - if: - properties: - descriptor: - properties: - code: - const: FARE_POLICY - then: - properties: - list: - allOf: - - contains: - type: object - properties: - descriptor: - type: object - properties: - code: - const: MIN_FARE - required: - - code - value: - type: string - pattern: '^[0-9]+(\.[0-9]+)?$' - required: - - descriptor - - value - - contains: - type: object - properties: - descriptor: - type: object - properties: - code: - const: MIN_FARE_DISTANCE_KM - required: - - code - value: - type: string - pattern: '^[0-9]+(\.[0-9]+)?$' - required: - - descriptor - - value - - contains: - type: object - properties: - descriptor: - type: object - properties: - code: - const: PER_KM_CHARGE - required: - - code - value: - type: string - pattern: '^[0-9]+(\.[0-9]+)?$' - required: - - descriptor - - value - - contains: - type: object - properties: - descriptor: - type: object - properties: - code: - const: PICKUP_CHARGE - required: - - code - value: - type: string - pattern: '^[0-9]+(\.[0-9]+)?$' - required: - - descriptor - - value - - contains: - type: object - properties: - descriptor: - type: object - properties: - code: - const: WAITING_CHARGE_PER_MIN - required: - - code - value: - type: string - pattern: '^[0-9]+(\.[0-9]+)?$' - required: - - descriptor - - value - - contains: - type: object - properties: - descriptor: - type: object - properties: - code: - const: NIGHT_CHARGE_MULTIPLIER - required: - - code - value: - type: string - pattern: '^[0-9]+(\.[0-9]+)?$' - required: - - descriptor - - value - - contains: - type: object - properties: - descriptor: - type: object - properties: - code: - const: NIGHT_SHIFT_START_TIME - required: - - code - value: - type: string - pattern: '^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$' - required: - - descriptor - - value - - properties: - message: - properties: - order: - properties: - items: - items: - properties: - tags: - items: - if: - properties: - descriptor: - properties: - code: - const: FARE_POLICY - then: - properties: - list: - type: array - items: - allOf: - - if: - properties: - descriptor: - properties: - code: - enum: - - MIN_FARE - - MIN_FARE_DISTANCE_KM - - PER_KM_CHARGE - - PICKUP_CHARGE - - WAITING_CHARGE_PER_MIN - - NIGHT_CHARGE_MULTIPLIER - then: - properties: - value: - type: string - pattern: ^-?\d+(\.\d+)?$ - required: - - descriptor - - value - - if: - properties: - descriptor: - properties: - code: - enum: - - NIGHT_SHIFT_START_TIME - - NIGHT_SHIFT_END_TIME - then: - properties: - value: - type: string - pattern: '^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$' - required: - - descriptor - - value - - if: - properties: - descriptor: - properties: - code: - const: EXTERNAL_REF - then: - properties: - value: - type: string - pattern: '^https?://[^\s/$.?#].[^\s]*$' - required: - - descriptor - - value - - allOf: - - properties: - message: - properties: - order: - properties: - items: - items: - properties: - tags: - items: - if: - properties: - descriptor: - properties: - code: - const: INFO - then: - properties: - list: - type: array - items: - type: object - properties: - descriptor: - properties: - code: - type: string - enum: - - DISTANCE_TO_NEAREST_DRIVER_METER - - ETA_TO_NEAREST_DRIVER_MIN - - properties: - message: - properties: - order: - properties: - items: - items: - properties: - tags: - items: - if: - properties: - descriptor: - properties: - code: - const: INFO - then: - properties: - list: - allOf: - - contains: - type: object - properties: - descriptor: - type: object - properties: - code: - const: ETA_TO_NEAREST_DRIVER_MIN - required: - - code - value: - type: string - pattern: ^\d+(\.\d+)?$ - required: - - descriptor - - value - - contains: - type: object - properties: - descriptor: - type: object - properties: - code: - const: DISTANCE_TO_NEAREST_DRIVER_METER - required: - - code - value: - type: string - pattern: ^\d+(\.\d+)?$ - required: - - descriptor - - value - - properties: - message: - properties: - order: - properties: - items: - type: array - items: - properties: - tags: - items: - if: - properties: - descriptor: - properties: - code: - const: INFO - then: - properties: - list: - type: array - items: - allOf: - - if: - properties: - descriptor: - properties: - code: - enum: - - DISTANCE_TO_NEAREST_DRIVER_METER - - ETA_TO_NEAREST_DRIVER_MIN - then: - properties: - value: - type: string - pattern: ^-?\d+(\.\d+)?$ - required: - - descriptor - - value - - allOf: - - $ref: '#/paths/~1init/post/requestBody/content/application~1json/schema/allOf/1/allOf/4' - - allOf: - - allOf: - - properties: - message: - properties: - order: - properties: - payments: - items: - properties: - tags: - items: - if: - properties: - descriptor: - properties: - code: - const: BUYER_FINDER_FEES - then: - properties: - list: - type: array - items: - type: object - properties: - descriptor: - properties: - code: - type: string - enum: - - BUYER_FINDER_FEES_PERCENTAGE - - properties: - message: - properties: - order: - properties: - payments: - items: - properties: - tags: - items: - if: - properties: - descriptor: - properties: - code: - const: BUYER_FINDER_FEES - then: - properties: - list: - allOf: - - contains: - type: object - properties: - descriptor: - type: object - properties: - code: - const: BUYER_FINDER_FEES_PERCENTAGE - required: - - code - value: - type: string - required: - - descriptor - - value - - properties: - message: - properties: - order: - properties: - payments: - items: - properties: - tags: - items: - if: - properties: - descriptor: - properties: - code: - const: BUYER_FINDER_FEES - then: - properties: - list: - type: array - items: - allOf: - - if: - properties: - descriptor: - properties: - code: - enum: - - BUYER_FINDER_FEES_PERCENTAGE - then: - properties: - value: - type: string - pattern: ^-?\d+(\.\d+)?$ - required: - - descriptor - - value - - allOf: - - properties: - message: - properties: - order: - properties: - payments: - items: - properties: - tags: - items: - if: - properties: - descriptor: - properties: - code: - const: SETTLEMENT_TERMS - then: - properties: - list: - type: array - items: - type: object - properties: - descriptor: - properties: - code: - type: string - enum: - - SETTLEMENT_WINDOW - - SETTLEMENT_BASIS - - SETTLEMENT_TYPE - - MANDATORY_ARBITRATION - - COURT_JURISDICTION - - DELAY_INTEREST - - STATIC_TERMS - - SETTLEMENT_AMOUNT - - properties: - message: - properties: - order: - properties: - payments: - items: - properties: - tags: - items: - if: - properties: - descriptor: - properties: - code: - const: SETTLEMENT_TERMS - then: - properties: - list: - allOf: - - contains: - type: object - properties: - descriptor: - type: object - properties: - code: - const: STATIC_TERMS - required: - - code - value: - type: string - required: - - descriptor - - value - - contains: - type: object - properties: - descriptor: - type: object - properties: - code: - const: SETTLEMENT_TYPE - required: - - code - value: - type: string - required: - - descriptor - - value - - contains: - type: object - properties: - descriptor: - type: object - properties: - code: - const: SETTLEMENT_WINDOW - required: - - code - value: - type: string - required: - - descriptor - - value - - properties: - message: - properties: - order: - properties: - payments: - items: - properties: - tags: - items: - if: - properties: - descriptor: - properties: - code: - const: SETTLEMENT_TERMS - then: - properties: - list: - type: array - items: - allOf: - - if: - properties: - descriptor: - properties: - code: - const: SETTLEMENT_WINDOW - then: - properties: - value: - type: string - pattern: '^P(?!$)(?:\d+Y)?(?:\d+M)?(?:\d+W)?(?:\d+D)?(?:T(?=\d)(?:\d+H)?(?:\d+M)?(?:\d+S)?)?$' - required: - - descriptor - - value - - if: - properties: - descriptor: - properties: - code: - const: SETTLEMENT_BASIS - then: - properties: - value: - type: string - enum: - - INVOICE_RECEIPT - - DELIVERY - required: - - descriptor - - value - - if: - properties: - descriptor: - properties: - code: - const: MANDATORY_ARBITRATION - then: - properties: - value: - type: string - pattern: ^(true|false)$ - required: - - descriptor - - value - - if: - properties: - descriptor: - properties: - code: - const: STATIC_TERMS - then: - properties: - value: - type: string - format: uri - required: - - descriptor - - value - - if: - properties: - descriptor: - properties: - code: - const: COURT_JURISDICTION - then: - properties: - value: - type: string - required: - - descriptor - - value - - if: - properties: - descriptor: - properties: - code: - const: DELAY_INTEREST - then: - properties: - value: - type: string - pattern: '^\d+(\.\d{1,2})?$' - required: - - descriptor - - value - - if: - properties: - descriptor: - properties: - code: - const: SETTLEMENT_TYPE - then: - properties: - value: - type: string - enum: - - UPI - - NEFT - - RTGS - required: - - descriptor - - value - - if: - properties: - descriptor: - properties: - code: - const: SETTLEMENT_AMOUNT - then: - properties: - value: - type: string - pattern: '^\d+(\.\d{1,2})?$' - required: - - descriptor - - value - - properties: - message: - properties: - order: - properties: - payments: - items: - properties: - tags: - allOf: - - contains: - properties: - descriptor: - type: object - properties: - code: - const: BUYER_FINDER_FEES - required: - - code - - contains: - properties: - descriptor: - type: object - properties: - code: - const: SETTLEMENT_TERMS - required: - - code - - $ref: '#/paths/~1init/post/requestBody/content/application~1json/schema/allOf/1/allOf/5' - - properties: - message: - properties: - order: - properties: - payments: - type: array - items: - properties: - type: - type: string - params: - type: object - properties: - transaction_id: - type: string - required: - - type - allOf: - - if: - properties: - type: - const: PRE-ORDER - then: - properties: - params: - required: - - transaction_id - required: - - payments - - properties: - message: - properties: - order: - not: - required: - - id - examples: - Confirm ride booking: - value: - context: - action: confirm - bap_id: example-bap.com - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - bpp_id: example-bpp.com - bpp_uri: 'https://api.example-bpp.com/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: 8926b747-0362-4fcc-b795-0994a6287700 - timestamp: '2023-03-23T04:48:53Z' - transaction_id: b580c989-f84d-4abe-af28-2c818aafce3b - version: 1.1.0 - message: - order: - fulfillments: - - customer: - contact: - phone: +91-9897867564 - person: - language: - code: en - name: English - name: John Doe - id: fulf_5cf064d5-4c0a-42d3-b73d-5f19a6f7468e - stops: - - location: - address: '98 A, 6th Main Rd, Uttarahalli Hobli, Ramanjaneyanagar' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Ramanjaneyanagar - gps: '12.910458, 77.543089' - state: - name: Karnataka - type: start - - location: - address: 'Basavanagudi, Chikkanna Garden, Rangadore Memorial Hospital' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Chikkanna Garden - gps: '12.9535139, 77.5710434' - state: - name: Karnataka - type: end - vehicle: - category: AUTO_RICKSHAW - items: - - fulfillment_ids: - - fb5c84d4-1b59-4b9d-96b5-9d79107432c5 - id: 5777a0bf-9a08-49aa-a97d-1e5561a9622e - payment_ids: - - '1' - payments: - - id: 7f7896dd-787e-4a0b-8675-e9e6fe93bb8f - params: - amount: '81' - currency: INR - status: NOT-PAID - type: ON-FULFILLMENT - provider: - id: '1' - Confirm ticket booking: - value: - context: - action: confirm - bap_id: 'https://example-bap.com' - bap_uri: 'https://mock_bap.com/beckn/' - bpp_id: 'https://kmrl-bpp.com' - bpp_uri: 'https://kmrl-bpp.com/beckn/' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: fde8b8b6-c2e5-49f7-b254-720843d528bd - timestamp: '2021-03-23T10:00:40.065Z' - transaction_id: 6f339232-2bc3-44d2-915c-30d2b053ce1d - version: 1.1.0 - message: - order: - billing: - email: john.doe@example.com - name: John Doe - items: - - id: '1' - payment: - params: - amount: '55' - currency: INR - transaction_id: '24566345563' - provider: - id: '1' - description: TODO - responses: - '200': - content: - application/json: - schema: - properties: - error: - $ref: '#/components/schemas/Error' - message: - properties: - ack: - $ref: '#/components/schemas/Ack' - required: - - ack - type: object - required: - - message - type: object - description: Acknowledgement of message received - tags: - - Beckn Provider Platform (BPP) - /status: - post: - description: Fetch the latest order object - operationId: status - requestBody: - content: - application/json: - schema: - allOf: - - properties: - context: - allOf: - - $ref: '#/components/schemas/Context' - message: - properties: - order_id: - $ref: '#/components/schemas/Order/properties/id' - type: object - required: - - context - - message - type: object - - allOf: - - $ref: '#/paths/~1init/post/requestBody/content/application~1json/schema/allOf/1/allOf/0' - - properties: - context: - properties: - action: - type: string - enum: - - status - - properties: - message: - properties: - order_id: - type: string - required: - - order_id - examples: - Get latest fulfillment status of a booking: - value: - context: - action: status - bap_id: example-bap.com - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - bpp_id: example-bpp.com - bpp_uri: 'https://api.example-bpp.com/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: 8926b747-0362-4fcc-b795-0994a6287700 - timestamp: '2023-03-23T04:48:53Z' - transaction_id: b580c989-f84d-4abe-af28-2c818aafce3b - version: 1.1.0 - message: - order_id: 7751bd26-3fdc-47ca-9b64-e998dc5abe68 - Get latest status of a transit ticket booking: - value: - context: - action: status - bap_id: 'https://example-bap.com' - bap_uri: 'https://api.example-bap.com/beckn/' - bpp_id: 'https://transit-solutions.com' - bpp_uri: 'https://api.transit-solutions.com/beckn/' - domain: 'nic2008:49213' - location: - city: - code: 'std:080' - country: - code: IND - message_id: fde8b8b6-c2e5-49f7-b254-720843d528bd - timestamp: '2021-03-23T10:00:40.065Z' - transaction_id: 6f339232-2bc3-44d2-915c-30d2b053ce1d - version: 1.1.0 - message: - order_id: '123413' - description: TODO - responses: - '200': - content: - application/json: - schema: - properties: - error: - $ref: '#/components/schemas/Error' - message: - properties: - ack: - $ref: '#/components/schemas/Ack' - required: - - ack - type: object - required: - - message - type: object - description: Acknowledgement of message received - tags: - - Beckn Provider Platform (BPP) - /update: - post: - description: Remove object - operationId: update - requestBody: - content: - application/json: - schema: - allOf: - - properties: - context: - allOf: - - $ref: '#/components/schemas/Context' - - properties: - action: - enum: - - update - required: - - bpp_id - - bpp_uri - message: - properties: - order: - allOf: - - $ref: '#/components/schemas/Order' - description: Updated order object - required: - - id - update_target: - description: 'Comma separated values of order objects being updated. For example: ```"update_target":"item,billing,fulfillment"```' - type: string - required: - - update_target - - order - type: object - required: - - context - - message - type: object - - allOf: - - $ref: '#/paths/~1init/post/requestBody/content/application~1json/schema/allOf/1/allOf/0' - - properties: - context: - properties: - action: - type: string - enum: - - update - - properties: - message: - type: object - properties: - order: - type: object - properties: - id: - type: string - required: - - id - update_target: - type: string - pattern: '^[^,]+(,[^,]+)*$' - required: - - order - - update_target - description: TODO - responses: - '200': - content: - application/json: - schema: - properties: - error: - $ref: '#/components/schemas/Error' - message: - properties: - ack: - $ref: '#/components/schemas/Ack' - required: - - ack - type: object - required: - - message - type: object - description: Acknowledgement of message received - tags: - - Beckn Provider Platform (BPP) - /rating: - post: - description: Provide feedback on a service - operationId: rating - requestBody: - content: - application/json: - schema: - allOf: - - properties: - context: - allOf: - - $ref: '#/components/schemas/Context' - - properties: - action: - enum: - - rating - message: - properties: - ratings: - type: array - items: - $ref: '#/components/schemas/Rating' - type: object - required: - - context - - message - type: object - - allOf: - - $ref: '#/paths/~1init/post/requestBody/content/application~1json/schema/allOf/1/allOf/0' - - properties: - context: - properties: - action: - type: string - enum: - - rating - - properties: - message: - properties: - ratings: - type: array - minItems: 1 - items: - type: object - properties: - id: - type: string - value: - type: number - rating_category: - type: string - enum: - - RIDER - - DRIVER - - SERVICE - required: - - id - - value - - rating_category - examples: - Provide a rating: - value: - context: - action: rating - bap_id: example-bap.com - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - bpp_id: example-bpp.com - bpp_uri: 'https://api.example-bpp.com/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: 432fdfd6-0457-47b6-9fac-80cbe5c0a75b - timestamp: '2023-03-23T04:46:45Z' - transaction_id: 870782be-6757-43f1-945c-8eeaf9536259 - version: 1.1.0 - message: - ratings: - - id: b0462745-f6c9-4100-bbe7-4fa3648b6b40 - rating_category: DRIVER - value: 4 - responses: - '200': - content: - application/json: - schema: - properties: - error: - $ref: '#/components/schemas/Error' - message: - properties: - ack: - $ref: '#/components/schemas/Ack' - required: - - ack - type: object - required: - - message - type: object - description: Acknowledgement of message received - tags: - - Beckn Provider Platform (BPP) - /support: - post: - description: Contact support - operationId: support - requestBody: - content: - application/json: - schema: - allOf: - - properties: - context: - allOf: - - $ref: '#/components/schemas/Context' - - properties: - action: - enum: - - support - message: - properties: - support: - $ref: '#/components/schemas/Support' - type: object - required: - - context - - message - type: object - - allOf: - - $ref: '#/paths/~1init/post/requestBody/content/application~1json/schema/allOf/1/allOf/0' - - properties: - context: - properties: - action: - type: string - enum: - - support - - properties: - message: - properties: - support: - properties: - ref_id: - type: string - required: - - ref_id - examples: - Fetch support information related to a particular order: - value: - context: - action: support - bap_id: example-bap.com - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - bpp_id: example-bpp.com - bpp_uri: 'https://api.example-bpp.com/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: 8926b747-0362-4fcc-b795-0994a6287700 - timestamp: '2023-03-23T04:48:53Z' - transaction_id: 870782be-6757-43f1-945c-8eeaf9536259 - version: 1.1.0 - message: - support: - email: johndoe@gmail.com - phone: 91-876787656 - ref_id: 7751bd26-3fdc-47ca-9b64-e998dc5abe68 - description: TODO - responses: - '200': - content: - application/json: - schema: - properties: - error: - $ref: '#/components/schemas/Error' - message: - properties: - ack: - $ref: '#/components/schemas/Ack' - required: - - ack - type: object - required: - - message - type: object - description: Acknowledgement of message received - tags: - - Beckn Provider Platform (BPP) - /track: - post: - description: Track an active order - operationId: track - requestBody: - content: - application/json: - schema: - allOf: - - properties: - context: - allOf: - - $ref: '#/components/schemas/Context' - - properties: - action: - enum: - - track - message: - additionalProperties: false - properties: - callback_url: - format: uri - type: string - order_id: - $ref: '#/components/schemas/Order/properties/id' - type: object - required: - - context - - message - type: object - - allOf: - - $ref: '#/paths/~1init/post/requestBody/content/application~1json/schema/allOf/1/allOf/0' - - properties: - context: - properties: - action: - type: string - enum: - - track - - properties: - message: - properties: - order_id: - type: string - required: - - order_id - examples: - Track an active ride: - value: - context: - action: track - bap_id: example-bap.com - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - bpp_id: example-bpp.com - bpp_uri: 'https://api.example-bpp.com/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: 8926b747-0362-4fcc-b795-0994a6287700 - timestamp: '2023-03-23T04:48:53Z' - transaction_id: 870782be-6757-43f1-945c-8eeaf9536259 - version: 1.1.0 - message: - order_id: 22e090fc-b8b1-4437-9126-ff7a71c7845c - description: TODO - responses: - '200': - content: - application/json: - schema: - properties: - error: - $ref: '#/components/schemas/Error' - message: - properties: - ack: - $ref: '#/components/schemas/Ack' - required: - - ack - type: object - required: - - message - type: object - description: Acknowledgement of message received - tags: - - Beckn Provider Platform (BPP) - /cancel: - post: - description: Cancel an order - operationId: cancel - requestBody: - content: - application/json: - schema: - allOf: - - properties: - context: - allOf: - - $ref: '#/components/schemas/Context' - - properties: - action: - enum: - - cancel - message: - properties: - cancellation_reason_id: - $ref: '#/components/schemas/Option/properties/id' - descriptor: - $ref: '#/components/schemas/Descriptor' - order_id: - $ref: '#/components/schemas/Order/properties/id' - type: object - required: - - context - - message - type: object - - allOf: - - $ref: '#/paths/~1init/post/requestBody/content/application~1json/schema/allOf/1/allOf/0' - - properties: - context: - properties: - action: - type: string - enum: - - cancel - - properties: - message: - properties: - order_id: - type: string - descriptor: - properties: - code: - type: string - enum: - - SOFT_CANCEL - - CONFIRM_CANCEL - required: - - code - cancellation_reason_id: - type: string - pattern: '^[0-9]+$' - required: - - order_id - - descriptor - - cancellation_reason_id - examples: - Cancel a ride with selected reason: - value: - context: - action: cancel - bap_id: api.beckn.juspay.in/pilot/bap/cab/v1 - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - bpp_id: api.beckn.juspay.in/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f - bpp_uri: 'https://api.example-bpp.com/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: be6a495a-e941-4fbf-9d59-f1e6166cccc8 - timestamp: '2023-03-23T05:15:08Z' - version: 1.1.0 - message: - cancellation_reason_id: '5' - order_id: b4232ad4-19ee-4c67-9223-a5189b13a741 - Cancel a ride with user provided information: - value: - context: - action: cancel - bap_id: api.beckn.juspay.in/pilot/bap/cab/v1 - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - bpp_id: api.beckn.juspay.in/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f - bpp_uri: 'https://api.example-bpp.com/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: be6a495a-e941-4fbf-9d59-f1e6166cccc8 - timestamp: '2023-03-23T05:15:08Z' - version: 1.1.0 - message: - cancellation_reason_id: '7' - descriptor: - short_desc: Accidenally booked the ride - order_id: b4232ad4-19ee-4c67-9223-a5189b13a741 - Cancel a transit ticket booking before the cancellation period: - value: - context: - action: cancel - bap_id: 'https://example-bap.com' - bap_uri: 'https://api.example-bap.com/beckn/' - bpp_id: 'https://transit-solutions.com' - bpp_uri: 'https://api.transit-solutions.com/beckn/' - domain: 'nic2008:49213' - location: - city: - code: 'std:080' - country: - code: IND - message_id: fde8b8b6-c2e5-49f7-b254-720843d528bd - timestamp: '2021-03-23T10:00:40.065Z' - transaction_id: 6f339232-2bc3-44d2-915c-30d2b053ce1d - version: 1.1.0 - message: - order: - cancellation_reason_id: '2' - id: '123413' - description: TODO - responses: - '200': - content: - application/json: - schema: - properties: - error: - $ref: '#/components/schemas/Error' - message: - properties: - ack: - $ref: '#/components/schemas/Ack' - required: - - ack - type: object - required: - - message - type: object - description: Acknowledgement of message received - tags: - - Beckn Provider Platform (BPP) - /on_search: - post: - description: Send catalog - operationId: on_search - requestBody: - content: - application/json: - schema: - allOf: - - type: object - properties: - context: - allOf: - - $ref: '#/components/schemas/Context' - error: - $ref: '#/components/schemas/Error' - message: - properties: - catalog: - $ref: '#/components/schemas/Catalog' - required: - - catalog - type: object - required: - - context - - message - - allOf: - - $ref: '#/paths/~1init/post/requestBody/content/application~1json/schema/allOf/1/allOf/0' - - properties: - context: - properties: - action: - type: string - enum: - - on_search - - properties: - message: - properties: - catalog: - type: object - properties: - descriptor: - type: object - properties: - name: - type: string - images: - type: array - items: - minItems: 1 - required: - - name - required: - - descriptor - - properties: - message: - properties: - catalog: - type: object - properties: - providers: - type: array - minItems: 1 - items: - type: object - properties: - id: - type: string - required: - - id - required: - - providers - - properties: - message: - properties: - catalog: - properties: - providers: - items: - properties: - fulfillments: - type: array - minItems: 1 - items: - properties: - vehicle: - properties: - category: - type: string - enum: - - AUTO_RICKSHAW - - CAB - required: - - category - type: - type: string - enum: - - DELIVERY - required: - - id - - vehicle - - type - required: - - fulfillments - - properties: - message: - properties: - catalog: - properties: - providers: - items: - properties: - items: - type: array - minItems: 1 - items: - type: object - properties: - descriptor: - type: object - properties: - name: - type: string - code: - type: string - enum: - - RIDE - required: - - code - price: - type: object - properties: - value: - type: string - pattern: ^-?\d+(\.\d+)?$ - required: - - value - - currency - fulfillment_ids: - type: array - minItems: 1 - payment_ids: - type: array - minItems: 1 - required: - - id - - descriptor - - price - - fulfillment_ids - - payment_ids - required: - - items - - properties: - message: - properties: - catalog: - properties: - providers: - items: - properties: - payments: - type: array - minItems: 1 - items: - type: object - properties: - type: - type: string - collected_by: - type: string - required: - - collected_by - required: - - payments - - properties: - message: - properties: - catalog: - properties: - providers: - items: - properties: - fulfillments: - items: - properties: - stops: - allOf: - - contains: - type: object - properties: - location: - type: object - properties: - gps: - type: string - required: - - gps - type: - const: START - required: - - location - - type - - contains: - type: object - properties: - location: - type: object - properties: - gps: - type: string - required: - - gps - type: - const: END - required: - - location - - type - required: - - stops - - allOf: - - allOf: - - properties: - message: - properties: - catalog: - properties: - providers: - items: - properties: - payments: - items: - properties: - tags: - items: - if: - properties: - descriptor: - properties: - code: - const: BUYER_FINDER_FEES - then: - properties: - list: - type: array - items: - type: object - properties: - descriptor: - properties: - code: - type: string - enum: - - BUYER_FINDER_FEES_PERCENTAGE - - properties: - message: - properties: - catalog: - properties: - providers: - items: - properties: - payments: - items: - properties: - tags: - items: - if: - properties: - descriptor: - properties: - code: - const: BUYER_FINDER_FEES - then: - properties: - list: - allOf: - - contains: - type: object - properties: - descriptor: - type: object - properties: - code: - const: BUYER_FINDER_FEES_PERCENTAGE - required: - - code - value: - type: string - required: - - descriptor - - value - - properties: - message: - properties: - catalog: - properties: - providers: - items: - properties: - payments: - items: - properties: - tags: - items: - if: - properties: - descriptor: - properties: - code: - const: BUYER_FINDER_FEES - then: - properties: - list: - type: array - items: - allOf: - - if: - properties: - descriptor: - properties: - code: - enum: - - BUYER_FINDER_FEES_PERCENTAGE - then: - properties: - value: - type: string - pattern: ^-?\d+(\.\d+)?$ - required: - - descriptor - - value - - allOf: - - properties: - message: - properties: - catalog: - properties: - providers: - items: - properties: - payments: - items: - properties: - tags: - items: - if: - properties: - descriptor: - properties: - code: - const: SETTLEMENT_TERMS - then: - properties: - list: - type: array - items: - type: object - properties: - descriptor: - properties: - code: - type: string - enum: - - SETTLEMENT_WINDOW - - SETTLEMENT_BASIS - - SETTLEMENT_TYPE - - MANDATORY_ARBITRATION - - COURT_JURISDICTION - - DELAY_INTEREST - - STATIC_TERMS - - SETTLEMENT_AMOUNT - - properties: - message: - properties: - catalog: - properties: - providers: - items: - properties: - payments: - items: - properties: - tags: - items: - if: - properties: - descriptor: - properties: - code: - const: SETTLEMENT_TERMS - then: - properties: - list: - allOf: - - contains: - type: object - properties: - descriptor: - type: object - properties: - code: - const: STATIC_TERMS - required: - - code - value: - type: string - required: - - descriptor - - value - - contains: - type: object - properties: - descriptor: - type: object - properties: - code: - const: SETTLEMENT_TYPE - required: - - code - value: - type: string - required: - - descriptor - - value - - contains: - type: object - properties: - descriptor: - type: object - properties: - code: - const: SETTLEMENT_WINDOW - required: - - code - value: - type: string - required: - - descriptor - - value - - properties: - message: - properties: - catalog: - properties: - providers: - items: - properties: - payments: - items: - properties: - tags: - items: - if: - properties: - descriptor: - properties: - code: - const: SETTLEMENT_TERMS - then: - properties: - list: - type: array - items: - allOf: - - if: - properties: - descriptor: - properties: - code: - const: SETTLEMENT_WINDOW - then: - properties: - value: - type: string - pattern: '^P(?!$)(?:\d+Y)?(?:\d+M)?(?:\d+W)?(?:\d+D)?(?:T(?=\d)(?:\d+H)?(?:\d+M)?(?:\d+S)?)?$' - required: - - descriptor - - value - - if: - properties: - descriptor: - properties: - code: - const: SETTLEMENT_BASIS - then: - properties: - value: - type: string - enum: - - INVOICE_RECEIPT - - DELIVERY - required: - - descriptor - - value - - if: - properties: - descriptor: - properties: - code: - const: MANDATORY_ARBITRATION - then: - properties: - value: - type: string - pattern: ^(true|false)$ - required: - - descriptor - - value - - if: - properties: - descriptor: - properties: - code: - const: STATIC_TERMS - then: - properties: - value: - type: string - format: uri - required: - - descriptor - - value - - if: - properties: - descriptor: - properties: - code: - const: COURT_JURISDICTION - then: - properties: - value: - type: string - required: - - descriptor - - value - - if: - properties: - descriptor: - properties: - code: - const: DELAY_INTEREST - then: - properties: - value: - type: string - pattern: '^\d+(\.\d{1,2})?$' - required: - - descriptor - - value - - if: - properties: - descriptor: - properties: - code: - const: SETTLEMENT_TYPE - then: - properties: - value: - type: string - enum: - - UPI - - NEFT - - RTGS - required: - - descriptor - - value - - if: - properties: - descriptor: - properties: - code: - const: SETTLEMENT_AMOUNT - then: - properties: - value: - type: string - pattern: '^\d+(\.\d{1,2})?$' - required: - - descriptor - - value - - properties: - message: - properties: - catalog: - properties: - providers: - items: - properties: - payments: - items: - properties: - tags: - allOf: - - contains: - properties: - descriptor: - type: object - properties: - code: - const: BUYER_FINDER_FEES - required: - - code - - contains: - properties: - descriptor: - type: object - properties: - code: - const: SETTLEMENT_TERMS - required: - - code - examples: - Return a mobility catalog with multiple providers: - value: - context: - action: on_search - bap_id: example-bap.in - bap_uri: 'https://api.example-bpp.in/path/to/url' - bpp_id: example-bpp.in - bpp_uri: 'https://api.example-bpp.in/path/to/url' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: 21e54d3c-9c3b-47c1-aa3b-b0e7b20818ee - timestamp: '2023-03-23T04:43:02Z' - transaction_id: 870782be-6757-43f1-945c-8eeaf9536259 - version: 1.1.0 - message: - catalog: - descriptor: - images: - - 'https://example-bpp.com/images/logos/oms.ico' - name: Open Mobility Solutions - providers: - - descriptor: - images: - - 'https://example-bpp.com/images/logos/acme.ico' - name: Acme Cabs - fulfillments: - - id: fb5c84d4-1b59-4b9d-96b5-9d79107432c5 - stops: - - location: - gps: '12.9099828, 77.6118226' - type: start - - location: - gps: '12.9351856, 77.6245996' - type: end - vehicle: - category: TAXI - id: '1' - items: - - descriptor: - name: Economy - fulfillment_ids: - - '1' - id: '1' - payment_ids: - - '1' - price: - currency: INR - value: '175' - - descriptor: - name: Premium - fulfillment_ids: - - '1' - id: '2' - payment_ids: - - '1' - price: - currency: INR - value: '250' - - descriptor: - name: Luxury - fulfillment_ids: - - '1' - id: '3' - payment_ids: - - '1' - price: - currency: INR - value: '500' - payments: - - collected_by: BPP - id: '1' - type: ON-FULFILLMENT - - descriptor: - images: - - 'https://example-bpp.com/images/logos/betataxis.ico' - name: Beta Taxis - fulfillments: - - id: 1 - stops: - - location: - gps: '12.9099828, 77.6118226' - type: start - - location: - gps: '12.9351856, 77.62459969999999' - type: end - vehicle: - category: TAXI - - id: 1 - stops: - - location: - gps: '12.9099828, 77.6118226' - type: start - - location: - gps: '12.9351856, 77.62459969999999' - type: end - vehicle: - category: TEMPO-TRAVELLER - id: '2' - items: - - descriptor: - name: Beta Prime - short_desc: 'Affordable sedans, at affordable costs' - fulfillment_ids: - - fb5c84d4-1b59-4b9d-96b5-9d79107432c5 - id: '1' - payment_ids: - - '1' - price: - currency: INR - value: '200' - - descriptor: - name: Beta Max - short_desc: Spacious vans for large groups - fulfillment_ids: - - fb5c84d4-1b59-4b9d-96b5-9d79107432c5 - id: '2' - payment_ids: - - '1' - price: - currency: INR - value: '1500' - payments: - - collected_by: BPP - id: '1' - type: ON-FULFILLMENT - Return a mobility catalog with no provider: - value: - context: - location: - action: on_search - bap_id: example-bap.com - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - bpp_id: example-bpp.com - bpp_uri: 'https://api.example-bpp.com/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f' - city: - code: 'std:080' - country: - code: IND - domain: 'nic2004:60221' - message_id: 21e54d3c-9c3b-47c1-aa3b-b0e7b20818ee - timestamp: '2023-03-23T04:43:02Z' - transaction_id: 870782be-6757-43f1-945c-8eeaf9536259 - version: 1.1.0 - message: - catalog: - descriptor: - name: InstaAuto - providers: - - fulfillments: - - id: fb5c84d4-1b59-4b9d-96b5-9d79107432c5 - stops: - - location: - address: '98 A, 6th Main Rd, Uttarahalli Hobli, Ramanjaneyanagar' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Ramanjaneyanagar - gps: '12.910458, 77.543089' - state: - name: Karnataka - type: start - - location: - address: 'Basavanagudi, Chikkanna Garden, Rangadore Memorial Hospital' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Chikkanna Garden - gps: '12.9535139, 77.5710434' - state: - name: Karnataka - type: end - vehicle: - category: AUTO_RICKSHAW - id: 1 - items: - - descriptor: - code: RIDE - name: Auto Ride - fulfillment_ids: - - fb5c84d4-1b59-4b9d-96b5-9d79107432c5 - id: 5777a0bf-9a08-49aa-a97d-1e5561a9622e - payment_ids: - - '1' - price: - currency: INR - maximum_value: '156' - minimum_value: '176' - value: 156 - 176 INR - locations: - - gps: '12.9164682,77.6089985' - id: '1' - - gps: '12.91671,77.6092983' - id: '2' - - gps: '12.9165733,77.6152167' - id: '3' - - gps: '12.9068578,77.6044567' - id: '4' - payments: - - collected_by: BPP - id: '1' - type: ON-FULFILLMENT - Return a public transit catalog of fare products: - value: - context: - action: on_search - bap_id: 'https://example-bap.com' - bap_uri: 'https://mock_bap.com/beckn/' - bpp_id: 'https://transit-solutions.com' - bpp_uri: 'https://api.transit-solutions.com/beckn/' - domain: 'nic2008:49213' - location: - city: - code: 'std:080' - country: - code: IND - message_id: fde8b8b6-c2e5-49f7-b254-720843d528bd - timestamp: '2021-03-23T10:00:40.065Z' - transaction_id: 6f339232-2bc3-44d2-915c-30d2b053ce1d - version: 1.1.0 - message: - catalog: - descriptor: - images: - - 'https://transitsolutions.in/logos/logo.ico' - name: Transit Solutions - providers: - - descriptor: - images: - - 'https://delhimetrorail.com/logos/logo.ico' - name: Delhi Metro Rail Limited - fulfillments: - - id: 1 - stops: - - location: - descriptor: - name: Dwarka Sector 10 - Blue Line - gps: '28.5811261,77.0548206' - type: start - - descriptor: - name: Patel Chowk - Yellow Line - gps: '28.6230972,77.2099917' - location: null - type: end - tags: - - descriptor: - name: Other Information - list: - - descriptor: - name: Transfers - display: true - value: '1' - - descriptor: - name: Duration - display: true - value: 60 min - vehicle: - category: METRO - - id: '2' - stops: - - location: - descriptor: - name: Dwarka Sector 10 - Blue Line - gps: '28.5811261,77.0548206' - type: start - - location: - descriptor: - name: Shivaji Stadium - Airport Express Line - gps: '28.6288785,77.2085895' - type: end - tags: - - descriptor: - name: Other Information - list: - - descriptor: - name: Transfers - display: true - value: '1' - - descriptor: - name: Duration - display: true - value: 45 min - vehicle: - category: METRO - - id: '3' - stops: - - location: - descriptor: - name: Dwarka Sector 21 - gps: '9.05,12.06' - time: - timestamp: '2021-10-15T00:32:19.000Z' - type: start - - location: - descriptor: - name: Shivaji Stadium - gps: '9.07,12.07' - time: - timestamp: '2021-10-15T00:43:21.000Z' - type: end - tags: - - descriptor: - name: Other Information - list: - - descriptor: - name: Transfers - display: true - value: '1' - - descriptor: - name: Duration - display: true - value: 30 min - vehicle: - category: METRO - id: '1' - items: - - descriptor: - images: - - 'https://delhimetrorail.com/icons/sjt.ico' - name: Single Journey Ticket - fulfillment_ids: - - '1' - id: '1' - price: - currency: '35' - value: INR - - descriptor: - images: - - 'https://delhimetrorail.com/icons/sjt.ico' - name: Single Journey Ticket - fulfillment_ids: - - '2' - id: '2' - price: - currency: '65' - value: INR - - descriptor: - images: - - 'https://delhimetrorail.com/icons/sjt.ico' - name: Single Journey Ticket - fulfillment_ids: - - '3' - id: '3' - price: - currency: '55' - value: INR - - descriptor: - images: - - 'https://delhimetrorail.com/icons/rjt.ico' - name: Return Journey Ticket - fulfillment_ids: - - '1' - id: '4' - price: - currency: '60' - value: INR - - descriptor: - images: - - 'https://delhimetrorail.com/icons/rjt.ico' - name: Return Journey Ticket - fulfillment_ids: - - '2' - id: '5' - price: - currency: '90' - value: INR - - descriptor: - images: - - 'https://delhimetrorail.com/icons/rjt.ico' - name: Return Journey Ticket - fulfillment_ids: - - '3' - id: '6' - price: - currency: '100' - value: INR - - descriptor: - images: - - 'https://delhimetrorail.com/icons/mp.ico' - name: Monthly Pass - id: '7' - price: - currency: INR - value: '250' - tags: - - descriptor: - name: Other Information - list: - - descriptor: - name: Timetable - display: true - value: 'https://delhimetrorail.com/timetable.html' - - descriptor: - name: GTFS Schedule - display: true - value: 'https://delhimetrorail.com/gtfs' - Return a single provider mobility catalog: - value: - context: - action: on_search - bap_id: example-bap.in - bap_uri: 'https://api.example-bpp.in/path/to/url' - bpp_id: example-bpp.in - bpp_uri: 'https://api.example-bpp.in/path/to/url' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: 21e54d3c-9c3b-47c1-aa3b-b0e7b20818ee - timestamp: '2023-03-23T04:43:02Z' - transaction_id: 870782be-6757-43f1-945c-8eeaf9536259 - version: 1.1.0 - message: - catalog: - descriptor: - name: Acme Taxis - providers: - - descriptor: - name: Acme Taxis - fulfillments: - - id: fb5c84d4-1b59-4b9d-96b5-9d79107432c5 - stops: - - location: - address: '98 A, 6th Main Rd, Uttarahalli Hobli, Ramanjaneyanagar' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Ramanjaneyanagar - gps: '12.910458, 77.543089' - state: - name: Karnataka - type: start - - location: - address: 'Basavanagudi, Chikkanna Garden, Rangadore Memorial Hospital' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Chikkanna Garden - gps: '12.9535139, 77.5710434' - state: - name: Karnataka - type: end - vehicle: - category: TAXI - id: '1' - items: - - descriptor: - code: RIDE - name: Economy - fulfillment_ids: - - fb5c84d4-1b59-4b9d-96b5-9d79107432c5 - id: 5777a0bf-9a08-49aa-a97d-1e5561a9622e - payment_ids: - - '1' - price: - currency: INR - value: '175' - tags: - - descriptor: - name: Daytime Charges - list: - - descriptor: - name: Min Fare upto 2 km - display: true - value: ₹ 30 upto 2 km - - descriptor: - name: Rate above Min. Fare - display: true - value: ₹15 / km - - descriptor: - name: Driver Pickup Charges - display: true - value: ₹ 10 - - descriptor: - name: Nominal Fare - short_desc: 'Driver may quote extra to cover for traffic, chance of return trip, etc.' - display: true - value: ₹ 10 - - descriptor: - name: Waiting Charges - short_desc: 'Driver may quote extra to cover for traffic, chance of return trip, etc.' - display: true - value: ₹ 0 / min - locations: - - gps: '12.9164682,77.6089985' - id: '1' - - gps: '12.91671,77.6092983' - id: '2' - - gps: '12.9165733,77.6152167' - id: '3' - - gps: '12.9068578,77.6044567' - id: '4' - payments: - - collected_by: BPP - id: '1' - type: ON-FULFILLMENT - Return a single provider mobility catalog (with some optional tags): - value: - context: - action: on_search - bap_id: example-bap.com - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - bpp_id: example-bpp.com - bpp_uri: 'https://api.example-bpp.com/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: 21e54d3c-9c3b-47c1-aa3b-b0e7b20818ee - timestamp: '2023-03-23T04:43:02Z' - transaction_id: 870782be-6757-43f1-945c-8eeaf9536259 - version: 1.1.0 - message: - catalog: - descriptor: - name: InstaAuto - providers: - - fulfillments: - - id: fb5c84d4-1b59-4b9d-96b5-9d79107432c5 - stops: - - location: - address: '98 A, 6th Main Rd, Uttarahalli Hobli, Ramanjaneyanagar' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Ramanjaneyanagar - gps: '12.910458, 77.543089' - state: - name: Karnataka - type: start - - location: - address: 'Basavanagudi, Chikkanna Garden, Rangadore Memorial Hospital' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Chikkanna Garden - gps: '12.9535139, 77.5710434' - state: - name: Karnataka - type: end - vehicle: - category: AUTO_RICKSHAW - items: - - descriptor: - code: RIDE - name: Auto Ride - fulfillment_ids: - - fb5c84d4-1b59-4b9d-96b5-9d79107432c5 - id: 5777a0bf-9a08-49aa-a97d-1e5561a9622e - payment_ids: - - '1' - price: - currency: INR - maximum_value: '156' - minimum_value: '176' - value: 156 - 176 INR - tags: - - descriptor: - name: Daytime Charges - list: - - descriptor: - name: Min Fare upto 2 km - display: true - value: ₹ 30 upto 2 km - - descriptor: - name: Rate above Min. Fare - display: true - value: ₹15 / km - - descriptor: - name: Driver Pickup Charges - display: true - value: ₹ 10 - - descriptor: - name: Nominal Fare - short_desc: 'Driver may quote extra to cover for traffic, chance of return trip, etc.' - display: true - value: ₹ 10 - - descriptor: - name: Waiting Charges - short_desc: 'Driver may quote extra to cover for traffic, chance of return trip, etc.' - display: true - value: ₹ 0 / min - - descriptor: - name: Night Charges - list: - - descriptor: - name: Night Charges - display: true - value: 1.5x of daytime charges applicable at night from 10 PM to 5 AM - - descriptor: - name: Night Shift Start - display: true - value: '22:00:00' - - descriptor: - name: Night Shift End - display: true - value: '05:00:00' - - descriptor: - name: General Information - list: - - descriptor: - name: Distance to nearest driver - display: true - value: 661 m - - descriptor: - name: Wait time upto - display: true - value: 3 min - locations: - - gps: '12.9164682,77.6089985' - id: '1' - - gps: '12.91671,77.6092983' - id: '2' - - gps: '12.9165733,77.6152167' - id: '3' - - gps: '12.9068578,77.6044567' - id: '4' - payments: - - collected_by: BPP - id: '1' - type: ON-FULFILLMENT - responses: - '200': - content: - application/json: - schema: - properties: - error: - $ref: '#/components/schemas/Error' - message: - properties: - ack: - $ref: '#/components/schemas/Ack' - required: - - ack - type: object - required: - - context - type: object - description: Acknowledgement of message received - tags: - - Beckn App Platform (BAP) - - Beckn Gateway (BG) - /on_select: - post: - description: Send draft order object with quoted price for selected items - operationId: on_select - requestBody: - content: - application/json: - schema: - allOf: - - type: object - properties: - context: - allOf: - - $ref: '#/components/schemas/Context' - error: - $ref: '#/components/schemas/Error' - message: - properties: - order: - allOf: - - $ref: '#/components/schemas/Order' - required: - - order - type: object - required: - - context - - message - - allOf: - - $ref: '#/paths/~1init/post/requestBody/content/application~1json/schema/allOf/1/allOf/0' - - properties: - context: - properties: - action: - type: string - enum: - - on_select - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/2' - - $ref: '#/paths/~1confirm/post/requestBody/content/application~1json/schema/allOf/1/allOf/4' - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/4' - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/5' - - allOf: - - properties: - message: - properties: - order: - properties: - fulfillments: - type: array - minItems: 1 - items: - required: - - id - required: - - fulfillments - - properties: - message: - properties: - order: - properties: - fulfillments: - type: array - minItems: 1 - items: - type: object - properties: - state: - type: object - properties: - descriptor: - type: object - properties: - code: - type: string - enum: - - RIDE_ASSIGNED - - RIDE_ENROUTE_PICKUP - - RIDE_ARRIVED_PICKUP - - RIDE_STARTED - - RIDE_ENDED - - RIDE_CANCELLED - required: - - code - - properties: - message: - properties: - order: - properties: - fulfillments: - type: array - minItems: 1 - items: - properties: - stops: - items: - properties: - authorization: - type: object - properties: - type: - type: string - enum: - - OTP - - QR - token: - type: string - pattern: ^-?\d+(\.\d+)?$ - required: - - type - - token - - properties: - message: - properties: - order: - properties: - fulfillments: - items: - properties: - stops: - allOf: - - contains: - type: object - properties: - location: - type: object - properties: - gps: - type: string - required: - - gps - type: - const: START - required: - - location - - type - - contains: - type: object - properties: - location: - type: object - properties: - gps: - type: string - required: - - gps - type: - const: END - required: - - location - - type - required: - - stops - - properties: - message: - properties: - order: - properties: - fulfillments: - type: array - minItems: 1 - items: - type: object - properties: - vehicle: - properties: - category: - type: string - enum: - - AUTO_RICKSHAW - - CAB - required: - - category - required: - - vehicle - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/7' - - properties: - message: - properties: - order: - properties: - fulfillments: - type: array - items: - allOf: - - not: - required: - - agent - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/8' - examples: - Return a quote offered by a public transit service provider: - value: - context: - action: on_select - bap_id: 'https://example-bap.com' - bap_uri: 'https://mock_bap.com/beckn/' - bpp_id: 'https://transit-solutions.com' - bpp_uri: 'https://api.transit-solutions.com/beckn/' - domain: 'nic2008:49213' - location: - city: - code: 'std:080' - country: - code: IND - message_id: fde8b8b6-c2e5-49f7-b254-720843d528bd - timestamp: '2021-03-23T10:00:40.065Z' - transaction_id: 6f339232-2bc3-44d2-915c-30d2b053ce1d - version: 1.1.0 - message: - order: - fulfillments: - - id: '3' - stops: - - location: - descriptor: - name: Dwarka Sector 21 - gps: '9.05,12.06' - time: - timestamp: '2021-10-15T00:32:19.000Z' - type: start - - location: - descriptor: - name: Shivaji Stadium - gps: '9.07,12.07' - time: - timestamp: '2021-10-15T00:43:21.000Z' - type: end - tags: - - descriptor: - name: Other Information - list: - - descriptor: - name: Transfers - display: true - value: '1' - - descriptor: - name: Duration - display: true - value: 30 min - vehicle: - category: METRO - id: '123413' - items: - - descriptor: - images: - - 'https://delhimetrorail.com/icons/sjt.ico' - name: Single Journey Ticket - fulfillment_ids: - - '3' - id: '3' - price: - currency: '55' - value: INR - tags: - - descriptor: null - list: - - descriptor: - name: Validity - display: true - value: 24 hours from the time of purchase - name: Other Information - provider: - descriptor: - images: - - 'https://delhimetrorail.com/logos/logo.ico' - name: Delhi Metro Rail Limited - id: '1' - quote: - breakup: - - price: - currency: INR - value: '55' - title: Single Journey Ticket X 1 - - price: - currency: INR - value: '2.75' - title: CGST @ 5% - - price: - currency: INR - value: '2.75' - title: SGST @ 5% - price: - currency: INR - value: '60.5' - Return a quote offered by a ride hailing service provider: - value: - context: - action: on_select - bap_id: example-bap.com - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - bpp_id: example-bpp.com - bpp_uri: 'https://api.example-bpp.com/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: 8926b747-0362-4fcc-b795-0994a6287700 - timestamp: '2023-03-23T04:48:53Z' - transaction_id: 870782be-6757-43f1-945c-8eeaf9536259 - version: 1.1.0 - message: - order: - fulfillments: - - id: fulf_5cf064d5-4c0a-42d3-b73d-5f19a6f7468e - stops: - - location: - address: '98 A, 6th Main Rd, Uttarahalli Hobli, Ramanjaneyanagar' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Ramanjaneyanagar - gps: '12.910458, 77.543089' - state: - name: Karnataka - type: start - - location: - address: 'Basavanagudi, Chikkanna Garden, Rangadore Memorial Hospital' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Chikkanna Garden - gps: '12.9535139, 77.5710434' - state: - name: Karnataka - type: end - vehicle: - category: AUTO_RICKSHAW - items: - - descriptor: - code: RIDE - name: Auto Ride - fulfillment_ids: - - fb5c84d4-1b59-4b9d-96b5-9d79107432c5 - id: 5777a0bf-9a08-49aa-a97d-1e5561a9622e - payment_ids: - - '1' - tags: - - descriptor: - name: Daytime Charges - list: - - descriptor: - name: Min Fare upto 2 km - display: true - value: ₹ 30 upto 2 km - - descriptor: - name: Rate above Min. Fare - display: true - value: ₹15 / km - - descriptor: - name: Driver Pickup Charges - display: true - value: ₹ 10 - - descriptor: - name: Nominal Fare - short_desc: 'Driver may quote extra to cover for traffic, chance of return trip, etc.' - display: true - value: ₹ 10 - - descriptor: - name: Waiting Charges - short_desc: 'Driver may quote extra to cover for traffic, chance of return trip, etc.' - display: true - value: ₹ 0 / min - - descriptor: - name: Night Charges - list: - - descriptor: - name: Night Charges - display: true - value: 1.5x of daytime charges applicable at night from 10 PM to 5 AM - - descriptor: - name: Night Shift Start - display: true - value: '22:00:00' - - descriptor: - name: Night Shift End - display: true - value: '05:00:00' - - descriptor: - name: General Information - list: - - descriptor: - name: Distance to nearest driver - display: true - value: 661 m - - descriptor: - name: Wait time upto - display: true - value: 3 min - provider: - descriptor: - name: Acme Taxis - id: '1' - quote: - breakup: - - price: - currency: INR - value: '30' - title: Base Fare - - price: - currency: INR - value: '56' - title: Per km fare - price: - currency: INR - value: '76' - ttl: P200S - description: TODO - responses: - '200': - content: - application/json: - schema: - properties: - error: - $ref: '#/components/schemas/Error' - message: - properties: - ack: - $ref: '#/components/schemas/Ack' - required: - - ack - type: object - required: - - message - type: object - description: Acknowledgement of message received - tags: - - Beckn App Platform (BAP) - /on_init: - post: - description: Send order object with payment details updated - operationId: on_init - requestBody: - content: - application/json: - schema: - allOf: - - properties: - context: - allOf: - - $ref: '#/components/schemas/Context' - error: - $ref: '#/components/schemas/Error' - message: - properties: - order: - allOf: - - $ref: '#/components/schemas/Order' - required: - - order - type: object - required: - - context - type: object - - allOf: - - $ref: '#/paths/~1init/post/requestBody/content/application~1json/schema/allOf/1/allOf/0' - - properties: - context: - properties: - action: - type: string - enum: - - on_init - - properties: - message: - properties: - order: - properties: - provider: - type: object - properties: - id: - type: string - required: - - id - required: - - provider - - $ref: '#/paths/~1confirm/post/requestBody/content/application~1json/schema/allOf/1/allOf/4' - - properties: - message: - properties: - order: - properties: - items: - items: - properties: - tags: - allOf: - - contains: - properties: - descriptor: - type: object - properties: - code: - const: FARE_POLICY - required: - - code - - contains: - properties: - descriptor: - type: object - properties: - code: - const: INFO - required: - - code - - properties: - message: - properties: - order: - properties: - items: - type: array - minItems: 1 - items: - type: object - properties: - fulfillment_ids: - minItems: 1 - location_ids: - minItems: 1 - required: - - fulfillment_ids - - location_ids - - $ref: '#/paths/~1init/post/requestBody/content/application~1json/schema/allOf/1/allOf/3' - - properties: - message: - properties: - order: - properties: - fulfillments: - type: array - minItems: 1 - items: - type: object - properties: - type: - type: string - enum: - - DELIVERY - required: - - type - - allOf: - - properties: - message: - properties: - order: - properties: - quote: - type: object - properties: - price: - type: object - properties: - currency: - type: string - value: - type: string - pattern: '^\d+(\.\d{1,2})?$' - required: - - currency - - value - breakup: - type: array - items: - type: object - properties: - price: - type: object - properties: - currency: - type: string - value: - type: string - pattern: '^\d+(\.\d{1,2})?$' - required: - - currency - - value - title: - type: string - enum: - - BASE_FARE - - DISTANCE_FARE - - TAX - - DISCOUNT - - WAITING_CHARG - - CANCELLATION_CHARGES - required: - - price - - title - required: - - price - - breakup - required: - - quote - - properties: - message: - properties: - order: - properties: - quote: - properties: - breakup: - allOf: - - contains: - type: object - properties: - title: - const: BASE_FARE - price: - type: object - properties: - value: - type: string - required: - - value - required: - - title - - price - - contains: - type: object - properties: - title: - const: DISTANCE_FARE - price: - type: object - properties: - value: - type: string - required: - - value - required: - - title - - price - - $ref: '#/paths/~1confirm/post/requestBody/content/application~1json/schema/allOf/1/allOf/5' - - properties: - message: - properties: - order: - properties: - cancellation_terms: - items: - properties: - fulfillment_state: - properties: - descriptor: - properties: - code: - type: string - enum: - - RIDE_ASSIGNED - - RIDE_ENROUTE_PICKUP - - RIDE_ARRIVED_PICKUP - - RIDE_STARTED - required: - - code - cancellation_fee: - oneOf: - - properties: - percentage: - type: string - pattern: '^(100(\.0{1,2})?|(\d{1,2})(\.\d{1,2})?)$' - required: - - percentage - - properties: - amount: - properties: - value: - type: string - pattern: '^[+-]?(\d+(\.\d*)?|\.\d+)$' - required: - - currency - - value - required: - - amount - required: - - fulfillment_state - - cancellation_fee - required: - - cancellation_terms - - properties: - message: - type: object - required: - - message - examples: - Return draft order for transit ticket with T+1 settlment via bank transfer: - value: - context: - action: on_init - bap_id: 'https://example-bap.com' - bap_uri: 'https://api.example-bap.com/beckn/' - bpp_id: 'https://transit-solutions.com' - bpp_uri: 'https://api.transit-solutions.com/beckn/' - domain: 'nic2008:49213' - location: - city: - code: 'std:080' - country: - code: IND - message_id: fde8b8b6-c2e5-49f7-b254-720843d528bd - timestamp: '2021-03-23T10:00:40.065Z' - transaction_id: 6f339232-2bc3-44d2-915c-30d2b053ce1d - version: 1.1.0 - message: - order: - billing: - email: john.doe@example.com - name: John Doe - cancellation_terms: - - external_ref: - url: 'https://dmrc.com/fare_products/sjt/cancellation_terms.html' - fulfillments: - - id: '3' - stops: - - instructions: - name: 'Show this ticket at the QR code scanner at the entry gate. If the QR code scanner is not present, show this at the ticket counter to get your token' - location: - descriptor: - name: Dwarka Sector 21 - gps: '9.05,12.06' - time: - timestamp: '2021-10-15T00:32:19.000Z' - type: start - - location: - descriptor: - name: Shivaji Stadium - gps: '9.07,12.07' - time: - timestamp: '2021-10-15T00:43:21.000Z' - type: end - tags: - - descriptor: - name: Other Information - list: - - descriptor: - name: Transfers - display: true - value: '0' - - descriptor: - name: Duration - display: true - value: 30 min - vehicle: - category: METRO - items: - - descriptor: - images: - - 'https://delhimetrorail.com/icons/sjt.ico' - name: Single Journey Ticket - fulfillment_ids: - - '3' - id: '3' - price: - currency: '55' - value: INR - tags: - - descriptor: - name: Other Information - list: - - descriptor: - name: Validity - display: true - value: 24 hours from the time of purchase - payment: - params: - amount: '60.5' - bank_account_number: '32756678999' - bank_code: SBIN0000575 - currency: INR - transaction_id: '24566345563' - status: NOT-PAID - time: - range: - end: '2021-03-24T10:00:40.065Z' - start: '2021-03-23T10:00:40.065Z' - type: POST-FULFILLMENT - provider: - descriptor: - images: - - 'https://delhimetrorail.com/logos/logo.ico' - name: Delhi Metro Rail Limited - id: '1' - quote: - breakup: - - price: - currency: INR - value: '55' - title: Single Journey Ticket X 1 - - price: - currency: INR - value: '2.75' - title: CGST @ 5% - - price: - currency: INR - value: '2.75' - title: SGST @ 5% - price: - currency: '60.5' - value: INR - Return draft order for transit ticket with settlement via payment link: - value: - context: - action: on_init - bap_id: 'https://example-bap.com' - bap_uri: 'https://api.example-bap.com/beckn/' - bpp_id: 'https://transit-solutions.com' - bpp_uri: 'https://api.transit-solutions.com/beckn/' - domain: 'nic2008:49213' - location: - city: - code: 'std:080' - country: - code: IND - message_id: fde8b8b6-c2e5-49f7-b254-720843d528bd - timestamp: '2021-03-23T10:00:40.065Z' - transaction_id: 6f339232-2bc3-44d2-915c-30d2b053ce1d - version: 1.1.0 - message: - order: - billing: - email: john.doe@example.com - name: John Doe - cancellation_terms: - - external_ref: - url: 'https://dmrc.com/fare_products/sjt/cancellation_terms.html' - fulfillments: - - id: '3' - stops: - - instructions: - name: 'Show this ticket at the QR code scanner at the entry gate. If the QR code scanner is not present, show this at the ticket counter to get your token' - location: - descriptor: - name: Dwarka Sector 21 - gps: '9.05,12.06' - time: - timestamp: '2021-10-15T00:32:19.000Z' - type: start - - location: - descriptor: - name: Shivaji Stadium - gps: '9.07,12.07' - time: - timestamp: '2021-10-15T00:43:21.000Z' - type: end - tags: - - descriptor: - name: Other Information - list: - - descriptor: - name: Transfers - display: true - value: '0' - - descriptor: - name: Duration - display: true - value: 30 min - vehicle: - category: METRO - items: - - descriptor: - images: - - 'https://delhimetrorail.com/icons/sjt.ico' - name: Single Journey Ticket - fulfillment_ids: - - '3' - id: '3' - price: - currency: '55' - value: INR - tags: - - descriptor: - name: Other Information - list: - - descriptor: - name: Validity - display: true - value: 24 hours from the time of purchase - payments: - - tl_method: GET - type: ON-ORDER - uri: 'https://pay.razorpay.com?amt=60.5&cur=INR&ref=24566345563' - provider: - descriptor: - images: - - 'https://delhimetrorail.com/logos/logo.ico' - name: Delhi Metro Rail Limited - id: '1' - quote: - breakup: - - price: - currency: INR - value: '55' - title: Single Journey Ticket X 1 - - price: - currency: INR - value: '2.75' - title: CGST @ 5% - - price: - currency: INR - value: '2.75' - title: SGST @ 5% - price: - currency: '60.5' - value: INR - Return draft ride hailing order with payment after ride completion: - value: - context: - action: on_init - bap_id: example-bap.com - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - bpp_id: example-bpp.com - bpp_uri: 'https://api.example-bpp.com/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: 8926b747-0362-4fcc-b795-0994a6287700 - timestamp: '2023-03-23T04:48:53Z' - transaction_id: b580c989-f84d-4abe-af28-2c818aafce3b - version: 1.1.0 - message: - order: - fulfillments: - - customer: - contact: - phone: +91-9897867564 - person: - language: - code: en - name: English - name: John Doe - id: fulf_5cf064d5-4c0a-42d3-b73d-5f19a6f7468e - stops: - - location: - address: '98 A, 6th Main Rd, Uttarahalli Hobli, Ramanjaneyanagar' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Ramanjaneyanagar - gps: '12.910458, 77.543089' - state: - name: Karnataka - type: start - - location: - address: 'Basavanagudi, Chikkanna Garden, Rangadore Memorial Hospital' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Chikkanna Garden - gps: '12.9535139, 77.5710434' - state: - name: Karnataka - type: end - vehicle: - category: AUTO_RICKSHAW - items: - - descriptor: - code: RIDE - name: Auto Ride - fulfillment_ids: - - fb5c84d4-1b59-4b9d-96b5-9d79107432c5 - id: 5777a0bf-9a08-49aa-a97d-1e5561a9622e - payment_ids: - - '1' - tags: - - descriptor: - name: Daytime Charges - list: - - descriptor: - name: Min Fare upto 2 km - display: true - value: ₹ 30 upto 2 km - - descriptor: - name: Rate above Min. Fare - display: true - value: ₹15 / km - - descriptor: - name: Driver Pickup Charges - display: true - value: ₹ 10 - - descriptor: - name: Nominal Fare - short_desc: 'Driver may quote extra to cover for traffic, chance of return trip, etc.' - display: true - value: ₹ 10 - - descriptor: - name: Waiting Charges - short_desc: 'Driver may quote extra to cover for traffic, chance of return trip, etc.' - display: true - value: ₹ 0 / min - - descriptor: - name: Night Charges - list: - - descriptor: - name: Night Charges - display: true - value: 1.5x of daytime charges applicable at night from 10 PM to 5 AM - - descriptor: - name: Night Shift Start - display: true - value: '22:00:00' - - descriptor: - name: Night Shift End - display: true - value: '05:00:00' - - descriptor: - name: General Information - list: - - descriptor: - name: Distance to nearest driver - display: true - value: 661 m - - descriptor: - name: Wait time upto - display: true - value: 3 min - payments: - - id: 7f7896dd-787e-4a0b-8675-e9e6fe93bb8f - params: - amount: '81' - currency: INR - status: NOT-PAID - type: ON-FULFILLMENT - provider: - descriptor: - name: Acme Taxis - id: '1' - quote: - breakup: - - price: - currency: INR - value: '30' - title: Base Fare - - price: - currency: INR - value: '56' - title: Per km fare - - price: - currency: INR - value: '2.5' - title: CGST @ 5% - - price: - currency: INR - value: '2.5' - title: SGST @ 5% - price: - currency: INR - value: '81' - description: TODO - responses: - '200': - content: - application/json: - schema: - properties: - error: - $ref: '#/components/schemas/Error' - message: - properties: - ack: - $ref: '#/components/schemas/Ack' - required: - - ack - type: object - required: - - message - type: object - description: Acknowledgement of message received - tags: - - Beckn App Platform (BAP) - /on_confirm: - post: - description: Send active order object - operationId: on_confirm - requestBody: - content: - application/json: - schema: - allOf: - - type: object - properties: - context: - allOf: - - $ref: '#/components/schemas/Context' - error: - $ref: '#/components/schemas/Error' - message: - properties: - order: - $ref: '#/components/schemas/Order' - required: - - order - type: object - required: - - context - - message - - allOf: - - $ref: '#/paths/~1init/post/requestBody/content/application~1json/schema/allOf/1/allOf/0' - - properties: - context: - properties: - action: - type: string - enum: - - on_confirm - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/2' - - $ref: '#/paths/~1confirm/post/requestBody/content/application~1json/schema/allOf/1/allOf/4' - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/4' - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/5' - - $ref: '#/paths/~1on_status/post/requestBody/content/application~1json/schema/allOf/1/allOf/6' - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/7' - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/8' - - $ref: '#/paths/~1confirm/post/requestBody/content/application~1json/schema/allOf/1/allOf/5' - - properties: - message: - properties: - order: - properties: - status: - type: string - enum: - - COMPLETE - - ACTIVE - required: - - status - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/10' - - properties: - message: - properties: - order: - properties: - status: - type: string - enum: - - COMPLETE - - ACTIVE - - CANCELLED - - SOFT_CANCEL - required: - - status - - $ref: '#/paths/~1on_status/post/requestBody/content/application~1json/schema/allOf/1/allOf/11' - - $ref: '#/paths/~1on_status/post/requestBody/content/application~1json/schema/allOf/1/allOf/13' - - $ref: '#/paths/~1on_status/post/requestBody/content/application~1json/schema/allOf/1/allOf/12' - - $ref: '#/paths/~1on_status/post/requestBody/content/application~1json/schema/allOf/1/allOf/14' - examples: - Return confirmed order with latest fulfillment details: - value: - context: - action: on_confirm - bap_id: example-bap.com - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - bpp_id: example-bpp.com - bpp_uri: 'https://api.example-bpp.com/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: 8926b747-0362-4fcc-b795-0994a6287700 - timestamp: '2023-03-23T04:48:53Z' - transaction_id: b580c989-f84d-4abe-af28-2c818aafce3b - version: 1.1.0 - message: - order: - fulfillments: - - agent: - contact: - phone: +91-98978675645 - person: - name: RAGHAVENDRA J - rating: '5' - customer: - contact: - phone: +91-9897867564 - person: - language: - code: en - name: English - name: John Doe - id: fulf_5cf064d5-4c0a-42d3-b73d-5f19a6f7468e - state: - descriptor: - code: DRIVER_EN_ROUTE - name: Driver is on the way - stops: - - authorization: - token: '234234' - type: OTP - location: - address: '98 A, 6th Main Rd, Uttarahalli Hobli, Ramanjaneyanagar' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Ramanjaneyanagar - gps: '12.910458, 77.543089' - state: - name: Karnataka - type: start - - location: - address: 'Basavanagudi, Chikkanna Garden, Rangadore Memorial Hospital' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Chikkanna Garden - gps: '12.9535139, 77.5710434' - state: - name: Karnataka - type: end - vehicle: - category: AUTO_RICKSHAW - registration: KA01JG1231 - id: 7751bd26-3fdc-47ca-9b64-e998dc5abe68 - items: - - descriptor: - code: RIDE - name: Auto Ride - fulfillment_ids: - - fb5c84d4-1b59-4b9d-96b5-9d79107432c5 - id: 5777a0bf-9a08-49aa-a97d-1e5561a9622e - payment_ids: - - '1' - tags: - - descriptor: - name: Daytime Charges - list: - - descriptor: - name: Min Fare upto 2 km - display: true - value: ₹ 30 upto 2 km - - descriptor: - name: Rate above Min. Fare - display: true - value: ₹15 / km - - descriptor: - name: Driver Pickup Charges - display: true - value: ₹ 10 - - descriptor: - name: Nominal Fare - short_desc: 'Driver may quote extra to cover for traffic, chance of return trip, etc.' - display: true - value: ₹ 10 - - descriptor: - name: Waiting Charges - short_desc: 'Driver may quote extra to cover for traffic, chance of return trip, etc.' - display: true - value: ₹ 0 / min - - descriptor: - name: Night Charges - list: - - descriptor: - name: Night Charges - display: true - value: 1.5x of daytime charges applicable at night from 10 PM to 5 AM - - descriptor: - name: Night Shift Start - display: true - value: '22:00:00' - - descriptor: - name: Night Shift End - display: true - value: '05:00:00' - - descriptor: - name: General Information - list: - - descriptor: - name: Distance to nearest driver - display: true - value: 661 m - - descriptor: - name: Wait time upto - display: true - value: 3 min - payments: - - id: 7f7896dd-787e-4a0b-8675-e9e6fe93bb8f - params: - amount: '81' - currency: INR - status: NOT-PAID - type: ON-FULFILLMENT - provider: - descriptor: - name: Acme Tais - id: '1' - quote: - breakup: - - price: - currency: INR - value: '30' - title: Base Fare - - price: - currency: INR - value: '56' - title: Per km fare - - price: - currency: INR - value: '2.5' - title: CGST @ 5% - - price: - currency: INR - value: '2.5' - title: SGST @ 5% - price: - currency: INR - value: '81' - Return confirmed ticket order with T+1 pending settlement: - value: - context: - action: on_confirm - bap_id: 'https://example-bap.com' - bap_uri: 'https://api.example-bap.com/beckn/' - bpp_id: 'https://transit-solutions.com' - bpp_uri: 'https://api.transit-solutions.com/beckn/' - domain: 'nic2008:49213' - location: - city: - code: 'std:080' - country: - code: IND - message_id: fde8b8b6-c2e5-49f7-b254-720843d528bd - timestamp: '2021-03-23T10:00:40.065Z' - transaction_id: 6f339232-2bc3-44d2-915c-30d2b053ce1d - version: 1.1.0 - message: - order: - billing: - email: john.doe@example.com - name: John Doe - cancellation_terms: - - external_ref: - url: 'https://dmrc.com/fare_products/sjt/cancellation_terms.html' - fulfillments: - - id: '3' - state: - descriptor: - name: Ticket issued - stops: - - instructions: - name: 'Show this ticket at the QR code scanner at the entry gate. If the QR code scanner is not present, show this at the ticket counter to get your token' - location: - descriptor: - name: Dwarka Sector 21 - gps: '9.05,12.06' - time: - timestamp: '2021-10-15T00:32:19.000Z' - type: start - - location: - descriptor: - name: Shivaji Stadium - gps: '9.07,12.07' - time: - timestamp: '2021-10-15T00:43:21.000Z' - type: end - tags: - - descriptor: - name: Other Information - list: - - descriptor: - name: Transfers - display: true - value: '0' - - descriptor: - name: Duration - display: true - value: 30 min - vehicle: - category: METRO - id: '123413' - items: - - descriptor: - images: - - 'https://delhimetrorail.com/icons/sjt.ico' - name: Single Journey Ticket - fulfillment_ids: - - '3' - id: '3' - price: - currency: '55' - value: INR - tags: - - descriptor: - name: Other Information - list: - - descriptor: - name: Validity - display: true - value: 24 hours from the time of purchase - payments: - - params: - amount: '60.5' - bank_account_number: '32756678999' - bank_code: SBIN0000575 - currency: INR - transaction_id: '24566345563' - status: NOT-PAID - time: - range: - end: '2021-03-24T10:00:40.065Z' - start: '2021-03-23T10:00:40.065Z' - type: POST-FULFILLMENT - provider: - descriptor: - images: - - 'https://delhimetrorail.com/logos/logo.ico' - name: Delhi Metro Rail Limited - id: '1' - quote: - breakup: - - price: - currency: INR - value: '55' - title: Single Journey Ticket X 1 - - price: - currency: INR - value: '2.75' - title: CGST @ 5% - - price: - currency: INR - value: '2.75' - title: SGST @ 5% - price: - currency: '60.5' - value: INR - Return confirmed ticket order with payment confirmation: - value: - context: - action: on_confirm - bap_id: 'https://example-bap.com' - bap_uri: 'https://api.example-bap.com/beckn/' - bpp_id: 'https://transit-solutions.com' - bpp_uri: 'https://api.transit-solutions.com/beckn/' - domain: 'nic2008:49213' - location: - city: - code: 'std:080' - country: - code: IND - message_id: fde8b8b6-c2e5-49f7-b254-720843d528bd - timestamp: '2021-03-23T10:00:40.065Z' - transaction_id: 6f339232-2bc3-44d2-915c-30d2b053ce1d - version: 1.1.0 - message: - order: - billing: - email: john.doe@example.com - name: John Doe - cancellation_terms: - - external_ref: - url: 'https://dmrc.com/fare_products/sjt/cancellation_terms.html' - fulfillments: - - id: '3' - stops: - - instructions: - name: 'Show this ticket at the QR code scanner at the entry gate. If the QR code scanner is not present, show this at the ticket counter to get your token' - location: - descriptor: - name: Dwarka Sector 21 - gps: '9.05,12.06' - time: - timestamp: '2021-10-15T00:32:19.000Z' - type: start - - location: - descriptor: - name: Shivaji Stadium - gps: '9.07,12.07' - time: - timestamp: '2021-10-15T00:43:21.000Z' - type: end - tags: - - descriptor: - name: Other Information - list: - - descriptor: - name: Transfers - display: true - value: '0' - - descriptor: - name: Duration - display: true - value: 30 min - vehicle: - category: METRO - id: '123413' - items: - - descriptor: - images: - - 'https://delhimetrorail.com/icons/sjt.ico' - name: Single Journey Ticket - fulfillment_ids: - - '3' - id: '3' - price: - currency: '55' - value: INR - tags: - - descriptor: - name: Other Information - list: - - descriptor: - name: Validity - display: true - value: 24 hours from the time of purchase - payments: - - params: - amount: '60.5' - currency: INR - transaction_id: '24566345563' - status: PAID - type: ON-ORDER - provider: - descriptor: - images: - - 'https://delhimetrorail.com/logos/logo.ico' - name: Delhi Metro Rail Limited - id: '1' - quote: - breakup: - - price: - currency: INR - value: '55' - title: Single Journey Ticket X 1 - - price: - currency: INR - value: '2.75' - title: CGST @ 5% - - price: - currency: INR - value: '2.75' - title: SGST @ 5% - price: - currency: '60.5' - value: INR - description: TODO - responses: - '200': - content: - application/json: - schema: - properties: - error: - $ref: '#/components/schemas/Error' - message: - properties: - ack: - $ref: '#/components/schemas/Ack' - required: - - ack - type: object - required: - - message - type: object - description: Acknowledgement of message received - tags: - - Beckn App Platform (BAP) - /on_status: - post: - description: Fetch the status of a Service - operationId: on_status - requestBody: - content: - application/json: - schema: - allOf: - - properties: - context: - allOf: - - $ref: '#/components/schemas/Context' - error: - $ref: '#/components/schemas/Error' - message: - properties: - order: - $ref: '#/components/schemas/Order' - required: - - order - type: object - required: - - context - type: object - - allOf: - - $ref: '#/paths/~1init/post/requestBody/content/application~1json/schema/allOf/1/allOf/0' - - properties: - context: - properties: - action: - type: string - enum: - - on_status - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/2' - - $ref: '#/paths/~1confirm/post/requestBody/content/application~1json/schema/allOf/1/allOf/4' - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/4' - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/5' - - allOf: - - $ref: '#/paths/~1confirm/post/requestBody/content/application~1json/schema/allOf/1/allOf/3' - - properties: - message: - properties: - order: - properties: - fulfillments: - type: array - items: - allOf: - - properties: - agent: - properties: - contact: - properties: - phone: - type: string - pattern: '^\+?[1-9]\d{1,14}$' - required: - - phone - person: - properties: - name: - type: string - required: - - name - required: - - contact - - person - required: - - agent - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/7' - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/8' - - $ref: '#/paths/~1confirm/post/requestBody/content/application~1json/schema/allOf/1/allOf/5' - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/10' - - properties: - message: - properties: - order: - properties: - payments: - type: array - items: - properties: - type: - type: string - params: - type: object - properties: - transaction_id: - type: string - required: - - type - allOf: - - if: - properties: - type: - const: PRE-ORDER - then: - properties: - params: - required: - - transaction_id - - properties: - message: - properties: - order: - properties: - fulfillments: - type: array - items: - properties: - vehicle: - type: object - properties: - registration: - type: string - required: - - registration - - make - - model - required: - - vehicle - - properties: - message: - properties: - order: - properties: - fulfillments: - items: - required: - - state - - properties: - message: - properties: - order: - required: - - id - examples: - Return order with latest fulfillment status - Driver en-route to pickup: - value: - context: - action: on_status - bap_id: example-bap.com - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - bpp_id: example-bpp.com - bpp_uri: 'https://api.example-bpp.com/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: 8926b747-0362-4fcc-b795-0994a6287700 - timestamp: '2023-03-23T04:48:53Z' - transaction_id: b580c989-f84d-4abe-af28-2c818aafce3b - version: 1.1.0 - message: - order: - fulfillments: - - agent: - contact: - phone: +91-98978675645 - person: - name: RAGHAVENDRA J - rating: '5' - customer: - contact: - phone: +91-9897867564 - person: - language: - code: en - name: English - name: John Doe - id: fulf_5cf064d5-4c0a-42d3-b73d-5f19a6f7468e - state: - descriptor: - code: DRIVER_EN_ROUTE_TO_PICKUP - name: Driver is en-route to your location - stops: - - authorization: - token: '234234' - type: OTP - location: - address: '98 A, 6th Main Rd, Uttarahalli Hobli, Ramanjaneyanagar' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Ramanjaneyanagar - gps: '12.910458, 77.543089' - state: - name: Karnataka - type: start - - location: - address: 'Basavanagudi, Chikkanna Garden, Rangadore Memorial Hospital' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Chikkanna Garden - gps: '12.9535139, 77.5710434' - state: - name: Karnataka - type: end - vehicle: - category: AUTO_RICKSHAW - registration: KA01JG1231 - id: 7751bd26-3fdc-47ca-9b64-e998dc5abe68 - items: - - descriptor: - code: RIDE - name: Auto Ride - fulfillment_ids: - - fb5c84d4-1b59-4b9d-96b5-9d79107432c5 - id: 5777a0bf-9a08-49aa-a97d-1e5561a9622e - payment_ids: - - '1' - tags: - - descriptor: - name: Daytime Charges - list: - - descriptor: - name: Min Fare upto 2 km - display: true - value: ₹ 30 upto 2 km - - descriptor: - name: Rate above Min. Fare - display: true - value: ₹15 / km - - descriptor: - name: Driver Pickup Charges - display: true - value: ₹ 10 - - descriptor: - name: Nominal Fare - short_desc: 'Driver may quote extra to cover for traffic, chance of return trip, etc.' - display: true - value: ₹ 10 - - descriptor: - name: Waiting Charges - short_desc: 'Driver may quote extra to cover for traffic, chance of return trip, etc.' - display: true - value: ₹ 0 / min - - descriptor: - name: Night Charges - list: - - descriptor: - name: Night Charges - display: true - value: 1.5x of daytime charges applicable at night from 10 PM to 5 AM - - descriptor: - name: Night Shift Start - display: true - value: '22:00:00' - - descriptor: - name: Night Shift End - display: true - value: '05:00:00' - - descriptor: - name: General Information - list: - - descriptor: - name: Distance to nearest driver - display: true - value: 661 m - - descriptor: - name: Wait time upto - display: true - value: 3 min - payments: - - id: 7f7896dd-787e-4a0b-8675-e9e6fe93bb8f - params: - amount: '81' - currency: INR - status: NOT-PAID - type: ON-FULFILLMENT - provider: - descriptor: - name: Acme Taxis - id: '1' - quote: - breakup: - - price: - currency: INR - value: '30' - title: Base Fare - - price: - currency: INR - value: '56' - title: Per km fare - - price: - currency: INR - value: '2.5' - title: CGST @ 5% - - price: - currency: INR - value: '2.5' - title: SGST @ 5% - price: - currency: INR - value: '81' - Return order with latest status - Ride Ended: - value: - context: - action: on_status - bap_id: example-bap.com - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - bpp_id: example-bpp.com - bpp_uri: 'https://api.example-bpp.com/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: 8926b747-0362-4fcc-b795-0994a6287700 - timestamp: '2023-03-23T04:48:53Z' - transaction_id: b580c989-f84d-4abe-af28-2c818aafce3b - version: 1.1.0 - message: - order: - fulfillments: - - agent: - contact: - phone: +91-98978675645 - person: - name: RAGHAVENDRA J - rating: '5' - customer: - contact: - phone: +91-9897867564 - person: - language: - code: en - name: English - name: John Doe - id: fulf_5cf064d5-4c0a-42d3-b73d-5f19a6f7468e - state: - descriptor: - code: RIDE_ENDED - name: Your ride has ended - stops: - - authorization: - token: '234234' - type: OTP - location: - address: '98 A, 6th Main Rd, Uttarahalli Hobli, Ramanjaneyanagar' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Ramanjaneyanagar - gps: '12.910458, 77.543089' - state: - name: Karnataka - type: start - - location: - address: 'Basavanagudi, Chikkanna Garden, Rangadore Memorial Hospital' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Chikkanna Garden - gps: '12.9535139, 77.5710434' - state: - name: Karnataka - type: end - vehicle: - category: AUTO_RICKSHAW - registration: KA01JG1231 - id: 7751bd26-3fdc-47ca-9b64-e998dc5abe68 - items: - - descriptor: - code: RIDE - name: Auto Ride - fulfillment_ids: - - fb5c84d4-1b59-4b9d-96b5-9d79107432c5 - id: 5777a0bf-9a08-49aa-a97d-1e5561a9622e - payment_ids: - - '1' - tags: - - descriptor: - name: Daytime Charges - list: - - descriptor: - name: Min Fare upto 2 km - display: true - value: ₹ 30 upto 2 km - - descriptor: - name: Rate above Min. Fare - display: true - value: ₹15 / km - - descriptor: - name: Driver Pickup Charges - display: true - value: ₹ 10 - - descriptor: - name: Nominal Fare - short_desc: 'Driver may quote extra to cover for traffic, chance of return trip, etc.' - display: true - value: ₹ 10 - - descriptor: - name: Waiting Charges - short_desc: 'Driver may quote extra to cover for traffic, chance of return trip, etc.' - display: true - value: ₹ 0 / min - - descriptor: - name: Night Charges - list: - - descriptor: - name: Night Charges - display: true - value: 1.5x of daytime charges applicable at night from 10 PM to 5 AM - - descriptor: - name: Night Shift Start - display: true - value: '22:00:00' - - descriptor: - name: Night Shift End - display: true - value: '05:00:00' - - descriptor: - name: General Information - list: - - descriptor: - name: Distance to nearest driver - display: true - value: 661 m - - descriptor: - name: Wait time upto - display: true - value: 3 min - payments: - - id: 7f7896dd-787e-4a0b-8675-e9e6fe93bb8f - params: - amount: '81' - currency: INR - status: NOT-PAID - type: ON-FULFILLMENT - provider: - descriptor: - name: Acme Taxis - id: '1' - quote: - breakup: - - price: - currency: INR - value: '30' - title: Base Fare - - price: - currency: INR - value: '56' - title: Per km fare - - price: - currency: INR - value: '2.5' - title: CGST @ 5% - - price: - currency: INR - value: '2.5' - title: SGST @ 5% - price: - currency: INR - value: '81' - Return order with latest status - Ride started: - value: - context: - action: on_status - bap_id: example-bap.com - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - bpp_id: example-bpp.com - bpp_uri: 'https://api.example-bpp.com/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: 8926b747-0362-4fcc-b795-0994a6287700 - timestamp: '2023-03-23T04:48:53Z' - transaction_id: b580c989-f84d-4abe-af28-2c818aafce3b - version: 1.1.0 - message: - order: - fulfillments: - - agent: - contact: - phone: +91-98978675645 - person: - name: RAGHAVENDRA J - rating: '5' - customer: - contact: - phone: +91-9897867564 - person: - language: - code: en - name: English - name: John Doe - id: fulf_5cf064d5-4c0a-42d3-b73d-5f19a6f7468e - state: - descriptor: - code: RIDE_STARTED - name: Your ride has started - stops: - - authorization: - token: '234234' - type: OTP - location: - address: '98 A, 6th Main Rd, Uttarahalli Hobli, Ramanjaneyanagar' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Ramanjaneyanagar - gps: '12.910458, 77.543089' - state: - name: Karnataka - type: start - - location: - address: 'Basavanagudi, Chikkanna Garden, Rangadore Memorial Hospital' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Chikkanna Garden - gps: '12.9535139, 77.5710434' - state: - name: Karnataka - type: end - vehicle: - category: AUTO_RICKSHAW - registration: KA01JG1231 - id: 7751bd26-3fdc-47ca-9b64-e998dc5abe68 - items: - - descriptor: - code: RIDE - name: Auto Ride - fulfillment_ids: - - fb5c84d4-1b59-4b9d-96b5-9d79107432c5 - id: 5777a0bf-9a08-49aa-a97d-1e5561a9622e - payment_ids: - - '1' - tags: - - descriptor: - name: Daytime Charges - list: - - descriptor: - name: Min Fare upto 2 km - display: true - value: ₹ 30 upto 2 km - - descriptor: - name: Rate above Min. Fare - display: true - value: ₹15 / km - - descriptor: - name: Driver Pickup Charges - display: true - value: ₹ 10 - - descriptor: - name: Nominal Fare - short_desc: 'Driver may quote extra to cover for traffic, chance of return trip, etc.' - display: true - value: ₹ 10 - - descriptor: - name: Waiting Charges - short_desc: 'Driver may quote extra to cover for traffic, chance of return trip, etc.' - display: true - value: ₹ 0 / min - - descriptor: - name: Night Charges - list: - - descriptor: - name: Night Charges - display: true - value: 1.5x of daytime charges applicable at night from 10 PM to 5 AM - - descriptor: - name: Night Shift Start - display: true - value: '22:00:00' - - descriptor: - name: Night Shift End - display: true - value: '05:00:00' - - descriptor: - name: General Information - list: - - descriptor: - name: Distance to nearest driver - display: true - value: 661 m - - descriptor: - name: Wait time upto - display: true - value: 3 min - payments: - - id: 7f7896dd-787e-4a0b-8675-e9e6fe93bb8f - params: - amount: '81' - currency: INR - status: NOT-PAID - type: ON-FULFILLMENT - provider: - descriptor: - name: Acme Taxis - id: '1' - quote: - breakup: - - price: - currency: INR - value: '30' - title: Base Fare - - price: - currency: INR - value: '56' - title: Per km fare - - price: - currency: INR - value: '2.5' - title: CGST @ 5% - - price: - currency: INR - value: '2.5' - title: SGST @ 5% - price: - currency: INR - value: '81' - Return order with status - Driver at pickup: - value: - context: - action: on_status - bap_id: example-bap.com - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - bpp_id: example-bpp.com - bpp_uri: 'https://api.example-bpp.com/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: 8926b747-0362-4fcc-b795-0994a6287700 - timestamp: '2023-03-23T04:48:53Z' - transaction_id: b580c989-f84d-4abe-af28-2c818aafce3b - version: 1.1.0 - message: - order: - fulfillments: - - agent: - contact: - phone: +91-98978675645 - person: - name: RAGHAVENDRA J - rating: '5' - customer: - contact: - phone: +91-9897867564 - person: - language: - code: en - name: English - name: John Doe - id: fulf_5cf064d5-4c0a-42d3-b73d-5f19a6f7468e - state: - descriptor: - code: DRIVER_AT_PICKUP - name: Driver Arrived at Pickup Location - stops: - - authorization: - token: '234234' - type: OTP - location: - address: '98 A, 6th Main Rd, Uttarahalli Hobli, Ramanjaneyanagar' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Ramanjaneyanagar - gps: '12.910458, 77.543089' - state: - name: Karnataka - type: start - - location: - address: 'Basavanagudi, Chikkanna Garden, Rangadore Memorial Hospital' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Chikkanna Garden - gps: '12.9535139, 77.5710434' - state: - name: Karnataka - type: end - vehicle: - category: AUTO_RICKSHAW - registration: KA01JG1231 - id: 7751bd26-3fdc-47ca-9b64-e998dc5abe68 - items: - - descriptor: - code: RIDE - name: Auto Ride - fulfillment_ids: - - fb5c84d4-1b59-4b9d-96b5-9d79107432c5 - id: 5777a0bf-9a08-49aa-a97d-1e5561a9622e - payment_ids: - - '1' - tags: - - descriptor: - name: Daytime Charges - list: - - descriptor: - name: Min Fare upto 2 km - display: true - value: ₹ 30 upto 2 km - - descriptor: - name: Rate above Min. Fare - display: true - value: ₹15 / km - - descriptor: - name: Driver Pickup Charges - display: true - value: ₹ 10 - - descriptor: - name: Nominal Fare - short_desc: 'Driver may quote extra to cover for traffic, chance of return trip, etc.' - display: true - value: ₹ 10 - - descriptor: - name: Waiting Charges - short_desc: 'Driver may quote extra to cover for traffic, chance of return trip, etc.' - display: true - value: ₹ 0 / min - - descriptor: - name: Night Charges - list: - - descriptor: - name: Night Charges - display: true - value: 1.5x of daytime charges applicable at night from 10 PM to 5 AM - - descriptor: - name: Night Shift Start - display: true - value: '22:00:00' - - descriptor: - name: Night Shift End - display: true - value: '05:00:00' - - descriptor: - name: General Information - list: - - descriptor: - name: Distance to nearest driver - display: true - value: 661 m - - descriptor: - name: Wait time upto - display: true - value: 3 min - payments: - - id: 7f7896dd-787e-4a0b-8675-e9e6fe93bb8f - params: - amount: '81' - currency: INR - status: PAID - type: ON-FULFILLMENT - provider: - descriptor: - name: Acme Taxis - id: '1' - quote: - breakup: - - price: - currency: INR - value: '30' - title: Base Fare - - price: - currency: INR - value: '56' - title: Per km fare - - price: - currency: INR - value: '2.5' - title: CGST @ 5% - - price: - currency: INR - value: '2.5' - title: SGST @ 5% - price: - currency: INR - value: '81' - Return transit ticket order with status - Entered Paid Area: - value: - context: - action: on_status - bap_id: 'https://example-bap.com' - bap_uri: 'https://mock_bap.com/beckn/' - bpp_id: 'https://kmrl-bpp.com' - bpp_uri: 'https://kmrl-bpp.com/beckn/' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: fde8b8b6-c2e5-49f7-b254-720843d528bd - timestamp: '2021-03-23T10:00:40.065Z' - transaction_id: 6f339232-2bc3-44d2-915c-30d2b053ce1d - version: 1.1.0 - message: - order: - billing: - email: john.doe@example.com - name: John Doe - fulfillments: - - id: '3' - state: - descriptor: - name: Entered paid area - stops: - - location: - descriptor: - name: Dwarka Sector 21 - gps: '9.05,12.06' - time: - timestamp: '2021-10-15T00:32:19.000Z' - type: start - - location: - descriptor: - name: Shivaji Stadium - gps: '9.07,12.07' - time: - timestamp: '2021-10-15T00:43:21.000Z' - type: end - tags: - - descriptor: - name: Other Information - list: - - descriptor: - name: Transfers - display: true - value: '0' - - descriptor: - name: Duration - display: true - value: 30 min - vehicle: - category: METRO - id: '123413' - items: - - descriptor: - images: - - 'https://delhimetrorail.com/icons/sjt.ico' - name: Single Journey Ticket - fulfillment_ids: - - '3' - id: '3' - price: - currency: '55' - value: INR - payments: - - params: - amount: '60.5' - currency: INR - transaction_id: '24566345563' - status: PAID - time: - range: - end: '2021-03-24T10:00:40.065Z' - start: '2021-03-23T10:00:40.065Z' - url: 'https://pay.razorpay.com?amt=60.5&cur=INR&ref=24566345563' - provider: - descriptor: - images: - - 'https://delhimetrorail.com/logos/logo.ico' - name: Delhi Metro Rail Limited - id: '1' - quote: - breakup: - - price: - currency: INR - value: '55' - title: Single Journey Ticket X 1 - - price: - currency: INR - value: '2.75' - title: CGST @ 5% - - price: - currency: INR - value: '2.75' - title: SGST @ 5% - price: - currency: '60.5' - value: INR - Return transit ticket order with status - Exited paid area: - value: - context: - action: on_status - bap_id: 'https://example-bap.com' - bap_uri: 'https://mock_bap.com/beckn/' - bpp_id: 'https://kmrl-bpp.com' - bpp_uri: 'https://kmrl-bpp.com/beckn/' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: fde8b8b6-c2e5-49f7-b254-720843d528bd - timestamp: '2021-03-23T10:00:40.065Z' - transaction_id: 6f339232-2bc3-44d2-915c-30d2b053ce1d - version: 1.1.0 - message: - order: - billing: - email: john.doe@example.com - name: John Doe - fulfillments: - - id: '3' - state: - descriptor: - name: Exited paid area - stops: - - location: - descriptor: - name: Dwarka Sector 21 - gps: '9.05,12.06' - time: - timestamp: '2021-10-15T00:32:19.000Z' - type: start - - location: - descriptor: - name: Shivaji Stadium - gps: '9.07,12.07' - time: - timestamp: '2021-10-15T00:43:21.000Z' - type: end - tags: - - descriptor: - name: Other Information - list: - - descriptor: - name: Transfers - display: true - value: '0' - - descriptor: - name: Duration - display: true - value: 30 min - vehicle: - category: METRO - id: '123413' - items: - - descriptor: - images: - - 'https://delhimetrorail.com/icons/sjt.ico' - name: Single Journey Ticket - fulfillment_ids: - - '3' - id: '3' - price: - currency: '55' - value: INR - payments: - - params: - amount: '60.5' - currency: INR - transaction_id: '24566345563' - status: PAID - url: 'https://pay.razorpay.com?amt=60.5&cur=INR&ref=24566345563' - provider: - descriptor: - images: - - 'https://delhimetrorail.com/logos/logo.ico' - name: Delhi Metro Rail Limited - id: '1' - quote: - breakup: - - price: - currency: INR - value: '55' - title: Single Journey Ticket X 1 - - price: - currency: INR - value: '2.75' - title: CGST @ 5% - - price: - currency: INR - value: '2.75' - title: SGST @ 5% - price: - currency: '60.5' - value: INR - Return transit ticket order with status - Ticket Issued: - value: - context: - action: on_status - bap_id: 'https://example-bap.com' - bap_uri: 'https://mock_bap.com/beckn/' - bpp_id: 'https://kmrl-bpp.com' - bpp_uri: 'https://kmrl-bpp.com/beckn/' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: fde8b8b6-c2e5-49f7-b254-720843d528bd - timestamp: '2021-03-23T10:00:40.065Z' - transaction_id: 6f339232-2bc3-44d2-915c-30d2b053ce1d - version: 1.1.0 - message: - order: - billing: - email: john.doe@example.com - name: John Doe - fulfillments: - - id: '3' - state: - descriptor: - name: Ticket Issued - stops: - - location: - descriptor: - name: Dwarka Sector 21 - gps: '9.05,12.06' - time: - timestamp: '2021-10-15T00:32:19.000Z' - type: start - - location: - descriptor: - name: Shivaji Stadium - gps: '9.07,12.07' - time: - timestamp: '2021-10-15T00:43:21.000Z' - type: end - tags: - - descriptor: - name: Other Information - list: - - descriptor: - name: Transfers - display: true - value: '0' - - descriptor: - name: Duration - display: true - value: 30 min - vehicle: - category: METRO - id: '123413' - items: - - descriptor: - images: - - 'https://delhimetrorail.com/icons/sjt.ico' - name: Single Journey Ticket - fulfillment_ids: - - '3' - id: '3' - price: - currency: '55' - value: INR - payments: - - params: - amount: '60.5' - currency: INR - transaction_id: '24566345563' - status: PAID - time: - range: - end: '2021-03-24T10:00:40.065Z' - start: '2021-03-23T10:00:40.065Z' - url: 'https://pay.razorpay.com?amt=60.5&cur=INR&ref=24566345563' - provider: - descriptor: - images: - - 'https://delhimetrorail.com/logos/logo.ico' - name: Delhi Metro Rail Limited - id: '1' - quote: - breakup: - - price: - currency: INR - value: '55' - title: Single Journey Ticket X 1 - - price: - currency: INR - value: '2.75' - title: CGST @ 5% - - price: - currency: INR - value: '2.75' - title: SGST @ 5% - price: - currency: '60.5' - value: INR - description: TODO - responses: - '200': - content: - application/json: - schema: - properties: - error: - $ref: '#/components/schemas/Error' - message: - properties: - ack: - $ref: '#/components/schemas/Ack' - required: - - ack - type: object - required: - - message - type: object - description: Acknowledgement of message received - tags: - - Beckn App Platform (BAP) - /on_update: - post: - description: Returns updated service with updated runtime object - operationId: on_update - requestBody: - content: - application/json: - schema: - allOf: - - properties: - context: - allOf: - - $ref: '#/components/schemas/Context' - - properties: - action: - enum: - - on_update - error: - $ref: '#/components/schemas/Error' - message: - properties: - order: - allOf: - - $ref: '#/components/schemas/Order' - required: - - order - type: object - required: - - context - type: object - - allOf: - - $ref: '#/paths/~1init/post/requestBody/content/application~1json/schema/allOf/1/allOf/0' - - properties: - context: - properties: - action: - type: string - enum: - - on_update - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/2' - - $ref: '#/paths/~1confirm/post/requestBody/content/application~1json/schema/allOf/1/allOf/4' - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/4' - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/5' - - $ref: '#/paths/~1on_status/post/requestBody/content/application~1json/schema/allOf/1/allOf/6' - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/7' - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/8' - - $ref: '#/paths/~1confirm/post/requestBody/content/application~1json/schema/allOf/1/allOf/5' - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/10' - - $ref: '#/paths/~1on_status/post/requestBody/content/application~1json/schema/allOf/1/allOf/11' - - $ref: '#/paths/~1on_status/post/requestBody/content/application~1json/schema/allOf/1/allOf/12' - - $ref: '#/paths/~1on_status/post/requestBody/content/application~1json/schema/allOf/1/allOf/13' - - $ref: '#/paths/~1on_status/post/requestBody/content/application~1json/schema/allOf/1/allOf/14' - examples: - Return updated order with payment transaction status: - value: - context: - action: on_update - bap_id: example-bap.com - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - bpp_id: example-bpp.com - bpp_uri: 'https://api.example-bpp.com/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: 8926b747-0362-4fcc-b795-0994a6287700 - timestamp: '2023-03-23T04:48:53Z' - transaction_id: b580c989-f84d-4abe-af28-2c818aafce3b - version: 1.1.0 - message: - order: - fulfillments: - - agent: - contact: - phone: +91-98978675645 - person: - name: RAGHAVENDRA J - rating: '5' - customer: - contact: - phone: +91-9897867564 - person: - language: - code: en - name: English - name: John Doe - id: fulf_5cf064d5-4c0a-42d3-b73d-5f19a6f7468e - state: - descriptor: - code: PAYMENT_COLLECTED - name: Payment received - stops: - - authorization: - token: '234234' - type: OTP - location: - address: '98 A, 6th Main Rd, Uttarahalli Hobli, Ramanjaneyanagar' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Ramanjaneyanagar - gps: '12.910458, 77.543089' - state: - name: Karnataka - type: start - - location: - address: 'Basavanagudi, Chikkanna Garden, Rangadore Memorial Hospital' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Chikkanna Garden - gps: '12.9535139, 77.5710434' - state: - name: Karnataka - type: end - vehicle: - category: AUTO_RICKSHAW - registration: KA01JG1231 - id: ABC1234 - items: - - descriptor: - code: RIDE - name: Auto Ride - fulfillment_ids: - - fb5c84d4-1b59-4b9d-96b5-9d79107432c5 - id: 5777a0bf-9a08-49aa-a97d-1e5561a9622e - payment_ids: - - '1' - tags: - - descriptor: - name: Daytime Charges - list: - - descriptor: - name: Min Fare upto 2 km - display: true - value: ₹ 30 upto 2 km - - descriptor: - name: Rate above Min. Fare - display: true - value: ₹15 / km - - descriptor: - name: Driver Pickup Charges - display: true - value: ₹ 10 - - descriptor: - name: Nominal Fare - short_desc: 'Driver may quote extra to cover for traffic, chance of return trip, etc.' - display: true - value: ₹ 10 - - descriptor: - name: Waiting Charges - short_desc: 'Driver may quote extra to cover for traffic, chance of return trip, etc.' - display: true - value: ₹ 0 / min - - descriptor: - name: Night Charges - list: - - descriptor: - name: Night Charges - display: true - value: 1.5x of daytime charges applicable at night from 10 PM to 5 AM - - descriptor: - name: Night Shift Start - display: true - value: '22:00:00' - - descriptor: - name: Night Shift End - display: true - value: '05:00:00' - - descriptor: - name: General Information - list: - - descriptor: - name: Distance to nearest driver - display: true - value: 661 m - - descriptor: - name: Wait time upto - display: true - value: 3 min - payments: - - id: 7f7896dd-787e-4a0b-8675-e9e6fe93bb8f - params: - amount: '81' - currency: INR - status: PAID - type: ON-FULFILLMENT - provider: - descriptor: - name: Acme Taxis - id: '1' - quote: - breakup: - - price: - currency: INR - value: '30' - title: Base Fare - - price: - currency: INR - value: '56' - title: Per km fare - - price: - currency: INR - value: '2.5' - title: CGST @ 5% - - price: - currency: INR - value: '2.5' - title: SGST @ 5% - price: - currency: INR - value: '81' - Return updated order with recomputed charges: - value: - context: - action: on_update - bap_id: example-bap.com - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - bpp_id: example-bpp.com - bpp_uri: 'https://api.example-bpp.com/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: 8926b747-0362-4fcc-b795-0994a6287700 - timestamp: '2023-03-23T04:48:53Z' - transaction_id: b580c989-f84d-4abe-af28-2c818aafce3b - version: 1.1.0 - message: - order: - fulfillments: - - agent: - contact: - phone: +91-98978675645 - person: - name: RAGHAVENDRA J - rating: '5' - customer: - contact: - phone: +91-9897867564 - person: - language: - code: en - name: English - name: John Doe - id: fulf_5cf064d5-4c0a-42d3-b73d-5f19a6f7468e - state: - descriptor: - code: RIDE_ENDED - name: Your ride has ended - stops: - - authorization: - token: '234234' - type: OTP - location: - address: '98 A, 6th Main Rd, Uttarahalli Hobli, Ramanjaneyanagar' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Ramanjaneyanagar - gps: '12.910458, 77.543089' - state: - name: Karnataka - type: start - - location: - address: 'Basavanagudi, Chikkanna Garden, Rangadore Memorial Hospital' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Chikkanna Garden - gps: '12.9535139, 77.5710434' - state: - name: Karnataka - type: end - vehicle: - category: AUTO_RICKSHAW - registration: KA01JG1231 - id: ABC1234 - items: - - descriptor: - code: RIDE - name: Auto Ride - fulfillment_ids: - - fb5c84d4-1b59-4b9d-96b5-9d79107432c5 - id: 5777a0bf-9a08-49aa-a97d-1e5561a9622e - payment_ids: - - '1' - tags: - - descriptor: - name: Daytime Charges - list: - - descriptor: - name: Min Fare upto 2 km - display: true - value: ₹ 30 upto 2 km - - descriptor: - name: Rate above Min. Fare - display: true - value: ₹15 / km - - descriptor: - name: Driver Pickup Charges - display: true - value: ₹ 10 - - descriptor: - name: Nominal Fare - short_desc: 'Driver may quote extra to cover for traffic, chance of return trip, etc.' - display: true - value: ₹ 10 - - descriptor: - name: Waiting Charges - short_desc: 'Driver may quote extra to cover for traffic, chance of return trip, etc.' - display: true - value: ₹ 0 / min - - descriptor: - name: Night Charges - list: - - descriptor: - name: Night Charges - display: true - value: 1.5x of daytime charges applicable at night from 10 PM to 5 AM - - descriptor: - name: Night Shift Start - display: true - value: '22:00:00' - - descriptor: - name: Night Shift End - display: true - value: '05:00:00' - - descriptor: - name: General Information - list: - - descriptor: - name: Distance to nearest driver - display: true - value: 661 m - - descriptor: - name: Wait time upto - display: true - value: 3 min - payments: - - id: 7f7896dd-787e-4a0b-8675-e9e6fe93bb8f - params: - amount: '75' - currency: INR - status: NOT-PAID - type: ON-FULFILLMENT - provider: - descriptor: - name: Acme Taxis - id: '1' - quote: - breakup: - - price: - currency: INR - value: '30' - title: Base Fare - - price: - currency: INR - value: '40' - title: Per km fare - - price: - currency: INR - value: '2.5' - title: CGST @ 5% - - price: - currency: INR - value: '2.5' - title: SGST @ 5% - price: - currency: INR - value: '75' - description: TODO - responses: - '200': - content: - application/json: - schema: - properties: - error: - $ref: '#/components/schemas/Error' - message: - properties: - ack: - $ref: '#/components/schemas/Ack' - required: - - ack - type: object - required: - - message - type: object - description: Acknowledgement of message received - tags: - - Beckn App Platform (BAP) - /on_rating: - post: - description: Provide feedback on a service - operationId: on_rating - requestBody: - content: - application/json: - schema: - allOf: - - properties: - context: - allOf: - - $ref: '#/components/schemas/Context' - - properties: - action: - enum: - - on_rating - error: - $ref: '#/components/schemas/Error' - message: - properties: - feedback_form: - allOf: - - $ref: '#/components/schemas/XInput' - description: A feedback form to allow the user to provide additional information on the rating provided - type: object - required: - - context - - message - type: object - - allOf: - - $ref: '#/paths/~1init/post/requestBody/content/application~1json/schema/allOf/1/allOf/0' - - properties: - context: - properties: - action: - type: string - enum: - - on_rating - - properties: - message: - properties: - feedback_form: - type: object - properties: - required: - type: boolean - form: - type: object - required: - - required - allOf: - - if: - properties: - required: - const: true - then: - required: - - form - examples: - Return acknowledgement of rating and feedback: - value: - context: - action: on_rating - bap_id: api.beckn.juspay.in/pilot/bap/cab/v1 - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - bpp_id: api.beckn.juspay.in/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f - bpp_uri: 'https://api.example-bpp.com/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: 2a17e268-1dc4-4d1a-98a2-17554a50c7d2 - timestamp: '2023-03-23T05:41:15Z' - version: 1.1.0 - message: - feedback_form: - form: - mime_type: text/html - url: 'https://www.example.com/feedbackform' - required: true - description: TODO - responses: - '200': - content: - application/json: - schema: - properties: - error: - $ref: '#/components/schemas/Error' - message: - properties: - ack: - $ref: '#/components/schemas/Ack' - required: - - ack - type: object - required: - - message - type: object - description: Acknowledgement of message received - tags: - - Beckn App Platform (BAP) - /on_support: - post: - description: Contact Support - operationId: on_support - requestBody: - content: - application/json: - schema: - allOf: - - properties: - context: - allOf: - - $ref: '#/components/schemas/Context' - - properties: - action: - enum: - - on_support - error: - $ref: '#/components/schemas/Error' - message: - properties: - support: - $ref: '#/components/schemas/Support' - type: object - required: - - context - type: object - - allOf: - - $ref: '#/paths/~1init/post/requestBody/content/application~1json/schema/allOf/1/allOf/0' - - properties: - context: - properties: - action: - type: string - enum: - - on_support - - properties: - message: - properties: - support: - type: object - properties: - email: - type: string - format: email - phone: - type: string - url: - type: string - format: uri - anyOf: - - required: - - email - - required: - - phone - - required: - - url - examples: - Return support information related to an order: - value: - context: - action: on_support - bap_id: example-bap.com - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - bpp_id: example-bpp.com - bpp_uri: 'https://api.example-bpp.com/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: ec3dea8c-c64c-4f06-b2a0-ec1f9584d7ba - timestamp: '2023-03-23T05:41:09Z' - version: 1.1.0 - message: - support: - callback_phone: '+916756453421' - email: support@example-bpp.com - phone: '+918068870525' - ref_id: 1386183jkgsgfjsf - url: 'https://support.example-bpp.com/gethelp' - description: TODO - responses: - '200': - content: - application/json: - schema: - properties: - error: - $ref: '#/components/schemas/Error' - message: - properties: - ack: - $ref: '#/components/schemas/Ack' - required: - - ack - type: object - required: - - message - type: object - description: Acknowledgement of message received - tags: - - Beckn App Platform (BAP) - /on_track: - post: - description: Send tracking details of an active order - operationId: on_track - requestBody: - content: - application/json: - schema: - allOf: - - properties: - context: - allOf: - - $ref: '#/components/schemas/Context' - - properties: - action: - enum: - - on_track - error: - $ref: '#/components/schemas/Error' - message: - properties: - tracking: - $ref: '#/components/schemas/Tracking' - required: - - tracking - type: object - required: - - context - type: object - - allOf: - - $ref: '#/paths/~1init/post/requestBody/content/application~1json/schema/allOf/1/allOf/0' - - properties: - context: - properties: - action: - type: string - enum: - - on_track - - properties: - message: - properties: - tracking: - type: object - properties: - status: - type: string - url: - type: string - location: - type: object - properties: - latitude: - type: number - longitude: - type: number - required: - - status - oneOf: - - required: - - url - - required: - - location - examples: - Return tracking information for an order: - value: - context: - action: on_track - bap_id: example-bap.com - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - bpp_id: example-bpp.com - bpp_uri: 'https://api.example-bpp.com/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: ec3dea8c-c64c-4f06-b2a0-ec1f9584d7ba - timestamp: '2023-03-23T05:41:09Z' - version: 1.1.0 - message: - tracking: - status: active - url: 'https://api.beckn.juspay.in/dobpp/ui/driver/location/abc9f0aa-bbfd-4e91-b378-41feee12f05f' - description: TODO - responses: - '200': - content: - application/json: - schema: - properties: - error: - $ref: '#/components/schemas/Error' - message: - properties: - ack: - $ref: '#/components/schemas/Ack' - required: - - ack - type: object - required: - - message - type: object - description: Acknowledgement of message received - tags: - - Beckn App Platform (BAP) - /on_cancel: - post: - description: Send cancellation request_id with reasons list in case of cancellation request. Else send cancelled order object - operationId: on_cancel - requestBody: - content: - application/json: - schema: - allOf: - - properties: - context: - allOf: - - $ref: '#/components/schemas/Context' - - properties: - action: - enum: - - on_cancel - error: - $ref: '#/components/schemas/Error' - message: - properties: - order: - allOf: - - $ref: '#/components/schemas/Order' - required: - - order - type: object - required: - - context - type: object - - allOf: - - $ref: '#/paths/~1init/post/requestBody/content/application~1json/schema/allOf/1/allOf/0' - - properties: - context: - properties: - action: - type: string - enum: - - on_cancel - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/2' - - $ref: '#/paths/~1confirm/post/requestBody/content/application~1json/schema/allOf/1/allOf/4' - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/4' - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/5' - - $ref: '#/paths/~1on_status/post/requestBody/content/application~1json/schema/allOf/1/allOf/6' - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/7' - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/8' - - $ref: '#/paths/~1confirm/post/requestBody/content/application~1json/schema/allOf/1/allOf/5' - - $ref: '#/paths/~1on_init/post/requestBody/content/application~1json/schema/allOf/1/allOf/10' - - $ref: '#/paths/~1on_status/post/requestBody/content/application~1json/schema/allOf/1/allOf/11' - - $ref: '#/paths/~1on_status/post/requestBody/content/application~1json/schema/allOf/1/allOf/12' - - $ref: '#/paths/~1on_status/post/requestBody/content/application~1json/schema/allOf/1/allOf/13' - - $ref: '#/paths/~1on_status/post/requestBody/content/application~1json/schema/allOf/1/allOf/14' - - properties: - message: - properties: - order: - properties: - status: - type: string - enum: - - CANCELLED - - SOFT_CANCEL - required: - - status - - properties: - message: - properties: - order: - properties: - cancellation_terms: - items: - required: - - reason_required - required: - - cancellation_terms - examples: - Return cancelled ticket order with cancellation charges: - value: - context: - action: on_cancel - bap_id: 'https://example-bap.com' - bap_uri: 'https://api.example-bap.com/beckn/' - bpp_id: 'https://transit-solutions.com' - bpp_uri: 'https://api.transit-solutions.com/beckn/' - domain: 'nic2008:49213' - location: - city: - code: 'std:080' - country: - code: IND - message_id: fde8b8b6-c2e5-49f7-b254-720843d528bd - timestamp: '2021-03-23T10:00:40.065Z' - transaction_id: 6f339232-2bc3-44d2-915c-30d2b053ce1d - version: 1.1.0 - message: - order: - billing: - email: john.doe@example.com - name: John Doe - cancellation_terms: - - external_ref: - url: 'https://dmrc.com/fare_products/sjt/cancellation_terms.html' - fulfillments: - - id: '3' - state: - descriptor: - name: Ticket Cancelled - stops: - - instructions: - name: 'Show this ticket at the QR code scanner at the entry gate. If the QR code scanner is not present, show this at the ticket counter to get your token' - location: - descriptor: - name: Dwarka Sector 21 - gps: '9.05,12.06' - time: - timestamp: '2021-10-15T00:32:19.000Z' - type: start - - location: - descriptor: - name: Shivaji Stadium - gps: '9.07,12.07' - time: - timestamp: '2021-10-15T00:43:21.000Z' - type: end - tags: - - descriptor: - name: Other Information - list: - - descriptor: - name: Transfers - display: true - value: '0' - - descriptor: - name: Duration - display: true - value: 30 min - vehicle: - category: METRO - id: '123413' - items: - - descriptor: - images: - - 'https://delhimetrorail.com/icons/sjt.ico' - name: Single Journey Ticket - fulfillment_ids: - - '3' - id: '3' - price: - currency: '55' - value: INR - tags: - - descriptor: - name: Other Information - list: - - descriptor: - name: Validity - display: true - value: 24 hours from the time of purchase - payments: - - params: - amount: '10' - bank_account_number: '32756678999' - bank_code: SBIN0000575 - currency: INR - status: NOT-PAID - time: - range: - end: '2021-03-24T10:00:40.065Z' - start: '2021-03-23T10:00:40.065Z' - type: POST-FULFILLMENT - provider: - descriptor: - images: - - 'https://delhimetrorail.com/logos/logo.ico' - name: Delhi Metro Rail Limited - id: '1' - quote: - breakup: - - price: - currency: INR - value: '55' - title: Single Journey Ticket X 1 - - price: - currency: INR - value: '2.75' - title: CGST @ 5% - - price: - currency: INR - value: '2.75' - title: SGST @ 5% - price: - currency: '60.5' - value: INR - Return order cancelled by rider with cancellation charges: - value: - context: - action: on_cancel - bap_id: example-bap.com - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - bpp_id: example-bpp.com - bpp_uri: 'https://api.example-bpp.com/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: 8926b747-0362-4fcc-b795-0994a6287700 - timestamp: '2023-03-23T04:48:53Z' - transaction_id: b580c989-f84d-4abe-af28-2c818aafce3b - version: 1.1.0 - message: - order: - fulfillments: - - agent: - contact: - phone: +91-98978675645 - person: - name: RAGHAVENDRA J - rating: '5' - customer: - contact: - phone: +91-9897867564 - person: - language: - code: en - name: English - name: John Doe - id: fulf_5cf064d5-4c0a-42d3-b73d-5f19a6f7468e - state: - descriptor: - code: RIDE_CANCELLED - name: Oops! The driver had to cancel - stops: - - authorization: - token: '234234' - type: OTP - location: - address: '98 A, 6th Main Rd, Uttarahalli Hobli, Ramanjaneyanagar' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Ramanjaneyanagar - gps: '12.910458, 77.543089' - state: - name: Karnataka - type: start - - location: - address: 'Basavanagudi, Chikkanna Garden, Rangadore Memorial Hospital' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Chikkanna Garden - gps: '12.9535139, 77.5710434' - state: - name: Karnataka - type: end - vehicle: - category: AUTO_RICKSHAW - registration: KA01JG1231 - id: 7751bd26-3fdc-47ca-9b64-e998dc5abe68 - items: - - descriptor: - code: RIDE - name: Auto Ride - fulfillment_ids: - - fb5c84d4-1b59-4b9d-96b5-9d79107432c5 - id: 5777a0bf-9a08-49aa-a97d-1e5561a9622e - payment_ids: - - '1' - tags: - - descriptor: - name: Daytime Charges - list: - - descriptor: - name: Min Fare upto 2 km - display: true - value: ₹ 30 upto 2 km - - descriptor: - name: Rate above Min. Fare - display: true - value: ₹15 / km - - descriptor: - name: Driver Pickup Charges - display: true - value: ₹ 10 - - descriptor: - name: Nominal Fare - short_desc: 'Driver may quote extra to cover for traffic, chance of return trip, etc.' - display: true - value: ₹ 10 - - descriptor: - name: Waiting Charges - short_desc: 'Driver may quote extra to cover for traffic, chance of return trip, etc.' - display: true - value: ₹ 0 / min - - descriptor: - name: Night Charges - list: - - descriptor: - name: Night Charges - display: true - value: 1.5x of daytime charges applicable at night from 10 PM to 5 AM - - descriptor: - name: Night Shift Start - display: true - value: '22:00:00' - - descriptor: - name: Night Shift End - display: true - value: '05:00:00' - - descriptor: - name: General Information - list: - - descriptor: - name: Distance to nearest driver - display: true - value: 661 m - - descriptor: - name: Wait time upto - display: true - value: 3 min - payments: - - id: 7f7896dd-787e-4a0b-8675-e9e6fe93bb8f - params: - amount: '30' - bank_account_number: '32754478993' - bank_code: SBIN0000575 - currency: INR - status: NOT-PAID - time: - duration: P1D - type: POST-FULFILLMENT - provider: - descriptor: - name: Acme Taxis - id: '1' - quote: - breakup: - - price: - currency: INR - value: '30' - title: Cancellation charges - price: - currency: INR - value: '30' - Return order cancelled by the driver: - value: - context: - action: on_cancel - bap_id: example-bap.com - bap_uri: 'https://api.example-bap.com/pilot/bap/cab/v1' - bpp_id: example-bpp.com - bpp_uri: 'https://api.example-bpp.com/dobpp/beckn/7f7896dd-787e-4a0b-8675-e9e6fe93bb8f' - domain: 'nic2004:60221' - location: - city: - code: 'std:080' - country: - code: IND - message_id: 8926b747-0362-4fcc-b795-0994a6287700 - timestamp: '2023-03-23T04:48:53Z' - transaction_id: b580c989-f84d-4abe-af28-2c818aafce3b - version: 1.1.0 - message: - order: - fulfillments: - - agent: - contact: - phone: +91-98978675645 - person: - name: RAGHAVENDRA J - rating: '5' - customer: - contact: - phone: +91-9897867564 - person: - language: - code: en - name: English - name: John Doe - id: fulf_5cf064d5-4c0a-42d3-b73d-5f19a6f7468e - state: - descriptor: - code: RIDE_CANCELLED - name: Oops! The driver had to cancel - stops: - - authorization: - token: '234234' - type: OTP - location: - address: '98 A, 6th Main Rd, Uttarahalli Hobli, Ramanjaneyanagar' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Ramanjaneyanagar - gps: '12.910458, 77.543089' - state: - name: Karnataka - type: start - - location: - address: 'Basavanagudi, Chikkanna Garden, Rangadore Memorial Hospital' - area_code: 560061 - city: - name: Bengaluru - country: - name: India - district: Chikkanna Garden - gps: '12.9535139, 77.5710434' - state: - name: Karnataka - type: end - vehicle: - category: AUTO_RICKSHAW - registration: KA01JG1231 - id: 7751bd26-3fdc-47ca-9b64-e998dc5abe68 - items: - - descriptor: - code: RIDE - name: Auto Ride - fulfillment_ids: - - fb5c84d4-1b59-4b9d-96b5-9d79107432c5 - id: 5777a0bf-9a08-49aa-a97d-1e5561a9622e - payment_ids: - - '1' - tags: - - descriptor: - name: Daytime Charges - list: - - descriptor: - name: Min Fare upto 2 km - display: true - value: ₹ 30 upto 2 km - - descriptor: - name: Rate above Min. Fare - display: true - value: ₹15 / km - - descriptor: - name: Driver Pickup Charges - display: true - value: ₹ 10 - - descriptor: - name: Nominal Fare - short_desc: 'Driver may quote extra to cover for traffic, chance of return trip, etc.' - display: true - value: ₹ 10 - - descriptor: - name: Waiting Charges - short_desc: 'Driver may quote extra to cover for traffic, chance of return trip, etc.' - display: true - value: ₹ 0 / min - - descriptor: - name: Night Charges - list: - - descriptor: - name: Night Charges - display: true - value: 1.5x of daytime charges applicable at night from 10 PM to 5 AM - - descriptor: - name: Night Shift Start - display: true - value: '22:00:00' - - descriptor: - name: Night Shift End - display: true - value: '05:00:00' - - descriptor: - name: General Information - list: - - descriptor: - name: Distance to nearest driver - display: true - value: 661 m - - descriptor: - name: Wait time upto - display: true - value: 3 min - payments: - - id: 7f7896dd-787e-4a0b-8675-e9e6fe93bb8f - params: - amount: '0' - currency: INR - status: NOT-PAID - type: POST-FULFILLMENT - provider: - descriptor: - name: Acme Taxis - id: '1' - quote: - price: - currency: INR - value: '0' - description: TODO - responses: - '200': - content: - application/json: - schema: - properties: - error: - $ref: '#/components/schemas/Error' - message: - properties: - ack: - $ref: '#/components/schemas/Ack' - required: - - ack - type: object - required: - - message - type: object - description: Acknowledgement of message received - tags: - - Beckn App Platform (BAP) -components: - securitySchemes: - SubscriberAuth: - description: 'Signature of message body using BAP or BPP subscriber''s signing public key.

Format:

Authorization : Signature keyId="{subscriber_id}|{unique_key_id}|{algorithm}",algorithm="ed25519",created="1606970629",expires="1607030629",headers="(created) (expires) digest",signature="Base64(BLAKE-512(signing string))"' - in: header - name: Authorization - type: apiKey - schemas: - Ack: - additionalProperties: false - description: 'Describes the acknowledgement sent in response to an API call. If the implementation uses HTTP/S, then Ack must be returned in the same session. Every API call to a BPP must be responded to with an Ack whether the BPP intends to respond with a callback or not. This has one property called `status` that indicates the status of the Acknowledgement.' - properties: - status: - description: 'The status of the acknowledgement. If the request passes the validation criteria of the BPP, then this is set to ACK. If a BPP responds with status = `ACK` to a request, it is required to respond with a callback. If the request fails the validation criteria, then this is set to NACK. Additionally, if a BPP does not intend to respond with a callback even after the request meets the validation criteria, it should set this value to `NACK`.' - enum: - - ACK - - NACK - type: string - tags: - description: A list of tags containing any additional information sent along with the Acknowledgement. - items: - $ref: '#/components/schemas/TagGroup' - type: array - type: object - AddOn: - additionalProperties: false - description: Describes an add-on - properties: - descriptor: - $ref: '#/components/schemas/Descriptor' - id: - description: 'ID of the add-on. This follows the syntax {item.id}/add-on/{add-on unique id} for item specific add-on OR ' - type: string - price: - $ref: '#/components/schemas/Price' - type: object - Address: - description: Describes a postal address. - type: string - Agent: - additionalProperties: false - description: 'Describes the direct performer, driver or executor that fulfills an order. It is usually a person. But in some rare cases, it could be a non-living entity like a drone, or a bot. Some examples of agents are Doctor in the healthcare sector, a driver in the mobility sector, or a delivery person in the logistics sector. This object can be set at any stage of the order lifecycle. This can be set at the discovery stage when the BPP wants to provide details on the agent fulfilling the order, like in healthcare, where the doctor''s name appears during search. This object can also used to search for a particular person that the customer wants fulfilling an order. Sometimes, this object gets instantiated after the order is confirmed, like in the case of on-demand taxis, where the driver is assigned after the user confirms the ride.' - properties: - contact: - $ref: '#/components/schemas/Contact' - organization: - $ref: '#/components/schemas/Organization' - person: - $ref: '#/components/schemas/Person' - rating: - $ref: '#/components/schemas/Rating/properties/value' - type: object - Authorization: - additionalProperties: false - description: Describes an authorization mechanism - properties: - status: - description: Status of the token - type: string - token: - description: Token used for authorization - type: string - type: - description: Type of authorization mechanism used - type: string - valid_from: - description: Timestamp in RFC3339 format from which token is valid - format: date-time - type: string - valid_to: - description: Timestamp in RFC3339 format until which token is valid - format: date-time - type: string - type: object - Billing: - additionalProperties: false - description: 'Describes the billing details of an entity.
This has properties like name,organization,address,email,phone,time,tax_number, created_at,updated_at' - properties: - address: - allOf: - - $ref: '#/components/schemas/Address' - description: The address of the billable entity - city: - allOf: - - $ref: '#/components/schemas/City' - description: The city where the billable entity resides. - email: - description: Email address where the bill is sent to - format: email - type: string - name: - description: Name of the billable entity - type: string - organization: - allOf: - - $ref: '#/components/schemas/Organization' - description: Details of the organization being billed. - phone: - description: Phone number of the billable entity - type: string - state: - allOf: - - $ref: '#/components/schemas/State' - description: The state where the billable entity resides. This is important for state-level tax calculation - tax_id: - description: ID of the billable entity as recognized by the taxation authority - type: string - time: - allOf: - - $ref: '#/components/schemas/Time' - description: Details regarding the billing period - type: object - Cancellation: - additionalProperties: false - description: Describes a cancellation event - properties: - additional_description: - allOf: - - $ref: '#/components/schemas/Descriptor' - description: Any additional information regarding the nature of cancellation - cancelled_by: - type: string - reason: - allOf: - - $ref: '#/components/schemas/Option' - description: The reason for cancellation - time: - description: Date-time when the order was cancelled by the buyer - format: date-time - type: string - type: object - CancellationTerm: - additionalProperties: false - description: Describes the cancellation terms of an item or an order. This can be referenced at an item or order level. Item-level cancellation terms can override the terms at the order level. - properties: - cancel_by: - allOf: - - $ref: '#/components/schemas/Time' - description: Information related to the time of cancellation. - cancellation_fee: - $ref: '#/components/schemas/Fee' - external_ref: - $ref: '#/components/schemas/MediaFile' - fulfillment_state: - allOf: - - $ref: '#/components/schemas/FulfillmentState' - description: The state of fulfillment during which this term is applicable. - reason_required: - description: Indicates whether a reason is required to cancel the order - type: boolean - xinput: - $ref: '#/components/schemas/XInput' - required: - - cancellation_fee - type: object - Catalog: - additionalProperties: false - description: 'Describes the products or services offered by a BPP. This is typically sent as the response to a search intent from a BAP. The payment terms, offers and terms of fulfillment supported by the BPP can also be included here. The BPP can show hierarchical nature of products/services in its catalog using the parent_category_id in categories. The BPP can also send a ttl (time to live) in the context which is the duration for which a BAP can cache the catalog and use the cached catalog.
This has properties like bbp/descriptor,bbp/categories,bbp/fulfillments,bbp/payments,bbp/offers,bbp/providers and exp
This is used in the following situations.
  • This is typically used in the discovery stage when the BPP sends the details of the products and services it offers as response to a search intent from the BAP.
' - properties: - descriptor: - $ref: '#/components/schemas/Descriptor' - exp: - description: Timestamp after which catalog will expire - format: date-time - type: string - fulfillments: - description: Fulfillment modes offered at the BPP level. This is used when a BPP itself offers fulfillments on behalf of the providers it has onboarded. - items: - $ref: '#/components/schemas/Fulfillment' - type: array - offers: - description: Offers at the BPP-level. This is common across all providers onboarded by the BPP. - items: - $ref: '#/components/schemas/Offer' - type: array - payments: - description: Payment terms offered by the BPP for all transactions. This can be overriden at the provider level. - items: - $ref: '#/components/schemas/Payment' - type: array - providers: - items: - $ref: '#/components/schemas/Provider' - type: array - ttl: - description: Duration in seconds after which this catalog will expire - type: string - type: object - Category: - additionalProperties: false - description: A label under which a collection of items can be grouped. - properties: - descriptor: - $ref: '#/components/schemas/Descriptor' - id: - description: ID of the category - type: string - parent_category_id: - $ref: '#/components/schemas/Category/properties/id' - tags: - items: - $ref: '#/components/schemas/TagGroup' - type: array - time: - $ref: '#/components/schemas/Time' - ttl: - description: Time to live for an instance of this schema - type: object - Circle: - additionalProperties: false - description: Describes a circular region of a specified radius centered at a specified GPS coordinate. - properties: - gps: - $ref: '#/components/schemas/Gps' - radius: - $ref: '#/components/schemas/Scalar' - type: object - City: - additionalProperties: false - description: Describes a city - properties: - code: - description: City code - type: string - name: - description: Name of the city - type: string - type: object - Contact: - additionalProperties: false - properties: - email: - type: string - jcard: - description: A Jcard object as per draft-ietf-jcardcal-jcard-03 specification - type: object - phone: - type: string - type: object - Context: - additionalProperties: false - description: 'Every API call in beckn protocol has a context. It provides a high-level overview to the receiver about the nature of the intended transaction. Typically, it is the BAP that sets the transaction context based on the consumer''s location and action on their UI. But sometimes, during unsolicited callbacks, the BPP also sets the transaction context but it is usually the same as the context of a previous full-cycle, request-callback interaction between the BAP and the BPP. The context object contains four types of fields.
  1. Demographic information about the transaction using fields like `domain`, `country`, and `region`.
  2. Addressing details like the sending and receiving platform''s ID and API URL.
  3. Interoperability information like the protocol version that implemented by the sender and,
  4. Transaction details like the method being called at the receiver''s endpoint, the transaction_id that represents an end-to-end user session at the BAP, a message ID to pair requests with callbacks, a timestamp to capture sending times, a ttl to specifiy the validity of the request, and a key to encrypt information if necessary.
This object must be passed in every interaction between a BAP and a BPP. In HTTP/S implementations, it is not necessary to send the context during the synchronous response. However, in asynchronous protocols, the context must be sent during all interactions,' - properties: - action: - description: The Beckn protocol method being called by the sender and executed at the receiver. - type: string - bap_id: - allOf: - - description: 'A globally unique identifier of the platform, Typically it is the fully qualified domain name (FQDN) of the platform.' - type: string - description: Subscriber ID of the BAP - bap_uri: - allOf: - - description: The callback URL of the Subscriber. This should necessarily contain the same domain name as set in `subscriber_id``. - format: uri - type: string - description: Subscriber URL of the BAP for accepting callbacks from BPPs. - bpp_id: - allOf: - - $ref: '#/components/schemas/Context/properties/bap_id/allOf/0' - description: Subscriber ID of the BPP - bpp_uri: - allOf: - - $ref: '#/components/schemas/Context/properties/bap_uri/allOf/0' - description: Subscriber URL of the BPP for accepting calls from BAPs. - domain: - allOf: - - $ref: '#/components/schemas/Domain/properties/code' - description: Domain code that is relevant to this transaction context - key: - description: The encryption public key of the sender - type: string - location: - allOf: - - $ref: '#/components/schemas/Location' - description: The location where the transaction is intended to be fulfilled. - required: - - country - - city - message_id: - description: 'This is a unique value which persists during a request / callback cycle. Since beckn protocol APIs are asynchronous, BAPs need a common value to match an incoming callback from a BPP to an earlier call. This value can also be used to ignore duplicate messages coming from the BPP. It is recommended to generate a fresh message_id for every new interaction. When sending unsolicited callbacks, BPPs must generate a new message_id.' - format: uuid - type: string - timestamp: - description: Time of request generation in RFC3339 format - format: date-time - type: string - transaction_id: - description: 'This is a unique value which persists across all API calls from `search` through `confirm`. This is done to indicate an active user session across multiple requests. The BPPs can use this value to push personalized recommendations, and dynamic offerings related to an ongoing transaction despite being unaware of the user active on the BAP.' - format: uuid - type: string - ttl: - description: The duration in ISO8601 format after timestamp for which this message holds valid - type: string - version: - description: Version of transaction protocol being used by the sender. - type: string - type: object - Country: - additionalProperties: false - description: Describes a country. - properties: - code: - description: Country code as per ISO 3166-1 and ISO 3166-2 format - type: string - name: - description: Name of the country - type: string - type: object - Credential: - additionalProperties: false - description: Describes a credential of an entity - Person or Organization - properties: - id: - type: string - type: - default: VerifiableCredential - type: string - url: - description: URL of the credential - format: uri - type: string - type: object - Customer: - additionalProperties: false - description: Describes a customer buying/availing a product or a service - properties: - contact: - $ref: '#/components/schemas/Contact' - person: - $ref: '#/components/schemas/Person' - type: object - DecimalValue: - description: Describes a decimal value - pattern: '^[+-]?([0-9]*[.])?[0-9]+' - type: string - Descriptor: - additionalProperties: false - description: Physical description of something. - properties: - additional_desc: - properties: - content_type: - enum: - - text/plain - - text/html - - application/json - type: string - url: - type: string - type: object - code: - type: string - images: - items: - $ref: '#/components/schemas/Image' - type: array - long_desc: - type: string - media: - items: - $ref: '#/components/schemas/MediaFile' - type: array - name: - type: string - short_desc: - type: string - type: object - Domain: - additionalProperties: false - description: 'Described the industry sector or sub-sector. The network policy should contain codes for all the industry sectors supported by the network. Domains can be created in varying levels of granularity. The granularity of a domain can be decided by the participants of the network. Too broad domains will result in irrelevant search broadcast calls to BPPs that don''t have services supporting the domain. Too narrow domains will result in a large number of registry entries for each BPP. It is recommended that network facilitators actively collaborate with various working groups and network participants to carefully choose domain codes keeping in mind relevance, performance, and opportunity cost. It is recommended that networks choose broad domains like mobility, logistics, healthcare etc, and progressively granularize them as and when the number of network participants for each domain grows large.' - properties: - additional_info: - allOf: - - $ref: '#/components/schemas/MediaFile' - description: A url that contains addtional information about that domain. - code: - description: 'Standard code representing the domain. The standard is usually published as part of the network policy. Furthermore, the network facilitator should also provide a mechanism to provide the supported domains of a network.' - type: string - name: - description: Name of the domain - type: string - type: object - Duration: - description: Describes duration as per ISO8601 format - type: string - Error: - additionalProperties: false - description: 'Describes an error object that is returned by a BAP, BPP or BG as a response or callback to an action by another network participant. This object is sent when any request received by a network participant is unacceptable. This object can be sent either during Ack or with the callback.' - properties: - code: - description: 'Standard error code. For full list of error codes, refer to docs/protocol-drafts/BECKN-005-ERROR-CODES-DRAFT-01.md of this repo"' - type: string - message: - description: Human readable message describing the error. Used mainly for logging. Not recommended to be shown to the user. - type: string - paths: - description: Path to json schema generating the error. Used only during json schema validation errors - type: string - type: object - Fee: - additionalProperties: false - description: A fee applied on a particular entity - properties: - amount: - allOf: - - $ref: '#/components/schemas/Price' - description: A fixed value - percentage: - allOf: - - $ref: '#/components/schemas/DecimalValue' - description: Percentage of a value - type: object - Form: - additionalProperties: false - description: Describes a form - properties: - data: - additionalProperties: - type: string - description: The form submission data - type: object - mime_type: - description: This field indicates the nature and format of the form received by querying the url. MIME types are defined and standardized in IETF's RFC 6838. - enum: - - text/html - - application/xml - type: string - submission_id: - format: uuid - type: string - url: - description: 'The URL from where the form can be fetched. The content fetched from the url must be processed as per the mime_type specified in this object. Once fetched, the rendering platform can choosed to render the form as-is as an embeddable element; or process it further to blend with the theme of the application. In case the interface is non-visual, the the render can process the form data and reproduce it as per the standard specified in the form.' - format: uri - type: string - type: object - Fulfillment: - additionalProperties: false - description: Describes how a an order will be rendered/fulfilled to the end-customer - properties: - agent: - allOf: - - $ref: '#/components/schemas/Agent' - description: The agent that is currently handling the fulfillment of the order - contact: - $ref: '#/components/schemas/Contact' - customer: - allOf: - - $ref: '#/components/schemas/Customer' - description: The person that will ultimately receive the order - id: - description: Unique reference ID to the fulfillment of an order - type: string - path: - description: The physical path taken by the agent that can be rendered on a map. The allowed format of this property can be set by the network. - type: string - rateable: - description: Whether the fulfillment can be rated or not - type: boolean - rating: - allOf: - - $ref: '#/components/schemas/Rating/properties/value' - description: The rating value of the fulfullment service. - state: - allOf: - - $ref: '#/components/schemas/FulfillmentState' - description: The current state of fulfillment. The BPP must set this value whenever the state of the order fulfillment changes and fire an unsolicited `on_status` call. - stops: - description: The list of logical stops encountered during the fulfillment of an order. - items: - $ref: '#/components/schemas/Stop' - type: array - tags: - items: - $ref: '#/components/schemas/TagGroup' - type: array - tracking: - default: false - description: Indicates whether the fulfillment allows tracking - type: boolean - type: - description: 'A code that describes the mode of fulfillment. This is typically set when there are multiple ways an order can be fulfilled. For example, a retail order can be fulfilled either via store pickup or a home delivery. Similarly, a medical consultation can be provided either in-person or via tele-consultation. The network policy must publish standard fulfillment type codes for the different modes of fulfillment.' - type: string - vehicle: - $ref: '#/components/schemas/Vehicle' - type: object - FulfillmentState: - additionalProperties: false - description: Describes the state of fulfillment - properties: - descriptor: - $ref: '#/components/schemas/Descriptor' - updated_at: - format: date-time - type: string - updated_by: - description: ID of entity which changed the state - type: string - type: object - Gps: - description: Describes a gps coordinate - pattern: '^[-+]?([1-8]?\d(\.\d{6,})?|90(\.0{6,})?),\s*[-+]?(180(\.0{6,})?|((1[0-7]\d)|([1-9]?\d))(\.\d{6,})?)$' - type: string - Image: - additionalProperties: false - description: Describes an image - properties: - height: - description: Height of the image in pixels - type: string - size_type: - description: The size of the image. The network policy can define the default dimensions of each type - enum: - - xs - - sm - - md - - lg - - xl - - custom - type: string - url: - description: URL to the image. This can be a data url or an remote url - format: uri - type: string - width: - description: Width of the image in pixels - type: string - required: - - url - type: object - Intent: - additionalProperties: false - description: 'The intent to buy or avail a product or a service. The BAP can declare the intent of the consumer containing
  • What they want (A product, service, offer)
  • Who they want (A seller, service provider, agent etc)
  • Where they want it and where they want it from
  • When they want it (start and end time of fulfillment
  • How they want to pay for it

This has properties like descriptor,provider,fulfillment,payment,category,offer,item,tags
This is typically used by the BAP to send the purpose of the user''s search to the BPP. This will be used by the BPP to find products or services it offers that may match the user''s intent.
For example, in Mobility, the mobility consumer declares a mobility intent. In this case, the mobility consumer declares information that describes various aspects of their journey like,
  • Where would they like to begin their journey (intent.fulfillment.start.location)
  • Where would they like to end their journey (intent.fulfillment.end.location)
  • When would they like to begin their journey (intent.fulfillment.start.time)
  • When would they like to end their journey (intent.fulfillment.end.time)
  • Who is the transport service provider they would like to avail services from (intent.provider)
  • Who is traveling (This is not recommended in public networks) (intent.fulfillment.customer)
  • What kind of fare product would they like to purchase (intent.item)
  • What add-on services would they like to avail
  • What offers would they like to apply on their booking (intent.offer)
  • What category of services would they like to avail (intent.category)
  • What additional luggage are they carrying
  • How would they like to pay for their journey (intent.payment)

For example, in health domain, a consumer declares the intent for a lab booking the describes various aspects of their booking like,
  • Where would they like to get their scan/test done (intent.fulfillment.start.location)
  • When would they like to get their scan/test done (intent.fulfillment.start.time)
  • When would they like to get the results of their test/scan (intent.fulfillment.end.time)
  • Who is the service provider they would like to avail services from (intent.provider)
  • Who is getting the test/scan (intent.fulfillment.customer)
  • What kind of test/scan would they like to purchase (intent.item)
  • What category of services would they like to avail (intent.category)
  • How would they like to pay for their journey (intent.payment)
' - properties: - category: - allOf: - - $ref: '#/components/schemas/Category' - description: Details on the item category - descriptor: - allOf: - - $ref: '#/components/schemas/Descriptor' - description: 'A raw description of the search intent. Free text search strings, raw audio, etc can be sent in this object.' - fulfillment: - allOf: - - $ref: '#/components/schemas/Fulfillment' - description: Details on how the customer wants their order fulfilled - item: - allOf: - - $ref: '#/components/schemas/Item' - description: Details of the item that the consumer wants to order - offer: - allOf: - - $ref: '#/components/schemas/Offer' - description: details on the offer the customer wants to avail - payment: - allOf: - - $ref: '#/components/schemas/Payment' - description: Details on how the customer wants to pay for the order - provider: - allOf: - - $ref: '#/components/schemas/Provider' - description: The provider from which the customer wants to place to the order from - tags: - items: - $ref: '#/components/schemas/TagGroup' - type: array - type: object - Item: - additionalProperties: false - description: 'Describes a product or a service offered to the end consumer by the provider. In the mobility sector, it can represent a fare product like one way journey. In the logistics sector, it can represent the delivery service offering. In the retail domain it can represent a product like a grocery item.' - properties: - add_ons: - items: - $ref: '#/components/schemas/AddOn' - type: array - cancellation_terms: - description: Cancellation terms of this item - items: - $ref: '#/components/schemas/CancellationTerm' - type: array - category_ids: - description: Categories this item can be listed under - items: - allOf: - - $ref: '#/components/schemas/Category/properties/id' - type: array - creator: - allOf: - - $ref: '#/components/schemas/Organization' - description: The creator of this item - descriptor: - allOf: - - $ref: '#/components/schemas/Descriptor' - description: Physical description of the item - fulfillment_ids: - description: Modes through which this item can be fulfilled - items: - allOf: - - $ref: '#/components/schemas/Fulfillment/properties/id' - type: array - id: - description: ID of the item. - type: string - location_ids: - description: Provider Locations this item is available in - items: - allOf: - - $ref: '#/components/schemas/Location/properties/id' - type: array - matched: - description: Whether this item is an exact match of the request - type: boolean - parent_item_id: - allOf: - - $ref: '#/components/schemas/Item/properties/id' - description: 'ID of the item, this item is a variant of' - parent_item_quantity: - allOf: - - $ref: '#/components/schemas/ItemQuantity' - description: The number of units of the parent item this item is a multiple of - payment_ids: - description: Payment modalities through which this item can be ordered - items: - allOf: - - $ref: '#/components/schemas/Payment/properties/id' - type: array - price: - allOf: - - $ref: '#/components/schemas/Price' - description: 'The price of this item, if it has intrinsic value' - quantity: - allOf: - - $ref: '#/components/schemas/ItemQuantity' - description: The selling quantity of the item - rateable: - description: Whether this item can be rated - type: boolean - rating: - allOf: - - $ref: '#/components/schemas/Rating/properties/value' - description: The rating of the item - recommended: - description: Whether this item is a recommended item to a response - type: boolean - refund_terms: - description: Refund terms of this item - items: - description: Refund term of an item or an order - properties: - fulfillment_state: - allOf: - - $ref: '#/components/schemas/State' - description: The state of fulfillment during which this term is applicable. - refund_amount: - $ref: '#/components/schemas/Price' - refund_eligible: - description: Indicates if cancellation will result in a refund - type: boolean - refund_within: - allOf: - - $ref: '#/components/schemas/Time' - description: Time within which refund will be processed after successful cancellation. - type: object - type: array - related: - description: Whether this item is a related item to the exactly matched item - type: boolean - replacement_terms: - description: Terms that are applicable be met when this item is replaced - items: - $ref: '#/components/schemas/ReplacementTerm' - type: array - return_terms: - description: Terms that are applicable when this item is returned - items: - $ref: '#/components/schemas/ReturnTerm' - type: array - tags: - items: - $ref: '#/components/schemas/TagGroup' - type: array - time: - allOf: - - $ref: '#/components/schemas/Time' - description: Temporal attributes of this item. This property is used when the item exists on the catalog only for a limited period of time. - ttl: - description: Time to live in seconds for an instance of this schema - type: string - xinput: - allOf: - - $ref: '#/components/schemas/XInput' - description: Additional input required from the customer to purchase / avail this item - type: object - ItemQuantity: - additionalProperties: false - description: Describes the count or amount of an item - properties: - allocated: - description: This represents the exact quantity allocated for purchase of the item. - properties: - count: - minimum: 0 - type: integer - measure: - $ref: '#/components/schemas/Scalar' - type: object - available: - description: This represents the exact quantity available for purchase of the item. The buyer can only purchase multiples of this - properties: - count: - minimum: 0 - type: integer - measure: - $ref: '#/components/schemas/Scalar' - type: object - maximum: - description: This represents the maximum quantity allowed for purchase of the item - properties: - count: - minimum: 1 - type: integer - measure: - $ref: '#/components/schemas/Scalar' - type: object - minimum: - description: This represents the minimum quantity allowed for purchase of the item - properties: - count: - minimum: 0 - type: integer - measure: - $ref: '#/components/schemas/Scalar' - type: object - selected: - description: This represents the quantity selected for purchase of the item - properties: - count: - minimum: 0 - type: integer - measure: - $ref: '#/components/schemas/Scalar' - type: object - unitized: - description: This represents the quantity available in a single unit of the item - properties: - count: - maximum: 1 - minimum: 1 - type: integer - measure: - $ref: '#/components/schemas/Scalar' - type: object - type: object - Location: - additionalProperties: false - description: The physical location of something - properties: - 3dspace: - description: The three dimensional region describing this location - type: string - address: - allOf: - - $ref: '#/components/schemas/Address' - description: The address of this location. - area_code: - type: string - circle: - $ref: '#/components/schemas/Circle' - city: - allOf: - - $ref: '#/components/schemas/City' - description: 'The city this location is, or is located within' - country: - allOf: - - $ref: '#/components/schemas/Country' - description: 'The country this location is, or is located within' - descriptor: - $ref: '#/components/schemas/Descriptor' - district: - description: 'The state this location is, or is located within' - type: string - gps: - allOf: - - $ref: '#/components/schemas/Gps' - description: The GPS co-ordinates of this location. - id: - type: string - map_url: - description: The url to the map of the location. This can be a globally recognized map url or the one specified by the network policy. - format: uri - type: string - polygon: - description: The boundary polygon of this location - type: string - rating: - allOf: - - $ref: '#/components/schemas/Rating/properties/value' - description: The rating of this location - state: - allOf: - - $ref: '#/components/schemas/State' - description: 'The state this location is, or is located within' - type: object - MediaFile: - additionalProperties: false - description: This object contains a url to a media file. - properties: - dsa: - description: The signing algorithm used by the sender - type: string - mimetype: - description: 'indicates the nature and format of the document, file, or assortment of bytes. MIME types are defined and standardized in IETF''s RFC 6838' - type: string - signature: - description: The digital signature of the file signed by the sender - type: string - url: - description: The URL of the file - format: uri - type: string - type: object - Offer: - additionalProperties: false - description: An offer associated with a catalog. This is typically used to promote a particular product and enable more purchases. - properties: - category_ids: - items: - $ref: '#/components/schemas/Category/properties/id' - type: array - descriptor: - $ref: '#/components/schemas/Descriptor' - id: - type: string - item_ids: - items: - $ref: '#/components/schemas/Item/properties/id' - type: array - location_ids: - items: - $ref: '#/components/schemas/Location/properties/id' - type: array - tags: - items: - $ref: '#/components/schemas/TagGroup' - type: array - time: - $ref: '#/components/schemas/Time' - type: object - Option: - additionalProperties: false - description: Describes a selectable option - properties: - descriptor: - $ref: '#/components/schemas/Descriptor' - id: - type: string - type: object - Order: - additionalProperties: false - description: Describes a legal purchase order. It contains the complete details of the legal contract created between the buyer and the seller. - properties: - add_ons: - description: The add-ons purchased / availed in this order - items: - $ref: '#/components/schemas/AddOn' - type: array - billing: - allOf: - - $ref: '#/components/schemas/Billing' - description: The billing details of this order - cancellation: - allOf: - - $ref: '#/components/schemas/Cancellation' - description: The cancellation details of this order - cancellation_terms: - description: Cancellation terms of this item - items: - $ref: '#/components/schemas/CancellationTerm' - type: array - created_at: - description: The date-time of creation of this order - format: date-time - type: string - fulfillments: - description: The fulfillments involved in completing this order - items: - $ref: '#/components/schemas/Fulfillment' - type: array - id: - description: Human-readable ID of the order. This is generated at the BPP layer. The BPP can either generate order id within its system or forward the order ID created at the provider level. - type: string - items: - description: The items purchased / availed in this order - items: - $ref: '#/components/schemas/Item' - type: array - offers: - description: The offers applied in this order - items: - $ref: '#/components/schemas/Offer' - type: array - payments: - description: The terms of settlement for this order - items: - $ref: '#/components/schemas/Payment' - type: array - provider: - allOf: - - $ref: '#/components/schemas/Provider' - description: Details of the provider whose catalog items have been selected. - quote: - allOf: - - $ref: '#/components/schemas/Quotation' - description: The mutually agreed upon quotation for this order. - ref_order_ids: - description: A list of order IDs to link this order to previous orders. - items: - description: ID of a previous order - type: string - type: array - refund_terms: - description: Refund terms of this item - items: - $ref: '#/components/schemas/Item/properties/refund_terms/items' - type: array - replacement_terms: - description: Replacement terms of this item - items: - $ref: '#/components/schemas/ReplacementTerm' - type: array - return_terms: - description: Return terms of this item - items: - $ref: '#/components/schemas/ReturnTerm' - type: array - status: - description: Status of the order. Allowed values can be defined by the network policy - type: string - tags: - items: - $ref: '#/components/schemas/TagGroup' - type: array - type: - default: DEFAULT - description: 'This is used to indicate the type of order being created to BPPs. Sometimes orders can be linked to previous orders, like a replacement order in a retail domain. A follow-up consultation in healthcare domain. A single order part of a subscription order. The list of order types can be standardized at the network level.' - enum: - - DRAFT - - DEFAULT - type: string - updated_at: - description: The date-time of updated of this order - format: date-time - type: string - xinput: - allOf: - - $ref: '#/components/schemas/XInput' - description: Additional input required from the customer to confirm this order - type: object - Organization: - additionalProperties: false - description: An organization. Usually a recognized business entity. - properties: - address: - allOf: - - $ref: '#/components/schemas/Address' - description: The postal address of the organization - city: - allOf: - - $ref: '#/components/schemas/City' - description: The city where the the organization's address is registered - contact: - $ref: '#/components/schemas/Contact' - descriptor: - $ref: '#/components/schemas/Descriptor' - state: - allOf: - - $ref: '#/components/schemas/State' - description: The state where the organization's address is registered - type: object - Payment: - additionalProperties: false - description: 'Describes the terms of settlement between the BAP and the BPP for a single transaction. When instantiated, this object contains
  1. the amount that has to be settled,
  2. The payment destination destination details
  3. When the settlement should happen, and
  4. A transaction reference ID
. During a transaction, the BPP reserves the right to decide the terms of payment. However, the BAP can send its terms to the BPP first. If the BPP does not agree to those terms, it must overwrite the terms and return them to the BAP. If overridden, the BAP must either agree to the terms sent by the BPP in order to preserve the provider''s autonomy, or abort the transaction. In case of such disagreements, the BAP and the BPP can perform offline negotiations on the payment terms. Once an agreement is reached, the BAP and BPP can resume transactions.' - properties: - collected_by: - description: 'This field indicates who is the collector of payment. The BAP can set this value to ''bap'' if it wants to collect the payment first and settle it to the BPP. If the BPP agrees to those terms, the BPP should not send the payment url. Alternatively, the BPP can set this field with the value ''bpp'' if it wants the payment to be made directly.' - type: string - id: - description: ID of the payment term that can be referred at an item or an order level in a catalog - type: string - params: - properties: - amount: - type: string - bank_account_number: - type: string - bank_code: - type: string - currency: - type: string - source_bank_account_number: - type: string - source_bank_code: - type: string - source_virtual_payment_address: - type: string - transaction_id: - description: The reference transaction ID associated with a payment activity - type: string - virtual_payment_address: - type: string - type: object - status: - type: string - tags: - items: - $ref: '#/components/schemas/TagGroup' - type: array - time: - $ref: '#/components/schemas/Time' - type: - type: string - url: - description: 'A payment url to be called by the BAP. If empty, then the payment is to be done offline. The details of payment should be present in the params object. If tl_method = http/get, then the payment details will be sent as url params. Two url param values, ```$transaction_id``` and ```$amount``` are mandatory.' - format: uri - type: string - type: object - Person: - additionalProperties: false - description: Describes a person as any individual - properties: - age: - allOf: - - $ref: '#/components/schemas/Duration' - description: Age of the person - creds: - items: - $ref: '#/components/schemas/Credential' - type: array - dob: - description: Date of birth of the person - format: date - type: string - gender: - description: 'Gender of something, typically a Person, but possibly also fictional characters, animals, etc. While Male and Female may be used, text strings are also acceptable for people who do not identify as a binary gender.Allowed values for this field can be published in the network policy' - type: string - id: - description: Describes the identity of the person - type: string - image: - $ref: '#/components/schemas/Image' - languages: - items: - description: Describes a language known to the person. - properties: - code: - type: string - name: - type: string - type: object - type: array - name: - description: the name of the person - type: string - skills: - items: - description: Describes a skill of the person. - properties: - code: - type: string - name: - type: string - type: object - type: array - tags: - items: - $ref: '#/components/schemas/TagGroup' - type: array - url: - description: Profile url of the person - format: uri - type: string - type: object - Price: - additionalProperties: false - description: Describes the price of an item. Allows for domain extension. - properties: - computed_value: - $ref: '#/components/schemas/DecimalValue' - currency: - type: string - estimated_value: - $ref: '#/components/schemas/DecimalValue' - listed_value: - $ref: '#/components/schemas/DecimalValue' - maximum_value: - $ref: '#/components/schemas/DecimalValue' - minimum_value: - $ref: '#/components/schemas/DecimalValue' - offered_value: - $ref: '#/components/schemas/DecimalValue' - value: - $ref: '#/components/schemas/DecimalValue' - type: object - Provider: - additionalProperties: false - description: Describes the catalog of a business. - properties: - categories: - items: - $ref: '#/components/schemas/Category' - type: array - category_id: - description: Category Id of the provider at the BPP-level catalog - type: string - descriptor: - $ref: '#/components/schemas/Descriptor' - exp: - description: Time after which catalog has to be refreshed - format: date-time - type: string - fulfillments: - items: - $ref: '#/components/schemas/Fulfillment' - type: array - id: - description: Id of the provider - type: string - items: - items: - $ref: '#/components/schemas/Item' - type: array - locations: - items: - $ref: '#/components/schemas/Location' - type: array - offers: - items: - $ref: '#/components/schemas/Offer' - type: array - payments: - items: - $ref: '#/components/schemas/Payment' - type: array - rateable: - description: Whether this provider can be rated or not - type: boolean - rating: - $ref: '#/components/schemas/Rating/properties/value' - tags: - items: - $ref: '#/components/schemas/TagGroup' - type: array - time: - $ref: '#/components/schemas/Time' - ttl: - description: 'The time-to-live in seconds, for this object. This can be overriden at deeper levels. A value of -1 indicates that this object is not cacheable.' - minimum: -1 - type: integer - type: object - Quotation: - additionalProperties: false - description: 'Describes a quote. It is the estimated price of products or services from the BPP.
This has properties like price, breakup, ttl' - properties: - breakup: - description: the breakup of the total quoted price - items: - properties: - item: - $ref: '#/components/schemas/Item' - price: - $ref: '#/components/schemas/Price' - title: - type: string - type: object - type: array - id: - description: ID of the quote. - format: uuid - type: string - price: - allOf: - - $ref: '#/components/schemas/Price' - description: The total quoted price - ttl: - $ref: '#/components/schemas/Duration' - type: object - Rating: - additionalProperties: false - description: Describes the rating of an entity - properties: - id: - description: Id of the object being rated - type: string - rating_category: - description: Category of the entity being rated - type: string - value: - description: 'Rating value given to the object. This can be a single value or can also contain an inequality operator like gt, gte, lt, lte. This can also contain an inequality expression containing logical operators like && and ||.' - type: string - type: object - Region: - additionalProperties: false - description: Describes an arbitrary region of space. The network policy should contain a published list of supported regions by the network. - properties: - boundary: - description: 'A string representing the boundary of the region. One-dimensional regions are represented by polylines. Two-dimensional regions are represented by polygons, and three-dimensional regions can represented by polyhedra.' - type: string - code: - description: A standard code representing the region. This should be interpreted in the same way by all network participants. - type: string - dimensions: - description: 'The number of dimensions that are used to describe any point inside that region. The most common dimensionality of a region is 2, that represents an area on a map. There are regions on the map that can be approximated to one-dimensional regions like roads, railway lines, or shipping lines. 3 dimensional regions are rarer, but are gaining popularity as flying drones are being adopted for various fulfillment services.' - enum: - - '1' - - '2' - - '3' - type: string - map_url: - description: The url to the map of the region. This can be a globally recognized map or the one specified by the network policy. - type: string - name: - description: Name of the region as specified on the map where that region exists. - type: string - type: - description: 'The type of region. This is used to specify the granularity of the region represented by this object. Various examples of two-dimensional region types are city, country, state, district, and so on. The network policy should contain a list of all possible region types supported by the network.' - type: string - type: object - ReplacementTerm: - additionalProperties: false - description: The replacement policy of an item or an order - properties: - external_ref: - $ref: '#/components/schemas/MediaFile' - fulfillment_state: - allOf: - - $ref: '#/components/schemas/State' - description: The state of fulfillment during which this term is applicable. - replace_within: - allOf: - - $ref: '#/components/schemas/Time' - description: 'Applicable only for buyer managed returns where the buyer has to replace the item before a certain date-time, failing which they will not be eligible for replacement' - type: object - ReturnTerm: - additionalProperties: false - description: Describes the return policy of an item or an order - properties: - fulfillment_managed_by: - description: The entity that will perform the return - type: string - fulfillment_state: - allOf: - - $ref: '#/components/schemas/State' - description: The state of fulfillment during which this term IETF''s applicable. - return_eligible: - description: Indicates whether the item is eligible for return - type: boolean - return_location: - allOf: - - $ref: '#/components/schemas/Location' - description: The location where the item or order must / will be returned to - return_time: - allOf: - - $ref: '#/components/schemas/Time' - description: 'Applicable only for buyer managed returns where the buyer has to return the item to the origin before a certain date-time, failing which they will not be eligible for refund.' - type: object - Scalar: - additionalProperties: false - description: Describes a scalar - properties: - computed_value: - $ref: '#/components/schemas/DecimalValue' - estimated_value: - $ref: '#/components/schemas/DecimalValue' - range: - properties: - max: - $ref: '#/components/schemas/DecimalValue' - min: - $ref: '#/components/schemas/DecimalValue' - type: object - type: - enum: - - CONSTANT - - VARIABLE - type: string - unit: - type: string - value: - $ref: '#/components/schemas/DecimalValue' - type: object - Schedule: - additionalProperties: false - description: Describes a schedule - properties: - frequency: - $ref: '#/components/schemas/Duration' - holidays: - items: - format: date-time - type: string - type: array - times: - items: - format: date-time - type: string - type: array - type: object - State: - additionalProperties: false - description: A bounded geopolitical region of governance inside a country. - properties: - code: - description: State code as per country or international standards - type: string - name: - description: Name of the state - type: string - type: object - Stop: - additionalProperties: false - description: A logical point in space and time during the fulfillment of an order. - properties: - authorization: - $ref: '#/components/schemas/Authorization' - contact: - allOf: - - $ref: '#/components/schemas/Contact' - description: Contact details of the stop - id: - type: string - instructions: - allOf: - - $ref: '#/components/schemas/Descriptor' - description: Instructions that need to be followed at the stop - location: - allOf: - - $ref: '#/components/schemas/Location' - description: Location of the stop - parent_stop_id: - type: string - person: - allOf: - - $ref: '#/components/schemas/Person' - description: The details of the person present at the stop - time: - allOf: - - $ref: '#/components/schemas/Time' - description: Timings applicable at the stop. - type: - description: The type of stop. Allowed values of this property can be defined by the network policy. - enum: - - START - - END - type: string - type: object - Support: - additionalProperties: false - description: Details of customer support - properties: - callback_phone: - pattern: '^\+?[1-9]\d{1,14}$' - type: string - email: - format: email - type: string - phone: - pattern: '^\+?[1-9]\d{1,14}$' - type: string - ref_id: - type: string - url: - format: uri - type: string - type: object - Tag: - additionalProperties: false - description: 'Describes a tag. This is used to contain extended metadata. This object can be added as a property to any schema to describe extended attributes. For BAPs, tags can be sent during search to optimize and filter search results. BPPs can use tags to index their catalog to allow better search functionality. Tags are sent by the BPP as part of the catalog response in the `on_search` callback. Tags are also meant for display purposes. Upon receiving a tag, BAPs are meant to render them as name-value pairs. This is particularly useful when rendering tabular information about a product or service.' - properties: - descriptor: - allOf: - - $ref: '#/components/schemas/Descriptor' - description: 'Description of the Tag, can be used to store detailed information.' - display: - description: 'This value indicates if the tag is intended for display purposes. If set to `true`, then this tag must be displayed. If it is set to `false`, it should not be displayed. This value can override the group display value.' - type: boolean - value: - description: The value of the tag. This set by the BPP and rendered as-is by the BAP. - type: string - type: object - TagGroup: - additionalProperties: false - description: 'A collection of tag objects with group level attributes. For detailed documentation on the Tags and Tag Groups schema go to https://github.com/beckn/protocol-specifications/discussions/316' - properties: - descriptor: - allOf: - - $ref: '#/components/schemas/Descriptor' - description: 'Description of the TagGroup, can be used to store detailed information.' - display: - default: true - description: 'Indicates the display properties of the tag group. If display is set to false, then the group will not be displayed. If it is set to true, it should be displayed. However, group-level display properties can be overriden by individual tag-level display property. As this schema is purely for catalog display purposes, it is not recommended to send this value during search.' - type: boolean - list: - description: 'An array of Tag objects listed under this group. This property can be set by BAPs during search to narrow the `search` and achieve more relevant results. When received during `on_search`, BAPs must render this list under the heading described by the `name` property of this schema.' - items: - $ref: '#/components/schemas/Tag' - type: array - type: object - Time: - additionalProperties: false - description: Describes time in its various forms. It can be a single point in time; duration; or a structured timetable of operations - properties: - days: - description: comma separated values representing days of the week - type: string - duration: - $ref: '#/components/schemas/Duration' - label: - type: string - range: - properties: - end: - format: date-time - type: string - start: - format: date-time - type: string - type: object - schedule: - $ref: '#/components/schemas/Schedule' - timestamp: - format: date-time - type: string - type: object - Tracking: - additionalProperties: false - description: Contains tracking information that can be used by the BAP to track the fulfillment of an order in real-time. which is useful for knowing the location of time sensitive deliveries. - properties: - id: - description: A unique tracking reference number - type: string - location: - allOf: - - $ref: '#/components/schemas/Location' - description: 'In case there is no real-time tracking endpoint available, this field will contain the latest location of the entity being tracked. The BPP will update this value everytime the BAP calls the track API.' - status: - description: 'This value indicates if the tracking is currently active or not. If this value is `active`, then the BAP can begin tracking the order. If this value is `inactive`, the tracking URL is considered to be expired and the BAP should stop tracking the order.' - enum: - - ACTIVE - - INACTIVE - type: string - url: - description: 'A URL to the tracking endpoint. This can be a link to a tracking webpage, a webhook URL created by the BAP where BPP can push the tracking data, or a GET url creaed by the BPP which the BAP can poll to get the tracking data. It can also be a websocket URL where the BPP can push real-time tracking data.' - format: uri - type: string - type: object - Vehicle: - additionalProperties: false - description: 'Describes a vehicle is a device that is designed or used to transport people or cargo over land, water, air, or through space.
This has properties like category, capacity, make, model, size,variant,color,energy_type,registration' - properties: - capacity: - type: integer - cargo_volumne: - type: string - category: - type: string - code: - type: string - color: - type: string - emission_standard: - type: string - energy_type: - type: string - make: - type: string - model: - type: string - registration: - type: string - size: - type: string - variant: - type: string - wheelchair_access: - type: string - wheels_count: - type: string - type: object - XInput: - additionalProperties: false - description: 'Contains any additional or extended inputs required to confirm an order. This is typically a Form Input. Sometimes, selection of catalog elements is not enough for the BPP to confirm an order. For example, to confirm a flight ticket, the airline requires details of the passengers along with information on baggage, identity, in addition to the class of ticket. Similarly, a logistics company may require details on the nature of shipment in order to confirm the shipping. A recruiting firm may require additional details on the applicant in order to confirm a job application. For all such purposes, the BPP can choose to send this object attached to any object in the catalog that is required to be sent while placing the order. This object can typically be sent at an item level or at the order level. The item level XInput will override the Order level XInput as it indicates a special requirement of information for that particular item. Hence the BAP must render a separate form for the Item and another form at the Order level before confirmation.' - properties: - form: - $ref: '#/components/schemas/Form' - required: - description: Indicates whether the form data is mandatorily required by the BPP to confirm the order. - type: boolean - type: object \ No newline at end of file diff --git a/layer2/samples/retail_1.1.0.yaml b/layer2/samples/retail_1.1.0.yaml deleted file mode 100644 index e57689e..0000000 --- a/layer2/samples/retail_1.1.0.yaml +++ /dev/null @@ -1,2164 +0,0 @@ -openapi: 3.0.0 -info: - title: Beckn for Local Retail - description: Adaptation of beckn protocol for the local retail domain - version: 1.1.0 -security: - - SubscriberAuth: [] -paths: - /search: - post: - tags: - - Beckn Provider Platform (BPP) - - Beckn Gateway (BG) - description: BAP declares the customer's intent to buy products from retail providers - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - search - message: - type: object - properties: - intent: - $ref: "#/components/schemas/Intent" - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /select: - post: - tags: - - Beckn Provider Platform (BPP) - description: BAP declares the customer's cart (or equivalent) created by selecting objects from the catalog - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - select - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /init: - post: - tags: - - Beckn Provider Platform (BPP) - description: Initialize an order by providing billing and/or shipping details - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - init - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - allOf: - - $ref: "#/components/schemas/Ack" - - properties: - status: - enum: - - ACK - - NACK - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /confirm: - post: - tags: - - Beckn Provider Platform (BPP) - description: Initialize an order by providing billing and/or shipping details - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - confirm - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /status: - post: - tags: - - Beckn Provider Platform (BPP) - description: Fetch the latest order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - status - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - required: - - order_id - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /track: - post: - tags: - - Beckn Provider Platform (BPP) - description: Track an active order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - track - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - callback_url: - type: string - format: uri - required: - - order_id - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /cancel: - post: - tags: - - Beckn Provider Platform (BPP) - description: Cancel an order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - cancel - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - cancellation_reason_id: - $ref: "#/components/schemas/Option/properties/id" - descriptor: - $ref: "#/components/schemas/Descriptor" - required: - - order_id - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /update: - post: - tags: - - Beckn Provider Platform (BPP) - description: Remove object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - update - required: - - action - message: - type: object - properties: - update_target: - description: 'Comma separated values of order objects being updated. For example: ```"update_target":"item,billing,fulfillment"```' - type: string - order: - description: Updated order object - allOf: - - $ref: "#/components/schemas/Order" - required: - - update_target - - order - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /rating: - post: - tags: - - Beckn Provider Platform (BPP) - description: Provide feedback on a service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - rating - required: - - action - message: - type: object - properties: - ratings: - type: array - items: - $ref: "#/components/schemas/Rating" - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /support: - post: - tags: - - Beckn Provider Platform (BPP) - description: Contact support - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - support - required: - - action - message: - type: object - properties: - support: - $ref: "#/components/schemas/Support" - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_search: - post: - tags: - - Beckn Application Platform (BAP) - - Beckn Gateway (BG) - description: BPP sends its catalog in response to a search request. - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_search - required: - - action - message: - type: object - properties: - catalog: - $ref: "#/components/schemas/Catalog" - required: - - catalog - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_select: - post: - tags: - - Beckn Application Platform (BAP) - description: Send draft order object with quoted price for selected items - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_select - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_init: - post: - tags: - - Beckn Application Platform (BAP) - description: Send order object with payment details updated - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_init - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_confirm: - post: - tags: - - Beckn Application Platform (BAP) - description: Send active order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_confirm - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_track: - post: - tags: - - Beckn Application Platform (BAP) - description: Send tracking details of an active order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_track - required: - - action - message: - type: object - properties: - tracking: - $ref: "#/components/schemas/Tracking" - required: - - tracking - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_cancel: - post: - tags: - - Beckn Application Platform (BAP) - description: Send cancellation request_id with reasons list in case of cancellation request. Else send cancelled order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_cancel - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_update: - post: - tags: - - Beckn Application Platform (BAP) - description: Returns updated service with updated runtime object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_update - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_status: - post: - tags: - - Beckn Application Platform (BAP) - description: Fetch the status of a Service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_status - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_rating: - post: - tags: - - Beckn Application Platform (BAP) - description: Provide feedback on a service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_rating - required: - - action - message: - type: object - properties: - feedback_form: - description: A feedback form to allow the user to provide additional information on the rating provided - allOf: - - $ref: "#/components/schemas/XInput" - error: - $ref: "#/components/schemas/Error" - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_support: - post: - tags: - - Beckn Application Platform (BAP) - description: Contact Support - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_support - required: - - action - message: - type: object - properties: - support: - $ref: "#/components/schemas/Support" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" -components: - securitySchemes: - SubscriberAuth: - type: apiKey - in: header - name: Authorization - description: 'Signature of message body using BAP or BPP subscriber''s signing public key.

Format:

Authorization : Signature keyId="{subscriber_id}|{unique_key_id}|{algorithm}",algorithm="ed25519",created="1606970629",expires="1607030629",headers="(created) (expires) digest",signature="Base64(signing string)"' - schemas: - Ack: - description: "Describes the acknowledgement sent in response to an API call. If the implementation uses HTTP/S, then Ack must be returned in the same session. Every API call to a BPP must be responded to with an Ack whether the BPP intends to respond with a callback or not. This has one property called `status` that indicates the status of the Acknowledgement." - type: object - properties: - status: - type: string - description: "The status of the acknowledgement. If the request passes the validation criteria of the BPP, then this is set to ACK. If a BPP responds with status = `ACK` to a request, it is required to respond with a callback. If the request fails the validation criteria, then this is set to NACK. Additionally, if a BPP does not intend to respond with a callback even after the request meets the validation criteria, it should set this value to `NACK`." - enum: - - ACK - - NACK - tags: - description: A list of tags containing any additional information sent along with the Acknowledgement. - type: array - items: - $ref: "#/components/schemas/TagGroup" - AddOn: - description: Describes an additional item offered as a value-addition to a product or service. This does not exist independently in a catalog and is always associated with an item. - type: object - properties: - id: - description: Provider-defined ID of the add-on - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - price: - $ref: "#/components/schemas/Price" - Address: - description: Describes a postal address. - type: string - Agent: - description: "Describes the direct performer, driver or executor that fulfills an order. It is usually a person. But in some rare cases, it could be a non-living entity like a drone, or a bot. Some examples of agents are Doctor in the healthcare sector, a driver in the mobility sector, or a delivery person in the logistics sector. This object can be set at any stage of the order lifecycle. This can be set at the discovery stage when the BPP wants to provide details on the agent fulfilling the order, like in healthcare, where the doctor's name appears during search. This object can also used to search for a particular person that the customer wants fulfilling an order. Sometimes, this object gets instantiated after the order is confirmed, like in the case of on-demand taxis, where the driver is assigned after the user confirms the ride." - properties: - person: - $ref: "#/components/schemas/Person" - contact: - $ref: "#/components/schemas/Contact" - organization: - $ref: "#/components/schemas/Organization" - rating: - $ref: "#/components/schemas/Rating/properties/value" - Authorization: - description: "Describes an authorization mechanism used to start or end the fulfillment of an order. For example, in the mobility sector, the driver may require a one-time password to initiate the ride. In the healthcare sector, a patient may need to provide a password to open a video conference link during a teleconsultation." - type: object - properties: - type: - description: Type of authorization mechanism used. The allowed values for this field can be published as part of the network policy. - type: string - token: - description: "Token used for authorization. This is typically generated at the BPP. The BAP can send this value to the user via any channel that it uses to authenticate the user like SMS, Email, Push notification, or in-app rendering." - type: string - valid_from: - description: Timestamp in RFC3339 format from which token is valid - type: string - format: date-time - valid_to: - description: Timestamp in RFC3339 format until which token is valid - type: string - format: date-time - status: - description: Status of the token - type: string - Billing: - description: "Describes the billing details of an entity.
This has properties like name,organization,address,email,phone,time,tax_number, created_at,updated_at" - type: object - properties: - name: - description: Name of the billable entity - type: string - organization: - description: Details of the organization being billed. - allOf: - - $ref: "#/components/schemas/Organization" - address: - description: The address of the billable entity - allOf: - - $ref: "#/components/schemas/Address" - state: - description: The state where the billable entity resides. This is important for state-level tax calculation - allOf: - - $ref: "#/components/schemas/State" - city: - description: The city where the billable entity resides. - allOf: - - $ref: "#/components/schemas/City" - email: - description: Email address where the bill is sent to - type: string - format: email - phone: - description: Phone number of the billable entity - type: string - time: - description: Details regarding the billing period - allOf: - - $ref: "#/components/schemas/Time" - tax_id: - description: ID of the billable entity as recognized by the taxation authority - type: string - Cancellation: - description: Describes a cancellation event - type: object - properties: - time: - description: Date-time when the order was cancelled by the buyer - type: string - format: date-time - cancelled_by: - type: string - enum: - - CONSUMER - - PROVIDER - reason: - description: The reason for cancellation - allOf: - - $ref: "#/components/schemas/Option" - additional_description: - description: Any additional information regarding the nature of cancellation - allOf: - - $ref: "#/components/schemas/Descriptor" - CancellationTerm: - description: Describes the cancellation terms of an item or an order. This can be referenced at an item or order level. Item-level cancellation terms can override the terms at the order level. - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/FulfillmentState" - reason_required: - description: Indicates whether a reason is required to cancel the order - type: boolean - cancel_by: - description: Information related to the time of cancellation. - allOf: - - $ref: "#/components/schemas/Time" - cancellation_fee: - $ref: "#/components/schemas/Fee" - xinput: - $ref: "#/components/schemas/XInput" - external_ref: - $ref: "#/components/schemas/MediaFile" - Catalog: - description: "Describes the products or services offered by a BPP. This is typically sent as the response to a search intent from a BAP. The payment terms, offers and terms of fulfillment supported by the BPP can also be included here. The BPP can show hierarchical nature of products/services in its catalog using the parent_category_id in categories. The BPP can also send a ttl (time to live) in the context which is the duration for which a BAP can cache the catalog and use the cached catalog.
This has properties like bbp/descriptor,bbp/categories,bbp/fulfillments,bbp/payments,bbp/offers,bbp/providers and exp
This is used in the following situations.
  • This is typically used in the discovery stage when the BPP sends the details of the products and services it offers as response to a search intent from the BAP.
" - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - fulfillments: - description: Fulfillment modes offered at the BPP level. This is used when a BPP itself offers fulfillments on behalf of the providers it has onboarded. - type: array - items: - $ref: "#/components/schemas/Fulfillment" - payments: - description: Payment terms offered by the BPP for all transactions. This can be overriden at the provider level. - type: array - items: - $ref: "#/components/schemas/Payment" - offers: - description: Offers at the BPP-level. This is common across all providers onboarded by the BPP. - type: array - items: - $ref: "#/components/schemas/Offer" - providers: - type: array - items: - $ref: "#/components/schemas/Provider" - exp: - description: Timestamp after which catalog will expire - type: string - format: date-time - ttl: - description: Duration in seconds after which this catalog will expire - type: string - Category: - description: A label under which a collection of items can be grouped. - type: object - properties: - id: - description: ID of the category - type: string - parent_category_id: - $ref: "#/components/schemas/Category/properties/id" - descriptor: - $ref: "#/components/schemas/Descriptor" - time: - $ref: "#/components/schemas/Time" - ttl: - description: Time to live for an instance of this schema - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Circle: - description: Describes a circular region of a specified radius centered at a specified GPS coordinate. - type: object - properties: - gps: - $ref: "#/components/schemas/Gps" - radius: - $ref: "#/components/schemas/Scalar" - City: - description: Describes a city - type: object - properties: - name: - description: Name of the city - type: string - code: - description: City code - type: string - Contact: - description: Describes the contact information of an entity - type: object - properties: - phone: - type: string - email: - type: string - jcard: - type: object - description: A Jcard object as per draft-ietf-jcardcal-jcard-03 specification - Context: - description: "Every API call in beckn protocol has a context. It provides a high-level overview to the receiver about the nature of the intended transaction. Typically, it is the BAP that sets the transaction context based on the consumer's location and action on their UI. But sometimes, during unsolicited callbacks, the BPP also sets the transaction context but it is usually the same as the context of a previous full-cycle, request-callback interaction between the BAP and the BPP. The context object contains four types of fields.
  1. Demographic information about the transaction using fields like `domain`, `country`, and `region`.
  2. Addressing details like the sending and receiving platform's ID and API URL.
  3. Interoperability information like the protocol version that implemented by the sender and,
  4. Transaction details like the method being called at the receiver's endpoint, the transaction_id that represents an end-to-end user session at the BAP, a message ID to pair requests with callbacks, a timestamp to capture sending times, a ttl to specifiy the validity of the request, and a key to encrypt information if necessary.
This object must be passed in every interaction between a BAP and a BPP. In HTTP/S implementations, it is not necessary to send the context during the synchronous response. However, in asynchronous protocols, the context must be sent during all interactions," - type: object - properties: - domain: - description: Domain code that is relevant to this transaction context - allOf: - - $ref: "#/components/schemas/Domain/properties/code" - location: - description: The location where the transaction is intended to be fulfilled. - allOf: - - $ref: "#/components/schemas/Location" - action: - description: The Beckn protocol method being called by the sender and executed at the receiver. - type: string - version: - type: string - description: Version of transaction protocol being used by the sender. - bap_id: - description: Subscriber ID of the BAP - allOf: - - description: "A globally unique identifier of the platform, Typically it is the fully qualified domain name (FQDN) of the platform." - type: string - bap_uri: - description: Subscriber URL of the BAP for accepting callbacks from BPPs. - allOf: - - description: The callback URL of the Subscriber. This should necessarily contain the same domain name as set in `subscriber_id``. - type: string - format: uri - bpp_id: - description: Subscriber ID of the BPP - allOf: - - $ref: "#/components/schemas/Context/properties/bap_id/allOf/0" - bpp_uri: - description: Subscriber URL of the BPP for accepting calls from BAPs. - allOf: - - $ref: "#/components/schemas/Context/properties/bap_uri/allOf/0" - transaction_id: - description: "This is a unique value which persists across all API calls from `search` through `confirm`. This is done to indicate an active user session across multiple requests. The BPPs can use this value to push personalized recommendations, and dynamic offerings related to an ongoing transaction despite being unaware of the user active on the BAP." - type: string - format: uuid - message_id: - description: "This is a unique value which persists during a request / callback cycle. Since beckn protocol APIs are asynchronous, BAPs need a common value to match an incoming callback from a BPP to an earlier call. This value can also be used to ignore duplicate messages coming from the BPP. It is recommended to generate a fresh message_id for every new interaction. When sending unsolicited callbacks, BPPs must generate a new message_id." - type: string - format: uuid - timestamp: - description: Time of request generation in RFC3339 format - type: string - format: date-time - key: - description: The encryption public key of the sender - type: string - ttl: - description: The duration in ISO8601 format after timestamp for which this message holds valid - type: string - Country: - description: Describes a country - type: object - properties: - name: - type: string - description: Name of the country - code: - type: string - description: Country code as per ISO 3166-1 and ISO 3166-2 format - Credential: - description: Describes a credential of an entity - Person or Organization - type: object - properties: - id: - type: string - type: - type: string - default: VerifiableCredential - url: - description: URL of the credential - type: string - format: uri - Customer: - description: Describes a customer buying/availing a product or a service - type: object - properties: - person: - $ref: "#/components/schemas/Person" - contact: - $ref: "#/components/schemas/Contact" - DecimalValue: - description: Describes a numerical value in decimal form - type: string - pattern: "[+-]?([0-9]*[.])?[0-9]+" - Descriptor: - description: Physical description of something. - type: object - properties: - name: - type: string - code: - type: string - short_desc: - type: string - long_desc: - type: string - additional_desc: - type: object - properties: - url: - type: string - content_type: - type: string - enum: - - text/plain - - text/html - - application/json - media: - type: array - items: - $ref: "#/components/schemas/MediaFile" - images: - type: array - items: - $ref: "#/components/schemas/Image" - Domain: - description: "Described the industry sector or sub-sector. The network policy should contain codes for all the industry sectors supported by the network. Domains can be created in varying levels of granularity. The granularity of a domain can be decided by the participants of the network. Too broad domains will result in irrelevant search broadcast calls to BPPs that don't have services supporting the domain. Too narrow domains will result in a large number of registry entries for each BPP. It is recommended that network facilitators actively collaborate with various working groups and network participants to carefully choose domain codes keeping in mind relevance, performance, and opportunity cost. It is recommended that networks choose broad domains like mobility, logistics, healthcare etc, and progressively granularize them as and when the number of network participants for each domain grows large." - type: object - properties: - name: - description: Name of the domain - type: string - code: - description: "Standard code representing the domain. The standard is usually published as part of the network policy. Furthermore, the network facilitator should also provide a mechanism to provide the supported domains of a network." - additional_info: - description: A url that contains addtional information about that domain. - allOf: - - $ref: "#/components/schemas/MediaFile" - Duration: - description: Describes duration as per ISO8601 format - type: string - Error: - description: "Describes an error object that is returned by a BAP, BPP or BG as a response or callback to an action by another network participant. This object is sent when any request received by a network participant is unacceptable. This object can be sent either during Ack or with the callback." - type: object - properties: - code: - type: string - description: 'Standard error code. For full list of error codes, refer to docs/protocol-drafts/BECKN-005-ERROR-CODES-DRAFT-01.md of this repo"' - paths: - type: string - description: Path to json schema generating the error. Used only during json schema validation errors - message: - type: string - description: Human readable message describing the error. Used mainly for logging. Not recommended to be shown to the user. - Fee: - description: A fee applied on a particular entity - type: object - properties: - percentage: - description: Percentage of a value - allOf: - - $ref: "#/components/schemas/DecimalValue" - amount: - description: A fixed value - allOf: - - $ref: "#/components/schemas/Price" - Form: - description: Describes a form - type: object - properties: - url: - description: "The URL from where the form can be fetched. The content fetched from the url must be processed as per the mime_type specified in this object. Once fetched, the rendering platform can choosed to render the form as-is as an embeddable element; or process it further to blend with the theme of the application. In case the interface is non-visual, the the render can process the form data and reproduce it as per the standard specified in the form." - type: string - format: uri - data: - description: The form submission data - type: object - additionalProperties: - type: string - mime_type: - description: This field indicates the nature and format of the form received by querying the url. MIME types are defined and standardized in IETF's RFC 6838. - type: string - enum: - - text/html - - application/xml - submission_id: - type: string - format: uuid - Fulfillment: - description: Describes how a an order will be rendered/fulfilled to the end-customer - type: object - properties: - id: - description: Unique reference ID to the fulfillment of an order - type: string - type: - description: "A code that describes the mode of fulfillment. This is typically set when there are multiple ways an order can be fulfilled. For example, a retail order can be fulfilled either via store pickup or a home delivery. Similarly, a medical consultation can be provided either in-person or via tele-consultation. The network policy must publish standard fulfillment type codes for the different modes of fulfillment." - type: string - rateable: - description: Whether the fulfillment can be rated or not - type: boolean - rating: - description: The rating value of the fulfullment service. - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - state: - description: The current state of fulfillment. The BPP must set this value whenever the state of the order fulfillment changes and fire an unsolicited `on_status` call. - allOf: - - $ref: "#/components/schemas/FulfillmentState" - tracking: - type: boolean - description: Indicates whether the fulfillment allows tracking - default: false - customer: - description: The person that will ultimately receive the order - allOf: - - $ref: "#/components/schemas/Customer" - agent: - description: The agent that is currently handling the fulfillment of the order - allOf: - - $ref: "#/components/schemas/Agent" - contact: - $ref: "#/components/schemas/Contact" - vehicle: - $ref: "#/components/schemas/Vehicle" - stops: - description: The list of logical stops encountered during the fulfillment of an order. - type: array - items: - $ref: "#/components/schemas/Stop" - path: - description: The physical path taken by the agent that can be rendered on a map. The allowed format of this property can be set by the network. - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - FulfillmentState: - description: Describes the state of fulfillment - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - updated_at: - type: string - format: date-time - updated_by: - type: string - description: ID of entity which changed the state - Gps: - description: Describes a GPS coordinate - type: string - pattern: '^[-+]?([1-8]?\d(\.\d+)?|90(\.0+)?),\s*[-+]?(180(\.0+)?|((1[0-7]\d)|([1-9]?\d))(\.\d+)?)$' - Image: - description: Describes an image - type: object - properties: - url: - description: URL to the image. This can be a data url or an remote url - type: string - format: uri - size_type: - description: The size of the image. The network policy can define the default dimensions of each type - type: string - enum: - - xs - - sm - - md - - lg - - xl - - custom - width: - description: Width of the image in pixels - type: string - height: - description: Height of the image in pixels - type: string - Intent: - description: "The intent to buy or avail a product or a service. The BAP can declare the intent of the consumer containing
  • What they want (A product, service, offer)
  • Who they want (A seller, service provider, agent etc)
  • Where they want it and where they want it from
  • When they want it (start and end time of fulfillment
  • How they want to pay for it

This has properties like descriptor,provider,fulfillment,payment,category,offer,item,tags
This is typically used by the BAP to send the purpose of the user's search to the BPP. This will be used by the BPP to find products or services it offers that may match the user's intent.
For example, in Mobility, the mobility consumer declares a mobility intent. In this case, the mobility consumer declares information that describes various aspects of their journey like,
  • Where would they like to begin their journey (intent.fulfillment.start.location)
  • Where would they like to end their journey (intent.fulfillment.end.location)
  • When would they like to begin their journey (intent.fulfillment.start.time)
  • When would they like to end their journey (intent.fulfillment.end.time)
  • Who is the transport service provider they would like to avail services from (intent.provider)
  • Who is traveling (This is not recommended in public networks) (intent.fulfillment.customer)
  • What kind of fare product would they like to purchase (intent.item)
  • What add-on services would they like to avail
  • What offers would they like to apply on their booking (intent.offer)
  • What category of services would they like to avail (intent.category)
  • What additional luggage are they carrying
  • How would they like to pay for their journey (intent.payment)

For example, in health domain, a consumer declares the intent for a lab booking the describes various aspects of their booking like,
  • Where would they like to get their scan/test done (intent.fulfillment.start.location)
  • When would they like to get their scan/test done (intent.fulfillment.start.time)
  • When would they like to get the results of their test/scan (intent.fulfillment.end.time)
  • Who is the service provider they would like to avail services from (intent.provider)
  • Who is getting the test/scan (intent.fulfillment.customer)
  • What kind of test/scan would they like to purchase (intent.item)
  • What category of services would they like to avail (intent.category)
  • How would they like to pay for their journey (intent.payment)
" - type: object - properties: - descriptor: - description: "A raw description of the search intent. Free text search strings, raw audio, etc can be sent in this object." - allOf: - - $ref: "#/components/schemas/Descriptor" - provider: - description: The provider from which the customer wants to place to the order from - allOf: - - $ref: "#/components/schemas/Provider" - fulfillment: - description: Details on how the customer wants their order fulfilled - allOf: - - $ref: "#/components/schemas/Fulfillment" - payment: - description: Details on how the customer wants to pay for the order - allOf: - - $ref: "#/components/schemas/Payment" - category: - description: Details on the item category - allOf: - - $ref: "#/components/schemas/Category" - offer: - description: details on the offer the customer wants to avail - allOf: - - $ref: "#/components/schemas/Offer" - item: - description: Details of the item that the consumer wants to order - allOf: - - $ref: "#/components/schemas/Item" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - ItemQuantity: - description: Describes the count or amount of an item - type: object - properties: - allocated: - description: This represents the exact quantity allocated for purchase of the item. - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - available: - description: This represents the exact quantity available for purchase of the item. The buyer can only purchase multiples of this - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - maximum: - description: This represents the maximum quantity allowed for purchase of the item - type: object - properties: - count: - type: integer - minimum: 1 - measure: - $ref: "#/components/schemas/Scalar" - minimum: - description: This represents the minimum quantity allowed for purchase of the item - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - selected: - description: This represents the quantity selected for purchase of the item - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - unitized: - description: This represents the quantity available in a single unit of the item - type: object - properties: - count: - type: integer - minimum: 1 - maximum: 1 - measure: - $ref: "#/components/schemas/Scalar" - Item: - description: "Describes a product or a service offered to the end consumer by the provider. In the mobility sector, it can represent a fare product like one way journey. In the logistics sector, it can represent the delivery service offering. In the retail domain it can represent a product like a grocery item." - type: object - properties: - id: - description: ID of the item. - type: string - parent_item_id: - description: "ID of the item, this item is a variant of" - allOf: - - $ref: "#/components/schemas/Item/properties/id" - parent_item_quantity: - description: The number of units of the parent item this item is a multiple of - allOf: - - $ref: "#/components/schemas/ItemQuantity" - descriptor: - description: Physical description of the item - allOf: - - $ref: "#/components/schemas/Descriptor" - creator: - description: The creator of this item - allOf: - - $ref: "#/components/schemas/Organization" - price: - description: "The price of this item, if it has intrinsic value" - allOf: - - $ref: "#/components/schemas/Price" - quantity: - description: The selling quantity of the item - allOf: - - $ref: "#/components/schemas/ItemQuantity" - category_ids: - description: Categories this item can be listed under - type: array - items: - allOf: - - $ref: "#/components/schemas/Category/properties/id" - fulfillment_ids: - description: Modes through which this item can be fulfilled - type: array - items: - allOf: - - $ref: "#/components/schemas/Fulfillment/properties/id" - location_ids: - description: Provider Locations this item is available in - type: array - items: - allOf: - - $ref: "#/components/schemas/Location/properties/id" - payment_ids: - description: Payment modalities through which this item can be ordered - type: array - items: - allOf: - - $ref: "#/components/schemas/Payment/properties/id" - add_ons: - type: array - items: - $ref: "#/components/schemas/AddOn" - cancellation_terms: - description: Cancellation terms of this item - type: array - items: - $ref: "#/components/schemas/CancellationTerm" - refund_terms: - description: Refund terms of this item - type: array - items: - description: Refund term of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/State" - refund_eligible: - description: Indicates if cancellation will result in a refund - type: boolean - refund_within: - description: Time within which refund will be processed after successful cancellation. - allOf: - - $ref: "#/components/schemas/Time" - refund_amount: - $ref: "#/components/schemas/Price" - replacement_terms: - description: Terms that are applicable be met when this item is replaced - type: array - items: - $ref: "#/components/schemas/ReplacementTerm" - return_terms: - description: Terms that are applicable when this item is returned - type: array - items: - $ref: "#/components/schemas/ReturnTerm" - xinput: - description: Additional input required from the customer to purchase / avail this item - allOf: - - $ref: "#/components/schemas/XInput" - time: - description: Temporal attributes of this item. This property is used when the item exists on the catalog only for a limited period of time. - allOf: - - $ref: "#/components/schemas/Time" - rateable: - description: Whether this item can be rated - type: boolean - rating: - description: The rating of the item - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - matched: - description: Whether this item is an exact match of the request - type: boolean - related: - description: Whether this item is a related item to the exactly matched item - type: boolean - recommended: - description: Whether this item is a recommended item to a response - type: boolean - ttl: - description: Time to live in seconds for an instance of this schema - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Location: - description: The physical location of something - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - map_url: - description: The url to the map of the location. This can be a globally recognized map url or the one specified by the network policy. - type: string - format: uri - gps: - description: The GPS co-ordinates of this location. - allOf: - - $ref: "#/components/schemas/Gps" - address: - description: The address of this location. - allOf: - - $ref: "#/components/schemas/Address" - city: - description: "The city this location is, or is located within" - allOf: - - $ref: "#/components/schemas/City" - district: - description: "The state this location is, or is located within" - type: string - state: - description: "The state this location is, or is located within" - allOf: - - $ref: "#/components/schemas/State" - country: - description: "The country this location is, or is located within" - allOf: - - $ref: "#/components/schemas/Country" - area_code: - type: string - circle: - $ref: "#/components/schemas/Circle" - polygon: - description: The boundary polygon of this location - type: string - 3dspace: - description: The three dimensional region describing this location - type: string - rating: - description: The rating of this location - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - MediaFile: - description: This object contains a url to a media file. - type: object - properties: - mimetype: - description: "indicates the nature and format of the document, file, or assortment of bytes. MIME types are defined and standardized in IETF's RFC 6838" - type: string - url: - description: The URL of the file - type: string - format: uri - signature: - description: The digital signature of the file signed by the sender - type: string - dsa: - description: The signing algorithm used by the sender - type: string - Offer: - description: An offer associated with a catalog. This is typically used to promote a particular product and enable more purchases. - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - location_ids: - type: array - items: - $ref: "#/components/schemas/Location/properties/id" - category_ids: - type: array - items: - $ref: "#/components/schemas/Category/properties/id" - item_ids: - type: array - items: - $ref: "#/components/schemas/Item/properties/id" - time: - $ref: "#/components/schemas/Time" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Option: - description: Describes a selectable option - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - Order: - description: Describes a legal purchase order. It contains the complete details of the legal contract created between the buyer and the seller. - type: object - properties: - id: - type: string - description: Human-readable ID of the order. This is generated at the BPP layer. The BPP can either generate order id within its system or forward the order ID created at the provider level. - ref_order_ids: - description: A list of order IDs to link this order to previous orders. - type: array - items: - type: string - description: ID of a previous order - status: - description: Status of the order. Allowed values can be defined by the network policy - type: string - enum: - - ACTIVE - - COMPLETE - - CANCELLED - type: - description: "This is used to indicate the type of order being created to BPPs. Sometimes orders can be linked to previous orders, like a replacement order in a retail domain. A follow-up consultation in healthcare domain. A single order part of a subscription order. The list of order types can be standardized at the network level." - type: string - default: DEFAULT - enum: - - DRAFT - - DEFAULT - provider: - description: Details of the provider whose catalog items have been selected. - allOf: - - $ref: "#/components/schemas/Provider" - items: - description: The items purchased / availed in this order - type: array - items: - $ref: "#/components/schemas/Item" - add_ons: - description: The add-ons purchased / availed in this order - type: array - items: - $ref: "#/components/schemas/AddOn" - offers: - description: The offers applied in this order - type: array - items: - $ref: "#/components/schemas/Offer" - billing: - description: The billing details of this order - allOf: - - $ref: "#/components/schemas/Billing" - fulfillments: - description: The fulfillments involved in completing this order - type: array - items: - $ref: "#/components/schemas/Fulfillment" - cancellation: - description: The cancellation details of this order - allOf: - - $ref: "#/components/schemas/Cancellation" - cancellation_terms: - description: Cancellation terms of this item - type: array - items: - $ref: "#/components/schemas/CancellationTerm" - refund_terms: - description: Refund terms of this item - type: array - items: - $ref: "#/components/schemas/Item/properties/refund_terms/items" - replacement_terms: - description: Replacement terms of this item - type: array - items: - $ref: "#/components/schemas/ReplacementTerm" - return_terms: - description: Return terms of this item - type: array - items: - $ref: "#/components/schemas/ReturnTerm" - quote: - description: The mutually agreed upon quotation for this order. - allOf: - - $ref: "#/components/schemas/Quotation" - payments: - description: The terms of settlement for this order - type: array - items: - $ref: "#/components/schemas/Payment" - created_at: - description: The date-time of creation of this order - type: string - format: date-time - updated_at: - description: The date-time of updated of this order - type: string - format: date-time - xinput: - description: Additional input required from the customer to confirm this order - allOf: - - $ref: "#/components/schemas/XInput" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Organization: - description: An organization. Usually a recognized business entity. - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - address: - description: The postal address of the organization - allOf: - - $ref: "#/components/schemas/Address" - state: - description: The state where the organization's address is registered - allOf: - - $ref: "#/components/schemas/State" - city: - description: The city where the the organization's address is registered - allOf: - - $ref: "#/components/schemas/City" - contact: - $ref: "#/components/schemas/Contact" - Payment: - description: "Describes the terms of settlement between the BAP and the BPP for a single transaction. When instantiated, this object contains
  1. the amount that has to be settled,
  2. The payment destination destination details
  3. When the settlement should happen, and
  4. A transaction reference ID
. During a transaction, the BPP reserves the right to decide the terms of payment. However, the BAP can send its terms to the BPP first. If the BPP does not agree to those terms, it must overwrite the terms and return them to the BAP. If overridden, the BAP must either agree to the terms sent by the BPP in order to preserve the provider's autonomy, or abort the transaction. In case of such disagreements, the BAP and the BPP can perform offline negotiations on the payment terms. Once an agreement is reached, the BAP and BPP can resume transactions." - type: object - properties: - id: - description: ID of the payment term that can be referred at an item or an order level in a catalog - type: string - collected_by: - description: "This field indicates who is the collector of payment. The BAP can set this value to 'bap' if it wants to collect the payment first and settle it to the BPP. If the BPP agrees to those terms, the BPP should not send the payment url. Alternatively, the BPP can set this field with the value 'bpp' if it wants the payment to be made directly." - url: - type: string - description: "A payment url to be called by the BAP. If empty, then the payment is to be done offline. The details of payment should be present in the params object. If tl_method = http/get, then the payment details will be sent as url params. Two url param values, ```$transaction_id``` and ```$amount``` are mandatory." - format: uri - params: - type: object - properties: - transaction_id: - type: string - description: The reference transaction ID associated with a payment activity - amount: - type: string - currency: - type: string - bank_code: - type: string - bank_account_number: - type: string - virtual_payment_address: - type: string - source_bank_code: - type: string - source_bank_account_number: - type: string - source_virtual_payment_address: - type: string - type: - type: string - enum: - - PRE-ORDER - - PRE-FULFILLMENT - - ON-FULFILLMENT - - POST-FULFILLMENT - status: - type: string - enum: - - PAID - - NOT-PAID - time: - $ref: "#/components/schemas/Time" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Person: - description: Describes a person as any individual - type: object - properties: - id: - type: string - description: Describes the identity of the person - url: - description: Profile url of the person - type: string - format: uri - name: - description: the name of the person - type: string - image: - $ref: "#/components/schemas/Image" - age: - description: Age of the person - allOf: - - $ref: "#/components/schemas/Duration" - dob: - description: Date of birth of the person - type: string - format: date - gender: - type: string - description: "Gender of something, typically a Person, but possibly also fictional characters, animals, etc. While Male and Female may be used, text strings are also acceptable for people who do not identify as a binary gender.Allowed values for this field can be published in the network policy" - creds: - type: array - items: - $ref: "#/components/schemas/Credential" - languages: - type: array - items: - description: Describes a language known to the person. - type: object - properties: - code: - type: string - name: - type: string - skills: - type: array - items: - description: Describes a skill of the person. - type: object - properties: - code: - type: string - name: - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Price: - description: Describes the price of a product or service - type: object - properties: - currency: - type: string - value: - $ref: "#/components/schemas/DecimalValue" - estimated_value: - $ref: "#/components/schemas/DecimalValue" - computed_value: - $ref: "#/components/schemas/DecimalValue" - listed_value: - $ref: "#/components/schemas/DecimalValue" - offered_value: - $ref: "#/components/schemas/DecimalValue" - minimum_value: - $ref: "#/components/schemas/DecimalValue" - maximum_value: - $ref: "#/components/schemas/DecimalValue" - Provider: - description: Describes the catalog of a business. - type: object - properties: - id: - type: string - description: Id of the provider - descriptor: - $ref: "#/components/schemas/Descriptor" - category_id: - type: string - description: Category Id of the provider at the BPP-level catalog - rating: - $ref: "#/components/schemas/Rating/properties/value" - time: - $ref: "#/components/schemas/Time" - categories: - type: array - items: - $ref: "#/components/schemas/Category" - fulfillments: - type: array - items: - $ref: "#/components/schemas/Fulfillment" - payments: - type: array - items: - $ref: "#/components/schemas/Payment" - locations: - type: array - items: - $ref: "#/components/schemas/Location" - offers: - type: array - items: - $ref: "#/components/schemas/Offer" - items: - type: array - items: - $ref: "#/components/schemas/Item" - exp: - type: string - description: Time after which catalog has to be refreshed - format: date-time - rateable: - description: Whether this provider can be rated or not - type: boolean - ttl: - description: "The time-to-live in seconds, for this object. This can be overriden at deeper levels. A value of -1 indicates that this object is not cacheable." - type: integer - minimum: -1 - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Quotation: - description: "Describes a quote. It is the estimated price of products or services from the BPP.
This has properties like price, breakup, ttl" - type: object - properties: - id: - description: ID of the quote. - type: string - format: uuid - price: - description: The total quoted price - allOf: - - $ref: "#/components/schemas/Price" - breakup: - description: the breakup of the total quoted price - type: array - items: - type: object - properties: - item: - $ref: "#/components/schemas/Item" - title: - type: string - price: - $ref: "#/components/schemas/Price" - ttl: - $ref: "#/components/schemas/Duration" - Rating: - description: Describes the rating of an entity - type: object - properties: - rating_category: - description: Category of the entity being rated - type: string - enum: - - Item - - Order - - Fulfillment - - Provider - - Agent - - Support - id: - description: Id of the object being rated - type: string - value: - description: "Rating value given to the object. This can be a single value or can also contain an inequality operator like gt, gte, lt, lte. This can also contain an inequality expression containing logical operators like && and ||." - type: string - Region: - description: Describes an arbitrary region of space. The network policy should contain a published list of supported regions by the network. - type: object - properties: - dimensions: - description: "The number of dimensions that are used to describe any point inside that region. The most common dimensionality of a region is 2, that represents an area on a map. There are regions on the map that can be approximated to one-dimensional regions like roads, railway lines, or shipping lines. 3 dimensional regions are rarer, but are gaining popularity as flying drones are being adopted for various fulfillment services." - type: string - enum: - - "1" - - "2" - - "3" - type: - description: "The type of region. This is used to specify the granularity of the region represented by this object. Various examples of two-dimensional region types are city, country, state, district, and so on. The network policy should contain a list of all possible region types supported by the network." - type: string - name: - type: string - description: Name of the region as specified on the map where that region exists. - code: - type: string - description: A standard code representing the region. This should be interpreted in the same way by all network participants. - boundary: - type: string - description: "A string representing the boundary of the region. One-dimensional regions are represented by polylines. Two-dimensional regions are represented by polygons, and three-dimensional regions can represented by polyhedra." - map_url: - type: string - description: The url to the map of the region. This can be a globally recognized map or the one specified by the network policy. - ReplacementTerm: - description: The replacement policy of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/State" - replace_within: - description: "Applicable only for buyer managed returns where the buyer has to replace the item before a certain date-time, failing which they will not be eligible for replacement" - allOf: - - $ref: "#/components/schemas/Time" - external_ref: - $ref: "#/components/schemas/MediaFile" - ReturnTerm: - description: Describes the return policy of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term IETF''s applicable. - allOf: - - $ref: "#/components/schemas/State" - return_eligible: - description: Indicates whether the item is eligible for return - type: boolean - return_time: - description: "Applicable only for buyer managed returns where the buyer has to return the item to the origin before a certain date-time, failing which they will not be eligible for refund." - allOf: - - $ref: "#/components/schemas/Time" - return_location: - description: The location where the item or order must / will be returned to - allOf: - - $ref: "#/components/schemas/Location" - fulfillment_managed_by: - description: The entity that will perform the return - type: string - enum: - - CONSUMER - - PROVIDER - Scalar: - description: Describes a scalar - type: object - properties: - type: - type: string - enum: - - CONSTANT - - VARIABLE - value: - $ref: "#/components/schemas/DecimalValue" - estimated_value: - $ref: "#/components/schemas/DecimalValue" - computed_value: - $ref: "#/components/schemas/DecimalValue" - range: - type: object - properties: - min: - $ref: "#/components/schemas/DecimalValue" - max: - $ref: "#/components/schemas/DecimalValue" - unit: - type: string - Schedule: - description: "Describes schedule as a repeating time period used to describe a regularly recurring event. At a minimum a schedule will specify frequency which describes the interval between occurrences of the event. Additional information can be provided to specify the schedule more precisely. This includes identifying the timestamps(s) of when the event will take place. Schedules may also have holidays to exclude a specific day from the schedule.
This has properties like frequency, holidays, times" - type: object - properties: - frequency: - $ref: "#/components/schemas/Duration" - holidays: - type: array - items: - type: string - format: date-time - times: - type: array - items: - type: string - format: date-time - State: - description: A bounded geopolitical region of governance inside a country. - type: object - properties: - name: - type: string - description: Name of the state - code: - type: string - description: State code as per country or international standards - Stop: - description: A logical point in space and time during the fulfillment of an order. - type: object - properties: - id: - type: string - parent_stop_id: - type: string - location: - description: Location of the stop - allOf: - - $ref: "#/components/schemas/Location" - type: - description: The type of stop. Allowed values of this property can be defined by the network policy. - type: string - time: - description: Timings applicable at the stop. - allOf: - - $ref: "#/components/schemas/Time" - instructions: - description: Instructions that need to be followed at the stop - allOf: - - $ref: "#/components/schemas/Descriptor" - contact: - description: Contact details of the stop - allOf: - - $ref: "#/components/schemas/Contact" - person: - description: The details of the person present at the stop - allOf: - - $ref: "#/components/schemas/Person" - authorization: - $ref: "#/components/schemas/Authorization" - Support: - description: Details of customer support - type: object - properties: - ref_id: - type: string - callback_phone: - type: string - format: phone - phone: - type: string - format: phone - email: - type: string - format: email - url: - type: string - format: uri - Tag: - description: "Describes a tag. This is used to contain extended metadata. This object can be added as a property to any schema to describe extended attributes. For BAPs, tags can be sent during search to optimize and filter search results. BPPs can use tags to index their catalog to allow better search functionality. Tags are sent by the BPP as part of the catalog response in the `on_search` callback. Tags are also meant for display purposes. Upon receiving a tag, BAPs are meant to render them as name-value pairs. This is particularly useful when rendering tabular information about a product or service." - type: object - properties: - descriptor: - description: "Description of the Tag, can be used to store detailed information." - allOf: - - $ref: "#/components/schemas/Descriptor" - value: - description: The value of the tag. This set by the BPP and rendered as-is by the BAP. - type: string - display: - description: "This value indicates if the tag is intended for display purposes. If set to `true`, then this tag must be displayed. If it is set to `false`, it should not be displayed. This value can override the group display value." - type: boolean - TagGroup: - description: "A collection of tag objects with group level attributes. For detailed documentation on the Tags and Tag Groups schema go to https://github.com/beckn/protocol-specifications/discussions/316" - type: object - properties: - display: - description: "Indicates the display properties of the tag group. If display is set to false, then the group will not be displayed. If it is set to true, it should be displayed. However, group-level display properties can be overriden by individual tag-level display property. As this schema is purely for catalog display purposes, it is not recommended to send this value during search." - type: boolean - default: true - descriptor: - description: "Description of the TagGroup, can be used to store detailed information." - allOf: - - $ref: "#/components/schemas/Descriptor" - list: - description: "An array of Tag objects listed under this group. This property can be set by BAPs during search to narrow the `search` and achieve more relevant results. When received during `on_search`, BAPs must render this list under the heading described by the `name` property of this schema." - type: array - items: - $ref: "#/components/schemas/Tag" - Time: - description: "Describes time in its various forms. It can be a single point in time; duration; or a structured timetable of operations
This has properties like label, time stamp,duration,range, days, schedule" - type: object - properties: - label: - type: string - timestamp: - type: string - format: date-time - duration: - $ref: "#/components/schemas/Duration" - range: - type: object - properties: - start: - type: string - format: date-time - end: - type: string - format: date-time - days: - type: string - description: comma separated values representing days of the week - schedule: - $ref: "#/components/schemas/Schedule" - Tracking: - description: Contains tracking information that can be used by the BAP to track the fulfillment of an order in real-time. which is useful for knowing the location of time sensitive deliveries. - type: object - properties: - id: - description: A unique tracking reference number - type: string - url: - description: "A URL to the tracking endpoint. This can be a link to a tracking webpage, a webhook URL created by the BAP where BPP can push the tracking data, or a GET url creaed by the BPP which the BAP can poll to get the tracking data. It can also be a websocket URL where the BPP can push real-time tracking data." - type: string - format: uri - location: - description: "In case there is no real-time tracking endpoint available, this field will contain the latest location of the entity being tracked. The BPP will update this value everytime the BAP calls the track API." - allOf: - - $ref: "#/components/schemas/Location" - status: - description: "This value indicates if the tracking is currently active or not. If this value is `active`, then the BAP can begin tracking the order. If this value is `inactive`, the tracking URL is considered to be expired and the BAP should stop tracking the order." - type: string - enum: - - active - - inactive - Vehicle: - description: "Describes a vehicle is a device that is designed or used to transport people or cargo over land, water, air, or through space.
This has properties like category, capacity, make, model, size,variant,color,energy_type,registration" - type: object - properties: - category: - type: string - capacity: - type: integer - make: - type: string - model: - type: string - size: - type: string - variant: - type: string - color: - type: string - energy_type: - type: string - registration: - type: string - wheels_count: - type: string - cargo_volumne: - type: string - wheelchair_access: - type: string - code: - type: string - emission_standard: - type: string - XInput: - description: "Contains any additional or extended inputs required to confirm an order. This is typically a Form Input. Sometimes, selection of catalog elements is not enough for the BPP to confirm an order. For example, to confirm a flight ticket, the airline requires details of the passengers along with information on baggage, identity, in addition to the class of ticket. Similarly, a logistics company may require details on the nature of shipment in order to confirm the shipping. A recruiting firm may require additional details on the applicant in order to confirm a job application. For all such purposes, the BPP can choose to send this object attached to any object in the catalog that is required to be sent while placing the order. This object can typically be sent at an item level or at the order level. The item level XInput will override the Order level XInput as it indicates a special requirement of information for that particular item. Hence the BAP must render a separate form for the Item and another form at the Order level before confirmation." - type: object - properties: - form: - $ref: "#/components/schemas/Form" - required: - description: Indicates whether the form data is mandatorily required by the BPP to confirm the order. - type: boolean diff --git a/layer2/samples/retail_1.1.0_1.1.0.yaml b/layer2/samples/retail_1.1.0_1.1.0.yaml deleted file mode 100644 index e57689e..0000000 --- a/layer2/samples/retail_1.1.0_1.1.0.yaml +++ /dev/null @@ -1,2164 +0,0 @@ -openapi: 3.0.0 -info: - title: Beckn for Local Retail - description: Adaptation of beckn protocol for the local retail domain - version: 1.1.0 -security: - - SubscriberAuth: [] -paths: - /search: - post: - tags: - - Beckn Provider Platform (BPP) - - Beckn Gateway (BG) - description: BAP declares the customer's intent to buy products from retail providers - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - search - message: - type: object - properties: - intent: - $ref: "#/components/schemas/Intent" - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /select: - post: - tags: - - Beckn Provider Platform (BPP) - description: BAP declares the customer's cart (or equivalent) created by selecting objects from the catalog - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - select - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /init: - post: - tags: - - Beckn Provider Platform (BPP) - description: Initialize an order by providing billing and/or shipping details - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - init - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - allOf: - - $ref: "#/components/schemas/Ack" - - properties: - status: - enum: - - ACK - - NACK - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /confirm: - post: - tags: - - Beckn Provider Platform (BPP) - description: Initialize an order by providing billing and/or shipping details - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - confirm - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /status: - post: - tags: - - Beckn Provider Platform (BPP) - description: Fetch the latest order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - status - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - required: - - order_id - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /track: - post: - tags: - - Beckn Provider Platform (BPP) - description: Track an active order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - track - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - callback_url: - type: string - format: uri - required: - - order_id - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /cancel: - post: - tags: - - Beckn Provider Platform (BPP) - description: Cancel an order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - cancel - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - cancellation_reason_id: - $ref: "#/components/schemas/Option/properties/id" - descriptor: - $ref: "#/components/schemas/Descriptor" - required: - - order_id - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /update: - post: - tags: - - Beckn Provider Platform (BPP) - description: Remove object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - update - required: - - action - message: - type: object - properties: - update_target: - description: 'Comma separated values of order objects being updated. For example: ```"update_target":"item,billing,fulfillment"```' - type: string - order: - description: Updated order object - allOf: - - $ref: "#/components/schemas/Order" - required: - - update_target - - order - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /rating: - post: - tags: - - Beckn Provider Platform (BPP) - description: Provide feedback on a service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - rating - required: - - action - message: - type: object - properties: - ratings: - type: array - items: - $ref: "#/components/schemas/Rating" - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /support: - post: - tags: - - Beckn Provider Platform (BPP) - description: Contact support - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - support - required: - - action - message: - type: object - properties: - support: - $ref: "#/components/schemas/Support" - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_search: - post: - tags: - - Beckn Application Platform (BAP) - - Beckn Gateway (BG) - description: BPP sends its catalog in response to a search request. - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_search - required: - - action - message: - type: object - properties: - catalog: - $ref: "#/components/schemas/Catalog" - required: - - catalog - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_select: - post: - tags: - - Beckn Application Platform (BAP) - description: Send draft order object with quoted price for selected items - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_select - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_init: - post: - tags: - - Beckn Application Platform (BAP) - description: Send order object with payment details updated - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_init - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_confirm: - post: - tags: - - Beckn Application Platform (BAP) - description: Send active order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_confirm - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_track: - post: - tags: - - Beckn Application Platform (BAP) - description: Send tracking details of an active order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_track - required: - - action - message: - type: object - properties: - tracking: - $ref: "#/components/schemas/Tracking" - required: - - tracking - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_cancel: - post: - tags: - - Beckn Application Platform (BAP) - description: Send cancellation request_id with reasons list in case of cancellation request. Else send cancelled order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_cancel - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_update: - post: - tags: - - Beckn Application Platform (BAP) - description: Returns updated service with updated runtime object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_update - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_status: - post: - tags: - - Beckn Application Platform (BAP) - description: Fetch the status of a Service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_status - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_rating: - post: - tags: - - Beckn Application Platform (BAP) - description: Provide feedback on a service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_rating - required: - - action - message: - type: object - properties: - feedback_form: - description: A feedback form to allow the user to provide additional information on the rating provided - allOf: - - $ref: "#/components/schemas/XInput" - error: - $ref: "#/components/schemas/Error" - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_support: - post: - tags: - - Beckn Application Platform (BAP) - description: Contact Support - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_support - required: - - action - message: - type: object - properties: - support: - $ref: "#/components/schemas/Support" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" -components: - securitySchemes: - SubscriberAuth: - type: apiKey - in: header - name: Authorization - description: 'Signature of message body using BAP or BPP subscriber''s signing public key.

Format:

Authorization : Signature keyId="{subscriber_id}|{unique_key_id}|{algorithm}",algorithm="ed25519",created="1606970629",expires="1607030629",headers="(created) (expires) digest",signature="Base64(signing string)"' - schemas: - Ack: - description: "Describes the acknowledgement sent in response to an API call. If the implementation uses HTTP/S, then Ack must be returned in the same session. Every API call to a BPP must be responded to with an Ack whether the BPP intends to respond with a callback or not. This has one property called `status` that indicates the status of the Acknowledgement." - type: object - properties: - status: - type: string - description: "The status of the acknowledgement. If the request passes the validation criteria of the BPP, then this is set to ACK. If a BPP responds with status = `ACK` to a request, it is required to respond with a callback. If the request fails the validation criteria, then this is set to NACK. Additionally, if a BPP does not intend to respond with a callback even after the request meets the validation criteria, it should set this value to `NACK`." - enum: - - ACK - - NACK - tags: - description: A list of tags containing any additional information sent along with the Acknowledgement. - type: array - items: - $ref: "#/components/schemas/TagGroup" - AddOn: - description: Describes an additional item offered as a value-addition to a product or service. This does not exist independently in a catalog and is always associated with an item. - type: object - properties: - id: - description: Provider-defined ID of the add-on - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - price: - $ref: "#/components/schemas/Price" - Address: - description: Describes a postal address. - type: string - Agent: - description: "Describes the direct performer, driver or executor that fulfills an order. It is usually a person. But in some rare cases, it could be a non-living entity like a drone, or a bot. Some examples of agents are Doctor in the healthcare sector, a driver in the mobility sector, or a delivery person in the logistics sector. This object can be set at any stage of the order lifecycle. This can be set at the discovery stage when the BPP wants to provide details on the agent fulfilling the order, like in healthcare, where the doctor's name appears during search. This object can also used to search for a particular person that the customer wants fulfilling an order. Sometimes, this object gets instantiated after the order is confirmed, like in the case of on-demand taxis, where the driver is assigned after the user confirms the ride." - properties: - person: - $ref: "#/components/schemas/Person" - contact: - $ref: "#/components/schemas/Contact" - organization: - $ref: "#/components/schemas/Organization" - rating: - $ref: "#/components/schemas/Rating/properties/value" - Authorization: - description: "Describes an authorization mechanism used to start or end the fulfillment of an order. For example, in the mobility sector, the driver may require a one-time password to initiate the ride. In the healthcare sector, a patient may need to provide a password to open a video conference link during a teleconsultation." - type: object - properties: - type: - description: Type of authorization mechanism used. The allowed values for this field can be published as part of the network policy. - type: string - token: - description: "Token used for authorization. This is typically generated at the BPP. The BAP can send this value to the user via any channel that it uses to authenticate the user like SMS, Email, Push notification, or in-app rendering." - type: string - valid_from: - description: Timestamp in RFC3339 format from which token is valid - type: string - format: date-time - valid_to: - description: Timestamp in RFC3339 format until which token is valid - type: string - format: date-time - status: - description: Status of the token - type: string - Billing: - description: "Describes the billing details of an entity.
This has properties like name,organization,address,email,phone,time,tax_number, created_at,updated_at" - type: object - properties: - name: - description: Name of the billable entity - type: string - organization: - description: Details of the organization being billed. - allOf: - - $ref: "#/components/schemas/Organization" - address: - description: The address of the billable entity - allOf: - - $ref: "#/components/schemas/Address" - state: - description: The state where the billable entity resides. This is important for state-level tax calculation - allOf: - - $ref: "#/components/schemas/State" - city: - description: The city where the billable entity resides. - allOf: - - $ref: "#/components/schemas/City" - email: - description: Email address where the bill is sent to - type: string - format: email - phone: - description: Phone number of the billable entity - type: string - time: - description: Details regarding the billing period - allOf: - - $ref: "#/components/schemas/Time" - tax_id: - description: ID of the billable entity as recognized by the taxation authority - type: string - Cancellation: - description: Describes a cancellation event - type: object - properties: - time: - description: Date-time when the order was cancelled by the buyer - type: string - format: date-time - cancelled_by: - type: string - enum: - - CONSUMER - - PROVIDER - reason: - description: The reason for cancellation - allOf: - - $ref: "#/components/schemas/Option" - additional_description: - description: Any additional information regarding the nature of cancellation - allOf: - - $ref: "#/components/schemas/Descriptor" - CancellationTerm: - description: Describes the cancellation terms of an item or an order. This can be referenced at an item or order level. Item-level cancellation terms can override the terms at the order level. - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/FulfillmentState" - reason_required: - description: Indicates whether a reason is required to cancel the order - type: boolean - cancel_by: - description: Information related to the time of cancellation. - allOf: - - $ref: "#/components/schemas/Time" - cancellation_fee: - $ref: "#/components/schemas/Fee" - xinput: - $ref: "#/components/schemas/XInput" - external_ref: - $ref: "#/components/schemas/MediaFile" - Catalog: - description: "Describes the products or services offered by a BPP. This is typically sent as the response to a search intent from a BAP. The payment terms, offers and terms of fulfillment supported by the BPP can also be included here. The BPP can show hierarchical nature of products/services in its catalog using the parent_category_id in categories. The BPP can also send a ttl (time to live) in the context which is the duration for which a BAP can cache the catalog and use the cached catalog.
This has properties like bbp/descriptor,bbp/categories,bbp/fulfillments,bbp/payments,bbp/offers,bbp/providers and exp
This is used in the following situations.
  • This is typically used in the discovery stage when the BPP sends the details of the products and services it offers as response to a search intent from the BAP.
" - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - fulfillments: - description: Fulfillment modes offered at the BPP level. This is used when a BPP itself offers fulfillments on behalf of the providers it has onboarded. - type: array - items: - $ref: "#/components/schemas/Fulfillment" - payments: - description: Payment terms offered by the BPP for all transactions. This can be overriden at the provider level. - type: array - items: - $ref: "#/components/schemas/Payment" - offers: - description: Offers at the BPP-level. This is common across all providers onboarded by the BPP. - type: array - items: - $ref: "#/components/schemas/Offer" - providers: - type: array - items: - $ref: "#/components/schemas/Provider" - exp: - description: Timestamp after which catalog will expire - type: string - format: date-time - ttl: - description: Duration in seconds after which this catalog will expire - type: string - Category: - description: A label under which a collection of items can be grouped. - type: object - properties: - id: - description: ID of the category - type: string - parent_category_id: - $ref: "#/components/schemas/Category/properties/id" - descriptor: - $ref: "#/components/schemas/Descriptor" - time: - $ref: "#/components/schemas/Time" - ttl: - description: Time to live for an instance of this schema - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Circle: - description: Describes a circular region of a specified radius centered at a specified GPS coordinate. - type: object - properties: - gps: - $ref: "#/components/schemas/Gps" - radius: - $ref: "#/components/schemas/Scalar" - City: - description: Describes a city - type: object - properties: - name: - description: Name of the city - type: string - code: - description: City code - type: string - Contact: - description: Describes the contact information of an entity - type: object - properties: - phone: - type: string - email: - type: string - jcard: - type: object - description: A Jcard object as per draft-ietf-jcardcal-jcard-03 specification - Context: - description: "Every API call in beckn protocol has a context. It provides a high-level overview to the receiver about the nature of the intended transaction. Typically, it is the BAP that sets the transaction context based on the consumer's location and action on their UI. But sometimes, during unsolicited callbacks, the BPP also sets the transaction context but it is usually the same as the context of a previous full-cycle, request-callback interaction between the BAP and the BPP. The context object contains four types of fields.
  1. Demographic information about the transaction using fields like `domain`, `country`, and `region`.
  2. Addressing details like the sending and receiving platform's ID and API URL.
  3. Interoperability information like the protocol version that implemented by the sender and,
  4. Transaction details like the method being called at the receiver's endpoint, the transaction_id that represents an end-to-end user session at the BAP, a message ID to pair requests with callbacks, a timestamp to capture sending times, a ttl to specifiy the validity of the request, and a key to encrypt information if necessary.
This object must be passed in every interaction between a BAP and a BPP. In HTTP/S implementations, it is not necessary to send the context during the synchronous response. However, in asynchronous protocols, the context must be sent during all interactions," - type: object - properties: - domain: - description: Domain code that is relevant to this transaction context - allOf: - - $ref: "#/components/schemas/Domain/properties/code" - location: - description: The location where the transaction is intended to be fulfilled. - allOf: - - $ref: "#/components/schemas/Location" - action: - description: The Beckn protocol method being called by the sender and executed at the receiver. - type: string - version: - type: string - description: Version of transaction protocol being used by the sender. - bap_id: - description: Subscriber ID of the BAP - allOf: - - description: "A globally unique identifier of the platform, Typically it is the fully qualified domain name (FQDN) of the platform." - type: string - bap_uri: - description: Subscriber URL of the BAP for accepting callbacks from BPPs. - allOf: - - description: The callback URL of the Subscriber. This should necessarily contain the same domain name as set in `subscriber_id``. - type: string - format: uri - bpp_id: - description: Subscriber ID of the BPP - allOf: - - $ref: "#/components/schemas/Context/properties/bap_id/allOf/0" - bpp_uri: - description: Subscriber URL of the BPP for accepting calls from BAPs. - allOf: - - $ref: "#/components/schemas/Context/properties/bap_uri/allOf/0" - transaction_id: - description: "This is a unique value which persists across all API calls from `search` through `confirm`. This is done to indicate an active user session across multiple requests. The BPPs can use this value to push personalized recommendations, and dynamic offerings related to an ongoing transaction despite being unaware of the user active on the BAP." - type: string - format: uuid - message_id: - description: "This is a unique value which persists during a request / callback cycle. Since beckn protocol APIs are asynchronous, BAPs need a common value to match an incoming callback from a BPP to an earlier call. This value can also be used to ignore duplicate messages coming from the BPP. It is recommended to generate a fresh message_id for every new interaction. When sending unsolicited callbacks, BPPs must generate a new message_id." - type: string - format: uuid - timestamp: - description: Time of request generation in RFC3339 format - type: string - format: date-time - key: - description: The encryption public key of the sender - type: string - ttl: - description: The duration in ISO8601 format after timestamp for which this message holds valid - type: string - Country: - description: Describes a country - type: object - properties: - name: - type: string - description: Name of the country - code: - type: string - description: Country code as per ISO 3166-1 and ISO 3166-2 format - Credential: - description: Describes a credential of an entity - Person or Organization - type: object - properties: - id: - type: string - type: - type: string - default: VerifiableCredential - url: - description: URL of the credential - type: string - format: uri - Customer: - description: Describes a customer buying/availing a product or a service - type: object - properties: - person: - $ref: "#/components/schemas/Person" - contact: - $ref: "#/components/schemas/Contact" - DecimalValue: - description: Describes a numerical value in decimal form - type: string - pattern: "[+-]?([0-9]*[.])?[0-9]+" - Descriptor: - description: Physical description of something. - type: object - properties: - name: - type: string - code: - type: string - short_desc: - type: string - long_desc: - type: string - additional_desc: - type: object - properties: - url: - type: string - content_type: - type: string - enum: - - text/plain - - text/html - - application/json - media: - type: array - items: - $ref: "#/components/schemas/MediaFile" - images: - type: array - items: - $ref: "#/components/schemas/Image" - Domain: - description: "Described the industry sector or sub-sector. The network policy should contain codes for all the industry sectors supported by the network. Domains can be created in varying levels of granularity. The granularity of a domain can be decided by the participants of the network. Too broad domains will result in irrelevant search broadcast calls to BPPs that don't have services supporting the domain. Too narrow domains will result in a large number of registry entries for each BPP. It is recommended that network facilitators actively collaborate with various working groups and network participants to carefully choose domain codes keeping in mind relevance, performance, and opportunity cost. It is recommended that networks choose broad domains like mobility, logistics, healthcare etc, and progressively granularize them as and when the number of network participants for each domain grows large." - type: object - properties: - name: - description: Name of the domain - type: string - code: - description: "Standard code representing the domain. The standard is usually published as part of the network policy. Furthermore, the network facilitator should also provide a mechanism to provide the supported domains of a network." - additional_info: - description: A url that contains addtional information about that domain. - allOf: - - $ref: "#/components/schemas/MediaFile" - Duration: - description: Describes duration as per ISO8601 format - type: string - Error: - description: "Describes an error object that is returned by a BAP, BPP or BG as a response or callback to an action by another network participant. This object is sent when any request received by a network participant is unacceptable. This object can be sent either during Ack or with the callback." - type: object - properties: - code: - type: string - description: 'Standard error code. For full list of error codes, refer to docs/protocol-drafts/BECKN-005-ERROR-CODES-DRAFT-01.md of this repo"' - paths: - type: string - description: Path to json schema generating the error. Used only during json schema validation errors - message: - type: string - description: Human readable message describing the error. Used mainly for logging. Not recommended to be shown to the user. - Fee: - description: A fee applied on a particular entity - type: object - properties: - percentage: - description: Percentage of a value - allOf: - - $ref: "#/components/schemas/DecimalValue" - amount: - description: A fixed value - allOf: - - $ref: "#/components/schemas/Price" - Form: - description: Describes a form - type: object - properties: - url: - description: "The URL from where the form can be fetched. The content fetched from the url must be processed as per the mime_type specified in this object. Once fetched, the rendering platform can choosed to render the form as-is as an embeddable element; or process it further to blend with the theme of the application. In case the interface is non-visual, the the render can process the form data and reproduce it as per the standard specified in the form." - type: string - format: uri - data: - description: The form submission data - type: object - additionalProperties: - type: string - mime_type: - description: This field indicates the nature and format of the form received by querying the url. MIME types are defined and standardized in IETF's RFC 6838. - type: string - enum: - - text/html - - application/xml - submission_id: - type: string - format: uuid - Fulfillment: - description: Describes how a an order will be rendered/fulfilled to the end-customer - type: object - properties: - id: - description: Unique reference ID to the fulfillment of an order - type: string - type: - description: "A code that describes the mode of fulfillment. This is typically set when there are multiple ways an order can be fulfilled. For example, a retail order can be fulfilled either via store pickup or a home delivery. Similarly, a medical consultation can be provided either in-person or via tele-consultation. The network policy must publish standard fulfillment type codes for the different modes of fulfillment." - type: string - rateable: - description: Whether the fulfillment can be rated or not - type: boolean - rating: - description: The rating value of the fulfullment service. - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - state: - description: The current state of fulfillment. The BPP must set this value whenever the state of the order fulfillment changes and fire an unsolicited `on_status` call. - allOf: - - $ref: "#/components/schemas/FulfillmentState" - tracking: - type: boolean - description: Indicates whether the fulfillment allows tracking - default: false - customer: - description: The person that will ultimately receive the order - allOf: - - $ref: "#/components/schemas/Customer" - agent: - description: The agent that is currently handling the fulfillment of the order - allOf: - - $ref: "#/components/schemas/Agent" - contact: - $ref: "#/components/schemas/Contact" - vehicle: - $ref: "#/components/schemas/Vehicle" - stops: - description: The list of logical stops encountered during the fulfillment of an order. - type: array - items: - $ref: "#/components/schemas/Stop" - path: - description: The physical path taken by the agent that can be rendered on a map. The allowed format of this property can be set by the network. - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - FulfillmentState: - description: Describes the state of fulfillment - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - updated_at: - type: string - format: date-time - updated_by: - type: string - description: ID of entity which changed the state - Gps: - description: Describes a GPS coordinate - type: string - pattern: '^[-+]?([1-8]?\d(\.\d+)?|90(\.0+)?),\s*[-+]?(180(\.0+)?|((1[0-7]\d)|([1-9]?\d))(\.\d+)?)$' - Image: - description: Describes an image - type: object - properties: - url: - description: URL to the image. This can be a data url or an remote url - type: string - format: uri - size_type: - description: The size of the image. The network policy can define the default dimensions of each type - type: string - enum: - - xs - - sm - - md - - lg - - xl - - custom - width: - description: Width of the image in pixels - type: string - height: - description: Height of the image in pixels - type: string - Intent: - description: "The intent to buy or avail a product or a service. The BAP can declare the intent of the consumer containing
  • What they want (A product, service, offer)
  • Who they want (A seller, service provider, agent etc)
  • Where they want it and where they want it from
  • When they want it (start and end time of fulfillment
  • How they want to pay for it

This has properties like descriptor,provider,fulfillment,payment,category,offer,item,tags
This is typically used by the BAP to send the purpose of the user's search to the BPP. This will be used by the BPP to find products or services it offers that may match the user's intent.
For example, in Mobility, the mobility consumer declares a mobility intent. In this case, the mobility consumer declares information that describes various aspects of their journey like,
  • Where would they like to begin their journey (intent.fulfillment.start.location)
  • Where would they like to end their journey (intent.fulfillment.end.location)
  • When would they like to begin their journey (intent.fulfillment.start.time)
  • When would they like to end their journey (intent.fulfillment.end.time)
  • Who is the transport service provider they would like to avail services from (intent.provider)
  • Who is traveling (This is not recommended in public networks) (intent.fulfillment.customer)
  • What kind of fare product would they like to purchase (intent.item)
  • What add-on services would they like to avail
  • What offers would they like to apply on their booking (intent.offer)
  • What category of services would they like to avail (intent.category)
  • What additional luggage are they carrying
  • How would they like to pay for their journey (intent.payment)

For example, in health domain, a consumer declares the intent for a lab booking the describes various aspects of their booking like,
  • Where would they like to get their scan/test done (intent.fulfillment.start.location)
  • When would they like to get their scan/test done (intent.fulfillment.start.time)
  • When would they like to get the results of their test/scan (intent.fulfillment.end.time)
  • Who is the service provider they would like to avail services from (intent.provider)
  • Who is getting the test/scan (intent.fulfillment.customer)
  • What kind of test/scan would they like to purchase (intent.item)
  • What category of services would they like to avail (intent.category)
  • How would they like to pay for their journey (intent.payment)
" - type: object - properties: - descriptor: - description: "A raw description of the search intent. Free text search strings, raw audio, etc can be sent in this object." - allOf: - - $ref: "#/components/schemas/Descriptor" - provider: - description: The provider from which the customer wants to place to the order from - allOf: - - $ref: "#/components/schemas/Provider" - fulfillment: - description: Details on how the customer wants their order fulfilled - allOf: - - $ref: "#/components/schemas/Fulfillment" - payment: - description: Details on how the customer wants to pay for the order - allOf: - - $ref: "#/components/schemas/Payment" - category: - description: Details on the item category - allOf: - - $ref: "#/components/schemas/Category" - offer: - description: details on the offer the customer wants to avail - allOf: - - $ref: "#/components/schemas/Offer" - item: - description: Details of the item that the consumer wants to order - allOf: - - $ref: "#/components/schemas/Item" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - ItemQuantity: - description: Describes the count or amount of an item - type: object - properties: - allocated: - description: This represents the exact quantity allocated for purchase of the item. - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - available: - description: This represents the exact quantity available for purchase of the item. The buyer can only purchase multiples of this - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - maximum: - description: This represents the maximum quantity allowed for purchase of the item - type: object - properties: - count: - type: integer - minimum: 1 - measure: - $ref: "#/components/schemas/Scalar" - minimum: - description: This represents the minimum quantity allowed for purchase of the item - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - selected: - description: This represents the quantity selected for purchase of the item - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - unitized: - description: This represents the quantity available in a single unit of the item - type: object - properties: - count: - type: integer - minimum: 1 - maximum: 1 - measure: - $ref: "#/components/schemas/Scalar" - Item: - description: "Describes a product or a service offered to the end consumer by the provider. In the mobility sector, it can represent a fare product like one way journey. In the logistics sector, it can represent the delivery service offering. In the retail domain it can represent a product like a grocery item." - type: object - properties: - id: - description: ID of the item. - type: string - parent_item_id: - description: "ID of the item, this item is a variant of" - allOf: - - $ref: "#/components/schemas/Item/properties/id" - parent_item_quantity: - description: The number of units of the parent item this item is a multiple of - allOf: - - $ref: "#/components/schemas/ItemQuantity" - descriptor: - description: Physical description of the item - allOf: - - $ref: "#/components/schemas/Descriptor" - creator: - description: The creator of this item - allOf: - - $ref: "#/components/schemas/Organization" - price: - description: "The price of this item, if it has intrinsic value" - allOf: - - $ref: "#/components/schemas/Price" - quantity: - description: The selling quantity of the item - allOf: - - $ref: "#/components/schemas/ItemQuantity" - category_ids: - description: Categories this item can be listed under - type: array - items: - allOf: - - $ref: "#/components/schemas/Category/properties/id" - fulfillment_ids: - description: Modes through which this item can be fulfilled - type: array - items: - allOf: - - $ref: "#/components/schemas/Fulfillment/properties/id" - location_ids: - description: Provider Locations this item is available in - type: array - items: - allOf: - - $ref: "#/components/schemas/Location/properties/id" - payment_ids: - description: Payment modalities through which this item can be ordered - type: array - items: - allOf: - - $ref: "#/components/schemas/Payment/properties/id" - add_ons: - type: array - items: - $ref: "#/components/schemas/AddOn" - cancellation_terms: - description: Cancellation terms of this item - type: array - items: - $ref: "#/components/schemas/CancellationTerm" - refund_terms: - description: Refund terms of this item - type: array - items: - description: Refund term of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/State" - refund_eligible: - description: Indicates if cancellation will result in a refund - type: boolean - refund_within: - description: Time within which refund will be processed after successful cancellation. - allOf: - - $ref: "#/components/schemas/Time" - refund_amount: - $ref: "#/components/schemas/Price" - replacement_terms: - description: Terms that are applicable be met when this item is replaced - type: array - items: - $ref: "#/components/schemas/ReplacementTerm" - return_terms: - description: Terms that are applicable when this item is returned - type: array - items: - $ref: "#/components/schemas/ReturnTerm" - xinput: - description: Additional input required from the customer to purchase / avail this item - allOf: - - $ref: "#/components/schemas/XInput" - time: - description: Temporal attributes of this item. This property is used when the item exists on the catalog only for a limited period of time. - allOf: - - $ref: "#/components/schemas/Time" - rateable: - description: Whether this item can be rated - type: boolean - rating: - description: The rating of the item - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - matched: - description: Whether this item is an exact match of the request - type: boolean - related: - description: Whether this item is a related item to the exactly matched item - type: boolean - recommended: - description: Whether this item is a recommended item to a response - type: boolean - ttl: - description: Time to live in seconds for an instance of this schema - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Location: - description: The physical location of something - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - map_url: - description: The url to the map of the location. This can be a globally recognized map url or the one specified by the network policy. - type: string - format: uri - gps: - description: The GPS co-ordinates of this location. - allOf: - - $ref: "#/components/schemas/Gps" - address: - description: The address of this location. - allOf: - - $ref: "#/components/schemas/Address" - city: - description: "The city this location is, or is located within" - allOf: - - $ref: "#/components/schemas/City" - district: - description: "The state this location is, or is located within" - type: string - state: - description: "The state this location is, or is located within" - allOf: - - $ref: "#/components/schemas/State" - country: - description: "The country this location is, or is located within" - allOf: - - $ref: "#/components/schemas/Country" - area_code: - type: string - circle: - $ref: "#/components/schemas/Circle" - polygon: - description: The boundary polygon of this location - type: string - 3dspace: - description: The three dimensional region describing this location - type: string - rating: - description: The rating of this location - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - MediaFile: - description: This object contains a url to a media file. - type: object - properties: - mimetype: - description: "indicates the nature and format of the document, file, or assortment of bytes. MIME types are defined and standardized in IETF's RFC 6838" - type: string - url: - description: The URL of the file - type: string - format: uri - signature: - description: The digital signature of the file signed by the sender - type: string - dsa: - description: The signing algorithm used by the sender - type: string - Offer: - description: An offer associated with a catalog. This is typically used to promote a particular product and enable more purchases. - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - location_ids: - type: array - items: - $ref: "#/components/schemas/Location/properties/id" - category_ids: - type: array - items: - $ref: "#/components/schemas/Category/properties/id" - item_ids: - type: array - items: - $ref: "#/components/schemas/Item/properties/id" - time: - $ref: "#/components/schemas/Time" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Option: - description: Describes a selectable option - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - Order: - description: Describes a legal purchase order. It contains the complete details of the legal contract created between the buyer and the seller. - type: object - properties: - id: - type: string - description: Human-readable ID of the order. This is generated at the BPP layer. The BPP can either generate order id within its system or forward the order ID created at the provider level. - ref_order_ids: - description: A list of order IDs to link this order to previous orders. - type: array - items: - type: string - description: ID of a previous order - status: - description: Status of the order. Allowed values can be defined by the network policy - type: string - enum: - - ACTIVE - - COMPLETE - - CANCELLED - type: - description: "This is used to indicate the type of order being created to BPPs. Sometimes orders can be linked to previous orders, like a replacement order in a retail domain. A follow-up consultation in healthcare domain. A single order part of a subscription order. The list of order types can be standardized at the network level." - type: string - default: DEFAULT - enum: - - DRAFT - - DEFAULT - provider: - description: Details of the provider whose catalog items have been selected. - allOf: - - $ref: "#/components/schemas/Provider" - items: - description: The items purchased / availed in this order - type: array - items: - $ref: "#/components/schemas/Item" - add_ons: - description: The add-ons purchased / availed in this order - type: array - items: - $ref: "#/components/schemas/AddOn" - offers: - description: The offers applied in this order - type: array - items: - $ref: "#/components/schemas/Offer" - billing: - description: The billing details of this order - allOf: - - $ref: "#/components/schemas/Billing" - fulfillments: - description: The fulfillments involved in completing this order - type: array - items: - $ref: "#/components/schemas/Fulfillment" - cancellation: - description: The cancellation details of this order - allOf: - - $ref: "#/components/schemas/Cancellation" - cancellation_terms: - description: Cancellation terms of this item - type: array - items: - $ref: "#/components/schemas/CancellationTerm" - refund_terms: - description: Refund terms of this item - type: array - items: - $ref: "#/components/schemas/Item/properties/refund_terms/items" - replacement_terms: - description: Replacement terms of this item - type: array - items: - $ref: "#/components/schemas/ReplacementTerm" - return_terms: - description: Return terms of this item - type: array - items: - $ref: "#/components/schemas/ReturnTerm" - quote: - description: The mutually agreed upon quotation for this order. - allOf: - - $ref: "#/components/schemas/Quotation" - payments: - description: The terms of settlement for this order - type: array - items: - $ref: "#/components/schemas/Payment" - created_at: - description: The date-time of creation of this order - type: string - format: date-time - updated_at: - description: The date-time of updated of this order - type: string - format: date-time - xinput: - description: Additional input required from the customer to confirm this order - allOf: - - $ref: "#/components/schemas/XInput" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Organization: - description: An organization. Usually a recognized business entity. - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - address: - description: The postal address of the organization - allOf: - - $ref: "#/components/schemas/Address" - state: - description: The state where the organization's address is registered - allOf: - - $ref: "#/components/schemas/State" - city: - description: The city where the the organization's address is registered - allOf: - - $ref: "#/components/schemas/City" - contact: - $ref: "#/components/schemas/Contact" - Payment: - description: "Describes the terms of settlement between the BAP and the BPP for a single transaction. When instantiated, this object contains
  1. the amount that has to be settled,
  2. The payment destination destination details
  3. When the settlement should happen, and
  4. A transaction reference ID
. During a transaction, the BPP reserves the right to decide the terms of payment. However, the BAP can send its terms to the BPP first. If the BPP does not agree to those terms, it must overwrite the terms and return them to the BAP. If overridden, the BAP must either agree to the terms sent by the BPP in order to preserve the provider's autonomy, or abort the transaction. In case of such disagreements, the BAP and the BPP can perform offline negotiations on the payment terms. Once an agreement is reached, the BAP and BPP can resume transactions." - type: object - properties: - id: - description: ID of the payment term that can be referred at an item or an order level in a catalog - type: string - collected_by: - description: "This field indicates who is the collector of payment. The BAP can set this value to 'bap' if it wants to collect the payment first and settle it to the BPP. If the BPP agrees to those terms, the BPP should not send the payment url. Alternatively, the BPP can set this field with the value 'bpp' if it wants the payment to be made directly." - url: - type: string - description: "A payment url to be called by the BAP. If empty, then the payment is to be done offline. The details of payment should be present in the params object. If tl_method = http/get, then the payment details will be sent as url params. Two url param values, ```$transaction_id``` and ```$amount``` are mandatory." - format: uri - params: - type: object - properties: - transaction_id: - type: string - description: The reference transaction ID associated with a payment activity - amount: - type: string - currency: - type: string - bank_code: - type: string - bank_account_number: - type: string - virtual_payment_address: - type: string - source_bank_code: - type: string - source_bank_account_number: - type: string - source_virtual_payment_address: - type: string - type: - type: string - enum: - - PRE-ORDER - - PRE-FULFILLMENT - - ON-FULFILLMENT - - POST-FULFILLMENT - status: - type: string - enum: - - PAID - - NOT-PAID - time: - $ref: "#/components/schemas/Time" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Person: - description: Describes a person as any individual - type: object - properties: - id: - type: string - description: Describes the identity of the person - url: - description: Profile url of the person - type: string - format: uri - name: - description: the name of the person - type: string - image: - $ref: "#/components/schemas/Image" - age: - description: Age of the person - allOf: - - $ref: "#/components/schemas/Duration" - dob: - description: Date of birth of the person - type: string - format: date - gender: - type: string - description: "Gender of something, typically a Person, but possibly also fictional characters, animals, etc. While Male and Female may be used, text strings are also acceptable for people who do not identify as a binary gender.Allowed values for this field can be published in the network policy" - creds: - type: array - items: - $ref: "#/components/schemas/Credential" - languages: - type: array - items: - description: Describes a language known to the person. - type: object - properties: - code: - type: string - name: - type: string - skills: - type: array - items: - description: Describes a skill of the person. - type: object - properties: - code: - type: string - name: - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Price: - description: Describes the price of a product or service - type: object - properties: - currency: - type: string - value: - $ref: "#/components/schemas/DecimalValue" - estimated_value: - $ref: "#/components/schemas/DecimalValue" - computed_value: - $ref: "#/components/schemas/DecimalValue" - listed_value: - $ref: "#/components/schemas/DecimalValue" - offered_value: - $ref: "#/components/schemas/DecimalValue" - minimum_value: - $ref: "#/components/schemas/DecimalValue" - maximum_value: - $ref: "#/components/schemas/DecimalValue" - Provider: - description: Describes the catalog of a business. - type: object - properties: - id: - type: string - description: Id of the provider - descriptor: - $ref: "#/components/schemas/Descriptor" - category_id: - type: string - description: Category Id of the provider at the BPP-level catalog - rating: - $ref: "#/components/schemas/Rating/properties/value" - time: - $ref: "#/components/schemas/Time" - categories: - type: array - items: - $ref: "#/components/schemas/Category" - fulfillments: - type: array - items: - $ref: "#/components/schemas/Fulfillment" - payments: - type: array - items: - $ref: "#/components/schemas/Payment" - locations: - type: array - items: - $ref: "#/components/schemas/Location" - offers: - type: array - items: - $ref: "#/components/schemas/Offer" - items: - type: array - items: - $ref: "#/components/schemas/Item" - exp: - type: string - description: Time after which catalog has to be refreshed - format: date-time - rateable: - description: Whether this provider can be rated or not - type: boolean - ttl: - description: "The time-to-live in seconds, for this object. This can be overriden at deeper levels. A value of -1 indicates that this object is not cacheable." - type: integer - minimum: -1 - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Quotation: - description: "Describes a quote. It is the estimated price of products or services from the BPP.
This has properties like price, breakup, ttl" - type: object - properties: - id: - description: ID of the quote. - type: string - format: uuid - price: - description: The total quoted price - allOf: - - $ref: "#/components/schemas/Price" - breakup: - description: the breakup of the total quoted price - type: array - items: - type: object - properties: - item: - $ref: "#/components/schemas/Item" - title: - type: string - price: - $ref: "#/components/schemas/Price" - ttl: - $ref: "#/components/schemas/Duration" - Rating: - description: Describes the rating of an entity - type: object - properties: - rating_category: - description: Category of the entity being rated - type: string - enum: - - Item - - Order - - Fulfillment - - Provider - - Agent - - Support - id: - description: Id of the object being rated - type: string - value: - description: "Rating value given to the object. This can be a single value or can also contain an inequality operator like gt, gte, lt, lte. This can also contain an inequality expression containing logical operators like && and ||." - type: string - Region: - description: Describes an arbitrary region of space. The network policy should contain a published list of supported regions by the network. - type: object - properties: - dimensions: - description: "The number of dimensions that are used to describe any point inside that region. The most common dimensionality of a region is 2, that represents an area on a map. There are regions on the map that can be approximated to one-dimensional regions like roads, railway lines, or shipping lines. 3 dimensional regions are rarer, but are gaining popularity as flying drones are being adopted for various fulfillment services." - type: string - enum: - - "1" - - "2" - - "3" - type: - description: "The type of region. This is used to specify the granularity of the region represented by this object. Various examples of two-dimensional region types are city, country, state, district, and so on. The network policy should contain a list of all possible region types supported by the network." - type: string - name: - type: string - description: Name of the region as specified on the map where that region exists. - code: - type: string - description: A standard code representing the region. This should be interpreted in the same way by all network participants. - boundary: - type: string - description: "A string representing the boundary of the region. One-dimensional regions are represented by polylines. Two-dimensional regions are represented by polygons, and three-dimensional regions can represented by polyhedra." - map_url: - type: string - description: The url to the map of the region. This can be a globally recognized map or the one specified by the network policy. - ReplacementTerm: - description: The replacement policy of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/State" - replace_within: - description: "Applicable only for buyer managed returns where the buyer has to replace the item before a certain date-time, failing which they will not be eligible for replacement" - allOf: - - $ref: "#/components/schemas/Time" - external_ref: - $ref: "#/components/schemas/MediaFile" - ReturnTerm: - description: Describes the return policy of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term IETF''s applicable. - allOf: - - $ref: "#/components/schemas/State" - return_eligible: - description: Indicates whether the item is eligible for return - type: boolean - return_time: - description: "Applicable only for buyer managed returns where the buyer has to return the item to the origin before a certain date-time, failing which they will not be eligible for refund." - allOf: - - $ref: "#/components/schemas/Time" - return_location: - description: The location where the item or order must / will be returned to - allOf: - - $ref: "#/components/schemas/Location" - fulfillment_managed_by: - description: The entity that will perform the return - type: string - enum: - - CONSUMER - - PROVIDER - Scalar: - description: Describes a scalar - type: object - properties: - type: - type: string - enum: - - CONSTANT - - VARIABLE - value: - $ref: "#/components/schemas/DecimalValue" - estimated_value: - $ref: "#/components/schemas/DecimalValue" - computed_value: - $ref: "#/components/schemas/DecimalValue" - range: - type: object - properties: - min: - $ref: "#/components/schemas/DecimalValue" - max: - $ref: "#/components/schemas/DecimalValue" - unit: - type: string - Schedule: - description: "Describes schedule as a repeating time period used to describe a regularly recurring event. At a minimum a schedule will specify frequency which describes the interval between occurrences of the event. Additional information can be provided to specify the schedule more precisely. This includes identifying the timestamps(s) of when the event will take place. Schedules may also have holidays to exclude a specific day from the schedule.
This has properties like frequency, holidays, times" - type: object - properties: - frequency: - $ref: "#/components/schemas/Duration" - holidays: - type: array - items: - type: string - format: date-time - times: - type: array - items: - type: string - format: date-time - State: - description: A bounded geopolitical region of governance inside a country. - type: object - properties: - name: - type: string - description: Name of the state - code: - type: string - description: State code as per country or international standards - Stop: - description: A logical point in space and time during the fulfillment of an order. - type: object - properties: - id: - type: string - parent_stop_id: - type: string - location: - description: Location of the stop - allOf: - - $ref: "#/components/schemas/Location" - type: - description: The type of stop. Allowed values of this property can be defined by the network policy. - type: string - time: - description: Timings applicable at the stop. - allOf: - - $ref: "#/components/schemas/Time" - instructions: - description: Instructions that need to be followed at the stop - allOf: - - $ref: "#/components/schemas/Descriptor" - contact: - description: Contact details of the stop - allOf: - - $ref: "#/components/schemas/Contact" - person: - description: The details of the person present at the stop - allOf: - - $ref: "#/components/schemas/Person" - authorization: - $ref: "#/components/schemas/Authorization" - Support: - description: Details of customer support - type: object - properties: - ref_id: - type: string - callback_phone: - type: string - format: phone - phone: - type: string - format: phone - email: - type: string - format: email - url: - type: string - format: uri - Tag: - description: "Describes a tag. This is used to contain extended metadata. This object can be added as a property to any schema to describe extended attributes. For BAPs, tags can be sent during search to optimize and filter search results. BPPs can use tags to index their catalog to allow better search functionality. Tags are sent by the BPP as part of the catalog response in the `on_search` callback. Tags are also meant for display purposes. Upon receiving a tag, BAPs are meant to render them as name-value pairs. This is particularly useful when rendering tabular information about a product or service." - type: object - properties: - descriptor: - description: "Description of the Tag, can be used to store detailed information." - allOf: - - $ref: "#/components/schemas/Descriptor" - value: - description: The value of the tag. This set by the BPP and rendered as-is by the BAP. - type: string - display: - description: "This value indicates if the tag is intended for display purposes. If set to `true`, then this tag must be displayed. If it is set to `false`, it should not be displayed. This value can override the group display value." - type: boolean - TagGroup: - description: "A collection of tag objects with group level attributes. For detailed documentation on the Tags and Tag Groups schema go to https://github.com/beckn/protocol-specifications/discussions/316" - type: object - properties: - display: - description: "Indicates the display properties of the tag group. If display is set to false, then the group will not be displayed. If it is set to true, it should be displayed. However, group-level display properties can be overriden by individual tag-level display property. As this schema is purely for catalog display purposes, it is not recommended to send this value during search." - type: boolean - default: true - descriptor: - description: "Description of the TagGroup, can be used to store detailed information." - allOf: - - $ref: "#/components/schemas/Descriptor" - list: - description: "An array of Tag objects listed under this group. This property can be set by BAPs during search to narrow the `search` and achieve more relevant results. When received during `on_search`, BAPs must render this list under the heading described by the `name` property of this schema." - type: array - items: - $ref: "#/components/schemas/Tag" - Time: - description: "Describes time in its various forms. It can be a single point in time; duration; or a structured timetable of operations
This has properties like label, time stamp,duration,range, days, schedule" - type: object - properties: - label: - type: string - timestamp: - type: string - format: date-time - duration: - $ref: "#/components/schemas/Duration" - range: - type: object - properties: - start: - type: string - format: date-time - end: - type: string - format: date-time - days: - type: string - description: comma separated values representing days of the week - schedule: - $ref: "#/components/schemas/Schedule" - Tracking: - description: Contains tracking information that can be used by the BAP to track the fulfillment of an order in real-time. which is useful for knowing the location of time sensitive deliveries. - type: object - properties: - id: - description: A unique tracking reference number - type: string - url: - description: "A URL to the tracking endpoint. This can be a link to a tracking webpage, a webhook URL created by the BAP where BPP can push the tracking data, or a GET url creaed by the BPP which the BAP can poll to get the tracking data. It can also be a websocket URL where the BPP can push real-time tracking data." - type: string - format: uri - location: - description: "In case there is no real-time tracking endpoint available, this field will contain the latest location of the entity being tracked. The BPP will update this value everytime the BAP calls the track API." - allOf: - - $ref: "#/components/schemas/Location" - status: - description: "This value indicates if the tracking is currently active or not. If this value is `active`, then the BAP can begin tracking the order. If this value is `inactive`, the tracking URL is considered to be expired and the BAP should stop tracking the order." - type: string - enum: - - active - - inactive - Vehicle: - description: "Describes a vehicle is a device that is designed or used to transport people or cargo over land, water, air, or through space.
This has properties like category, capacity, make, model, size,variant,color,energy_type,registration" - type: object - properties: - category: - type: string - capacity: - type: integer - make: - type: string - model: - type: string - size: - type: string - variant: - type: string - color: - type: string - energy_type: - type: string - registration: - type: string - wheels_count: - type: string - cargo_volumne: - type: string - wheelchair_access: - type: string - code: - type: string - emission_standard: - type: string - XInput: - description: "Contains any additional or extended inputs required to confirm an order. This is typically a Form Input. Sometimes, selection of catalog elements is not enough for the BPP to confirm an order. For example, to confirm a flight ticket, the airline requires details of the passengers along with information on baggage, identity, in addition to the class of ticket. Similarly, a logistics company may require details on the nature of shipment in order to confirm the shipping. A recruiting firm may require additional details on the applicant in order to confirm a job application. For all such purposes, the BPP can choose to send this object attached to any object in the catalog that is required to be sent while placing the order. This object can typically be sent at an item level or at the order level. The item level XInput will override the Order level XInput as it indicates a special requirement of information for that particular item. Hence the BAP must render a separate form for the Item and another form at the Order level before confirmation." - type: object - properties: - form: - $ref: "#/components/schemas/Form" - required: - description: Indicates whether the form data is mandatorily required by the BPP to confirm the order. - type: boolean diff --git a/layer2/samples/uei_charging_1.1.0.yaml b/layer2/samples/uei_charging_1.1.0.yaml deleted file mode 100644 index b92a4a7..0000000 --- a/layer2/samples/uei_charging_1.1.0.yaml +++ /dev/null @@ -1,2164 +0,0 @@ -openapi: 3.0.0 -info: - title: Beckn Protocol Core - description: uei:charging layer 2 config from core yaml - version: 1.1.0 -security: - - SubscriberAuth: [] -paths: - /search: - post: - tags: - - Beckn Provider Platform (BPP) - - Beckn Gateway (BG) - description: BAP declares the customer's intent to buy/avail products or services - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - search - message: - type: object - properties: - intent: - $ref: "#/components/schemas/Intent" - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /select: - post: - tags: - - Beckn Provider Platform (BPP) - description: BAP declares the customer's cart (or equivalent) created by selecting objects from the catalog - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - select - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /init: - post: - tags: - - Beckn Provider Platform (BPP) - description: Initialize an order by providing billing and/or shipping details - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - init - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - allOf: - - $ref: "#/components/schemas/Ack" - - properties: - status: - enum: - - ACK - - NACK - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /confirm: - post: - tags: - - Beckn Provider Platform (BPP) - description: Initialize an order by providing billing and/or shipping details - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - confirm - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /status: - post: - tags: - - Beckn Provider Platform (BPP) - description: Fetch the latest order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - status - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - required: - - order_id - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /track: - post: - tags: - - Beckn Provider Platform (BPP) - description: Track an active order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - track - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - callback_url: - type: string - format: uri - required: - - order_id - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /cancel: - post: - tags: - - Beckn Provider Platform (BPP) - description: Cancel an order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - cancel - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - cancellation_reason_id: - $ref: "#/components/schemas/Option/properties/id" - descriptor: - $ref: "#/components/schemas/Descriptor" - required: - - order_id - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /update: - post: - tags: - - Beckn Provider Platform (BPP) - description: Remove object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - update - required: - - action - message: - type: object - properties: - update_target: - description: 'Comma separated values of order objects being updated. For example: ```"update_target":"item,billing,fulfillment"```' - type: string - order: - description: Updated order object - allOf: - - $ref: "#/components/schemas/Order" - required: - - update_target - - order - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /rating: - post: - tags: - - Beckn Provider Platform (BPP) - description: Provide feedback on a service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - rating - required: - - action - message: - type: object - properties: - ratings: - type: array - items: - $ref: "#/components/schemas/Rating" - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /support: - post: - tags: - - Beckn Provider Platform (BPP) - description: Contact support - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - support - required: - - action - message: - type: object - properties: - support: - $ref: "#/components/schemas/Support" - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_search: - post: - tags: - - Beckn Application Platform (BAP) - - Beckn Gateway (BG) - description: BPP sends its catalog in response to a search request. - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_search - required: - - action - message: - type: object - properties: - catalog: - $ref: "#/components/schemas/Catalog" - required: - - catalog - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_select: - post: - tags: - - Beckn Application Platform (BAP) - description: Send draft order object with quoted price for selected items - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_select - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_init: - post: - tags: - - Beckn Application Platform (BAP) - description: Send order object with payment details updated - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_init - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_confirm: - post: - tags: - - Beckn Application Platform (BAP) - description: Send active order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_confirm - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_track: - post: - tags: - - Beckn Application Platform (BAP) - description: Send tracking details of an active order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_track - required: - - action - message: - type: object - properties: - tracking: - $ref: "#/components/schemas/Tracking" - required: - - tracking - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_cancel: - post: - tags: - - Beckn Application Platform (BAP) - description: Send cancellation request_id with reasons list in case of cancellation request. Else send cancelled order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_cancel - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_update: - post: - tags: - - Beckn Application Platform (BAP) - description: Returns updated service with updated runtime object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_update - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_status: - post: - tags: - - Beckn Application Platform (BAP) - description: Fetch the status of a Service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_status - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_rating: - post: - tags: - - Beckn Application Platform (BAP) - description: Provide feedback on a service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_rating - required: - - action - message: - type: object - properties: - feedback_form: - description: A feedback form to allow the user to provide additional information on the rating provided - allOf: - - $ref: "#/components/schemas/XInput" - error: - $ref: "#/components/schemas/Error" - required: - - context - - message - responses: - default: - $ref: "#/paths/~1init/post/responses/default" - /on_support: - post: - tags: - - Beckn Application Platform (BAP) - description: Contact Support - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_support - required: - - action - message: - type: object - properties: - support: - $ref: "#/components/schemas/Support" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - $ref: "#/paths/~1init/post/responses/default" -components: - securitySchemes: - SubscriberAuth: - type: apiKey - in: header - name: Authorization - description: 'Signature of message body using BAP or BPP subscriber''s signing public key.

Format:

Authorization : Signature keyId="{subscriber_id}|{unique_key_id}|{algorithm}",algorithm="ed25519",created="1606970629",expires="1607030629",headers="(created) (expires) digest",signature="Base64(signing string)"' - schemas: - Ack: - description: "Describes the acknowledgement sent in response to an API call. If the implementation uses HTTP/S, then Ack must be returned in the same session. Every API call to a BPP must be responded to with an Ack whether the BPP intends to respond with a callback or not. This has one property called `status` that indicates the status of the Acknowledgement." - type: object - properties: - status: - type: string - description: "The status of the acknowledgement. If the request passes the validation criteria of the BPP, then this is set to ACK. If a BPP responds with status = `ACK` to a request, it is required to respond with a callback. If the request fails the validation criteria, then this is set to NACK. Additionally, if a BPP does not intend to respond with a callback even after the request meets the validation criteria, it should set this value to `NACK`." - enum: - - ACK - - NACK - tags: - description: A list of tags containing any additional information sent along with the Acknowledgement. - type: array - items: - $ref: "#/components/schemas/TagGroup" - AddOn: - description: Describes an additional item offered as a value-addition to a product or service. This does not exist independently in a catalog and is always associated with an item. - type: object - properties: - id: - description: Provider-defined ID of the add-on - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - price: - $ref: "#/components/schemas/Price" - Address: - description: Describes a postal address. - type: string - Agent: - description: "Describes the direct performer, driver or executor that fulfills an order. It is usually a person. But in some rare cases, it could be a non-living entity like a drone, or a bot. Some examples of agents are Doctor in the healthcare sector, a driver in the mobility sector, or a delivery person in the logistics sector. This object can be set at any stage of the order lifecycle. This can be set at the discovery stage when the BPP wants to provide details on the agent fulfilling the order, like in healthcare, where the doctor's name appears during search. This object can also used to search for a particular person that the customer wants fulfilling an order. Sometimes, this object gets instantiated after the order is confirmed, like in the case of on-demand taxis, where the driver is assigned after the user confirms the ride." - properties: - person: - $ref: "#/components/schemas/Person" - contact: - $ref: "#/components/schemas/Contact" - organization: - $ref: "#/components/schemas/Organization" - rating: - $ref: "#/components/schemas/Rating/properties/value" - Authorization: - description: "Describes an authorization mechanism used to start or end the fulfillment of an order. For example, in the mobility sector, the driver may require a one-time password to initiate the ride. In the healthcare sector, a patient may need to provide a password to open a video conference link during a teleconsultation." - type: object - properties: - type: - description: Type of authorization mechanism used. The allowed values for this field can be published as part of the network policy. - type: string - token: - description: "Token used for authorization. This is typically generated at the BPP. The BAP can send this value to the user via any channel that it uses to authenticate the user like SMS, Email, Push notification, or in-app rendering." - type: string - valid_from: - description: Timestamp in RFC3339 format from which token is valid - type: string - format: date-time - valid_to: - description: Timestamp in RFC3339 format until which token is valid - type: string - format: date-time - status: - description: Status of the token - type: string - Billing: - description: "Describes the billing details of an entity.
This has properties like name,organization,address,email,phone,time,tax_number, created_at,updated_at" - type: object - properties: - name: - description: Name of the billable entity - type: string - organization: - description: Details of the organization being billed. - allOf: - - $ref: "#/components/schemas/Organization" - address: - description: The address of the billable entity - allOf: - - $ref: "#/components/schemas/Address" - state: - description: The state where the billable entity resides. This is important for state-level tax calculation - allOf: - - $ref: "#/components/schemas/State" - city: - description: The city where the billable entity resides. - allOf: - - $ref: "#/components/schemas/City" - email: - description: Email address where the bill is sent to - type: string - format: email - phone: - description: Phone number of the billable entity - type: string - time: - description: Details regarding the billing period - allOf: - - $ref: "#/components/schemas/Time" - tax_id: - description: ID of the billable entity as recognized by the taxation authority - type: string - Cancellation: - description: Describes a cancellation event - type: object - properties: - time: - description: Date-time when the order was cancelled by the buyer - type: string - format: date-time - cancelled_by: - type: string - enum: - - CONSUMER - - PROVIDER - reason: - description: The reason for cancellation - allOf: - - $ref: "#/components/schemas/Option" - additional_description: - description: Any additional information regarding the nature of cancellation - allOf: - - $ref: "#/components/schemas/Descriptor" - CancellationTerm: - description: Describes the cancellation terms of an item or an order. This can be referenced at an item or order level. Item-level cancellation terms can override the terms at the order level. - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/FulfillmentState" - reason_required: - description: Indicates whether a reason is required to cancel the order - type: boolean - cancel_by: - description: Information related to the time of cancellation. - allOf: - - $ref: "#/components/schemas/Time" - cancellation_fee: - $ref: "#/components/schemas/Fee" - xinput: - $ref: "#/components/schemas/XInput" - external_ref: - $ref: "#/components/schemas/MediaFile" - Catalog: - description: "Describes the products or services offered by a BPP. This is typically sent as the response to a search intent from a BAP. The payment terms, offers and terms of fulfillment supported by the BPP can also be included here. The BPP can show hierarchical nature of products/services in its catalog using the parent_category_id in categories. The BPP can also send a ttl (time to live) in the context which is the duration for which a BAP can cache the catalog and use the cached catalog.
This has properties like bbp/descriptor,bbp/categories,bbp/fulfillments,bbp/payments,bbp/offers,bbp/providers and exp
This is used in the following situations.
  • This is typically used in the discovery stage when the BPP sends the details of the products and services it offers as response to a search intent from the BAP.
" - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - fulfillments: - description: Fulfillment modes offered at the BPP level. This is used when a BPP itself offers fulfillments on behalf of the providers it has onboarded. - type: array - items: - $ref: "#/components/schemas/Fulfillment" - payments: - description: Payment terms offered by the BPP for all transactions. This can be overriden at the provider level. - type: array - items: - $ref: "#/components/schemas/Payment" - offers: - description: Offers at the BPP-level. This is common across all providers onboarded by the BPP. - type: array - items: - $ref: "#/components/schemas/Offer" - providers: - type: array - items: - $ref: "#/components/schemas/Provider" - exp: - description: Timestamp after which catalog will expire - type: string - format: date-time - ttl: - description: Duration in seconds after which this catalog will expire - type: string - Category: - description: A label under which a collection of items can be grouped. - type: object - properties: - id: - description: ID of the category - type: string - parent_category_id: - $ref: "#/components/schemas/Category/properties/id" - descriptor: - $ref: "#/components/schemas/Descriptor" - time: - $ref: "#/components/schemas/Time" - ttl: - description: Time to live for an instance of this schema - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Circle: - description: Describes a circular region of a specified radius centered at a specified GPS coordinate. - type: object - properties: - gps: - $ref: "#/components/schemas/Gps" - radius: - $ref: "#/components/schemas/Scalar" - City: - description: Describes a city - type: object - properties: - name: - description: Name of the city - type: string - code: - description: City code - type: string - Contact: - description: Describes the contact information of an entity - type: object - properties: - phone: - type: string - email: - type: string - jcard: - type: object - description: A Jcard object as per draft-ietf-jcardcal-jcard-03 specification - Context: - description: "Every API call in beckn protocol has a context. It provides a high-level overview to the receiver about the nature of the intended transaction. Typically, it is the BAP that sets the transaction context based on the consumer's location and action on their UI. But sometimes, during unsolicited callbacks, the BPP also sets the transaction context but it is usually the same as the context of a previous full-cycle, request-callback interaction between the BAP and the BPP. The context object contains four types of fields.
  1. Demographic information about the transaction using fields like `domain`, `country`, and `region`.
  2. Addressing details like the sending and receiving platform's ID and API URL.
  3. Interoperability information like the protocol version that implemented by the sender and,
  4. Transaction details like the method being called at the receiver's endpoint, the transaction_id that represents an end-to-end user session at the BAP, a message ID to pair requests with callbacks, a timestamp to capture sending times, a ttl to specifiy the validity of the request, and a key to encrypt information if necessary.
This object must be passed in every interaction between a BAP and a BPP. In HTTP/S implementations, it is not necessary to send the context during the synchronous response. However, in asynchronous protocols, the context must be sent during all interactions," - type: object - properties: - domain: - description: Domain code that is relevant to this transaction context - allOf: - - $ref: "#/components/schemas/Domain/properties/code" - location: - description: The location where the transaction is intended to be fulfilled. - allOf: - - $ref: "#/components/schemas/Location" - action: - description: The Beckn protocol method being called by the sender and executed at the receiver. - type: string - version: - type: string - description: Version of transaction protocol being used by the sender. - bap_id: - description: Subscriber ID of the BAP - allOf: - - description: "A globally unique identifier of the platform, Typically it is the fully qualified domain name (FQDN) of the platform." - type: string - bap_uri: - description: Subscriber URL of the BAP for accepting callbacks from BPPs. - allOf: - - description: The callback URL of the Subscriber. This should necessarily contain the same domain name as set in `subscriber_id``. - type: string - format: uri - bpp_id: - description: Subscriber ID of the BPP - allOf: - - $ref: "#/components/schemas/Context/properties/bap_id/allOf/0" - bpp_uri: - description: Subscriber URL of the BPP for accepting calls from BAPs. - allOf: - - $ref: "#/components/schemas/Context/properties/bap_uri/allOf/0" - transaction_id: - description: "This is a unique value which persists across all API calls from `search` through `confirm`. This is done to indicate an active user session across multiple requests. The BPPs can use this value to push personalized recommendations, and dynamic offerings related to an ongoing transaction despite being unaware of the user active on the BAP." - type: string - format: uuid - message_id: - description: "This is a unique value which persists during a request / callback cycle. Since beckn protocol APIs are asynchronous, BAPs need a common value to match an incoming callback from a BPP to an earlier call. This value can also be used to ignore duplicate messages coming from the BPP. It is recommended to generate a fresh message_id for every new interaction. When sending unsolicited callbacks, BPPs must generate a new message_id." - type: string - format: uuid - timestamp: - description: Time of request generation in RFC3339 format - type: string - format: date-time - key: - description: The encryption public key of the sender - type: string - ttl: - description: The duration in ISO8601 format after timestamp for which this message holds valid - type: string - Country: - description: Describes a country - type: object - properties: - name: - type: string - description: Name of the country - code: - type: string - description: Country code as per ISO 3166-1 and ISO 3166-2 format - Credential: - description: Describes a credential of an entity - Person or Organization - type: object - properties: - id: - type: string - type: - type: string - default: VerifiableCredential - url: - description: URL of the credential - type: string - format: uri - Customer: - description: Describes a customer buying/availing a product or a service - type: object - properties: - person: - $ref: "#/components/schemas/Person" - contact: - $ref: "#/components/schemas/Contact" - DecimalValue: - description: Describes a numerical value in decimal form - type: string - pattern: "[+-]?([0-9]*[.])?[0-9]+" - Descriptor: - description: Physical description of something. - type: object - properties: - name: - type: string - code: - type: string - short_desc: - type: string - long_desc: - type: string - additional_desc: - type: object - properties: - url: - type: string - content_type: - type: string - enum: - - text/plain - - text/html - - application/json - media: - type: array - items: - $ref: "#/components/schemas/MediaFile" - images: - type: array - items: - $ref: "#/components/schemas/Image" - Domain: - description: "Described the industry sector or sub-sector. The network policy should contain codes for all the industry sectors supported by the network. Domains can be created in varying levels of granularity. The granularity of a domain can be decided by the participants of the network. Too broad domains will result in irrelevant search broadcast calls to BPPs that don't have services supporting the domain. Too narrow domains will result in a large number of registry entries for each BPP. It is recommended that network facilitators actively collaborate with various working groups and network participants to carefully choose domain codes keeping in mind relevance, performance, and opportunity cost. It is recommended that networks choose broad domains like mobility, logistics, healthcare etc, and progressively granularize them as and when the number of network participants for each domain grows large." - type: object - properties: - name: - description: Name of the domain - type: string - code: - description: "Standard code representing the domain. The standard is usually published as part of the network policy. Furthermore, the network facilitator should also provide a mechanism to provide the supported domains of a network." - additional_info: - description: A url that contains addtional information about that domain. - allOf: - - $ref: "#/components/schemas/MediaFile" - Duration: - description: Describes duration as per ISO8601 format - type: string - Error: - description: "Describes an error object that is returned by a BAP, BPP or BG as a response or callback to an action by another network participant. This object is sent when any request received by a network participant is unacceptable. This object can be sent either during Ack or with the callback." - type: object - properties: - code: - type: string - description: 'Standard error code. For full list of error codes, refer to docs/protocol-drafts/BECKN-005-ERROR-CODES-DRAFT-01.md of this repo"' - paths: - type: string - description: Path to json schema generating the error. Used only during json schema validation errors - message: - type: string - description: Human readable message describing the error. Used mainly for logging. Not recommended to be shown to the user. - Fee: - description: A fee applied on a particular entity - type: object - properties: - percentage: - description: Percentage of a value - allOf: - - $ref: "#/components/schemas/DecimalValue" - amount: - description: A fixed value - allOf: - - $ref: "#/components/schemas/Price" - Form: - description: Describes a form - type: object - properties: - url: - description: "The URL from where the form can be fetched. The content fetched from the url must be processed as per the mime_type specified in this object. Once fetched, the rendering platform can choosed to render the form as-is as an embeddable element; or process it further to blend with the theme of the application. In case the interface is non-visual, the the render can process the form data and reproduce it as per the standard specified in the form." - type: string - format: uri - data: - description: The form submission data - type: object - additionalProperties: - type: string - mime_type: - description: This field indicates the nature and format of the form received by querying the url. MIME types are defined and standardized in IETF's RFC 6838. - type: string - enum: - - text/html - - application/xml - submission_id: - type: string - format: uuid - Fulfillment: - description: Describes how a an order will be rendered/fulfilled to the end-customer - type: object - properties: - id: - description: Unique reference ID to the fulfillment of an order - type: string - type: - description: "A code that describes the mode of fulfillment. This is typically set when there are multiple ways an order can be fulfilled. For example, a retail order can be fulfilled either via store pickup or a home delivery. Similarly, a medical consultation can be provided either in-person or via tele-consultation. The network policy must publish standard fulfillment type codes for the different modes of fulfillment." - type: string - rateable: - description: Whether the fulfillment can be rated or not - type: boolean - rating: - description: The rating value of the fulfullment service. - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - state: - description: The current state of fulfillment. The BPP must set this value whenever the state of the order fulfillment changes and fire an unsolicited `on_status` call. - allOf: - - $ref: "#/components/schemas/FulfillmentState" - tracking: - type: boolean - description: Indicates whether the fulfillment allows tracking - default: false - customer: - description: The person that will ultimately receive the order - allOf: - - $ref: "#/components/schemas/Customer" - agent: - description: The agent that is currently handling the fulfillment of the order - allOf: - - $ref: "#/components/schemas/Agent" - contact: - $ref: "#/components/schemas/Contact" - vehicle: - $ref: "#/components/schemas/Vehicle" - stops: - description: The list of logical stops encountered during the fulfillment of an order. - type: array - items: - $ref: "#/components/schemas/Stop" - path: - description: The physical path taken by the agent that can be rendered on a map. The allowed format of this property can be set by the network. - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - FulfillmentState: - description: Describes the state of fulfillment - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - updated_at: - type: string - format: date-time - updated_by: - type: string - description: ID of entity which changed the state - Gps: - description: Describes a GPS coordinate - type: string - pattern: '^[-+]?([1-8]?\d(\.\d+)?|90(\.0+)?),\s*[-+]?(180(\.0+)?|((1[0-7]\d)|([1-9]?\d))(\.\d+)?)$' - Image: - description: Describes an image - type: object - properties: - url: - description: URL to the image. This can be a data url or an remote url - type: string - format: uri - size_type: - description: The size of the image. The network policy can define the default dimensions of each type - type: string - enum: - - xs - - sm - - md - - lg - - xl - - custom - width: - description: Width of the image in pixels - type: string - height: - description: Height of the image in pixels - type: string - Intent: - description: "The intent to buy or avail a product or a service. The BAP can declare the intent of the consumer containing
  • What they want (A product, service, offer)
  • Who they want (A seller, service provider, agent etc)
  • Where they want it and where they want it from
  • When they want it (start and end time of fulfillment
  • How they want to pay for it

This has properties like descriptor,provider,fulfillment,payment,category,offer,item,tags
This is typically used by the BAP to send the purpose of the user's search to the BPP. This will be used by the BPP to find products or services it offers that may match the user's intent.
For example, in Mobility, the mobility consumer declares a mobility intent. In this case, the mobility consumer declares information that describes various aspects of their journey like,
  • Where would they like to begin their journey (intent.fulfillment.start.location)
  • Where would they like to end their journey (intent.fulfillment.end.location)
  • When would they like to begin their journey (intent.fulfillment.start.time)
  • When would they like to end their journey (intent.fulfillment.end.time)
  • Who is the transport service provider they would like to avail services from (intent.provider)
  • Who is traveling (This is not recommended in public networks) (intent.fulfillment.customer)
  • What kind of fare product would they like to purchase (intent.item)
  • What add-on services would they like to avail
  • What offers would they like to apply on their booking (intent.offer)
  • What category of services would they like to avail (intent.category)
  • What additional luggage are they carrying
  • How would they like to pay for their journey (intent.payment)

For example, in health domain, a consumer declares the intent for a lab booking the describes various aspects of their booking like,
  • Where would they like to get their scan/test done (intent.fulfillment.start.location)
  • When would they like to get their scan/test done (intent.fulfillment.start.time)
  • When would they like to get the results of their test/scan (intent.fulfillment.end.time)
  • Who is the service provider they would like to avail services from (intent.provider)
  • Who is getting the test/scan (intent.fulfillment.customer)
  • What kind of test/scan would they like to purchase (intent.item)
  • What category of services would they like to avail (intent.category)
  • How would they like to pay for their journey (intent.payment)
" - type: object - properties: - descriptor: - description: "A raw description of the search intent. Free text search strings, raw audio, etc can be sent in this object." - allOf: - - $ref: "#/components/schemas/Descriptor" - provider: - description: The provider from which the customer wants to place to the order from - allOf: - - $ref: "#/components/schemas/Provider" - fulfillment: - description: Details on how the customer wants their order fulfilled - allOf: - - $ref: "#/components/schemas/Fulfillment" - payment: - description: Details on how the customer wants to pay for the order - allOf: - - $ref: "#/components/schemas/Payment" - category: - description: Details on the item category - allOf: - - $ref: "#/components/schemas/Category" - offer: - description: details on the offer the customer wants to avail - allOf: - - $ref: "#/components/schemas/Offer" - item: - description: Details of the item that the consumer wants to order - allOf: - - $ref: "#/components/schemas/Item" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - ItemQuantity: - description: Describes the count or amount of an item - type: object - properties: - allocated: - description: This represents the exact quantity allocated for purchase of the item. - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - available: - description: This represents the exact quantity available for purchase of the item. The buyer can only purchase multiples of this - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - maximum: - description: This represents the maximum quantity allowed for purchase of the item - type: object - properties: - count: - type: integer - minimum: 1 - measure: - $ref: "#/components/schemas/Scalar" - minimum: - description: This represents the minimum quantity allowed for purchase of the item - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - selected: - description: This represents the quantity selected for purchase of the item - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - unitized: - description: This represents the quantity available in a single unit of the item - type: object - properties: - count: - type: integer - minimum: 1 - maximum: 1 - measure: - $ref: "#/components/schemas/Scalar" - Item: - description: "Describes a product or a service offered to the end consumer by the provider. In the mobility sector, it can represent a fare product like one way journey. In the logistics sector, it can represent the delivery service offering. In the retail domain it can represent a product like a grocery item." - type: object - properties: - id: - description: ID of the item. - type: string - parent_item_id: - description: "ID of the item, this item is a variant of" - allOf: - - $ref: "#/components/schemas/Item/properties/id" - parent_item_quantity: - description: The number of units of the parent item this item is a multiple of - allOf: - - $ref: "#/components/schemas/ItemQuantity" - descriptor: - description: Physical description of the item - allOf: - - $ref: "#/components/schemas/Descriptor" - creator: - description: The creator of this item - allOf: - - $ref: "#/components/schemas/Organization" - price: - description: "The price of this item, if it has intrinsic value" - allOf: - - $ref: "#/components/schemas/Price" - quantity: - description: The selling quantity of the item - allOf: - - $ref: "#/components/schemas/ItemQuantity" - category_ids: - description: Categories this item can be listed under - type: array - items: - allOf: - - $ref: "#/components/schemas/Category/properties/id" - fulfillment_ids: - description: Modes through which this item can be fulfilled - type: array - items: - allOf: - - $ref: "#/components/schemas/Fulfillment/properties/id" - location_ids: - description: Provider Locations this item is available in - type: array - items: - allOf: - - $ref: "#/components/schemas/Location/properties/id" - payment_ids: - description: Payment modalities through which this item can be ordered - type: array - items: - allOf: - - $ref: "#/components/schemas/Payment/properties/id" - add_ons: - type: array - items: - $ref: "#/components/schemas/AddOn" - cancellation_terms: - description: Cancellation terms of this item - type: array - items: - $ref: "#/components/schemas/CancellationTerm" - refund_terms: - description: Refund terms of this item - type: array - items: - description: Refund term of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/State" - refund_eligible: - description: Indicates if cancellation will result in a refund - type: boolean - refund_within: - description: Time within which refund will be processed after successful cancellation. - allOf: - - $ref: "#/components/schemas/Time" - refund_amount: - $ref: "#/components/schemas/Price" - replacement_terms: - description: Terms that are applicable be met when this item is replaced - type: array - items: - $ref: "#/components/schemas/ReplacementTerm" - return_terms: - description: Terms that are applicable when this item is returned - type: array - items: - $ref: "#/components/schemas/ReturnTerm" - xinput: - description: Additional input required from the customer to purchase / avail this item - allOf: - - $ref: "#/components/schemas/XInput" - time: - description: Temporal attributes of this item. This property is used when the item exists on the catalog only for a limited period of time. - allOf: - - $ref: "#/components/schemas/Time" - rateable: - description: Whether this item can be rated - type: boolean - rating: - description: The rating of the item - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - matched: - description: Whether this item is an exact match of the request - type: boolean - related: - description: Whether this item is a related item to the exactly matched item - type: boolean - recommended: - description: Whether this item is a recommended item to a response - type: boolean - ttl: - description: Time to live in seconds for an instance of this schema - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Location: - description: The physical location of something - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - map_url: - description: The url to the map of the location. This can be a globally recognized map url or the one specified by the network policy. - type: string - format: uri - gps: - description: The GPS co-ordinates of this location. - allOf: - - $ref: "#/components/schemas/Gps" - address: - description: The address of this location. - allOf: - - $ref: "#/components/schemas/Address" - city: - description: "The city this location is, or is located within" - allOf: - - $ref: "#/components/schemas/City" - district: - description: "The state this location is, or is located within" - type: string - state: - description: "The state this location is, or is located within" - allOf: - - $ref: "#/components/schemas/State" - country: - description: "The country this location is, or is located within" - allOf: - - $ref: "#/components/schemas/Country" - area_code: - type: string - circle: - $ref: "#/components/schemas/Circle" - polygon: - description: The boundary polygon of this location - type: string - 3dspace: - description: The three dimensional region describing this location - type: string - rating: - description: The rating of this location - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - MediaFile: - description: This object contains a url to a media file. - type: object - properties: - mimetype: - description: "indicates the nature and format of the document, file, or assortment of bytes. MIME types are defined and standardized in IETF's RFC 6838" - type: string - url: - description: The URL of the file - type: string - format: uri - signature: - description: The digital signature of the file signed by the sender - type: string - dsa: - description: The signing algorithm used by the sender - type: string - Offer: - description: An offer associated with a catalog. This is typically used to promote a particular product and enable more purchases. - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - location_ids: - type: array - items: - $ref: "#/components/schemas/Location/properties/id" - category_ids: - type: array - items: - $ref: "#/components/schemas/Category/properties/id" - item_ids: - type: array - items: - $ref: "#/components/schemas/Item/properties/id" - time: - $ref: "#/components/schemas/Time" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Option: - description: Describes a selectable option - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - Order: - description: Describes a legal purchase order. It contains the complete details of the legal contract created between the buyer and the seller. - type: object - properties: - id: - type: string - description: Human-readable ID of the order. This is generated at the BPP layer. The BPP can either generate order id within its system or forward the order ID created at the provider level. - ref_order_ids: - description: A list of order IDs to link this order to previous orders. - type: array - items: - type: string - description: ID of a previous order - status: - description: Status of the order. Allowed values can be defined by the network policy - type: string - enum: - - ACTIVE - - COMPLETE - - CANCELLED - type: - description: "This is used to indicate the type of order being created to BPPs. Sometimes orders can be linked to previous orders, like a replacement order in a retail domain. A follow-up consultation in healthcare domain. A single order part of a subscription order. The list of order types can be standardized at the network level." - type: string - default: DEFAULT - enum: - - DRAFT - - DEFAULT - provider: - description: Details of the provider whose catalog items have been selected. - allOf: - - $ref: "#/components/schemas/Provider" - items: - description: The items purchased / availed in this order - type: array - items: - $ref: "#/components/schemas/Item" - add_ons: - description: The add-ons purchased / availed in this order - type: array - items: - $ref: "#/components/schemas/AddOn" - offers: - description: The offers applied in this order - type: array - items: - $ref: "#/components/schemas/Offer" - billing: - description: The billing details of this order - allOf: - - $ref: "#/components/schemas/Billing" - fulfillments: - description: The fulfillments involved in completing this order - type: array - items: - $ref: "#/components/schemas/Fulfillment" - cancellation: - description: The cancellation details of this order - allOf: - - $ref: "#/components/schemas/Cancellation" - cancellation_terms: - description: Cancellation terms of this item - type: array - items: - $ref: "#/components/schemas/CancellationTerm" - refund_terms: - description: Refund terms of this item - type: array - items: - $ref: "#/components/schemas/Item/properties/refund_terms/items" - replacement_terms: - description: Replacement terms of this item - type: array - items: - $ref: "#/components/schemas/ReplacementTerm" - return_terms: - description: Return terms of this item - type: array - items: - $ref: "#/components/schemas/ReturnTerm" - quote: - description: The mutually agreed upon quotation for this order. - allOf: - - $ref: "#/components/schemas/Quotation" - payments: - description: The terms of settlement for this order - type: array - items: - $ref: "#/components/schemas/Payment" - created_at: - description: The date-time of creation of this order - type: string - format: date-time - updated_at: - description: The date-time of updated of this order - type: string - format: date-time - xinput: - description: Additional input required from the customer to confirm this order - allOf: - - $ref: "#/components/schemas/XInput" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Organization: - description: An organization. Usually a recognized business entity. - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - address: - description: The postal address of the organization - allOf: - - $ref: "#/components/schemas/Address" - state: - description: The state where the organization's address is registered - allOf: - - $ref: "#/components/schemas/State" - city: - description: The city where the the organization's address is registered - allOf: - - $ref: "#/components/schemas/City" - contact: - $ref: "#/components/schemas/Contact" - Payment: - description: "Describes the terms of settlement between the BAP and the BPP for a single transaction. When instantiated, this object contains
  1. the amount that has to be settled,
  2. The payment destination destination details
  3. When the settlement should happen, and
  4. A transaction reference ID
. During a transaction, the BPP reserves the right to decide the terms of payment. However, the BAP can send its terms to the BPP first. If the BPP does not agree to those terms, it must overwrite the terms and return them to the BAP. If overridden, the BAP must either agree to the terms sent by the BPP in order to preserve the provider's autonomy, or abort the transaction. In case of such disagreements, the BAP and the BPP can perform offline negotiations on the payment terms. Once an agreement is reached, the BAP and BPP can resume transactions." - type: object - properties: - id: - description: ID of the payment term that can be referred at an item or an order level in a catalog - type: string - collected_by: - description: "This field indicates who is the collector of payment. The BAP can set this value to 'bap' if it wants to collect the payment first and settle it to the BPP. If the BPP agrees to those terms, the BPP should not send the payment url. Alternatively, the BPP can set this field with the value 'bpp' if it wants the payment to be made directly." - url: - type: string - description: "A payment url to be called by the BAP. If empty, then the payment is to be done offline. The details of payment should be present in the params object. If tl_method = http/get, then the payment details will be sent as url params. Two url param values, ```$transaction_id``` and ```$amount``` are mandatory." - format: uri - params: - type: object - properties: - transaction_id: - type: string - description: The reference transaction ID associated with a payment activity - amount: - type: string - currency: - type: string - bank_code: - type: string - bank_account_number: - type: string - virtual_payment_address: - type: string - source_bank_code: - type: string - source_bank_account_number: - type: string - source_virtual_payment_address: - type: string - type: - type: string - enum: - - PRE-ORDER - - PRE-FULFILLMENT - - ON-FULFILLMENT - - POST-FULFILLMENT - status: - type: string - enum: - - PAID - - NOT-PAID - time: - $ref: "#/components/schemas/Time" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Person: - description: Describes a person as any individual - type: object - properties: - id: - type: string - description: Describes the identity of the person - url: - description: Profile url of the person - type: string - format: uri - name: - description: the name of the person - type: string - image: - $ref: "#/components/schemas/Image" - age: - description: Age of the person - allOf: - - $ref: "#/components/schemas/Duration" - dob: - description: Date of birth of the person - type: string - format: date - gender: - type: string - description: "Gender of something, typically a Person, but possibly also fictional characters, animals, etc. While Male and Female may be used, text strings are also acceptable for people who do not identify as a binary gender.Allowed values for this field can be published in the network policy" - creds: - type: array - items: - $ref: "#/components/schemas/Credential" - languages: - type: array - items: - description: Describes a language known to the person. - type: object - properties: - code: - type: string - name: - type: string - skills: - type: array - items: - description: Describes a skill of the person. - type: object - properties: - code: - type: string - name: - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Price: - description: Describes the price of a product or service - type: object - properties: - currency: - type: string - value: - $ref: "#/components/schemas/DecimalValue" - estimated_value: - $ref: "#/components/schemas/DecimalValue" - computed_value: - $ref: "#/components/schemas/DecimalValue" - listed_value: - $ref: "#/components/schemas/DecimalValue" - offered_value: - $ref: "#/components/schemas/DecimalValue" - minimum_value: - $ref: "#/components/schemas/DecimalValue" - maximum_value: - $ref: "#/components/schemas/DecimalValue" - Provider: - description: Describes the catalog of a business. - type: object - properties: - id: - type: string - description: Id of the provider - descriptor: - $ref: "#/components/schemas/Descriptor" - category_id: - type: string - description: Category Id of the provider at the BPP-level catalog - rating: - $ref: "#/components/schemas/Rating/properties/value" - time: - $ref: "#/components/schemas/Time" - categories: - type: array - items: - $ref: "#/components/schemas/Category" - fulfillments: - type: array - items: - $ref: "#/components/schemas/Fulfillment" - payments: - type: array - items: - $ref: "#/components/schemas/Payment" - locations: - type: array - items: - $ref: "#/components/schemas/Location" - offers: - type: array - items: - $ref: "#/components/schemas/Offer" - items: - type: array - items: - $ref: "#/components/schemas/Item" - exp: - type: string - description: Time after which catalog has to be refreshed - format: date-time - rateable: - description: Whether this provider can be rated or not - type: boolean - ttl: - description: "The time-to-live in seconds, for this object. This can be overriden at deeper levels. A value of -1 indicates that this object is not cacheable." - type: integer - minimum: -1 - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Quotation: - description: "Describes a quote. It is the estimated price of products or services from the BPP.
This has properties like price, breakup, ttl" - type: object - properties: - id: - description: ID of the quote. - type: string - format: uuid - price: - description: The total quoted price - allOf: - - $ref: "#/components/schemas/Price" - breakup: - description: the breakup of the total quoted price - type: array - items: - type: object - properties: - item: - $ref: "#/components/schemas/Item" - title: - type: string - price: - $ref: "#/components/schemas/Price" - ttl: - $ref: "#/components/schemas/Duration" - Rating: - description: Describes the rating of an entity - type: object - properties: - rating_category: - description: Category of the entity being rated - type: string - enum: - - Item - - Order - - Fulfillment - - Provider - - Agent - - Support - id: - description: Id of the object being rated - type: string - value: - description: "Rating value given to the object. This can be a single value or can also contain an inequality operator like gt, gte, lt, lte. This can also contain an inequality expression containing logical operators like && and ||." - type: string - Region: - description: Describes an arbitrary region of space. The network policy should contain a published list of supported regions by the network. - type: object - properties: - dimensions: - description: "The number of dimensions that are used to describe any point inside that region. The most common dimensionality of a region is 2, that represents an area on a map. There are regions on the map that can be approximated to one-dimensional regions like roads, railway lines, or shipping lines. 3 dimensional regions are rarer, but are gaining popularity as flying drones are being adopted for various fulfillment services." - type: string - enum: - - "1" - - "2" - - "3" - type: - description: "The type of region. This is used to specify the granularity of the region represented by this object. Various examples of two-dimensional region types are city, country, state, district, and so on. The network policy should contain a list of all possible region types supported by the network." - type: string - name: - type: string - description: Name of the region as specified on the map where that region exists. - code: - type: string - description: A standard code representing the region. This should be interpreted in the same way by all network participants. - boundary: - type: string - description: "A string representing the boundary of the region. One-dimensional regions are represented by polylines. Two-dimensional regions are represented by polygons, and three-dimensional regions can represented by polyhedra." - map_url: - type: string - description: The url to the map of the region. This can be a globally recognized map or the one specified by the network policy. - ReplacementTerm: - description: The replacement policy of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/State" - replace_within: - description: "Applicable only for buyer managed returns where the buyer has to replace the item before a certain date-time, failing which they will not be eligible for replacement" - allOf: - - $ref: "#/components/schemas/Time" - external_ref: - $ref: "#/components/schemas/MediaFile" - ReturnTerm: - description: Describes the return policy of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term IETF''s applicable. - allOf: - - $ref: "#/components/schemas/State" - return_eligible: - description: Indicates whether the item is eligible for return - type: boolean - return_time: - description: "Applicable only for buyer managed returns where the buyer has to return the item to the origin before a certain date-time, failing which they will not be eligible for refund." - allOf: - - $ref: "#/components/schemas/Time" - return_location: - description: The location where the item or order must / will be returned to - allOf: - - $ref: "#/components/schemas/Location" - fulfillment_managed_by: - description: The entity that will perform the return - type: string - enum: - - CONSUMER - - PROVIDER - Scalar: - description: Describes a scalar - type: object - properties: - type: - type: string - enum: - - CONSTANT - - VARIABLE - value: - $ref: "#/components/schemas/DecimalValue" - estimated_value: - $ref: "#/components/schemas/DecimalValue" - computed_value: - $ref: "#/components/schemas/DecimalValue" - range: - type: object - properties: - min: - $ref: "#/components/schemas/DecimalValue" - max: - $ref: "#/components/schemas/DecimalValue" - unit: - type: string - Schedule: - description: "Describes schedule as a repeating time period used to describe a regularly recurring event. At a minimum a schedule will specify frequency which describes the interval between occurrences of the event. Additional information can be provided to specify the schedule more precisely. This includes identifying the timestamps(s) of when the event will take place. Schedules may also have holidays to exclude a specific day from the schedule.
This has properties like frequency, holidays, times" - type: object - properties: - frequency: - $ref: "#/components/schemas/Duration" - holidays: - type: array - items: - type: string - format: date-time - times: - type: array - items: - type: string - format: date-time - State: - description: A bounded geopolitical region of governance inside a country. - type: object - properties: - name: - type: string - description: Name of the state - code: - type: string - description: State code as per country or international standards - Stop: - description: A logical point in space and time during the fulfillment of an order. - type: object - properties: - id: - type: string - parent_stop_id: - type: string - location: - description: Location of the stop - allOf: - - $ref: "#/components/schemas/Location" - type: - description: The type of stop. Allowed values of this property can be defined by the network policy. - type: string - time: - description: Timings applicable at the stop. - allOf: - - $ref: "#/components/schemas/Time" - instructions: - description: Instructions that need to be followed at the stop - allOf: - - $ref: "#/components/schemas/Descriptor" - contact: - description: Contact details of the stop - allOf: - - $ref: "#/components/schemas/Contact" - person: - description: The details of the person present at the stop - allOf: - - $ref: "#/components/schemas/Person" - authorization: - $ref: "#/components/schemas/Authorization" - Support: - description: Details of customer support - type: object - properties: - ref_id: - type: string - callback_phone: - type: string - format: phone - phone: - type: string - format: phone - email: - type: string - format: email - url: - type: string - format: uri - Tag: - description: "Describes a tag. This is used to contain extended metadata. This object can be added as a property to any schema to describe extended attributes. For BAPs, tags can be sent during search to optimize and filter search results. BPPs can use tags to index their catalog to allow better search functionality. Tags are sent by the BPP as part of the catalog response in the `on_search` callback. Tags are also meant for display purposes. Upon receiving a tag, BAPs are meant to render them as name-value pairs. This is particularly useful when rendering tabular information about a product or service." - type: object - properties: - descriptor: - description: "Description of the Tag, can be used to store detailed information." - allOf: - - $ref: "#/components/schemas/Descriptor" - value: - description: The value of the tag. This set by the BPP and rendered as-is by the BAP. - type: string - display: - description: "This value indicates if the tag is intended for display purposes. If set to `true`, then this tag must be displayed. If it is set to `false`, it should not be displayed. This value can override the group display value." - type: boolean - TagGroup: - description: "A collection of tag objects with group level attributes. For detailed documentation on the Tags and Tag Groups schema go to https://github.com/beckn/protocol-specifications/discussions/316" - type: object - properties: - display: - description: "Indicates the display properties of the tag group. If display is set to false, then the group will not be displayed. If it is set to true, it should be displayed. However, group-level display properties can be overriden by individual tag-level display property. As this schema is purely for catalog display purposes, it is not recommended to send this value during search." - type: boolean - default: true - descriptor: - description: "Description of the TagGroup, can be used to store detailed information." - allOf: - - $ref: "#/components/schemas/Descriptor" - list: - description: "An array of Tag objects listed under this group. This property can be set by BAPs during search to narrow the `search` and achieve more relevant results. When received during `on_search`, BAPs must render this list under the heading described by the `name` property of this schema." - type: array - items: - $ref: "#/components/schemas/Tag" - Time: - description: "Describes time in its various forms. It can be a single point in time; duration; or a structured timetable of operations
This has properties like label, time stamp,duration,range, days, schedule" - type: object - properties: - label: - type: string - timestamp: - type: string - format: date-time - duration: - $ref: "#/components/schemas/Duration" - range: - type: object - properties: - start: - type: string - format: date-time - end: - type: string - format: date-time - days: - type: string - description: comma separated values representing days of the week - schedule: - $ref: "#/components/schemas/Schedule" - Tracking: - description: Contains tracking information that can be used by the BAP to track the fulfillment of an order in real-time. which is useful for knowing the location of time sensitive deliveries. - type: object - properties: - id: - description: A unique tracking reference number - type: string - url: - description: "A URL to the tracking endpoint. This can be a link to a tracking webpage, a webhook URL created by the BAP where BPP can push the tracking data, or a GET url creaed by the BPP which the BAP can poll to get the tracking data. It can also be a websocket URL where the BPP can push real-time tracking data." - type: string - format: uri - location: - description: "In case there is no real-time tracking endpoint available, this field will contain the latest location of the entity being tracked. The BPP will update this value everytime the BAP calls the track API." - allOf: - - $ref: "#/components/schemas/Location" - status: - description: "This value indicates if the tracking is currently active or not. If this value is `active`, then the BAP can begin tracking the order. If this value is `inactive`, the tracking URL is considered to be expired and the BAP should stop tracking the order." - type: string - enum: - - active - - inactive - Vehicle: - description: "Describes a vehicle is a device that is designed or used to transport people or cargo over land, water, air, or through space.
This has properties like category, capacity, make, model, size,variant,color,energy_type,registration" - type: object - properties: - category: - type: string - capacity: - type: integer - make: - type: string - model: - type: string - size: - type: string - variant: - type: string - color: - type: string - energy_type: - type: string - registration: - type: string - wheels_count: - type: string - cargo_volumne: - type: string - wheelchair_access: - type: string - code: - type: string - emission_standard: - type: string - XInput: - description: "Contains any additional or extended inputs required to confirm an order. This is typically a Form Input. Sometimes, selection of catalog elements is not enough for the BPP to confirm an order. For example, to confirm a flight ticket, the airline requires details of the passengers along with information on baggage, identity, in addition to the class of ticket. Similarly, a logistics company may require details on the nature of shipment in order to confirm the shipping. A recruiting firm may require additional details on the applicant in order to confirm a job application. For all such purposes, the BPP can choose to send this object attached to any object in the catalog that is required to be sent while placing the order. This object can typically be sent at an item level or at the order level. The item level XInput will override the Order level XInput as it indicates a special requirement of information for that particular item. Hence the BAP must render a separate form for the Item and another form at the Order level before confirmation." - type: object - properties: - form: - $ref: "#/components/schemas/Form" - required: - description: Indicates whether the form data is mandatorily required by the BPP to confirm the order. - type: boolean diff --git a/onix-gui/GUI/README.md b/onix-gui/GUI/README.md deleted file mode 100644 index 14ab8e1..0000000 --- a/onix-gui/GUI/README.md +++ /dev/null @@ -1,56 +0,0 @@ -# beckn-onix-gui - -The GUI for the beckn-onix cli tool. - -## Pre-requisites - -1. 4 server/instances -2. 4 sub-domains mapped to each instance -3. Local Tunnel - `npm i -g localtunnel` - -## User Guide - -### Step 1: Run the `start.sh` script - -``` -cd .. && ./start.sh -``` - -### Step 2: Accessing the GUI. - -You will be getting a URL and password as on output of the script. Open the url in the browser and then -paste the password. - -### Step 3: Install and setup your network - -Note: Port 3000 is being used by onix, so we're using port 3005 instead. - -### Step 4: Configure a reverse proxy using NGINX - -Map port 3005 to a domain or use your machine IP:3005 to access the GUI from your browser. - -### Step 5: Secure with certbot - -Use certbot to obtain an SSL certificate and secure your GUI. - -## Contributing - -Contributions are welcome! If you'd like to contribute to the beckn-onix-gui project, please fork the repo and submit a pull request. - -## License - -The beckn-onix-gui project is licensed under the MIT License. See the LICENSE file for more information. - -## Contact - -If you have any questions or issues with the beckn-onix-gui project, please don't hesitate to reach out. - -### Made with ❤️ - -built by the [Mulearn Team](https://mulearn.org/) - -1. [Mishal Abdullah](https://github.com/Mishalabdullah/) -2. [Aswin Asok](https://github.com/AswinAsok) -3. [Viraj Prabhu ](https://github.com/viraka) -4. [Adarsh Mohan](https://www.linkedin.com/in/adarshmohanks/) diff --git a/onix-gui/GUI/app/api/check-layer2/route.js b/onix-gui/GUI/app/api/check-layer2/route.js deleted file mode 100644 index 1fb27cf..0000000 --- a/onix-gui/GUI/app/api/check-layer2/route.js +++ /dev/null @@ -1,66 +0,0 @@ -import { exec } from "child_process"; -import { NextResponse } from "next/server"; - -export async function POST(req) { - const request = await req.json(); - const containerName = request.checked ? "bpp-network" : "bap-network"; - const fileToCheck = request.fileName; - - const executeShellCommand = (command) => { - return new Promise((resolve, reject) => { - exec(command, (error, stdout, stderr) => { - if (error) { - console.error("Error:", error); - reject(error); - return; - } - if (stderr) { - console.error("Error:", stderr); - reject(new Error(stderr)); - return; - } - const output = stdout; - console.log("Output:", output); - resolve(output); - }); - }); - }; - - try { - const containerExists = await executeShellCommand( - `docker ps -a --filter "name=${containerName}" --format "{{.Names}}"` - ); - if (!containerExists.trim()) { - return new NextResponse(`Error: ${containerName} server not present`, { - status: 500, - }); - } - - const result = await executeShellCommand( - `docker exec ${containerName} /bin/sh -c "[ -f '/usr/src/app/schemas/${fileToCheck}' ] && echo 'File found' || echo 'File not found'"` - ); - if (result.trim() === "File found") { - return NextResponse.json( - { message: true }, - { - status: 200, - } - ); - } else { - return NextResponse.json( - { message: false }, - { - status: 200, - } - ); - } - } catch (error) { - console.error(`exec error: ${error}`); - return NextResponse.json( - { message: `Error executing shell command: ${error}` }, - { - status: 500, - } - ); - } -} diff --git a/onix-gui/GUI/app/api/clonning-repo/route.js b/onix-gui/GUI/app/api/clonning-repo/route.js deleted file mode 100644 index e8c0225..0000000 --- a/onix-gui/GUI/app/api/clonning-repo/route.js +++ /dev/null @@ -1,36 +0,0 @@ -import { spawn } from "child_process"; -import { NextResponse } from "next/server"; -import os from "os"; -import path from "path"; -// This function is used to clone the github repository of beckn-onix -export async function GET(req) { - console.log("Cloning GitHub repository..."); - const repoUrl = "https://github.com/beckn/beckn-onix"; - const destination = path.join(os.homedir(), "beckn-onix"); - const gitProcess = spawn("git", ["clone", repoUrl, destination]); - - gitProcess.stdout.on("data", (data) => { - console.log(`stdout: ${data}`); - }); - - gitProcess.stderr.on("data", (data) => { - console.error(`stderr: ${data}`); - }); - - return new Promise((resolve, reject) => { - gitProcess.on("close", (code) => {const destination = "~/beckn-onix"; - if (code === 0) { - console.log("Repository cloned successfully"); - resolve( - NextResponse.json( - { success: true, data: "Repo Cloned Successfully" }, - { status: 200 } - ) - ); - } else { - console.error(`git process exited with code ${code}`); - resolve(NextResponse.json({ success: false }, { status: 500 })); - } - }); - }); -} diff --git a/onix-gui/GUI/app/api/install-bap/route.js b/onix-gui/GUI/app/api/install-bap/route.js deleted file mode 100644 index 3bad4fb..0000000 --- a/onix-gui/GUI/app/api/install-bap/route.js +++ /dev/null @@ -1,118 +0,0 @@ -import { exec } from "child_process"; -import { NextResponse } from "next/server"; -import { promises as fs } from "fs"; -import { join } from "path"; -import os from "os"; - -const pathDir = join(os.homedir(), "beckn-onix"); - -const executeCommand = (command) => { - return new Promise((resolve, reject) => { - exec(command, (error, stdout, stderr) => { - if (error) { - console.error("Error:", error); - reject(error); - return; - } - const output = stdout + stderr; - console.log("Output:", output); - resolve(output); - }); - }); -}; - -async function directoryExists(path) { - try { - await fs.access(path); - return true; - } catch (error) { - return false; - } -} -export async function startSupportServices() { - try { - process.env.COMPOSE_IGNORE_ORPHANS = "1"; - - const result1 = await executeCommand( - `docker-compose -f ${pathDir}/install/docker-compose-app.yml up -d mongo_db` - ); - console.log("Result 1:", result1); - - const result2 = await executeCommand( - `docker-compose -f ${pathDir}/install/docker-compose-app.yml up -d queue_service` - ); - console.log("Result 2:", result2); - - const result3 = await executeCommand( - `docker-compose -f ${pathDir}/install/docker-compose-app.yml up -d redis_db` - ); - console.log("Result 3:", result3); - await executeCommand("docker volume create registry_data_volume"); - await executeCommand("docker volume create registry_database_volume"); - await executeCommand("docker volume create gateway_data_volume"); - await executeCommand("docker volume create gateway_database_volume"); - return NextResponse.json({ result1, result2, result3 }); - } catch (error) { - console.error("An error occurred:", error); - return NextResponse.json({ error: "An error occurred" }, { status: 500 }); - } -} - -export async function POST(req) { - const becknOnixDirExists = await directoryExists(pathDir); - - if (!becknOnixDirExists) { - console.log(`Directory "${pathDir}" does not exist. Cloning repository...`); - try { - const response = await fetch(`${req.nextUrl.origin}/api/clonning-repo`); - if (!response.ok) { - console.error( - `Failed to clone repository: ${response.status} ${response.statusText}` - ); - return NextResponse.json( - { - error: `Failed to clone repository: ${response.status} ${response.statusText}`, - }, - { status: 500 } - ); - } - console.log("Repository cloned successfully."); - } catch (error) { - console.error("An error occurred while cloning the repository:", error); - return NextResponse.json( - { error: "An error occurred while cloning the repository" }, - { status: 500 } - ); - } - } - - try { - await startSupportServices(); - const data = await req.json(); - - const registryUrl = data.registryUrl; - const bapSubscriberId = data.subscriberId; - const bapSubscriberUrl = data.subscriberUrl; - const networkconfigurl = data.networkconfigurl; - // generating unqiuekey for bap subscriberId - const uniqueKeyId = bapSubscriberId + "-key"; - - let updateBapConfigCommand = `bash ${pathDir}/install/scripts/update_bap_config.sh ${registryUrl} ${bapSubscriberId} ${uniqueKeyId} ${bapSubscriberUrl} ${networkconfigurl}`; - const result1 = await executeCommand(updateBapConfigCommand); - console.log("Result 1:", result1); - const result3 = await executeCommand( - `docker-compose -f ${pathDir}/install/docker-compose-v2.yml up -d "bap-client"` - ); - console.log("Result 3:", result3); - - const result4 = await executeCommand( - `docker-compose -f ${pathDir}/install/docker-compose-v2.yml up -d "bap-network"` - ); - console.log("Result 4:", result4); - - return NextResponse.json({ result1, result3, result4 }); - } catch (error) { - console.error("An error occurred:", error); - return NextResponse.json({ error: "An error occurred" }, { status: 500 }); - } -} diff --git a/onix-gui/GUI/app/api/install-bpp/route.js b/onix-gui/GUI/app/api/install-bpp/route.js deleted file mode 100644 index 533aa62..0000000 --- a/onix-gui/GUI/app/api/install-bpp/route.js +++ /dev/null @@ -1,124 +0,0 @@ -import { exec } from "child_process"; -import { NextResponse } from "next/server"; -import { promises as fs } from "fs"; -import { join } from "path"; -import os from "os"; - -const pathDir = join(os.homedir(), "beckn-onix"); -async function directoryExists(path) { - try { - await fs.access(path); - return true; - } catch (error) { - return false; - } -} - -const executeCommand = (command) => { - return new Promise((resolve, reject) => { - exec(command, (error, stdout, stderr) => { - if (error) { - console.error("Error:", error); - reject(error); - return; - } - const output = stdout + stderr; - console.log("Output:", output); - resolve(output); - }); - }); -}; - -export async function startSupportServices() { - try { - process.env.COMPOSE_IGNORE_ORPHANS = "1"; - - const result1 = await executeCommand( - `docker-compose -f ${pathDir}/install/docker-compose-app.yml up -d mongo_db` - ); - console.log("Result 1:", result1); - - const result2 = await executeCommand( - `docker-compose -f ${pathDir}/install/docker-compose-app.yml up -d queue_service` - ); - console.log("Result 2:", result2); - - const result3 = await executeCommand( - `docker-compose -f ${pathDir}/install/docker-compose-app.yml up -d redis_db` - ); - console.log("Result 3:", result3); - await executeCommand("docker volume create registry_data_volume"); - await executeCommand("docker volume create registry_database_volume"); - await executeCommand("docker volume create gateway_data_volume"); - await executeCommand("docker volume create gateway_database_volume"); - return NextResponse.json({ result1, result2, result3 }); - } catch (error) { - console.error("An error occurred:", error); - return NextResponse.json({ error: "An error occurred" }, { status: 500 }); - } -} - -export async function POST(req, res) { - const becknOnixDirExists = await directoryExists(pathDir); - console.log("Installing Beckn Onix...", becknOnixDirExists); - - if (!becknOnixDirExists) { - console.log(`Directory beckn-onix does not exist. Cloning repository...`); - try { - const response = await fetch(`${req.nextUrl.origin}/api/clonning-repo`); - if (!response.ok) { - console.error( - `Failed to clone repository: ${response.status} ${response.statusText}` - ); - return NextResponse.json( - { - error: `Failed to clone repository: ${response.status} ${response.statusText}`, - }, - { status: 500 } - ); - } - console.log("Repository cloned successfully."); - } catch (error) { - console.error("An error occurred while cloning the repository:", error); - return NextResponse.json( - { error: "An error occurred while cloning the repository" }, - { status: 500 } - ); - } - } - - try { - await startSupportServices(); - const data = await req.json(); - const registryUrl = data.registryUrl; - const bppSubscriberId = data.subscriberId; - const bppSubscriberUrl = data.subscriberUrl; - const webhookUrl = data.webhookUrl; - // generating unqiuekey for bpp subscriberId - const uniqueKeyId = bppSubscriberId + "-key"; - let updateBppConfigCommand = `bash ${pathDir}/install/scripts/update_bpp_config.sh ${registryUrl} ${bppSubscriberId} ${uniqueKeyId} ${bppSubscriberUrl} ${webhookUrl}`; - const result1 = await executeCommand(updateBppConfigCommand); - console.log("Result 1:", result1); - - const result2 = await executeCommand("sleep 10"); - console.log("Result 2:", result2); - - const result3 = await executeCommand( - `docker-compose -f ${pathDir}/install/docker-compose-v2.yml up -d bpp-client` - ); - console.log("Result 3:", result3); - - const result4 = await executeCommand( - `docker-compose -f ${pathDir}/install/docker-compose-v2.yml up -d bpp-network` - ); - console.log("Result 4:", result4); - - const result5 = await executeCommand("sleep 10"); - console.log("Result 5:", result5); - - return NextResponse.json({ result1, result2, result3, result4, result5 }); - } catch (error) { - console.error("An error occurred:", error); - return NextResponse.json({ error: "An error occurred" }, { status: 500 }); - } -} diff --git a/onix-gui/GUI/app/api/install-gateway/route.js b/onix-gui/GUI/app/api/install-gateway/route.js deleted file mode 100644 index 3545f6e..0000000 --- a/onix-gui/GUI/app/api/install-gateway/route.js +++ /dev/null @@ -1,92 +0,0 @@ -import { exec } from "child_process"; -import { NextResponse } from "next/server"; -import { promises as fs } from "fs"; -import { join } from "path"; -import os from "os"; - -async function directoryExists(path) { - try { - await fs.access(path); - return true; - } catch (error) { - return false; - } -} - -export async function POST(req, res) { - const pathDir = join(os.homedir(), "beckn-onix"); - const becknOnixDirExists = await directoryExists(pathDir); - console.log("Installing Beckn Onix...", becknOnixDirExists); - - if (!becknOnixDirExists) { - console.log(`Directory beckn-onix does not exist. Cloning repository...`); - try { - const response = await fetch(`${req.nextUrl.origin}/api/clonning-repo`); - if (!response.ok) { - console.error( - `Failed to clone repository: ${response.status} ${response.statusText}` - ); - return NextResponse.json( - { - error: `Failed to clone repository: ${response.status} ${response.statusText}`, - }, - { status: 500 } - ); - } - console.log("Repository cloned successfully."); - } catch (error) { - console.error("An error occurred while cloning the repository:", error); - return NextResponse.json( - { error: "An error occurred while cloning the repository" }, - { status: 500 } - ); - } - } - - const data = await req.json(); - const executeCommand = (command) => { - return new Promise((resolve, reject) => { - exec(command, (error, stdout, stderr) => { - if (error) { - console.error("Error:", error); - reject(error); - return; - } - const output = stdout + stderr; - console.log("Output:", output); - resolve(output); - }); - }); - }; - - try { - const result1 = await executeCommand( - `bash ${pathDir}/install/scripts/package_manager.sh` - ); - console.log("Result 1:", result1); - await executeCommand("docker volume create registry_data_volume"); - await executeCommand("docker volume create registry_database_volume"); - const result2 = await executeCommand( - ` bash ${pathDir}/install/scripts/update_gateway_details.sh ${data.registryUrl} ${data.gatewayUrl}` - ); - console.log("Result 2:", result2); - - const result3 = await executeCommand( - `docker-compose -f ${pathDir}/install/docker-compose-v2.yml up -d gateway` - ); - console.log("Result 3:", result3); - - const result4 = await executeCommand(`sleep 2`); - console.log("Result 4:", result4); - - const result5 = await executeCommand( - `bash ${pathDir}/install/scripts/register_gateway.sh ${data.gatewayUrl}` - ); - console.log("Result 5:", result5); - - return NextResponse.json({ result1, result2, result3, result4, result5 }); - } catch (error) { - console.error("An error occurred:", error); - return NextResponse.json({ error: "An error occurred" }, { status: 500 }); - } -} diff --git a/onix-gui/GUI/app/api/install-layer2/route.js b/onix-gui/GUI/app/api/install-layer2/route.js deleted file mode 100644 index bf7d47a..0000000 --- a/onix-gui/GUI/app/api/install-layer2/route.js +++ /dev/null @@ -1,50 +0,0 @@ -import { exec } from "child_process"; -import { NextResponse } from "next/server"; - -export async function POST(req) { - const request = await req.json(); - const fileURL = request.yamlUrl; - const containerName = request.container; - - const executeShellCommand = (command) => { - return new Promise((resolve, reject) => { - exec(command, (error, stdout, stderr) => { - if (error) { - console.error("Error:", error); - reject(error); - return; - } - if (stderr) { - console.error("Error:", stderr); - reject(new Error(stderr)); - return; - } - const output = stdout; - console.log("Output:", output); - resolve(output); - }); - }); - }; - - try { - await executeShellCommand( - `docker exec ${ - containerName + "-client" - } wget -P /usr/src/app/schemas/ ${fileURL}` - ); - } catch (error) { - console.error(`exec error: ${error}`); - } - - try { - await executeShellCommand( - `docker exec ${ - containerName + "-network" - } wget -P /usr/src/app/schemas/ ${fileURL}` - ); - return NextResponse.json({ status: 200 }); - } catch (error) { - console.error(`exec error: ${error}`); - return NextResponse.json({ status: 500 }); - } -} \ No newline at end of file diff --git a/onix-gui/GUI/app/api/install-registry/route.js b/onix-gui/GUI/app/api/install-registry/route.js deleted file mode 100644 index 70c4102..0000000 --- a/onix-gui/GUI/app/api/install-registry/route.js +++ /dev/null @@ -1,156 +0,0 @@ -import { exec } from "child_process"; -import { NextResponse } from "next/server"; -import { promises as fs } from "fs"; -import { tmpdir } from "os"; -import { join } from "path"; -import os from "os"; - -async function directoryExists(path) { - try { - await fs.access(path); - return true; - } catch (error) { - return false; - } -} - -export async function POST(req, res) { - const pathDir = join(os.homedir(), "beckn-onix"); - const becknOnixDirExists = await directoryExists(pathDir); - console.log("Installing Beckn Onix...", becknOnixDirExists); - - if (!becknOnixDirExists) { - console.log(`Directory beckn-onix does not exist. Cloning repository...`); - try { - const response = await fetch(`${req.nextUrl.origin}/api/clonning-repo`); - if (!response.ok) { - console.error( - `Failed to clone repository: ${response.status} ${response.statusText}` - ); - return NextResponse.json( - { - error: `Failed to clone repository: ${response.status} ${response.statusText}`, - }, - { status: 500 } - ); - } - console.log("Repository cloned successfully."); - } catch (error) { - console.error("An error occurred while cloning the repository:", error); - return NextResponse.json( - { error: "An error occurred while cloning the repository" }, - { status: 500 } - ); - } - } - - const data = await req.json(); - const executeCommand = (command) => { - return new Promise((resolve, reject) => { - exec(command, (error, stdout, stderr) => { - if (error) { - console.error("Error:", error); - reject(error); - return; - } - const output = stdout + stderr; - console.log("Output:", output); - resolve(output); - }); - }); - }; - const updateRegistryDetails = async (url) => { - let registryUrl = ""; - let registryPort = ""; - let protocol = ""; - - if (url) { - if (url.startsWith("https://")) { - registryUrl = url.replace("https://", ""); - registryPort = "443"; - protocol = "https"; - } else if (url.startsWith("http://")) { - registryUrl = url.replace("http://", ""); - registryPort = "80"; - protocol = "http"; - } - } else { - registryUrl = "registry"; - registryPort = "3030"; - protocol = "http"; - } - - console.log("Registry URL:", registryUrl); - - const configFile = join( - pathDir, - "install", - "registry_data", - "config", - "swf.properties" - ); - const sampleFile = join( - pathDir, - "install", - "registry_data", - "config", - "swf.properties-sample" - ); - - try { - await fs.copyFile(sampleFile, configFile); - const tempDir = join(os.homedir(), "beckn-onix", "tmp"); - await fs.mkdir(tempDir, { recursive: true }); // Create the temporary directory if it doesn't exist - - const tempFile = join(tempDir, "tempfile.XXXXXXXXXX"); - const configData = await fs.readFile(configFile, "utf8"); - const updatedConfigData = configData - .replace(/REGISTRY_URL/g, registryUrl) - .replace(/REGISTRY_PORT/g, registryPort) - .replace(/PROTOCOL/g, protocol); - - await fs.writeFile(tempFile, updatedConfigData); - await fs.rename(tempFile, configFile); - await executeCommand("docker volume create registry_data_volume"); - await executeCommand("docker volume create registry_database_volume"); - await executeCommand("docker volume create gateway_data_volume"); - await executeCommand("docker volume create gateway_database_volume"); - await executeCommand( - `docker run --rm -v ${join( - pathDir, - "install", - "registry_data", - "config" - )}:/source -v registry_data_volume:/target busybox sh -c "cp /source/envvars /target/ && cp /source/logger.properties /target/ && cp /source/swf.properties /target/"` - ); - - // Start the registry container - await executeCommand( - `docker-compose -f ${join( - pathDir, - "install", - "docker-compose-v2.yml" - )} up -d registry` - ); - - // Wait for 10 seconds - await new Promise((resolve) => setTimeout(resolve, 10000)); - - console.log("Registry installation successful"); - } catch (error) { - console.error("Error updating registry details:", error); - throw error; - } - }; - - try { - const url = data.registryUrl; - await updateRegistryDetails(url); - return NextResponse.json({ - message: "Registry details updated successfully", - }); - } catch (error) { - console.error("An error occurred:", error); - return NextResponse.json({ error: "An error occurred" }, { status: 500 }); - } -} diff --git a/onix-gui/GUI/app/favicon.ico b/onix-gui/GUI/app/favicon.ico deleted file mode 100644 index 718d6fe..0000000 Binary files a/onix-gui/GUI/app/favicon.ico and /dev/null differ diff --git a/onix-gui/GUI/app/globals.css b/onix-gui/GUI/app/globals.css deleted file mode 100644 index d0e8c4c..0000000 --- a/onix-gui/GUI/app/globals.css +++ /dev/null @@ -1,19 +0,0 @@ -* { - padding: 0; - margin: 0; -} - -body{ - min-width: 100vw; - min-height: 100vh; - background-color: #000000; - color: white; - font-family: "Ubuntu Mono", monospace; - - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - - -} diff --git a/onix-gui/GUI/app/install/configure/page.js b/onix-gui/GUI/app/install/configure/page.js deleted file mode 100644 index 4da2300..0000000 --- a/onix-gui/GUI/app/install/configure/page.js +++ /dev/null @@ -1,58 +0,0 @@ -"use client"; - -import Link from "next/link"; -import styles from "../../page.module.css"; -import { Ubuntu_Mono } from "next/font/google"; -import Image from "next/image"; -const ubuntuMono = Ubuntu_Mono({ - weight: "400", - style: "normal", - subsets: ["latin"], -}); - -export default function Home() { - return ( - <> -
-
- -

Configure Existing Network

-
- -
- arrow -

Gateway

-
- - -
- arrow -

BAP Adapter

-
- - -
- arrow -

BPP Adapter

-
- -
-
-
- - ); -} diff --git a/onix-gui/GUI/app/install/create/page.js b/onix-gui/GUI/app/install/create/page.js deleted file mode 100644 index 0cf9db7..0000000 --- a/onix-gui/GUI/app/install/create/page.js +++ /dev/null @@ -1,67 +0,0 @@ -"use client"; - -import Link from "next/link"; -import styles from "../../page.module.css"; -import { Ubuntu_Mono } from "next/font/google"; -import Image from "next/image"; -const ubuntuMono = Ubuntu_Mono({ - weight: "400", - style: "normal", - subsets: ["latin"], -}); - -export default function Home() { - return ( - <> -
-
- -

Create a Production Network

-
- -
- arrow -

Gateway

-
- - -
- arrow -

BAP Adapter

-
- - -
- arrow -

BPP Adapter

-
- - -
- arrow -

Registry

-
- -
-
-
- - ); -} diff --git a/onix-gui/GUI/app/install/join/page.js b/onix-gui/GUI/app/install/join/page.js deleted file mode 100644 index 619e14b..0000000 --- a/onix-gui/GUI/app/install/join/page.js +++ /dev/null @@ -1,68 +0,0 @@ -"use client"; - -import Link from "next/link"; -import styles from "../../page.module.css"; -import { Ubuntu_Mono } from "next/font/google"; -import Image from "next/image"; -const ubuntuMono = Ubuntu_Mono({ - weight: "400", - style: "normal", - subsets: ["latin"], -}); - -export default function Home() { - return ( - <> -
-
- -

Join an existing network

- -
- -
- arrow -

Gateway

-
- - -
- arrow -

BAP Adapter

-
- - -
- arrow -

BPP Adapter

-
- -
-
-
- - ); -} diff --git a/onix-gui/GUI/app/install/local/page.js b/onix-gui/GUI/app/install/local/page.js deleted file mode 100644 index 7dbd607..0000000 --- a/onix-gui/GUI/app/install/local/page.js +++ /dev/null @@ -1,60 +0,0 @@ -"use client"; - -import Link from "next/link"; -import styles from "../../page.module.css"; -import { Ubuntu_Mono } from "next/font/google"; -import Image from "next/image"; -const ubuntuMono = Ubuntu_Mono({ - weight: "400", - style: "normal", - subsets: ["latin"], -}); - -export default function Home() { - return ( - <> -
-
- -

- Set up a network on your local machine -

-
- -
- arrow -

Gateway

-
- - -
- arrow -

BAP Adapter

-
- - -
- arrow -

BPP Adapter

-
- -
-
-
- - ); -} diff --git a/onix-gui/GUI/app/install/merge/page.js b/onix-gui/GUI/app/install/merge/page.js deleted file mode 100644 index 7391660..0000000 --- a/onix-gui/GUI/app/install/merge/page.js +++ /dev/null @@ -1,58 +0,0 @@ -"use client"; - -import Link from "next/link"; -import styles from "../../page.module.css"; -import { Ubuntu_Mono } from "next/font/google"; -import Image from "next/image"; -const ubuntuMono = Ubuntu_Mono({ - weight: "400", - style: "normal", - subsets: ["latin"], -}); - -export default function Home() { - return ( - <> -
-
- -

Merge multiple networks

-
- -
- arrow -

Gateway

-
- - -
- arrow -

BAP

-
- - -
- arrow -

BPP

-
- -
-
-
- - ); -} diff --git a/onix-gui/GUI/app/install/page.js b/onix-gui/GUI/app/install/page.js deleted file mode 100644 index a196231..0000000 --- a/onix-gui/GUI/app/install/page.js +++ /dev/null @@ -1,54 +0,0 @@ -"use client"; - -import Link from "next/link"; -import styles from "../page.module.css"; -import { Ubuntu_Mono } from "next/font/google"; -import Image from "next/image"; -const ubuntuMono = Ubuntu_Mono({ - weight: "400", - style: "normal", - subsets: ["latin"], -}); - -export default function Home() { - return ( - <> -
-
- -

ONIX

-

- Open Network In A Box, is a project designed to effortlessly set up - and maintain Beckn network that is scalable, secure and easy to - maintain. -

-
- -
- arrow -

Join an existing network

-
- - -
- arrow -

Create new production network

-
- -
-
-
- - ); -} diff --git a/onix-gui/GUI/app/layout.js b/onix-gui/GUI/app/layout.js deleted file mode 100644 index e461a93..0000000 --- a/onix-gui/GUI/app/layout.js +++ /dev/null @@ -1,22 +0,0 @@ -import { Inter } from "next/font/google"; -import "./globals.css"; -import { ToastContainer, toast } from "react-toastify"; -import "react-toastify/dist/ReactToastify.css"; -import { Bounce } from "react-toastify"; -const inter = Inter({ subsets: ["latin"] }); - -export const metadata = { - title: "ONIX GUI", - description: "Generated by create next app", -}; - -export default function RootLayout({ children }) { - return ( - - - {children} - - - - ); -} diff --git a/onix-gui/GUI/app/page.js b/onix-gui/GUI/app/page.js deleted file mode 100644 index 600fc62..0000000 --- a/onix-gui/GUI/app/page.js +++ /dev/null @@ -1,55 +0,0 @@ -import Link from "next/link"; -import styles from "./page.module.css"; -import { Ubuntu_Mono } from "next/font/google"; -import Image from "next/image"; -const ubuntuMono = Ubuntu_Mono({ - weight: "400", - style: "normal", - subsets: ["latin"], -}); - -export default function Home() { - return ( - <> -
-
-

ONIX

-

- Open Network In A Box, is a project designed to effortlessly set up - and maintain Beckn network that is scalable, secure and easy to - maintain. -

-
- -
- arrow -

Installation Wizard

-
- - {/* -
- arrow -

Network Monitor

-
- */} - -
- arrow -

Layer 2 Tester

-
- -
-
-
- - ); -} diff --git a/onix-gui/GUI/app/page.module.css b/onix-gui/GUI/app/page.module.css deleted file mode 100644 index 1947e56..0000000 --- a/onix-gui/GUI/app/page.module.css +++ /dev/null @@ -1,182 +0,0 @@ -.mainHeading { - font-size: 5rem; - margin-bottom: 1rem; - text-align: center; -} - -.mainText { - font-size: 1.5rem; - max-width: 55rem; - text-align: center; - margin: auto; - margin-bottom: 1rem; -} - -.boxesContainer { - margin-top: 2rem; - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - - flex-wrap: wrap; -} - -.secondBoxesContainer { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - flex-wrap: wrap; -} - -.box { - position: relative; - - width: 15rem; - height: 15rem; - border: 1px solid rgb(61, 61, 61); - - display: flex; - flex-direction: column; - justify-content: flex-end; - align-self: center; - text-align: center; - - font-size: 1.25rem; - padding: 1rem; -} - -.box p { - max-width: 12rem; - margin: 0 auto; -} - -.box img { - width: 2rem; - position: absolute; - - top: 1rem; - right: 1rem; -} - -.smallbox { - position: relative; - - width: 12rem; - height: 12rem; - border: 1px solid rgb(61, 61, 61); - - display: flex; - flex-direction: column; - justify-content: flex-end; - align-self: center; - text-align: center; - - font-size: 1.25rem; - padding: 1rem; -} - -.smallbox p { - max-width: 12rem; - margin: 0 auto; -} - -.smallbox img { - width: 2rem; - position: absolute; - - top: 1rem; - right: 1rem; -} - - -.formContainer { - padding: 1rem; - border: 1px solid rgb(61, 61, 61); - border-radius: 30px; -} - -.buttonsContainer { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - column-gap: 0.5rem; - margin-top: 1rem; - margin-bottom: 1rem; -} - -.currentRoute { - margin-bottom: 6rem; - font-family: "Ubuntu Mono", monospace; - font-size: 1.25rem; - font-weight: 600; - - text-align: center; -} - -.backButton { - position: absolute; - top: 1rem; - left: 1rem; - font-size: 1.25rem; - padding: 0.5rem; - border: 1px solid rgb(61, 61, 61); - background-color: transparent; - color: white; - cursor: pointer; -} - -.dashboard { - margin-bottom: 2rem; -} - -.dashboardHeading { - font-size: 2rem; - margin-bottom: 1rem; - text-align: center; -} - -.dashboardTable { - width: 100%; - border-collapse: collapse; - font-size: 1.25rem; - font-family: "Ubuntu Mono", monospace; - border: 1px solid rgb(61, 61, 61); -} - -.dashboardTable th, -.dashboardTable td { - padding: 1rem; - text-align: left; - border-bottom: 1px solid rgb(61, 61, 61); -} - -.dashboardTable th { - font-weight: 600; -} - -@media screen and (max-width: 600px) { - .dashboardTable { - font-size: 1rem; - } - - .dashboardTable th, - .dashboardTable td { - padding: 0.5rem; - } -} - -.counts { - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; - margin-top: 1rem; - margin-bottom: 2rem; -} - -.count { - max-width: 10rem; -} \ No newline at end of file diff --git a/onix-gui/GUI/app/setup/bap/page.js b/onix-gui/GUI/app/setup/bap/page.js deleted file mode 100644 index 2613e6e..0000000 --- a/onix-gui/GUI/app/setup/bap/page.js +++ /dev/null @@ -1,132 +0,0 @@ -"use client"; - -import InputField from "@/components/InputField/InputField"; -import styles from "../../page.module.css"; -import { Ubuntu_Mono } from "next/font/google"; -import SecondaryButton from "@/components/Buttons/SecondaryButton"; -import PrimaryButton from "@/components/Buttons/PrimaryButton"; -import { useState, useCallback } from "react"; -import { toast } from "react-toastify"; - -const ubuntuMono = Ubuntu_Mono({ - weight: "400", - style: "normal", - subsets: ["latin"], -}); - -export default function Home() { - const [subscriberUrl, setSubscriberUrl] = useState(""); - const [subscriberId, setSubscriberId] = useState(""); - const [registryUrl, setRegistryUrl] = useState(""); - const [buttonDisable, setButtonDisable] = useState(false); - const [networkconfigurl, setNetworkconfigurl] = useState(""); - - const handleSubscriberUrlChange = (event) => { - setSubscriberUrl(event.target.value); - }; - - const handleSubscriberIdChange = (event) => { - setSubscriberId(event.target.value); - }; - - const handleRegistryUrlChange = (event) => { - setRegistryUrl(event.target.value); - }; - - const handleNetworkconfigurlChange = (event) => { - setNetworkconfigurl(event.target.value); - }; - const installBap = useCallback(async () => { - const toastId = toast.loading("Installing BAP..."); - setButtonDisable(true); - try { - const response = await fetch("/api/install-bap", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - subscriberUrl, - subscriberId, - registryUrl, - networkconfigurl, - }), - }); - - if (response.ok) { - console.log("BPP installed successfully"); - toast.update(toastId, { - render: "BPP installed successfully 👌", - type: "success", - isLoading: false, - autoClose: 5000, - }); - } else { - console.error("Failed to install BAP"); - toast.update(toastId, { - render: "Failed to install BAP 🤯", - type: "error", - isLoading: false, - autoClose: 5000, - }); - } - } catch (error) { - console.error("An error occurred:", error); - toast.update(toastId, { - render: "Bap installation done", - type: "success", - isLoading: false, - autoClose: 5000, - }); - } - setButtonDisable(false); - }, [subscriberUrl, subscriberId, registryUrl, networkconfigurl]); - - return ( - <> -
-
- -

BAP

-
- - - - - - -
- {/* */} - -
-
-
-
- - ); -} diff --git a/onix-gui/GUI/app/setup/bpp/page.js b/onix-gui/GUI/app/setup/bpp/page.js deleted file mode 100644 index 3d37d00..0000000 --- a/onix-gui/GUI/app/setup/bpp/page.js +++ /dev/null @@ -1,146 +0,0 @@ -"use client"; - -import InputField from "@/components/InputField/InputField"; -import styles from "../../page.module.css"; -import { Ubuntu_Mono } from "next/font/google"; -import SecondaryButton from "@/components/Buttons/SecondaryButton"; -import PrimaryButton from "@/components/Buttons/PrimaryButton"; -import { useState, useCallback } from "react"; -import { toast } from "react-toastify"; - -const ubuntuMono = Ubuntu_Mono({ - weight: "400", - style: "normal", - subsets: ["latin"], -}); - -export default function Home() { - const [subscriberUrl, setSubscriberUrl] = useState(""); - const [subscriberId, setSubscriberId] = useState(""); - const [registryUrl, setRegistryUrl] = useState(""); - const [networkconfigurl, setNetworkconfigurl] = useState(""); - const [webhookUrl, setWebhookUrl] = useState(""); - const [buttonDisable, setButtonDisable] = useState(false); - const handleSubscriberUrlChange = (event) => { - setSubscriberUrl(event.target.value); - }; - - const handleSubscriberIdChange = (event) => { - setSubscriberId(event.target.value); - }; - - const handleRegistryUrlChange = (event) => { - setRegistryUrl(event.target.value); - }; - const handleNetworkconfigurlChange = (event) => { - setNetworkconfigurl(event.target.value); - }; - const handleWebhookUrlChange = (event) => { - setWebhookUrl(event.target.value); - }; - - const installBpp = useCallback(async () => { - const toastId = toast.loading("Installing BPP..."); - setButtonDisable(true); - try { - const response = await toast.promise( - fetch("/api/install-bpp", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - subscriberUrl: subscriberUrl, - subscriberId: subscriberId, - registryUrl: registryUrl, - networkconfigurl: networkconfigurl, - webhookUrl: webhookUrl, - }), - }), - { - success: "BPP installed successfully 👌", - error: "Failed to install BPP 🤯", - } - ); - - if (response.ok) { - console.log("BPP installed successfully"); - toast.update(toastId, { - render: "BPP installed successfully 👌", - type: "success", - isLoading: false, - autoClose: 5000, - }); - } else { - console.error("Failed to install BPP"); - toast.update(toastId, { - render: "Failed to install BPP 🤯", - type: "error", - isLoading: false, - autoClose: 5000, - }); - } - } catch (error) { - console.error("An error occurred:", error); - toast.update(toastId, { - render: "An error occurred while installing BPP 😥", - type: "error", - isLoading: false, - autoClose: 5000, - }); - } - setButtonDisable(false); - }, [subscriberUrl, subscriberId, registryUrl, networkconfigurl, webhookUrl]); - return ( - <> -
-
- -

BPP

-
- - - - - - - -
- {/* */} - -
-
-
-
- - ); -} diff --git a/onix-gui/GUI/app/setup/gateway/page.js b/onix-gui/GUI/app/setup/gateway/page.js deleted file mode 100644 index 41be273..0000000 --- a/onix-gui/GUI/app/setup/gateway/page.js +++ /dev/null @@ -1,126 +0,0 @@ -"use client"; - -import InputField from "@/components/InputField/InputField"; -import styles from "../../page.module.css"; -import { Ubuntu_Mono } from "next/font/google"; -import { useState, useCallback } from "react"; -import SecondaryButton from "@/components/Buttons/SecondaryButton"; -import PrimaryButton from "@/components/Buttons/PrimaryButton"; -import { usePathname } from "next/navigation"; -import { toast } from "react-toastify"; - -const ubuntuMono = Ubuntu_Mono({ - weight: "400", - style: "normal", - subsets: ["latin"], -}); - -export default function Home() { - let pathname = usePathname(); - const [gatewayUrl, setGatewayUrl] = useState(""); - const [registryUrl, setRegistryUrl] = useState(""); - const [networkconfigurl, setNetworkconfigurl] = useState(""); - - const handleGatewayUrlChange = (event) => { - setGatewayUrl(event.target.value); - }; - const handleRegistryUrlChange = (event) => { - setRegistryUrl(event.target.value); - }; - const handleNetworkconfigurlChange = (event) => { - setNetworkconfigurl(event.target.value); - }; - - const installGateway = useCallback(async () => { - const toastId = toast.loading("Installing gateway..."); - - try { - const response = await toast.promise( - fetch("/api/install-gateway", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - gatewayUrl: gatewayUrl, - registryUrl: registryUrl, - networkconfigurl: networkconfigurl, - }), - }), - { - success: "gateway installed successfully 👌", - error: "Failed to install BAP 🤯", - } - ); - - if (response.ok) { - console.log("Gateway installed successfully"); - toast.update(toastId, { - render: "Gateway installed successfully 👌", - type: "success", - isLoading: false, - autoClose: 5000, - }); - } else { - console.error("Failed to install gateway"); - toast.update(toastId, { - render: "Failed to install gateway 🤯", - type: "error", - isLoading: false, - autoClose: 5000, - }); - } - } catch (error) { - console.error("An error occurred:", error); - toast.update(toastId, { - render: "An error occurred while installing the gateway 😥", - type: "error", - isLoading: false, - autoClose: 5000, - }); - } - }, [gatewayUrl, registryUrl, networkconfigurl]); - return ( - <> -
-
- -

Gateway

-
- {/* To do todo - 1. Create a check function so that the url formats are correct - 2. Send response when installing and also erros that happen when an envet happens to the user - 3. a gear dialog where the user's can specify to where the beckn repo to be cloned. - */} - - - - - -
- {/* */} - -
-
-
-
- - ); -} diff --git a/onix-gui/GUI/app/setup/registry/page.js b/onix-gui/GUI/app/setup/registry/page.js deleted file mode 100644 index 6fce954..0000000 --- a/onix-gui/GUI/app/setup/registry/page.js +++ /dev/null @@ -1,96 +0,0 @@ -"use client"; -import SecondaryButton from "@/components/Buttons/SecondaryButton"; -import styles from "../../page.module.css"; -import { Ubuntu_Mono } from "next/font/google"; -import PrimaryButton from "@/components/Buttons/PrimaryButton"; -import InputField from "@/components/InputField/InputField"; -import { useState, useCallback } from "react"; -import { toast } from "react-toastify"; - -const ubuntuMono = Ubuntu_Mono({ - weight: "400", - style: "normal", - subsets: ["latin"], -}); - -export default function Home() { - const [registryUrl, setRegistryUrl] = useState(""); - - const handleRegistryUrlChange = (event) => { - setRegistryUrl(event.target.value); - }; - - const installRegistry = useCallback(async () => { - const toastId = toast.loading("Installing registry..."); - - try { - const response = await toast.promise( - fetch("/api/install-registry", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ registryUrl: registryUrl }), - }), - { - success: "registry installed successfully 👌", - error: "Failed to install registry 🤯", - } - ); - console.log("console.log of response", response); - - if (response.ok) { - console.log("Repository cloned successfully"); - toast.update(toastId, { - render: "Registry installed successfully 👌", - type: "success", - isLoading: false, - autoClose: 5000, - }); - } else { - console.error("Failed to clone repository"); - toast.update(toastId, { - render: "Failed to install registry 🤯", - type: "error", - isLoading: false, - autoClose: 5000, - }); - } - } catch (error) { - console.error("An error occurred:", error); - toast.update(toastId, { - render: "An error occurred while installing the registry 😥", - type: "error", - isLoading: false, - autoClose: 5000, - }); - } - }, [registryUrl]); - - return ( - <> -
-
- -

Registry

-
- -
- {/* */} - -
-
-
-
- - ); -} diff --git a/onix-gui/GUI/app/template.csv b/onix-gui/GUI/app/template.csv deleted file mode 100644 index d9ea810..0000000 --- a/onix-gui/GUI/app/template.csv +++ /dev/null @@ -1 +0,0 @@ -name,email,phone_number,district,category,organization,customfile,checkbox_field,date_field,datetime_field,time_field,number_field,rating_field diff --git a/onix-gui/GUI/app/yaml-gen/install-yaml/page.js b/onix-gui/GUI/app/yaml-gen/install-yaml/page.js deleted file mode 100644 index b6b1129..0000000 --- a/onix-gui/GUI/app/yaml-gen/install-yaml/page.js +++ /dev/null @@ -1,105 +0,0 @@ -"use client"; -import SecondaryButton from "@/components/Buttons/SecondaryButton"; -import styles from "../../page.module.css"; -import { Ubuntu_Mono } from "next/font/google"; -import Slider from "@/components/Slider/Slider"; -import PrimaryButton from "@/components/Buttons/PrimaryButton"; -import InputField from "@/components/InputField/InputField"; -import { useState, useCallback } from "react"; -import { toast } from "react-toastify"; - -const ubuntuMono = Ubuntu_Mono({ - weight: "400", - style: "normal", - subsets: ["latin"], -}); - -export default function InstallYaml() { - const [yamlUrl, setYamlUrl] = useState(""); - const [checked, setChecked] = useState(false); - - const container = checked ? "bpp" : "bap"; - - const handleRegistryUrlChange = (event) => { - setYamlUrl(event.target.value); - }; - - const installYaml = useCallback(async () => { - const toastId = toast.loading("Installing Layer 2 Config file..."); - - try { - const response = await fetch("/api/install-layer2", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ container, yamlUrl }), - }); - - if (response.ok) { - const data = await response.json(); - console.log(data); - const FileFound = data.message; - if (FileFound == false) { - setShowDownloadLayer2Button(true); - toast.update(toastId, { - render: "No Layer 2 Config Present 🤯", - type: "error", - isLoading: false, - autoClose: 5000, - }); - } else { - toast.update(toastId, { - render: "Yaml File Downloaded 👌", - type: "success", - isLoading: false, - autoClose: 5000, - }); - } - } else { - console.error("Failed to check yaml"); - toast.update(toastId, { - render: "Container Not Found 🤯", - type: "error", - isLoading: false, - autoClose: 5000, - }); - } - } catch (error) { - console.error("An error occurred:", error); - } - }); - - return ( - <> -
-
- -

Install Yaml

-
- - -
- {/* */} - -
-
-
-
- - ); -} diff --git a/onix-gui/GUI/app/yaml-gen/page.js b/onix-gui/GUI/app/yaml-gen/page.js deleted file mode 100644 index 6015abe..0000000 --- a/onix-gui/GUI/app/yaml-gen/page.js +++ /dev/null @@ -1,144 +0,0 @@ -"use client"; -import { useState } from "react"; -import { Ubuntu_Mono } from "next/font/google"; -import PrimaryButton from "@/components/Buttons/PrimaryButton"; -import InputField from "@/components/InputField/InputField"; -import Slider from "@/components/Slider/Slider"; -import styles from "../page.module.css"; -import { toast } from "react-toastify"; - -import Link from "next/link"; - -const ubuntuMono = Ubuntu_Mono({ - weight: "400", - style: "normal", - subsets: ["latin"], -}); - -export default function CheckYaml() { - const [domainName, setDomainName] = useState(""); - const [versionNumber, setversionNumber] = useState(""); - const [checked, setChecked] = useState(false); - const [showDownloadLayer2Button, setShowDownloadLayer2Button] = - useState(false); - const [propertyLink, setPropertyLink] = useState(""); - - const handleYamlChange = (event) => { - setPropertyLink(event.target.value); - }; - const handledomainNameChange = (event) => { - setDomainName(event.target.value); - }; - const handleVersionChange = (event) => { - setversionNumber(event.target.value); - }; - const nameGenerator = async () => { - const parts = domainName.split(":"); - const domainNameWithoutVersion = parts[0]; - let filename; - if (parts[1] === undefined || parts[1] === "") { - filename = `${domainNameWithoutVersion}_${versionNumber}.yaml`; - } else { - filename = `${domainNameWithoutVersion}_${parts[1]}_${versionNumber}.yaml`; - } - console.log(filename); - return filename; - }; - - const handleOnclick = async () => { - const fileName = await nameGenerator(); - const toastId = toast.loading("Checking for layer2 yaml file"); - try { - const response = await fetch("/api/check-layer2", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ checked, fileName }), - }); - - if (response.ok) { - const data = await response.json(); - const FileFound = data.message; - if (FileFound == false) { - setShowDownloadLayer2Button(true); - toast.update(toastId, { - render: "No Layer 2 Config Present 🤯", - type: "error", - isLoading: false, - autoClose: 5000, - }); - } else { - toast.update(toastId, { - render: "Yaml File Present 👌", - type: "success", - isLoading: false, - autoClose: 5000, - }); - } - } else { - console.error("Failed to check yaml"); - toast.update(toastId, { - render: "Container Not Found 🤯", - type: "error", - isLoading: false, - autoClose: 5000, - }); - } - } catch (error) { - console.error("An error occurred:", error); - } - }; - return ( - <> -
- - -
-

- Yaml File Checker -

- -
- - - - - -
- -
- {showDownloadLayer2Button && ( - - )} -
-
-
- - ); -} diff --git a/onix-gui/GUI/components/Buttons/Buttons.module.css b/onix-gui/GUI/components/Buttons/Buttons.module.css deleted file mode 100644 index 64f7a6a..0000000 --- a/onix-gui/GUI/components/Buttons/Buttons.module.css +++ /dev/null @@ -1,24 +0,0 @@ -.primaryButton { - background-color: #abd4fa; - color: #000000; - padding: 0.5rem 1rem; - border-radius: 10px; - border: none; - font-size: 1rem; - cursor: pointer; - - padding: 0.75rem 2rem; -} - -.secondaryButton { - background-color: #000000; - color: #abd4fa; - padding: 0.5rem 1rem; - border-radius: 10px; - border: none; - font-size: 1rem; - cursor: pointer; - - border: 1px solid #abd4fa; - padding: 0.75rem 2.25rem; -} diff --git a/onix-gui/GUI/components/Buttons/PrimaryButton.js b/onix-gui/GUI/components/Buttons/PrimaryButton.js deleted file mode 100644 index 57a18c5..0000000 --- a/onix-gui/GUI/components/Buttons/PrimaryButton.js +++ /dev/null @@ -1,16 +0,0 @@ -import React from "react"; -import styles from "./Buttons.module.css"; - -const PrimaryButton = ({ label = "continue", onClick, disabled = false }) => { - return ( - - ); -}; - -export default PrimaryButton; diff --git a/onix-gui/GUI/components/Buttons/SecondaryButton.jsx b/onix-gui/GUI/components/Buttons/SecondaryButton.jsx deleted file mode 100644 index 97a3564..0000000 --- a/onix-gui/GUI/components/Buttons/SecondaryButton.jsx +++ /dev/null @@ -1,8 +0,0 @@ -import React from "react"; -import styles from "./Buttons.module.css"; - -const SecondaryButton = () => { - return ; -}; - -export default SecondaryButton; diff --git a/onix-gui/GUI/components/InputField/InputField.jsx b/onix-gui/GUI/components/InputField/InputField.jsx deleted file mode 100644 index aac6551..0000000 --- a/onix-gui/GUI/components/InputField/InputField.jsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from "react"; -import styles from "./InputField.module.css"; - -const InputField = ({ label, value, onChange, placeholder = "Input Text" }) => { - return ( -
- - -
- ); -}; - -export default InputField; diff --git a/onix-gui/GUI/components/InputField/InputField.module.css b/onix-gui/GUI/components/InputField/InputField.module.css deleted file mode 100644 index e3c2efc..0000000 --- a/onix-gui/GUI/components/InputField/InputField.module.css +++ /dev/null @@ -1,23 +0,0 @@ -.inputContainer { - display: flex; - flex-direction: column; - margin: 1.5rem 1rem; -} - -.inputLabel { - font-size: 1rem; - font-weight: bold; - margin-bottom: 0.5rem; -} - -.inputField { - padding: 1rem; - font-family: "Ubuntu Mono", sans-serif; - color: white; - font-size: 1rem; - border-radius: 15px; - border: 1px solid rgb(61, 61, 61); - background: #000000; - - min-width:15rem -} diff --git a/onix-gui/GUI/components/Slider/Slider.jsx b/onix-gui/GUI/components/Slider/Slider.jsx deleted file mode 100644 index 5c03937..0000000 --- a/onix-gui/GUI/components/Slider/Slider.jsx +++ /dev/null @@ -1,20 +0,0 @@ -import React from "react"; -import styles from "./Slider.module.css"; - -const Slider = ({ label, checked, toggleChecked }) => { - return ( -
- - -
- ); -}; - -export default Slider; diff --git a/onix-gui/GUI/components/Slider/Slider.module.css b/onix-gui/GUI/components/Slider/Slider.module.css deleted file mode 100644 index 749e1c3..0000000 --- a/onix-gui/GUI/components/Slider/Slider.module.css +++ /dev/null @@ -1,67 +0,0 @@ -.switch { - transform: scale(0.75); - position: relative; - display: inline-block; - width: 60px; - height: 34px; -} - -.inputContainer { - display: flex; - - align-items: center; - justify-content: space-around; -} - -.switch input { - opacity: 0; - width: 0; - height: 0; -} - -.slider { - position: absolute; - cursor: pointer; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: white; - -webkit-transition: .4s; - transition: .4s; -} - -.slider:before { - position: absolute; - content: ""; - height: 26px; - width: 26px; - left: 4px; - bottom: 4px; - background-color: black; - -webkit-transition: .4s; - transition: .4s; -} - -input:checked+.slider { - background-color: #9dc5e6; -} - -input:focus+.slider { - box-shadow: 0 0 1px white; -} - -input:checked+.slider:before { - -webkit-transform: translateX(26px); - -ms-transform: translateX(26px); - transform: translateX(26px); -} - -/* Rounded sliders */ -.slider.round { - border-radius: 34px; -} - -.slider.round:before { - border-radius: 50%; -} \ No newline at end of file diff --git a/onix-gui/GUI/jsconfig.json b/onix-gui/GUI/jsconfig.json deleted file mode 100644 index 2a2e4b3..0000000 --- a/onix-gui/GUI/jsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "compilerOptions": { - "paths": { - "@/*": ["./*"] - } - } -} diff --git a/onix-gui/GUI/next.config.mjs b/onix-gui/GUI/next.config.mjs deleted file mode 100644 index 4678774..0000000 --- a/onix-gui/GUI/next.config.mjs +++ /dev/null @@ -1,4 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = {}; - -export default nextConfig; diff --git a/onix-gui/GUI/package-lock.json b/onix-gui/GUI/package-lock.json deleted file mode 100644 index 6714052..0000000 --- a/onix-gui/GUI/package-lock.json +++ /dev/null @@ -1,4247 +0,0 @@ -{ - "name": "onix-gui", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "onix-gui", - "version": "0.1.0", - "dependencies": { - "child_process": "^1.0.2", - "next": "14.1.4", - "react": "^18", - "react-dom": "^18", - "react-toastify": "^10.0.5" - }, - "devDependencies": { - "eslint": "^8", - "eslint-config-next": "14.1.4" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", - "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@next/env": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.1.4.tgz", - "integrity": "sha512-e7X7bbn3Z6DWnDi75UWn+REgAbLEqxI8Tq2pkFOFAMpWAWApz/YCUhtWMWn410h8Q2fYiYL7Yg5OlxMOCfFjJQ==" - }, - "node_modules/@next/eslint-plugin-next": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.4.tgz", - "integrity": "sha512-n4zYNLSyCo0Ln5b7qxqQeQ34OZKXwgbdcx6kmkQbywr+0k6M3Vinft0T72R6CDAcDrne2IAgSud4uWCzFgc5HA==", - "dev": true, - "dependencies": { - "glob": "10.3.10" - } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.4.tgz", - "integrity": "sha512-ubmUkbmW65nIAOmoxT1IROZdmmJMmdYvXIe8211send9ZYJu+SqxSnJM4TrPj9wmL6g9Atvj0S/2cFmMSS99jg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.4.tgz", - "integrity": "sha512-b0Xo1ELj3u7IkZWAKcJPJEhBop117U78l70nfoQGo4xUSvv0PJSTaV4U9xQBLvZlnjsYkc8RwQN1HoH/oQmLlQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.4.tgz", - "integrity": "sha512-457G0hcLrdYA/u1O2XkRMsDKId5VKe3uKPvrKVOyuARa6nXrdhJOOYU9hkKKyQTMru1B8qEP78IAhf/1XnVqKA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.4.tgz", - "integrity": "sha512-l/kMG+z6MB+fKA9KdtyprkTQ1ihlJcBh66cf0HvqGP+rXBbOXX0dpJatjZbHeunvEHoBBS69GYQG5ry78JMy3g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.4.tgz", - "integrity": "sha512-BapIFZ3ZRnvQ1uWbmqEGJuPT9cgLwvKtxhK/L2t4QYO7l+/DxXuIGjvp1x8rvfa/x1FFSsipERZK70pewbtJtw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.4.tgz", - "integrity": "sha512-mqVxTwk4XuBl49qn2A5UmzFImoL1iLm0KQQwtdRJRKl21ylQwwGCxJtIYo2rbfkZHoSKlh/YgztY0qH3wG1xIg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.4.tgz", - "integrity": "sha512-xzxF4ErcumXjO2Pvg/wVGrtr9QQJLk3IyQX1ddAC/fi6/5jZCZ9xpuL9Tzc4KPWMFq8GGWFVDMshZOdHGdkvag==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.4.tgz", - "integrity": "sha512-WZiz8OdbkpRw6/IU/lredZWKKZopUMhcI2F+XiMAcPja0uZYdMTZQRoQ0WZcvinn9xZAidimE7tN9W5v9Yyfyw==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.4.tgz", - "integrity": "sha512-4Rto21sPfw555sZ/XNLqfxDUNeLhNYGO2dlPqsnuCg8N8a2a9u1ltqBOPQ4vj1Gf7eJC0W2hHG2eYUHuiXgY2w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.9.0.tgz", - "integrity": "sha512-AAWymnpvHbGty1BmgbdfbqQDboXs6xN6h2yAacO4yKVyyUUBnpYkp+P9jjPrV9zrAGw7JVVriRtGOHPInnfjZQ==", - "dev": true - }, - "node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.toreversed": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", - "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", - "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.1.0", - "es-shim-unscopables": "^1.0.2" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", - "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001600", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", - "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/child_process": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz", - "integrity": "sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==" - }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" - }, - "node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/enhanced-resolve": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", - "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/es-abstract": { - "version": "1.23.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.2.tgz", - "integrity": "sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.5", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.0.18", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz", - "integrity": "sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-next": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.1.4.tgz", - "integrity": "sha512-cihIahbhYAWwXJwZkAaRPpUi5t9aOi/HdfWXOjZeUOqNWXHD8X22kd1KG58Dc3MVaRx3HoR/oMGk2ltcrqDn8g==", - "dev": true, - "dependencies": { - "@next/eslint-plugin-next": "14.1.4", - "@rushstack/eslint-patch": "^1.3.3", - "@typescript-eslint/parser": "^5.4.2 || ^6.0.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" - }, - "peerDependencies": { - "eslint": "^7.23.0 || ^8.0.0", - "typescript": ">=3.3.1" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", - "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "fast-glob": "^3.3.1", - "get-tsconfig": "^4.5.0", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", - "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.23.2", - "aria-query": "^5.3.0", - "array-includes": "^3.1.7", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "=4.7.0", - "axobject-query": "^3.2.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.15", - "hasown": "^2.0.0", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.34.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", - "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlast": "^1.2.4", - "array.prototype.flatmap": "^1.3.2", - "array.prototype.toreversed": "^1.1.2", - "array.prototype.tosorted": "^1.1.3", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.17", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7", - "object.hasown": "^1.1.3", - "object.values": "^1.1.7", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.10" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz", - "integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "dev": true, - "dependencies": { - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true - }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dev": true, - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/next": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/next/-/next-14.1.4.tgz", - "integrity": "sha512-1WTaXeSrUwlz/XcnhGTY7+8eiaFvdet5z9u3V2jb+Ek1vFo0VhHKSAIJvDWfQpttWjnyw14kBeq28TPq7bTeEQ==", - "dependencies": { - "@next/env": "14.1.4", - "@swc/helpers": "0.5.2", - "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001579", - "graceful-fs": "^4.2.11", - "postcss": "8.4.31", - "styled-jsx": "5.1.1" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": ">=18.17.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "14.1.4", - "@next/swc-darwin-x64": "14.1.4", - "@next/swc-linux-arm64-gnu": "14.1.4", - "@next/swc-linux-arm64-musl": "14.1.4", - "@next/swc-linux-x64-gnu": "14.1.4", - "@next/swc-linux-x64-musl": "14.1.4", - "@next/swc-win32-arm64-msvc": "14.1.4", - "@next/swc-win32-ia32-msvc": "14.1.4", - "@next/swc-win32-x64-msvc": "14.1.4" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", - "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.hasown": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", - "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-scurry": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", - "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", - "dev": true, - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "node_modules/react-toastify": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-10.0.5.tgz", - "integrity": "sha512-mNKt2jBXJg4O7pSdbNUfDdTsK9FIdikfsIE/yUCxbAEXl4HMyJaivrVFcn3Elvt5xvCQYhUZm+hqTIu1UXM3Pw==", - "dependencies": { - "clsx": "^2.1.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", - "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", - "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/styled-jsx": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", - "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", - "dependencies": { - "client-only": "0.0.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", - "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", - "dev": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", - "dev": true, - "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/onix-gui/GUI/package.json b/onix-gui/GUI/package.json deleted file mode 100644 index 38899c1..0000000 --- a/onix-gui/GUI/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "onix-gui", - "version": "0.1.0", - "private": true, - "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start", - "lint": "next lint" - }, - "dependencies": { - "child_process": "^1.0.2", - "next": "14.1.4", - "react": "^18", - "react-dom": "^18", - "react-toastify": "^10.0.5" - }, - "devDependencies": { - "eslint": "^8", - "eslint-config-next": "14.1.4" - } -} diff --git a/onix-gui/GUI/public/arrow.png b/onix-gui/GUI/public/arrow.png deleted file mode 100644 index 7151c68..0000000 Binary files a/onix-gui/GUI/public/arrow.png and /dev/null differ diff --git a/onix-gui/README.md b/onix-gui/README.md deleted file mode 100644 index 339f6dc..0000000 --- a/onix-gui/README.md +++ /dev/null @@ -1,77 +0,0 @@ -# Beckn-Onix Installation Wizard - - - -The below provides an overview of the installation wizard and layer 2 tester & downloader features of Beckn-Onix. Follow the steps outlined below to successfully utilize these features. - - - -### Home Page - -- Visit the home page of the Beckn-Onix installation wizard. - - - -![Home Page](https://github.com/beckn/beckn-onix/assets/85678545/e8674a29-b6e2-4fb2-a5ad-c76166bf1174) - - - -### Installation Wizard - -- Navigate to the installation wizard section. - -- Fill in the required details as prompted. - - - -![Installation Wizard](https://github.com/beckn/beckn-onix/assets/85678545/e9cec587-299f-4793-9045-c7c01551ad51) - - - -### Continue Installation - -- Click on the "Continue" button to proceed with the installation. - -- Repeat the same process for all components. - - - -## Layer 2 - - - -![Layer 2](https://github.com/beckn/beckn-onix/assets/85678545/32978858-5303-43b2-b0b5-517ee98ec6c3) - - - -### Setup Configuration File - -- Select whether you want to set up the layer 2 config file in BAP or BPP. - -- Fill in the Domain and version number of the layer 2 config file. - - - -### Check File Presence - -- If the file is present, a success toast will be displayed. - -- If the file is not present, a link for downloading the layer 2 file to the protocol server will be provided. - - - -![Check File Presence](https://github.com/beckn/beckn-onix/assets/85678545/31aaf210-9fef-4c33-b651-7231cd900f0a) - - - -### Download File - -- Click on the download link to be redirected to another page for downloading. - -- Paste the YAML file URL and click "Continue". - -- If successful, a success toast will be displayed. If unsuccessful, an error toast will be shown. - - - -![Download File](https://github.com/beckn/beckn-onix/assets/85678545/0dd9d456-66ca-4e2a-abc1-ba8dd98719c1) diff --git a/onix-gui/start.sh b/onix-gui/start.sh deleted file mode 100755 index 8ffc509..0000000 --- a/onix-gui/start.sh +++ /dev/null @@ -1,79 +0,0 @@ -#!/bin/bash - -# Installing dependencies - -sudo apt-get update -sudo apt-get install ca-certificates curl - -sudo install -m 0755 -d /etc/apt/keyrings -sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc -sudo chmod a+r /etc/apt/keyrings/docker.asc - -# Add the repository to Apt sources: -echo \ -"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ -$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ -sudo tee /etc/apt/sources.list.d/docker.list > /dev/null - -sudo apt-get update -sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin - -sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose -sudo chmod +x /usr/local/bin/docker-compose - -echo "installing node" -curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash && -source ~/.bashrc && -export NVM_DIR="$HOME/.nvm" -[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm -[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion -nvm install 20 && -npm i -g localtunnel && - -# Add user to the docker group and apply permissions -sudo groupadd docker & -sudo usermod -aG docker $USER & -newgrp docker & - -# Set script variables -PROJECT_DIR="GUI" -PORT=3005 -TUNNEL_SERVICE="lt" - -# Change to the project directory -cd "$PROJECT_DIR" || exit -nvm use 20 && -npm i && - -# Build and start the Next.js app -echo "installing Dependencies" -echo "Building and starting Next.js app..." -npx next build && -echo "Builing Web App = True" -sleep 3 -npx next start -p "$PORT" & - -# Wait for the Next.js app to start - -# Install the tunnel service if not installed -sleep 3 -echo "Exposing local port $PORT using $TUNNEL_SERVICE..." -lt --port "$PORT" > /tmp/lt.log 2>&1 & - -# Wait for the tunnel service to start -echo "Waiting for tunnel service to start..." -sleep 5 - -# Get the tunnel URL from the log file -TUNNEL_URL=$(grep -o 'https://[^[:blank:]]*' /tmp/lt.log) - -#Get the tunnel password -echo "Getting Tunnel Password" -TUNNEL_PASSWORD=$(curl https://loca.lt/mytunnelpassword) && - -# Print the tunnel URL and password -echo "---------------------------------------" -echo "Next.js app is running locally on port $PORT" -echo "Tunnel Service URL: $TUNNEL_URL" -echo "Tunnel Password: $TUNNEL_PASSWORD" -echo "---------------------------------------" diff --git a/specification/README.md b/specification/README.md deleted file mode 100644 index 205d04c..0000000 --- a/specification/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Beckn-ONIX Specification - -The **Beckn-ONIX Specification** establishes a standardized framework for the Beckn-ONIX ecosystem. By defining consistent interfaces and components, the specification ensures interoperability across all Beckn-ONIX distributions and SDKs, enabling seamless integration and communication between different systems. - -This directory contains detailed documentation outlining the Beckn-ONIX specification. - -1. The markdown version of the specification can be found [here](./doc/Beckn-ONIX-Specification.md). -2. The Google Docs version is available [here](https://docs.google.com/document/d/1JlE-JTgQCPVPtFUqs3dIfBma3Koi_pVsO4LwB4hGcM8/edit). - -3. A Swagger document describing the Beckn-ONIX API can be accessed [here](https://beckn.github.io/beckn-onix/swagger/index.html) \ No newline at end of file diff --git a/specification/doc/Beckn-ONIX-Specification.md b/specification/doc/Beckn-ONIX-Specification.md deleted file mode 100644 index 20517bb..0000000 --- a/specification/doc/Beckn-ONIX-Specification.md +++ /dev/null @@ -1,811 +0,0 @@ - -# Beckn-ONIX Stack: v0.1 - -# Version History: - -The version history table describes the major changes to the specifications between published versions. - - -| Version | Authors | Comment | -|---------|---------------|---------------------------------------------------------------------------| -| 0.1 | Ravi Prakash | First draft of core specifications | - - - -# Table of Contents - -- [Preface](#preface) - - [Purpose of the document](#purpose-of-the-document) - - [Prerequisites](#prerequisites) - - [Audience](#audience) - - [Disclaimers](#disclaimers) - - [Definitions and Acronyms](#definitions-and-acronyms) - - [Learning Resources](#learning-resources) -- [Introduction](#introduction) - - [The world before Beckn](#the-world-before-beckn) - - [Can we reimagine transactions on the internet?](#can-we-reimagine-transactions-on-the-internet) - - [Why do we need Beckn-ONIX?](#why-do-we-need-beckn-onix) - - [Objectives and Goals](#objectives-and-goals) - - [Key Features](#key-features) -- [Requirements](#requirements) - - [Functional Requirements](#functional-requirements) - - [Requirements for all modes](#requirements-for-all-modes) - - [Installation](#installation) - - [Identity](#identity) - - [Authentication - Key-Pair](#authentication---key-pair) - - [Authentication - Signing](#authentication---signing) - - [Authentication - Verification](#authentication---verification) - - [Security-https](#security-https) - - [Protocol Version compatibility](#protocol-version-compatibility) - - [Layer 2 Config](#layer-2-config) - - [Observability](#observability) - - [Logging](#logging) - - [Configuration](#configuration) - - [Requirements for BAP mode](#requirements-for-bap-mode) - - [Common Requirements](#common-requirements) - - [Authentication - Key verification](#authentication---key-verification) - - [DOFP functionality](#dofp-functionality) - - [Sending Request (Transaction API)](#sending-request-transaction-api) - - [Layer 2 Configuration (Transaction API)](#layer-2-configuration-transaction-api) - - [Core spec compatibility (Transaction API)](#core-spec-compatibility--transaction-api) - - [Handling synchronous response (Transaction API)](#handling-synchronous-response--transaction-api) - - [Listening to responses (Transaction API)](#listening-to-responses--transaction-api) - - [Acknowledging responses (Transaction API)](#acknowledging-responses-transaction-api) - - [Client side interface (Transaction API)](#client-side-interface-transaction-api) - - [Context (Transaction API)](#context--transaction-api) - - [Error handling (Transaction API)](#error-handling-transaction-api) - - [XInput (Transaction API)](#xinput-transaction-api) - - [Meta API - Fetching information](#meta-api---fetching-information) - - [Requirements for BPP Mode](#requirements-for-bpp-mode) - - [Common Requirements](#common-requirements-1) - - [Authentication - Key verification](#authentication---key-verification-1) - - [Authentication - Verification - Gateway](#authentication---verification---gateway) - - [DOFP functionality](#dofp-functionality-1) - - [Listening to Requests (Transaction API)](#listening-to-requests-transaction-api) - - [Layer 2 Configuration (Transaction API)](#layer-2-configuration-transaction-api-1) - - [Core spec compatibility (Transaction API)](#core-spec-compatibility-transaction-api) - - [Acknowledging request (Transaction API)](#acknowledging-request-transaction-api) - - [Sending Responses (Transaction API)](#sending-responses-transaction-api) - - [Handling response acknowledgements (Transaction API)](#handling-response-acknowledgements-transaction-api) - - [Context (Transaction API)](#context-transaction-api) - - [Responses without corresponding requests](#responses-without-corresponding-requests) - - [XInput (Transaction API)](#xinput-transaction-api-1) - - [Error handling (Transaction API)](#error-handling-transaction-api-1) - - [Meta API - Listening and returning data](#meta-api---listening-and-returning-data) - - [Requirements for Registry mode](#requirements-for-registry-mode) - - [Common Requirements](#common-requirements-2) - - [Registration of Network Participants](#registration-of-network-participants) - - [Subscription of Network Participants](#subscription-of-network-participants) - - [Network Participant - Keys](#network-participant---keys) - - [Subscribe (Registry API)](#subscribe-registry-api) - - [Lookup (Registry API)](#lookup-registry-api) - - [Logging - Public key changes](#logging---public-key-changes) - - [Merging two networks](#merging-two-networks) - - [Requirements for Gateway mode](#requirements-for-gateway-mode) - - [Common Requirements](#common-requirements-3) - - [Authentication - Key verification](#authentication---key-verification-2) - - [Authentication - Signing](#authentication---signing-1) - - [Listening to search requests (Transaction API)](#listening-to-search-requests-transaction-api) - - [Forwarding search (Transaction API)](#forwarding-search-transaction-api) - - [Caching (Transaction API)](#caching-transaction-api) - - [Non-Functional Requirements](#non-functional-requirements) - - [Performance](#performance) - - [Scalability](#scalability) - - [Reliability and Availability](#reliability-and-availability) - - [Usability](#usability) -- [Appendices](#appendices) - - [APIs and Schemas](#apis-and-schemas) - - [References](#references) - - - - -# Preface - - -## Purpose of the document - -The purpose of this document is to establish a standardized framework for Beckn-ONIX. By defining common interfaces and components, this document aims to ensure that all Beckn-ONIX distributions and SDKs are interoperable, enabling seamless integration and communication between systems. This standardization is crucial for enhancing consistency and reliability. - - -## Prerequisites - -A good understanding of the Beckn Protocol and the ecosystem is required to get maximum benefit from this document. Learning resources are provided in the section below to help in this task. - - -## Audience - -The users of this document are the developers or organizations who want to build a Beckn-ONIX distribution or a Beckn-ONIX SDK. - - -## Disclaimers - -…. - - -## Definitions and Acronyms - -This section provides definitions and explanations of key terms and concepts used in the Beckn-Onix network. Understanding these terms is essential for navigating the functionalities and interactions within the ecosystem. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Term - Description -
DOFP Session - An end-to-end transaction workflow consisting of Discovery, Ordering, Fulfillment, and Post-fulfillment (not necessarily in the same sequence), resulting in the execution of a contract between a consumer and a provider. -
BAP - Beckn Application Platform -
BPP - Beckn Provider Platform. -
BG - Beckn Gateway. -
Registry - Beckn Registry. -
Specification - A technical document that describes how a system is to be developed to achieve a specific set of objectives or requirements. -
Ecosystem - An ecosystem is a community of stakeholders that support platforms implementing the specification. Ecosystems can be made up of developers, resellers, customers, software, services, and more. -
Ecosystem Maturity - The level of readiness of an ecosystem to design, build, and use implementations of the specification. This can range from basic access to internet infrastructure to more advanced features like digital identities, assets, payments, and trust infrastructure. -
Consumer - A person, or an organization that wants to discover, buy or avail products, services, and/or opportunities. -
Provider - A person, or an organization that wants to publish, sell, allocate, or provide products, services, and/or opportunities. -
Intent - A consumer’s desire to purchase, procure, or avail something being offered by a provider. -
Catalog - A provider’s list of products, services, and opportunities that is made available to consumers. -
- - - -## Learning Resources - -Refer to the below resources to get an understanding of the Beckn protocol and Beckn-ONIX. Also refer to the references section of this document for additional resources. - - - -* Beckn Protocol: - 1. [https://developers.becknprotocol.io/](https://developers.becknprotocol.io/) - 2. [https://developers.becknprotocol.io/docs/introduction/video-overview/](https://developers.becknprotocol.io/docs/introduction/video-overview/) -* Beckn-Onix: - 1. [https://becknprotocol.io/beckn-onix/](https://becknprotocol.io/beckn-onix/) - 2. [https://github.com/beckn/beckn-onix/blob/main/docs/user_guide.md](https://github.com/beckn/beckn-onix/blob/main/docs/user_guide.md) - - -# Introduction - - -## The world before Beckn - -Today, most online transactions between a consumer and a provider happen via a centralized platform acting as an intermediary. However, not everything on the internet works this way. Emails, WiFi, phone calls, and the World Wide Web, all operate on standard protocols that allow for Peer to Peer communication between machines without the need for a centralized intermediary. - -Beckn Protocol fundamentally reimagines how transactions are conducted on the internet today. - - -## Can we reimagine transactions on the internet? - -Beckn-ONIX envisions becoming the foundational standard for rapidly deploying and integrating Beckn protocol-enabled networks. By offering a robust, secure, and high-performance framework, Beckn-ONIX aims to empower the community to build adaptable, production-ready applications with ease. Much like Apache or Nginx serves as a backbone for HTTP-based systems, Beckn-ONIX aspires to be the go-to standard for creating reliable and scalable Beckn protocol adapters. This vision focuses on accelerating innovation by simplifying network deployment, enabling developers to focus on building the future of decentralized applications. - - -## Why do we need Beckn-ONIX? - - -## Objectives and Goals - -* A Beckn-ONIX distribution/SDK must allow setting up a new network. -* A Beckn-ONIX distribution/SDK must allow an NP to join an existing network. -* A Beckn-ONIX distribution/SDK must allow merging multiple networks. -* A Beckn-ONIX distribution/SDK must allow configuration of an existing network. - -The goal is to accelerate the pace of innovation and encourage focus on driving progress and achieving breakthrough solutions. - - -## Key Features - -A Beckn-ONIX distribution must have at least the following key capabilities: - - -* Set up and configure open networks within a matter of minutes -* Join existing networks through elaborate SDKs -* Scale effortlessly -* It should be simple and intuitive - - -# Requirements - -This section lists the core requirements of a Beckn-ONIX distribution (sometimes referred to as **software**). It does not assume any implementation decisions except as required by the Beckn protocol (e.g. Beckn protocol messages are sent over http. So the network participant needs to expose http endpoints in order to receive them). Except those mentioned, all other design aspects can be chosen by the implementers. - -The mandatory requirements use the word **must**. The recommended requirements use the word **should** and the optional requirements use the word **may**. - - -## Functional Requirements - -Beckn network defines Network Participants with four main roles. They are - - -* **BAP (Beckn Application Platform) **- consumer-facing infrastructure which captures consumers’ requests via its UI applications, converts them into beckn-compliant schemas and APIs at the server side, and fires them at the network. -* **BPP (Beckn Provider Platform) **- platforms that maintain an active inventory, one or more catalogs of products and services, implement the supply logic and enable fulfillment of orders. The BPP can be a single provider with a Beckn API implementation or an aggregator of merchants -* **Registry** - stores detailed information about every network participant and acts as the trust layer of the Beckn network. -* **Gateway** - are extremely lean and stateless routing servers. Its purpose is to optimize discovery of BPPs by the BAPs by merely matching the context of the search. - -A Beckn-ONIX instance can take on any of the four roles of Network participants. We use the term **mode** in the rest of the document. We describe below (in different sub-sections), requirements common to all modes as well as requirements when operating in one of the modes. If an instance is operating in more than one mode, it should satisfy the requirements of all of those modes it is operating in. - -These **minimal core requirements** do not explain the business logic, application programming interface (except those on Beckn network side defined by the protocol) or user interface that might be required in any consumer side or provider side application. Some of these requirements will be covered in other Beckn-ONIX extended requirement documents. - -In the rest of the document, the word **Network Participant** refers to the Beckn-ONIX installed software instance that is acting as a Network Participant in the Beckn network. So when we say “Network Participant must…”, it effectively means that the “Beckn-ONIX distribution installed software instance must…” - - -### Requirements for all modes - - -#### Installation - -1. It must be possible to install the software and configure it to operate in any mode required. The installation must allow - 1. Creation of a new Beckn network (mostly relevant for the Registry mode) - 2. Joining an existing Beckn network as a network participant - 3. Configuring an existing network participant - 4. Merging two networks (relevant in the Registry mode) -2. The installation process should guide the user with intuitive prompts and help setup mandatory configuration such as identity (see below) . The exact process of installation and configuration (whether through wizards, GUI or combination of these explained through a procedure) is left to implementation. - - -#### Identity - - - -1. Software must allow setting Subscriber Id and Subscriber URL of the network participant. This Subscriber Id and Subscriber URL must follow the format defined[ here.](https://github.com/beckn/protocol-specifications/blob/master/schema/Subscriber.yaml) This Subscriber Id and Subscriber URL must be used in messages to identify the network participant. Depending on the role and the message, different names (subscriber_id, bap_id, bpp_id ) are used to refer to these values. Network participant’s Subscriber Id and Subscriber URL must be registered with the Registry. While registering usually, the role (BAP, BPP, BG), the domain in which they transact and the location of the network participant is also set. The exact process(manual/automated) of registration may be defined by registry implementation. - - -#### Authentication - Key-Pair - - - -1. It must be possible to set private-public key pairs of the Network Participant. The key pairs are associated with a key_id. The format of the key pairs, key_id and other details are documented[ here](https://github.com/beckn/protocol-specifications/blob/master/docs/BECKN-006-Signing-Beckn-APIs-In-HTTP-Draft-01.md). Software may support multiple key-pairs with different key ids. -2. **Key-Pair generation**: The software should support easy generation of private-public key pairs. -3. **Public key update:** The public key of the key-pair must be updated at the registry. This is done using the subscribe endpoint and is documented[ here](https://github.com/beckn/protocol-specifications/blob/master/api/registry/build/registry.yaml). -4. **Security - Key-Pair refresh**: It must be possible for public-private key pair to be updated. The update will involve changing it at the registry using the subscribe endpoint as well as use of the new key in further transactions. - - -#### Authentication - Signing - - - -1. Any message that is sent on the Beckn network must be hashed and signed with the private key associated with the network participant. This signature must be set as the Authorization header. The process will require subscriber_id, key_id, private key and the message body. The hashing and signing process as well as the format of the Authorization header is documented[ here](https://github.com/beckn/protocol-specifications/blob/master/docs/BECKN-006-Signing-Beckn-APIs-In-HTTP-Draft-01.md). - - -#### Authentication - Verification - - - -1. Any network participant when it receives a message from another participant must verify the signature to ensure that this is coming from the said participant and the message contents have not been modified. This process involves looking up the public key of the sender in the registry. The lookup endpoint is documented[ here](https://github.com/beckn/protocol-specifications/blob/master/api/registry/build/registry.yaml). The process of verification is documented[ here](https://github.com/beckn/protocol-specifications/blob/master/docs/BECKN-006-Signing-Beckn-APIs-In-HTTP-Draft-01.md). -2. **Authentication - Verification - Lookup cache**: To reduce the load on the Registry, the network participant should use cache with a short expiry for the lookup api results. If the details of the required network participant are in the cache, the registry should not be contacted. - - -#### Security-https - - - -1. All network participants must use https for communication towards the Beckn network. This ensures encryption of data in transit. - - -#### Protocol Version compatibility - - - -1. Network Participants should support multiple versions of the core protocol. - - -#### Layer 2 Config - - - -1. Layer 2 Config are machine encoded rules that are released by the network. These rules are an addition to the API rules defined by the core Beckn transaction API specification. Currently Layer 2 configurations are openapi compliant yaml format files similar to Core transaction API specification. The network might release one layer 2 config file for every domain the network participant can transcat in. \ - \ -The software must provide a way to download and save multiple Layer 2 config released by the network. These layer 2 configurations must be used to enforce network defined rules. For the BAP/BPP mode, this might be validating incoming and outgoing messages as per the rules. -2. **Layer 2 Config - Core version**: Layer 2 Config file selection (in cases that involve message validation) should be cognisant of the core version(the value of the version attribute in the context of any message). If there is an available layer 2 config (released by network and downloaded by Network Particpant as specified above), specific to the core version in the message, that file should be used for validation. - - -#### Observability - - - -1. **Health check**: Network Participants must implement a health check endpoint (/health). When operational, the endpoint must return a 200 HTTP status code. Optionally a body with additional details might be returned as illustrated in this[ example](https://docs.spring.io/spring-boot/api/rest/actuator/health.html). -2. **Observability- Telemetry**: Network participants may implement mechanisms to monitor different aspects of execution from an observability standpoint. If implemented, it should follow the[ Opentelemetry convention](https://opentelemetry.io/). - - -#### Logging - - - -1. All Beckn messages that are sent or received by the Network Participant must be logged. This is recommended for dispute resolution, auditing and troubleshooting. This log should be stored in permanent storage for duration as might be required for potential dispute resolutions at the business level. - - -#### Configuration - - - -1. **Location**: Software must allow location to be set (Country - City). This value must be used when required in the various messages. -2. **Port**: Software should allow configuration of the port where it hosts its application server(endpoints). This allows flexibility in deployment. - - -### Requirements for BAP mode - - -#### Common Requirements - - - -1. All the requirements under the[ ](https://fide-official.atlassian.net/wiki/spaces/BBB/pages/edit-v2/572653580#Requirements-for-all-network-participants)“Requirements for all modes” section apply to the BAP mode. - - -#### Authentication - Key verification - - - -1. In addition to the Authentication requirements specified in the “Requirements for all modes” section, an on_subscribe endpoint must be made available for the registry to verify the public-key set there. The details are documented[ here](https://github.com/beckn/protocol-specifications/blob/master/api/registry/build/registry.yaml). - - -#### DOFP functionality - - - -1. The software operating in the BAP mode must facilitate the consumer side of the commerce transaction workflow including all the four stages of Discovery, Order, Fulfillment and Post fulfillment as described [here](https://developers.becknprotocol.io/docs/introduction/beckn-protocol-specification/). The mandatory parts of these requirements are listed below and tagged as “Transaction API”. -2. The software should implement or facilitate integration with additional business requirements associated with the transaction relevant to the consumer. - - -#### Sending Request (Transaction API) - - - -1. In BAP mode the software must be able to send the following Transaction APIs (all POST messages) to the Beckn Network (by calling the below endpoints on the BPP or the Gateway (for search). These APIs are part of transaction workflow covering all the four stages of Discovery, Order, Fulfillment and Post fulfillment. The format of the outgoing request is detailed[ here](https://github.com/beckn/protocol-specifications/blob/master/api/transaction/build/transaction.yaml). The endpoints to call and the contents of the payload that need to be sent are: - 1. search - search for product or service - 2. select - send cart - 3. init - initialize draft order - 4. confirm - confirm order - 5. status - get active order - 6. track - track order - 7. cancel - cancel order - 8. update - update order - 9. rating - provide rating - 10. support - get support contact details - - -#### Layer 2 Configuration (Transaction API) - - - -1. Software must ensure that outgoing requests and incoming responses (described below) are compliant with **Layer 2** **configuration** rules as required by the network. The Layer 2 Config file to be used must be decided based on the context of the message (e.g. using the domain and version fields). In case no Layer 2 config file is found for a message, the software must use the matching version of[ Beckn Core Transaction API Specification](https://github.com/beckn/protocol-specifications/blob/master/api/transaction/build/transaction.yaml) to validate the messages. - - -#### Core spec compatibility (Transaction API) - - - -1. The description of the content of the messages provided in the[ Beckn Core Transaction API Spec](https://github.com/beckn/protocol-specifications/blob/master/api/transaction/build/transaction.yaml) must be followed by the software. Some of these attributes which have significant functionality attached, are described below. The[ Beckn Core Spec](https://github.com/beckn/protocol-specifications/blob/master/api/transaction/build/transaction.yaml) should be referred to for authoritative descriptions on all attributes. - - -#### Handling synchronous response (Transaction API) - - - -1. Receivers of Beckn messages will respond back to API calls with ACK(success) / NACK(failure) as described[ here](https://github.com/beckn/protocol-specifications/blob/master/docs/BECKN-003-Beckn-Protocol-Communication-Draft-01.md). The software must handle these suitably with graceful degradation and appropriate handling for failure messages. - - -#### Listening to responses (Transaction API) - - - -1. The software in BAP mode must implement the following endpoints (all POST) at its subscriber_url. The formats of the incoming responses are documented[ here](https://github.com/beckn/protocol-specifications/blob/master/api/transaction/build/transaction.yaml). The endpoints and the content of the payloads are: - 1. on_search - catalog response to a search request - 2. on_select - quote for cart/order sent in select - 3. on_init - draft order with payment terms - 4. on_confirm - confirmation of order created - 5. on_status - status of requested order - 6. on_track - tracking details of requested order - 7. on_update - updated order - 8. on_cancel - canceled order - 9. on_rating - acknowledgement for rating - 10. on_support - requested support information - - -#### Acknowledging responses (Transaction API) - - - -1. The software must validate the response with the appropriate Layer 2 config file and acknowledge the response with an ACK(success) or NACK(failure) as described[ here](https://github.com/beckn/protocol-specifications/blob/master/docs/BECKN-003-Beckn-Protocol-Communication-Draft-01.md). Appropriate business logic may be triggered after this acknowledgement is sent to the sender. - - -#### Client side interface (Transaction API) - - - -1. While the entire request-response process in Beckn is asynchronous, the software in BAP mode may wrap this up to provide a synchronous API to the caller.(optional) - - -#### Context (Transaction API) - - - -1. The software must refer to the[ Beckn Core Transaction API](https://github.com/beckn/protocol-specifications/blob/master/api/transaction/build/transaction.yaml) for the meaning of the context attributes and their usage. Some of attributes that have a major impact on functionality are listed here. - 1. **message_id**: The software should generate and use a new message_id for every new interaction. This message_id is guaranteed to be intact in all corresponding asynchronous responses. - 2. **transaction_id**: The software may use the transaction_id across messages (search, select… confirm) to act as a proxy for a user session. The transaction_id is guaranteed to be returned intact in all corresponding asynchronous responses. - 3. **bap_id**: The software in the BAP mode must fill its own subscriber_id here. - 4. **bap_uri**: The software in the BAP mode must fill its own subscriber_url here. - 5. **bpp_id**: When sending peer-to-peer messages (all Transaction API except search) as well as to send search message only to one BPP, target BPP subscriber id must be sent in this field. - 6. **bpp_uri**: When sending peer-to-peer messages (all Transaction API except search) as well as to send search message only to one BPP, target BPP subscriber URL must be sent in this field. - 7. **ttl**: This defines the amount of time the request is considered active to correlate responses. Any responses for this request after this ttl must be dropped. - - -#### Error handling (Transaction API) - - - -1. In case of error during the processing of requests, the BPP will return back error responses. The format of the error messages is defined in the Beckn Core Transaction Specification. The code to be used is specified in[ Error codes for BPP](https://github.com/beckn/protocol-specifications/blob/master/docs/BECKN-005-Error-Codes-Draft-01.md). These should be gracefully handled on the BAP. - - -#### XInput (Transaction API) - - - -1. When the BPP needs more information from the consumer, it may use the XInput facility to redirect the user to a BPP defined form. The software in BAP mode should respect this request and the implementation should be as described in[ The XInput Schema](https://github.com/beckn/protocol-specifications/blob/master/docs/BECKN-007-The-XInput-Schema.md). - - -#### Meta API - Fetching information - - - -1. BPPs expose meta APIs to provide metadata that may be useful to the BAP in its user interaction. The BAP may call these meta APIs as required. These meta APIs are described[ here](https://github.com/beckn/protocol-specifications/blob/master/api/meta/build/meta.yaml) - - -### Requirements for BPP Mode - - -#### Common Requirements - - - -1. All the requirements under the[ ](https://fide-official.atlassian.net/wiki/spaces/BBB/pages/edit-v2/572653580#Requirements-for-all-network-participants)“Requirements for all modes” section apply to the BPP mode. - - -#### Authentication - Key verification - - - -1. In addition to the Authentication requirements specified in the “Requirements for all modes” section, an on_subscribe endpoint must be made available for the registry to verify the public-key set there. The details are documented[ here](https://github.com/beckn/protocol-specifications/blob/master/api/registry/build/registry.yaml). - - -#### Authentication - Verification - Gateway - - - -1. In addition to the Authentication-Verification requirements specified in the “Requirements for all modes” section, when the software in BPP mode receives a search message from the Gateway, there is an additional Proxy verification that must be done to ensure the message is sent by a valid Gateway and is not tampered. This involves lookup of the Gateway public key and is documented[ here](https://github.com/beckn/protocol-specifications/blob/master/docs/BECKN-006-Signing-Beckn-APIs-In-HTTP-Draft-01.md) - - -#### DOFP functionality - - - -1. The software operating in the BPP mode must facilitate the provider side of the commerce transaction workflow including all the four stages of Discovery, Order, Fulfillment and Post fulfillment as described [here](https://developers.becknprotocol.io/docs/introduction/beckn-protocol-specification/). The mandatory parts of these requirements are listed below and tagged as “Transaction API”. -2. The software should implement or facilitate integration with additional business requirements associated with the transaction relevant to the provider. - - -#### Listening to Requests (Transaction API) - - - -1. Software in BPP mode must implement the following endpoints (all POST) at the subscriber_url. These APIs are part of the transaction workflow covering all the four stages of Discovery, Order, Fulfillment and Post fulfillment. The format of the incoming requests is detailed[ here](https://github.com/beckn/protocol-specifications/blob/master/api/transaction/build/transaction.yaml). The endpoints and the contents of the payloads are: - 1. search - search intent for product or service - 2. select - user’s cart or built order - 3. init - draft order from user - 4. confirm - order confirmation from user - 5. status - request for order status - 6. track - request for tracking url for order - 7. cancel - request for order cancellation - 8. update - request for order update - 9. rating - user rating - 10. support - request for support contact details - - -#### Layer 2 Configuration (Transaction API) - - - -1. Software must ensure that incoming requests and outgoing responses (described below) are compliant with **Layer 2** **configuration** rules as required by the network. The Layer 2 Config file to be used must be decided based on the context of the message (e.g. using the domain and version fields). In case no Layer 2 config file is found for a message, the software must use the matching core version of[ Beckn Core Transaction API Specification](https://github.com/beckn/protocol-specifications/blob/master/api/transaction/build/transaction.yaml) to validate the messages. - - -#### Core spec compatibility (Transaction API) - - - -1. The description of the content of the messages provided in the[ Beckn Core Transaction API Spec](https://github.com/beckn/protocol-specifications/blob/master/api/transaction/build/transaction.yaml) should be followed by the software. Some of these attributes which have significant functionality attached, are described below. The[ Beckn Core Spec](https://github.com/beckn/protocol-specifications/blob/master/api/transaction/build/transaction.yaml) should be referred to for authoritative descriptions on all attributes. - - -#### Acknowledging request (Transaction API) - - - -1. The software must validate the incoming request for syntax and acknowledge with a success or failure (ACK/NACK) as described[ here](https://github.com/beckn/protocol-specifications/blob/master/docs/BECKN-003-Beckn-Protocol-Communication-Draft-01.md). Essentially an ACK means that the software will send a response in due course. The format of the incoming messages must be verified using the Layer 2 Config file as described above. - - -#### Sending Responses (Transaction API) - - - -1. After the software acknowledges the request, it may trigger business logic to process the request. If the acknowledgement was an ACK, the software must respond back with a response. The format of the response must be valid against the Layer 2 Config file. The software should send a response (by calling these endpoints on the BAP subscriber url) from the following corresponding to the request (on_search for search, on_select for select etc). The endpoints to call and the required payload contents are: - 1. on_search - search result catalog - 2. on_select - quote for cart/order sent in select - 3. on_init - draft order with payment terms - 4. on_confirm - confirmation of order created - 5. on_status - status of requested order - 6. on_track - tracking details of requested order - 7. on_update - updated order - 8. on_cancel - canceled order - 9. on_rating - acknowledgement for rating - 10. on_support - requested support information - - -#### Handling response acknowledgements (Transaction API) - - - -1. The recipient of the responses will send back an acknowledgement as described[ here](https://github.com/beckn/protocol-specifications/blob/master/docs/BECKN-003-Beckn-Protocol-Communication-Draft-01.md). The software should suitably handle the failure cases (NACK). - - -#### Context (Transaction API) - - - -1. The software must refer to[ Beckn Core Transaction API](https://github.com/beckn/protocol-specifications/blob/master/api/transaction/build/transaction.yaml) for the meaning of the context attributes and their usage. Some of attributes that have a major impact on functionality are listed here. - 1. **message_id**: The software in BPP mode must return the message_id unaltered in the corresponding response. For example the on_select of a select message should have the same message_id as the select message. If the software is sending a on_xxxxx message without a corresponding request (e.g. on_status on change of order status), then it must use a new message_id - 2. **transaction_id**: The software in BPP mode must send back the transaction_id unaltered in the corresponding response. - 3. **bap_id**: The software in BPP mode must send back the bap_id unaltered in the corresponding response. - 4. **bap_uri**: The software in BPP mode must send back the bap_uri unaltered in the corresponding response. - 5. **bpp_id**: The software in BPP mode must fill in this attribute with its own subscriber id. - 6. **bpp_uri**: The software in BPP mode must fill in this attribute with its own subscriber url. - 7. **ttl**: This defines the amount of time the message is considered active to correlate responses. Any responses for this message after this ttl must be dropped. - - -#### Responses without corresponding requests - - - -1. In certain use cases such as order status update, the software in BPP mode may send an on_xxxx (e.g. on_status) message to the BAP. The software in BPP mode must use a new message_id. - - -#### XInput (Transaction API) - - - -1. When the BPP needs more information from the consumer, it may use the XInput facility to redirect the user to a BPP defined form. The implementation should be as described in[ The XInput Schema](https://github.com/beckn/protocol-specifications/blob/master/docs/BECKN-007-The-XInput-Schema.md). - - -#### Error handling (Transaction API) - - - -1. In case of error during the processing of requests, the BPP must return back error responses. The format of the error messages is defined in the Beckn Core Transaction Specification. The codes to be used is specified in[ Error codes for BPP](https://github.com/beckn/protocol-specifications/blob/master/docs/BECKN-005-Error-Codes-Draft-01.md) - - -#### Meta API - Listening and returning data - - - -1. The software in BPP mode must implement Meta API as described[ here](https://github.com/beckn/protocol-specifications/blob/master/api/meta/build/meta.yaml). These may be used by the BAP to assist in user interaction. - - -### Requirements for Registry mode - - -#### Common Requirements - - - -1. All the requirements under the[ ](https://fide-official.atlassian.net/wiki/spaces/BBB/pages/edit-v2/572653580#Requirements-for-all-network-participants)“Requirements for all modes” section apply to the Registry mode. - - -#### Registration of Network Participants - - - -1. Software in registry mode should allow Network Participant to register itself with a Subscriber ID and Subscriber URL -2. **Approval**: Software in registry mode may have approval criteria for registrants. Once the criteria are met, the registrants may be considered as subscribers as described[ here](https://developers.becknprotocol.io/docs/introduction/the-registry-infrastructure/). -3. **Ownership**: Software in registry mode must allow organizations / users that register Network Participants to own and have rights to modify their network roles and participant keys. It must not allow a user to change other user’s network participant details. - - -#### Subscription of Network Participants - - - -1. Software in registry mode must allow subscribers to create and alter their details including domain, role, location etc as described in[ Subscription](https://github.com/beckn/protocol-specifications/blob/master/schema/Subscription.yaml) and[ Subscriber](https://github.com/beckn/protocol-specifications/blob/master/schema/Subscriber.yaml) objects through the subscribe endpoint described below. - - -#### Network Participant - Keys - - - -1. Software in registry mode must allow public key associated with network participants to be changed through the subscribe endpoint described below. - - -#### Subscribe (Registry API) - - - -1. Software in registry mode must support the modification of subscriber information through the subscribe endpoint as described in[ Beckn Protocol Registry Infrastructure API](https://github.com/beckn/protocol-specifications/blob/master/api/registry/build/registry.yaml). It must support automatic verification of changed information through the call to on_subscribe as described in the API document. - - -#### Lookup (Registry API) - - - -1. Software in registry mode must support the lookup of Subscriber information through the lookup endpoint as described in[ Beckn Protocol Registry Infrastructure API](https://github.com/beckn/protocol-specifications/blob/master/api/registry/build/registry.yaml). The lookup is a synchronous API call and must return its result in the response. It must support the following while it may support filtering by the rest of the parameters in[ subscriber](https://github.com/beckn/protocol-specifications/blob/master/schema/Subscriber.yaml) and[ subscription](https://github.com/beckn/protocol-specifications/blob/master/schema/Subscription.yaml) objects. - 1. lookup by subscriber_id and key_id - 2. lookup by domain and type - - -#### Logging - Public key changes - - - -1. All public key changes of the network participants must be logged and stored for extended duration. This is required for dispute resolutions at the trust layer. - - -#### Merging two networks - - - -1. It should be possible to copy the network participant information present in the registry in bulk from one registry to another. - - -### Requirements for Gateway mode - - -#### Common Requirements - - - -1. All the requirements under the[ ](https://fide-official.atlassian.net/wiki/spaces/BBB/pages/edit-v2/572653580#Requirements-for-all-network-participants)“Requirements for all modes” section apply to the BAP mode. - - -#### Authentication - Key verification - - - -1. In addition to the Authentication-Key-Pair general requirement for all modes, an on_subscribe endpoint must be made available for the registry to verify the public-key set there. The details are documented[ here](https://github.com/beckn/protocol-specifications/blob/master/api/registry/build/registry.yaml). - - -#### Authentication - Signing - - - -1. When the software in Gateway mode receives messages from the BAP to forward to the BPP, it must add its own signature and fill the X-Gateway-Authorization header. The process of hashing, signing and format of the header is documented[ here](https://github.com/beckn/protocol-specifications/blob/master/docs/BECKN-006-Signing-Beckn-APIs-In-HTTP-Draft-01.md). - - -#### Listening to search requests (Transaction API) - - - -1. The software in Gateway mode must expose the search endpoint at its Subscriber URL. The format of the message it receives is described[ here](https://github.com/beckn/protocol-specifications/blob/master/api/transaction/build/transaction.yaml). - - -#### Forwarding search (Transaction API) - - - -1. When the Gateway receives a search request from the BAP, it must do the following: - 1. Use the lookup API of the Registry to fetch the BPPs that cater to the context of the received message. - 2. Forward the search request (after signing as described above) to the list of BPPs returned by the Registry. - - -#### Caching (Transaction API) - - - -1. The software in Gateway mode should implement short term cache to reduce the load on the Registry lookup - - -## Non-Functional Requirements - - -### Performance - -The system should be engineered to deliver optimal performance, ensuring quick and responsive interactions under various operating conditions. It should efficiently utilize resources to maintain a consistent user experience, even during periods of peak usage. - - -### Scalability - -The system's architecture should support seamless scalability, enabling it to handle increased workloads and user demand with minimal effort. Both horizontal and vertical scaling strategies should be considered to ensure the system can grow alongside the needs of the business. - -Every new network Participant in the Beckn network could potentially bring in a large amount of consumers or providers. The software should be designed to be scalable with respect to number of parallel requests being processed as well as latency. - -The lookup API of the software in registry mode might potentially be called multiple times in a single message flow. It should be highly scalable and have low latency. - -In the gateway mode, the software should be scalable with respect to the total time it takes to forward a search as the number of search requests and the number of BPPs increase. - - -### Reliability and Availability - -The software should be designed for high reliability, incorporating redundancy and fault-tolerant mechanisms to minimize downtime. It should maintain continuous availability, even in the event of hardware or software failures, ensuring users have consistent access to services. - - -### Usability - -The software should be intuitive and user-friendly, allowing users to complete tasks efficiently with minimal learning curve. The design should adhere to best practices in usability and accessibility, providing a positive experience for all users, including those with varying abilities. - - -# Appendices - - -## APIs and Schemas - -The API and schemas specification can be found here: - -[https://github.com/beckn/protocol-specifications](https://github.com/beckn/protocol-specifications) - -The APIs can be browsed here: - -[https://beckn.github.io/beckn-onix/swagger/index.html](https://beckn.github.io/beckn-onix/swagger/index.html) - - -## References - - - -1. [Beckn Core Transaction Specification](https://github.com/beckn/protocol-specifications/blob/master/api/transaction/build/transaction.yaml) -2. [Beckn Core Registry Specification](https://github.com/beckn/protocol-specifications/blob/master/api/registry/build/registry.yaml) -3. [Beckn Protocol Meta API](https://github.com/beckn/protocol-specifications/blob/master/api/meta/build/meta.yaml) -4. [Signing Beckn APIs in HTTP](https://github.com/beckn/protocol-specifications/blob/master/docs/BECKN-006-Signing-Beckn-APIs-In-HTTP-Draft-01.md) -5. [Beckn Protocol Communication](https://github.com/beckn/protocol-specifications/blob/master/docs/BECKN-003-Beckn-Protocol-Communication-Draft-01.md) -6. [The XInput Schema](https://github.com/beckn/protocol-specifications/blob/master/docs/BECKN-007-The-XInput-Schema.md) -7. [Error codes for BPP](https://github.com/beckn/protocol-specifications/blob/master/docs/BECKN-005-Error-Codes-Draft-01.md) diff --git a/specification/specification.yaml b/specification/specification.yaml deleted file mode 100644 index 17e8218..0000000 --- a/specification/specification.yaml +++ /dev/null @@ -1,2948 +0,0 @@ -openapi: 3.1.0 -info: - title: Beckn-ONIX Specification - description: Transaction Layer APIs for Beckn-ONIX Specification. - version: "0.1" -servers: - - url: https://ps-bap-client.becknprotocol.io - description: BOC Network - -paths: - /search: - post: - tags: - - Beckn Provider Platform(BPP) - - Beckn Gateway (BG) - description: Consumer Interface declares the customer's intent to buy/avail products or services - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - search - message: - type: object - properties: - intent: - $ref: "#/components/schemas/Intent" - required: - - context - - message - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /select: - post: - tags: - - Beckn Provider Platform(BPP) - description: Consumer Interface declares the customer's cart (or equivalent) created by selecting objects from the catalog - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - select - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /init: - post: - tags: - - Beckn Provider Platform(BPP) - description: Initialize an order by providing billing and/or shipping details - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - init - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /confirm: - post: - tags: - - Beckn Provider Platform(BPP) - description: Initialize an order by providing billing and/or shipping details - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - confirm - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - required: - - context - - message - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /status: - post: - tags: - - Beckn Provider Platform(BPP) - description: Fetch the latest order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - status - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - required: - - order_id - required: - - context - - message - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /track: - post: - tags: - - Beckn Provider Platform(BPP) - description: Track an active order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - track - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - callback_url: - type: string - format: uri - required: - - order_id - required: - - context - - message - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /cancel: - post: - tags: - - Beckn Provider Platform(BPP) - description: Cancel an order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - cancel - required: - - action - message: - type: object - properties: - order_id: - $ref: "#/components/schemas/Order/properties/id" - cancellation_reason_id: - $ref: "#/components/schemas/Option/properties/id" - descriptor: - $ref: "#/components/schemas/Descriptor" - required: - - order_id - required: - - context - - message - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /update: - post: - tags: - - Beckn Provider Platform(BPP) - description: Remove object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - update - required: - - action - message: - type: object - properties: - update_target: - description: 'Comma separated values of order objects being updated. For example: ```"update_target":"item,billing,fulfillment"```' - type: string - order: - description: Updated order object - allOf: - - $ref: "#/components/schemas/Order" - required: - - update_target - - order - required: - - context - - message - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /rating: - post: - tags: - - Beckn Provider Platform(BPP) - description: Provide feedback on a service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - rating - required: - - action - message: - type: object - properties: - ratings: - type: array - items: - $ref: "#/components/schemas/Rating" - required: - - context - - message - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /support: - post: - tags: - - Beckn Provider Platform(BPP) - description: Fetch support information - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - support - required: - - action - message: - type: object - properties: - support: - $ref: "#/components/schemas/Support" - required: - - context - - message - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /get_cancellation_reasons: - post: - tags: - - Beckn Provider Platform(BPP) - description: BAP fetches the list of cancellation reasons from BPP - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: '#/components/schemas/Context' - - properties: - action: - enum: - - get_cancellation_reasons - required: - - action - required: - - context - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /get_return_reasons: - post: - tags: - - Beckn Provider Platform(BPP) - description: BAP requests BPP to provide the list of return reasons - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: '#/components/schemas/Context' - - properties: - action: - enum: - - get_return_reasons - required: - - action - required: - - context - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /get_rating_categories: - post: - tags: - - Beckn Provider Platform(BPP) - description: BAP requests BPP to provide the list of entities that can be rated on its system - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: '#/components/schemas/Context' - - properties: - action: - enum: - - get_rating_categories - required: - - action - required: - - context - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /on_search: - post: - tags: - - Beckn Application Platform(BAP) - description: Provider Platform sends its catalog in response to a search request. - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_search - required: - - action - message: - type: object - properties: - catalog: - $ref: "#/components/schemas/Catalog" - required: - - catalog - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_select: - post: - tags: - - Beckn Application Platform(BAP) - description: Send draft order object with quoted price for selected items - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_select - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_init: - post: - tags: - - Beckn Application Platform(BAP) - description: Send order object with payment details updated - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_init - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_confirm: - post: - tags: - - Beckn Application Platform(BAP) - description: Send active order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_confirm - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_track: - post: - tags: - - Beckn Application Platform(BAP) - description: Send tracking details of an active order - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_track - required: - - action - message: - type: object - properties: - tracking: - $ref: "#/components/schemas/Tracking" - required: - - tracking - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_cancel: - post: - tags: - - Beckn Application Platform(BAP) - description: Send cancellation request_id with reasons list in case of cancellation request. Else send cancelled order object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_cancel - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_update: - post: - tags: - - Beckn Application Platform(BAP) - description: Returns updated service with updated runtime object - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_update - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_status: - post: - tags: - - Beckn Application Platform(BAP) - description: Fetch the status of a Service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_status - required: - - action - message: - type: object - properties: - order: - $ref: "#/components/schemas/Order" - required: - - order - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_rating: - post: - tags: - - Beckn Application Platform(BAP) - description: Provide feedback on a service - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_rating - required: - - action - message: - type: object - properties: - feedback_form: - description: A feedback form to allow the user to provide additional information on the rating provided - allOf: - - $ref: "#/components/schemas/XInput" - error: - $ref: "#/components/schemas/Error" - required: - - context - - message - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /on_support: - post: - tags: - - Beckn Application Platform(BAP) - description: Contact Support - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: "#/components/schemas/Context" - - properties: - action: - enum: - - on_support - required: - - action - message: - type: object - properties: - support: - $ref: "#/components/schemas/Support" - error: - $ref: "#/components/schemas/Error" - required: - - context - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /return_reasons: - post: - tags: - - Beckn Application Platform(BAP) - description: BPP provides the list of return reasons to the BAP - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: '#/components/schemas/Context' - - properties: - action: - enum: - - return_reasons - required: - - action - message: - type: object - properties: - return_reasons: - type: array - items: - $ref: '#/components/schemas/Option' - required: - - return_reasons - required: - - context - - message - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /rating_categories: - post: - tags: - - Beckn Application Platform(BAP) - description: BPP provides the list of entities that can be rated in its system to the BAP - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: '#/components/schemas/Context' - - properties: - action: - enum: - - rating_categories - required: - - action - message: - type: object - properties: - rating_categories: - type: array - items: - $ref: '#/components/schemas/Rating/properties/rating_category' - required: - - return_reasons - required: - - context - - message - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - /cancellation_reasons: - post: - tags: - - Beckn Application Platform(BAP) - description: BPP sends cancellation reasons to BAP - requestBody: - content: - application/json: - schema: - type: object - properties: - context: - allOf: - - $ref: '#/components/schemas/Context' - - properties: - action: - enum: - - cancellation_reasons - required: - - action - message: - type: object - properties: - cancellation_reasons: - type: array - items: - $ref: '#/components/schemas/Option' - required: - - cancellation_reasons - required: - - context - - message - responses: - default: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - properties: - message: - type: object - properties: - ack: - $ref: "#/components/schemas/Ack" - required: - - ack - error: - $ref: "#/components/schemas/Error" - required: - - message - - /lookup: - description: Look up platforms listed on the network registry. This is a protected endpoint only accessible to network participants that have subscribed to the network (i.e Subscribers). Any subscriber can query the Registry by sending a `Lookup` object. The Registry will respond with all the platforms that match the lookup parameters. - post: - tags: - - Registry - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/Subscription' - responses: - default: - description: Array of subscribers matching the lookup request attributes - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/Subscription' - /subscribe: - description: 'Subscribe to a network. This endpoint allows registered network participants (a.k.a Subscribers), to update their subscription details like `domain`, `location`, `signing_public_key`, `encr_public_key` on the registry. The fields that can be updated can vary from network to network. Every network policy must contain the fields that can be updated for each type of subscriber. For example, the network policy may allow BAPs and BPPs to update all fields, but BGs may not be allowed to update any field except the public keys.' - post: - tags: - - Registry - requestBody: - content: - application/json: - schema: - allOf: - - $ref: '#/components/schemas/Subscription' - - properties: - nonce: - description: A randomly generated uuid nonce value - type: string - format: uuid - responses: - default: - description: The Registry returns the status of the subscription request. - content: - application/json: - schema: - type: object - properties: - status: - type: string - enum: - - UNDER_SUBSCRIPTION - /on_subscribe: - description: 'This endpoint is implemented by all platforms that have successfully passed the certification and compliance requirements on a network. In this endpoint, the Subscriber receives an encrypted challenge string generated by the Registry to verify the subscription details of the Network Participant sent during the `subscribe` call. During this call, Registry also validates the SSL certificate of Subscriber. If the SSL certificate is invalid, the Registry will update the subscriber’s status = INVALID_SSL and call the Subscriber''s `on_subscribe` endpoint again. Anytime the state of the Subscriber changes in the registry, the Registry can make an unsolicited call to the subscriber''s `on_subscribe` endpoint. This request must be digitally signed by the Registry. The Registry''s public key must be published at a publicly accessible trusted location so that the Subscribers can save it on their systems.' - post: - tags: - - Beckn Provider Platform(BPP) - - Beckn Application Platform(BAP) - - Beckn Gateway (BG) - requestBody: - content: - application/json: - schema: - type: object - properties: - status: - description: The current status of the Registrant - type: string - enum: - - INITIATED - - UNDER_SUBSCRIPTION - - SUBSCRIBED - - INVALID_SSL - - UNSUBSCRIBED - challenge: - type: string - description: A random string generated by the registry encrypted with the subscriber's encryption public key - required: - - challenge - responses: - default: - description: Network Participant decrypts the challenge string using its private key and returns the decrypted value. - content: - application/json: - schema: - type: object - properties: - answer: - description: Decrypted challenge string - type: string - required: - - answer - - -components: - schemas: - Ack: - description: "Describes the acknowledgement sent in response to an API call. If the implementation uses HTTP/S, then Ack must be returned in the same session. Every API call to a Provider Platform must be responded to with an Ack whether the Provider Platform intends to respond with a callback or not. This has one property called `status` that indicates the status of the Acknowledgement." - type: object - properties: - status: - type: string - description: "The status of the acknowledgement. If the request passes the validation criteria of the Provider Platform, then this is set to ACK. If a Provider Platform responds with status = `ACK` to a request, it is required to respond with a callback. If the request fails the validation criteria, then this is set to NACK. Additionally, if a Provider Platform does not intend to respond with a callback even after the request meets the validation criteria, it should set this value to `NACK`." - enum: - - ACK - - NACK - tags: - description: A list of tags containing any additional information sent along with the Acknowledgement. - type: array - items: - $ref: "#/components/schemas/TagGroup" - AddOn: - description: Describes an additional item offered as a value-addition to a product or service. This does not exist independently in a catalog and is always associated with an item. - type: object - properties: - id: - description: Provider-defined ID of the add-on - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - price: - $ref: "#/components/schemas/Price" - Address: - description: Describes a postal address. - type: string - Agent: - description: "Describes the direct performer, driver or executor that fulfills an order. It is usually a person. But in some rare cases, it could be a non-living entity like a drone, or a bot. Some examples of agents are Doctor in the healthcare sector, a driver in the mobility sector, or a delivery person in the logistics sector. This object can be set at any stage of the order lifecycle. This can be set at the discovery stage when the Provider Platform wants to provide details on the agent fulfilling the order, like in healthcare, where the doctor's name appears during search. This object can also used to search for a particular person that the customer wants fulfilling an order. Sometimes, this object gets instantiated after the order is confirmed, like in the case of on-demand taxis, where the driver is assigned after the user confirms the ride." - properties: - id: - type: string - person: - $ref: "#/components/schemas/Person" - contact: - $ref: "#/components/schemas/Contact" - organization: - $ref: "#/components/schemas/Organization" - rating: - $ref: "#/components/schemas/Rating/properties/value" - Authorization: - description: "Describes an authorization mechanism used to start or end the fulfillment of an order. For example, in the mobility sector, the driver may require a one-time password to initiate the ride. In the healthcare sector, a patient may need to provide a password to open a video conference link during a teleconsultation." - type: object - properties: - type: - description: Type of authorization mechanism used. The allowed values for this field can be published as part of the network policy. - type: string - token: - description: "Token used for authorization. This is typically generated at the Provider Platform. The Consumer Interface can send this value to the user via any channel that it uses to authenticate the user like SMS, Email, Push notification, or in-app rendering." - type: string - valid_from: - description: Timestamp in RFC3339 format from which token is valid - type: string - format: date-time - valid_to: - description: Timestamp in RFC3339 format until which token is valid - type: string - format: date-time - status: - description: Status of the token - type: string - Billing: - description: "Describes the billing details of an entity.
This has properties like name,organization,address,email,phone,time,tax_number, created_at,updated_at" - type: object - properties: - name: - description: Name of the billable entity - type: string - organization: - description: Details of the organization being billed. - allOf: - - $ref: "#/components/schemas/Organization" - address: - description: The address of the billable entity - allOf: - - $ref: "#/components/schemas/Address" - state: - description: The state where the billable entity resides. This is important for state-level tax calculation - allOf: - - $ref: "#/components/schemas/State" - city: - description: The city where the billable entity resides. - allOf: - - $ref: "#/components/schemas/City" - email: - description: Email address where the bill is sent to - type: string - format: email - phone: - description: Phone number of the billable entity - type: string - time: - description: Details regarding the billing period - allOf: - - $ref: "#/components/schemas/Time" - tax_id: - description: ID of the billable entity as recognized by the taxation authority - type: string - Cancellation: - description: Describes a cancellation event - type: object - properties: - time: - description: Date-time when the order was cancelled by the buyer - type: string - format: date-time - cancelled_by: - type: string - enum: - - CONSUMER - - PROVIDER - reason: - description: The reason for cancellation - allOf: - - $ref: "#/components/schemas/Option" - additional_description: - description: Any additional information regarding the nature of cancellation - allOf: - - $ref: "#/components/schemas/Descriptor" - CancellationTerm: - description: Describes the cancellation terms of an item or an order. This can be referenced at an item or order level. Item-level cancellation terms can override the terms at the order level. - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/FulfillmentState" - reason_required: - description: Indicates whether a reason is required to cancel the order - type: boolean - cancel_by: - description: Information related to the time of cancellation. - allOf: - - $ref: "#/components/schemas/Time" - cancellation_fee: - $ref: "#/components/schemas/Fee" - xinput: - $ref: "#/components/schemas/XInput" - external_ref: - $ref: "#/components/schemas/MediaFile" - Catalog: - description: "Describes the products or services offered by a Provider Platform. This is typically sent as the response to a search intent from a Consumer Interface. The payment terms, offers and terms of fulfillment supported by the Provider Platform can also be included here. The Provider Platform can show hierarchical nature of products/services in its catalog using the parent_category_id in categories. The Provider Platform can also send a ttl (time to live) in the context which is the duration for which a Consumer Interface can cache the catalog and use the cached catalog.
This has properties like bbp/descriptor,bbp/categories,bbp/fulfillments,bbp/payments,bbp/offers,bbp/providers and exp
This is used in the following situations.
  • This is typically used in the discovery stage when the Provider Platform sends the details of the products and services it offers as response to a search intent from the Consumer Interface.
" - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - fulfillments: - description: Fulfillment modes offered at the Provider Platform level. This is used when a Provider Platform itself offers fulfillments on behalf of the providers it has onboarded. - type: array - items: - $ref: "#/components/schemas/Fulfillment" - payments: - description: Payment terms offered by the Provider Platform for all transactions. This can be overriden at the provider level. - type: array - items: - $ref: "#/components/schemas/Payment" - offers: - description: Offers at the Provider Platform-level. This is common across all providers onboarded by the Provider Platform. - type: array - items: - $ref: "#/components/schemas/Offer" - providers: - type: array - items: - $ref: "#/components/schemas/Provider" - exp: - description: Timestamp after which catalog will expire - type: string - format: date-time - ttl: - description: Duration in seconds after which this catalog will expire - type: string - Category: - description: A label under which a collection of items can be grouped. - type: object - properties: - id: - description: ID of the category - type: string - parent_category_id: - $ref: "#/components/schemas/Category/properties/id" - descriptor: - $ref: "#/components/schemas/Descriptor" - time: - $ref: "#/components/schemas/Time" - ttl: - description: Time to live for an instance of this schema - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Circle: - description: Describes a circular region of a specified radius centered at a specified GPS coordinate. - type: object - properties: - gps: - $ref: "#/components/schemas/Gps" - radius: - $ref: "#/components/schemas/Scalar" - City: - description: Describes a city - type: object - properties: - name: - description: Name of the city - type: string - code: - description: City code - type: string - Contact: - description: Describes the contact information of an entity - type: object - properties: - phone: - type: string - email: - type: string - jcard: - type: object - description: A Jcard object as per draft-ietf-jcardcal-jcard-03 specification - Context: - description: "Every API call in beckn protocol has a context. It provides a high-level overview to the receiver about the nature of the intended transaction. Typically, it is the Consumer Interface that sets the transaction context based on the consumer's location and action on their UI. But sometimes, during unsolicited callbacks, the Provider Platform also sets the transaction context but it is usually the same as the context of a previous full-cycle, request-callback interaction between the Consumer Interface and the Provider Platform. The context object contains four types of fields.
  1. Demographic information about the transaction using fields like `domain`, `country`, and `region`.
  2. Addressing details like the sending and receiving platform's ID and API URL.
  3. Interoperability information like the protocol version that implemented by the sender and,
  4. Transaction details like the method being called at the receiver's endpoint, the transaction_id that represents an end-to-end user session at the Consumer Interface, a message ID to pair requests with callbacks, a timestamp to capture sending times, a ttl to specifiy the validity of the request, and a key to encrypt information if necessary.
This object must be passed in every interaction between a Consumer Interface and a Provider Platform. In HTTP/S implementations, it is not necessary to send the context during the synchronous response. However, in asynchronous protocols, the context must be sent during all interactions," - type: object - properties: - domain: - description: Domain code that is relevant to this transaction context - allOf: - - $ref: "#/components/schemas/Domain/properties/code" - location: - description: The location where the transaction is intended to be fulfilled. - allOf: - - $ref: "#/components/schemas/Location" - action: - description: The Beckn protocol method being called by the sender and executed at the receiver. - type: string - version: - type: string - description: Version of transaction protocol being used by the sender. - bap_id: - description: Subscriber ID of the Consumer Interface - allOf: - - description: "A globally unique identifier of the platform, Typically it is the fully qualified domain name (FQDN) of the platform." - type: string - bap_uri: - description: Subscriber URL of the Consumer Interface for accepting callbacks from Provider Platforms. - allOf: - - description: The callback URL of the Subscriber. This should necessarily contain the same domain name as set in `subscriber_id``. - type: string - format: uri - bpp_id: - description: Subscriber ID of the Provider Platform - allOf: - - $ref: "#/components/schemas/Context/properties/bap_id/allOf/0" - bpp_uri: - description: Subscriber URL of the Provider Platform for accepting calls from Consumer Interfaces. - allOf: - - $ref: "#/components/schemas/Context/properties/bap_uri/allOf/0" - transaction_id: - description: "This is a unique value which persists across all API calls from `search` through `confirm`. This is done to indicate an active user session across multiple requests. The Provider Platforms can use this value to push personalized recommendations, and dynamic offerings related to an ongoing transaction despite being unaware of the user active on the Consumer Interface." - type: string - format: uuid - message_id: - description: "This is a unique value which persists during a request / callback cycle. Since beckn protocol APIs are asynchronous, Consumer Interfaces need a common value to match an incoming callback from a Provider Platform to an earlier call. This value can also be used to ignore duplicate messages coming from the Provider Platform. It is recommended to generate a fresh message_id for every new interaction. When sending unsolicited callbacks, Provider Platforms must generate a new message_id." - type: string - format: uuid - timestamp: - description: Time of request generation in RFC3339 format - type: string - format: date-time - key: - description: The encryption public key of the sender - type: string - ttl: - description: The duration in ISO8601 format after timestamp for which this message holds valid - type: string - Country: - description: Describes a country - type: object - properties: - name: - type: string - description: Name of the country - code: - type: string - description: Country code as per ISO 3166-1 and ISO 3166-2 format - Credential: - description: Describes a credential of an entity - Person or Organization - type: object - properties: - id: - type: string - type: - type: string - default: VerifiableCredential - url: - description: URL of the credential - type: string - format: uri - Customer: - description: Describes a customer buying/availing a product or a service - type: object - properties: - person: - $ref: "#/components/schemas/Person" - contact: - $ref: "#/components/schemas/Contact" - DecimalValue: - description: Describes a numerical value in decimal form - type: string - pattern: "[+-]?([0-9]*[.])?[0-9]+" - Descriptor: - description: Physical description of something. - type: object - properties: - name: - type: string - code: - type: string - short_desc: - type: string - long_desc: - type: string - additional_desc: - type: object - properties: - url: - type: string - content_type: - type: string - enum: - - text/plain - - text/html - - application/json - media: - type: array - items: - $ref: "#/components/schemas/MediaFile" - images: - type: array - items: - $ref: "#/components/schemas/Image" - Domain: - description: "Described the industry sector or sub-sector. The network policy should contain codes for all the industry sectors supported by the network. Domains can be created in varying levels of granularity. The granularity of a domain can be decided by the participants of the network. Too broad domains will result in irrelevant search broadcast calls to Provider Platforms that don't have services supporting the domain. Too narrow domains will result in a large number of registry entries for each Provider Platform. It is recommended that network facilitators actively collaborate with various working groups and network participants to carefully choose domain codes keeping in mind relevance, performance, and opportunity cost. It is recommended that networks choose broad domains like mobility, logistics, healthcare etc, and progressively granularize them as and when the number of network participants for each domain grows large." - type: object - properties: - name: - description: Name of the domain - type: string - code: - description: "Standard code representing the domain. The standard is usually published as part of the network policy. Furthermore, the network facilitator should also provide a mechanism to provide the supported domains of a network." - additional_info: - description: A url that contains addtional information about that domain. - allOf: - - $ref: "#/components/schemas/MediaFile" - Duration: - description: Describes duration as per ISO8601 format - type: string - Error: - description: "Describes an error object that is returned by a Consumer Interface, Provider Platform or BG as a response or callback to an action by another network participant. This object is sent when any request received by a network participant is unacceptable. This object can be sent either during Ack or with the callback." - type: object - properties: - code: - type: string - description: 'Standard error code. For full list of error codes, refer to docs/protocol-drafts/BECKN-005-ERROR-CODES-DRAFT-01.md of this repo"' - paths: - type: string - description: Path to json schema generating the error. Used only during json schema validation errors - message: - type: string - description: Human readable message describing the error. Used mainly for logging. Not recommended to be shown to the user. - Fee: - description: A fee applied on a particular entity - type: object - properties: - percentage: - description: Percentage of a value - allOf: - - $ref: "#/components/schemas/DecimalValue" - amount: - description: A fixed value - allOf: - - $ref: "#/components/schemas/Price" - Form: - description: Describes a form - type: object - properties: - id: - type: string - description: ID of the form - url: - description: "The URL from where the form can be fetched. The content fetched from the url must be processed as per the mime_type specified in this object. Once fetched, the rendering platform can choosed to render the form as-is as an embeddable element; or process it further to blend with the theme of the application. In case the interface is non-visual, the the render can process the form data and reproduce it as per the standard specified in the form." - type: string - format: uri - data: - description: The form submission data - type: object - additionalProperties: - type: string - mime_type: - description: This field indicates the nature and format of the form received by querying the url. MIME types are defined and standardized in IETF's RFC 6838. - type: string - enum: - - text/html - - application/xml - submission_id: - type: string - format: uuid - Fulfillment: - description: Describes how a an order will be rendered/fulfilled to the end-customer - type: object - properties: - id: - description: Unique reference ID to the fulfillment of an order - type: string - type: - description: "A code that describes the mode of fulfillment. This is typically set when there are multiple ways an order can be fulfilled. For example, a retail order can be fulfilled either via store pickup or a home delivery. Similarly, a medical consultation can be provided either in-person or via tele-consultation. The network policy must publish standard fulfillment type codes for the different modes of fulfillment." - type: string - rateable: - description: Whether the fulfillment can be rated or not - type: boolean - rating: - description: The rating value of the fulfullment service. - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - state: - description: The current state of fulfillment. The Provider Platform must set this value whenever the state of the order fulfillment changes and fire an unsolicited `on_status` call. - allOf: - - $ref: "#/components/schemas/FulfillmentState" - tracking: - type: boolean - description: Indicates whether the fulfillment allows tracking - default: false - customer: - description: The person that will ultimately receive the order - allOf: - - $ref: "#/components/schemas/Customer" - agent: - description: The agent that is currently handling the fulfillment of the order - allOf: - - $ref: "#/components/schemas/Agent" - contact: - $ref: "#/components/schemas/Contact" - vehicle: - $ref: "#/components/schemas/Vehicle" - stops: - description: The list of logical stops encountered during the fulfillment of an order. - type: array - items: - $ref: "#/components/schemas/Stop" - path: - description: The physical path taken by the agent that can be rendered on a map. The allowed format of this property can be set by the network. - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - FulfillmentState: - description: Describes the state of fulfillment - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - updated_at: - type: string - format: date-time - updated_by: - type: string - description: ID of entity which changed the state - Gps: - description: Describes a GPS coordinate - type: string - pattern: '^[-+]?([1-8]?\d(\.\d+)?|90(\.0+)?),\s*[-+]?(180(\.0+)?|((1[0-7]\d)|([1-9]?\d))(\.\d+)?)$' - Image: - description: Describes an image - type: object - properties: - url: - description: URL to the image. This can be a data url or an remote url - type: string - format: uri - size_type: - description: The size of the image. The network policy can define the default dimensions of each type - type: string - enum: - - xs - - sm - - md - - lg - - xl - - custom - width: - description: Width of the image in pixels - type: string - height: - description: Height of the image in pixels - type: string - Intent: - description: "The intent to buy or avail a product or a service. The Consumer Interface can declare the intent of the consumer containing
  • What they want (A product, service, offer)
  • Who they want (A seller, service provider, agent etc)
  • Where they want it and where they want it from
  • When they want it (start and end time of fulfillment
  • How they want to pay for it

This has properties like descriptor,provider,fulfillment,payment,category,offer,item,tags
This is typically used by the Consumer Interface to send the purpose of the user's search to the Provider Platform. This will be used by the Provider Platform to find products or services it offers that may match the user's intent.
For example, in Mobility, the mobility consumer declares a mobility intent. In this case, the mobility consumer declares information that describes various aspects of their journey like,
  • Where would they like to begin their journey (intent.fulfillment.start.location)
  • Where would they like to end their journey (intent.fulfillment.end.location)
  • When would they like to begin their journey (intent.fulfillment.start.time)
  • When would they like to end their journey (intent.fulfillment.end.time)
  • Who is the transport service provider they would like to avail services from (intent.provider)
  • Who is traveling (This is not recommended in public networks) (intent.fulfillment.customer)
  • What kind of fare product would they like to purchase (intent.item)
  • What add-on services would they like to avail
  • What offers would they like to apply on their booking (intent.offer)
  • What category of services would they like to avail (intent.category)
  • What additional luggage are they carrying
  • How would they like to pay for their journey (intent.payment)

For example, in health domain, a consumer declares the intent for a lab booking the describes various aspects of their booking like,
  • Where would they like to get their scan/test done (intent.fulfillment.start.location)
  • When would they like to get their scan/test done (intent.fulfillment.start.time)
  • When would they like to get the results of their test/scan (intent.fulfillment.end.time)
  • Who is the service provider they would like to avail services from (intent.provider)
  • Who is getting the test/scan (intent.fulfillment.customer)
  • What kind of test/scan would they like to purchase (intent.item)
  • What category of services would they like to avail (intent.category)
  • How would they like to pay for their journey (intent.payment)
" - type: object - properties: - descriptor: - description: "A raw description of the search intent. Free text search strings, raw audio, etc can be sent in this object." - allOf: - - $ref: "#/components/schemas/Descriptor" - provider: - description: The provider from which the customer wants to place to the order from - allOf: - - $ref: "#/components/schemas/Provider" - fulfillment: - description: Details on how the customer wants their order fulfilled - allOf: - - $ref: "#/components/schemas/Fulfillment" - payment: - description: Details on how the customer wants to pay for the order - allOf: - - $ref: "#/components/schemas/Payment" - category: - description: Details on the item category - allOf: - - $ref: "#/components/schemas/Category" - offer: - description: details on the offer the customer wants to avail - allOf: - - $ref: "#/components/schemas/Offer" - item: - description: Details of the item that the consumer wants to order - allOf: - - $ref: "#/components/schemas/Item" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - ItemQuantity: - description: Describes the count or amount of an item - type: object - properties: - allocated: - description: This represents the exact quantity allocated for purchase of the item. - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - available: - description: This represents the exact quantity available for purchase of the item. The buyer can only purchase multiples of this - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - maximum: - description: This represents the maximum quantity allowed for purchase of the item - type: object - properties: - count: - type: integer - minimum: 1 - measure: - $ref: "#/components/schemas/Scalar" - minimum: - description: This represents the minimum quantity allowed for purchase of the item - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - selected: - description: This represents the quantity selected for purchase of the item - type: object - properties: - count: - type: integer - minimum: 0 - measure: - $ref: "#/components/schemas/Scalar" - unitized: - description: This represents the quantity available in a single unit of the item - type: object - properties: - count: - type: integer - minimum: 1 - maximum: 1 - measure: - $ref: "#/components/schemas/Scalar" - Item: - description: "Describes a product or a service offered to the end consumer by the provider. In the mobility sector, it can represent a fare product like one way journey. In the logistics sector, it can represent the delivery service offering. In the retail domain it can represent a product like a grocery item." - type: object - properties: - id: - description: ID of the item. - type: string - parent_item_id: - description: "ID of the item, this item is a variant of" - allOf: - - $ref: "#/components/schemas/Item/properties/id" - parent_item_quantity: - description: The number of units of the parent item this item is a multiple of - allOf: - - $ref: "#/components/schemas/ItemQuantity" - descriptor: - description: Physical description of the item - allOf: - - $ref: "#/components/schemas/Descriptor" - creator: - description: The creator of this item - allOf: - - $ref: "#/components/schemas/Organization" - price: - description: "The price of this item, if it has intrinsic value" - allOf: - - $ref: "#/components/schemas/Price" - quantity: - description: The selling quantity of the item - allOf: - - $ref: "#/components/schemas/ItemQuantity" - category_ids: - description: Categories this item can be listed under - type: array - items: - allOf: - - $ref: "#/components/schemas/Category/properties/id" - fulfillment_ids: - description: Modes through which this item can be fulfilled - type: array - items: - allOf: - - $ref: "#/components/schemas/Fulfillment/properties/id" - location_ids: - description: Provider Locations this item is available in - type: array - items: - allOf: - - $ref: "#/components/schemas/Location/properties/id" - payment_ids: - description: Payment modalities through which this item can be ordered - type: array - items: - allOf: - - $ref: "#/components/schemas/Payment/properties/id" - add_ons: - type: array - items: - $ref: "#/components/schemas/AddOn" - cancellation_terms: - description: Cancellation terms of this item - type: array - items: - $ref: "#/components/schemas/CancellationTerm" - refund_terms: - description: Refund terms of this item - type: array - items: - description: Refund term of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/State" - refund_eligible: - description: Indicates if cancellation will result in a refund - type: boolean - refund_within: - description: Time within which refund will be processed after successful cancellation. - allOf: - - $ref: "#/components/schemas/Time" - refund_amount: - $ref: "#/components/schemas/Price" - replacement_terms: - description: Terms that are applicable be met when this item is replaced - type: array - items: - $ref: "#/components/schemas/ReplacementTerm" - return_terms: - description: Terms that are applicable when this item is returned - type: array - items: - $ref: "#/components/schemas/ReturnTerm" - xinput: - description: Additional input required from the customer to purchase / avail this item - allOf: - - $ref: "#/components/schemas/XInput" - time: - description: Temporal attributes of this item. This property is used when the item exists on the catalog only for a limited period of time. - allOf: - - $ref: "#/components/schemas/Time" - rateable: - description: Whether this item can be rated - type: boolean - rating: - description: The rating of the item - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - matched: - description: Whether this item is an exact match of the request - type: boolean - related: - description: Whether this item is a related item to the exactly matched item - type: boolean - recommended: - description: Whether this item is a recommended item to a response - type: boolean - ttl: - description: Time to live in seconds for an instance of this schema - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Location: - description: The physical location of something - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - map_url: - description: The url to the map of the location. This can be a globally recognized map url or the one specified by the network policy. - type: string - format: uri - gps: - description: The GPS co-ordinates of this location. - allOf: - - $ref: "#/components/schemas/Gps" - address: - description: The address of this location. - allOf: - - $ref: "#/components/schemas/Address" - city: - description: "The city this location is, or is located within" - allOf: - - $ref: "#/components/schemas/City" - district: - description: "The state this location is, or is located within" - type: string - state: - description: "The state this location is, or is located within" - allOf: - - $ref: "#/components/schemas/State" - country: - description: "The country this location is, or is located within" - allOf: - - $ref: "#/components/schemas/Country" - area_code: - type: string - circle: - $ref: "#/components/schemas/Circle" - polygon: - description: The boundary polygon of this location - type: string - 3dspace: - description: The three dimensional region describing this location - type: string - rating: - description: The rating of this location - allOf: - - $ref: "#/components/schemas/Rating/properties/value" - MediaFile: - description: This object contains a url to a media file. - type: object - properties: - mimetype: - description: "indicates the nature and format of the document, file, or assortment of bytes. MIME types are defined and standardized in IETF's RFC 6838" - type: string - url: - description: The URL of the file - type: string - format: uri - signature: - description: The digital signature of the file signed by the sender - type: string - dsa: - description: The signing algorithm used by the sender - type: string - Offer: - description: An offer associated with a catalog. This is typically used to promote a particular product and enable more purchases. - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - location_ids: - type: array - items: - $ref: "#/components/schemas/Location/properties/id" - category_ids: - type: array - items: - $ref: "#/components/schemas/Category/properties/id" - item_ids: - type: array - items: - $ref: "#/components/schemas/Item/properties/id" - time: - $ref: "#/components/schemas/Time" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Option: - description: Describes a selectable option - type: object - properties: - id: - type: string - descriptor: - $ref: "#/components/schemas/Descriptor" - Order: - description: Describes a legal purchase order. It contains the complete details of the legal contract created between the buyer and the seller. - type: object - properties: - id: - type: string - description: Human-readable ID of the order. This is generated at the Provider Platform layer. The Provider Platform can either generate order id within its system or forward the order ID created at the provider level. - ref_order_ids: - description: A list of order IDs to link this order to previous orders. - type: array - items: - type: string - description: ID of a previous order - status: - description: Status of the order. Allowed values can be defined by the network policy - type: string - enum: - - ACTIVE - - COMPLETE - - CANCELLED - type: - description: "This is used to indicate the type of order being created to Provider Platforms. Sometimes orders can be linked to previous orders, like a replacement order in a retail domain. A follow-up consultation in healthcare domain. A single order part of a subscription order. The list of order types can be standardized at the network level." - type: string - default: DEFAULT - enum: - - DRAFT - - DEFAULT - provider: - description: Details of the provider whose catalog items have been selected. - allOf: - - $ref: "#/components/schemas/Provider" - items: - description: The items purchased / availed in this order - type: array - items: - $ref: "#/components/schemas/Item" - add_ons: - description: The add-ons purchased / availed in this order - type: array - items: - $ref: "#/components/schemas/AddOn" - offers: - description: The offers applied in this order - type: array - items: - $ref: "#/components/schemas/Offer" - billing: - description: The billing details of this order - allOf: - - $ref: "#/components/schemas/Billing" - fulfillments: - description: The fulfillments involved in completing this order - type: array - items: - $ref: "#/components/schemas/Fulfillment" - cancellation: - description: The cancellation details of this order - allOf: - - $ref: "#/components/schemas/Cancellation" - cancellation_terms: - description: Cancellation terms of this item - type: array - items: - $ref: "#/components/schemas/CancellationTerm" - refund_terms: - description: Refund terms of this item - type: array - items: - $ref: "#/components/schemas/Item/properties/refund_terms/items" - replacement_terms: - description: Replacement terms of this item - type: array - items: - $ref: "#/components/schemas/ReplacementTerm" - return_terms: - description: Return terms of this item - type: array - items: - $ref: "#/components/schemas/ReturnTerm" - quote: - description: The mutually agreed upon quotation for this order. - allOf: - - $ref: "#/components/schemas/Quotation" - payments: - description: The terms of settlement for this order - type: array - items: - $ref: "#/components/schemas/Payment" - created_at: - description: The date-time of creation of this order - type: string - format: date-time - updated_at: - description: The date-time of updated of this order - type: string - format: date-time - xinput: - description: Additional input required from the customer to confirm this order - allOf: - - $ref: "#/components/schemas/XInput" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Organization: - description: An organization. Usually a recognized business entity. - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - address: - description: The postal address of the organization - allOf: - - $ref: "#/components/schemas/Address" - state: - description: The state where the organization's address is registered - allOf: - - $ref: "#/components/schemas/State" - city: - description: The city where the the organization's address is registered - allOf: - - $ref: "#/components/schemas/City" - contact: - $ref: "#/components/schemas/Contact" - Payment: - description: "Describes the terms of settlement between the Consumer Interface and the Provider Platform for a single transaction. When instantiated, this object contains
  1. the amount that has to be settled,
  2. The payment destination destination details
  3. When the settlement should happen, and
  4. A transaction reference ID
. During a transaction, the Provider Platform reserves the right to decide the terms of payment. However, the Consumer Interface can send its terms to the Provider Platform first. If the Provider Platform does not agree to those terms, it must overwrite the terms and return them to the Consumer Interface. If overridden, the Consumer Interface must either agree to the terms sent by the Provider Platform in order to preserve the provider's autonomy, or abort the transaction. In case of such disagreements, the Consumer Interface and the Provider Platform can perform offline negotiations on the payment terms. Once an agreement is reached, the Consumer Interface and Provider Platform can resume transactions." - type: object - properties: - id: - description: ID of the payment term that can be referred at an item or an order level in a catalog - type: string - collected_by: - description: "This field indicates who is the collector of payment. The Consumer Interface can set this value to 'Consumer Interface' if it wants to collect the payment first and settle it to the Provider Platform. If the Provider Platform agrees to those terms, the Provider Platform should not send the payment url. Alternatively, the Provider Platform can set this field with the value 'Provider Platform' if it wants the payment to be made directly." - url: - type: string - description: "A payment url to be called by the Consumer Interface. If empty, then the payment is to be done offline. The details of payment should be present in the params object. If tl_method = http/get, then the payment details will be sent as url params. Two url param values, ```$transaction_id``` and ```$amount``` are mandatory." - format: uri - params: - type: object - properties: - transaction_id: - type: string - description: The reference transaction ID associated with a payment activity - amount: - type: string - currency: - type: string - bank_code: - type: string - bank_account_number: - type: string - virtual_payment_address: - type: string - source_bank_code: - type: string - source_bank_account_number: - type: string - source_virtual_payment_address: - type: string - type: - type: string - enum: - - PRE-ORDER - - PRE-FULFILLMENT - - ON-FULFILLMENT - - POST-FULFILLMENT - status: - type: string - enum: - - PAID - - NOT-PAID - time: - $ref: "#/components/schemas/Time" - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Person: - description: Describes a person as any individual - type: object - properties: - id: - type: string - description: Describes the identity of the person - url: - description: Profile url of the person - type: string - format: uri - name: - description: the name of the person - type: string - image: - $ref: "#/components/schemas/Image" - age: - description: Age of the person - allOf: - - $ref: "#/components/schemas/Duration" - dob: - description: Date of birth of the person - type: string - format: date - gender: - type: string - description: "Gender of something, typically a Person, but possibly also fictional characters, animals, etc. While Male and Female may be used, text strings are also acceptable for people who do not identify as a binary gender.Allowed values for this field can be published in the network policy" - creds: - type: array - items: - $ref: "#/components/schemas/Credential" - languages: - type: array - items: - description: Describes a language known to the person. - type: object - properties: - code: - type: string - name: - type: string - skills: - type: array - items: - description: Describes a skill of the person. - type: object - properties: - code: - type: string - name: - type: string - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Price: - description: Describes the price of a product or service - type: object - properties: - currency: - type: string - value: - $ref: "#/components/schemas/DecimalValue" - estimated_value: - $ref: "#/components/schemas/DecimalValue" - computed_value: - $ref: "#/components/schemas/DecimalValue" - listed_value: - $ref: "#/components/schemas/DecimalValue" - offered_value: - $ref: "#/components/schemas/DecimalValue" - minimum_value: - $ref: "#/components/schemas/DecimalValue" - maximum_value: - $ref: "#/components/schemas/DecimalValue" - Provider: - description: Describes the catalog of a business. - type: object - properties: - id: - type: string - description: Id of the provider - descriptor: - $ref: "#/components/schemas/Descriptor" - category_id: - type: string - description: Category Id of the provider at the Provider Platform-level catalog - rating: - $ref: "#/components/schemas/Rating/properties/value" - time: - $ref: "#/components/schemas/Time" - categories: - type: array - items: - $ref: "#/components/schemas/Category" - fulfillments: - type: array - items: - $ref: "#/components/schemas/Fulfillment" - payments: - type: array - items: - $ref: "#/components/schemas/Payment" - locations: - type: array - items: - $ref: "#/components/schemas/Location" - offers: - type: array - items: - $ref: "#/components/schemas/Offer" - items: - type: array - items: - $ref: "#/components/schemas/Item" - exp: - type: string - description: Time after which catalog has to be refreshed - format: date-time - rateable: - description: Whether this provider can be rated or not - type: boolean - ttl: - description: "The time-to-live in seconds, for this object. This can be overriden at deeper levels. A value of -1 indicates that this object is not cacheable." - type: integer - minimum: -1 - tags: - type: array - items: - $ref: "#/components/schemas/TagGroup" - Quotation: - description: "Describes a quote. It is the estimated price of products or services from the Provider Platform.
This has properties like price, breakup, ttl" - type: object - properties: - id: - description: ID of the quote. - type: string - format: uuid - price: - description: The total quoted price - allOf: - - $ref: "#/components/schemas/Price" - breakup: - description: the breakup of the total quoted price - type: array - items: - type: object - properties: - item: - $ref: "#/components/schemas/Item" - title: - type: string - price: - $ref: "#/components/schemas/Price" - ttl: - $ref: "#/components/schemas/Duration" - Rating: - description: Describes the rating of an entity - type: object - properties: - rating_category: - description: Category of the entity being rated - type: string - enum: - - Item - - Order - - Fulfillment - - Provider - - Agent - - Support - id: - description: Id of the object being rated - type: string - value: - description: "Rating value given to the object. This can be a single value or can also contain an inequality operator like gt, gte, lt, lte. This can also contain an inequality expression containing logical operators like && and ||." - type: string - Region: - description: Describes an arbitrary region of space. The network policy should contain a published list of supported regions by the network. - type: object - properties: - dimensions: - description: "The number of dimensions that are used to describe any point inside that region. The most common dimensionality of a region is 2, that represents an area on a map. There are regions on the map that can be approximated to one-dimensional regions like roads, railway lines, or shipping lines. 3 dimensional regions are rarer, but are gaining popularity as flying drones are being adopted for various fulfillment services." - type: string - enum: - - "1" - - "2" - - "3" - type: - description: "The type of region. This is used to specify the granularity of the region represented by this object. Various examples of two-dimensional region types are city, country, state, district, and so on. The network policy should contain a list of all possible region types supported by the network." - type: string - name: - type: string - description: Name of the region as specified on the map where that region exists. - code: - type: string - description: A standard code representing the region. This should be interpreted in the same way by all network participants. - boundary: - type: string - description: "A string representing the boundary of the region. One-dimensional regions are represented by polylines. Two-dimensional regions are represented by polygons, and three-dimensional regions can represented by polyhedra." - map_url: - type: string - description: The url to the map of the region. This can be a globally recognized map or the one specified by the network policy. - ReplacementTerm: - description: The replacement policy of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term is applicable. - allOf: - - $ref: "#/components/schemas/State" - replace_within: - description: "Applicable only for buyer managed returns where the buyer has to replace the item before a certain date-time, failing which they will not be eligible for replacement" - allOf: - - $ref: "#/components/schemas/Time" - external_ref: - $ref: "#/components/schemas/MediaFile" - ReturnTerm: - description: Describes the return policy of an item or an order - type: object - properties: - fulfillment_state: - description: The state of fulfillment during which this term IETF''s applicable. - allOf: - - $ref: "#/components/schemas/State" - return_eligible: - description: Indicates whether the item is eligible for return - type: boolean - return_time: - description: "Applicable only for buyer managed returns where the buyer has to return the item to the origin before a certain date-time, failing which they will not be eligible for refund." - allOf: - - $ref: "#/components/schemas/Time" - return_location: - description: The location where the item or order must / will be returned to - allOf: - - $ref: "#/components/schemas/Location" - fulfillment_managed_by: - description: The entity that will perform the return - type: string - enum: - - CONSUMER - - PROVIDER - Scalar: - description: Describes a scalar - type: object - properties: - type: - type: string - enum: - - CONSTANT - - VARIABLE - value: - $ref: "#/components/schemas/DecimalValue" - estimated_value: - $ref: "#/components/schemas/DecimalValue" - computed_value: - $ref: "#/components/schemas/DecimalValue" - range: - type: object - properties: - min: - $ref: "#/components/schemas/DecimalValue" - max: - $ref: "#/components/schemas/DecimalValue" - unit: - type: string - Schedule: - description: "Describes schedule as a repeating time period used to describe a regularly recurring event. At a minimum a schedule will specify frequency which describes the interval between occurrences of the event. Additional information can be provided to specify the schedule more precisely. This includes identifying the timestamps(s) of when the event will take place. Schedules may also have holidays to exclude a specific day from the schedule.
This has properties like frequency, holidays, times" - type: object - properties: - frequency: - $ref: "#/components/schemas/Duration" - holidays: - type: array - items: - type: string - format: date-time - times: - type: array - items: - type: string - format: date-time - State: - description: A bounded geopolitical region of governance inside a country. - type: object - properties: - name: - type: string - description: Name of the state - code: - type: string - description: State code as per country or international standards - Stop: - description: A logical point in space and time during the fulfillment of an order. - type: object - properties: - id: - type: string - parent_stop_id: - type: string - location: - description: Location of the stop - allOf: - - $ref: "#/components/schemas/Location" - type: - description: The type of stop. Allowed values of this property can be defined by the network policy. - type: string - time: - description: Timings applicable at the stop. - allOf: - - $ref: "#/components/schemas/Time" - instructions: - description: Instructions that need to be followed at the stop - allOf: - - $ref: "#/components/schemas/Descriptor" - contact: - description: Contact details of the stop - allOf: - - $ref: "#/components/schemas/Contact" - person: - description: The details of the person present at the stop - allOf: - - $ref: "#/components/schemas/Person" - authorization: - $ref: "#/components/schemas/Authorization" - Support: - description: Details of customer support - type: object - properties: - descriptor: - $ref: "#/components/schemas/Descriptor" - order_id: - type: string - callback_phone: - type: string - format: phone - chat: - type: object - properties: - url: - description: Chat URL - type: string - session_id: - description: Chat session ID - type: string - faq: - description: Link to the FAQ document - type: object - properties: - url: - type: string - mime_type: - type: string - agent: - $ref: "#/components/schemas/Agent" - Tag: - description: "Describes a tag. This is used to contain extended metadata. This object can be added as a property to any schema to describe extended attributes. For Consumer Interfaces, tags can be sent during search to optimize and filter search results. Provider Platforms can use tags to index their catalog to allow better search functionality. Tags are sent by the Provider Platform as part of the catalog response in the `on_search` callback. Tags are also meant for display purposes. Upon receiving a tag, Consumer Interfaces are meant to render them as name-value pairs. This is particularly useful when rendering tabular information about a product or service." - type: object - properties: - descriptor: - description: "Description of the Tag, can be used to store detailed information." - allOf: - - $ref: "#/components/schemas/Descriptor" - value: - description: The value of the tag. This set by the Provider Platform and rendered as-is by the Consumer Interface. - type: string - display: - description: "This value indicates if the tag is intended for display purposes. If set to `true`, then this tag must be displayed. If it is set to `false`, it should not be displayed. This value can override the group display value." - type: boolean - TagGroup: - description: "A collection of tag objects with group level attributes. For detailed documentation on the Tags and Tag Groups schema go to https://github.com/beckn/protocol-specifications/discussions/316" - type: object - properties: - display: - description: "Indicates the display properties of the tag group. If display is set to false, then the group will not be displayed. If it is set to true, it should be displayed. However, group-level display properties can be overriden by individual tag-level display property. As this schema is purely for catalog display purposes, it is not recommended to send this value during search." - type: boolean - default: true - descriptor: - description: "Description of the TagGroup, can be used to store detailed information." - allOf: - - $ref: "#/components/schemas/Descriptor" - list: - description: "An array of Tag objects listed under this group. This property can be set by Consumer Interfaces during search to narrow the `search` and achieve more relevant results. When received during `on_search`, Consumer Interfaces must render this list under the heading described by the `name` property of this schema." - type: array - items: - $ref: "#/components/schemas/Tag" - Time: - description: "Describes time in its various forms. It can be a single point in time; duration; or a structured timetable of operations
This has properties like label, time stamp,duration,range, days, schedule" - type: object - properties: - label: - type: string - timestamp: - type: string - format: date-time - duration: - $ref: "#/components/schemas/Duration" - range: - type: object - properties: - start: - type: string - format: date-time - end: - type: string - format: date-time - days: - type: string - description: comma separated values representing days of the week - schedule: - $ref: "#/components/schemas/Schedule" - Tracking: - description: Contains tracking information that can be used by the Consumer Interface to track the fulfillment of an order in real-time. which is useful for knowing the location of time sensitive deliveries. - type: object - properties: - id: - description: A unique tracking reference number - type: string - url: - description: "A URL to the tracking endpoint. This can be a link to a tracking webpage, a webhook URL created by the Consumer Interface where Provider Platform can push the tracking data, or a GET url creaed by the Provider Platform which the Consumer Interface can poll to get the tracking data. It can also be a websocket URL where the Provider Platform can push real-time tracking data." - type: string - format: uri - location: - description: "In case there is no real-time tracking endpoint available, this field will contain the latest location of the entity being tracked. The Provider Platform will update this value everytime the Consumer Interface calls the track API." - allOf: - - $ref: "#/components/schemas/Location" - status: - description: "This value indicates if the tracking is currently active or not. If this value is `active`, then the Consumer Interface can begin tracking the order. If this value is `inactive`, the tracking URL is considered to be expired and the Consumer Interface should stop tracking the order." - type: string - enum: - - active - - inactive - Vehicle: - description: "Describes a vehicle is a device that is designed or used to transport people or cargo over land, water, air, or through space.
This has properties like category, capacity, make, model, size,variant,color,energy_type,registration" - type: object - properties: - category: - type: string - capacity: - type: integer - make: - type: string - model: - type: string - size: - type: string - variant: - type: string - color: - type: string - energy_type: - type: string - registration: - type: string - wheels_count: - type: string - cargo_volumne: - type: string - wheelchair_access: - type: string - code: - type: string - emission_standard: - type: string - XInput: - description: "Contains any additional or extended inputs required to confirm an order. This is typically a Form Input. Sometimes, selection of catalog elements is not enough for the Provider Platform to confirm an order. For example, to confirm a flight ticket, the airline requires details of the passengers along with information on baggage, identity, in addition to the class of ticket. Similarly, a logistics company may require details on the nature of shipment in order to confirm the shipping. A recruiting firm may require additional details on the applicant in order to confirm a job application. For all such purposes, the can choose to send this object attached to any object in the catalog that is required to be sent while placing the order. This object can typically be sent at an item level or at the order level. The item level XInput will override the Order level XInput as it indicates a special requirement of information for that particular item. Hence the Consumer Interface must render a separate form for the Item and another form at the Order level before confirmation." - type: object - properties: - id: - type: string - head: - type: object - properties: - descriptor: - $ref: "#/components/schemas/Form" - index: - type: object - properties: - cur: - type: integer - max: - type: integer - min: - type: integer - headings: - type: array - items: - type: string - form: - $ref: "#/components/schemas/Form" - required: - description: Indicates whether the form data is mandatorily required by the Provider Platform to confirm the order. - type: boolean - Subscription: - description: Subscription details of a Network Participant. - allOf: - - $ref: '#/components/schemas/Subscriber' - - properties: - key_id: - description: A unique ID of the subscription entry in a registry. - type: string - format: uuid - signing_public_key: - description: The signing public key of the subscriber - type: string - encr_public_key: - description: The encryption public key of the subscriber - type: string - valid_from: - description: Date-time which the signing and encryption keys are valid from - type: string - format: date-time - valid_until: - description: Time till which the signing and encryption keys are valid - type: string - format: date-time - status: - description: Status of the subscription - type: string - enum: - - INITIATED - - UNDER_SUBSCRIPTION - - SUBSCRIBED - - EXPIRED - - UNSUBSCRIBED - - INVALID_SSL - created: - type: string - format: date-time - updated: - type: string - format: date-time - Subscriber: - description: A unique operational configuration of a trusted platform on a network. - type: object - properties: - subscriber_id: - description: 'A globally unique identifier of the platform, Typically it is the fully qualified domain name (FQDN) of the platform.' - type: string - url: - description: The callback URL of the Subscriber. This should necessarily contain the same domain name as set in `subscriber_id``. - type: string - format: uri - type: - description: The role of subscriber on the network - type: string - enum: - - BAP - - BPP - - BG - domain: - description: Operating industry domain that this subscriber offers its products or services in. A single subscriber can operate in multiple domains. Each operating domain must have a unique subscriber object entry in the req - allOf: - - description: 'Standard code representing the domain. The standard is usually published as part of the network policy. Furthermore, the network facilitator should also provide a mechanism to provide the supported domains of a network.' - location: - description: The region of operation of this subscriber - allOf: - - $ref: '#/components/schemas/Location' - responses: - CatalogResponse: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - additionalProperties: false - properties: - catalog: - $ref: '#/components/schemas/Catalog' - requestBodies: - CatalogRequest: - description: Acknowledgement of message received after successful validation of schema and signature - content: - application/json: - schema: - type: object - additionalProperties: false - properties: - catalog: - $ref: '#/components/schemas/Catalog' diff --git a/swagger/favicon-16x16.png b/swagger/favicon-16x16.png deleted file mode 100644 index 8b194e6..0000000 Binary files a/swagger/favicon-16x16.png and /dev/null differ diff --git a/swagger/favicon-32x32.png b/swagger/favicon-32x32.png deleted file mode 100644 index 249737f..0000000 Binary files a/swagger/favicon-32x32.png and /dev/null differ diff --git a/swagger/index.css b/swagger/index.css deleted file mode 100644 index f2376fd..0000000 --- a/swagger/index.css +++ /dev/null @@ -1,16 +0,0 @@ -html { - box-sizing: border-box; - overflow: -moz-scrollbars-vertical; - overflow-y: scroll; -} - -*, -*:before, -*:after { - box-sizing: inherit; -} - -body { - margin: 0; - background: #fafafa; -} diff --git a/swagger/index.html b/swagger/index.html deleted file mode 100644 index 84ae62d..0000000 --- a/swagger/index.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - Swagger UI - - - - - - - -
- - - - - diff --git a/swagger/oauth2-redirect.html b/swagger/oauth2-redirect.html deleted file mode 100644 index 5640917..0000000 --- a/swagger/oauth2-redirect.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - Swagger UI: OAuth2 Redirect - - - - - diff --git a/swagger/swagger-initializer.js b/swagger/swagger-initializer.js deleted file mode 100644 index 23d29ee..0000000 --- a/swagger/swagger-initializer.js +++ /dev/null @@ -1,20 +0,0 @@ -window.onload = function() { - // - - // the following lines will be replaced by docker/configurator, when it runs in a docker-container - window.ui = SwaggerUIBundle({ - url: "../specification/specification.yaml", - dom_id: '#swagger-ui', - deepLinking: true, - presets: [ - SwaggerUIBundle.presets.apis, - SwaggerUIStandalonePreset - ], - plugins: [ - SwaggerUIBundle.plugins.DownloadUrl - ], - layout: "StandaloneLayout" - }); - - // -}; diff --git a/swagger/swagger-ui-bundle.js b/swagger/swagger-ui-bundle.js deleted file mode 100644 index 551e172..0000000 --- a/swagger/swagger-ui-bundle.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see swagger-ui-bundle.js.LICENSE.txt */ -!function webpackUniversalModuleDefinition(o,s){"object"==typeof exports&&"object"==typeof module?module.exports=s():"function"==typeof define&&define.amd?define([],s):"object"==typeof exports?exports.SwaggerUIBundle=s():o.SwaggerUIBundle=s()}(this,(()=>(()=>{var o,s,i={69119:(o,s)=>{"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.BLANK_URL=s.relativeFirstCharacters=s.whitespaceEscapeCharsRegex=s.urlSchemeRegex=s.ctrlCharactersRegex=s.htmlCtrlEntityRegex=s.htmlEntitiesRegex=s.invalidProtocolRegex=void 0,s.invalidProtocolRegex=/^([^\w]*)(javascript|data|vbscript)/im,s.htmlEntitiesRegex=/&#(\w+)(^\w|;)?/g,s.htmlCtrlEntityRegex=/&(newline|tab);/gi,s.ctrlCharactersRegex=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim,s.urlSchemeRegex=/^.+(:|:)/gim,s.whitespaceEscapeCharsRegex=/(\\|%5[cC])((%(6[eE]|72|74))|[nrt])/g,s.relativeFirstCharacters=[".","/"],s.BLANK_URL="about:blank"},16750:(o,s,i)=>{"use strict";s.J=void 0;var u=i(69119);function decodeURI(o){try{return decodeURIComponent(o)}catch(s){return o}}s.J=function sanitizeUrl(o){if(!o)return u.BLANK_URL;var s,i,_=decodeURI(o);do{s=(_=decodeURI(_=(i=_,i.replace(u.ctrlCharactersRegex,"").replace(u.htmlEntitiesRegex,(function(o,s){return String.fromCharCode(s)}))).replace(u.htmlCtrlEntityRegex,"").replace(u.ctrlCharactersRegex,"").replace(u.whitespaceEscapeCharsRegex,"").trim())).match(u.ctrlCharactersRegex)||_.match(u.htmlEntitiesRegex)||_.match(u.htmlCtrlEntityRegex)||_.match(u.whitespaceEscapeCharsRegex)}while(s&&s.length>0);var w=_;if(!w)return u.BLANK_URL;if(function isRelativeUrlWithoutProtocol(o){return u.relativeFirstCharacters.indexOf(o[0])>-1}(w))return w;var x=w.match(u.urlSchemeRegex);if(!x)return w;var C=x[0];return u.invalidProtocolRegex.test(C)?u.BLANK_URL:w}},67526:(o,s)=>{"use strict";s.byteLength=function byteLength(o){var s=getLens(o),i=s[0],u=s[1];return 3*(i+u)/4-u},s.toByteArray=function toByteArray(o){var s,i,w=getLens(o),x=w[0],C=w[1],j=new _(function _byteLength(o,s,i){return 3*(s+i)/4-i}(0,x,C)),L=0,B=C>0?x-4:x;for(i=0;i>16&255,j[L++]=s>>8&255,j[L++]=255&s;2===C&&(s=u[o.charCodeAt(i)]<<2|u[o.charCodeAt(i+1)]>>4,j[L++]=255&s);1===C&&(s=u[o.charCodeAt(i)]<<10|u[o.charCodeAt(i+1)]<<4|u[o.charCodeAt(i+2)]>>2,j[L++]=s>>8&255,j[L++]=255&s);return j},s.fromByteArray=function fromByteArray(o){for(var s,u=o.length,_=u%3,w=[],x=16383,C=0,j=u-_;Cj?j:C+x));1===_?(s=o[u-1],w.push(i[s>>2]+i[s<<4&63]+"==")):2===_&&(s=(o[u-2]<<8)+o[u-1],w.push(i[s>>10]+i[s>>4&63]+i[s<<2&63]+"="));return w.join("")};for(var i=[],u=[],_="undefined"!=typeof Uint8Array?Uint8Array:Array,w="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",x=0;x<64;++x)i[x]=w[x],u[w.charCodeAt(x)]=x;function getLens(o){var s=o.length;if(s%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var i=o.indexOf("=");return-1===i&&(i=s),[i,i===s?0:4-i%4]}function encodeChunk(o,s,u){for(var _,w,x=[],C=s;C>18&63]+i[w>>12&63]+i[w>>6&63]+i[63&w]);return x.join("")}u["-".charCodeAt(0)]=62,u["_".charCodeAt(0)]=63},48287:(o,s,i)=>{"use strict";const u=i(67526),_=i(251),w="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;s.Buffer=Buffer,s.SlowBuffer=function SlowBuffer(o){+o!=o&&(o=0);return Buffer.alloc(+o)},s.INSPECT_MAX_BYTES=50;const x=2147483647;function createBuffer(o){if(o>x)throw new RangeError('The value "'+o+'" is invalid for option "size"');const s=new Uint8Array(o);return Object.setPrototypeOf(s,Buffer.prototype),s}function Buffer(o,s,i){if("number"==typeof o){if("string"==typeof s)throw new TypeError('The "string" argument must be of type string. Received type number');return allocUnsafe(o)}return from(o,s,i)}function from(o,s,i){if("string"==typeof o)return function fromString(o,s){"string"==typeof s&&""!==s||(s="utf8");if(!Buffer.isEncoding(s))throw new TypeError("Unknown encoding: "+s);const i=0|byteLength(o,s);let u=createBuffer(i);const _=u.write(o,s);_!==i&&(u=u.slice(0,_));return u}(o,s);if(ArrayBuffer.isView(o))return function fromArrayView(o){if(isInstance(o,Uint8Array)){const s=new Uint8Array(o);return fromArrayBuffer(s.buffer,s.byteOffset,s.byteLength)}return fromArrayLike(o)}(o);if(null==o)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof o);if(isInstance(o,ArrayBuffer)||o&&isInstance(o.buffer,ArrayBuffer))return fromArrayBuffer(o,s,i);if("undefined"!=typeof SharedArrayBuffer&&(isInstance(o,SharedArrayBuffer)||o&&isInstance(o.buffer,SharedArrayBuffer)))return fromArrayBuffer(o,s,i);if("number"==typeof o)throw new TypeError('The "value" argument must not be of type number. Received type number');const u=o.valueOf&&o.valueOf();if(null!=u&&u!==o)return Buffer.from(u,s,i);const _=function fromObject(o){if(Buffer.isBuffer(o)){const s=0|checked(o.length),i=createBuffer(s);return 0===i.length||o.copy(i,0,0,s),i}if(void 0!==o.length)return"number"!=typeof o.length||numberIsNaN(o.length)?createBuffer(0):fromArrayLike(o);if("Buffer"===o.type&&Array.isArray(o.data))return fromArrayLike(o.data)}(o);if(_)return _;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof o[Symbol.toPrimitive])return Buffer.from(o[Symbol.toPrimitive]("string"),s,i);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof o)}function assertSize(o){if("number"!=typeof o)throw new TypeError('"size" argument must be of type number');if(o<0)throw new RangeError('The value "'+o+'" is invalid for option "size"')}function allocUnsafe(o){return assertSize(o),createBuffer(o<0?0:0|checked(o))}function fromArrayLike(o){const s=o.length<0?0:0|checked(o.length),i=createBuffer(s);for(let u=0;u=x)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+x.toString(16)+" bytes");return 0|o}function byteLength(o,s){if(Buffer.isBuffer(o))return o.length;if(ArrayBuffer.isView(o)||isInstance(o,ArrayBuffer))return o.byteLength;if("string"!=typeof o)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof o);const i=o.length,u=arguments.length>2&&!0===arguments[2];if(!u&&0===i)return 0;let _=!1;for(;;)switch(s){case"ascii":case"latin1":case"binary":return i;case"utf8":case"utf-8":return utf8ToBytes(o).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*i;case"hex":return i>>>1;case"base64":return base64ToBytes(o).length;default:if(_)return u?-1:utf8ToBytes(o).length;s=(""+s).toLowerCase(),_=!0}}function slowToString(o,s,i){let u=!1;if((void 0===s||s<0)&&(s=0),s>this.length)return"";if((void 0===i||i>this.length)&&(i=this.length),i<=0)return"";if((i>>>=0)<=(s>>>=0))return"";for(o||(o="utf8");;)switch(o){case"hex":return hexSlice(this,s,i);case"utf8":case"utf-8":return utf8Slice(this,s,i);case"ascii":return asciiSlice(this,s,i);case"latin1":case"binary":return latin1Slice(this,s,i);case"base64":return base64Slice(this,s,i);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return utf16leSlice(this,s,i);default:if(u)throw new TypeError("Unknown encoding: "+o);o=(o+"").toLowerCase(),u=!0}}function swap(o,s,i){const u=o[s];o[s]=o[i],o[i]=u}function bidirectionalIndexOf(o,s,i,u,_){if(0===o.length)return-1;if("string"==typeof i?(u=i,i=0):i>2147483647?i=2147483647:i<-2147483648&&(i=-2147483648),numberIsNaN(i=+i)&&(i=_?0:o.length-1),i<0&&(i=o.length+i),i>=o.length){if(_)return-1;i=o.length-1}else if(i<0){if(!_)return-1;i=0}if("string"==typeof s&&(s=Buffer.from(s,u)),Buffer.isBuffer(s))return 0===s.length?-1:arrayIndexOf(o,s,i,u,_);if("number"==typeof s)return s&=255,"function"==typeof Uint8Array.prototype.indexOf?_?Uint8Array.prototype.indexOf.call(o,s,i):Uint8Array.prototype.lastIndexOf.call(o,s,i):arrayIndexOf(o,[s],i,u,_);throw new TypeError("val must be string, number or Buffer")}function arrayIndexOf(o,s,i,u,_){let w,x=1,C=o.length,j=s.length;if(void 0!==u&&("ucs2"===(u=String(u).toLowerCase())||"ucs-2"===u||"utf16le"===u||"utf-16le"===u)){if(o.length<2||s.length<2)return-1;x=2,C/=2,j/=2,i/=2}function read(o,s){return 1===x?o[s]:o.readUInt16BE(s*x)}if(_){let u=-1;for(w=i;wC&&(i=C-j),w=i;w>=0;w--){let i=!0;for(let u=0;u_&&(u=_):u=_;const w=s.length;let x;for(u>w/2&&(u=w/2),x=0;x>8,_=i%256,w.push(_),w.push(u);return w}(s,o.length-i),o,i,u)}function base64Slice(o,s,i){return 0===s&&i===o.length?u.fromByteArray(o):u.fromByteArray(o.slice(s,i))}function utf8Slice(o,s,i){i=Math.min(o.length,i);const u=[];let _=s;for(;_239?4:s>223?3:s>191?2:1;if(_+x<=i){let i,u,C,j;switch(x){case 1:s<128&&(w=s);break;case 2:i=o[_+1],128==(192&i)&&(j=(31&s)<<6|63&i,j>127&&(w=j));break;case 3:i=o[_+1],u=o[_+2],128==(192&i)&&128==(192&u)&&(j=(15&s)<<12|(63&i)<<6|63&u,j>2047&&(j<55296||j>57343)&&(w=j));break;case 4:i=o[_+1],u=o[_+2],C=o[_+3],128==(192&i)&&128==(192&u)&&128==(192&C)&&(j=(15&s)<<18|(63&i)<<12|(63&u)<<6|63&C,j>65535&&j<1114112&&(w=j))}}null===w?(w=65533,x=1):w>65535&&(w-=65536,u.push(w>>>10&1023|55296),w=56320|1023&w),u.push(w),_+=x}return function decodeCodePointsArray(o){const s=o.length;if(s<=C)return String.fromCharCode.apply(String,o);let i="",u=0;for(;uu.length?(Buffer.isBuffer(s)||(s=Buffer.from(s)),s.copy(u,_)):Uint8Array.prototype.set.call(u,s,_);else{if(!Buffer.isBuffer(s))throw new TypeError('"list" argument must be an Array of Buffers');s.copy(u,_)}_+=s.length}return u},Buffer.byteLength=byteLength,Buffer.prototype._isBuffer=!0,Buffer.prototype.swap16=function swap16(){const o=this.length;if(o%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let s=0;si&&(o+=" ... "),""},w&&(Buffer.prototype[w]=Buffer.prototype.inspect),Buffer.prototype.compare=function compare(o,s,i,u,_){if(isInstance(o,Uint8Array)&&(o=Buffer.from(o,o.offset,o.byteLength)),!Buffer.isBuffer(o))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof o);if(void 0===s&&(s=0),void 0===i&&(i=o?o.length:0),void 0===u&&(u=0),void 0===_&&(_=this.length),s<0||i>o.length||u<0||_>this.length)throw new RangeError("out of range index");if(u>=_&&s>=i)return 0;if(u>=_)return-1;if(s>=i)return 1;if(this===o)return 0;let w=(_>>>=0)-(u>>>=0),x=(i>>>=0)-(s>>>=0);const C=Math.min(w,x),j=this.slice(u,_),L=o.slice(s,i);for(let o=0;o>>=0,isFinite(i)?(i>>>=0,void 0===u&&(u="utf8")):(u=i,i=void 0)}const _=this.length-s;if((void 0===i||i>_)&&(i=_),o.length>0&&(i<0||s<0)||s>this.length)throw new RangeError("Attempt to write outside buffer bounds");u||(u="utf8");let w=!1;for(;;)switch(u){case"hex":return hexWrite(this,o,s,i);case"utf8":case"utf-8":return utf8Write(this,o,s,i);case"ascii":case"latin1":case"binary":return asciiWrite(this,o,s,i);case"base64":return base64Write(this,o,s,i);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ucs2Write(this,o,s,i);default:if(w)throw new TypeError("Unknown encoding: "+u);u=(""+u).toLowerCase(),w=!0}},Buffer.prototype.toJSON=function toJSON(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};const C=4096;function asciiSlice(o,s,i){let u="";i=Math.min(o.length,i);for(let _=s;_u)&&(i=u);let _="";for(let u=s;ui)throw new RangeError("Trying to access beyond buffer length")}function checkInt(o,s,i,u,_,w){if(!Buffer.isBuffer(o))throw new TypeError('"buffer" argument must be a Buffer instance');if(s>_||so.length)throw new RangeError("Index out of range")}function wrtBigUInt64LE(o,s,i,u,_){checkIntBI(s,u,_,o,i,7);let w=Number(s&BigInt(4294967295));o[i++]=w,w>>=8,o[i++]=w,w>>=8,o[i++]=w,w>>=8,o[i++]=w;let x=Number(s>>BigInt(32)&BigInt(4294967295));return o[i++]=x,x>>=8,o[i++]=x,x>>=8,o[i++]=x,x>>=8,o[i++]=x,i}function wrtBigUInt64BE(o,s,i,u,_){checkIntBI(s,u,_,o,i,7);let w=Number(s&BigInt(4294967295));o[i+7]=w,w>>=8,o[i+6]=w,w>>=8,o[i+5]=w,w>>=8,o[i+4]=w;let x=Number(s>>BigInt(32)&BigInt(4294967295));return o[i+3]=x,x>>=8,o[i+2]=x,x>>=8,o[i+1]=x,x>>=8,o[i]=x,i+8}function checkIEEE754(o,s,i,u,_,w){if(i+u>o.length)throw new RangeError("Index out of range");if(i<0)throw new RangeError("Index out of range")}function writeFloat(o,s,i,u,w){return s=+s,i>>>=0,w||checkIEEE754(o,0,i,4),_.write(o,s,i,u,23,4),i+4}function writeDouble(o,s,i,u,w){return s=+s,i>>>=0,w||checkIEEE754(o,0,i,8),_.write(o,s,i,u,52,8),i+8}Buffer.prototype.slice=function slice(o,s){const i=this.length;(o=~~o)<0?(o+=i)<0&&(o=0):o>i&&(o=i),(s=void 0===s?i:~~s)<0?(s+=i)<0&&(s=0):s>i&&(s=i),s>>=0,s>>>=0,i||checkOffset(o,s,this.length);let u=this[o],_=1,w=0;for(;++w>>=0,s>>>=0,i||checkOffset(o,s,this.length);let u=this[o+--s],_=1;for(;s>0&&(_*=256);)u+=this[o+--s]*_;return u},Buffer.prototype.readUint8=Buffer.prototype.readUInt8=function readUInt8(o,s){return o>>>=0,s||checkOffset(o,1,this.length),this[o]},Buffer.prototype.readUint16LE=Buffer.prototype.readUInt16LE=function readUInt16LE(o,s){return o>>>=0,s||checkOffset(o,2,this.length),this[o]|this[o+1]<<8},Buffer.prototype.readUint16BE=Buffer.prototype.readUInt16BE=function readUInt16BE(o,s){return o>>>=0,s||checkOffset(o,2,this.length),this[o]<<8|this[o+1]},Buffer.prototype.readUint32LE=Buffer.prototype.readUInt32LE=function readUInt32LE(o,s){return o>>>=0,s||checkOffset(o,4,this.length),(this[o]|this[o+1]<<8|this[o+2]<<16)+16777216*this[o+3]},Buffer.prototype.readUint32BE=Buffer.prototype.readUInt32BE=function readUInt32BE(o,s){return o>>>=0,s||checkOffset(o,4,this.length),16777216*this[o]+(this[o+1]<<16|this[o+2]<<8|this[o+3])},Buffer.prototype.readBigUInt64LE=defineBigIntMethod((function readBigUInt64LE(o){validateNumber(o>>>=0,"offset");const s=this[o],i=this[o+7];void 0!==s&&void 0!==i||boundsError(o,this.length-8);const u=s+256*this[++o]+65536*this[++o]+this[++o]*2**24,_=this[++o]+256*this[++o]+65536*this[++o]+i*2**24;return BigInt(u)+(BigInt(_)<>>=0,"offset");const s=this[o],i=this[o+7];void 0!==s&&void 0!==i||boundsError(o,this.length-8);const u=s*2**24+65536*this[++o]+256*this[++o]+this[++o],_=this[++o]*2**24+65536*this[++o]+256*this[++o]+i;return(BigInt(u)<>>=0,s>>>=0,i||checkOffset(o,s,this.length);let u=this[o],_=1,w=0;for(;++w=_&&(u-=Math.pow(2,8*s)),u},Buffer.prototype.readIntBE=function readIntBE(o,s,i){o>>>=0,s>>>=0,i||checkOffset(o,s,this.length);let u=s,_=1,w=this[o+--u];for(;u>0&&(_*=256);)w+=this[o+--u]*_;return _*=128,w>=_&&(w-=Math.pow(2,8*s)),w},Buffer.prototype.readInt8=function readInt8(o,s){return o>>>=0,s||checkOffset(o,1,this.length),128&this[o]?-1*(255-this[o]+1):this[o]},Buffer.prototype.readInt16LE=function readInt16LE(o,s){o>>>=0,s||checkOffset(o,2,this.length);const i=this[o]|this[o+1]<<8;return 32768&i?4294901760|i:i},Buffer.prototype.readInt16BE=function readInt16BE(o,s){o>>>=0,s||checkOffset(o,2,this.length);const i=this[o+1]|this[o]<<8;return 32768&i?4294901760|i:i},Buffer.prototype.readInt32LE=function readInt32LE(o,s){return o>>>=0,s||checkOffset(o,4,this.length),this[o]|this[o+1]<<8|this[o+2]<<16|this[o+3]<<24},Buffer.prototype.readInt32BE=function readInt32BE(o,s){return o>>>=0,s||checkOffset(o,4,this.length),this[o]<<24|this[o+1]<<16|this[o+2]<<8|this[o+3]},Buffer.prototype.readBigInt64LE=defineBigIntMethod((function readBigInt64LE(o){validateNumber(o>>>=0,"offset");const s=this[o],i=this[o+7];void 0!==s&&void 0!==i||boundsError(o,this.length-8);const u=this[o+4]+256*this[o+5]+65536*this[o+6]+(i<<24);return(BigInt(u)<>>=0,"offset");const s=this[o],i=this[o+7];void 0!==s&&void 0!==i||boundsError(o,this.length-8);const u=(s<<24)+65536*this[++o]+256*this[++o]+this[++o];return(BigInt(u)<>>=0,s||checkOffset(o,4,this.length),_.read(this,o,!0,23,4)},Buffer.prototype.readFloatBE=function readFloatBE(o,s){return o>>>=0,s||checkOffset(o,4,this.length),_.read(this,o,!1,23,4)},Buffer.prototype.readDoubleLE=function readDoubleLE(o,s){return o>>>=0,s||checkOffset(o,8,this.length),_.read(this,o,!0,52,8)},Buffer.prototype.readDoubleBE=function readDoubleBE(o,s){return o>>>=0,s||checkOffset(o,8,this.length),_.read(this,o,!1,52,8)},Buffer.prototype.writeUintLE=Buffer.prototype.writeUIntLE=function writeUIntLE(o,s,i,u){if(o=+o,s>>>=0,i>>>=0,!u){checkInt(this,o,s,i,Math.pow(2,8*i)-1,0)}let _=1,w=0;for(this[s]=255&o;++w>>=0,i>>>=0,!u){checkInt(this,o,s,i,Math.pow(2,8*i)-1,0)}let _=i-1,w=1;for(this[s+_]=255&o;--_>=0&&(w*=256);)this[s+_]=o/w&255;return s+i},Buffer.prototype.writeUint8=Buffer.prototype.writeUInt8=function writeUInt8(o,s,i){return o=+o,s>>>=0,i||checkInt(this,o,s,1,255,0),this[s]=255&o,s+1},Buffer.prototype.writeUint16LE=Buffer.prototype.writeUInt16LE=function writeUInt16LE(o,s,i){return o=+o,s>>>=0,i||checkInt(this,o,s,2,65535,0),this[s]=255&o,this[s+1]=o>>>8,s+2},Buffer.prototype.writeUint16BE=Buffer.prototype.writeUInt16BE=function writeUInt16BE(o,s,i){return o=+o,s>>>=0,i||checkInt(this,o,s,2,65535,0),this[s]=o>>>8,this[s+1]=255&o,s+2},Buffer.prototype.writeUint32LE=Buffer.prototype.writeUInt32LE=function writeUInt32LE(o,s,i){return o=+o,s>>>=0,i||checkInt(this,o,s,4,4294967295,0),this[s+3]=o>>>24,this[s+2]=o>>>16,this[s+1]=o>>>8,this[s]=255&o,s+4},Buffer.prototype.writeUint32BE=Buffer.prototype.writeUInt32BE=function writeUInt32BE(o,s,i){return o=+o,s>>>=0,i||checkInt(this,o,s,4,4294967295,0),this[s]=o>>>24,this[s+1]=o>>>16,this[s+2]=o>>>8,this[s+3]=255&o,s+4},Buffer.prototype.writeBigUInt64LE=defineBigIntMethod((function writeBigUInt64LE(o,s=0){return wrtBigUInt64LE(this,o,s,BigInt(0),BigInt("0xffffffffffffffff"))})),Buffer.prototype.writeBigUInt64BE=defineBigIntMethod((function writeBigUInt64BE(o,s=0){return wrtBigUInt64BE(this,o,s,BigInt(0),BigInt("0xffffffffffffffff"))})),Buffer.prototype.writeIntLE=function writeIntLE(o,s,i,u){if(o=+o,s>>>=0,!u){const u=Math.pow(2,8*i-1);checkInt(this,o,s,i,u-1,-u)}let _=0,w=1,x=0;for(this[s]=255&o;++_>>=0,!u){const u=Math.pow(2,8*i-1);checkInt(this,o,s,i,u-1,-u)}let _=i-1,w=1,x=0;for(this[s+_]=255&o;--_>=0&&(w*=256);)o<0&&0===x&&0!==this[s+_+1]&&(x=1),this[s+_]=(o/w|0)-x&255;return s+i},Buffer.prototype.writeInt8=function writeInt8(o,s,i){return o=+o,s>>>=0,i||checkInt(this,o,s,1,127,-128),o<0&&(o=255+o+1),this[s]=255&o,s+1},Buffer.prototype.writeInt16LE=function writeInt16LE(o,s,i){return o=+o,s>>>=0,i||checkInt(this,o,s,2,32767,-32768),this[s]=255&o,this[s+1]=o>>>8,s+2},Buffer.prototype.writeInt16BE=function writeInt16BE(o,s,i){return o=+o,s>>>=0,i||checkInt(this,o,s,2,32767,-32768),this[s]=o>>>8,this[s+1]=255&o,s+2},Buffer.prototype.writeInt32LE=function writeInt32LE(o,s,i){return o=+o,s>>>=0,i||checkInt(this,o,s,4,2147483647,-2147483648),this[s]=255&o,this[s+1]=o>>>8,this[s+2]=o>>>16,this[s+3]=o>>>24,s+4},Buffer.prototype.writeInt32BE=function writeInt32BE(o,s,i){return o=+o,s>>>=0,i||checkInt(this,o,s,4,2147483647,-2147483648),o<0&&(o=4294967295+o+1),this[s]=o>>>24,this[s+1]=o>>>16,this[s+2]=o>>>8,this[s+3]=255&o,s+4},Buffer.prototype.writeBigInt64LE=defineBigIntMethod((function writeBigInt64LE(o,s=0){return wrtBigUInt64LE(this,o,s,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),Buffer.prototype.writeBigInt64BE=defineBigIntMethod((function writeBigInt64BE(o,s=0){return wrtBigUInt64BE(this,o,s,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),Buffer.prototype.writeFloatLE=function writeFloatLE(o,s,i){return writeFloat(this,o,s,!0,i)},Buffer.prototype.writeFloatBE=function writeFloatBE(o,s,i){return writeFloat(this,o,s,!1,i)},Buffer.prototype.writeDoubleLE=function writeDoubleLE(o,s,i){return writeDouble(this,o,s,!0,i)},Buffer.prototype.writeDoubleBE=function writeDoubleBE(o,s,i){return writeDouble(this,o,s,!1,i)},Buffer.prototype.copy=function copy(o,s,i,u){if(!Buffer.isBuffer(o))throw new TypeError("argument should be a Buffer");if(i||(i=0),u||0===u||(u=this.length),s>=o.length&&(s=o.length),s||(s=0),u>0&&u=this.length)throw new RangeError("Index out of range");if(u<0)throw new RangeError("sourceEnd out of bounds");u>this.length&&(u=this.length),o.length-s>>=0,i=void 0===i?this.length:i>>>0,o||(o=0),"number"==typeof o)for(_=s;_=u+4;i-=3)s=`_${o.slice(i-3,i)}${s}`;return`${o.slice(0,i)}${s}`}function checkIntBI(o,s,i,u,_,w){if(o>i||o3?0===s||s===BigInt(0)?`>= 0${u} and < 2${u} ** ${8*(w+1)}${u}`:`>= -(2${u} ** ${8*(w+1)-1}${u}) and < 2 ** ${8*(w+1)-1}${u}`:`>= ${s}${u} and <= ${i}${u}`,new j.ERR_OUT_OF_RANGE("value",_,o)}!function checkBounds(o,s,i){validateNumber(s,"offset"),void 0!==o[s]&&void 0!==o[s+i]||boundsError(s,o.length-(i+1))}(u,_,w)}function validateNumber(o,s){if("number"!=typeof o)throw new j.ERR_INVALID_ARG_TYPE(s,"number",o)}function boundsError(o,s,i){if(Math.floor(o)!==o)throw validateNumber(o,i),new j.ERR_OUT_OF_RANGE(i||"offset","an integer",o);if(s<0)throw new j.ERR_BUFFER_OUT_OF_BOUNDS;throw new j.ERR_OUT_OF_RANGE(i||"offset",`>= ${i?1:0} and <= ${s}`,o)}E("ERR_BUFFER_OUT_OF_BOUNDS",(function(o){return o?`${o} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"}),RangeError),E("ERR_INVALID_ARG_TYPE",(function(o,s){return`The "${o}" argument must be of type number. Received type ${typeof s}`}),TypeError),E("ERR_OUT_OF_RANGE",(function(o,s,i){let u=`The value of "${o}" is out of range.`,_=i;return Number.isInteger(i)&&Math.abs(i)>2**32?_=addNumericalSeparator(String(i)):"bigint"==typeof i&&(_=String(i),(i>BigInt(2)**BigInt(32)||i<-(BigInt(2)**BigInt(32)))&&(_=addNumericalSeparator(_)),_+="n"),u+=` It must be ${s}. Received ${_}`,u}),RangeError);const L=/[^+/0-9A-Za-z-_]/g;function utf8ToBytes(o,s){let i;s=s||1/0;const u=o.length;let _=null;const w=[];for(let x=0;x55295&&i<57344){if(!_){if(i>56319){(s-=3)>-1&&w.push(239,191,189);continue}if(x+1===u){(s-=3)>-1&&w.push(239,191,189);continue}_=i;continue}if(i<56320){(s-=3)>-1&&w.push(239,191,189),_=i;continue}i=65536+(_-55296<<10|i-56320)}else _&&(s-=3)>-1&&w.push(239,191,189);if(_=null,i<128){if((s-=1)<0)break;w.push(i)}else if(i<2048){if((s-=2)<0)break;w.push(i>>6|192,63&i|128)}else if(i<65536){if((s-=3)<0)break;w.push(i>>12|224,i>>6&63|128,63&i|128)}else{if(!(i<1114112))throw new Error("Invalid code point");if((s-=4)<0)break;w.push(i>>18|240,i>>12&63|128,i>>6&63|128,63&i|128)}}return w}function base64ToBytes(o){return u.toByteArray(function base64clean(o){if((o=(o=o.split("=")[0]).trim().replace(L,"")).length<2)return"";for(;o.length%4!=0;)o+="=";return o}(o))}function blitBuffer(o,s,i,u){let _;for(_=0;_=s.length||_>=o.length);++_)s[_+i]=o[_];return _}function isInstance(o,s){return o instanceof s||null!=o&&null!=o.constructor&&null!=o.constructor.name&&o.constructor.name===s.name}function numberIsNaN(o){return o!=o}const B=function(){const o="0123456789abcdef",s=new Array(256);for(let i=0;i<16;++i){const u=16*i;for(let _=0;_<16;++_)s[u+_]=o[i]+o[_]}return s}();function defineBigIntMethod(o){return"undefined"==typeof BigInt?BufferBigIntNotDefined:o}function BufferBigIntNotDefined(){throw new Error("BigInt not supported")}},38075:(o,s,i)=>{"use strict";var u=i(70453),_=i(10487),w=_(u("String.prototype.indexOf"));o.exports=function callBoundIntrinsic(o,s){var i=u(o,!!s);return"function"==typeof i&&w(o,".prototype.")>-1?_(i):i}},10487:(o,s,i)=>{"use strict";var u=i(66743),_=i(70453),w=i(96897),x=i(69675),C=_("%Function.prototype.apply%"),j=_("%Function.prototype.call%"),L=_("%Reflect.apply%",!0)||u.call(j,C),B=i(30655),$=_("%Math.max%");o.exports=function callBind(o){if("function"!=typeof o)throw new x("a function is required");var s=L(u,j,arguments);return w(s,1+$(0,o.length-(arguments.length-1)),!0)};var V=function applyBind(){return L(u,C,arguments)};B?B(o.exports,"apply",{value:V}):o.exports.apply=V},57427:(o,s)=>{"use strict";s.parse=function parse(o,s){if("string"!=typeof o)throw new TypeError("argument str must be a string");var i={},u=(s||{}).decode||decode,_=0;for(;_{"use strict";var u=i(16426),_={"text/plain":"Text","text/html":"Url",default:"Text"};o.exports=function copy(o,s){var i,w,x,C,j,L,B=!1;s||(s={}),i=s.debug||!1;try{if(x=u(),C=document.createRange(),j=document.getSelection(),(L=document.createElement("span")).textContent=o,L.ariaHidden="true",L.style.all="unset",L.style.position="fixed",L.style.top=0,L.style.clip="rect(0, 0, 0, 0)",L.style.whiteSpace="pre",L.style.webkitUserSelect="text",L.style.MozUserSelect="text",L.style.msUserSelect="text",L.style.userSelect="text",L.addEventListener("copy",(function(u){if(u.stopPropagation(),s.format)if(u.preventDefault(),void 0===u.clipboardData){i&&console.warn("unable to use e.clipboardData"),i&&console.warn("trying IE specific stuff"),window.clipboardData.clearData();var w=_[s.format]||_.default;window.clipboardData.setData(w,o)}else u.clipboardData.clearData(),u.clipboardData.setData(s.format,o);s.onCopy&&(u.preventDefault(),s.onCopy(u.clipboardData))})),document.body.appendChild(L),C.selectNodeContents(L),j.addRange(C),!document.execCommand("copy"))throw new Error("copy command was unsuccessful");B=!0}catch(u){i&&console.error("unable to copy using execCommand: ",u),i&&console.warn("trying IE specific stuff");try{window.clipboardData.setData(s.format||"text",o),s.onCopy&&s.onCopy(window.clipboardData),B=!0}catch(u){i&&console.error("unable to copy using clipboardData: ",u),i&&console.error("falling back to prompt"),w=function format(o){var s=(/mac os x/i.test(navigator.userAgent)?"⌘":"Ctrl")+"+C";return o.replace(/#{\s*key\s*}/g,s)}("message"in s?s.message:"Copy to clipboard: #{key}, Enter"),window.prompt(w,o)}}finally{j&&("function"==typeof j.removeRange?j.removeRange(C):j.removeAllRanges()),L&&document.body.removeChild(L),x()}return B}},2205:function(o,s,i){var u;u=void 0!==i.g?i.g:this,o.exports=function(o){if(o.CSS&&o.CSS.escape)return o.CSS.escape;var cssEscape=function(o){if(0==arguments.length)throw new TypeError("`CSS.escape` requires an argument.");for(var s,i=String(o),u=i.length,_=-1,w="",x=i.charCodeAt(0);++_=1&&s<=31||127==s||0==_&&s>=48&&s<=57||1==_&&s>=48&&s<=57&&45==x?"\\"+s.toString(16)+" ":0==_&&1==u&&45==s||!(s>=128||45==s||95==s||s>=48&&s<=57||s>=65&&s<=90||s>=97&&s<=122)?"\\"+i.charAt(_):i.charAt(_):w+="�";return w};return o.CSS||(o.CSS={}),o.CSS.escape=cssEscape,cssEscape}(u)},81919:(o,s,i)=>{"use strict";var u=i(48287).Buffer;function isSpecificValue(o){return o instanceof u||o instanceof Date||o instanceof RegExp}function cloneSpecificValue(o){if(o instanceof u){var s=u.alloc?u.alloc(o.length):new u(o.length);return o.copy(s),s}if(o instanceof Date)return new Date(o.getTime());if(o instanceof RegExp)return new RegExp(o);throw new Error("Unexpected situation")}function deepCloneArray(o){var s=[];return o.forEach((function(o,i){"object"==typeof o&&null!==o?Array.isArray(o)?s[i]=deepCloneArray(o):isSpecificValue(o)?s[i]=cloneSpecificValue(o):s[i]=_({},o):s[i]=o})),s}function safeGetProperty(o,s){return"__proto__"===s?void 0:o[s]}var _=o.exports=function(){if(arguments.length<1||"object"!=typeof arguments[0])return!1;if(arguments.length<2)return arguments[0];var o,s,i=arguments[0];return Array.prototype.slice.call(arguments,1).forEach((function(u){"object"!=typeof u||null===u||Array.isArray(u)||Object.keys(u).forEach((function(w){return s=safeGetProperty(i,w),(o=safeGetProperty(u,w))===i?void 0:"object"!=typeof o||null===o?void(i[w]=o):Array.isArray(o)?void(i[w]=deepCloneArray(o)):isSpecificValue(o)?void(i[w]=cloneSpecificValue(o)):"object"!=typeof s||null===s||Array.isArray(s)?void(i[w]=_({},o)):void(i[w]=_(s,o))}))})),i}},14744:o=>{"use strict";var s=function isMergeableObject(o){return function isNonNullObject(o){return!!o&&"object"==typeof o}(o)&&!function isSpecial(o){var s=Object.prototype.toString.call(o);return"[object RegExp]"===s||"[object Date]"===s||function isReactElement(o){return o.$$typeof===i}(o)}(o)};var i="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function cloneUnlessOtherwiseSpecified(o,s){return!1!==s.clone&&s.isMergeableObject(o)?deepmerge(function emptyTarget(o){return Array.isArray(o)?[]:{}}(o),o,s):o}function defaultArrayMerge(o,s,i){return o.concat(s).map((function(o){return cloneUnlessOtherwiseSpecified(o,i)}))}function getKeys(o){return Object.keys(o).concat(function getEnumerableOwnPropertySymbols(o){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(o).filter((function(s){return Object.propertyIsEnumerable.call(o,s)})):[]}(o))}function propertyIsOnObject(o,s){try{return s in o}catch(o){return!1}}function mergeObject(o,s,i){var u={};return i.isMergeableObject(o)&&getKeys(o).forEach((function(s){u[s]=cloneUnlessOtherwiseSpecified(o[s],i)})),getKeys(s).forEach((function(_){(function propertyIsUnsafe(o,s){return propertyIsOnObject(o,s)&&!(Object.hasOwnProperty.call(o,s)&&Object.propertyIsEnumerable.call(o,s))})(o,_)||(propertyIsOnObject(o,_)&&i.isMergeableObject(s[_])?u[_]=function getMergeFunction(o,s){if(!s.customMerge)return deepmerge;var i=s.customMerge(o);return"function"==typeof i?i:deepmerge}(_,i)(o[_],s[_],i):u[_]=cloneUnlessOtherwiseSpecified(s[_],i))})),u}function deepmerge(o,i,u){(u=u||{}).arrayMerge=u.arrayMerge||defaultArrayMerge,u.isMergeableObject=u.isMergeableObject||s,u.cloneUnlessOtherwiseSpecified=cloneUnlessOtherwiseSpecified;var _=Array.isArray(i);return _===Array.isArray(o)?_?u.arrayMerge(o,i,u):mergeObject(o,i,u):cloneUnlessOtherwiseSpecified(i,u)}deepmerge.all=function deepmergeAll(o,s){if(!Array.isArray(o))throw new Error("first argument should be an array");return o.reduce((function(o,i){return deepmerge(o,i,s)}),{})};var u=deepmerge;o.exports=u},30041:(o,s,i)=>{"use strict";var u=i(30655),_=i(58068),w=i(69675),x=i(75795);o.exports=function defineDataProperty(o,s,i){if(!o||"object"!=typeof o&&"function"!=typeof o)throw new w("`obj` must be an object or a function`");if("string"!=typeof s&&"symbol"!=typeof s)throw new w("`property` must be a string or a symbol`");if(arguments.length>3&&"boolean"!=typeof arguments[3]&&null!==arguments[3])throw new w("`nonEnumerable`, if provided, must be a boolean or null");if(arguments.length>4&&"boolean"!=typeof arguments[4]&&null!==arguments[4])throw new w("`nonWritable`, if provided, must be a boolean or null");if(arguments.length>5&&"boolean"!=typeof arguments[5]&&null!==arguments[5])throw new w("`nonConfigurable`, if provided, must be a boolean or null");if(arguments.length>6&&"boolean"!=typeof arguments[6])throw new w("`loose`, if provided, must be a boolean");var C=arguments.length>3?arguments[3]:null,j=arguments.length>4?arguments[4]:null,L=arguments.length>5?arguments[5]:null,B=arguments.length>6&&arguments[6],$=!!x&&x(o,s);if(u)u(o,s,{configurable:null===L&&$?$.configurable:!L,enumerable:null===C&&$?$.enumerable:!C,value:i,writable:null===j&&$?$.writable:!j});else{if(!B&&(C||j||L))throw new _("This environment does not support defining a property as non-configurable, non-writable, or non-enumerable.");o[s]=i}}},42838:function(o){o.exports=function(){"use strict";const{entries:o,setPrototypeOf:s,isFrozen:i,getPrototypeOf:u,getOwnPropertyDescriptor:_}=Object;let{freeze:w,seal:x,create:C}=Object,{apply:j,construct:L}="undefined"!=typeof Reflect&&Reflect;w||(w=function freeze(o){return o}),x||(x=function seal(o){return o}),j||(j=function apply(o,s,i){return o.apply(s,i)}),L||(L=function construct(o,s){return new o(...s)});const B=unapply(Array.prototype.forEach),$=unapply(Array.prototype.pop),V=unapply(Array.prototype.push),U=unapply(String.prototype.toLowerCase),z=unapply(String.prototype.toString),Y=unapply(String.prototype.match),Z=unapply(String.prototype.replace),ee=unapply(String.prototype.indexOf),ie=unapply(String.prototype.trim),ae=unapply(Object.prototype.hasOwnProperty),ce=unapply(RegExp.prototype.test),le=unconstruct(TypeError);function numberIsNaN(o){return"number"==typeof o&&isNaN(o)}function unapply(o){return function(s){for(var i=arguments.length,u=new Array(i>1?i-1:0),_=1;_2&&void 0!==arguments[2]?arguments[2]:U;s&&s(o,null);let w=u.length;for(;w--;){let s=u[w];if("string"==typeof s){const o=_(s);o!==s&&(i(u)||(u[w]=o),s=o)}o[s]=!0}return o}function cleanArray(o){for(let s=0;s/gm),$e=x(/\${[\w\W]*}/gm),ze=x(/^data-[\-\w.\u00B7-\uFFFF]/),We=x(/^aria-[\-\w]+$/),He=x(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),Ye=x(/^(?:\w+script|data):/i),Xe=x(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),Qe=x(/^html$/i),et=x(/^[a-z][.\w]*(-[.\w]+)+$/i);var tt=Object.freeze({__proto__:null,MUSTACHE_EXPR:Re,ERB_EXPR:qe,TMPLIT_EXPR:$e,DATA_ATTR:ze,ARIA_ATTR:We,IS_ALLOWED_URI:He,IS_SCRIPT_OR_DATA:Ye,ATTR_WHITESPACE:Xe,DOCTYPE_NAME:Qe,CUSTOM_ELEMENT:et});const rt={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,progressingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},nt=function getGlobal(){return"undefined"==typeof window?null:window},ot=function _createTrustedTypesPolicy(o,s){if("object"!=typeof o||"function"!=typeof o.createPolicy)return null;let i=null;const u="data-tt-policy-suffix";s&&s.hasAttribute(u)&&(i=s.getAttribute(u));const _="dompurify"+(i?"#"+i:"");try{return o.createPolicy(_,{createHTML:o=>o,createScriptURL:o=>o})}catch(o){return console.warn("TrustedTypes policy "+_+" could not be created."),null}};function createDOMPurify(){let s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:nt();const DOMPurify=o=>createDOMPurify(o);if(DOMPurify.version="3.1.4",DOMPurify.removed=[],!s||!s.document||s.document.nodeType!==rt.document)return DOMPurify.isSupported=!1,DOMPurify;let{document:i}=s;const u=i,_=u.currentScript,{DocumentFragment:x,HTMLTemplateElement:j,Node:L,Element:Re,NodeFilter:qe,NamedNodeMap:$e=s.NamedNodeMap||s.MozNamedAttrMap,HTMLFormElement:ze,DOMParser:We,trustedTypes:Ye}=s,Xe=Re.prototype,et=lookupGetter(Xe,"cloneNode"),st=lookupGetter(Xe,"nextSibling"),it=lookupGetter(Xe,"childNodes"),at=lookupGetter(Xe,"parentNode");if("function"==typeof j){const o=i.createElement("template");o.content&&o.content.ownerDocument&&(i=o.content.ownerDocument)}let ct,lt="";const{implementation:ut,createNodeIterator:pt,createDocumentFragment:ht,getElementsByTagName:dt}=i,{importNode:mt}=u;let gt={};DOMPurify.isSupported="function"==typeof o&&"function"==typeof at&&ut&&void 0!==ut.createHTMLDocument;const{MUSTACHE_EXPR:yt,ERB_EXPR:vt,TMPLIT_EXPR:bt,DATA_ATTR:_t,ARIA_ATTR:Et,IS_SCRIPT_OR_DATA:wt,ATTR_WHITESPACE:St,CUSTOM_ELEMENT:xt}=tt;let{IS_ALLOWED_URI:kt}=tt,Ot=null;const Ct=addToSet({},[...pe,...de,...fe,...be,...we]);let At=null;const jt=addToSet({},[...Se,...xe,...Pe,...Te]);let Pt=Object.seal(C(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),It=null,Mt=null,Nt=!0,Tt=!0,Rt=!1,Dt=!0,Lt=!1,Bt=!0,Ft=!1,qt=!1,$t=!1,Vt=!1,Ut=!1,zt=!1,Wt=!0,Kt=!1;const Ht="user-content-";let Jt=!0,Gt=!1,Yt={},Xt=null;const Qt=addToSet({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let Zt=null;const er=addToSet({},["audio","video","img","source","image","track"]);let tr=null;const rr=addToSet({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),nr="http://www.w3.org/1998/Math/MathML",sr="http://www.w3.org/2000/svg",ir="http://www.w3.org/1999/xhtml";let ar=ir,cr=!1,lr=null;const ur=addToSet({},[nr,sr,ir],z);let pr=null;const dr=["application/xhtml+xml","text/html"],fr="text/html";let mr=null,gr=null;const yr=255,vr=i.createElement("form"),br=function isRegexOrFunction(o){return o instanceof RegExp||o instanceof Function},_r=function _parseConfig(){let o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!gr||gr!==o){if(o&&"object"==typeof o||(o={}),o=clone(o),pr=-1===dr.indexOf(o.PARSER_MEDIA_TYPE)?fr:o.PARSER_MEDIA_TYPE,mr="application/xhtml+xml"===pr?z:U,Ot=ae(o,"ALLOWED_TAGS")?addToSet({},o.ALLOWED_TAGS,mr):Ct,At=ae(o,"ALLOWED_ATTR")?addToSet({},o.ALLOWED_ATTR,mr):jt,lr=ae(o,"ALLOWED_NAMESPACES")?addToSet({},o.ALLOWED_NAMESPACES,z):ur,tr=ae(o,"ADD_URI_SAFE_ATTR")?addToSet(clone(rr),o.ADD_URI_SAFE_ATTR,mr):rr,Zt=ae(o,"ADD_DATA_URI_TAGS")?addToSet(clone(er),o.ADD_DATA_URI_TAGS,mr):er,Xt=ae(o,"FORBID_CONTENTS")?addToSet({},o.FORBID_CONTENTS,mr):Qt,It=ae(o,"FORBID_TAGS")?addToSet({},o.FORBID_TAGS,mr):{},Mt=ae(o,"FORBID_ATTR")?addToSet({},o.FORBID_ATTR,mr):{},Yt=!!ae(o,"USE_PROFILES")&&o.USE_PROFILES,Nt=!1!==o.ALLOW_ARIA_ATTR,Tt=!1!==o.ALLOW_DATA_ATTR,Rt=o.ALLOW_UNKNOWN_PROTOCOLS||!1,Dt=!1!==o.ALLOW_SELF_CLOSE_IN_ATTR,Lt=o.SAFE_FOR_TEMPLATES||!1,Bt=!1!==o.SAFE_FOR_XML,Ft=o.WHOLE_DOCUMENT||!1,Vt=o.RETURN_DOM||!1,Ut=o.RETURN_DOM_FRAGMENT||!1,zt=o.RETURN_TRUSTED_TYPE||!1,$t=o.FORCE_BODY||!1,Wt=!1!==o.SANITIZE_DOM,Kt=o.SANITIZE_NAMED_PROPS||!1,Jt=!1!==o.KEEP_CONTENT,Gt=o.IN_PLACE||!1,kt=o.ALLOWED_URI_REGEXP||He,ar=o.NAMESPACE||ir,Pt=o.CUSTOM_ELEMENT_HANDLING||{},o.CUSTOM_ELEMENT_HANDLING&&br(o.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(Pt.tagNameCheck=o.CUSTOM_ELEMENT_HANDLING.tagNameCheck),o.CUSTOM_ELEMENT_HANDLING&&br(o.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(Pt.attributeNameCheck=o.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),o.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof o.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(Pt.allowCustomizedBuiltInElements=o.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Lt&&(Tt=!1),Ut&&(Vt=!0),Yt&&(Ot=addToSet({},we),At=[],!0===Yt.html&&(addToSet(Ot,pe),addToSet(At,Se)),!0===Yt.svg&&(addToSet(Ot,de),addToSet(At,xe),addToSet(At,Te)),!0===Yt.svgFilters&&(addToSet(Ot,fe),addToSet(At,xe),addToSet(At,Te)),!0===Yt.mathMl&&(addToSet(Ot,be),addToSet(At,Pe),addToSet(At,Te))),o.ADD_TAGS&&(Ot===Ct&&(Ot=clone(Ot)),addToSet(Ot,o.ADD_TAGS,mr)),o.ADD_ATTR&&(At===jt&&(At=clone(At)),addToSet(At,o.ADD_ATTR,mr)),o.ADD_URI_SAFE_ATTR&&addToSet(tr,o.ADD_URI_SAFE_ATTR,mr),o.FORBID_CONTENTS&&(Xt===Qt&&(Xt=clone(Xt)),addToSet(Xt,o.FORBID_CONTENTS,mr)),Jt&&(Ot["#text"]=!0),Ft&&addToSet(Ot,["html","head","body"]),Ot.table&&(addToSet(Ot,["tbody"]),delete It.tbody),o.TRUSTED_TYPES_POLICY){if("function"!=typeof o.TRUSTED_TYPES_POLICY.createHTML)throw le('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof o.TRUSTED_TYPES_POLICY.createScriptURL)throw le('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');ct=o.TRUSTED_TYPES_POLICY,lt=ct.createHTML("")}else void 0===ct&&(ct=ot(Ye,_)),null!==ct&&"string"==typeof lt&&(lt=ct.createHTML(""));w&&w(o),gr=o}},Er=addToSet({},["mi","mo","mn","ms","mtext"]),wr=addToSet({},["foreignobject","annotation-xml"]),Sr=addToSet({},["title","style","font","a","script"]),xr=addToSet({},[...de,...fe,...ye]),kr=addToSet({},[...be,..._e]),Or=function _checkValidNamespace(o){let s=at(o);s&&s.tagName||(s={namespaceURI:ar,tagName:"template"});const i=U(o.tagName),u=U(s.tagName);return!!lr[o.namespaceURI]&&(o.namespaceURI===sr?s.namespaceURI===ir?"svg"===i:s.namespaceURI===nr?"svg"===i&&("annotation-xml"===u||Er[u]):Boolean(xr[i]):o.namespaceURI===nr?s.namespaceURI===ir?"math"===i:s.namespaceURI===sr?"math"===i&&wr[u]:Boolean(kr[i]):o.namespaceURI===ir?!(s.namespaceURI===sr&&!wr[u])&&!(s.namespaceURI===nr&&!Er[u])&&!kr[i]&&(Sr[i]||!xr[i]):!("application/xhtml+xml"!==pr||!lr[o.namespaceURI]))},Cr=function _forceRemove(o){V(DOMPurify.removed,{element:o});try{o.parentNode.removeChild(o)}catch(s){o.remove()}},Ar=function _removeAttribute(o,s){try{V(DOMPurify.removed,{attribute:s.getAttributeNode(o),from:s})}catch(o){V(DOMPurify.removed,{attribute:null,from:s})}if(s.removeAttribute(o),"is"===o&&!At[o])if(Vt||Ut)try{Cr(s)}catch(o){}else try{s.setAttribute(o,"")}catch(o){}},jr=function _initDocument(o){let s=null,u=null;if($t)o=""+o;else{const s=Y(o,/^[\r\n\t ]+/);u=s&&s[0]}"application/xhtml+xml"===pr&&ar===ir&&(o=''+o+"");const _=ct?ct.createHTML(o):o;if(ar===ir)try{s=(new We).parseFromString(_,pr)}catch(o){}if(!s||!s.documentElement){s=ut.createDocument(ar,"template",null);try{s.documentElement.innerHTML=cr?lt:_}catch(o){}}const w=s.body||s.documentElement;return o&&u&&w.insertBefore(i.createTextNode(u),w.childNodes[0]||null),ar===ir?dt.call(s,Ft?"html":"body")[0]:Ft?s.documentElement:w},Pr=function _createNodeIterator(o){return pt.call(o.ownerDocument||o,o,qe.SHOW_ELEMENT|qe.SHOW_COMMENT|qe.SHOW_TEXT|qe.SHOW_PROCESSING_INSTRUCTION|qe.SHOW_CDATA_SECTION,null)},Ir=function _isClobbered(o){return o instanceof ze&&(void 0!==o.__depth&&"number"!=typeof o.__depth||void 0!==o.__removalCount&&"number"!=typeof o.__removalCount||"string"!=typeof o.nodeName||"string"!=typeof o.textContent||"function"!=typeof o.removeChild||!(o.attributes instanceof $e)||"function"!=typeof o.removeAttribute||"function"!=typeof o.setAttribute||"string"!=typeof o.namespaceURI||"function"!=typeof o.insertBefore||"function"!=typeof o.hasChildNodes)},Mr=function _isNode(o){return"function"==typeof L&&o instanceof L},Nr=function _executeHook(o,s,i){gt[o]&&B(gt[o],(o=>{o.call(DOMPurify,s,i,gr)}))},Tr=function _sanitizeElements(o){let s=null;if(Nr("beforeSanitizeElements",o,null),Ir(o))return Cr(o),!0;const i=mr(o.nodeName);if(Nr("uponSanitizeElement",o,{tagName:i,allowedTags:Ot}),o.hasChildNodes()&&!Mr(o.firstElementChild)&&ce(/<[/\w]/g,o.innerHTML)&&ce(/<[/\w]/g,o.textContent))return Cr(o),!0;if(o.nodeType===rt.progressingInstruction)return Cr(o),!0;if(Bt&&o.nodeType===rt.comment&&ce(/<[/\w]/g,o.data))return Cr(o),!0;if(!Ot[i]||It[i]){if(!It[i]&&Dr(i)){if(Pt.tagNameCheck instanceof RegExp&&ce(Pt.tagNameCheck,i))return!1;if(Pt.tagNameCheck instanceof Function&&Pt.tagNameCheck(i))return!1}if(Jt&&!Xt[i]){const s=at(o)||o.parentNode,i=it(o)||o.childNodes;if(i&&s)for(let u=i.length-1;u>=0;--u){const _=et(i[u],!0);_.__removalCount=(o.__removalCount||0)+1,s.insertBefore(_,st(o))}}return Cr(o),!0}return o instanceof Re&&!Or(o)?(Cr(o),!0):"noscript"!==i&&"noembed"!==i&&"noframes"!==i||!ce(/<\/no(script|embed|frames)/i,o.innerHTML)?(Lt&&o.nodeType===rt.text&&(s=o.textContent,B([yt,vt,bt],(o=>{s=Z(s,o," ")})),o.textContent!==s&&(V(DOMPurify.removed,{element:o.cloneNode()}),o.textContent=s)),Nr("afterSanitizeElements",o,null),!1):(Cr(o),!0)},Rr=function _isValidAttribute(o,s,u){if(Wt&&("id"===s||"name"===s)&&(u in i||u in vr||"__depth"===u||"__removalCount"===u))return!1;if(Tt&&!Mt[s]&&ce(_t,s));else if(Nt&&ce(Et,s));else if(!At[s]||Mt[s]){if(!(Dr(o)&&(Pt.tagNameCheck instanceof RegExp&&ce(Pt.tagNameCheck,o)||Pt.tagNameCheck instanceof Function&&Pt.tagNameCheck(o))&&(Pt.attributeNameCheck instanceof RegExp&&ce(Pt.attributeNameCheck,s)||Pt.attributeNameCheck instanceof Function&&Pt.attributeNameCheck(s))||"is"===s&&Pt.allowCustomizedBuiltInElements&&(Pt.tagNameCheck instanceof RegExp&&ce(Pt.tagNameCheck,u)||Pt.tagNameCheck instanceof Function&&Pt.tagNameCheck(u))))return!1}else if(tr[s]);else if(ce(kt,Z(u,St,"")));else if("src"!==s&&"xlink:href"!==s&&"href"!==s||"script"===o||0!==ee(u,"data:")||!Zt[o])if(Rt&&!ce(wt,Z(u,St,"")));else if(u)return!1;return!0},Dr=function _isBasicCustomElement(o){return"annotation-xml"!==o&&Y(o,xt)},Lr=function _sanitizeAttributes(o){Nr("beforeSanitizeAttributes",o,null);const{attributes:s}=o;if(!s)return;const i={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:At};let u=s.length;for(;u--;){const _=s[u],{name:w,namespaceURI:x,value:C}=_,j=mr(w);let L="value"===w?C:ie(C);if(i.attrName=j,i.attrValue=L,i.keepAttr=!0,i.forceKeepAttr=void 0,Nr("uponSanitizeAttribute",o,i),L=i.attrValue,i.forceKeepAttr)continue;if(Ar(w,o),!i.keepAttr)continue;if(!Dt&&ce(/\/>/i,L)){Ar(w,o);continue}if(Bt&&ce(/((--!?|])>)|<\/(style|title)/i,L)){Ar(w,o);continue}Lt&&B([yt,vt,bt],(o=>{L=Z(L,o," ")}));const V=mr(o.nodeName);if(Rr(V,j,L)){if(!Kt||"id"!==j&&"name"!==j||(Ar(w,o),L=Ht+L),ct&&"object"==typeof Ye&&"function"==typeof Ye.getAttributeType)if(x);else switch(Ye.getAttributeType(V,j)){case"TrustedHTML":L=ct.createHTML(L);break;case"TrustedScriptURL":L=ct.createScriptURL(L)}try{x?o.setAttributeNS(x,w,L):o.setAttribute(w,L),Ir(o)?Cr(o):$(DOMPurify.removed)}catch(o){}}}Nr("afterSanitizeAttributes",o,null)},Br=function _sanitizeShadowDOM(o){let s=null;const i=Pr(o);for(Nr("beforeSanitizeShadowDOM",o,null);s=i.nextNode();){if(Nr("uponSanitizeShadowNode",s,null),Tr(s))continue;const o=at(s);s.nodeType===rt.element&&(o&&o.__depth?s.__depth=(s.__removalCount||0)+o.__depth+1:s.__depth=1),(s.__depth>=yr||s.__depth<0||numberIsNaN(s.__depth))&&Cr(s),s.content instanceof x&&(s.content.__depth=s.__depth,_sanitizeShadowDOM(s.content)),Lr(s)}Nr("afterSanitizeShadowDOM",o,null)};return DOMPurify.sanitize=function(o){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=null,_=null,w=null,C=null;if(cr=!o,cr&&(o="\x3c!--\x3e"),"string"!=typeof o&&!Mr(o)){if("function"!=typeof o.toString)throw le("toString is not a function");if("string"!=typeof(o=o.toString()))throw le("dirty is not a string, aborting")}if(!DOMPurify.isSupported)return o;if(qt||_r(s),DOMPurify.removed=[],"string"==typeof o&&(Gt=!1),Gt){if(o.nodeName){const s=mr(o.nodeName);if(!Ot[s]||It[s])throw le("root node is forbidden and cannot be sanitized in-place")}}else if(o instanceof L)i=jr("\x3c!----\x3e"),_=i.ownerDocument.importNode(o,!0),_.nodeType===rt.element&&"BODY"===_.nodeName||"HTML"===_.nodeName?i=_:i.appendChild(_);else{if(!Vt&&!Lt&&!Ft&&-1===o.indexOf("<"))return ct&&zt?ct.createHTML(o):o;if(i=jr(o),!i)return Vt?null:zt?lt:""}i&&$t&&Cr(i.firstChild);const j=Pr(Gt?o:i);for(;w=j.nextNode();){if(Tr(w))continue;const o=at(w);w.nodeType===rt.element&&(o&&o.__depth?w.__depth=(w.__removalCount||0)+o.__depth+1:w.__depth=1),(w.__depth>=yr||w.__depth<0||numberIsNaN(w.__depth))&&Cr(w),w.content instanceof x&&(w.content.__depth=w.__depth,Br(w.content)),Lr(w)}if(Gt)return o;if(Vt){if(Ut)for(C=ht.call(i.ownerDocument);i.firstChild;)C.appendChild(i.firstChild);else C=i;return(At.shadowroot||At.shadowrootmode)&&(C=mt.call(u,C,!0)),C}let $=Ft?i.outerHTML:i.innerHTML;return Ft&&Ot["!doctype"]&&i.ownerDocument&&i.ownerDocument.doctype&&i.ownerDocument.doctype.name&&ce(Qe,i.ownerDocument.doctype.name)&&($="\n"+$),Lt&&B([yt,vt,bt],(o=>{$=Z($,o," ")})),ct&&zt?ct.createHTML($):$},DOMPurify.setConfig=function(){_r(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),qt=!0},DOMPurify.clearConfig=function(){gr=null,qt=!1},DOMPurify.isValidAttribute=function(o,s,i){gr||_r({});const u=mr(o),_=mr(s);return Rr(u,_,i)},DOMPurify.addHook=function(o,s){"function"==typeof s&&(gt[o]=gt[o]||[],V(gt[o],s))},DOMPurify.removeHook=function(o){if(gt[o])return $(gt[o])},DOMPurify.removeHooks=function(o){gt[o]&&(gt[o]=[])},DOMPurify.removeAllHooks=function(){gt={}},DOMPurify}return createDOMPurify()}()},78004:o=>{"use strict";class SubRange{constructor(o,s){this.low=o,this.high=s,this.length=1+s-o}overlaps(o){return!(this.higho.high)}touches(o){return!(this.high+1o.high)}add(o){return new SubRange(Math.min(this.low,o.low),Math.max(this.high,o.high))}subtract(o){return o.low<=this.low&&o.high>=this.high?[]:o.low>this.low&&o.higho+s.length),0)}add(o,s){var _add=o=>{for(var s=0;s{for(var s=0;s{for(var s=0;s{for(var i=s.low;i<=s.high;)o.push(i),i++;return o}),[])}subranges(){return this.ranges.map((o=>({low:o.low,high:o.high,length:1+o.high-o.low})))}}o.exports=DRange},30655:(o,s,i)=>{"use strict";var u=i(70453)("%Object.defineProperty%",!0)||!1;if(u)try{u({},"a",{value:1})}catch(o){u=!1}o.exports=u},41237:o=>{"use strict";o.exports=EvalError},69383:o=>{"use strict";o.exports=Error},79290:o=>{"use strict";o.exports=RangeError},79538:o=>{"use strict";o.exports=ReferenceError},58068:o=>{"use strict";o.exports=SyntaxError},69675:o=>{"use strict";o.exports=TypeError},35345:o=>{"use strict";o.exports=URIError},37007:o=>{"use strict";var s,i="object"==typeof Reflect?Reflect:null,u=i&&"function"==typeof i.apply?i.apply:function ReflectApply(o,s,i){return Function.prototype.apply.call(o,s,i)};s=i&&"function"==typeof i.ownKeys?i.ownKeys:Object.getOwnPropertySymbols?function ReflectOwnKeys(o){return Object.getOwnPropertyNames(o).concat(Object.getOwnPropertySymbols(o))}:function ReflectOwnKeys(o){return Object.getOwnPropertyNames(o)};var _=Number.isNaN||function NumberIsNaN(o){return o!=o};function EventEmitter(){EventEmitter.init.call(this)}o.exports=EventEmitter,o.exports.once=function once(o,s){return new Promise((function(i,u){function errorListener(i){o.removeListener(s,resolver),u(i)}function resolver(){"function"==typeof o.removeListener&&o.removeListener("error",errorListener),i([].slice.call(arguments))}eventTargetAgnosticAddListener(o,s,resolver,{once:!0}),"error"!==s&&function addErrorHandlerIfEventEmitter(o,s,i){"function"==typeof o.on&&eventTargetAgnosticAddListener(o,"error",s,i)}(o,errorListener,{once:!0})}))},EventEmitter.EventEmitter=EventEmitter,EventEmitter.prototype._events=void 0,EventEmitter.prototype._eventsCount=0,EventEmitter.prototype._maxListeners=void 0;var w=10;function checkListener(o){if("function"!=typeof o)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof o)}function _getMaxListeners(o){return void 0===o._maxListeners?EventEmitter.defaultMaxListeners:o._maxListeners}function _addListener(o,s,i,u){var _,w,x;if(checkListener(i),void 0===(w=o._events)?(w=o._events=Object.create(null),o._eventsCount=0):(void 0!==w.newListener&&(o.emit("newListener",s,i.listener?i.listener:i),w=o._events),x=w[s]),void 0===x)x=w[s]=i,++o._eventsCount;else if("function"==typeof x?x=w[s]=u?[i,x]:[x,i]:u?x.unshift(i):x.push(i),(_=_getMaxListeners(o))>0&&x.length>_&&!x.warned){x.warned=!0;var C=new Error("Possible EventEmitter memory leak detected. "+x.length+" "+String(s)+" listeners added. Use emitter.setMaxListeners() to increase limit");C.name="MaxListenersExceededWarning",C.emitter=o,C.type=s,C.count=x.length,function ProcessEmitWarning(o){console&&console.warn&&console.warn(o)}(C)}return o}function onceWrapper(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function _onceWrap(o,s,i){var u={fired:!1,wrapFn:void 0,target:o,type:s,listener:i},_=onceWrapper.bind(u);return _.listener=i,u.wrapFn=_,_}function _listeners(o,s,i){var u=o._events;if(void 0===u)return[];var _=u[s];return void 0===_?[]:"function"==typeof _?i?[_.listener||_]:[_]:i?function unwrapListeners(o){for(var s=new Array(o.length),i=0;i0&&(x=s[0]),x instanceof Error)throw x;var C=new Error("Unhandled error."+(x?" ("+x.message+")":""));throw C.context=x,C}var j=w[o];if(void 0===j)return!1;if("function"==typeof j)u(j,this,s);else{var L=j.length,B=arrayClone(j,L);for(i=0;i=0;w--)if(i[w]===s||i[w].listener===s){x=i[w].listener,_=w;break}if(_<0)return this;0===_?i.shift():function spliceOne(o,s){for(;s+1=0;u--)this.removeListener(o,s[u]);return this},EventEmitter.prototype.listeners=function listeners(o){return _listeners(this,o,!0)},EventEmitter.prototype.rawListeners=function rawListeners(o){return _listeners(this,o,!1)},EventEmitter.listenerCount=function(o,s){return"function"==typeof o.listenerCount?o.listenerCount(s):listenerCount.call(o,s)},EventEmitter.prototype.listenerCount=listenerCount,EventEmitter.prototype.eventNames=function eventNames(){return this._eventsCount>0?s(this._events):[]}},85587:(o,s,i)=>{"use strict";var u=i(26311),_=create(Error);function create(o){return FormattedError.displayName=o.displayName||o.name,FormattedError;function FormattedError(s){return s&&(s=u.apply(null,arguments)),new o(s)}}o.exports=_,_.eval=create(EvalError),_.range=create(RangeError),_.reference=create(ReferenceError),_.syntax=create(SyntaxError),_.type=create(TypeError),_.uri=create(URIError),_.create=create},26311:o=>{!function(){var s;function format(o){for(var s,i,u,_,w=1,x=[].slice.call(arguments),C=0,j=o.length,L="",B=!1,$=!1,nextArg=function(){return x[w++]},slurpNumber=function(){for(var i="";/\d/.test(o[C]);)i+=o[C++],s=o[C];return i.length>0?parseInt(i):null};C{"use strict";var s=Object.prototype.toString,i=Math.max,u=function concatty(o,s){for(var i=[],u=0;u{"use strict";var u=i(89353);o.exports=Function.prototype.bind||u},70453:(o,s,i)=>{"use strict";var u,_=i(69383),w=i(41237),x=i(79290),C=i(79538),j=i(58068),L=i(69675),B=i(35345),$=Function,getEvalledConstructor=function(o){try{return $('"use strict"; return ('+o+").constructor;")()}catch(o){}},V=Object.getOwnPropertyDescriptor;if(V)try{V({},"")}catch(o){V=null}var throwTypeError=function(){throw new L},U=V?function(){try{return throwTypeError}catch(o){try{return V(arguments,"callee").get}catch(o){return throwTypeError}}}():throwTypeError,z=i(64039)(),Y=i(80024)(),Z=Object.getPrototypeOf||(Y?function(o){return o.__proto__}:null),ee={},ie="undefined"!=typeof Uint8Array&&Z?Z(Uint8Array):u,ae={__proto__:null,"%AggregateError%":"undefined"==typeof AggregateError?u:AggregateError,"%Array%":Array,"%ArrayBuffer%":"undefined"==typeof ArrayBuffer?u:ArrayBuffer,"%ArrayIteratorPrototype%":z&&Z?Z([][Symbol.iterator]()):u,"%AsyncFromSyncIteratorPrototype%":u,"%AsyncFunction%":ee,"%AsyncGenerator%":ee,"%AsyncGeneratorFunction%":ee,"%AsyncIteratorPrototype%":ee,"%Atomics%":"undefined"==typeof Atomics?u:Atomics,"%BigInt%":"undefined"==typeof BigInt?u:BigInt,"%BigInt64Array%":"undefined"==typeof BigInt64Array?u:BigInt64Array,"%BigUint64Array%":"undefined"==typeof BigUint64Array?u:BigUint64Array,"%Boolean%":Boolean,"%DataView%":"undefined"==typeof DataView?u:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":_,"%eval%":eval,"%EvalError%":w,"%Float32Array%":"undefined"==typeof Float32Array?u:Float32Array,"%Float64Array%":"undefined"==typeof Float64Array?u:Float64Array,"%FinalizationRegistry%":"undefined"==typeof FinalizationRegistry?u:FinalizationRegistry,"%Function%":$,"%GeneratorFunction%":ee,"%Int8Array%":"undefined"==typeof Int8Array?u:Int8Array,"%Int16Array%":"undefined"==typeof Int16Array?u:Int16Array,"%Int32Array%":"undefined"==typeof Int32Array?u:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":z&&Z?Z(Z([][Symbol.iterator]())):u,"%JSON%":"object"==typeof JSON?JSON:u,"%Map%":"undefined"==typeof Map?u:Map,"%MapIteratorPrototype%":"undefined"!=typeof Map&&z&&Z?Z((new Map)[Symbol.iterator]()):u,"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"==typeof Promise?u:Promise,"%Proxy%":"undefined"==typeof Proxy?u:Proxy,"%RangeError%":x,"%ReferenceError%":C,"%Reflect%":"undefined"==typeof Reflect?u:Reflect,"%RegExp%":RegExp,"%Set%":"undefined"==typeof Set?u:Set,"%SetIteratorPrototype%":"undefined"!=typeof Set&&z&&Z?Z((new Set)[Symbol.iterator]()):u,"%SharedArrayBuffer%":"undefined"==typeof SharedArrayBuffer?u:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":z&&Z?Z(""[Symbol.iterator]()):u,"%Symbol%":z?Symbol:u,"%SyntaxError%":j,"%ThrowTypeError%":U,"%TypedArray%":ie,"%TypeError%":L,"%Uint8Array%":"undefined"==typeof Uint8Array?u:Uint8Array,"%Uint8ClampedArray%":"undefined"==typeof Uint8ClampedArray?u:Uint8ClampedArray,"%Uint16Array%":"undefined"==typeof Uint16Array?u:Uint16Array,"%Uint32Array%":"undefined"==typeof Uint32Array?u:Uint32Array,"%URIError%":B,"%WeakMap%":"undefined"==typeof WeakMap?u:WeakMap,"%WeakRef%":"undefined"==typeof WeakRef?u:WeakRef,"%WeakSet%":"undefined"==typeof WeakSet?u:WeakSet};if(Z)try{null.error}catch(o){var ce=Z(Z(o));ae["%Error.prototype%"]=ce}var le=function doEval(o){var s;if("%AsyncFunction%"===o)s=getEvalledConstructor("async function () {}");else if("%GeneratorFunction%"===o)s=getEvalledConstructor("function* () {}");else if("%AsyncGeneratorFunction%"===o)s=getEvalledConstructor("async function* () {}");else if("%AsyncGenerator%"===o){var i=doEval("%AsyncGeneratorFunction%");i&&(s=i.prototype)}else if("%AsyncIteratorPrototype%"===o){var u=doEval("%AsyncGenerator%");u&&Z&&(s=Z(u.prototype))}return ae[o]=s,s},pe={__proto__:null,"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},de=i(66743),fe=i(9957),ye=de.call(Function.call,Array.prototype.concat),be=de.call(Function.apply,Array.prototype.splice),_e=de.call(Function.call,String.prototype.replace),we=de.call(Function.call,String.prototype.slice),Se=de.call(Function.call,RegExp.prototype.exec),xe=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,Pe=/\\(\\)?/g,Te=function getBaseIntrinsic(o,s){var i,u=o;if(fe(pe,u)&&(u="%"+(i=pe[u])[0]+"%"),fe(ae,u)){var _=ae[u];if(_===ee&&(_=le(u)),void 0===_&&!s)throw new L("intrinsic "+o+" exists, but is not available. Please file an issue!");return{alias:i,name:u,value:_}}throw new j("intrinsic "+o+" does not exist!")};o.exports=function GetIntrinsic(o,s){if("string"!=typeof o||0===o.length)throw new L("intrinsic name must be a non-empty string");if(arguments.length>1&&"boolean"!=typeof s)throw new L('"allowMissing" argument must be a boolean');if(null===Se(/^%?[^%]*%?$/,o))throw new j("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var i=function stringToPath(o){var s=we(o,0,1),i=we(o,-1);if("%"===s&&"%"!==i)throw new j("invalid intrinsic syntax, expected closing `%`");if("%"===i&&"%"!==s)throw new j("invalid intrinsic syntax, expected opening `%`");var u=[];return _e(o,xe,(function(o,s,i,_){u[u.length]=i?_e(_,Pe,"$1"):s||o})),u}(o),u=i.length>0?i[0]:"",_=Te("%"+u+"%",s),w=_.name,x=_.value,C=!1,B=_.alias;B&&(u=B[0],be(i,ye([0,1],B)));for(var $=1,U=!0;$=i.length){var ee=V(x,z);x=(U=!!ee)&&"get"in ee&&!("originalValue"in ee.get)?ee.get:x[z]}else U=fe(x,z),x=x[z];U&&!C&&(ae[w]=x)}}return x}},75795:(o,s,i)=>{"use strict";var u=i(70453)("%Object.getOwnPropertyDescriptor%",!0);if(u)try{u([],"length")}catch(o){u=null}o.exports=u},30592:(o,s,i)=>{"use strict";var u=i(30655),_=function hasPropertyDescriptors(){return!!u};_.hasArrayLengthDefineBug=function hasArrayLengthDefineBug(){if(!u)return null;try{return 1!==u([],"length",{value:1}).length}catch(o){return!0}},o.exports=_},80024:o=>{"use strict";var s={__proto__:null,foo:{}},i=Object;o.exports=function hasProto(){return{__proto__:s}.foo===s.foo&&!(s instanceof i)}},64039:(o,s,i)=>{"use strict";var u="undefined"!=typeof Symbol&&Symbol,_=i(41333);o.exports=function hasNativeSymbols(){return"function"==typeof u&&("function"==typeof Symbol&&("symbol"==typeof u("foo")&&("symbol"==typeof Symbol("bar")&&_())))}},41333:o=>{"use strict";o.exports=function hasSymbols(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"==typeof Symbol.iterator)return!0;var o={},s=Symbol("test"),i=Object(s);if("string"==typeof s)return!1;if("[object Symbol]"!==Object.prototype.toString.call(s))return!1;if("[object Symbol]"!==Object.prototype.toString.call(i))return!1;for(s in o[s]=42,o)return!1;if("function"==typeof Object.keys&&0!==Object.keys(o).length)return!1;if("function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(o).length)return!1;var u=Object.getOwnPropertySymbols(o);if(1!==u.length||u[0]!==s)return!1;if(!Object.prototype.propertyIsEnumerable.call(o,s))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var _=Object.getOwnPropertyDescriptor(o,s);if(42!==_.value||!0!==_.enumerable)return!1}return!0}},9957:(o,s,i)=>{"use strict";var u=Function.prototype.call,_=Object.prototype.hasOwnProperty,w=i(66743);o.exports=w.call(u,_)},45981:o=>{function deepFreeze(o){return o instanceof Map?o.clear=o.delete=o.set=function(){throw new Error("map is read-only")}:o instanceof Set&&(o.add=o.clear=o.delete=function(){throw new Error("set is read-only")}),Object.freeze(o),Object.getOwnPropertyNames(o).forEach((function(s){var i=o[s];"object"!=typeof i||Object.isFrozen(i)||deepFreeze(i)})),o}var s=deepFreeze,i=deepFreeze;s.default=i;class Response{constructor(o){void 0===o.data&&(o.data={}),this.data=o.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}}function escapeHTML(o){return o.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function inherit(o,...s){const i=Object.create(null);for(const s in o)i[s]=o[s];return s.forEach((function(o){for(const s in o)i[s]=o[s]})),i}const emitsWrappingTags=o=>!!o.kind;class HTMLRenderer{constructor(o,s){this.buffer="",this.classPrefix=s.classPrefix,o.walk(this)}addText(o){this.buffer+=escapeHTML(o)}openNode(o){if(!emitsWrappingTags(o))return;let s=o.kind;o.sublanguage||(s=`${this.classPrefix}${s}`),this.span(s)}closeNode(o){emitsWrappingTags(o)&&(this.buffer+="")}value(){return this.buffer}span(o){this.buffer+=``}}class TokenTree{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(o){this.top.children.push(o)}openNode(o){const s={kind:o,children:[]};this.add(s),this.stack.push(s)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(o){return this.constructor._walk(o,this.rootNode)}static _walk(o,s){return"string"==typeof s?o.addText(s):s.children&&(o.openNode(s),s.children.forEach((s=>this._walk(o,s))),o.closeNode(s)),o}static _collapse(o){"string"!=typeof o&&o.children&&(o.children.every((o=>"string"==typeof o))?o.children=[o.children.join("")]:o.children.forEach((o=>{TokenTree._collapse(o)})))}}class TokenTreeEmitter extends TokenTree{constructor(o){super(),this.options=o}addKeyword(o,s){""!==o&&(this.openNode(s),this.addText(o),this.closeNode())}addText(o){""!==o&&this.add(o)}addSublanguage(o,s){const i=o.root;i.kind=s,i.sublanguage=!0,this.add(i)}toHTML(){return new HTMLRenderer(this,this.options).value()}finalize(){return!0}}function source(o){return o?"string"==typeof o?o:o.source:null}const u=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;const _="[a-zA-Z]\\w*",w="[a-zA-Z_]\\w*",x="\\b\\d+(\\.\\d+)?",C="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",j="\\b(0b[01]+)",L={begin:"\\\\[\\s\\S]",relevance:0},B={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[L]},$={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[L]},V={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},COMMENT=function(o,s,i={}){const u=inherit({className:"comment",begin:o,end:s,contains:[]},i);return u.contains.push(V),u.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),u},U=COMMENT("//","$"),z=COMMENT("/\\*","\\*/"),Y=COMMENT("#","$"),Z={className:"number",begin:x,relevance:0},ee={className:"number",begin:C,relevance:0},ie={className:"number",begin:j,relevance:0},ae={className:"number",begin:x+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},ce={begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[L,{begin:/\[/,end:/\]/,relevance:0,contains:[L]}]}]},le={className:"title",begin:_,relevance:0},pe={className:"title",begin:w,relevance:0},de={begin:"\\.\\s*"+w,relevance:0};var fe=Object.freeze({__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:_,UNDERSCORE_IDENT_RE:w,NUMBER_RE:x,C_NUMBER_RE:C,BINARY_NUMBER_RE:j,RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(o={})=>{const s=/^#![ ]*\//;return o.binary&&(o.begin=function concat(...o){return o.map((o=>source(o))).join("")}(s,/.*\b/,o.binary,/\b.*/)),inherit({className:"meta",begin:s,end:/$/,relevance:0,"on:begin":(o,s)=>{0!==o.index&&s.ignoreMatch()}},o)},BACKSLASH_ESCAPE:L,APOS_STRING_MODE:B,QUOTE_STRING_MODE:$,PHRASAL_WORDS_MODE:V,COMMENT,C_LINE_COMMENT_MODE:U,C_BLOCK_COMMENT_MODE:z,HASH_COMMENT_MODE:Y,NUMBER_MODE:Z,C_NUMBER_MODE:ee,BINARY_NUMBER_MODE:ie,CSS_NUMBER_MODE:ae,REGEXP_MODE:ce,TITLE_MODE:le,UNDERSCORE_TITLE_MODE:pe,METHOD_GUARD:de,END_SAME_AS_BEGIN:function(o){return Object.assign(o,{"on:begin":(o,s)=>{s.data._beginMatch=o[1]},"on:end":(o,s)=>{s.data._beginMatch!==o[1]&&s.ignoreMatch()}})}});function skipIfhasPrecedingDot(o,s){"."===o.input[o.index-1]&&s.ignoreMatch()}function beginKeywords(o,s){s&&o.beginKeywords&&(o.begin="\\b("+o.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",o.__beforeBegin=skipIfhasPrecedingDot,o.keywords=o.keywords||o.beginKeywords,delete o.beginKeywords,void 0===o.relevance&&(o.relevance=0))}function compileIllegal(o,s){Array.isArray(o.illegal)&&(o.illegal=function either(...o){return"("+o.map((o=>source(o))).join("|")+")"}(...o.illegal))}function compileMatch(o,s){if(o.match){if(o.begin||o.end)throw new Error("begin & end are not supported with match");o.begin=o.match,delete o.match}}function compileRelevance(o,s){void 0===o.relevance&&(o.relevance=1)}const ye=["of","and","for","in","not","or","if","then","parent","list","value"],be="keyword";function compileKeywords(o,s,i=be){const u={};return"string"==typeof o?compileList(i,o.split(" ")):Array.isArray(o)?compileList(i,o):Object.keys(o).forEach((function(i){Object.assign(u,compileKeywords(o[i],s,i))})),u;function compileList(o,i){s&&(i=i.map((o=>o.toLowerCase()))),i.forEach((function(s){const i=s.split("|");u[i[0]]=[o,scoreForKeyword(i[0],i[1])]}))}}function scoreForKeyword(o,s){return s?Number(s):function commonKeyword(o){return ye.includes(o.toLowerCase())}(o)?0:1}function compileLanguage(o,{plugins:s}){function langRe(s,i){return new RegExp(source(s),"m"+(o.case_insensitive?"i":"")+(i?"g":""))}class MultiRegex{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(o,s){s.position=this.position++,this.matchIndexes[this.matchAt]=s,this.regexes.push([s,o]),this.matchAt+=function countMatchGroups(o){return new RegExp(o.toString()+"|").exec("").length-1}(o)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const o=this.regexes.map((o=>o[1]));this.matcherRe=langRe(function join(o,s="|"){let i=0;return o.map((o=>{i+=1;const s=i;let _=source(o),w="";for(;_.length>0;){const o=u.exec(_);if(!o){w+=_;break}w+=_.substring(0,o.index),_=_.substring(o.index+o[0].length),"\\"===o[0][0]&&o[1]?w+="\\"+String(Number(o[1])+s):(w+=o[0],"("===o[0]&&i++)}return w})).map((o=>`(${o})`)).join(s)}(o),!0),this.lastIndex=0}exec(o){this.matcherRe.lastIndex=this.lastIndex;const s=this.matcherRe.exec(o);if(!s)return null;const i=s.findIndex(((o,s)=>s>0&&void 0!==o)),u=this.matchIndexes[i];return s.splice(0,i),Object.assign(s,u)}}class ResumableMultiRegex{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(o){if(this.multiRegexes[o])return this.multiRegexes[o];const s=new MultiRegex;return this.rules.slice(o).forEach((([o,i])=>s.addRule(o,i))),s.compile(),this.multiRegexes[o]=s,s}resumingScanAtSamePosition(){return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(o,s){this.rules.push([o,s]),"begin"===s.type&&this.count++}exec(o){const s=this.getMatcher(this.regexIndex);s.lastIndex=this.lastIndex;let i=s.exec(o);if(this.resumingScanAtSamePosition())if(i&&i.index===this.lastIndex);else{const s=this.getMatcher(0);s.lastIndex=this.lastIndex+1,i=s.exec(o)}return i&&(this.regexIndex+=i.position+1,this.regexIndex===this.count&&this.considerAll()),i}}if(o.compilerExtensions||(o.compilerExtensions=[]),o.contains&&o.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return o.classNameAliases=inherit(o.classNameAliases||{}),function compileMode(s,i){const u=s;if(s.isCompiled)return u;[compileMatch].forEach((o=>o(s,i))),o.compilerExtensions.forEach((o=>o(s,i))),s.__beforeBegin=null,[beginKeywords,compileIllegal,compileRelevance].forEach((o=>o(s,i))),s.isCompiled=!0;let _=null;if("object"==typeof s.keywords&&(_=s.keywords.$pattern,delete s.keywords.$pattern),s.keywords&&(s.keywords=compileKeywords(s.keywords,o.case_insensitive)),s.lexemes&&_)throw new Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return _=_||s.lexemes||/\w+/,u.keywordPatternRe=langRe(_,!0),i&&(s.begin||(s.begin=/\B|\b/),u.beginRe=langRe(s.begin),s.endSameAsBegin&&(s.end=s.begin),s.end||s.endsWithParent||(s.end=/\B|\b/),s.end&&(u.endRe=langRe(s.end)),u.terminatorEnd=source(s.end)||"",s.endsWithParent&&i.terminatorEnd&&(u.terminatorEnd+=(s.end?"|":"")+i.terminatorEnd)),s.illegal&&(u.illegalRe=langRe(s.illegal)),s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((function(o){return function expandOrCloneMode(o){o.variants&&!o.cachedVariants&&(o.cachedVariants=o.variants.map((function(s){return inherit(o,{variants:null},s)})));if(o.cachedVariants)return o.cachedVariants;if(dependencyOnParent(o))return inherit(o,{starts:o.starts?inherit(o.starts):null});if(Object.isFrozen(o))return inherit(o);return o}("self"===o?s:o)}))),s.contains.forEach((function(o){compileMode(o,u)})),s.starts&&compileMode(s.starts,i),u.matcher=function buildModeRegex(o){const s=new ResumableMultiRegex;return o.contains.forEach((o=>s.addRule(o.begin,{rule:o,type:"begin"}))),o.terminatorEnd&&s.addRule(o.terminatorEnd,{type:"end"}),o.illegal&&s.addRule(o.illegal,{type:"illegal"}),s}(u),u}(o)}function dependencyOnParent(o){return!!o&&(o.endsWithParent||dependencyOnParent(o.starts))}function BuildVuePlugin(o){const s={props:["language","code","autodetect"],data:function(){return{detectedLanguage:"",unknownLanguage:!1}},computed:{className(){return this.unknownLanguage?"":"hljs "+this.detectedLanguage},highlighted(){if(!this.autoDetect&&!o.getLanguage(this.language))return console.warn(`The language "${this.language}" you specified could not be found.`),this.unknownLanguage=!0,escapeHTML(this.code);let s={};return this.autoDetect?(s=o.highlightAuto(this.code),this.detectedLanguage=s.language):(s=o.highlight(this.language,this.code,this.ignoreIllegals),this.detectedLanguage=this.language),s.value},autoDetect(){return!this.language||function hasValueOrEmptyAttribute(o){return Boolean(o||""===o)}(this.autodetect)},ignoreIllegals:()=>!0},render(o){return o("pre",{},[o("code",{class:this.className,domProps:{innerHTML:this.highlighted}})])}};return{Component:s,VuePlugin:{install(o){o.component("highlightjs",s)}}}}const _e={"after:highlightElement":({el:o,result:s,text:i})=>{const u=nodeStream(o);if(!u.length)return;const _=document.createElement("div");_.innerHTML=s.value,s.value=function mergeStreams(o,s,i){let u=0,_="";const w=[];function selectStream(){return o.length&&s.length?o[0].offset!==s[0].offset?o[0].offset"}function close(o){_+=""}function render(o){("start"===o.event?open:close)(o.node)}for(;o.length||s.length;){let s=selectStream();if(_+=escapeHTML(i.substring(u,s[0].offset)),u=s[0].offset,s===o){w.reverse().forEach(close);do{render(s.splice(0,1)[0]),s=selectStream()}while(s===o&&s.length&&s[0].offset===u);w.reverse().forEach(open)}else"start"===s[0].event?w.push(s[0].node):w.pop(),render(s.splice(0,1)[0])}return _+escapeHTML(i.substr(u))}(u,nodeStream(_),i)}};function tag(o){return o.nodeName.toLowerCase()}function nodeStream(o){const s=[];return function _nodeStream(o,i){for(let u=o.firstChild;u;u=u.nextSibling)3===u.nodeType?i+=u.nodeValue.length:1===u.nodeType&&(s.push({event:"start",offset:i,node:u}),i=_nodeStream(u,i),tag(u).match(/br|hr|img|input/)||s.push({event:"stop",offset:i,node:u}));return i}(o,0),s}const we={},error=o=>{console.error(o)},warn=(o,...s)=>{console.log(`WARN: ${o}`,...s)},deprecated=(o,s)=>{we[`${o}/${s}`]||(console.log(`Deprecated as of ${o}. ${s}`),we[`${o}/${s}`]=!0)},Se=escapeHTML,xe=inherit,Pe=Symbol("nomatch");var Te=function(o){const i=Object.create(null),u=Object.create(null),_=[];let w=!0;const x=/(^(<[^>]+>|\t|)+|\n)/gm,C="Could not find the language '{}', did you forget to load/include a language module?",j={disableAutodetect:!0,name:"Plain text",contains:[]};let L={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:TokenTreeEmitter};function shouldNotHighlight(o){return L.noHighlightRe.test(o)}function highlight(o,s,i,u){let _="",w="";"object"==typeof s?(_=o,i=s.ignoreIllegals,w=s.language,u=void 0):(deprecated("10.7.0","highlight(lang, code, ...args) has been deprecated."),deprecated("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"),w=o,_=s);const x={code:_,language:w};fire("before:highlight",x);const C=x.result?x.result:_highlight(x.language,x.code,i,u);return C.code=x.code,fire("after:highlight",C),C}function _highlight(o,s,u,x){function keywordData(o,s){const i=B.case_insensitive?s[0].toLowerCase():s[0];return Object.prototype.hasOwnProperty.call(o.keywords,i)&&o.keywords[i]}function processBuffer(){null!=U.subLanguage?function processSubLanguage(){if(""===Z)return;let o=null;if("string"==typeof U.subLanguage){if(!i[U.subLanguage])return void Y.addText(Z);o=_highlight(U.subLanguage,Z,!0,z[U.subLanguage]),z[U.subLanguage]=o.top}else o=highlightAuto(Z,U.subLanguage.length?U.subLanguage:null);U.relevance>0&&(ee+=o.relevance),Y.addSublanguage(o.emitter,o.language)}():function processKeywords(){if(!U.keywords)return void Y.addText(Z);let o=0;U.keywordPatternRe.lastIndex=0;let s=U.keywordPatternRe.exec(Z),i="";for(;s;){i+=Z.substring(o,s.index);const u=keywordData(U,s);if(u){const[o,_]=u;if(Y.addText(i),i="",ee+=_,o.startsWith("_"))i+=s[0];else{const i=B.classNameAliases[o]||o;Y.addKeyword(s[0],i)}}else i+=s[0];o=U.keywordPatternRe.lastIndex,s=U.keywordPatternRe.exec(Z)}i+=Z.substr(o),Y.addText(i)}(),Z=""}function startNewMode(o){return o.className&&Y.openNode(B.classNameAliases[o.className]||o.className),U=Object.create(o,{parent:{value:U}}),U}function endOfMode(o,s,i){let u=function startsWith(o,s){const i=o&&o.exec(s);return i&&0===i.index}(o.endRe,i);if(u){if(o["on:end"]){const i=new Response(o);o["on:end"](s,i),i.isMatchIgnored&&(u=!1)}if(u){for(;o.endsParent&&o.parent;)o=o.parent;return o}}if(o.endsWithParent)return endOfMode(o.parent,s,i)}function doIgnore(o){return 0===U.matcher.regexIndex?(Z+=o[0],1):(ce=!0,0)}function doBeginMatch(o){const s=o[0],i=o.rule,u=new Response(i),_=[i.__beforeBegin,i["on:begin"]];for(const i of _)if(i&&(i(o,u),u.isMatchIgnored))return doIgnore(s);return i&&i.endSameAsBegin&&(i.endRe=function escape(o){return new RegExp(o.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")}(s)),i.skip?Z+=s:(i.excludeBegin&&(Z+=s),processBuffer(),i.returnBegin||i.excludeBegin||(Z=s)),startNewMode(i),i.returnBegin?0:s.length}function doEndMatch(o){const i=o[0],u=s.substr(o.index),_=endOfMode(U,o,u);if(!_)return Pe;const w=U;w.skip?Z+=i:(w.returnEnd||w.excludeEnd||(Z+=i),processBuffer(),w.excludeEnd&&(Z=i));do{U.className&&Y.closeNode(),U.skip||U.subLanguage||(ee+=U.relevance),U=U.parent}while(U!==_.parent);return _.starts&&(_.endSameAsBegin&&(_.starts.endRe=_.endRe),startNewMode(_.starts)),w.returnEnd?0:i.length}let j={};function processLexeme(i,_){const x=_&&_[0];if(Z+=i,null==x)return processBuffer(),0;if("begin"===j.type&&"end"===_.type&&j.index===_.index&&""===x){if(Z+=s.slice(_.index,_.index+1),!w){const s=new Error("0 width match regex");throw s.languageName=o,s.badRule=j.rule,s}return 1}if(j=_,"begin"===_.type)return doBeginMatch(_);if("illegal"===_.type&&!u){const o=new Error('Illegal lexeme "'+x+'" for mode "'+(U.className||"")+'"');throw o.mode=U,o}if("end"===_.type){const o=doEndMatch(_);if(o!==Pe)return o}if("illegal"===_.type&&""===x)return 1;if(ae>1e5&&ae>3*_.index){throw new Error("potential infinite loop, way more iterations than matches")}return Z+=x,x.length}const B=getLanguage(o);if(!B)throw error(C.replace("{}",o)),new Error('Unknown language: "'+o+'"');const $=compileLanguage(B,{plugins:_});let V="",U=x||$;const z={},Y=new L.__emitter(L);!function processContinuations(){const o=[];for(let s=U;s!==B;s=s.parent)s.className&&o.unshift(s.className);o.forEach((o=>Y.openNode(o)))}();let Z="",ee=0,ie=0,ae=0,ce=!1;try{for(U.matcher.considerAll();;){ae++,ce?ce=!1:U.matcher.considerAll(),U.matcher.lastIndex=ie;const o=U.matcher.exec(s);if(!o)break;const i=processLexeme(s.substring(ie,o.index),o);ie=o.index+i}return processLexeme(s.substr(ie)),Y.closeAllNodes(),Y.finalize(),V=Y.toHTML(),{relevance:Math.floor(ee),value:V,language:o,illegal:!1,emitter:Y,top:U}}catch(i){if(i.message&&i.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:i.message,context:s.slice(ie-100,ie+100),mode:i.mode},sofar:V,relevance:0,value:Se(s),emitter:Y};if(w)return{illegal:!1,relevance:0,value:Se(s),emitter:Y,language:o,top:U,errorRaised:i};throw i}}function highlightAuto(o,s){s=s||L.languages||Object.keys(i);const u=function justTextHighlightResult(o){const s={relevance:0,emitter:new L.__emitter(L),value:Se(o),illegal:!1,top:j};return s.emitter.addText(o),s}(o),_=s.filter(getLanguage).filter(autoDetection).map((s=>_highlight(s,o,!1)));_.unshift(u);const w=_.sort(((o,s)=>{if(o.relevance!==s.relevance)return s.relevance-o.relevance;if(o.language&&s.language){if(getLanguage(o.language).supersetOf===s.language)return 1;if(getLanguage(s.language).supersetOf===o.language)return-1}return 0})),[x,C]=w,B=x;return B.second_best=C,B}const B={"before:highlightElement":({el:o})=>{L.useBR&&(o.innerHTML=o.innerHTML.replace(/\n/g,"").replace(//g,"\n"))},"after:highlightElement":({result:o})=>{L.useBR&&(o.value=o.value.replace(/\n/g,"
"))}},$=/^(<[^>]+>|\t)+/gm,V={"after:highlightElement":({result:o})=>{L.tabReplace&&(o.value=o.value.replace($,(o=>o.replace(/\t/g,L.tabReplace))))}};function highlightElement(o){let s=null;const i=function blockLanguage(o){let s=o.className+" ";s+=o.parentNode?o.parentNode.className:"";const i=L.languageDetectRe.exec(s);if(i){const s=getLanguage(i[1]);return s||(warn(C.replace("{}",i[1])),warn("Falling back to no-highlight mode for this block.",o)),s?i[1]:"no-highlight"}return s.split(/\s+/).find((o=>shouldNotHighlight(o)||getLanguage(o)))}(o);if(shouldNotHighlight(i))return;fire("before:highlightElement",{el:o,language:i}),s=o;const _=s.textContent,w=i?highlight(_,{language:i,ignoreIllegals:!0}):highlightAuto(_);fire("after:highlightElement",{el:o,result:w,text:_}),o.innerHTML=w.value,function updateClassName(o,s,i){const _=s?u[s]:i;o.classList.add("hljs"),_&&o.classList.add(_)}(o,i,w.language),o.result={language:w.language,re:w.relevance,relavance:w.relevance},w.second_best&&(o.second_best={language:w.second_best.language,re:w.second_best.relevance,relavance:w.second_best.relevance})}const initHighlighting=()=>{if(initHighlighting.called)return;initHighlighting.called=!0,deprecated("10.6.0","initHighlighting() is deprecated. Use highlightAll() instead.");document.querySelectorAll("pre code").forEach(highlightElement)};let U=!1;function highlightAll(){if("loading"===document.readyState)return void(U=!0);document.querySelectorAll("pre code").forEach(highlightElement)}function getLanguage(o){return o=(o||"").toLowerCase(),i[o]||i[u[o]]}function registerAliases(o,{languageName:s}){"string"==typeof o&&(o=[o]),o.forEach((o=>{u[o.toLowerCase()]=s}))}function autoDetection(o){const s=getLanguage(o);return s&&!s.disableAutodetect}function fire(o,s){const i=o;_.forEach((function(o){o[i]&&o[i](s)}))}"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(function boot(){U&&highlightAll()}),!1),Object.assign(o,{highlight,highlightAuto,highlightAll,fixMarkup:function deprecateFixMarkup(o){return deprecated("10.2.0","fixMarkup will be removed entirely in v11.0"),deprecated("10.2.0","Please see https://github.com/highlightjs/highlight.js/issues/2534"),function fixMarkup(o){return L.tabReplace||L.useBR?o.replace(x,(o=>"\n"===o?L.useBR?"
":o:L.tabReplace?o.replace(/\t/g,L.tabReplace):o)):o}(o)},highlightElement,highlightBlock:function deprecateHighlightBlock(o){return deprecated("10.7.0","highlightBlock will be removed entirely in v12.0"),deprecated("10.7.0","Please use highlightElement now."),highlightElement(o)},configure:function configure(o){o.useBR&&(deprecated("10.3.0","'useBR' will be removed entirely in v11.0"),deprecated("10.3.0","Please see https://github.com/highlightjs/highlight.js/issues/2559")),L=xe(L,o)},initHighlighting,initHighlightingOnLoad:function initHighlightingOnLoad(){deprecated("10.6.0","initHighlightingOnLoad() is deprecated. Use highlightAll() instead."),U=!0},registerLanguage:function registerLanguage(s,u){let _=null;try{_=u(o)}catch(o){if(error("Language definition for '{}' could not be registered.".replace("{}",s)),!w)throw o;error(o),_=j}_.name||(_.name=s),i[s]=_,_.rawDefinition=u.bind(null,o),_.aliases&®isterAliases(_.aliases,{languageName:s})},unregisterLanguage:function unregisterLanguage(o){delete i[o];for(const s of Object.keys(u))u[s]===o&&delete u[s]},listLanguages:function listLanguages(){return Object.keys(i)},getLanguage,registerAliases,requireLanguage:function requireLanguage(o){deprecated("10.4.0","requireLanguage will be removed entirely in v11."),deprecated("10.4.0","Please see https://github.com/highlightjs/highlight.js/pull/2844");const s=getLanguage(o);if(s)return s;throw new Error("The '{}' language is required, but not loaded.".replace("{}",o))},autoDetection,inherit:xe,addPlugin:function addPlugin(o){!function upgradePluginAPI(o){o["before:highlightBlock"]&&!o["before:highlightElement"]&&(o["before:highlightElement"]=s=>{o["before:highlightBlock"](Object.assign({block:s.el},s))}),o["after:highlightBlock"]&&!o["after:highlightElement"]&&(o["after:highlightElement"]=s=>{o["after:highlightBlock"](Object.assign({block:s.el},s))})}(o),_.push(o)},vuePlugin:BuildVuePlugin(o).VuePlugin}),o.debugMode=function(){w=!1},o.safeMode=function(){w=!0},o.versionString="10.7.3";for(const o in fe)"object"==typeof fe[o]&&s(fe[o]);return Object.assign(o,fe),o.addPlugin(B),o.addPlugin(_e),o.addPlugin(V),o}({});o.exports=Te},35344:o=>{function concat(...o){return o.map((o=>function source(o){return o?"string"==typeof o?o:o.source:null}(o))).join("")}o.exports=function bash(o){const s={},i={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[s]}]};Object.assign(s,{className:"variable",variants:[{begin:concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},i]});const u={className:"subst",begin:/\$\(/,end:/\)/,contains:[o.BACKSLASH_ESCAPE]},_={begin:/<<-?\s*(?=\w+)/,starts:{contains:[o.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},w={className:"string",begin:/"/,end:/"/,contains:[o.BACKSLASH_ESCAPE,s,u]};u.contains.push(w);const x={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},o.NUMBER_MODE,s]},C=o.SHEBANG({binary:`(${["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"].join("|")})`,relevance:10}),j={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[o.inherit(o.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z._-]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp"},contains:[C,o.SHEBANG(),j,x,o.HASH_COMMENT_MODE,_,w,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},s]}}},73402:o=>{function concat(...o){return o.map((o=>function source(o){return o?"string"==typeof o?o:o.source:null}(o))).join("")}o.exports=function http(o){const s="HTTP/(2|1\\.[01])",i={className:"attribute",begin:concat("^",/[A-Za-z][A-Za-z0-9-]*/,"(?=\\:\\s)"),starts:{contains:[{className:"punctuation",begin:/: /,relevance:0,starts:{end:"$",relevance:0}}]}},u=[i,{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}];return{name:"HTTP",aliases:["https"],illegal:/\S/,contains:[{begin:"^(?="+s+" \\d{3})",end:/$/,contains:[{className:"meta",begin:s},{className:"number",begin:"\\b\\d{3}\\b"}],starts:{end:/\b\B/,illegal:/\S/,contains:u}},{begin:"(?=^[A-Z]+ (.*?) "+s+"$)",end:/$/,contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{className:"meta",begin:s},{className:"keyword",begin:"[A-Z]+"}],starts:{end:/\b\B/,illegal:/\S/,contains:u}},o.inherit(i,{relevance:0})]}}},95089:o=>{const s="[A-Za-z$_][0-9A-Za-z$_]*",i=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],u=["true","false","null","undefined","NaN","Infinity"],_=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer","BigInt64Array","BigUint64Array","BigInt"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);function lookahead(o){return concat("(?=",o,")")}function concat(...o){return o.map((o=>function source(o){return o?"string"==typeof o?o:o.source:null}(o))).join("")}o.exports=function javascript(o){const w=s,x="<>",C="",j={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(o,s)=>{const i=o[0].length+o.index,u=o.input[i];"<"!==u?">"===u&&(((o,{after:s})=>{const i="",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:o.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:L,contains:le}]}]},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:x,end:C},{begin:j.begin,"on:begin":j.isTrulyOpeningTag,end:j.end}],subLanguage:"xml",contains:[{begin:j.begin,end:j.end,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/[{;]/,excludeEnd:!0,keywords:L,contains:["self",o.inherit(o.TITLE_MODE,{begin:w}),pe],illegal:/%/},{beginKeywords:"while if switch catch for"},{className:"function",begin:o.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,contains:[pe,o.inherit(o.TITLE_MODE,{begin:w})]},{variants:[{begin:"\\."+w},{begin:"\\$"+w}],relevance:0},{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"[\]]/,contains:[{beginKeywords:"extends"},o.UNDERSCORE_TITLE_MODE]},{begin:/\b(?=constructor)/,end:/[{;]/,excludeEnd:!0,contains:[o.inherit(o.TITLE_MODE,{begin:w}),"self",pe]},{begin:"(get|set)\\s+(?="+w+"\\()",end:/\{/,keywords:"get set",contains:[o.inherit(o.TITLE_MODE,{begin:w}),{begin:/\(\)/},pe]},{begin:/\$[(.]/}]}}},65772:o=>{o.exports=function json(o){const s={literal:"true false null"},i=[o.C_LINE_COMMENT_MODE,o.C_BLOCK_COMMENT_MODE],u=[o.QUOTE_STRING_MODE,o.C_NUMBER_MODE],_={end:",",endsWithParent:!0,excludeEnd:!0,contains:u,keywords:s},w={begin:/\{/,end:/\}/,contains:[{className:"attr",begin:/"/,end:/"/,contains:[o.BACKSLASH_ESCAPE],illegal:"\\n"},o.inherit(_,{begin:/:/})].concat(i),illegal:"\\S"},x={begin:"\\[",end:"\\]",contains:[o.inherit(_)],illegal:"\\S"};return u.push(w,x),i.forEach((function(o){u.push(o)})),{name:"JSON",contains:u,keywords:s,illegal:"\\S"}}},26571:o=>{o.exports=function powershell(o){const s={$pattern:/-?[A-z\.\-]+\b/,keyword:"if else foreach return do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch hidden static parameter",built_in:"ac asnp cat cd CFS chdir clc clear clhy cli clp cls clv cnsn compare copy cp cpi cpp curl cvpa dbp del diff dir dnsn ebp echo|0 epal epcsv epsn erase etsn exsn fc fhx fl ft fw gal gbp gc gcb gci gcm gcs gdr gerr ghy gi gin gjb gl gm gmo gp gps gpv group gsn gsnp gsv gtz gu gv gwmi h history icm iex ihy ii ipal ipcsv ipmo ipsn irm ise iwmi iwr kill lp ls man md measure mi mount move mp mv nal ndr ni nmo npssc nsn nv ogv oh popd ps pushd pwd r rbp rcjb rcsn rd rdr ren ri rjb rm rmdir rmo rni rnp rp rsn rsnp rujb rv rvpa rwmi sajb sal saps sasv sbp sc scb select set shcm si sl sleep sls sort sp spjb spps spsv start stz sujb sv swmi tee trcm type wget where wjb write"},i={begin:"`[\\s\\S]",relevance:0},u={className:"variable",variants:[{begin:/\$\B/},{className:"keyword",begin:/\$this/},{begin:/\$[\w\d][\w\d_:]*/}]},_={className:"string",variants:[{begin:/"/,end:/"/},{begin:/@"/,end:/^"@/}],contains:[i,u,{className:"variable",begin:/\$[A-z]/,end:/[^A-z]/}]},w={className:"string",variants:[{begin:/'/,end:/'/},{begin:/@'/,end:/^'@/}]},x=o.inherit(o.COMMENT(null,null),{variants:[{begin:/#/,end:/$/},{begin:/<#/,end:/#>/}],contains:[{className:"doctag",variants:[{begin:/\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/},{begin:/\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\s+\S+/}]}]}),C={className:"built_in",variants:[{begin:"(".concat("Add|Clear|Close|Copy|Enter|Exit|Find|Format|Get|Hide|Join|Lock|Move|New|Open|Optimize|Pop|Push|Redo|Remove|Rename|Reset|Resize|Search|Select|Set|Show|Skip|Split|Step|Switch|Undo|Unlock|Watch|Backup|Checkpoint|Compare|Compress|Convert|ConvertFrom|ConvertTo|Dismount|Edit|Expand|Export|Group|Import|Initialize|Limit|Merge|Mount|Out|Publish|Restore|Save|Sync|Unpublish|Update|Approve|Assert|Build|Complete|Confirm|Deny|Deploy|Disable|Enable|Install|Invoke|Register|Request|Restart|Resume|Start|Stop|Submit|Suspend|Uninstall|Unregister|Wait|Debug|Measure|Ping|Repair|Resolve|Test|Trace|Connect|Disconnect|Read|Receive|Send|Write|Block|Grant|Protect|Revoke|Unblock|Unprotect|Use|ForEach|Sort|Tee|Where",")+(-)[\\w\\d]+")}]},j={className:"class",beginKeywords:"class enum",end:/\s*[{]/,excludeEnd:!0,relevance:0,contains:[o.TITLE_MODE]},L={className:"function",begin:/function\s+/,end:/\s*\{|$/,excludeEnd:!0,returnBegin:!0,relevance:0,contains:[{begin:"function",relevance:0,className:"keyword"},{className:"title",begin:/\w[\w\d]*((-)[\w\d]+)*/,relevance:0},{begin:/\(/,end:/\)/,className:"params",relevance:0,contains:[u]}]},B={begin:/using\s/,end:/$/,returnBegin:!0,contains:[_,w,{className:"keyword",begin:/(using|assembly|command|module|namespace|type)/}]},$={variants:[{className:"operator",begin:"(".concat("-and|-as|-band|-bnot|-bor|-bxor|-casesensitive|-ccontains|-ceq|-cge|-cgt|-cle|-clike|-clt|-cmatch|-cne|-cnotcontains|-cnotlike|-cnotmatch|-contains|-creplace|-csplit|-eq|-exact|-f|-file|-ge|-gt|-icontains|-ieq|-ige|-igt|-ile|-ilike|-ilt|-imatch|-in|-ine|-inotcontains|-inotlike|-inotmatch|-ireplace|-is|-isnot|-isplit|-join|-le|-like|-lt|-match|-ne|-not|-notcontains|-notin|-notlike|-notmatch|-or|-regex|-replace|-shl|-shr|-split|-wildcard|-xor",")\\b")},{className:"literal",begin:/(-)[\w\d]+/,relevance:0}]},V={className:"function",begin:/\[.*\]\s*[\w]+[ ]??\(/,end:/$/,returnBegin:!0,relevance:0,contains:[{className:"keyword",begin:"(".concat(s.keyword.toString().replace(/\s/g,"|"),")\\b"),endsParent:!0,relevance:0},o.inherit(o.TITLE_MODE,{endsParent:!0})]},U=[V,x,i,o.NUMBER_MODE,_,w,C,u,{className:"literal",begin:/\$(null|true|false)\b/},{className:"selector-tag",begin:/@\B/,relevance:0}],z={begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[].concat("self",U,{begin:"("+["string","char","byte","int","long","bool","decimal","single","double","DateTime","xml","array","hashtable","void"].join("|")+")",className:"built_in",relevance:0},{className:"type",begin:/[\.\w\d]+/,relevance:0})};return V.contains.unshift(z),{name:"PowerShell",aliases:["ps","ps1"],case_insensitive:!0,keywords:s,contains:U.concat(j,L,B,$,z)}}},17285:o=>{function source(o){return o?"string"==typeof o?o:o.source:null}function lookahead(o){return concat("(?=",o,")")}function concat(...o){return o.map((o=>source(o))).join("")}function either(...o){return"("+o.map((o=>source(o))).join("|")+")"}o.exports=function xml(o){const s=concat(/[A-Z_]/,function optional(o){return concat("(",o,")?")}(/[A-Z0-9_.-]*:/),/[A-Z0-9_.-]*/),i={className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},u={begin:/\s/,contains:[{className:"meta-keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},_=o.inherit(u,{begin:/\(/,end:/\)/}),w=o.inherit(o.APOS_STRING_MODE,{className:"meta-string"}),x=o.inherit(o.QUOTE_STRING_MODE,{className:"meta-string"}),C={endsWithParent:!0,illegal:/`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin://,relevance:10,contains:[u,x,w,_,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin://,contains:[u,_,x,w]}]}]},o.COMMENT(//,{relevance:10}),{begin://,relevance:10},i,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:/)/,end:/>/,keywords:{name:"style"},contains:[C],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:/)/,end:/>/,keywords:{name:"script"},contains:[C],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:concat(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:s,relevance:0,starts:C}]},{className:"tag",begin:concat(/<\//,lookahead(concat(s,/>/))),contains:[{className:"name",begin:s,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}}},17533:o=>{o.exports=function yaml(o){var s="true false yes no null",i="[\\w#;/?:@&=+$,.~*'()[\\]]+",u={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[o.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},_=o.inherit(u,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),w={className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},x={end:",",endsWithParent:!0,excludeEnd:!0,keywords:s,relevance:0},C={begin:/\{/,end:/\}/,contains:[x],illegal:"\\n",relevance:0},j={begin:"\\[",end:"\\]",contains:[x],illegal:"\\n",relevance:0},L=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+i},{className:"type",begin:"!<"+i+">"},{className:"type",begin:"!"+i},{className:"type",begin:"!!"+i},{className:"meta",begin:"&"+o.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+o.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},o.HASH_COMMENT_MODE,{beginKeywords:s,keywords:{literal:s}},w,{className:"number",begin:o.C_NUMBER_RE+"\\b",relevance:0},C,j,u],B=[...L];return B.pop(),B.push(_),x.contains=B,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:L}}},251:(o,s)=>{s.read=function(o,s,i,u,_){var w,x,C=8*_-u-1,j=(1<>1,B=-7,$=i?_-1:0,V=i?-1:1,U=o[s+$];for($+=V,w=U&(1<<-B)-1,U>>=-B,B+=C;B>0;w=256*w+o[s+$],$+=V,B-=8);for(x=w&(1<<-B)-1,w>>=-B,B+=u;B>0;x=256*x+o[s+$],$+=V,B-=8);if(0===w)w=1-L;else{if(w===j)return x?NaN:1/0*(U?-1:1);x+=Math.pow(2,u),w-=L}return(U?-1:1)*x*Math.pow(2,w-u)},s.write=function(o,s,i,u,_,w){var x,C,j,L=8*w-_-1,B=(1<>1,V=23===_?Math.pow(2,-24)-Math.pow(2,-77):0,U=u?0:w-1,z=u?1:-1,Y=s<0||0===s&&1/s<0?1:0;for(s=Math.abs(s),isNaN(s)||s===1/0?(C=isNaN(s)?1:0,x=B):(x=Math.floor(Math.log(s)/Math.LN2),s*(j=Math.pow(2,-x))<1&&(x--,j*=2),(s+=x+$>=1?V/j:V*Math.pow(2,1-$))*j>=2&&(x++,j/=2),x+$>=B?(C=0,x=B):x+$>=1?(C=(s*j-1)*Math.pow(2,_),x+=$):(C=s*Math.pow(2,$-1)*Math.pow(2,_),x=0));_>=8;o[i+U]=255&C,U+=z,C/=256,_-=8);for(x=x<<_|C,L+=_;L>0;o[i+U]=255&x,U+=z,x/=256,L-=8);o[i+U-z]|=128*Y}},9404:function(o){o.exports=function(){"use strict";var o=Array.prototype.slice;function createClass(o,s){s&&(o.prototype=Object.create(s.prototype)),o.prototype.constructor=o}function Iterable(o){return isIterable(o)?o:Seq(o)}function KeyedIterable(o){return isKeyed(o)?o:KeyedSeq(o)}function IndexedIterable(o){return isIndexed(o)?o:IndexedSeq(o)}function SetIterable(o){return isIterable(o)&&!isAssociative(o)?o:SetSeq(o)}function isIterable(o){return!(!o||!o[s])}function isKeyed(o){return!(!o||!o[i])}function isIndexed(o){return!(!o||!o[u])}function isAssociative(o){return isKeyed(o)||isIndexed(o)}function isOrdered(o){return!(!o||!o[_])}createClass(KeyedIterable,Iterable),createClass(IndexedIterable,Iterable),createClass(SetIterable,Iterable),Iterable.isIterable=isIterable,Iterable.isKeyed=isKeyed,Iterable.isIndexed=isIndexed,Iterable.isAssociative=isAssociative,Iterable.isOrdered=isOrdered,Iterable.Keyed=KeyedIterable,Iterable.Indexed=IndexedIterable,Iterable.Set=SetIterable;var s="@@__IMMUTABLE_ITERABLE__@@",i="@@__IMMUTABLE_KEYED__@@",u="@@__IMMUTABLE_INDEXED__@@",_="@@__IMMUTABLE_ORDERED__@@",w="delete",x=5,C=1<>>0;if(""+i!==s||4294967295===i)return NaN;s=i}return s<0?ensureSize(o)+s:s}function returnTrue(){return!0}function wholeSlice(o,s,i){return(0===o||void 0!==i&&o<=-i)&&(void 0===s||void 0!==i&&s>=i)}function resolveBegin(o,s){return resolveIndex(o,s,0)}function resolveEnd(o,s){return resolveIndex(o,s,s)}function resolveIndex(o,s,i){return void 0===o?i:o<0?Math.max(0,s+o):void 0===s?o:Math.min(s,o)}var V=0,U=1,z=2,Y="function"==typeof Symbol&&Symbol.iterator,Z="@@iterator",ee=Y||Z;function Iterator(o){this.next=o}function iteratorValue(o,s,i,u){var _=0===o?s:1===o?i:[s,i];return u?u.value=_:u={value:_,done:!1},u}function iteratorDone(){return{value:void 0,done:!0}}function hasIterator(o){return!!getIteratorFn(o)}function isIterator(o){return o&&"function"==typeof o.next}function getIterator(o){var s=getIteratorFn(o);return s&&s.call(o)}function getIteratorFn(o){var s=o&&(Y&&o[Y]||o[Z]);if("function"==typeof s)return s}function isArrayLike(o){return o&&"number"==typeof o.length}function Seq(o){return null==o?emptySequence():isIterable(o)?o.toSeq():seqFromValue(o)}function KeyedSeq(o){return null==o?emptySequence().toKeyedSeq():isIterable(o)?isKeyed(o)?o.toSeq():o.fromEntrySeq():keyedSeqFromValue(o)}function IndexedSeq(o){return null==o?emptySequence():isIterable(o)?isKeyed(o)?o.entrySeq():o.toIndexedSeq():indexedSeqFromValue(o)}function SetSeq(o){return(null==o?emptySequence():isIterable(o)?isKeyed(o)?o.entrySeq():o:indexedSeqFromValue(o)).toSetSeq()}Iterator.prototype.toString=function(){return"[Iterator]"},Iterator.KEYS=V,Iterator.VALUES=U,Iterator.ENTRIES=z,Iterator.prototype.inspect=Iterator.prototype.toSource=function(){return this.toString()},Iterator.prototype[ee]=function(){return this},createClass(Seq,Iterable),Seq.of=function(){return Seq(arguments)},Seq.prototype.toSeq=function(){return this},Seq.prototype.toString=function(){return this.__toString("Seq {","}")},Seq.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},Seq.prototype.__iterate=function(o,s){return seqIterate(this,o,s,!0)},Seq.prototype.__iterator=function(o,s){return seqIterator(this,o,s,!0)},createClass(KeyedSeq,Seq),KeyedSeq.prototype.toKeyedSeq=function(){return this},createClass(IndexedSeq,Seq),IndexedSeq.of=function(){return IndexedSeq(arguments)},IndexedSeq.prototype.toIndexedSeq=function(){return this},IndexedSeq.prototype.toString=function(){return this.__toString("Seq [","]")},IndexedSeq.prototype.__iterate=function(o,s){return seqIterate(this,o,s,!1)},IndexedSeq.prototype.__iterator=function(o,s){return seqIterator(this,o,s,!1)},createClass(SetSeq,Seq),SetSeq.of=function(){return SetSeq(arguments)},SetSeq.prototype.toSetSeq=function(){return this},Seq.isSeq=isSeq,Seq.Keyed=KeyedSeq,Seq.Set=SetSeq,Seq.Indexed=IndexedSeq;var ie,ae,ce,le="@@__IMMUTABLE_SEQ__@@";function ArraySeq(o){this._array=o,this.size=o.length}function ObjectSeq(o){var s=Object.keys(o);this._object=o,this._keys=s,this.size=s.length}function IterableSeq(o){this._iterable=o,this.size=o.length||o.size}function IteratorSeq(o){this._iterator=o,this._iteratorCache=[]}function isSeq(o){return!(!o||!o[le])}function emptySequence(){return ie||(ie=new ArraySeq([]))}function keyedSeqFromValue(o){var s=Array.isArray(o)?new ArraySeq(o).fromEntrySeq():isIterator(o)?new IteratorSeq(o).fromEntrySeq():hasIterator(o)?new IterableSeq(o).fromEntrySeq():"object"==typeof o?new ObjectSeq(o):void 0;if(!s)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+o);return s}function indexedSeqFromValue(o){var s=maybeIndexedSeqFromValue(o);if(!s)throw new TypeError("Expected Array or iterable object of values: "+o);return s}function seqFromValue(o){var s=maybeIndexedSeqFromValue(o)||"object"==typeof o&&new ObjectSeq(o);if(!s)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+o);return s}function maybeIndexedSeqFromValue(o){return isArrayLike(o)?new ArraySeq(o):isIterator(o)?new IteratorSeq(o):hasIterator(o)?new IterableSeq(o):void 0}function seqIterate(o,s,i,u){var _=o._cache;if(_){for(var w=_.length-1,x=0;x<=w;x++){var C=_[i?w-x:x];if(!1===s(C[1],u?C[0]:x,o))return x+1}return x}return o.__iterateUncached(s,i)}function seqIterator(o,s,i,u){var _=o._cache;if(_){var w=_.length-1,x=0;return new Iterator((function(){var o=_[i?w-x:x];return x++>w?iteratorDone():iteratorValue(s,u?o[0]:x-1,o[1])}))}return o.__iteratorUncached(s,i)}function fromJS(o,s){return s?fromJSWith(s,o,"",{"":o}):fromJSDefault(o)}function fromJSWith(o,s,i,u){return Array.isArray(s)?o.call(u,i,IndexedSeq(s).map((function(i,u){return fromJSWith(o,i,u,s)}))):isPlainObj(s)?o.call(u,i,KeyedSeq(s).map((function(i,u){return fromJSWith(o,i,u,s)}))):s}function fromJSDefault(o){return Array.isArray(o)?IndexedSeq(o).map(fromJSDefault).toList():isPlainObj(o)?KeyedSeq(o).map(fromJSDefault).toMap():o}function isPlainObj(o){return o&&(o.constructor===Object||void 0===o.constructor)}function is(o,s){if(o===s||o!=o&&s!=s)return!0;if(!o||!s)return!1;if("function"==typeof o.valueOf&&"function"==typeof s.valueOf){if((o=o.valueOf())===(s=s.valueOf())||o!=o&&s!=s)return!0;if(!o||!s)return!1}return!("function"!=typeof o.equals||"function"!=typeof s.equals||!o.equals(s))}function deepEqual(o,s){if(o===s)return!0;if(!isIterable(s)||void 0!==o.size&&void 0!==s.size&&o.size!==s.size||void 0!==o.__hash&&void 0!==s.__hash&&o.__hash!==s.__hash||isKeyed(o)!==isKeyed(s)||isIndexed(o)!==isIndexed(s)||isOrdered(o)!==isOrdered(s))return!1;if(0===o.size&&0===s.size)return!0;var i=!isAssociative(o);if(isOrdered(o)){var u=o.entries();return s.every((function(o,s){var _=u.next().value;return _&&is(_[1],o)&&(i||is(_[0],s))}))&&u.next().done}var _=!1;if(void 0===o.size)if(void 0===s.size)"function"==typeof o.cacheResult&&o.cacheResult();else{_=!0;var w=o;o=s,s=w}var x=!0,C=s.__iterate((function(s,u){if(i?!o.has(s):_?!is(s,o.get(u,L)):!is(o.get(u,L),s))return x=!1,!1}));return x&&o.size===C}function Repeat(o,s){if(!(this instanceof Repeat))return new Repeat(o,s);if(this._value=o,this.size=void 0===s?1/0:Math.max(0,s),0===this.size){if(ae)return ae;ae=this}}function invariant(o,s){if(!o)throw new Error(s)}function Range(o,s,i){if(!(this instanceof Range))return new Range(o,s,i);if(invariant(0!==i,"Cannot step a Range by 0"),o=o||0,void 0===s&&(s=1/0),i=void 0===i?1:Math.abs(i),su?iteratorDone():iteratorValue(o,_,i[s?u-_++:_++])}))},createClass(ObjectSeq,KeyedSeq),ObjectSeq.prototype.get=function(o,s){return void 0===s||this.has(o)?this._object[o]:s},ObjectSeq.prototype.has=function(o){return this._object.hasOwnProperty(o)},ObjectSeq.prototype.__iterate=function(o,s){for(var i=this._object,u=this._keys,_=u.length-1,w=0;w<=_;w++){var x=u[s?_-w:w];if(!1===o(i[x],x,this))return w+1}return w},ObjectSeq.prototype.__iterator=function(o,s){var i=this._object,u=this._keys,_=u.length-1,w=0;return new Iterator((function(){var x=u[s?_-w:w];return w++>_?iteratorDone():iteratorValue(o,x,i[x])}))},ObjectSeq.prototype[_]=!0,createClass(IterableSeq,IndexedSeq),IterableSeq.prototype.__iterateUncached=function(o,s){if(s)return this.cacheResult().__iterate(o,s);var i=getIterator(this._iterable),u=0;if(isIterator(i))for(var _;!(_=i.next()).done&&!1!==o(_.value,u++,this););return u},IterableSeq.prototype.__iteratorUncached=function(o,s){if(s)return this.cacheResult().__iterator(o,s);var i=getIterator(this._iterable);if(!isIterator(i))return new Iterator(iteratorDone);var u=0;return new Iterator((function(){var s=i.next();return s.done?s:iteratorValue(o,u++,s.value)}))},createClass(IteratorSeq,IndexedSeq),IteratorSeq.prototype.__iterateUncached=function(o,s){if(s)return this.cacheResult().__iterate(o,s);for(var i,u=this._iterator,_=this._iteratorCache,w=0;w<_.length;)if(!1===o(_[w],w++,this))return w;for(;!(i=u.next()).done;){var x=i.value;if(_[w]=x,!1===o(x,w++,this))break}return w},IteratorSeq.prototype.__iteratorUncached=function(o,s){if(s)return this.cacheResult().__iterator(o,s);var i=this._iterator,u=this._iteratorCache,_=0;return new Iterator((function(){if(_>=u.length){var s=i.next();if(s.done)return s;u[_]=s.value}return iteratorValue(o,_,u[_++])}))},createClass(Repeat,IndexedSeq),Repeat.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},Repeat.prototype.get=function(o,s){return this.has(o)?this._value:s},Repeat.prototype.includes=function(o){return is(this._value,o)},Repeat.prototype.slice=function(o,s){var i=this.size;return wholeSlice(o,s,i)?this:new Repeat(this._value,resolveEnd(s,i)-resolveBegin(o,i))},Repeat.prototype.reverse=function(){return this},Repeat.prototype.indexOf=function(o){return is(this._value,o)?0:-1},Repeat.prototype.lastIndexOf=function(o){return is(this._value,o)?this.size:-1},Repeat.prototype.__iterate=function(o,s){for(var i=0;i=0&&s=0&&ii?iteratorDone():iteratorValue(o,w++,x)}))},Range.prototype.equals=function(o){return o instanceof Range?this._start===o._start&&this._end===o._end&&this._step===o._step:deepEqual(this,o)},createClass(Collection,Iterable),createClass(KeyedCollection,Collection),createClass(IndexedCollection,Collection),createClass(SetCollection,Collection),Collection.Keyed=KeyedCollection,Collection.Indexed=IndexedCollection,Collection.Set=SetCollection;var pe="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function imul(o,s){var i=65535&(o|=0),u=65535&(s|=0);return i*u+((o>>>16)*u+i*(s>>>16)<<16>>>0)|0};function smi(o){return o>>>1&1073741824|3221225471&o}function hash(o){if(!1===o||null==o)return 0;if("function"==typeof o.valueOf&&(!1===(o=o.valueOf())||null==o))return 0;if(!0===o)return 1;var s=typeof o;if("number"===s){if(o!=o||o===1/0)return 0;var i=0|o;for(i!==o&&(i^=4294967295*o);o>4294967295;)i^=o/=4294967295;return smi(i)}if("string"===s)return o.length>Se?cachedHashString(o):hashString(o);if("function"==typeof o.hashCode)return o.hashCode();if("object"===s)return hashJSObj(o);if("function"==typeof o.toString)return hashString(o.toString());throw new Error("Value type "+s+" cannot be hashed.")}function cachedHashString(o){var s=Te[o];return void 0===s&&(s=hashString(o),Pe===xe&&(Pe=0,Te={}),Pe++,Te[o]=s),s}function hashString(o){for(var s=0,i=0;i0)switch(o.nodeType){case 1:return o.uniqueID;case 9:return o.documentElement&&o.documentElement.uniqueID}}var ye,be="function"==typeof WeakMap;be&&(ye=new WeakMap);var _e=0,we="__immutablehash__";"function"==typeof Symbol&&(we=Symbol(we));var Se=16,xe=255,Pe=0,Te={};function assertNotInfinite(o){invariant(o!==1/0,"Cannot perform this action with an infinite size.")}function Map(o){return null==o?emptyMap():isMap(o)&&!isOrdered(o)?o:emptyMap().withMutations((function(s){var i=KeyedIterable(o);assertNotInfinite(i.size),i.forEach((function(o,i){return s.set(i,o)}))}))}function isMap(o){return!(!o||!o[qe])}createClass(Map,KeyedCollection),Map.of=function(){var s=o.call(arguments,0);return emptyMap().withMutations((function(o){for(var i=0;i=s.length)throw new Error("Missing value for key: "+s[i]);o.set(s[i],s[i+1])}}))},Map.prototype.toString=function(){return this.__toString("Map {","}")},Map.prototype.get=function(o,s){return this._root?this._root.get(0,void 0,o,s):s},Map.prototype.set=function(o,s){return updateMap(this,o,s)},Map.prototype.setIn=function(o,s){return this.updateIn(o,L,(function(){return s}))},Map.prototype.remove=function(o){return updateMap(this,o,L)},Map.prototype.deleteIn=function(o){return this.updateIn(o,(function(){return L}))},Map.prototype.update=function(o,s,i){return 1===arguments.length?o(this):this.updateIn([o],s,i)},Map.prototype.updateIn=function(o,s,i){i||(i=s,s=void 0);var u=updateInDeepMap(this,forceIterator(o),s,i);return u===L?void 0:u},Map.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):emptyMap()},Map.prototype.merge=function(){return mergeIntoMapWith(this,void 0,arguments)},Map.prototype.mergeWith=function(s){return mergeIntoMapWith(this,s,o.call(arguments,1))},Map.prototype.mergeIn=function(s){var i=o.call(arguments,1);return this.updateIn(s,emptyMap(),(function(o){return"function"==typeof o.merge?o.merge.apply(o,i):i[i.length-1]}))},Map.prototype.mergeDeep=function(){return mergeIntoMapWith(this,deepMerger,arguments)},Map.prototype.mergeDeepWith=function(s){var i=o.call(arguments,1);return mergeIntoMapWith(this,deepMergerWith(s),i)},Map.prototype.mergeDeepIn=function(s){var i=o.call(arguments,1);return this.updateIn(s,emptyMap(),(function(o){return"function"==typeof o.mergeDeep?o.mergeDeep.apply(o,i):i[i.length-1]}))},Map.prototype.sort=function(o){return OrderedMap(sortFactory(this,o))},Map.prototype.sortBy=function(o,s){return OrderedMap(sortFactory(this,s,o))},Map.prototype.withMutations=function(o){var s=this.asMutable();return o(s),s.wasAltered()?s.__ensureOwner(this.__ownerID):this},Map.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new OwnerID)},Map.prototype.asImmutable=function(){return this.__ensureOwner()},Map.prototype.wasAltered=function(){return this.__altered},Map.prototype.__iterator=function(o,s){return new MapIterator(this,o,s)},Map.prototype.__iterate=function(o,s){var i=this,u=0;return this._root&&this._root.iterate((function(s){return u++,o(s[1],s[0],i)}),s),u},Map.prototype.__ensureOwner=function(o){return o===this.__ownerID?this:o?makeMap(this.size,this._root,o,this.__hash):(this.__ownerID=o,this.__altered=!1,this)},Map.isMap=isMap;var Re,qe="@@__IMMUTABLE_MAP__@@",$e=Map.prototype;function ArrayMapNode(o,s){this.ownerID=o,this.entries=s}function BitmapIndexedNode(o,s,i){this.ownerID=o,this.bitmap=s,this.nodes=i}function HashArrayMapNode(o,s,i){this.ownerID=o,this.count=s,this.nodes=i}function HashCollisionNode(o,s,i){this.ownerID=o,this.keyHash=s,this.entries=i}function ValueNode(o,s,i){this.ownerID=o,this.keyHash=s,this.entry=i}function MapIterator(o,s,i){this._type=s,this._reverse=i,this._stack=o._root&&mapIteratorFrame(o._root)}function mapIteratorValue(o,s){return iteratorValue(o,s[0],s[1])}function mapIteratorFrame(o,s){return{node:o,index:0,__prev:s}}function makeMap(o,s,i,u){var _=Object.create($e);return _.size=o,_._root=s,_.__ownerID=i,_.__hash=u,_.__altered=!1,_}function emptyMap(){return Re||(Re=makeMap(0))}function updateMap(o,s,i){var u,_;if(o._root){var w=MakeRef(B),x=MakeRef($);if(u=updateNode(o._root,o.__ownerID,0,void 0,s,i,w,x),!x.value)return o;_=o.size+(w.value?i===L?-1:1:0)}else{if(i===L)return o;_=1,u=new ArrayMapNode(o.__ownerID,[[s,i]])}return o.__ownerID?(o.size=_,o._root=u,o.__hash=void 0,o.__altered=!0,o):u?makeMap(_,u):emptyMap()}function updateNode(o,s,i,u,_,w,x,C){return o?o.update(s,i,u,_,w,x,C):w===L?o:(SetRef(C),SetRef(x),new ValueNode(s,u,[_,w]))}function isLeafNode(o){return o.constructor===ValueNode||o.constructor===HashCollisionNode}function mergeIntoNode(o,s,i,u,_){if(o.keyHash===u)return new HashCollisionNode(s,u,[o.entry,_]);var w,C=(0===i?o.keyHash:o.keyHash>>>i)&j,L=(0===i?u:u>>>i)&j;return new BitmapIndexedNode(s,1<>>=1)x[j]=1&i?s[w++]:void 0;return x[u]=_,new HashArrayMapNode(o,w+1,x)}function mergeIntoMapWith(o,s,i){for(var u=[],_=0;_>1&1431655765))+(o>>2&858993459))+(o>>4)&252645135,o+=o>>8,127&(o+=o>>16)}function setIn(o,s,i,u){var _=u?o:arrCopy(o);return _[s]=i,_}function spliceIn(o,s,i,u){var _=o.length+1;if(u&&s+1===_)return o[s]=i,o;for(var w=new Array(_),x=0,C=0;C<_;C++)C===s?(w[C]=i,x=-1):w[C]=o[C+x];return w}function spliceOut(o,s,i){var u=o.length-1;if(i&&s===u)return o.pop(),o;for(var _=new Array(u),w=0,x=0;x=ze)return createNodes(o,j,u,_);var U=o&&o===this.ownerID,z=U?j:arrCopy(j);return V?C?B===$-1?z.pop():z[B]=z.pop():z[B]=[u,_]:z.push([u,_]),U?(this.entries=z,this):new ArrayMapNode(o,z)}},BitmapIndexedNode.prototype.get=function(o,s,i,u){void 0===s&&(s=hash(i));var _=1<<((0===o?s:s>>>o)&j),w=this.bitmap;return w&_?this.nodes[popCount(w&_-1)].get(o+x,s,i,u):u},BitmapIndexedNode.prototype.update=function(o,s,i,u,_,w,C){void 0===i&&(i=hash(u));var B=(0===s?i:i>>>s)&j,$=1<=We)return expandNodes(o,Y,V,B,ee);if(U&&!ee&&2===Y.length&&isLeafNode(Y[1^z]))return Y[1^z];if(U&&ee&&1===Y.length&&isLeafNode(ee))return ee;var ie=o&&o===this.ownerID,ae=U?ee?V:V^$:V|$,ce=U?ee?setIn(Y,z,ee,ie):spliceOut(Y,z,ie):spliceIn(Y,z,ee,ie);return ie?(this.bitmap=ae,this.nodes=ce,this):new BitmapIndexedNode(o,ae,ce)},HashArrayMapNode.prototype.get=function(o,s,i,u){void 0===s&&(s=hash(i));var _=(0===o?s:s>>>o)&j,w=this.nodes[_];return w?w.get(o+x,s,i,u):u},HashArrayMapNode.prototype.update=function(o,s,i,u,_,w,C){void 0===i&&(i=hash(u));var B=(0===s?i:i>>>s)&j,$=_===L,V=this.nodes,U=V[B];if($&&!U)return this;var z=updateNode(U,o,s+x,i,u,_,w,C);if(z===U)return this;var Y=this.count;if(U){if(!z&&--Y0&&u=0&&o>>s&j;if(u>=this.array.length)return new VNode([],o);var _,w=0===u;if(s>0){var C=this.array[u];if((_=C&&C.removeBefore(o,s-x,i))===C&&w)return this}if(w&&!_)return this;var L=editableVNode(this,o);if(!w)for(var B=0;B>>s&j;if(_>=this.array.length)return this;if(s>0){var w=this.array[_];if((u=w&&w.removeAfter(o,s-x,i))===w&&_===this.array.length-1)return this}var C=editableVNode(this,o);return C.array.splice(_+1),u&&(C.array[_]=u),C};var Qe,et,tt={};function iterateList(o,s){var i=o._origin,u=o._capacity,_=getTailOffset(u),w=o._tail;return iterateNodeOrLeaf(o._root,o._level,0);function iterateNodeOrLeaf(o,s,i){return 0===s?iterateLeaf(o,i):iterateNode(o,s,i)}function iterateLeaf(o,x){var j=x===_?w&&w.array:o&&o.array,L=x>i?0:i-x,B=u-x;return B>C&&(B=C),function(){if(L===B)return tt;var o=s?--B:L++;return j&&j[o]}}function iterateNode(o,_,w){var j,L=o&&o.array,B=w>i?0:i-w>>_,$=1+(u-w>>_);return $>C&&($=C),function(){for(;;){if(j){var o=j();if(o!==tt)return o;j=null}if(B===$)return tt;var i=s?--$:B++;j=iterateNodeOrLeaf(L&&L[i],_-x,w+(i<<_))}}}}function makeList(o,s,i,u,_,w,x){var C=Object.create(Xe);return C.size=s-o,C._origin=o,C._capacity=s,C._level=i,C._root=u,C._tail=_,C.__ownerID=w,C.__hash=x,C.__altered=!1,C}function emptyList(){return Qe||(Qe=makeList(0,0,x))}function updateList(o,s,i){if((s=wrapIndex(o,s))!=s)return o;if(s>=o.size||s<0)return o.withMutations((function(o){s<0?setListBounds(o,s).set(0,i):setListBounds(o,0,s+1).set(s,i)}));s+=o._origin;var u=o._tail,_=o._root,w=MakeRef($);return s>=getTailOffset(o._capacity)?u=updateVNode(u,o.__ownerID,0,s,i,w):_=updateVNode(_,o.__ownerID,o._level,s,i,w),w.value?o.__ownerID?(o._root=_,o._tail=u,o.__hash=void 0,o.__altered=!0,o):makeList(o._origin,o._capacity,o._level,_,u):o}function updateVNode(o,s,i,u,_,w){var C,L=u>>>i&j,B=o&&L0){var $=o&&o.array[L],V=updateVNode($,s,i-x,u,_,w);return V===$?o:((C=editableVNode(o,s)).array[L]=V,C)}return B&&o.array[L]===_?o:(SetRef(w),C=editableVNode(o,s),void 0===_&&L===C.array.length-1?C.array.pop():C.array[L]=_,C)}function editableVNode(o,s){return s&&o&&s===o.ownerID?o:new VNode(o?o.array.slice():[],s)}function listNodeFor(o,s){if(s>=getTailOffset(o._capacity))return o._tail;if(s<1<0;)i=i.array[s>>>u&j],u-=x;return i}}function setListBounds(o,s,i){void 0!==s&&(s|=0),void 0!==i&&(i|=0);var u=o.__ownerID||new OwnerID,_=o._origin,w=o._capacity,C=_+s,L=void 0===i?w:i<0?w+i:_+i;if(C===_&&L===w)return o;if(C>=L)return o.clear();for(var B=o._level,$=o._root,V=0;C+V<0;)$=new VNode($&&$.array.length?[void 0,$]:[],u),V+=1<<(B+=x);V&&(C+=V,_+=V,L+=V,w+=V);for(var U=getTailOffset(w),z=getTailOffset(L);z>=1<U?new VNode([],u):Y;if(Y&&z>U&&Cx;ie-=x){var ae=U>>>ie&j;ee=ee.array[ae]=editableVNode(ee.array[ae],u)}ee.array[U>>>x&j]=Y}if(L=z)C-=z,L-=z,B=x,$=null,Z=Z&&Z.removeBefore(u,0,C);else if(C>_||z>>B&j;if(ce!==z>>>B&j)break;ce&&(V+=(1<_&&($=$.removeBefore(u,B,C-V)),$&&z_&&(_=C.size),isIterable(x)||(C=C.map((function(o){return fromJS(o)}))),u.push(C)}return _>o.size&&(o=o.setSize(_)),mergeIntoCollectionWith(o,s,u)}function getTailOffset(o){return o>>x<=C&&x.size>=2*w.size?(u=(_=x.filter((function(o,s){return void 0!==o&&j!==s}))).toKeyedSeq().map((function(o){return o[0]})).flip().toMap(),o.__ownerID&&(u.__ownerID=_.__ownerID=o.__ownerID)):(u=w.remove(s),_=j===x.size-1?x.pop():x.set(j,void 0))}else if(B){if(i===x.get(j)[1])return o;u=w,_=x.set(j,[s,i])}else u=w.set(s,x.size),_=x.set(x.size,[s,i]);return o.__ownerID?(o.size=u.size,o._map=u,o._list=_,o.__hash=void 0,o):makeOrderedMap(u,_)}function ToKeyedSequence(o,s){this._iter=o,this._useKeys=s,this.size=o.size}function ToIndexedSequence(o){this._iter=o,this.size=o.size}function ToSetSequence(o){this._iter=o,this.size=o.size}function FromEntriesSequence(o){this._iter=o,this.size=o.size}function flipFactory(o){var s=makeSequence(o);return s._iter=o,s.size=o.size,s.flip=function(){return o},s.reverse=function(){var s=o.reverse.apply(this);return s.flip=function(){return o.reverse()},s},s.has=function(s){return o.includes(s)},s.includes=function(s){return o.has(s)},s.cacheResult=cacheResultThrough,s.__iterateUncached=function(s,i){var u=this;return o.__iterate((function(o,i){return!1!==s(i,o,u)}),i)},s.__iteratorUncached=function(s,i){if(s===z){var u=o.__iterator(s,i);return new Iterator((function(){var o=u.next();if(!o.done){var s=o.value[0];o.value[0]=o.value[1],o.value[1]=s}return o}))}return o.__iterator(s===U?V:U,i)},s}function mapFactory(o,s,i){var u=makeSequence(o);return u.size=o.size,u.has=function(s){return o.has(s)},u.get=function(u,_){var w=o.get(u,L);return w===L?_:s.call(i,w,u,o)},u.__iterateUncached=function(u,_){var w=this;return o.__iterate((function(o,_,x){return!1!==u(s.call(i,o,_,x),_,w)}),_)},u.__iteratorUncached=function(u,_){var w=o.__iterator(z,_);return new Iterator((function(){var _=w.next();if(_.done)return _;var x=_.value,C=x[0];return iteratorValue(u,C,s.call(i,x[1],C,o),_)}))},u}function reverseFactory(o,s){var i=makeSequence(o);return i._iter=o,i.size=o.size,i.reverse=function(){return o},o.flip&&(i.flip=function(){var s=flipFactory(o);return s.reverse=function(){return o.flip()},s}),i.get=function(i,u){return o.get(s?i:-1-i,u)},i.has=function(i){return o.has(s?i:-1-i)},i.includes=function(s){return o.includes(s)},i.cacheResult=cacheResultThrough,i.__iterate=function(s,i){var u=this;return o.__iterate((function(o,i){return s(o,i,u)}),!i)},i.__iterator=function(s,i){return o.__iterator(s,!i)},i}function filterFactory(o,s,i,u){var _=makeSequence(o);return u&&(_.has=function(u){var _=o.get(u,L);return _!==L&&!!s.call(i,_,u,o)},_.get=function(u,_){var w=o.get(u,L);return w!==L&&s.call(i,w,u,o)?w:_}),_.__iterateUncached=function(_,w){var x=this,C=0;return o.__iterate((function(o,w,j){if(s.call(i,o,w,j))return C++,_(o,u?w:C-1,x)}),w),C},_.__iteratorUncached=function(_,w){var x=o.__iterator(z,w),C=0;return new Iterator((function(){for(;;){var w=x.next();if(w.done)return w;var j=w.value,L=j[0],B=j[1];if(s.call(i,B,L,o))return iteratorValue(_,u?L:C++,B,w)}}))},_}function countByFactory(o,s,i){var u=Map().asMutable();return o.__iterate((function(_,w){u.update(s.call(i,_,w,o),0,(function(o){return o+1}))})),u.asImmutable()}function groupByFactory(o,s,i){var u=isKeyed(o),_=(isOrdered(o)?OrderedMap():Map()).asMutable();o.__iterate((function(w,x){_.update(s.call(i,w,x,o),(function(o){return(o=o||[]).push(u?[x,w]:w),o}))}));var w=iterableClass(o);return _.map((function(s){return reify(o,w(s))}))}function sliceFactory(o,s,i,u){var _=o.size;if(void 0!==s&&(s|=0),void 0!==i&&(i===1/0?i=_:i|=0),wholeSlice(s,i,_))return o;var w=resolveBegin(s,_),x=resolveEnd(i,_);if(w!=w||x!=x)return sliceFactory(o.toSeq().cacheResult(),s,i,u);var C,j=x-w;j==j&&(C=j<0?0:j);var L=makeSequence(o);return L.size=0===C?C:o.size&&C||void 0,!u&&isSeq(o)&&C>=0&&(L.get=function(s,i){return(s=wrapIndex(this,s))>=0&&sC)return iteratorDone();var o=_.next();return u||s===U?o:iteratorValue(s,j-1,s===V?void 0:o.value[1],o)}))},L}function takeWhileFactory(o,s,i){var u=makeSequence(o);return u.__iterateUncached=function(u,_){var w=this;if(_)return this.cacheResult().__iterate(u,_);var x=0;return o.__iterate((function(o,_,C){return s.call(i,o,_,C)&&++x&&u(o,_,w)})),x},u.__iteratorUncached=function(u,_){var w=this;if(_)return this.cacheResult().__iterator(u,_);var x=o.__iterator(z,_),C=!0;return new Iterator((function(){if(!C)return iteratorDone();var o=x.next();if(o.done)return o;var _=o.value,j=_[0],L=_[1];return s.call(i,L,j,w)?u===z?o:iteratorValue(u,j,L,o):(C=!1,iteratorDone())}))},u}function skipWhileFactory(o,s,i,u){var _=makeSequence(o);return _.__iterateUncached=function(_,w){var x=this;if(w)return this.cacheResult().__iterate(_,w);var C=!0,j=0;return o.__iterate((function(o,w,L){if(!C||!(C=s.call(i,o,w,L)))return j++,_(o,u?w:j-1,x)})),j},_.__iteratorUncached=function(_,w){var x=this;if(w)return this.cacheResult().__iterator(_,w);var C=o.__iterator(z,w),j=!0,L=0;return new Iterator((function(){var o,w,B;do{if((o=C.next()).done)return u||_===U?o:iteratorValue(_,L++,_===V?void 0:o.value[1],o);var $=o.value;w=$[0],B=$[1],j&&(j=s.call(i,B,w,x))}while(j);return _===z?o:iteratorValue(_,w,B,o)}))},_}function concatFactory(o,s){var i=isKeyed(o),u=[o].concat(s).map((function(o){return isIterable(o)?i&&(o=KeyedIterable(o)):o=i?keyedSeqFromValue(o):indexedSeqFromValue(Array.isArray(o)?o:[o]),o})).filter((function(o){return 0!==o.size}));if(0===u.length)return o;if(1===u.length){var _=u[0];if(_===o||i&&isKeyed(_)||isIndexed(o)&&isIndexed(_))return _}var w=new ArraySeq(u);return i?w=w.toKeyedSeq():isIndexed(o)||(w=w.toSetSeq()),(w=w.flatten(!0)).size=u.reduce((function(o,s){if(void 0!==o){var i=s.size;if(void 0!==i)return o+i}}),0),w}function flattenFactory(o,s,i){var u=makeSequence(o);return u.__iterateUncached=function(u,_){var w=0,x=!1;function flatDeep(o,C){var j=this;o.__iterate((function(o,_){return(!s||C0}function zipWithFactory(o,s,i){var u=makeSequence(o);return u.size=new ArraySeq(i).map((function(o){return o.size})).min(),u.__iterate=function(o,s){for(var i,u=this.__iterator(U,s),_=0;!(i=u.next()).done&&!1!==o(i.value,_++,this););return _},u.__iteratorUncached=function(o,u){var _=i.map((function(o){return o=Iterable(o),getIterator(u?o.reverse():o)})),w=0,x=!1;return new Iterator((function(){var i;return x||(i=_.map((function(o){return o.next()})),x=i.some((function(o){return o.done}))),x?iteratorDone():iteratorValue(o,w++,s.apply(null,i.map((function(o){return o.value}))))}))},u}function reify(o,s){return isSeq(o)?s:o.constructor(s)}function validateEntry(o){if(o!==Object(o))throw new TypeError("Expected [K, V] tuple: "+o)}function resolveSize(o){return assertNotInfinite(o.size),ensureSize(o)}function iterableClass(o){return isKeyed(o)?KeyedIterable:isIndexed(o)?IndexedIterable:SetIterable}function makeSequence(o){return Object.create((isKeyed(o)?KeyedSeq:isIndexed(o)?IndexedSeq:SetSeq).prototype)}function cacheResultThrough(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):Seq.prototype.cacheResult.call(this)}function defaultComparator(o,s){return o>s?1:o=0;i--)s={value:arguments[i],next:s};return this.__ownerID?(this.size=o,this._head=s,this.__hash=void 0,this.__altered=!0,this):makeStack(o,s)},Stack.prototype.pushAll=function(o){if(0===(o=IndexedIterable(o)).size)return this;assertNotInfinite(o.size);var s=this.size,i=this._head;return o.reverse().forEach((function(o){s++,i={value:o,next:i}})),this.__ownerID?(this.size=s,this._head=i,this.__hash=void 0,this.__altered=!0,this):makeStack(s,i)},Stack.prototype.pop=function(){return this.slice(1)},Stack.prototype.unshift=function(){return this.push.apply(this,arguments)},Stack.prototype.unshiftAll=function(o){return this.pushAll(o)},Stack.prototype.shift=function(){return this.pop.apply(this,arguments)},Stack.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):emptyStack()},Stack.prototype.slice=function(o,s){if(wholeSlice(o,s,this.size))return this;var i=resolveBegin(o,this.size);if(resolveEnd(s,this.size)!==this.size)return IndexedCollection.prototype.slice.call(this,o,s);for(var u=this.size-i,_=this._head;i--;)_=_.next;return this.__ownerID?(this.size=u,this._head=_,this.__hash=void 0,this.__altered=!0,this):makeStack(u,_)},Stack.prototype.__ensureOwner=function(o){return o===this.__ownerID?this:o?makeStack(this.size,this._head,o,this.__hash):(this.__ownerID=o,this.__altered=!1,this)},Stack.prototype.__iterate=function(o,s){if(s)return this.reverse().__iterate(o);for(var i=0,u=this._head;u&&!1!==o(u.value,i++,this);)u=u.next;return i},Stack.prototype.__iterator=function(o,s){if(s)return this.reverse().__iterator(o);var i=0,u=this._head;return new Iterator((function(){if(u){var s=u.value;return u=u.next,iteratorValue(o,i++,s)}return iteratorDone()}))},Stack.isStack=isStack;var ct,lt="@@__IMMUTABLE_STACK__@@",ut=Stack.prototype;function makeStack(o,s,i,u){var _=Object.create(ut);return _.size=o,_._head=s,_.__ownerID=i,_.__hash=u,_.__altered=!1,_}function emptyStack(){return ct||(ct=makeStack(0))}function mixin(o,s){var keyCopier=function(i){o.prototype[i]=s[i]};return Object.keys(s).forEach(keyCopier),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(s).forEach(keyCopier),o}ut[lt]=!0,ut.withMutations=$e.withMutations,ut.asMutable=$e.asMutable,ut.asImmutable=$e.asImmutable,ut.wasAltered=$e.wasAltered,Iterable.Iterator=Iterator,mixin(Iterable,{toArray:function(){assertNotInfinite(this.size);var o=new Array(this.size||0);return this.valueSeq().__iterate((function(s,i){o[i]=s})),o},toIndexedSeq:function(){return new ToIndexedSequence(this)},toJS:function(){return this.toSeq().map((function(o){return o&&"function"==typeof o.toJS?o.toJS():o})).__toJS()},toJSON:function(){return this.toSeq().map((function(o){return o&&"function"==typeof o.toJSON?o.toJSON():o})).__toJS()},toKeyedSeq:function(){return new ToKeyedSequence(this,!0)},toMap:function(){return Map(this.toKeyedSeq())},toObject:function(){assertNotInfinite(this.size);var o={};return this.__iterate((function(s,i){o[i]=s})),o},toOrderedMap:function(){return OrderedMap(this.toKeyedSeq())},toOrderedSet:function(){return OrderedSet(isKeyed(this)?this.valueSeq():this)},toSet:function(){return Set(isKeyed(this)?this.valueSeq():this)},toSetSeq:function(){return new ToSetSequence(this)},toSeq:function(){return isIndexed(this)?this.toIndexedSeq():isKeyed(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return Stack(isKeyed(this)?this.valueSeq():this)},toList:function(){return List(isKeyed(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(o,s){return 0===this.size?o+s:o+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+s},concat:function(){return reify(this,concatFactory(this,o.call(arguments,0)))},includes:function(o){return this.some((function(s){return is(s,o)}))},entries:function(){return this.__iterator(z)},every:function(o,s){assertNotInfinite(this.size);var i=!0;return this.__iterate((function(u,_,w){if(!o.call(s,u,_,w))return i=!1,!1})),i},filter:function(o,s){return reify(this,filterFactory(this,o,s,!0))},find:function(o,s,i){var u=this.findEntry(o,s);return u?u[1]:i},forEach:function(o,s){return assertNotInfinite(this.size),this.__iterate(s?o.bind(s):o)},join:function(o){assertNotInfinite(this.size),o=void 0!==o?""+o:",";var s="",i=!0;return this.__iterate((function(u){i?i=!1:s+=o,s+=null!=u?u.toString():""})),s},keys:function(){return this.__iterator(V)},map:function(o,s){return reify(this,mapFactory(this,o,s))},reduce:function(o,s,i){var u,_;return assertNotInfinite(this.size),arguments.length<2?_=!0:u=s,this.__iterate((function(s,w,x){_?(_=!1,u=s):u=o.call(i,u,s,w,x)})),u},reduceRight:function(o,s,i){var u=this.toKeyedSeq().reverse();return u.reduce.apply(u,arguments)},reverse:function(){return reify(this,reverseFactory(this,!0))},slice:function(o,s){return reify(this,sliceFactory(this,o,s,!0))},some:function(o,s){return!this.every(not(o),s)},sort:function(o){return reify(this,sortFactory(this,o))},values:function(){return this.__iterator(U)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some((function(){return!0}))},count:function(o,s){return ensureSize(o?this.toSeq().filter(o,s):this)},countBy:function(o,s){return countByFactory(this,o,s)},equals:function(o){return deepEqual(this,o)},entrySeq:function(){var o=this;if(o._cache)return new ArraySeq(o._cache);var s=o.toSeq().map(entryMapper).toIndexedSeq();return s.fromEntrySeq=function(){return o.toSeq()},s},filterNot:function(o,s){return this.filter(not(o),s)},findEntry:function(o,s,i){var u=i;return this.__iterate((function(i,_,w){if(o.call(s,i,_,w))return u=[_,i],!1})),u},findKey:function(o,s){var i=this.findEntry(o,s);return i&&i[0]},findLast:function(o,s,i){return this.toKeyedSeq().reverse().find(o,s,i)},findLastEntry:function(o,s,i){return this.toKeyedSeq().reverse().findEntry(o,s,i)},findLastKey:function(o,s){return this.toKeyedSeq().reverse().findKey(o,s)},first:function(){return this.find(returnTrue)},flatMap:function(o,s){return reify(this,flatMapFactory(this,o,s))},flatten:function(o){return reify(this,flattenFactory(this,o,!0))},fromEntrySeq:function(){return new FromEntriesSequence(this)},get:function(o,s){return this.find((function(s,i){return is(i,o)}),void 0,s)},getIn:function(o,s){for(var i,u=this,_=forceIterator(o);!(i=_.next()).done;){var w=i.value;if((u=u&&u.get?u.get(w,L):L)===L)return s}return u},groupBy:function(o,s){return groupByFactory(this,o,s)},has:function(o){return this.get(o,L)!==L},hasIn:function(o){return this.getIn(o,L)!==L},isSubset:function(o){return o="function"==typeof o.includes?o:Iterable(o),this.every((function(s){return o.includes(s)}))},isSuperset:function(o){return(o="function"==typeof o.isSubset?o:Iterable(o)).isSubset(this)},keyOf:function(o){return this.findKey((function(s){return is(s,o)}))},keySeq:function(){return this.toSeq().map(keyMapper).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(o){return this.toKeyedSeq().reverse().keyOf(o)},max:function(o){return maxFactory(this,o)},maxBy:function(o,s){return maxFactory(this,s,o)},min:function(o){return maxFactory(this,o?neg(o):defaultNegComparator)},minBy:function(o,s){return maxFactory(this,s?neg(s):defaultNegComparator,o)},rest:function(){return this.slice(1)},skip:function(o){return this.slice(Math.max(0,o))},skipLast:function(o){return reify(this,this.toSeq().reverse().skip(o).reverse())},skipWhile:function(o,s){return reify(this,skipWhileFactory(this,o,s,!0))},skipUntil:function(o,s){return this.skipWhile(not(o),s)},sortBy:function(o,s){return reify(this,sortFactory(this,s,o))},take:function(o){return this.slice(0,Math.max(0,o))},takeLast:function(o){return reify(this,this.toSeq().reverse().take(o).reverse())},takeWhile:function(o,s){return reify(this,takeWhileFactory(this,o,s))},takeUntil:function(o,s){return this.takeWhile(not(o),s)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=hashIterable(this))}});var pt=Iterable.prototype;pt[s]=!0,pt[ee]=pt.values,pt.__toJS=pt.toArray,pt.__toStringMapper=quoteString,pt.inspect=pt.toSource=function(){return this.toString()},pt.chain=pt.flatMap,pt.contains=pt.includes,mixin(KeyedIterable,{flip:function(){return reify(this,flipFactory(this))},mapEntries:function(o,s){var i=this,u=0;return reify(this,this.toSeq().map((function(_,w){return o.call(s,[w,_],u++,i)})).fromEntrySeq())},mapKeys:function(o,s){var i=this;return reify(this,this.toSeq().flip().map((function(u,_){return o.call(s,u,_,i)})).flip())}});var ht=KeyedIterable.prototype;function keyMapper(o,s){return s}function entryMapper(o,s){return[s,o]}function not(o){return function(){return!o.apply(this,arguments)}}function neg(o){return function(){return-o.apply(this,arguments)}}function quoteString(o){return"string"==typeof o?JSON.stringify(o):String(o)}function defaultZipper(){return arrCopy(arguments)}function defaultNegComparator(o,s){return os?-1:0}function hashIterable(o){if(o.size===1/0)return 0;var s=isOrdered(o),i=isKeyed(o),u=s?1:0;return murmurHashOfSize(o.__iterate(i?s?function(o,s){u=31*u+hashMerge(hash(o),hash(s))|0}:function(o,s){u=u+hashMerge(hash(o),hash(s))|0}:s?function(o){u=31*u+hash(o)|0}:function(o){u=u+hash(o)|0}),u)}function murmurHashOfSize(o,s){return s=pe(s,3432918353),s=pe(s<<15|s>>>-15,461845907),s=pe(s<<13|s>>>-13,5),s=pe((s=s+3864292196^o)^s>>>16,2246822507),s=smi((s=pe(s^s>>>13,3266489909))^s>>>16)}function hashMerge(o,s){return o^s+2654435769+(o<<6)+(o>>2)}return ht[i]=!0,ht[ee]=pt.entries,ht.__toJS=pt.toObject,ht.__toStringMapper=function(o,s){return JSON.stringify(s)+": "+quoteString(o)},mixin(IndexedIterable,{toKeyedSeq:function(){return new ToKeyedSequence(this,!1)},filter:function(o,s){return reify(this,filterFactory(this,o,s,!1))},findIndex:function(o,s){var i=this.findEntry(o,s);return i?i[0]:-1},indexOf:function(o){var s=this.keyOf(o);return void 0===s?-1:s},lastIndexOf:function(o){var s=this.lastKeyOf(o);return void 0===s?-1:s},reverse:function(){return reify(this,reverseFactory(this,!1))},slice:function(o,s){return reify(this,sliceFactory(this,o,s,!1))},splice:function(o,s){var i=arguments.length;if(s=Math.max(0|s,0),0===i||2===i&&!s)return this;o=resolveBegin(o,o<0?this.count():this.size);var u=this.slice(0,o);return reify(this,1===i?u:u.concat(arrCopy(arguments,2),this.slice(o+s)))},findLastIndex:function(o,s){var i=this.findLastEntry(o,s);return i?i[0]:-1},first:function(){return this.get(0)},flatten:function(o){return reify(this,flattenFactory(this,o,!1))},get:function(o,s){return(o=wrapIndex(this,o))<0||this.size===1/0||void 0!==this.size&&o>this.size?s:this.find((function(s,i){return i===o}),void 0,s)},has:function(o){return(o=wrapIndex(this,o))>=0&&(void 0!==this.size?this.size===1/0||o{"function"==typeof Object.create?o.exports=function inherits(o,s){s&&(o.super_=s,o.prototype=Object.create(s.prototype,{constructor:{value:o,enumerable:!1,writable:!0,configurable:!0}}))}:o.exports=function inherits(o,s){if(s){o.super_=s;var TempCtor=function(){};TempCtor.prototype=s.prototype,o.prototype=new TempCtor,o.prototype.constructor=o}}},5419:o=>{o.exports=function(o,s,i,u){var _=new Blob(void 0!==u?[u,o]:[o],{type:i||"application/octet-stream"});if(void 0!==window.navigator.msSaveBlob)window.navigator.msSaveBlob(_,s);else{var w=window.URL&&window.URL.createObjectURL?window.URL.createObjectURL(_):window.webkitURL.createObjectURL(_),x=document.createElement("a");x.style.display="none",x.href=w,x.setAttribute("download",s),void 0===x.download&&x.setAttribute("target","_blank"),document.body.appendChild(x),x.click(),setTimeout((function(){document.body.removeChild(x),window.URL.revokeObjectURL(w)}),200)}}},20181:(o,s,i)=>{var u=NaN,_="[object Symbol]",w=/^\s+|\s+$/g,x=/^[-+]0x[0-9a-f]+$/i,C=/^0b[01]+$/i,j=/^0o[0-7]+$/i,L=parseInt,B="object"==typeof i.g&&i.g&&i.g.Object===Object&&i.g,$="object"==typeof self&&self&&self.Object===Object&&self,V=B||$||Function("return this")(),U=Object.prototype.toString,z=Math.max,Y=Math.min,now=function(){return V.Date.now()};function isObject(o){var s=typeof o;return!!o&&("object"==s||"function"==s)}function toNumber(o){if("number"==typeof o)return o;if(function isSymbol(o){return"symbol"==typeof o||function isObjectLike(o){return!!o&&"object"==typeof o}(o)&&U.call(o)==_}(o))return u;if(isObject(o)){var s="function"==typeof o.valueOf?o.valueOf():o;o=isObject(s)?s+"":s}if("string"!=typeof o)return 0===o?o:+o;o=o.replace(w,"");var i=C.test(o);return i||j.test(o)?L(o.slice(2),i?2:8):x.test(o)?u:+o}o.exports=function debounce(o,s,i){var u,_,w,x,C,j,L=0,B=!1,$=!1,V=!0;if("function"!=typeof o)throw new TypeError("Expected a function");function invokeFunc(s){var i=u,w=_;return u=_=void 0,L=s,x=o.apply(w,i)}function shouldInvoke(o){var i=o-j;return void 0===j||i>=s||i<0||$&&o-L>=w}function timerExpired(){var o=now();if(shouldInvoke(o))return trailingEdge(o);C=setTimeout(timerExpired,function remainingWait(o){var i=s-(o-j);return $?Y(i,w-(o-L)):i}(o))}function trailingEdge(o){return C=void 0,V&&u?invokeFunc(o):(u=_=void 0,x)}function debounced(){var o=now(),i=shouldInvoke(o);if(u=arguments,_=this,j=o,i){if(void 0===C)return function leadingEdge(o){return L=o,C=setTimeout(timerExpired,s),B?invokeFunc(o):x}(j);if($)return C=setTimeout(timerExpired,s),invokeFunc(j)}return void 0===C&&(C=setTimeout(timerExpired,s)),x}return s=toNumber(s)||0,isObject(i)&&(B=!!i.leading,w=($="maxWait"in i)?z(toNumber(i.maxWait)||0,s):w,V="trailing"in i?!!i.trailing:V),debounced.cancel=function cancel(){void 0!==C&&clearTimeout(C),L=0,u=j=_=C=void 0},debounced.flush=function flush(){return void 0===C?x:trailingEdge(now())},debounced}},55580:(o,s,i)=>{var u=i(56110)(i(9325),"DataView");o.exports=u},21549:(o,s,i)=>{var u=i(22032),_=i(63862),w=i(66721),x=i(12749),C=i(35749);function Hash(o){var s=-1,i=null==o?0:o.length;for(this.clear();++s{var u=i(39344),_=i(94033);function LazyWrapper(o){this.__wrapped__=o,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}LazyWrapper.prototype=u(_.prototype),LazyWrapper.prototype.constructor=LazyWrapper,o.exports=LazyWrapper},80079:(o,s,i)=>{var u=i(63702),_=i(70080),w=i(24739),x=i(48655),C=i(31175);function ListCache(o){var s=-1,i=null==o?0:o.length;for(this.clear();++s{var u=i(39344),_=i(94033);function LodashWrapper(o,s){this.__wrapped__=o,this.__actions__=[],this.__chain__=!!s,this.__index__=0,this.__values__=void 0}LodashWrapper.prototype=u(_.prototype),LodashWrapper.prototype.constructor=LodashWrapper,o.exports=LodashWrapper},68223:(o,s,i)=>{var u=i(56110)(i(9325),"Map");o.exports=u},53661:(o,s,i)=>{var u=i(63040),_=i(17670),w=i(90289),x=i(4509),C=i(72949);function MapCache(o){var s=-1,i=null==o?0:o.length;for(this.clear();++s{var u=i(56110)(i(9325),"Promise");o.exports=u},76545:(o,s,i)=>{var u=i(56110)(i(9325),"Set");o.exports=u},38859:(o,s,i)=>{var u=i(53661),_=i(31380),w=i(51459);function SetCache(o){var s=-1,i=null==o?0:o.length;for(this.__data__=new u;++s{var u=i(80079),_=i(51420),w=i(90938),x=i(63605),C=i(29817),j=i(80945);function Stack(o){var s=this.__data__=new u(o);this.size=s.size}Stack.prototype.clear=_,Stack.prototype.delete=w,Stack.prototype.get=x,Stack.prototype.has=C,Stack.prototype.set=j,o.exports=Stack},51873:(o,s,i)=>{var u=i(9325).Symbol;o.exports=u},37828:(o,s,i)=>{var u=i(9325).Uint8Array;o.exports=u},28303:(o,s,i)=>{var u=i(56110)(i(9325),"WeakMap");o.exports=u},91033:o=>{o.exports=function apply(o,s,i){switch(i.length){case 0:return o.call(s);case 1:return o.call(s,i[0]);case 2:return o.call(s,i[0],i[1]);case 3:return o.call(s,i[0],i[1],i[2])}return o.apply(s,i)}},83729:o=>{o.exports=function arrayEach(o,s){for(var i=-1,u=null==o?0:o.length;++i{o.exports=function arrayFilter(o,s){for(var i=-1,u=null==o?0:o.length,_=0,w=[];++i{var u=i(96131);o.exports=function arrayIncludes(o,s){return!!(null==o?0:o.length)&&u(o,s,0)>-1}},70695:(o,s,i)=>{var u=i(78096),_=i(72428),w=i(56449),x=i(3656),C=i(30361),j=i(37167),L=Object.prototype.hasOwnProperty;o.exports=function arrayLikeKeys(o,s){var i=w(o),B=!i&&_(o),$=!i&&!B&&x(o),V=!i&&!B&&!$&&j(o),U=i||B||$||V,z=U?u(o.length,String):[],Y=z.length;for(var Z in o)!s&&!L.call(o,Z)||U&&("length"==Z||$&&("offset"==Z||"parent"==Z)||V&&("buffer"==Z||"byteLength"==Z||"byteOffset"==Z)||C(Z,Y))||z.push(Z);return z}},34932:o=>{o.exports=function arrayMap(o,s){for(var i=-1,u=null==o?0:o.length,_=Array(u);++i{o.exports=function arrayPush(o,s){for(var i=-1,u=s.length,_=o.length;++i{o.exports=function arrayReduce(o,s,i,u){var _=-1,w=null==o?0:o.length;for(u&&w&&(i=o[++_]);++_{o.exports=function arraySome(o,s){for(var i=-1,u=null==o?0:o.length;++i{o.exports=function asciiToArray(o){return o.split("")}},1733:o=>{var s=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;o.exports=function asciiWords(o){return o.match(s)||[]}},87805:(o,s,i)=>{var u=i(43360),_=i(75288);o.exports=function assignMergeValue(o,s,i){(void 0!==i&&!_(o[s],i)||void 0===i&&!(s in o))&&u(o,s,i)}},16547:(o,s,i)=>{var u=i(43360),_=i(75288),w=Object.prototype.hasOwnProperty;o.exports=function assignValue(o,s,i){var x=o[s];w.call(o,s)&&_(x,i)&&(void 0!==i||s in o)||u(o,s,i)}},26025:(o,s,i)=>{var u=i(75288);o.exports=function assocIndexOf(o,s){for(var i=o.length;i--;)if(u(o[i][0],s))return i;return-1}},74733:(o,s,i)=>{var u=i(21791),_=i(95950);o.exports=function baseAssign(o,s){return o&&u(s,_(s),o)}},43838:(o,s,i)=>{var u=i(21791),_=i(37241);o.exports=function baseAssignIn(o,s){return o&&u(s,_(s),o)}},43360:(o,s,i)=>{var u=i(93243);o.exports=function baseAssignValue(o,s,i){"__proto__"==s&&u?u(o,s,{configurable:!0,enumerable:!0,value:i,writable:!0}):o[s]=i}},9999:(o,s,i)=>{var u=i(37217),_=i(83729),w=i(16547),x=i(74733),C=i(43838),j=i(93290),L=i(23007),B=i(92271),$=i(48948),V=i(50002),U=i(83349),z=i(5861),Y=i(76189),Z=i(77199),ee=i(35529),ie=i(56449),ae=i(3656),ce=i(87730),le=i(23805),pe=i(38440),de=i(95950),fe=i(37241),ye="[object Arguments]",be="[object Function]",_e="[object Object]",we={};we[ye]=we["[object Array]"]=we["[object ArrayBuffer]"]=we["[object DataView]"]=we["[object Boolean]"]=we["[object Date]"]=we["[object Float32Array]"]=we["[object Float64Array]"]=we["[object Int8Array]"]=we["[object Int16Array]"]=we["[object Int32Array]"]=we["[object Map]"]=we["[object Number]"]=we[_e]=we["[object RegExp]"]=we["[object Set]"]=we["[object String]"]=we["[object Symbol]"]=we["[object Uint8Array]"]=we["[object Uint8ClampedArray]"]=we["[object Uint16Array]"]=we["[object Uint32Array]"]=!0,we["[object Error]"]=we[be]=we["[object WeakMap]"]=!1,o.exports=function baseClone(o,s,i,Se,xe,Pe){var Te,Re=1&s,qe=2&s,$e=4&s;if(i&&(Te=xe?i(o,Se,xe,Pe):i(o)),void 0!==Te)return Te;if(!le(o))return o;var ze=ie(o);if(ze){if(Te=Y(o),!Re)return L(o,Te)}else{var We=z(o),He=We==be||"[object GeneratorFunction]"==We;if(ae(o))return j(o,Re);if(We==_e||We==ye||He&&!xe){if(Te=qe||He?{}:ee(o),!Re)return qe?$(o,C(Te,o)):B(o,x(Te,o))}else{if(!we[We])return xe?o:{};Te=Z(o,We,Re)}}Pe||(Pe=new u);var Ye=Pe.get(o);if(Ye)return Ye;Pe.set(o,Te),pe(o)?o.forEach((function(u){Te.add(baseClone(u,s,i,u,o,Pe))})):ce(o)&&o.forEach((function(u,_){Te.set(_,baseClone(u,s,i,_,o,Pe))}));var Xe=ze?void 0:($e?qe?U:V:qe?fe:de)(o);return _(Xe||o,(function(u,_){Xe&&(u=o[_=u]),w(Te,_,baseClone(u,s,i,_,o,Pe))})),Te}},39344:(o,s,i)=>{var u=i(23805),_=Object.create,w=function(){function object(){}return function(o){if(!u(o))return{};if(_)return _(o);object.prototype=o;var s=new object;return object.prototype=void 0,s}}();o.exports=w},80909:(o,s,i)=>{var u=i(30641),_=i(38329)(u);o.exports=_},2523:o=>{o.exports=function baseFindIndex(o,s,i,u){for(var _=o.length,w=i+(u?1:-1);u?w--:++w<_;)if(s(o[w],w,o))return w;return-1}},83120:(o,s,i)=>{var u=i(14528),_=i(45891);o.exports=function baseFlatten(o,s,i,w,x){var C=-1,j=o.length;for(i||(i=_),x||(x=[]);++C0&&i(L)?s>1?baseFlatten(L,s-1,i,w,x):u(x,L):w||(x[x.length]=L)}return x}},86649:(o,s,i)=>{var u=i(83221)();o.exports=u},30641:(o,s,i)=>{var u=i(86649),_=i(95950);o.exports=function baseForOwn(o,s){return o&&u(o,s,_)}},47422:(o,s,i)=>{var u=i(31769),_=i(77797);o.exports=function baseGet(o,s){for(var i=0,w=(s=u(s,o)).length;null!=o&&i{var u=i(14528),_=i(56449);o.exports=function baseGetAllKeys(o,s,i){var w=s(o);return _(o)?w:u(w,i(o))}},72552:(o,s,i)=>{var u=i(51873),_=i(659),w=i(59350),x=u?u.toStringTag:void 0;o.exports=function baseGetTag(o){return null==o?void 0===o?"[object Undefined]":"[object Null]":x&&x in Object(o)?_(o):w(o)}},20426:o=>{var s=Object.prototype.hasOwnProperty;o.exports=function baseHas(o,i){return null!=o&&s.call(o,i)}},28077:o=>{o.exports=function baseHasIn(o,s){return null!=o&&s in Object(o)}},96131:(o,s,i)=>{var u=i(2523),_=i(85463),w=i(76959);o.exports=function baseIndexOf(o,s,i){return s==s?w(o,s,i):u(o,_,i)}},27534:(o,s,i)=>{var u=i(72552),_=i(40346);o.exports=function baseIsArguments(o){return _(o)&&"[object Arguments]"==u(o)}},60270:(o,s,i)=>{var u=i(87068),_=i(40346);o.exports=function baseIsEqual(o,s,i,w,x){return o===s||(null==o||null==s||!_(o)&&!_(s)?o!=o&&s!=s:u(o,s,i,w,baseIsEqual,x))}},87068:(o,s,i)=>{var u=i(37217),_=i(25911),w=i(21986),x=i(50689),C=i(5861),j=i(56449),L=i(3656),B=i(37167),$="[object Arguments]",V="[object Array]",U="[object Object]",z=Object.prototype.hasOwnProperty;o.exports=function baseIsEqualDeep(o,s,i,Y,Z,ee){var ie=j(o),ae=j(s),ce=ie?V:C(o),le=ae?V:C(s),pe=(ce=ce==$?U:ce)==U,de=(le=le==$?U:le)==U,fe=ce==le;if(fe&&L(o)){if(!L(s))return!1;ie=!0,pe=!1}if(fe&&!pe)return ee||(ee=new u),ie||B(o)?_(o,s,i,Y,Z,ee):w(o,s,ce,i,Y,Z,ee);if(!(1&i)){var ye=pe&&z.call(o,"__wrapped__"),be=de&&z.call(s,"__wrapped__");if(ye||be){var _e=ye?o.value():o,we=be?s.value():s;return ee||(ee=new u),Z(_e,we,i,Y,ee)}}return!!fe&&(ee||(ee=new u),x(o,s,i,Y,Z,ee))}},29172:(o,s,i)=>{var u=i(5861),_=i(40346);o.exports=function baseIsMap(o){return _(o)&&"[object Map]"==u(o)}},41799:(o,s,i)=>{var u=i(37217),_=i(60270);o.exports=function baseIsMatch(o,s,i,w){var x=i.length,C=x,j=!w;if(null==o)return!C;for(o=Object(o);x--;){var L=i[x];if(j&&L[2]?L[1]!==o[L[0]]:!(L[0]in o))return!1}for(;++x{o.exports=function baseIsNaN(o){return o!=o}},45083:(o,s,i)=>{var u=i(1882),_=i(87296),w=i(23805),x=i(47473),C=/^\[object .+?Constructor\]$/,j=Function.prototype,L=Object.prototype,B=j.toString,$=L.hasOwnProperty,V=RegExp("^"+B.call($).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");o.exports=function baseIsNative(o){return!(!w(o)||_(o))&&(u(o)?V:C).test(x(o))}},16038:(o,s,i)=>{var u=i(5861),_=i(40346);o.exports=function baseIsSet(o){return _(o)&&"[object Set]"==u(o)}},4901:(o,s,i)=>{var u=i(72552),_=i(30294),w=i(40346),x={};x["[object Float32Array]"]=x["[object Float64Array]"]=x["[object Int8Array]"]=x["[object Int16Array]"]=x["[object Int32Array]"]=x["[object Uint8Array]"]=x["[object Uint8ClampedArray]"]=x["[object Uint16Array]"]=x["[object Uint32Array]"]=!0,x["[object Arguments]"]=x["[object Array]"]=x["[object ArrayBuffer]"]=x["[object Boolean]"]=x["[object DataView]"]=x["[object Date]"]=x["[object Error]"]=x["[object Function]"]=x["[object Map]"]=x["[object Number]"]=x["[object Object]"]=x["[object RegExp]"]=x["[object Set]"]=x["[object String]"]=x["[object WeakMap]"]=!1,o.exports=function baseIsTypedArray(o){return w(o)&&_(o.length)&&!!x[u(o)]}},15389:(o,s,i)=>{var u=i(93663),_=i(87978),w=i(83488),x=i(56449),C=i(50583);o.exports=function baseIteratee(o){return"function"==typeof o?o:null==o?w:"object"==typeof o?x(o)?_(o[0],o[1]):u(o):C(o)}},88984:(o,s,i)=>{var u=i(55527),_=i(3650),w=Object.prototype.hasOwnProperty;o.exports=function baseKeys(o){if(!u(o))return _(o);var s=[];for(var i in Object(o))w.call(o,i)&&"constructor"!=i&&s.push(i);return s}},72903:(o,s,i)=>{var u=i(23805),_=i(55527),w=i(90181),x=Object.prototype.hasOwnProperty;o.exports=function baseKeysIn(o){if(!u(o))return w(o);var s=_(o),i=[];for(var C in o)("constructor"!=C||!s&&x.call(o,C))&&i.push(C);return i}},94033:o=>{o.exports=function baseLodash(){}},93663:(o,s,i)=>{var u=i(41799),_=i(10776),w=i(67197);o.exports=function baseMatches(o){var s=_(o);return 1==s.length&&s[0][2]?w(s[0][0],s[0][1]):function(i){return i===o||u(i,o,s)}}},87978:(o,s,i)=>{var u=i(60270),_=i(58156),w=i(80631),x=i(28586),C=i(30756),j=i(67197),L=i(77797);o.exports=function baseMatchesProperty(o,s){return x(o)&&C(s)?j(L(o),s):function(i){var x=_(i,o);return void 0===x&&x===s?w(i,o):u(s,x,3)}}},85250:(o,s,i)=>{var u=i(37217),_=i(87805),w=i(86649),x=i(42824),C=i(23805),j=i(37241),L=i(14974);o.exports=function baseMerge(o,s,i,B,$){o!==s&&w(s,(function(w,j){if($||($=new u),C(w))x(o,s,j,i,baseMerge,B,$);else{var V=B?B(L(o,j),w,j+"",o,s,$):void 0;void 0===V&&(V=w),_(o,j,V)}}),j)}},42824:(o,s,i)=>{var u=i(87805),_=i(93290),w=i(71961),x=i(23007),C=i(35529),j=i(72428),L=i(56449),B=i(83693),$=i(3656),V=i(1882),U=i(23805),z=i(11331),Y=i(37167),Z=i(14974),ee=i(69884);o.exports=function baseMergeDeep(o,s,i,ie,ae,ce,le){var pe=Z(o,i),de=Z(s,i),fe=le.get(de);if(fe)u(o,i,fe);else{var ye=ce?ce(pe,de,i+"",o,s,le):void 0,be=void 0===ye;if(be){var _e=L(de),we=!_e&&$(de),Se=!_e&&!we&&Y(de);ye=de,_e||we||Se?L(pe)?ye=pe:B(pe)?ye=x(pe):we?(be=!1,ye=_(de,!0)):Se?(be=!1,ye=w(de,!0)):ye=[]:z(de)||j(de)?(ye=pe,j(pe)?ye=ee(pe):U(pe)&&!V(pe)||(ye=C(de))):be=!1}be&&(le.set(de,ye),ae(ye,de,ie,ce,le),le.delete(de)),u(o,i,ye)}}},47237:o=>{o.exports=function baseProperty(o){return function(s){return null==s?void 0:s[o]}}},17255:(o,s,i)=>{var u=i(47422);o.exports=function basePropertyDeep(o){return function(s){return u(s,o)}}},54552:o=>{o.exports=function basePropertyOf(o){return function(s){return null==o?void 0:o[s]}}},85558:o=>{o.exports=function baseReduce(o,s,i,u,_){return _(o,(function(o,_,w){i=u?(u=!1,o):s(i,o,_,w)})),i}},69302:(o,s,i)=>{var u=i(83488),_=i(56757),w=i(32865);o.exports=function baseRest(o,s){return w(_(o,s,u),o+"")}},73170:(o,s,i)=>{var u=i(16547),_=i(31769),w=i(30361),x=i(23805),C=i(77797);o.exports=function baseSet(o,s,i,j){if(!x(o))return o;for(var L=-1,B=(s=_(s,o)).length,$=B-1,V=o;null!=V&&++L{var u=i(83488),_=i(48152),w=_?function(o,s){return _.set(o,s),o}:u;o.exports=w},19570:(o,s,i)=>{var u=i(37334),_=i(93243),w=i(83488),x=_?function(o,s){return _(o,"toString",{configurable:!0,enumerable:!1,value:u(s),writable:!0})}:w;o.exports=x},25160:o=>{o.exports=function baseSlice(o,s,i){var u=-1,_=o.length;s<0&&(s=-s>_?0:_+s),(i=i>_?_:i)<0&&(i+=_),_=s>i?0:i-s>>>0,s>>>=0;for(var w=Array(_);++u<_;)w[u]=o[u+s];return w}},90916:(o,s,i)=>{var u=i(80909);o.exports=function baseSome(o,s){var i;return u(o,(function(o,u,_){return!(i=s(o,u,_))})),!!i}},78096:o=>{o.exports=function baseTimes(o,s){for(var i=-1,u=Array(o);++i{var u=i(51873),_=i(34932),w=i(56449),x=i(44394),C=u?u.prototype:void 0,j=C?C.toString:void 0;o.exports=function baseToString(o){if("string"==typeof o)return o;if(w(o))return _(o,baseToString)+"";if(x(o))return j?j.call(o):"";var s=o+"";return"0"==s&&1/o==-1/0?"-0":s}},54128:(o,s,i)=>{var u=i(31800),_=/^\s+/;o.exports=function baseTrim(o){return o?o.slice(0,u(o)+1).replace(_,""):o}},27301:o=>{o.exports=function baseUnary(o){return function(s){return o(s)}}},19931:(o,s,i)=>{var u=i(31769),_=i(68090),w=i(68969),x=i(77797);o.exports=function baseUnset(o,s){return s=u(s,o),null==(o=w(o,s))||delete o[x(_(s))]}},51234:o=>{o.exports=function baseZipObject(o,s,i){for(var u=-1,_=o.length,w=s.length,x={};++u<_;){var C=u{o.exports=function cacheHas(o,s){return o.has(s)}},31769:(o,s,i)=>{var u=i(56449),_=i(28586),w=i(61802),x=i(13222);o.exports=function castPath(o,s){return u(o)?o:_(o,s)?[o]:w(x(o))}},28754:(o,s,i)=>{var u=i(25160);o.exports=function castSlice(o,s,i){var _=o.length;return i=void 0===i?_:i,!s&&i>=_?o:u(o,s,i)}},49653:(o,s,i)=>{var u=i(37828);o.exports=function cloneArrayBuffer(o){var s=new o.constructor(o.byteLength);return new u(s).set(new u(o)),s}},93290:(o,s,i)=>{o=i.nmd(o);var u=i(9325),_=s&&!s.nodeType&&s,w=_&&o&&!o.nodeType&&o,x=w&&w.exports===_?u.Buffer:void 0,C=x?x.allocUnsafe:void 0;o.exports=function cloneBuffer(o,s){if(s)return o.slice();var i=o.length,u=C?C(i):new o.constructor(i);return o.copy(u),u}},76169:(o,s,i)=>{var u=i(49653);o.exports=function cloneDataView(o,s){var i=s?u(o.buffer):o.buffer;return new o.constructor(i,o.byteOffset,o.byteLength)}},73201:o=>{var s=/\w*$/;o.exports=function cloneRegExp(o){var i=new o.constructor(o.source,s.exec(o));return i.lastIndex=o.lastIndex,i}},93736:(o,s,i)=>{var u=i(51873),_=u?u.prototype:void 0,w=_?_.valueOf:void 0;o.exports=function cloneSymbol(o){return w?Object(w.call(o)):{}}},71961:(o,s,i)=>{var u=i(49653);o.exports=function cloneTypedArray(o,s){var i=s?u(o.buffer):o.buffer;return new o.constructor(i,o.byteOffset,o.length)}},91596:o=>{var s=Math.max;o.exports=function composeArgs(o,i,u,_){for(var w=-1,x=o.length,C=u.length,j=-1,L=i.length,B=s(x-C,0),$=Array(L+B),V=!_;++j{var s=Math.max;o.exports=function composeArgsRight(o,i,u,_){for(var w=-1,x=o.length,C=-1,j=u.length,L=-1,B=i.length,$=s(x-j,0),V=Array($+B),U=!_;++w<$;)V[w]=o[w];for(var z=w;++L{o.exports=function copyArray(o,s){var i=-1,u=o.length;for(s||(s=Array(u));++i{var u=i(16547),_=i(43360);o.exports=function copyObject(o,s,i,w){var x=!i;i||(i={});for(var C=-1,j=s.length;++C{var u=i(21791),_=i(4664);o.exports=function copySymbols(o,s){return u(o,_(o),s)}},48948:(o,s,i)=>{var u=i(21791),_=i(86375);o.exports=function copySymbolsIn(o,s){return u(o,_(o),s)}},55481:(o,s,i)=>{var u=i(9325)["__core-js_shared__"];o.exports=u},58523:o=>{o.exports=function countHolders(o,s){for(var i=o.length,u=0;i--;)o[i]===s&&++u;return u}},20999:(o,s,i)=>{var u=i(69302),_=i(36800);o.exports=function createAssigner(o){return u((function(s,i){var u=-1,w=i.length,x=w>1?i[w-1]:void 0,C=w>2?i[2]:void 0;for(x=o.length>3&&"function"==typeof x?(w--,x):void 0,C&&_(i[0],i[1],C)&&(x=w<3?void 0:x,w=1),s=Object(s);++u{var u=i(64894);o.exports=function createBaseEach(o,s){return function(i,_){if(null==i)return i;if(!u(i))return o(i,_);for(var w=i.length,x=s?w:-1,C=Object(i);(s?x--:++x{o.exports=function createBaseFor(o){return function(s,i,u){for(var _=-1,w=Object(s),x=u(s),C=x.length;C--;){var j=x[o?C:++_];if(!1===i(w[j],j,w))break}return s}}},11842:(o,s,i)=>{var u=i(82819),_=i(9325);o.exports=function createBind(o,s,i){var w=1&s,x=u(o);return function wrapper(){return(this&&this!==_&&this instanceof wrapper?x:o).apply(w?i:this,arguments)}}},12507:(o,s,i)=>{var u=i(28754),_=i(49698),w=i(63912),x=i(13222);o.exports=function createCaseFirst(o){return function(s){s=x(s);var i=_(s)?w(s):void 0,C=i?i[0]:s.charAt(0),j=i?u(i,1).join(""):s.slice(1);return C[o]()+j}}},45539:(o,s,i)=>{var u=i(40882),_=i(50828),w=i(66645),x=RegExp("['’]","g");o.exports=function createCompounder(o){return function(s){return u(w(_(s).replace(x,"")),o,"")}}},82819:(o,s,i)=>{var u=i(39344),_=i(23805);o.exports=function createCtor(o){return function(){var s=arguments;switch(s.length){case 0:return new o;case 1:return new o(s[0]);case 2:return new o(s[0],s[1]);case 3:return new o(s[0],s[1],s[2]);case 4:return new o(s[0],s[1],s[2],s[3]);case 5:return new o(s[0],s[1],s[2],s[3],s[4]);case 6:return new o(s[0],s[1],s[2],s[3],s[4],s[5]);case 7:return new o(s[0],s[1],s[2],s[3],s[4],s[5],s[6])}var i=u(o.prototype),w=o.apply(i,s);return _(w)?w:i}}},77078:(o,s,i)=>{var u=i(91033),_=i(82819),w=i(37471),x=i(18073),C=i(11287),j=i(36306),L=i(9325);o.exports=function createCurry(o,s,i){var B=_(o);return function wrapper(){for(var _=arguments.length,$=Array(_),V=_,U=C(wrapper);V--;)$[V]=arguments[V];var z=_<3&&$[0]!==U&&$[_-1]!==U?[]:j($,U);return(_-=z.length){var u=i(15389),_=i(64894),w=i(95950);o.exports=function createFind(o){return function(s,i,x){var C=Object(s);if(!_(s)){var j=u(i,3);s=w(s),i=function(o){return j(C[o],o,C)}}var L=o(s,i,x);return L>-1?C[j?s[L]:L]:void 0}}},37471:(o,s,i)=>{var u=i(91596),_=i(53320),w=i(58523),x=i(82819),C=i(18073),j=i(11287),L=i(68294),B=i(36306),$=i(9325);o.exports=function createHybrid(o,s,i,V,U,z,Y,Z,ee,ie){var ae=128&s,ce=1&s,le=2&s,pe=24&s,de=512&s,fe=le?void 0:x(o);return function wrapper(){for(var ye=arguments.length,be=Array(ye),_e=ye;_e--;)be[_e]=arguments[_e];if(pe)var we=j(wrapper),Se=w(be,we);if(V&&(be=u(be,V,U,pe)),z&&(be=_(be,z,Y,pe)),ye-=Se,pe&&ye1&&be.reverse(),ae&&ee{var u=i(91033),_=i(82819),w=i(9325);o.exports=function createPartial(o,s,i,x){var C=1&s,j=_(o);return function wrapper(){for(var s=-1,_=arguments.length,L=-1,B=x.length,$=Array(B+_),V=this&&this!==w&&this instanceof wrapper?j:o;++L{var u=i(85087),_=i(54641),w=i(70981);o.exports=function createRecurry(o,s,i,x,C,j,L,B,$,V){var U=8&s;s|=U?32:64,4&(s&=~(U?64:32))||(s&=-4);var z=[o,s,C,U?j:void 0,U?L:void 0,U?void 0:j,U?void 0:L,B,$,V],Y=i.apply(void 0,z);return u(o)&&_(Y,z),Y.placeholder=x,w(Y,o,s)}},66977:(o,s,i)=>{var u=i(68882),_=i(11842),w=i(77078),x=i(37471),C=i(24168),j=i(37381),L=i(3209),B=i(54641),$=i(70981),V=i(61489),U=Math.max;o.exports=function createWrap(o,s,i,z,Y,Z,ee,ie){var ae=2&s;if(!ae&&"function"!=typeof o)throw new TypeError("Expected a function");var ce=z?z.length:0;if(ce||(s&=-97,z=Y=void 0),ee=void 0===ee?ee:U(V(ee),0),ie=void 0===ie?ie:V(ie),ce-=Y?Y.length:0,64&s){var le=z,pe=Y;z=Y=void 0}var de=ae?void 0:j(o),fe=[o,s,i,z,Y,le,pe,Z,ee,ie];if(de&&L(fe,de),o=fe[0],s=fe[1],i=fe[2],z=fe[3],Y=fe[4],!(ie=fe[9]=void 0===fe[9]?ae?0:o.length:U(fe[9]-ce,0))&&24&s&&(s&=-25),s&&1!=s)ye=8==s||16==s?w(o,s,ie):32!=s&&33!=s||Y.length?x.apply(void 0,fe):C(o,s,i,z);else var ye=_(o,s,i);return $((de?u:B)(ye,fe),o,s)}},53138:(o,s,i)=>{var u=i(11331);o.exports=function customOmitClone(o){return u(o)?void 0:o}},24647:(o,s,i)=>{var u=i(54552)({À:"A",Á:"A",Â:"A",Ã:"A",Ä:"A",Å:"A",à:"a",á:"a",â:"a",ã:"a",ä:"a",å:"a",Ç:"C",ç:"c",Ð:"D",ð:"d",È:"E",É:"E",Ê:"E",Ë:"E",è:"e",é:"e",ê:"e",ë:"e",Ì:"I",Í:"I",Î:"I",Ï:"I",ì:"i",í:"i",î:"i",ï:"i",Ñ:"N",ñ:"n",Ò:"O",Ó:"O",Ô:"O",Õ:"O",Ö:"O",Ø:"O",ò:"o",ó:"o",ô:"o",õ:"o",ö:"o",ø:"o",Ù:"U",Ú:"U",Û:"U",Ü:"U",ù:"u",ú:"u",û:"u",ü:"u",Ý:"Y",ý:"y",ÿ:"y",Æ:"Ae",æ:"ae",Þ:"Th",þ:"th",ß:"ss",Ā:"A",Ă:"A",Ą:"A",ā:"a",ă:"a",ą:"a",Ć:"C",Ĉ:"C",Ċ:"C",Č:"C",ć:"c",ĉ:"c",ċ:"c",č:"c",Ď:"D",Đ:"D",ď:"d",đ:"d",Ē:"E",Ĕ:"E",Ė:"E",Ę:"E",Ě:"E",ē:"e",ĕ:"e",ė:"e",ę:"e",ě:"e",Ĝ:"G",Ğ:"G",Ġ:"G",Ģ:"G",ĝ:"g",ğ:"g",ġ:"g",ģ:"g",Ĥ:"H",Ħ:"H",ĥ:"h",ħ:"h",Ĩ:"I",Ī:"I",Ĭ:"I",Į:"I",İ:"I",ĩ:"i",ī:"i",ĭ:"i",į:"i",ı:"i",Ĵ:"J",ĵ:"j",Ķ:"K",ķ:"k",ĸ:"k",Ĺ:"L",Ļ:"L",Ľ:"L",Ŀ:"L",Ł:"L",ĺ:"l",ļ:"l",ľ:"l",ŀ:"l",ł:"l",Ń:"N",Ņ:"N",Ň:"N",Ŋ:"N",ń:"n",ņ:"n",ň:"n",ŋ:"n",Ō:"O",Ŏ:"O",Ő:"O",ō:"o",ŏ:"o",ő:"o",Ŕ:"R",Ŗ:"R",Ř:"R",ŕ:"r",ŗ:"r",ř:"r",Ś:"S",Ŝ:"S",Ş:"S",Š:"S",ś:"s",ŝ:"s",ş:"s",š:"s",Ţ:"T",Ť:"T",Ŧ:"T",ţ:"t",ť:"t",ŧ:"t",Ũ:"U",Ū:"U",Ŭ:"U",Ů:"U",Ű:"U",Ų:"U",ũ:"u",ū:"u",ŭ:"u",ů:"u",ű:"u",ų:"u",Ŵ:"W",ŵ:"w",Ŷ:"Y",ŷ:"y",Ÿ:"Y",Ź:"Z",Ż:"Z",Ž:"Z",ź:"z",ż:"z",ž:"z",IJ:"IJ",ij:"ij",Œ:"Oe",œ:"oe",ʼn:"'n",ſ:"s"});o.exports=u},93243:(o,s,i)=>{var u=i(56110),_=function(){try{var o=u(Object,"defineProperty");return o({},"",{}),o}catch(o){}}();o.exports=_},25911:(o,s,i)=>{var u=i(38859),_=i(14248),w=i(19219);o.exports=function equalArrays(o,s,i,x,C,j){var L=1&i,B=o.length,$=s.length;if(B!=$&&!(L&&$>B))return!1;var V=j.get(o),U=j.get(s);if(V&&U)return V==s&&U==o;var z=-1,Y=!0,Z=2&i?new u:void 0;for(j.set(o,s),j.set(s,o);++z{var u=i(51873),_=i(37828),w=i(75288),x=i(25911),C=i(20317),j=i(84247),L=u?u.prototype:void 0,B=L?L.valueOf:void 0;o.exports=function equalByTag(o,s,i,u,L,$,V){switch(i){case"[object DataView]":if(o.byteLength!=s.byteLength||o.byteOffset!=s.byteOffset)return!1;o=o.buffer,s=s.buffer;case"[object ArrayBuffer]":return!(o.byteLength!=s.byteLength||!$(new _(o),new _(s)));case"[object Boolean]":case"[object Date]":case"[object Number]":return w(+o,+s);case"[object Error]":return o.name==s.name&&o.message==s.message;case"[object RegExp]":case"[object String]":return o==s+"";case"[object Map]":var U=C;case"[object Set]":var z=1&u;if(U||(U=j),o.size!=s.size&&!z)return!1;var Y=V.get(o);if(Y)return Y==s;u|=2,V.set(o,s);var Z=x(U(o),U(s),u,L,$,V);return V.delete(o),Z;case"[object Symbol]":if(B)return B.call(o)==B.call(s)}return!1}},50689:(o,s,i)=>{var u=i(50002),_=Object.prototype.hasOwnProperty;o.exports=function equalObjects(o,s,i,w,x,C){var j=1&i,L=u(o),B=L.length;if(B!=u(s).length&&!j)return!1;for(var $=B;$--;){var V=L[$];if(!(j?V in s:_.call(s,V)))return!1}var U=C.get(o),z=C.get(s);if(U&&z)return U==s&&z==o;var Y=!0;C.set(o,s),C.set(s,o);for(var Z=j;++${var u=i(35970),_=i(56757),w=i(32865);o.exports=function flatRest(o){return w(_(o,void 0,u),o+"")}},34840:(o,s,i)=>{var u="object"==typeof i.g&&i.g&&i.g.Object===Object&&i.g;o.exports=u},50002:(o,s,i)=>{var u=i(82199),_=i(4664),w=i(95950);o.exports=function getAllKeys(o){return u(o,w,_)}},83349:(o,s,i)=>{var u=i(82199),_=i(86375),w=i(37241);o.exports=function getAllKeysIn(o){return u(o,w,_)}},37381:(o,s,i)=>{var u=i(48152),_=i(63950),w=u?function(o){return u.get(o)}:_;o.exports=w},62284:(o,s,i)=>{var u=i(84629),_=Object.prototype.hasOwnProperty;o.exports=function getFuncName(o){for(var s=o.name+"",i=u[s],w=_.call(u,s)?i.length:0;w--;){var x=i[w],C=x.func;if(null==C||C==o)return x.name}return s}},11287:o=>{o.exports=function getHolder(o){return o.placeholder}},12651:(o,s,i)=>{var u=i(74218);o.exports=function getMapData(o,s){var i=o.__data__;return u(s)?i["string"==typeof s?"string":"hash"]:i.map}},10776:(o,s,i)=>{var u=i(30756),_=i(95950);o.exports=function getMatchData(o){for(var s=_(o),i=s.length;i--;){var w=s[i],x=o[w];s[i]=[w,x,u(x)]}return s}},56110:(o,s,i)=>{var u=i(45083),_=i(10392);o.exports=function getNative(o,s){var i=_(o,s);return u(i)?i:void 0}},28879:(o,s,i)=>{var u=i(74335)(Object.getPrototypeOf,Object);o.exports=u},659:(o,s,i)=>{var u=i(51873),_=Object.prototype,w=_.hasOwnProperty,x=_.toString,C=u?u.toStringTag:void 0;o.exports=function getRawTag(o){var s=w.call(o,C),i=o[C];try{o[C]=void 0;var u=!0}catch(o){}var _=x.call(o);return u&&(s?o[C]=i:delete o[C]),_}},4664:(o,s,i)=>{var u=i(79770),_=i(63345),w=Object.prototype.propertyIsEnumerable,x=Object.getOwnPropertySymbols,C=x?function(o){return null==o?[]:(o=Object(o),u(x(o),(function(s){return w.call(o,s)})))}:_;o.exports=C},86375:(o,s,i)=>{var u=i(14528),_=i(28879),w=i(4664),x=i(63345),C=Object.getOwnPropertySymbols?function(o){for(var s=[];o;)u(s,w(o)),o=_(o);return s}:x;o.exports=C},5861:(o,s,i)=>{var u=i(55580),_=i(68223),w=i(32804),x=i(76545),C=i(28303),j=i(72552),L=i(47473),B="[object Map]",$="[object Promise]",V="[object Set]",U="[object WeakMap]",z="[object DataView]",Y=L(u),Z=L(_),ee=L(w),ie=L(x),ae=L(C),ce=j;(u&&ce(new u(new ArrayBuffer(1)))!=z||_&&ce(new _)!=B||w&&ce(w.resolve())!=$||x&&ce(new x)!=V||C&&ce(new C)!=U)&&(ce=function(o){var s=j(o),i="[object Object]"==s?o.constructor:void 0,u=i?L(i):"";if(u)switch(u){case Y:return z;case Z:return B;case ee:return $;case ie:return V;case ae:return U}return s}),o.exports=ce},10392:o=>{o.exports=function getValue(o,s){return null==o?void 0:o[s]}},75251:o=>{var s=/\{\n\/\* \[wrapped with (.+)\] \*/,i=/,? & /;o.exports=function getWrapDetails(o){var u=o.match(s);return u?u[1].split(i):[]}},49326:(o,s,i)=>{var u=i(31769),_=i(72428),w=i(56449),x=i(30361),C=i(30294),j=i(77797);o.exports=function hasPath(o,s,i){for(var L=-1,B=(s=u(s,o)).length,$=!1;++L{var s=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");o.exports=function hasUnicode(o){return s.test(o)}},45434:o=>{var s=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;o.exports=function hasUnicodeWord(o){return s.test(o)}},22032:(o,s,i)=>{var u=i(81042);o.exports=function hashClear(){this.__data__=u?u(null):{},this.size=0}},63862:o=>{o.exports=function hashDelete(o){var s=this.has(o)&&delete this.__data__[o];return this.size-=s?1:0,s}},66721:(o,s,i)=>{var u=i(81042),_=Object.prototype.hasOwnProperty;o.exports=function hashGet(o){var s=this.__data__;if(u){var i=s[o];return"__lodash_hash_undefined__"===i?void 0:i}return _.call(s,o)?s[o]:void 0}},12749:(o,s,i)=>{var u=i(81042),_=Object.prototype.hasOwnProperty;o.exports=function hashHas(o){var s=this.__data__;return u?void 0!==s[o]:_.call(s,o)}},35749:(o,s,i)=>{var u=i(81042);o.exports=function hashSet(o,s){var i=this.__data__;return this.size+=this.has(o)?0:1,i[o]=u&&void 0===s?"__lodash_hash_undefined__":s,this}},76189:o=>{var s=Object.prototype.hasOwnProperty;o.exports=function initCloneArray(o){var i=o.length,u=new o.constructor(i);return i&&"string"==typeof o[0]&&s.call(o,"index")&&(u.index=o.index,u.input=o.input),u}},77199:(o,s,i)=>{var u=i(49653),_=i(76169),w=i(73201),x=i(93736),C=i(71961);o.exports=function initCloneByTag(o,s,i){var j=o.constructor;switch(s){case"[object ArrayBuffer]":return u(o);case"[object Boolean]":case"[object Date]":return new j(+o);case"[object DataView]":return _(o,i);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return C(o,i);case"[object Map]":case"[object Set]":return new j;case"[object Number]":case"[object String]":return new j(o);case"[object RegExp]":return w(o);case"[object Symbol]":return x(o)}}},35529:(o,s,i)=>{var u=i(39344),_=i(28879),w=i(55527);o.exports=function initCloneObject(o){return"function"!=typeof o.constructor||w(o)?{}:u(_(o))}},62060:o=>{var s=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;o.exports=function insertWrapDetails(o,i){var u=i.length;if(!u)return o;var _=u-1;return i[_]=(u>1?"& ":"")+i[_],i=i.join(u>2?", ":" "),o.replace(s,"{\n/* [wrapped with "+i+"] */\n")}},45891:(o,s,i)=>{var u=i(51873),_=i(72428),w=i(56449),x=u?u.isConcatSpreadable:void 0;o.exports=function isFlattenable(o){return w(o)||_(o)||!!(x&&o&&o[x])}},30361:o=>{var s=/^(?:0|[1-9]\d*)$/;o.exports=function isIndex(o,i){var u=typeof o;return!!(i=null==i?9007199254740991:i)&&("number"==u||"symbol"!=u&&s.test(o))&&o>-1&&o%1==0&&o{var u=i(75288),_=i(64894),w=i(30361),x=i(23805);o.exports=function isIterateeCall(o,s,i){if(!x(i))return!1;var C=typeof s;return!!("number"==C?_(i)&&w(s,i.length):"string"==C&&s in i)&&u(i[s],o)}},28586:(o,s,i)=>{var u=i(56449),_=i(44394),w=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,x=/^\w*$/;o.exports=function isKey(o,s){if(u(o))return!1;var i=typeof o;return!("number"!=i&&"symbol"!=i&&"boolean"!=i&&null!=o&&!_(o))||(x.test(o)||!w.test(o)||null!=s&&o in Object(s))}},74218:o=>{o.exports=function isKeyable(o){var s=typeof o;return"string"==s||"number"==s||"symbol"==s||"boolean"==s?"__proto__"!==o:null===o}},85087:(o,s,i)=>{var u=i(30980),_=i(37381),w=i(62284),x=i(53758);o.exports=function isLaziable(o){var s=w(o),i=x[s];if("function"!=typeof i||!(s in u.prototype))return!1;if(o===i)return!0;var C=_(i);return!!C&&o===C[0]}},87296:(o,s,i)=>{var u,_=i(55481),w=(u=/[^.]+$/.exec(_&&_.keys&&_.keys.IE_PROTO||""))?"Symbol(src)_1."+u:"";o.exports=function isMasked(o){return!!w&&w in o}},55527:o=>{var s=Object.prototype;o.exports=function isPrototype(o){var i=o&&o.constructor;return o===("function"==typeof i&&i.prototype||s)}},30756:(o,s,i)=>{var u=i(23805);o.exports=function isStrictComparable(o){return o==o&&!u(o)}},63702:o=>{o.exports=function listCacheClear(){this.__data__=[],this.size=0}},70080:(o,s,i)=>{var u=i(26025),_=Array.prototype.splice;o.exports=function listCacheDelete(o){var s=this.__data__,i=u(s,o);return!(i<0)&&(i==s.length-1?s.pop():_.call(s,i,1),--this.size,!0)}},24739:(o,s,i)=>{var u=i(26025);o.exports=function listCacheGet(o){var s=this.__data__,i=u(s,o);return i<0?void 0:s[i][1]}},48655:(o,s,i)=>{var u=i(26025);o.exports=function listCacheHas(o){return u(this.__data__,o)>-1}},31175:(o,s,i)=>{var u=i(26025);o.exports=function listCacheSet(o,s){var i=this.__data__,_=u(i,o);return _<0?(++this.size,i.push([o,s])):i[_][1]=s,this}},63040:(o,s,i)=>{var u=i(21549),_=i(80079),w=i(68223);o.exports=function mapCacheClear(){this.size=0,this.__data__={hash:new u,map:new(w||_),string:new u}}},17670:(o,s,i)=>{var u=i(12651);o.exports=function mapCacheDelete(o){var s=u(this,o).delete(o);return this.size-=s?1:0,s}},90289:(o,s,i)=>{var u=i(12651);o.exports=function mapCacheGet(o){return u(this,o).get(o)}},4509:(o,s,i)=>{var u=i(12651);o.exports=function mapCacheHas(o){return u(this,o).has(o)}},72949:(o,s,i)=>{var u=i(12651);o.exports=function mapCacheSet(o,s){var i=u(this,o),_=i.size;return i.set(o,s),this.size+=i.size==_?0:1,this}},20317:o=>{o.exports=function mapToArray(o){var s=-1,i=Array(o.size);return o.forEach((function(o,u){i[++s]=[u,o]})),i}},67197:o=>{o.exports=function matchesStrictComparable(o,s){return function(i){return null!=i&&(i[o]===s&&(void 0!==s||o in Object(i)))}}},62224:(o,s,i)=>{var u=i(50104);o.exports=function memoizeCapped(o){var s=u(o,(function(o){return 500===i.size&&i.clear(),o})),i=s.cache;return s}},3209:(o,s,i)=>{var u=i(91596),_=i(53320),w=i(36306),x="__lodash_placeholder__",C=128,j=Math.min;o.exports=function mergeData(o,s){var i=o[1],L=s[1],B=i|L,$=B<131,V=L==C&&8==i||L==C&&256==i&&o[7].length<=s[8]||384==L&&s[7].length<=s[8]&&8==i;if(!$&&!V)return o;1&L&&(o[2]=s[2],B|=1&i?0:4);var U=s[3];if(U){var z=o[3];o[3]=z?u(z,U,s[4]):U,o[4]=z?w(o[3],x):s[4]}return(U=s[5])&&(z=o[5],o[5]=z?_(z,U,s[6]):U,o[6]=z?w(o[5],x):s[6]),(U=s[7])&&(o[7]=U),L&C&&(o[8]=null==o[8]?s[8]:j(o[8],s[8])),null==o[9]&&(o[9]=s[9]),o[0]=s[0],o[1]=B,o}},48152:(o,s,i)=>{var u=i(28303),_=u&&new u;o.exports=_},81042:(o,s,i)=>{var u=i(56110)(Object,"create");o.exports=u},3650:(o,s,i)=>{var u=i(74335)(Object.keys,Object);o.exports=u},90181:o=>{o.exports=function nativeKeysIn(o){var s=[];if(null!=o)for(var i in Object(o))s.push(i);return s}},86009:(o,s,i)=>{o=i.nmd(o);var u=i(34840),_=s&&!s.nodeType&&s,w=_&&o&&!o.nodeType&&o,x=w&&w.exports===_&&u.process,C=function(){try{var o=w&&w.require&&w.require("util").types;return o||x&&x.binding&&x.binding("util")}catch(o){}}();o.exports=C},59350:o=>{var s=Object.prototype.toString;o.exports=function objectToString(o){return s.call(o)}},74335:o=>{o.exports=function overArg(o,s){return function(i){return o(s(i))}}},56757:(o,s,i)=>{var u=i(91033),_=Math.max;o.exports=function overRest(o,s,i){return s=_(void 0===s?o.length-1:s,0),function(){for(var w=arguments,x=-1,C=_(w.length-s,0),j=Array(C);++x{var u=i(47422),_=i(25160);o.exports=function parent(o,s){return s.length<2?o:u(o,_(s,0,-1))}},84629:o=>{o.exports={}},68294:(o,s,i)=>{var u=i(23007),_=i(30361),w=Math.min;o.exports=function reorder(o,s){for(var i=o.length,x=w(s.length,i),C=u(o);x--;){var j=s[x];o[x]=_(j,i)?C[j]:void 0}return o}},36306:o=>{var s="__lodash_placeholder__";o.exports=function replaceHolders(o,i){for(var u=-1,_=o.length,w=0,x=[];++u<_;){var C=o[u];C!==i&&C!==s||(o[u]=s,x[w++]=u)}return x}},9325:(o,s,i)=>{var u=i(34840),_="object"==typeof self&&self&&self.Object===Object&&self,w=u||_||Function("return this")();o.exports=w},14974:o=>{o.exports=function safeGet(o,s){if(("constructor"!==s||"function"!=typeof o[s])&&"__proto__"!=s)return o[s]}},31380:o=>{o.exports=function setCacheAdd(o){return this.__data__.set(o,"__lodash_hash_undefined__"),this}},51459:o=>{o.exports=function setCacheHas(o){return this.__data__.has(o)}},54641:(o,s,i)=>{var u=i(68882),_=i(51811)(u);o.exports=_},84247:o=>{o.exports=function setToArray(o){var s=-1,i=Array(o.size);return o.forEach((function(o){i[++s]=o})),i}},32865:(o,s,i)=>{var u=i(19570),_=i(51811)(u);o.exports=_},70981:(o,s,i)=>{var u=i(75251),_=i(62060),w=i(32865),x=i(75948);o.exports=function setWrapToString(o,s,i){var C=s+"";return w(o,_(C,x(u(C),i)))}},51811:o=>{var s=Date.now;o.exports=function shortOut(o){var i=0,u=0;return function(){var _=s(),w=16-(_-u);if(u=_,w>0){if(++i>=800)return arguments[0]}else i=0;return o.apply(void 0,arguments)}}},51420:(o,s,i)=>{var u=i(80079);o.exports=function stackClear(){this.__data__=new u,this.size=0}},90938:o=>{o.exports=function stackDelete(o){var s=this.__data__,i=s.delete(o);return this.size=s.size,i}},63605:o=>{o.exports=function stackGet(o){return this.__data__.get(o)}},29817:o=>{o.exports=function stackHas(o){return this.__data__.has(o)}},80945:(o,s,i)=>{var u=i(80079),_=i(68223),w=i(53661);o.exports=function stackSet(o,s){var i=this.__data__;if(i instanceof u){var x=i.__data__;if(!_||x.length<199)return x.push([o,s]),this.size=++i.size,this;i=this.__data__=new w(x)}return i.set(o,s),this.size=i.size,this}},76959:o=>{o.exports=function strictIndexOf(o,s,i){for(var u=i-1,_=o.length;++u<_;)if(o[u]===s)return u;return-1}},63912:(o,s,i)=>{var u=i(61074),_=i(49698),w=i(42054);o.exports=function stringToArray(o){return _(o)?w(o):u(o)}},61802:(o,s,i)=>{var u=i(62224),_=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,w=/\\(\\)?/g,x=u((function(o){var s=[];return 46===o.charCodeAt(0)&&s.push(""),o.replace(_,(function(o,i,u,_){s.push(u?_.replace(w,"$1"):i||o)})),s}));o.exports=x},77797:(o,s,i)=>{var u=i(44394);o.exports=function toKey(o){if("string"==typeof o||u(o))return o;var s=o+"";return"0"==s&&1/o==-1/0?"-0":s}},47473:o=>{var s=Function.prototype.toString;o.exports=function toSource(o){if(null!=o){try{return s.call(o)}catch(o){}try{return o+""}catch(o){}}return""}},31800:o=>{var s=/\s/;o.exports=function trimmedEndIndex(o){for(var i=o.length;i--&&s.test(o.charAt(i)););return i}},42054:o=>{var s="\\ud800-\\udfff",i="["+s+"]",u="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",_="\\ud83c[\\udffb-\\udfff]",w="[^"+s+"]",x="(?:\\ud83c[\\udde6-\\uddff]){2}",C="[\\ud800-\\udbff][\\udc00-\\udfff]",j="(?:"+u+"|"+_+")"+"?",L="[\\ufe0e\\ufe0f]?",B=L+j+("(?:\\u200d(?:"+[w,x,C].join("|")+")"+L+j+")*"),$="(?:"+[w+u+"?",u,x,C,i].join("|")+")",V=RegExp(_+"(?="+_+")|"+$+B,"g");o.exports=function unicodeToArray(o){return o.match(V)||[]}},22225:o=>{var s="\\ud800-\\udfff",i="\\u2700-\\u27bf",u="a-z\\xdf-\\xf6\\xf8-\\xff",_="A-Z\\xc0-\\xd6\\xd8-\\xde",w="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",x="["+w+"]",C="\\d+",j="["+i+"]",L="["+u+"]",B="[^"+s+w+C+i+u+_+"]",$="(?:\\ud83c[\\udde6-\\uddff]){2}",V="[\\ud800-\\udbff][\\udc00-\\udfff]",U="["+_+"]",z="(?:"+L+"|"+B+")",Y="(?:"+U+"|"+B+")",Z="(?:['’](?:d|ll|m|re|s|t|ve))?",ee="(?:['’](?:D|LL|M|RE|S|T|VE))?",ie="(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?",ae="[\\ufe0e\\ufe0f]?",ce=ae+ie+("(?:\\u200d(?:"+["[^"+s+"]",$,V].join("|")+")"+ae+ie+")*"),le="(?:"+[j,$,V].join("|")+")"+ce,pe=RegExp([U+"?"+L+"+"+Z+"(?="+[x,U,"$"].join("|")+")",Y+"+"+ee+"(?="+[x,U+z,"$"].join("|")+")",U+"?"+z+"+"+Z,U+"+"+ee,"\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",C,le].join("|"),"g");o.exports=function unicodeWords(o){return o.match(pe)||[]}},75948:(o,s,i)=>{var u=i(83729),_=i(15325),w=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]];o.exports=function updateWrapDetails(o,s){return u(w,(function(i){var u="_."+i[0];s&i[1]&&!_(o,u)&&o.push(u)})),o.sort()}},80257:(o,s,i)=>{var u=i(30980),_=i(56017),w=i(23007);o.exports=function wrapperClone(o){if(o instanceof u)return o.clone();var s=new _(o.__wrapped__,o.__chain__);return s.__actions__=w(o.__actions__),s.__index__=o.__index__,s.__values__=o.__values__,s}},64626:(o,s,i)=>{var u=i(66977);o.exports=function ary(o,s,i){return s=i?void 0:s,s=o&&null==s?o.length:s,u(o,128,void 0,void 0,void 0,void 0,s)}},84058:(o,s,i)=>{var u=i(14792),_=i(45539)((function(o,s,i){return s=s.toLowerCase(),o+(i?u(s):s)}));o.exports=_},14792:(o,s,i)=>{var u=i(13222),_=i(55808);o.exports=function capitalize(o){return _(u(o).toLowerCase())}},32629:(o,s,i)=>{var u=i(9999);o.exports=function clone(o){return u(o,4)}},37334:o=>{o.exports=function constant(o){return function(){return o}}},49747:(o,s,i)=>{var u=i(66977);function curry(o,s,i){var _=u(o,8,void 0,void 0,void 0,void 0,void 0,s=i?void 0:s);return _.placeholder=curry.placeholder,_}curry.placeholder={},o.exports=curry},38221:(o,s,i)=>{var u=i(23805),_=i(10124),w=i(99374),x=Math.max,C=Math.min;o.exports=function debounce(o,s,i){var j,L,B,$,V,U,z=0,Y=!1,Z=!1,ee=!0;if("function"!=typeof o)throw new TypeError("Expected a function");function invokeFunc(s){var i=j,u=L;return j=L=void 0,z=s,$=o.apply(u,i)}function shouldInvoke(o){var i=o-U;return void 0===U||i>=s||i<0||Z&&o-z>=B}function timerExpired(){var o=_();if(shouldInvoke(o))return trailingEdge(o);V=setTimeout(timerExpired,function remainingWait(o){var i=s-(o-U);return Z?C(i,B-(o-z)):i}(o))}function trailingEdge(o){return V=void 0,ee&&j?invokeFunc(o):(j=L=void 0,$)}function debounced(){var o=_(),i=shouldInvoke(o);if(j=arguments,L=this,U=o,i){if(void 0===V)return function leadingEdge(o){return z=o,V=setTimeout(timerExpired,s),Y?invokeFunc(o):$}(U);if(Z)return clearTimeout(V),V=setTimeout(timerExpired,s),invokeFunc(U)}return void 0===V&&(V=setTimeout(timerExpired,s)),$}return s=w(s)||0,u(i)&&(Y=!!i.leading,B=(Z="maxWait"in i)?x(w(i.maxWait)||0,s):B,ee="trailing"in i?!!i.trailing:ee),debounced.cancel=function cancel(){void 0!==V&&clearTimeout(V),z=0,j=U=L=V=void 0},debounced.flush=function flush(){return void 0===V?$:trailingEdge(_())},debounced}},50828:(o,s,i)=>{var u=i(24647),_=i(13222),w=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,x=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]","g");o.exports=function deburr(o){return(o=_(o))&&o.replace(w,u).replace(x,"")}},75288:o=>{o.exports=function eq(o,s){return o===s||o!=o&&s!=s}},60680:(o,s,i)=>{var u=i(13222),_=/[\\^$.*+?()[\]{}|]/g,w=RegExp(_.source);o.exports=function escapeRegExp(o){return(o=u(o))&&w.test(o)?o.replace(_,"\\$&"):o}},7309:(o,s,i)=>{var u=i(62006)(i(24713));o.exports=u},24713:(o,s,i)=>{var u=i(2523),_=i(15389),w=i(61489),x=Math.max;o.exports=function findIndex(o,s,i){var C=null==o?0:o.length;if(!C)return-1;var j=null==i?0:w(i);return j<0&&(j=x(C+j,0)),u(o,_(s,3),j)}},35970:(o,s,i)=>{var u=i(83120);o.exports=function flatten(o){return(null==o?0:o.length)?u(o,1):[]}},73424:(o,s,i)=>{var u=i(16962),_=i(2874),w=Array.prototype.push;function baseAry(o,s){return 2==s?function(s,i){return o(s,i)}:function(s){return o(s)}}function cloneArray(o){for(var s=o?o.length:0,i=Array(s);s--;)i[s]=o[s];return i}function wrapImmutable(o,s){return function(){var i=arguments.length;if(i){for(var u=Array(i);i--;)u[i]=arguments[i];var _=u[0]=s.apply(void 0,u);return o.apply(void 0,u),_}}}o.exports=function baseConvert(o,s,i,x){var C="function"==typeof s,j=s===Object(s);if(j&&(x=i,i=s,s=void 0),null==i)throw new TypeError;x||(x={});var L={cap:!("cap"in x)||x.cap,curry:!("curry"in x)||x.curry,fixed:!("fixed"in x)||x.fixed,immutable:!("immutable"in x)||x.immutable,rearg:!("rearg"in x)||x.rearg},B=C?i:_,$="curry"in x&&x.curry,V="fixed"in x&&x.fixed,U="rearg"in x&&x.rearg,z=C?i.runInContext():void 0,Y=C?i:{ary:o.ary,assign:o.assign,clone:o.clone,curry:o.curry,forEach:o.forEach,isArray:o.isArray,isError:o.isError,isFunction:o.isFunction,isWeakMap:o.isWeakMap,iteratee:o.iteratee,keys:o.keys,rearg:o.rearg,toInteger:o.toInteger,toPath:o.toPath},Z=Y.ary,ee=Y.assign,ie=Y.clone,ae=Y.curry,ce=Y.forEach,le=Y.isArray,pe=Y.isError,de=Y.isFunction,fe=Y.isWeakMap,ye=Y.keys,be=Y.rearg,_e=Y.toInteger,we=Y.toPath,Se=ye(u.aryMethod),xe={castArray:function(o){return function(){var s=arguments[0];return le(s)?o(cloneArray(s)):o.apply(void 0,arguments)}},iteratee:function(o){return function(){var s=arguments[1],i=o(arguments[0],s),u=i.length;return L.cap&&"number"==typeof s?(s=s>2?s-2:1,u&&u<=s?i:baseAry(i,s)):i}},mixin:function(o){return function(s){var i=this;if(!de(i))return o(i,Object(s));var u=[];return ce(ye(s),(function(o){de(s[o])&&u.push([o,i.prototype[o]])})),o(i,Object(s)),ce(u,(function(o){var s=o[1];de(s)?i.prototype[o[0]]=s:delete i.prototype[o[0]]})),i}},nthArg:function(o){return function(s){var i=s<0?1:_e(s)+1;return ae(o(s),i)}},rearg:function(o){return function(s,i){var u=i?i.length:0;return ae(o(s,i),u)}},runInContext:function(s){return function(i){return baseConvert(o,s(i),x)}}};function castCap(o,s){if(L.cap){var i=u.iterateeRearg[o];if(i)return function iterateeRearg(o,s){return overArg(o,(function(o){var i=s.length;return function baseArity(o,s){return 2==s?function(s,i){return o.apply(void 0,arguments)}:function(s){return o.apply(void 0,arguments)}}(be(baseAry(o,i),s),i)}))}(s,i);var _=!C&&u.iterateeAry[o];if(_)return function iterateeAry(o,s){return overArg(o,(function(o){return"function"==typeof o?baseAry(o,s):o}))}(s,_)}return s}function castFixed(o,s,i){if(L.fixed&&(V||!u.skipFixed[o])){var _=u.methodSpread[o],x=_&&_.start;return void 0===x?Z(s,i):function flatSpread(o,s){return function(){for(var i=arguments.length,u=i-1,_=Array(i);i--;)_[i]=arguments[i];var x=_[s],C=_.slice(0,s);return x&&w.apply(C,x),s!=u&&w.apply(C,_.slice(s+1)),o.apply(this,C)}}(s,x)}return s}function castRearg(o,s,i){return L.rearg&&i>1&&(U||!u.skipRearg[o])?be(s,u.methodRearg[o]||u.aryRearg[i]):s}function cloneByPath(o,s){for(var i=-1,u=(s=we(s)).length,_=u-1,w=ie(Object(o)),x=w;null!=x&&++i1?ae(s,i):s}(0,_=castCap(w,_),o),!1}})),!_})),_||(_=x),_==s&&(_=$?ae(_,1):function(){return s.apply(this,arguments)}),_.convert=createConverter(w,s),_.placeholder=s.placeholder=i,_}if(!j)return wrap(s,i,B);var Pe=i,Te=[];return ce(Se,(function(o){ce(u.aryMethod[o],(function(o){var s=Pe[u.remap[o]||o];s&&Te.push([o,wrap(o,s,Pe)])}))})),ce(ye(Pe),(function(o){var s=Pe[o];if("function"==typeof s){for(var i=Te.length;i--;)if(Te[i][0]==o)return;s.convert=createConverter(o,s),Te.push([o,s])}})),ce(Te,(function(o){Pe[o[0]]=o[1]})),Pe.convert=function convertLib(o){return Pe.runInContext.convert(o)(void 0)},Pe.placeholder=Pe,ce(ye(Pe),(function(o){ce(u.realToAlias[o]||[],(function(s){Pe[s]=Pe[o]}))})),Pe}},16962:(o,s)=>{s.aliasToReal={each:"forEach",eachRight:"forEachRight",entries:"toPairs",entriesIn:"toPairsIn",extend:"assignIn",extendAll:"assignInAll",extendAllWith:"assignInAllWith",extendWith:"assignInWith",first:"head",conforms:"conformsTo",matches:"isMatch",property:"get",__:"placeholder",F:"stubFalse",T:"stubTrue",all:"every",allPass:"overEvery",always:"constant",any:"some",anyPass:"overSome",apply:"spread",assoc:"set",assocPath:"set",complement:"negate",compose:"flowRight",contains:"includes",dissoc:"unset",dissocPath:"unset",dropLast:"dropRight",dropLastWhile:"dropRightWhile",equals:"isEqual",identical:"eq",indexBy:"keyBy",init:"initial",invertObj:"invert",juxt:"over",omitAll:"omit",nAry:"ary",path:"get",pathEq:"matchesProperty",pathOr:"getOr",paths:"at",pickAll:"pick",pipe:"flow",pluck:"map",prop:"get",propEq:"matchesProperty",propOr:"getOr",props:"at",symmetricDifference:"xor",symmetricDifferenceBy:"xorBy",symmetricDifferenceWith:"xorWith",takeLast:"takeRight",takeLastWhile:"takeRightWhile",unapply:"rest",unnest:"flatten",useWith:"overArgs",where:"conformsTo",whereEq:"isMatch",zipObj:"zipObject"},s.aryMethod={1:["assignAll","assignInAll","attempt","castArray","ceil","create","curry","curryRight","defaultsAll","defaultsDeepAll","floor","flow","flowRight","fromPairs","invert","iteratee","memoize","method","mergeAll","methodOf","mixin","nthArg","over","overEvery","overSome","rest","reverse","round","runInContext","spread","template","trim","trimEnd","trimStart","uniqueId","words","zipAll"],2:["add","after","ary","assign","assignAllWith","assignIn","assignInAllWith","at","before","bind","bindAll","bindKey","chunk","cloneDeepWith","cloneWith","concat","conformsTo","countBy","curryN","curryRightN","debounce","defaults","defaultsDeep","defaultTo","delay","difference","divide","drop","dropRight","dropRightWhile","dropWhile","endsWith","eq","every","filter","find","findIndex","findKey","findLast","findLastIndex","findLastKey","flatMap","flatMapDeep","flattenDepth","forEach","forEachRight","forIn","forInRight","forOwn","forOwnRight","get","groupBy","gt","gte","has","hasIn","includes","indexOf","intersection","invertBy","invoke","invokeMap","isEqual","isMatch","join","keyBy","lastIndexOf","lt","lte","map","mapKeys","mapValues","matchesProperty","maxBy","meanBy","merge","mergeAllWith","minBy","multiply","nth","omit","omitBy","overArgs","pad","padEnd","padStart","parseInt","partial","partialRight","partition","pick","pickBy","propertyOf","pull","pullAll","pullAt","random","range","rangeRight","rearg","reject","remove","repeat","restFrom","result","sampleSize","some","sortBy","sortedIndex","sortedIndexOf","sortedLastIndex","sortedLastIndexOf","sortedUniqBy","split","spreadFrom","startsWith","subtract","sumBy","take","takeRight","takeRightWhile","takeWhile","tap","throttle","thru","times","trimChars","trimCharsEnd","trimCharsStart","truncate","union","uniqBy","uniqWith","unset","unzipWith","without","wrap","xor","zip","zipObject","zipObjectDeep"],3:["assignInWith","assignWith","clamp","differenceBy","differenceWith","findFrom","findIndexFrom","findLastFrom","findLastIndexFrom","getOr","includesFrom","indexOfFrom","inRange","intersectionBy","intersectionWith","invokeArgs","invokeArgsMap","isEqualWith","isMatchWith","flatMapDepth","lastIndexOfFrom","mergeWith","orderBy","padChars","padCharsEnd","padCharsStart","pullAllBy","pullAllWith","rangeStep","rangeStepRight","reduce","reduceRight","replace","set","slice","sortedIndexBy","sortedLastIndexBy","transform","unionBy","unionWith","update","xorBy","xorWith","zipWith"],4:["fill","setWith","updateWith"]},s.aryRearg={2:[1,0],3:[2,0,1],4:[3,2,0,1]},s.iterateeAry={dropRightWhile:1,dropWhile:1,every:1,filter:1,find:1,findFrom:1,findIndex:1,findIndexFrom:1,findKey:1,findLast:1,findLastFrom:1,findLastIndex:1,findLastIndexFrom:1,findLastKey:1,flatMap:1,flatMapDeep:1,flatMapDepth:1,forEach:1,forEachRight:1,forIn:1,forInRight:1,forOwn:1,forOwnRight:1,map:1,mapKeys:1,mapValues:1,partition:1,reduce:2,reduceRight:2,reject:1,remove:1,some:1,takeRightWhile:1,takeWhile:1,times:1,transform:2},s.iterateeRearg={mapKeys:[1],reduceRight:[1,0]},s.methodRearg={assignInAllWith:[1,0],assignInWith:[1,2,0],assignAllWith:[1,0],assignWith:[1,2,0],differenceBy:[1,2,0],differenceWith:[1,2,0],getOr:[2,1,0],intersectionBy:[1,2,0],intersectionWith:[1,2,0],isEqualWith:[1,2,0],isMatchWith:[2,1,0],mergeAllWith:[1,0],mergeWith:[1,2,0],padChars:[2,1,0],padCharsEnd:[2,1,0],padCharsStart:[2,1,0],pullAllBy:[2,1,0],pullAllWith:[2,1,0],rangeStep:[1,2,0],rangeStepRight:[1,2,0],setWith:[3,1,2,0],sortedIndexBy:[2,1,0],sortedLastIndexBy:[2,1,0],unionBy:[1,2,0],unionWith:[1,2,0],updateWith:[3,1,2,0],xorBy:[1,2,0],xorWith:[1,2,0],zipWith:[1,2,0]},s.methodSpread={assignAll:{start:0},assignAllWith:{start:0},assignInAll:{start:0},assignInAllWith:{start:0},defaultsAll:{start:0},defaultsDeepAll:{start:0},invokeArgs:{start:2},invokeArgsMap:{start:2},mergeAll:{start:0},mergeAllWith:{start:0},partial:{start:1},partialRight:{start:1},without:{start:1},zipAll:{start:0}},s.mutate={array:{fill:!0,pull:!0,pullAll:!0,pullAllBy:!0,pullAllWith:!0,pullAt:!0,remove:!0,reverse:!0},object:{assign:!0,assignAll:!0,assignAllWith:!0,assignIn:!0,assignInAll:!0,assignInAllWith:!0,assignInWith:!0,assignWith:!0,defaults:!0,defaultsAll:!0,defaultsDeep:!0,defaultsDeepAll:!0,merge:!0,mergeAll:!0,mergeAllWith:!0,mergeWith:!0},set:{set:!0,setWith:!0,unset:!0,update:!0,updateWith:!0}},s.realToAlias=function(){var o=Object.prototype.hasOwnProperty,i=s.aliasToReal,u={};for(var _ in i){var w=i[_];o.call(u,w)?u[w].push(_):u[w]=[_]}return u}(),s.remap={assignAll:"assign",assignAllWith:"assignWith",assignInAll:"assignIn",assignInAllWith:"assignInWith",curryN:"curry",curryRightN:"curryRight",defaultsAll:"defaults",defaultsDeepAll:"defaultsDeep",findFrom:"find",findIndexFrom:"findIndex",findLastFrom:"findLast",findLastIndexFrom:"findLastIndex",getOr:"get",includesFrom:"includes",indexOfFrom:"indexOf",invokeArgs:"invoke",invokeArgsMap:"invokeMap",lastIndexOfFrom:"lastIndexOf",mergeAll:"merge",mergeAllWith:"mergeWith",padChars:"pad",padCharsEnd:"padEnd",padCharsStart:"padStart",propertyOf:"get",rangeStep:"range",rangeStepRight:"rangeRight",restFrom:"rest",spreadFrom:"spread",trimChars:"trim",trimCharsEnd:"trimEnd",trimCharsStart:"trimStart",zipAll:"zip"},s.skipFixed={castArray:!0,flow:!0,flowRight:!0,iteratee:!0,mixin:!0,rearg:!0,runInContext:!0},s.skipRearg={add:!0,assign:!0,assignIn:!0,bind:!0,bindKey:!0,concat:!0,difference:!0,divide:!0,eq:!0,gt:!0,gte:!0,isEqual:!0,lt:!0,lte:!0,matchesProperty:!0,merge:!0,multiply:!0,overArgs:!0,partial:!0,partialRight:!0,propertyOf:!0,random:!0,range:!0,rangeRight:!0,subtract:!0,zip:!0,zipObject:!0,zipObjectDeep:!0}},47934:(o,s,i)=>{o.exports={ary:i(64626),assign:i(74733),clone:i(32629),curry:i(49747),forEach:i(83729),isArray:i(56449),isError:i(23546),isFunction:i(1882),isWeakMap:i(47886),iteratee:i(33855),keys:i(88984),rearg:i(84195),toInteger:i(61489),toPath:i(42072)}},56367:(o,s,i)=>{o.exports=i(77731)},79920:(o,s,i)=>{var u=i(73424),_=i(47934);o.exports=function convert(o,s,i){return u(_,o,s,i)}},2874:o=>{o.exports={}},77731:(o,s,i)=>{var u=i(79920)("set",i(63560));u.placeholder=i(2874),o.exports=u},58156:(o,s,i)=>{var u=i(47422);o.exports=function get(o,s,i){var _=null==o?void 0:u(o,s);return void 0===_?i:_}},61448:(o,s,i)=>{var u=i(20426),_=i(49326);o.exports=function has(o,s){return null!=o&&_(o,s,u)}},80631:(o,s,i)=>{var u=i(28077),_=i(49326);o.exports=function hasIn(o,s){return null!=o&&_(o,s,u)}},83488:o=>{o.exports=function identity(o){return o}},72428:(o,s,i)=>{var u=i(27534),_=i(40346),w=Object.prototype,x=w.hasOwnProperty,C=w.propertyIsEnumerable,j=u(function(){return arguments}())?u:function(o){return _(o)&&x.call(o,"callee")&&!C.call(o,"callee")};o.exports=j},56449:o=>{var s=Array.isArray;o.exports=s},64894:(o,s,i)=>{var u=i(1882),_=i(30294);o.exports=function isArrayLike(o){return null!=o&&_(o.length)&&!u(o)}},83693:(o,s,i)=>{var u=i(64894),_=i(40346);o.exports=function isArrayLikeObject(o){return _(o)&&u(o)}},53812:(o,s,i)=>{var u=i(72552),_=i(40346);o.exports=function isBoolean(o){return!0===o||!1===o||_(o)&&"[object Boolean]"==u(o)}},3656:(o,s,i)=>{o=i.nmd(o);var u=i(9325),_=i(89935),w=s&&!s.nodeType&&s,x=w&&o&&!o.nodeType&&o,C=x&&x.exports===w?u.Buffer:void 0,j=(C?C.isBuffer:void 0)||_;o.exports=j},62193:(o,s,i)=>{var u=i(88984),_=i(5861),w=i(72428),x=i(56449),C=i(64894),j=i(3656),L=i(55527),B=i(37167),$=Object.prototype.hasOwnProperty;o.exports=function isEmpty(o){if(null==o)return!0;if(C(o)&&(x(o)||"string"==typeof o||"function"==typeof o.splice||j(o)||B(o)||w(o)))return!o.length;var s=_(o);if("[object Map]"==s||"[object Set]"==s)return!o.size;if(L(o))return!u(o).length;for(var i in o)if($.call(o,i))return!1;return!0}},2404:(o,s,i)=>{var u=i(60270);o.exports=function isEqual(o,s){return u(o,s)}},23546:(o,s,i)=>{var u=i(72552),_=i(40346),w=i(11331);o.exports=function isError(o){if(!_(o))return!1;var s=u(o);return"[object Error]"==s||"[object DOMException]"==s||"string"==typeof o.message&&"string"==typeof o.name&&!w(o)}},1882:(o,s,i)=>{var u=i(72552),_=i(23805);o.exports=function isFunction(o){if(!_(o))return!1;var s=u(o);return"[object Function]"==s||"[object GeneratorFunction]"==s||"[object AsyncFunction]"==s||"[object Proxy]"==s}},30294:o=>{o.exports=function isLength(o){return"number"==typeof o&&o>-1&&o%1==0&&o<=9007199254740991}},87730:(o,s,i)=>{var u=i(29172),_=i(27301),w=i(86009),x=w&&w.isMap,C=x?_(x):u;o.exports=C},5187:o=>{o.exports=function isNull(o){return null===o}},98023:(o,s,i)=>{var u=i(72552),_=i(40346);o.exports=function isNumber(o){return"number"==typeof o||_(o)&&"[object Number]"==u(o)}},23805:o=>{o.exports=function isObject(o){var s=typeof o;return null!=o&&("object"==s||"function"==s)}},40346:o=>{o.exports=function isObjectLike(o){return null!=o&&"object"==typeof o}},11331:(o,s,i)=>{var u=i(72552),_=i(28879),w=i(40346),x=Function.prototype,C=Object.prototype,j=x.toString,L=C.hasOwnProperty,B=j.call(Object);o.exports=function isPlainObject(o){if(!w(o)||"[object Object]"!=u(o))return!1;var s=_(o);if(null===s)return!0;var i=L.call(s,"constructor")&&s.constructor;return"function"==typeof i&&i instanceof i&&j.call(i)==B}},38440:(o,s,i)=>{var u=i(16038),_=i(27301),w=i(86009),x=w&&w.isSet,C=x?_(x):u;o.exports=C},85015:(o,s,i)=>{var u=i(72552),_=i(56449),w=i(40346);o.exports=function isString(o){return"string"==typeof o||!_(o)&&w(o)&&"[object String]"==u(o)}},44394:(o,s,i)=>{var u=i(72552),_=i(40346);o.exports=function isSymbol(o){return"symbol"==typeof o||_(o)&&"[object Symbol]"==u(o)}},37167:(o,s,i)=>{var u=i(4901),_=i(27301),w=i(86009),x=w&&w.isTypedArray,C=x?_(x):u;o.exports=C},47886:(o,s,i)=>{var u=i(5861),_=i(40346);o.exports=function isWeakMap(o){return _(o)&&"[object WeakMap]"==u(o)}},33855:(o,s,i)=>{var u=i(9999),_=i(15389);o.exports=function iteratee(o){return _("function"==typeof o?o:u(o,1))}},95950:(o,s,i)=>{var u=i(70695),_=i(88984),w=i(64894);o.exports=function keys(o){return w(o)?u(o):_(o)}},37241:(o,s,i)=>{var u=i(70695),_=i(72903),w=i(64894);o.exports=function keysIn(o){return w(o)?u(o,!0):_(o)}},68090:o=>{o.exports=function last(o){var s=null==o?0:o.length;return s?o[s-1]:void 0}},50104:(o,s,i)=>{var u=i(53661);function memoize(o,s){if("function"!=typeof o||null!=s&&"function"!=typeof s)throw new TypeError("Expected a function");var memoized=function(){var i=arguments,u=s?s.apply(this,i):i[0],_=memoized.cache;if(_.has(u))return _.get(u);var w=o.apply(this,i);return memoized.cache=_.set(u,w)||_,w};return memoized.cache=new(memoize.Cache||u),memoized}memoize.Cache=u,o.exports=memoize},55364:(o,s,i)=>{var u=i(85250),_=i(20999)((function(o,s,i){u(o,s,i)}));o.exports=_},6048:o=>{o.exports=function negate(o){if("function"!=typeof o)throw new TypeError("Expected a function");return function(){var s=arguments;switch(s.length){case 0:return!o.call(this);case 1:return!o.call(this,s[0]);case 2:return!o.call(this,s[0],s[1]);case 3:return!o.call(this,s[0],s[1],s[2])}return!o.apply(this,s)}}},63950:o=>{o.exports=function noop(){}},10124:(o,s,i)=>{var u=i(9325);o.exports=function(){return u.Date.now()}},90179:(o,s,i)=>{var u=i(34932),_=i(9999),w=i(19931),x=i(31769),C=i(21791),j=i(53138),L=i(38816),B=i(83349),$=L((function(o,s){var i={};if(null==o)return i;var L=!1;s=u(s,(function(s){return s=x(s,o),L||(L=s.length>1),s})),C(o,B(o),i),L&&(i=_(i,7,j));for(var $=s.length;$--;)w(i,s[$]);return i}));o.exports=$},50583:(o,s,i)=>{var u=i(47237),_=i(17255),w=i(28586),x=i(77797);o.exports=function property(o){return w(o)?u(x(o)):_(o)}},84195:(o,s,i)=>{var u=i(66977),_=i(38816),w=_((function(o,s){return u(o,256,void 0,void 0,void 0,s)}));o.exports=w},40860:(o,s,i)=>{var u=i(40882),_=i(80909),w=i(15389),x=i(85558),C=i(56449);o.exports=function reduce(o,s,i){var j=C(o)?u:x,L=arguments.length<3;return j(o,w(s,4),i,L,_)}},63560:(o,s,i)=>{var u=i(73170);o.exports=function set(o,s,i){return null==o?o:u(o,s,i)}},42426:(o,s,i)=>{var u=i(14248),_=i(15389),w=i(90916),x=i(56449),C=i(36800);o.exports=function some(o,s,i){var j=x(o)?u:w;return i&&C(o,s,i)&&(s=void 0),j(o,_(s,3))}},63345:o=>{o.exports=function stubArray(){return[]}},89935:o=>{o.exports=function stubFalse(){return!1}},17400:(o,s,i)=>{var u=i(99374),_=1/0;o.exports=function toFinite(o){return o?(o=u(o))===_||o===-1/0?17976931348623157e292*(o<0?-1:1):o==o?o:0:0===o?o:0}},61489:(o,s,i)=>{var u=i(17400);o.exports=function toInteger(o){var s=u(o),i=s%1;return s==s?i?s-i:s:0}},80218:(o,s,i)=>{var u=i(13222);o.exports=function toLower(o){return u(o).toLowerCase()}},99374:(o,s,i)=>{var u=i(54128),_=i(23805),w=i(44394),x=/^[-+]0x[0-9a-f]+$/i,C=/^0b[01]+$/i,j=/^0o[0-7]+$/i,L=parseInt;o.exports=function toNumber(o){if("number"==typeof o)return o;if(w(o))return NaN;if(_(o)){var s="function"==typeof o.valueOf?o.valueOf():o;o=_(s)?s+"":s}if("string"!=typeof o)return 0===o?o:+o;o=u(o);var i=C.test(o);return i||j.test(o)?L(o.slice(2),i?2:8):x.test(o)?NaN:+o}},42072:(o,s,i)=>{var u=i(34932),_=i(23007),w=i(56449),x=i(44394),C=i(61802),j=i(77797),L=i(13222);o.exports=function toPath(o){return w(o)?u(o,j):x(o)?[o]:_(C(L(o)))}},69884:(o,s,i)=>{var u=i(21791),_=i(37241);o.exports=function toPlainObject(o){return u(o,_(o))}},13222:(o,s,i)=>{var u=i(77556);o.exports=function toString(o){return null==o?"":u(o)}},55808:(o,s,i)=>{var u=i(12507)("toUpperCase");o.exports=u},66645:(o,s,i)=>{var u=i(1733),_=i(45434),w=i(13222),x=i(22225);o.exports=function words(o,s,i){return o=w(o),void 0===(s=i?void 0:s)?_(o)?x(o):u(o):o.match(s)||[]}},53758:(o,s,i)=>{var u=i(30980),_=i(56017),w=i(94033),x=i(56449),C=i(40346),j=i(80257),L=Object.prototype.hasOwnProperty;function lodash(o){if(C(o)&&!x(o)&&!(o instanceof u)){if(o instanceof _)return o;if(L.call(o,"__wrapped__"))return j(o)}return new _(o)}lodash.prototype=w.prototype,lodash.prototype.constructor=lodash,o.exports=lodash},47248:(o,s,i)=>{var u=i(16547),_=i(51234);o.exports=function zipObject(o,s){return _(o||[],s||[],u)}},43768:(o,s,i)=>{"use strict";var u=i(45981),_=i(85587);s.highlight=highlight,s.highlightAuto=function highlightAuto(o,s){var i,x,C,j,L=s||{},B=L.subset||u.listLanguages(),$=L.prefix,V=B.length,U=-1;null==$&&($=w);if("string"!=typeof o)throw _("Expected `string` for value, got `%s`",o);x={relevance:0,language:null,value:[]},i={relevance:0,language:null,value:[]};for(;++Ux.relevance&&(x=C),C.relevance>i.relevance&&(x=i,i=C));x.language&&(i.secondBest=x);return i},s.registerLanguage=function registerLanguage(o,s){u.registerLanguage(o,s)},s.listLanguages=function listLanguages(){return u.listLanguages()},s.registerAlias=function registerAlias(o,s){var i,_=o;s&&((_={})[o]=s);for(i in _)u.registerAliases(_[i],{languageName:i})},Emitter.prototype.addText=function text(o){var s,i,u=this.stack;if(""===o)return;s=u[u.length-1],(i=s.children[s.children.length-1])&&"text"===i.type?i.value+=o:s.children.push({type:"text",value:o})},Emitter.prototype.addKeyword=function addKeyword(o,s){this.openNode(s),this.addText(o),this.closeNode()},Emitter.prototype.addSublanguage=function addSublanguage(o,s){var i=this.stack,u=i[i.length-1],_=o.rootNode.children,w=s?{type:"element",tagName:"span",properties:{className:[s]},children:_}:_;u.children=u.children.concat(w)},Emitter.prototype.openNode=function open(o){var s=this.stack,i=this.options.classPrefix+o,u=s[s.length-1],_={type:"element",tagName:"span",properties:{className:[i]},children:[]};u.children.push(_),s.push(_)},Emitter.prototype.closeNode=function close(){this.stack.pop()},Emitter.prototype.closeAllNodes=noop,Emitter.prototype.finalize=noop,Emitter.prototype.toHTML=function toHtmlNoop(){return""};var w="hljs-";function highlight(o,s,i){var x,C=u.configure({}),j=(i||{}).prefix;if("string"!=typeof o)throw _("Expected `string` for name, got `%s`",o);if(!u.getLanguage(o))throw _("Unknown language: `%s` is not registered",o);if("string"!=typeof s)throw _("Expected `string` for value, got `%s`",s);if(null==j&&(j=w),u.configure({__emitter:Emitter,classPrefix:j}),x=u.highlight(s,{language:o,ignoreIllegals:!0}),u.configure(C||{}),x.errorRaised)throw x.errorRaised;return{relevance:x.relevance,language:x.language,value:x.emitter.rootNode.children}}function Emitter(o){this.options=o,this.rootNode={children:[]},this.stack=[this.rootNode]}function noop(){}},92340:(o,s,i)=>{const u=i(6048);function coerceElementMatchingCallback(o){return"string"==typeof o?s=>s.element===o:o.constructor&&o.extend?s=>s instanceof o:o}class ArraySlice{constructor(o){this.elements=o||[]}toValue(){return this.elements.map((o=>o.toValue()))}map(o,s){return this.elements.map(o,s)}flatMap(o,s){return this.map(o,s).reduce(((o,s)=>o.concat(s)),[])}compactMap(o,s){const i=[];return this.forEach((u=>{const _=o.bind(s)(u);_&&i.push(_)})),i}filter(o,s){return o=coerceElementMatchingCallback(o),new ArraySlice(this.elements.filter(o,s))}reject(o,s){return o=coerceElementMatchingCallback(o),new ArraySlice(this.elements.filter(u(o),s))}find(o,s){return o=coerceElementMatchingCallback(o),this.elements.find(o,s)}forEach(o,s){this.elements.forEach(o,s)}reduce(o,s){return this.elements.reduce(o,s)}includes(o){return this.elements.some((s=>s.equals(o)))}shift(){return this.elements.shift()}unshift(o){this.elements.unshift(this.refract(o))}push(o){return this.elements.push(this.refract(o)),this}add(o){this.push(o)}get(o){return this.elements[o]}getValue(o){const s=this.elements[o];if(s)return s.toValue()}get length(){return this.elements.length}get isEmpty(){return 0===this.elements.length}get first(){return this.elements[0]}}"undefined"!=typeof Symbol&&(ArraySlice.prototype[Symbol.iterator]=function symbol(){return this.elements[Symbol.iterator]()}),o.exports=ArraySlice},55973:o=>{class KeyValuePair{constructor(o,s){this.key=o,this.value=s}clone(){const o=new KeyValuePair;return this.key&&(o.key=this.key.clone()),this.value&&(o.value=this.value.clone()),o}}o.exports=KeyValuePair},3110:(o,s,i)=>{const u=i(5187),_=i(85015),w=i(98023),x=i(53812),C=i(23805),j=i(85105),L=i(86804);class Namespace{constructor(o){this.elementMap={},this.elementDetection=[],this.Element=L.Element,this.KeyValuePair=L.KeyValuePair,o&&o.noDefault||this.useDefault(),this._attributeElementKeys=[],this._attributeElementArrayKeys=[]}use(o){return o.namespace&&o.namespace({base:this}),o.load&&o.load({base:this}),this}useDefault(){return this.register("null",L.NullElement).register("string",L.StringElement).register("number",L.NumberElement).register("boolean",L.BooleanElement).register("array",L.ArrayElement).register("object",L.ObjectElement).register("member",L.MemberElement).register("ref",L.RefElement).register("link",L.LinkElement),this.detect(u,L.NullElement,!1).detect(_,L.StringElement,!1).detect(w,L.NumberElement,!1).detect(x,L.BooleanElement,!1).detect(Array.isArray,L.ArrayElement,!1).detect(C,L.ObjectElement,!1),this}register(o,s){return this._elements=void 0,this.elementMap[o]=s,this}unregister(o){return this._elements=void 0,delete this.elementMap[o],this}detect(o,s,i){return void 0===i||i?this.elementDetection.unshift([o,s]):this.elementDetection.push([o,s]),this}toElement(o){if(o instanceof this.Element)return o;let s;for(let i=0;i{const s=o[0].toUpperCase()+o.substr(1);this._elements[s]=this.elementMap[o]}))),this._elements}get serialiser(){return new j(this)}}j.prototype.Namespace=Namespace,o.exports=Namespace},10866:(o,s,i)=>{const u=i(6048),_=i(92340);class ObjectSlice extends _{map(o,s){return this.elements.map((i=>o.bind(s)(i.value,i.key,i)))}filter(o,s){return new ObjectSlice(this.elements.filter((i=>o.bind(s)(i.value,i.key,i))))}reject(o,s){return this.filter(u(o.bind(s)))}forEach(o,s){return this.elements.forEach(((i,u)=>{o.bind(s)(i.value,i.key,i,u)}))}keys(){return this.map(((o,s)=>s.toValue()))}values(){return this.map((o=>o.toValue()))}}o.exports=ObjectSlice},86804:(o,s,i)=>{const u=i(10316),_=i(41067),w=i(71167),x=i(40239),C=i(12242),j=i(6233),L=i(87726),B=i(61045),$=i(86303),V=i(14540),U=i(92340),z=i(10866),Y=i(55973);function refract(o){if(o instanceof u)return o;if("string"==typeof o)return new w(o);if("number"==typeof o)return new x(o);if("boolean"==typeof o)return new C(o);if(null===o)return new _;if(Array.isArray(o))return new j(o.map(refract));if("object"==typeof o){return new B(o)}return o}u.prototype.ObjectElement=B,u.prototype.RefElement=V,u.prototype.MemberElement=L,u.prototype.refract=refract,U.prototype.refract=refract,o.exports={Element:u,NullElement:_,StringElement:w,NumberElement:x,BooleanElement:C,ArrayElement:j,MemberElement:L,ObjectElement:B,LinkElement:$,RefElement:V,refract,ArraySlice:U,ObjectSlice:z,KeyValuePair:Y}},86303:(o,s,i)=>{const u=i(10316);o.exports=class LinkElement extends u{constructor(o,s,i){super(o||[],s,i),this.element="link"}get relation(){return this.attributes.get("relation")}set relation(o){this.attributes.set("relation",o)}get href(){return this.attributes.get("href")}set href(o){this.attributes.set("href",o)}}},14540:(o,s,i)=>{const u=i(10316);o.exports=class RefElement extends u{constructor(o,s,i){super(o||[],s,i),this.element="ref",this.path||(this.path="element")}get path(){return this.attributes.get("path")}set path(o){this.attributes.set("path",o)}}},34035:(o,s,i)=>{const u=i(3110),_=i(86804);s.g$=u,s.KeyValuePair=i(55973),s.G6=_.ArraySlice,s.ot=_.ObjectSlice,s.Hg=_.Element,s.Om=_.StringElement,s.kT=_.NumberElement,s.bd=_.BooleanElement,s.Os=_.NullElement,s.wE=_.ArrayElement,s.Sh=_.ObjectElement,s.Pr=_.MemberElement,s.sI=_.RefElement,s.Ft=_.LinkElement,s.e=_.refract,i(85105),i(75147)},6233:(o,s,i)=>{const u=i(6048),_=i(10316),w=i(92340);class ArrayElement extends _{constructor(o,s,i){super(o||[],s,i),this.element="array"}primitive(){return"array"}get(o){return this.content[o]}getValue(o){const s=this.get(o);if(s)return s.toValue()}getIndex(o){return this.content[o]}set(o,s){return this.content[o]=this.refract(s),this}remove(o){const s=this.content.splice(o,1);return s.length?s[0]:null}map(o,s){return this.content.map(o,s)}flatMap(o,s){return this.map(o,s).reduce(((o,s)=>o.concat(s)),[])}compactMap(o,s){const i=[];return this.forEach((u=>{const _=o.bind(s)(u);_&&i.push(_)})),i}filter(o,s){return new w(this.content.filter(o,s))}reject(o,s){return this.filter(u(o),s)}reduce(o,s){let i,u;void 0!==s?(i=0,u=this.refract(s)):(i=1,u="object"===this.primitive()?this.first.value:this.first);for(let s=i;s{o.bind(s)(i,this.refract(u))}))}shift(){return this.content.shift()}unshift(o){this.content.unshift(this.refract(o))}push(o){return this.content.push(this.refract(o)),this}add(o){this.push(o)}findElements(o,s){const i=s||{},u=!!i.recursive,_=void 0===i.results?[]:i.results;return this.forEach(((s,i,w)=>{u&&void 0!==s.findElements&&s.findElements(o,{results:_,recursive:u}),o(s,i,w)&&_.push(s)})),_}find(o){return new w(this.findElements(o,{recursive:!0}))}findByElement(o){return this.find((s=>s.element===o))}findByClass(o){return this.find((s=>s.classes.includes(o)))}getById(o){return this.find((s=>s.id.toValue()===o)).first}includes(o){return this.content.some((s=>s.equals(o)))}contains(o){return this.includes(o)}empty(){return new this.constructor([])}"fantasy-land/empty"(){return this.empty()}concat(o){return new this.constructor(this.content.concat(o.content))}"fantasy-land/concat"(o){return this.concat(o)}"fantasy-land/map"(o){return new this.constructor(this.map(o))}"fantasy-land/chain"(o){return this.map((s=>o(s)),this).reduce(((o,s)=>o.concat(s)),this.empty())}"fantasy-land/filter"(o){return new this.constructor(this.content.filter(o))}"fantasy-land/reduce"(o,s){return this.content.reduce(o,s)}get length(){return this.content.length}get isEmpty(){return 0===this.content.length}get first(){return this.getIndex(0)}get second(){return this.getIndex(1)}get last(){return this.getIndex(this.length-1)}}ArrayElement.empty=function empty(){return new this},ArrayElement["fantasy-land/empty"]=ArrayElement.empty,"undefined"!=typeof Symbol&&(ArrayElement.prototype[Symbol.iterator]=function symbol(){return this.content[Symbol.iterator]()}),o.exports=ArrayElement},12242:(o,s,i)=>{const u=i(10316);o.exports=class BooleanElement extends u{constructor(o,s,i){super(o,s,i),this.element="boolean"}primitive(){return"boolean"}}},10316:(o,s,i)=>{const u=i(2404),_=i(55973),w=i(92340);class Element{constructor(o,s,i){s&&(this.meta=s),i&&(this.attributes=i),this.content=o}freeze(){Object.isFrozen(this)||(this._meta&&(this.meta.parent=this,this.meta.freeze()),this._attributes&&(this.attributes.parent=this,this.attributes.freeze()),this.children.forEach((o=>{o.parent=this,o.freeze()}),this),this.content&&Array.isArray(this.content)&&Object.freeze(this.content),Object.freeze(this))}primitive(){}clone(){const o=new this.constructor;return o.element=this.element,this.meta.length&&(o._meta=this.meta.clone()),this.attributes.length&&(o._attributes=this.attributes.clone()),this.content?this.content.clone?o.content=this.content.clone():Array.isArray(this.content)?o.content=this.content.map((o=>o.clone())):o.content=this.content:o.content=this.content,o}toValue(){return this.content instanceof Element?this.content.toValue():this.content instanceof _?{key:this.content.key.toValue(),value:this.content.value?this.content.value.toValue():void 0}:this.content&&this.content.map?this.content.map((o=>o.toValue()),this):this.content}toRef(o){if(""===this.id.toValue())throw Error("Cannot create reference to an element that does not contain an ID");const s=new this.RefElement(this.id.toValue());return o&&(s.path=o),s}findRecursive(...o){if(arguments.length>1&&!this.isFrozen)throw new Error("Cannot find recursive with multiple element names without first freezing the element. Call `element.freeze()`");const s=o.pop();let i=new w;const append=(o,s)=>(o.push(s),o),checkElement=(o,i)=>{i.element===s&&o.push(i);const u=i.findRecursive(s);return u&&u.reduce(append,o),i.content instanceof _&&(i.content.key&&checkElement(o,i.content.key),i.content.value&&checkElement(o,i.content.value)),o};return this.content&&(this.content.element&&checkElement(i,this.content),Array.isArray(this.content)&&this.content.reduce(checkElement,i)),o.isEmpty||(i=i.filter((s=>{let i=s.parents.map((o=>o.element));for(const s in o){const u=o[s],_=i.indexOf(u);if(-1===_)return!1;i=i.splice(0,_)}return!0}))),i}set(o){return this.content=o,this}equals(o){return u(this.toValue(),o)}getMetaProperty(o,s){if(!this.meta.hasKey(o)){if(this.isFrozen){const o=this.refract(s);return o.freeze(),o}this.meta.set(o,s)}return this.meta.get(o)}setMetaProperty(o,s){this.meta.set(o,s)}get element(){return this._storedElement||"element"}set element(o){this._storedElement=o}get content(){return this._content}set content(o){if(o instanceof Element)this._content=o;else if(o instanceof w)this.content=o.elements;else if("string"==typeof o||"number"==typeof o||"boolean"==typeof o||"null"===o||null==o)this._content=o;else if(o instanceof _)this._content=o;else if(Array.isArray(o))this._content=o.map(this.refract);else{if("object"!=typeof o)throw new Error("Cannot set content to given value");this._content=Object.keys(o).map((s=>new this.MemberElement(s,o[s])))}}get meta(){if(!this._meta){if(this.isFrozen){const o=new this.ObjectElement;return o.freeze(),o}this._meta=new this.ObjectElement}return this._meta}set meta(o){o instanceof this.ObjectElement?this._meta=o:this.meta.set(o||{})}get attributes(){if(!this._attributes){if(this.isFrozen){const o=new this.ObjectElement;return o.freeze(),o}this._attributes=new this.ObjectElement}return this._attributes}set attributes(o){o instanceof this.ObjectElement?this._attributes=o:this.attributes.set(o||{})}get id(){return this.getMetaProperty("id","")}set id(o){this.setMetaProperty("id",o)}get classes(){return this.getMetaProperty("classes",[])}set classes(o){this.setMetaProperty("classes",o)}get title(){return this.getMetaProperty("title","")}set title(o){this.setMetaProperty("title",o)}get description(){return this.getMetaProperty("description","")}set description(o){this.setMetaProperty("description",o)}get links(){return this.getMetaProperty("links",[])}set links(o){this.setMetaProperty("links",o)}get isFrozen(){return Object.isFrozen(this)}get parents(){let{parent:o}=this;const s=new w;for(;o;)s.push(o),o=o.parent;return s}get children(){if(Array.isArray(this.content))return new w(this.content);if(this.content instanceof _){const o=new w([this.content.key]);return this.content.value&&o.push(this.content.value),o}return this.content instanceof Element?new w([this.content]):new w}get recursiveChildren(){const o=new w;return this.children.forEach((s=>{o.push(s),s.recursiveChildren.forEach((s=>{o.push(s)}))})),o}}o.exports=Element},87726:(o,s,i)=>{const u=i(55973),_=i(10316);o.exports=class MemberElement extends _{constructor(o,s,i,_){super(new u,i,_),this.element="member",this.key=o,this.value=s}get key(){return this.content.key}set key(o){this.content.key=this.refract(o)}get value(){return this.content.value}set value(o){this.content.value=this.refract(o)}}},41067:(o,s,i)=>{const u=i(10316);o.exports=class NullElement extends u{constructor(o,s,i){super(o||null,s,i),this.element="null"}primitive(){return"null"}set(){return new Error("Cannot set the value of null")}}},40239:(o,s,i)=>{const u=i(10316);o.exports=class NumberElement extends u{constructor(o,s,i){super(o,s,i),this.element="number"}primitive(){return"number"}}},61045:(o,s,i)=>{const u=i(6048),_=i(23805),w=i(6233),x=i(87726),C=i(10866);o.exports=class ObjectElement extends w{constructor(o,s,i){super(o||[],s,i),this.element="object"}primitive(){return"object"}toValue(){return this.content.reduce(((o,s)=>(o[s.key.toValue()]=s.value?s.value.toValue():void 0,o)),{})}get(o){const s=this.getMember(o);if(s)return s.value}getMember(o){if(void 0!==o)return this.content.find((s=>s.key.toValue()===o))}remove(o){let s=null;return this.content=this.content.filter((i=>i.key.toValue()!==o||(s=i,!1))),s}getKey(o){const s=this.getMember(o);if(s)return s.key}set(o,s){if(_(o))return Object.keys(o).forEach((s=>{this.set(s,o[s])})),this;const i=o,u=this.getMember(i);return u?u.value=s:this.content.push(new x(i,s)),this}keys(){return this.content.map((o=>o.key.toValue()))}values(){return this.content.map((o=>o.value.toValue()))}hasKey(o){return this.content.some((s=>s.key.equals(o)))}items(){return this.content.map((o=>[o.key.toValue(),o.value.toValue()]))}map(o,s){return this.content.map((i=>o.bind(s)(i.value,i.key,i)))}compactMap(o,s){const i=[];return this.forEach(((u,_,w)=>{const x=o.bind(s)(u,_,w);x&&i.push(x)})),i}filter(o,s){return new C(this.content).filter(o,s)}reject(o,s){return this.filter(u(o),s)}forEach(o,s){return this.content.forEach((i=>o.bind(s)(i.value,i.key,i)))}}},71167:(o,s,i)=>{const u=i(10316);o.exports=class StringElement extends u{constructor(o,s,i){super(o,s,i),this.element="string"}primitive(){return"string"}get length(){return this.content.length}}},75147:(o,s,i)=>{const u=i(85105);o.exports=class JSON06Serialiser extends u{serialise(o){if(!(o instanceof this.namespace.elements.Element))throw new TypeError(`Given element \`${o}\` is not an Element instance`);let s;o._attributes&&o.attributes.get("variable")&&(s=o.attributes.get("variable"));const i={element:o.element};o._meta&&o._meta.length>0&&(i.meta=this.serialiseObject(o.meta));const u="enum"===o.element||-1!==o.attributes.keys().indexOf("enumerations");if(u){const s=this.enumSerialiseAttributes(o);s&&(i.attributes=s)}else if(o._attributes&&o._attributes.length>0){let{attributes:u}=o;u.get("metadata")&&(u=u.clone(),u.set("meta",u.get("metadata")),u.remove("metadata")),"member"===o.element&&s&&(u=u.clone(),u.remove("variable")),u.length>0&&(i.attributes=this.serialiseObject(u))}if(u)i.content=this.enumSerialiseContent(o,i);else if(this[`${o.element}SerialiseContent`])i.content=this[`${o.element}SerialiseContent`](o,i);else if(void 0!==o.content){let u;s&&o.content.key?(u=o.content.clone(),u.key.attributes.set("variable",s),u=this.serialiseContent(u)):u=this.serialiseContent(o.content),this.shouldSerialiseContent(o,u)&&(i.content=u)}else this.shouldSerialiseContent(o,o.content)&&o instanceof this.namespace.elements.Array&&(i.content=[]);return i}shouldSerialiseContent(o,s){return"parseResult"===o.element||"httpRequest"===o.element||"httpResponse"===o.element||"category"===o.element||"link"===o.element||void 0!==s&&(!Array.isArray(s)||0!==s.length)}refSerialiseContent(o,s){return delete s.attributes,{href:o.toValue(),path:o.path.toValue()}}sourceMapSerialiseContent(o){return o.toValue()}dataStructureSerialiseContent(o){return[this.serialiseContent(o.content)]}enumSerialiseAttributes(o){const s=o.attributes.clone(),i=s.remove("enumerations")||new this.namespace.elements.Array([]),u=s.get("default");let _=s.get("samples")||new this.namespace.elements.Array([]);if(u&&u.content&&(u.content.attributes&&u.content.attributes.remove("typeAttributes"),s.set("default",new this.namespace.elements.Array([u.content]))),_.forEach((o=>{o.content&&o.content.element&&o.content.attributes.remove("typeAttributes")})),o.content&&0!==i.length&&_.unshift(o.content),_=_.map((o=>o instanceof this.namespace.elements.Array?[o]:new this.namespace.elements.Array([o.content]))),_.length&&s.set("samples",_),s.length>0)return this.serialiseObject(s)}enumSerialiseContent(o){if(o._attributes){const s=o.attributes.get("enumerations");if(s&&s.length>0)return s.content.map((o=>{const s=o.clone();return s.attributes.remove("typeAttributes"),this.serialise(s)}))}if(o.content){const s=o.content.clone();return s.attributes.remove("typeAttributes"),[this.serialise(s)]}return[]}deserialise(o){if("string"==typeof o)return new this.namespace.elements.String(o);if("number"==typeof o)return new this.namespace.elements.Number(o);if("boolean"==typeof o)return new this.namespace.elements.Boolean(o);if(null===o)return new this.namespace.elements.Null;if(Array.isArray(o))return new this.namespace.elements.Array(o.map(this.deserialise,this));const s=this.namespace.getElementClass(o.element),i=new s;i.element!==o.element&&(i.element=o.element),o.meta&&this.deserialiseObject(o.meta,i.meta),o.attributes&&this.deserialiseObject(o.attributes,i.attributes);const u=this.deserialiseContent(o.content);if(void 0===u&&null!==i.content||(i.content=u),"enum"===i.element){i.content&&i.attributes.set("enumerations",i.content);let o=i.attributes.get("samples");if(i.attributes.remove("samples"),o){const u=o;o=new this.namespace.elements.Array,u.forEach((u=>{u.forEach((u=>{const _=new s(u);_.element=i.element,o.push(_)}))}));const _=o.shift();i.content=_?_.content:void 0,i.attributes.set("samples",o)}else i.content=void 0;let u=i.attributes.get("default");if(u&&u.length>0){u=u.get(0);const o=new s(u);o.element=i.element,i.attributes.set("default",o)}}else if("dataStructure"===i.element&&Array.isArray(i.content))[i.content]=i.content;else if("category"===i.element){const o=i.attributes.get("meta");o&&(i.attributes.set("metadata",o),i.attributes.remove("meta"))}else"member"===i.element&&i.key&&i.key._attributes&&i.key._attributes.getValue("variable")&&(i.attributes.set("variable",i.key.attributes.get("variable")),i.key.attributes.remove("variable"));return i}serialiseContent(o){if(o instanceof this.namespace.elements.Element)return this.serialise(o);if(o instanceof this.namespace.KeyValuePair){const s={key:this.serialise(o.key)};return o.value&&(s.value=this.serialise(o.value)),s}return o&&o.map?o.map(this.serialise,this):o}deserialiseContent(o){if(o){if(o.element)return this.deserialise(o);if(o.key){const s=new this.namespace.KeyValuePair(this.deserialise(o.key));return o.value&&(s.value=this.deserialise(o.value)),s}if(o.map)return o.map(this.deserialise,this)}return o}shouldRefract(o){return!!(o._attributes&&o.attributes.keys().length||o._meta&&o.meta.keys().length)||"enum"!==o.element&&(o.element!==o.primitive()||"member"===o.element)}convertKeyToRefract(o,s){return this.shouldRefract(s)?this.serialise(s):"enum"===s.element?this.serialiseEnum(s):"array"===s.element?s.map((s=>this.shouldRefract(s)||"default"===o?this.serialise(s):"array"===s.element||"object"===s.element||"enum"===s.element?s.children.map((o=>this.serialise(o))):s.toValue())):"object"===s.element?(s.content||[]).map(this.serialise,this):s.toValue()}serialiseEnum(o){return o.children.map((o=>this.serialise(o)))}serialiseObject(o){const s={};return o.forEach(((o,i)=>{if(o){const u=i.toValue();s[u]=this.convertKeyToRefract(u,o)}})),s}deserialiseObject(o,s){Object.keys(o).forEach((i=>{s.set(i,this.deserialise(o[i]))}))}}},85105:o=>{o.exports=class JSONSerialiser{constructor(o){this.namespace=o||new this.Namespace}serialise(o){if(!(o instanceof this.namespace.elements.Element))throw new TypeError(`Given element \`${o}\` is not an Element instance`);const s={element:o.element};o._meta&&o._meta.length>0&&(s.meta=this.serialiseObject(o.meta)),o._attributes&&o._attributes.length>0&&(s.attributes=this.serialiseObject(o.attributes));const i=this.serialiseContent(o.content);return void 0!==i&&(s.content=i),s}deserialise(o){if(!o.element)throw new Error("Given value is not an object containing an element name");const s=new(this.namespace.getElementClass(o.element));s.element!==o.element&&(s.element=o.element),o.meta&&this.deserialiseObject(o.meta,s.meta),o.attributes&&this.deserialiseObject(o.attributes,s.attributes);const i=this.deserialiseContent(o.content);return void 0===i&&null!==s.content||(s.content=i),s}serialiseContent(o){if(o instanceof this.namespace.elements.Element)return this.serialise(o);if(o instanceof this.namespace.KeyValuePair){const s={key:this.serialise(o.key)};return o.value&&(s.value=this.serialise(o.value)),s}if(o&&o.map){if(0===o.length)return;return o.map(this.serialise,this)}return o}deserialiseContent(o){if(o){if(o.element)return this.deserialise(o);if(o.key){const s=new this.namespace.KeyValuePair(this.deserialise(o.key));return o.value&&(s.value=this.deserialise(o.value)),s}if(o.map)return o.map(this.deserialise,this)}return o}serialiseObject(o){const s={};if(o.forEach(((o,i)=>{o&&(s[i.toValue()]=this.serialise(o))})),0!==Object.keys(s).length)return s}deserialiseObject(o,s){Object.keys(o).forEach((i=>{s.set(i,this.deserialise(o[i]))}))}}},58859:(o,s,i)=>{var u="function"==typeof Map&&Map.prototype,_=Object.getOwnPropertyDescriptor&&u?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,w=u&&_&&"function"==typeof _.get?_.get:null,x=u&&Map.prototype.forEach,C="function"==typeof Set&&Set.prototype,j=Object.getOwnPropertyDescriptor&&C?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,L=C&&j&&"function"==typeof j.get?j.get:null,B=C&&Set.prototype.forEach,$="function"==typeof WeakMap&&WeakMap.prototype?WeakMap.prototype.has:null,V="function"==typeof WeakSet&&WeakSet.prototype?WeakSet.prototype.has:null,U="function"==typeof WeakRef&&WeakRef.prototype?WeakRef.prototype.deref:null,z=Boolean.prototype.valueOf,Y=Object.prototype.toString,Z=Function.prototype.toString,ee=String.prototype.match,ie=String.prototype.slice,ae=String.prototype.replace,ce=String.prototype.toUpperCase,le=String.prototype.toLowerCase,pe=RegExp.prototype.test,de=Array.prototype.concat,fe=Array.prototype.join,ye=Array.prototype.slice,be=Math.floor,_e="function"==typeof BigInt?BigInt.prototype.valueOf:null,we=Object.getOwnPropertySymbols,Se="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol.prototype.toString:null,xe="function"==typeof Symbol&&"object"==typeof Symbol.iterator,Pe="function"==typeof Symbol&&Symbol.toStringTag&&(typeof Symbol.toStringTag===xe||"symbol")?Symbol.toStringTag:null,Te=Object.prototype.propertyIsEnumerable,Re=("function"==typeof Reflect?Reflect.getPrototypeOf:Object.getPrototypeOf)||([].__proto__===Array.prototype?function(o){return o.__proto__}:null);function addNumericSeparator(o,s){if(o===1/0||o===-1/0||o!=o||o&&o>-1e3&&o<1e3||pe.call(/e/,s))return s;var i=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if("number"==typeof o){var u=o<0?-be(-o):be(o);if(u!==o){var _=String(u),w=ie.call(s,_.length+1);return ae.call(_,i,"$&_")+"."+ae.call(ae.call(w,/([0-9]{3})/g,"$&_"),/_$/,"")}}return ae.call(s,i,"$&_")}var qe=i(42634),$e=qe.custom,ze=isSymbol($e)?$e:null;function wrapQuotes(o,s,i){var u="double"===(i.quoteStyle||s)?'"':"'";return u+o+u}function quote(o){return ae.call(String(o),/"/g,""")}function isArray(o){return!("[object Array]"!==toStr(o)||Pe&&"object"==typeof o&&Pe in o)}function isRegExp(o){return!("[object RegExp]"!==toStr(o)||Pe&&"object"==typeof o&&Pe in o)}function isSymbol(o){if(xe)return o&&"object"==typeof o&&o instanceof Symbol;if("symbol"==typeof o)return!0;if(!o||"object"!=typeof o||!Se)return!1;try{return Se.call(o),!0}catch(o){}return!1}o.exports=function inspect_(o,s,u,_){var C=s||{};if(has(C,"quoteStyle")&&"single"!==C.quoteStyle&&"double"!==C.quoteStyle)throw new TypeError('option "quoteStyle" must be "single" or "double"');if(has(C,"maxStringLength")&&("number"==typeof C.maxStringLength?C.maxStringLength<0&&C.maxStringLength!==1/0:null!==C.maxStringLength))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var j=!has(C,"customInspect")||C.customInspect;if("boolean"!=typeof j&&"symbol"!==j)throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if(has(C,"indent")&&null!==C.indent&&"\t"!==C.indent&&!(parseInt(C.indent,10)===C.indent&&C.indent>0))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if(has(C,"numericSeparator")&&"boolean"!=typeof C.numericSeparator)throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var Y=C.numericSeparator;if(void 0===o)return"undefined";if(null===o)return"null";if("boolean"==typeof o)return o?"true":"false";if("string"==typeof o)return inspectString(o,C);if("number"==typeof o){if(0===o)return 1/0/o>0?"0":"-0";var ce=String(o);return Y?addNumericSeparator(o,ce):ce}if("bigint"==typeof o){var pe=String(o)+"n";return Y?addNumericSeparator(o,pe):pe}var be=void 0===C.depth?5:C.depth;if(void 0===u&&(u=0),u>=be&&be>0&&"object"==typeof o)return isArray(o)?"[Array]":"[Object]";var we=function getIndent(o,s){var i;if("\t"===o.indent)i="\t";else{if(!("number"==typeof o.indent&&o.indent>0))return null;i=fe.call(Array(o.indent+1)," ")}return{base:i,prev:fe.call(Array(s+1),i)}}(C,u);if(void 0===_)_=[];else if(indexOf(_,o)>=0)return"[Circular]";function inspect(o,s,i){if(s&&(_=ye.call(_)).push(s),i){var w={depth:C.depth};return has(C,"quoteStyle")&&(w.quoteStyle=C.quoteStyle),inspect_(o,w,u+1,_)}return inspect_(o,C,u+1,_)}if("function"==typeof o&&!isRegExp(o)){var $e=function nameOf(o){if(o.name)return o.name;var s=ee.call(Z.call(o),/^function\s*([\w$]+)/);if(s)return s[1];return null}(o),We=arrObjKeys(o,inspect);return"[Function"+($e?": "+$e:" (anonymous)")+"]"+(We.length>0?" { "+fe.call(We,", ")+" }":"")}if(isSymbol(o)){var He=xe?ae.call(String(o),/^(Symbol\(.*\))_[^)]*$/,"$1"):Se.call(o);return"object"!=typeof o||xe?He:markBoxed(He)}if(function isElement(o){if(!o||"object"!=typeof o)return!1;if("undefined"!=typeof HTMLElement&&o instanceof HTMLElement)return!0;return"string"==typeof o.nodeName&&"function"==typeof o.getAttribute}(o)){for(var Ye="<"+le.call(String(o.nodeName)),Xe=o.attributes||[],Qe=0;Qe"}if(isArray(o)){if(0===o.length)return"[]";var et=arrObjKeys(o,inspect);return we&&!function singleLineValues(o){for(var s=0;s=0)return!1;return!0}(et)?"["+indentedJoin(et,we)+"]":"[ "+fe.call(et,", ")+" ]"}if(function isError(o){return!("[object Error]"!==toStr(o)||Pe&&"object"==typeof o&&Pe in o)}(o)){var tt=arrObjKeys(o,inspect);return"cause"in Error.prototype||!("cause"in o)||Te.call(o,"cause")?0===tt.length?"["+String(o)+"]":"{ ["+String(o)+"] "+fe.call(tt,", ")+" }":"{ ["+String(o)+"] "+fe.call(de.call("[cause]: "+inspect(o.cause),tt),", ")+" }"}if("object"==typeof o&&j){if(ze&&"function"==typeof o[ze]&&qe)return qe(o,{depth:be-u});if("symbol"!==j&&"function"==typeof o.inspect)return o.inspect()}if(function isMap(o){if(!w||!o||"object"!=typeof o)return!1;try{w.call(o);try{L.call(o)}catch(o){return!0}return o instanceof Map}catch(o){}return!1}(o)){var rt=[];return x&&x.call(o,(function(s,i){rt.push(inspect(i,o,!0)+" => "+inspect(s,o))})),collectionOf("Map",w.call(o),rt,we)}if(function isSet(o){if(!L||!o||"object"!=typeof o)return!1;try{L.call(o);try{w.call(o)}catch(o){return!0}return o instanceof Set}catch(o){}return!1}(o)){var nt=[];return B&&B.call(o,(function(s){nt.push(inspect(s,o))})),collectionOf("Set",L.call(o),nt,we)}if(function isWeakMap(o){if(!$||!o||"object"!=typeof o)return!1;try{$.call(o,$);try{V.call(o,V)}catch(o){return!0}return o instanceof WeakMap}catch(o){}return!1}(o))return weakCollectionOf("WeakMap");if(function isWeakSet(o){if(!V||!o||"object"!=typeof o)return!1;try{V.call(o,V);try{$.call(o,$)}catch(o){return!0}return o instanceof WeakSet}catch(o){}return!1}(o))return weakCollectionOf("WeakSet");if(function isWeakRef(o){if(!U||!o||"object"!=typeof o)return!1;try{return U.call(o),!0}catch(o){}return!1}(o))return weakCollectionOf("WeakRef");if(function isNumber(o){return!("[object Number]"!==toStr(o)||Pe&&"object"==typeof o&&Pe in o)}(o))return markBoxed(inspect(Number(o)));if(function isBigInt(o){if(!o||"object"!=typeof o||!_e)return!1;try{return _e.call(o),!0}catch(o){}return!1}(o))return markBoxed(inspect(_e.call(o)));if(function isBoolean(o){return!("[object Boolean]"!==toStr(o)||Pe&&"object"==typeof o&&Pe in o)}(o))return markBoxed(z.call(o));if(function isString(o){return!("[object String]"!==toStr(o)||Pe&&"object"==typeof o&&Pe in o)}(o))return markBoxed(inspect(String(o)));if("undefined"!=typeof window&&o===window)return"{ [object Window] }";if(o===i.g)return"{ [object globalThis] }";if(!function isDate(o){return!("[object Date]"!==toStr(o)||Pe&&"object"==typeof o&&Pe in o)}(o)&&!isRegExp(o)){var ot=arrObjKeys(o,inspect),st=Re?Re(o)===Object.prototype:o instanceof Object||o.constructor===Object,it=o instanceof Object?"":"null prototype",at=!st&&Pe&&Object(o)===o&&Pe in o?ie.call(toStr(o),8,-1):it?"Object":"",ct=(st||"function"!=typeof o.constructor?"":o.constructor.name?o.constructor.name+" ":"")+(at||it?"["+fe.call(de.call([],at||[],it||[]),": ")+"] ":"");return 0===ot.length?ct+"{}":we?ct+"{"+indentedJoin(ot,we)+"}":ct+"{ "+fe.call(ot,", ")+" }"}return String(o)};var We=Object.prototype.hasOwnProperty||function(o){return o in this};function has(o,s){return We.call(o,s)}function toStr(o){return Y.call(o)}function indexOf(o,s){if(o.indexOf)return o.indexOf(s);for(var i=0,u=o.length;is.maxStringLength){var i=o.length-s.maxStringLength,u="... "+i+" more character"+(i>1?"s":"");return inspectString(ie.call(o,0,s.maxStringLength),s)+u}return wrapQuotes(ae.call(ae.call(o,/(['\\])/g,"\\$1"),/[\x00-\x1f]/g,lowbyte),"single",s)}function lowbyte(o){var s=o.charCodeAt(0),i={8:"b",9:"t",10:"n",12:"f",13:"r"}[s];return i?"\\"+i:"\\x"+(s<16?"0":"")+ce.call(s.toString(16))}function markBoxed(o){return"Object("+o+")"}function weakCollectionOf(o){return o+" { ? }"}function collectionOf(o,s,i,u){return o+" ("+s+") {"+(u?indentedJoin(i,u):fe.call(i,", "))+"}"}function indentedJoin(o,s){if(0===o.length)return"";var i="\n"+s.prev+s.base;return i+fe.call(o,","+i)+"\n"+s.prev}function arrObjKeys(o,s){var i=isArray(o),u=[];if(i){u.length=o.length;for(var _=0;_{var s,i,u=o.exports={};function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(o){if(s===setTimeout)return setTimeout(o,0);if((s===defaultSetTimout||!s)&&setTimeout)return s=setTimeout,setTimeout(o,0);try{return s(o,0)}catch(i){try{return s.call(null,o,0)}catch(i){return s.call(this,o,0)}}}!function(){try{s="function"==typeof setTimeout?setTimeout:defaultSetTimout}catch(o){s=defaultSetTimout}try{i="function"==typeof clearTimeout?clearTimeout:defaultClearTimeout}catch(o){i=defaultClearTimeout}}();var _,w=[],x=!1,C=-1;function cleanUpNextTick(){x&&_&&(x=!1,_.length?w=_.concat(w):C=-1,w.length&&drainQueue())}function drainQueue(){if(!x){var o=runTimeout(cleanUpNextTick);x=!0;for(var s=w.length;s;){for(_=w,w=[];++C1)for(var i=1;i{"use strict";var u=i(6925);function emptyFunction(){}function emptyFunctionWithReset(){}emptyFunctionWithReset.resetWarningCache=emptyFunction,o.exports=function(){function shim(o,s,i,_,w,x){if(x!==u){var C=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw C.name="Invariant Violation",C}}function getShim(){return shim}shim.isRequired=shim;var o={array:shim,bigint:shim,bool:shim,func:shim,number:shim,object:shim,string:shim,symbol:shim,any:shim,arrayOf:getShim,element:shim,elementType:shim,instanceOf:getShim,node:shim,objectOf:getShim,oneOf:getShim,oneOfType:getShim,shape:getShim,exact:getShim,checkPropTypes:emptyFunctionWithReset,resetWarningCache:emptyFunction};return o.PropTypes=o,o}},5556:(o,s,i)=>{o.exports=i(2694)()},6925:o=>{"use strict";o.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},74765:o=>{"use strict";var s=String.prototype.replace,i=/%20/g,u="RFC1738",_="RFC3986";o.exports={default:_,formatters:{RFC1738:function(o){return s.call(o,i,"+")},RFC3986:function(o){return String(o)}},RFC1738:u,RFC3986:_}},55373:(o,s,i)=>{"use strict";var u=i(98636),_=i(62642),w=i(74765);o.exports={formats:w,parse:_,stringify:u}},62642:(o,s,i)=>{"use strict";var u=i(37720),_=Object.prototype.hasOwnProperty,w=Array.isArray,x={allowDots:!1,allowPrototypes:!1,allowSparse:!1,arrayLimit:20,charset:"utf-8",charsetSentinel:!1,comma:!1,decoder:u.decode,delimiter:"&",depth:5,ignoreQueryPrefix:!1,interpretNumericEntities:!1,parameterLimit:1e3,parseArrays:!0,plainObjects:!1,strictNullHandling:!1},interpretNumericEntities=function(o){return o.replace(/&#(\d+);/g,(function(o,s){return String.fromCharCode(parseInt(s,10))}))},parseArrayValue=function(o,s){return o&&"string"==typeof o&&s.comma&&o.indexOf(",")>-1?o.split(","):o},C=function parseQueryStringKeys(o,s,i,u){if(o){var w=i.allowDots?o.replace(/\.([^.[]+)/g,"[$1]"):o,x=/(\[[^[\]]*])/g,C=i.depth>0&&/(\[[^[\]]*])/.exec(w),j=C?w.slice(0,C.index):w,L=[];if(j){if(!i.plainObjects&&_.call(Object.prototype,j)&&!i.allowPrototypes)return;L.push(j)}for(var B=0;i.depth>0&&null!==(C=x.exec(w))&&B=0;--w){var x,C=o[w];if("[]"===C&&i.parseArrays)x=[].concat(_);else{x=i.plainObjects?Object.create(null):{};var j="["===C.charAt(0)&&"]"===C.charAt(C.length-1)?C.slice(1,-1):C,L=parseInt(j,10);i.parseArrays||""!==j?!isNaN(L)&&C!==j&&String(L)===j&&L>=0&&i.parseArrays&&L<=i.arrayLimit?(x=[])[L]=_:"__proto__"!==j&&(x[j]=_):x={0:_}}_=x}return _}(L,s,i,u)}};o.exports=function(o,s){var i=function normalizeParseOptions(o){if(!o)return x;if(null!==o.decoder&&void 0!==o.decoder&&"function"!=typeof o.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==o.charset&&"utf-8"!==o.charset&&"iso-8859-1"!==o.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var s=void 0===o.charset?x.charset:o.charset;return{allowDots:void 0===o.allowDots?x.allowDots:!!o.allowDots,allowPrototypes:"boolean"==typeof o.allowPrototypes?o.allowPrototypes:x.allowPrototypes,allowSparse:"boolean"==typeof o.allowSparse?o.allowSparse:x.allowSparse,arrayLimit:"number"==typeof o.arrayLimit?o.arrayLimit:x.arrayLimit,charset:s,charsetSentinel:"boolean"==typeof o.charsetSentinel?o.charsetSentinel:x.charsetSentinel,comma:"boolean"==typeof o.comma?o.comma:x.comma,decoder:"function"==typeof o.decoder?o.decoder:x.decoder,delimiter:"string"==typeof o.delimiter||u.isRegExp(o.delimiter)?o.delimiter:x.delimiter,depth:"number"==typeof o.depth||!1===o.depth?+o.depth:x.depth,ignoreQueryPrefix:!0===o.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof o.interpretNumericEntities?o.interpretNumericEntities:x.interpretNumericEntities,parameterLimit:"number"==typeof o.parameterLimit?o.parameterLimit:x.parameterLimit,parseArrays:!1!==o.parseArrays,plainObjects:"boolean"==typeof o.plainObjects?o.plainObjects:x.plainObjects,strictNullHandling:"boolean"==typeof o.strictNullHandling?o.strictNullHandling:x.strictNullHandling}}(s);if(""===o||null==o)return i.plainObjects?Object.create(null):{};for(var j="string"==typeof o?function parseQueryStringValues(o,s){var i,C={},j=s.ignoreQueryPrefix?o.replace(/^\?/,""):o,L=s.parameterLimit===1/0?void 0:s.parameterLimit,B=j.split(s.delimiter,L),$=-1,V=s.charset;if(s.charsetSentinel)for(i=0;i-1&&(z=w(z)?[z]:z),_.call(C,U)?C[U]=u.combine(C[U],z):C[U]=z}return C}(o,i):o,L=i.plainObjects?Object.create(null):{},B=Object.keys(j),$=0;${"use strict";var u=i(920),_=i(37720),w=i(74765),x=Object.prototype.hasOwnProperty,C={brackets:function brackets(o){return o+"[]"},comma:"comma",indices:function indices(o,s){return o+"["+s+"]"},repeat:function repeat(o){return o}},j=Array.isArray,L=String.prototype.split,B=Array.prototype.push,pushToArray=function(o,s){B.apply(o,j(s)?s:[s])},$=Date.prototype.toISOString,V=w.default,U={addQueryPrefix:!1,allowDots:!1,charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encoder:_.encode,encodeValuesOnly:!1,format:V,formatter:w.formatters[V],indices:!1,serializeDate:function serializeDate(o){return $.call(o)},skipNulls:!1,strictNullHandling:!1},z={},Y=function stringify(o,s,i,w,x,C,B,$,V,Y,Z,ee,ie,ae,ce,le){for(var pe=o,de=le,fe=0,ye=!1;void 0!==(de=de.get(z))&&!ye;){var be=de.get(o);if(fe+=1,void 0!==be){if(be===fe)throw new RangeError("Cyclic object value");ye=!0}void 0===de.get(z)&&(fe=0)}if("function"==typeof $?pe=$(s,pe):pe instanceof Date?pe=Z(pe):"comma"===i&&j(pe)&&(pe=_.maybeMap(pe,(function(o){return o instanceof Date?Z(o):o}))),null===pe){if(x)return B&&!ae?B(s,U.encoder,ce,"key",ee):s;pe=""}if(function isNonNullishPrimitive(o){return"string"==typeof o||"number"==typeof o||"boolean"==typeof o||"symbol"==typeof o||"bigint"==typeof o}(pe)||_.isBuffer(pe)){if(B){var _e=ae?s:B(s,U.encoder,ce,"key",ee);if("comma"===i&&ae){for(var we=L.call(String(pe),","),Se="",xe=0;xe0?pe.join(",")||null:void 0}];else if(j($))Pe=$;else{var Re=Object.keys(pe);Pe=V?Re.sort(V):Re}for(var qe=w&&j(pe)&&1===pe.length?s+"[]":s,$e=0;$e0?ce+ae:""}},37720:(o,s,i)=>{"use strict";var u=i(74765),_=Object.prototype.hasOwnProperty,w=Array.isArray,x=function(){for(var o=[],s=0;s<256;++s)o.push("%"+((s<16?"0":"")+s.toString(16)).toUpperCase());return o}(),C=function arrayToObject(o,s){for(var i=s&&s.plainObjects?Object.create(null):{},u=0;u1;){var s=o.pop(),i=s.obj[s.prop];if(w(i)){for(var u=[],_=0;_=48&&B<=57||B>=65&&B<=90||B>=97&&B<=122||w===u.RFC1738&&(40===B||41===B)?j+=C.charAt(L):B<128?j+=x[B]:B<2048?j+=x[192|B>>6]+x[128|63&B]:B<55296||B>=57344?j+=x[224|B>>12]+x[128|B>>6&63]+x[128|63&B]:(L+=1,B=65536+((1023&B)<<10|1023&C.charCodeAt(L)),j+=x[240|B>>18]+x[128|B>>12&63]+x[128|B>>6&63]+x[128|63&B])}return j},isBuffer:function isBuffer(o){return!(!o||"object"!=typeof o)&&!!(o.constructor&&o.constructor.isBuffer&&o.constructor.isBuffer(o))},isRegExp:function isRegExp(o){return"[object RegExp]"===Object.prototype.toString.call(o)},maybeMap:function maybeMap(o,s){if(w(o)){for(var i=[],u=0;u{"use strict";var i=Object.prototype.hasOwnProperty;function decode(o){try{return decodeURIComponent(o.replace(/\+/g," "))}catch(o){return null}}function encode(o){try{return encodeURIComponent(o)}catch(o){return null}}s.stringify=function querystringify(o,s){s=s||"";var u,_,w=[];for(_ in"string"!=typeof s&&(s="?"),o)if(i.call(o,_)){if((u=o[_])||null!=u&&!isNaN(u)||(u=""),_=encode(_),u=encode(u),null===_||null===u)continue;w.push(_+"="+u)}return w.length?s+w.join("&"):""},s.parse=function querystring(o){for(var s,i=/([^=?#&]+)=?([^&]*)/g,u={};s=i.exec(o);){var _=decode(s[1]),w=decode(s[2]);null===_||null===w||_ in u||(u[_]=w)}return u}},41859:(o,s,i)=>{const u=i(27096),_=i(78004),w=u.types;o.exports=class RandExp{constructor(o,s){if(this._setDefaults(o),o instanceof RegExp)this.ignoreCase=o.ignoreCase,this.multiline=o.multiline,o=o.source;else{if("string"!=typeof o)throw new Error("Expected a regexp or string");this.ignoreCase=s&&-1!==s.indexOf("i"),this.multiline=s&&-1!==s.indexOf("m")}this.tokens=u(o)}_setDefaults(o){this.max=null!=o.max?o.max:null!=RandExp.prototype.max?RandExp.prototype.max:100,this.defaultRange=o.defaultRange?o.defaultRange:this.defaultRange.clone(),o.randInt&&(this.randInt=o.randInt)}gen(){return this._gen(this.tokens,[])}_gen(o,s){var i,u,_,x,C;switch(o.type){case w.ROOT:case w.GROUP:if(o.followedBy||o.notFollowedBy)return"";for(o.remember&&void 0===o.groupNumber&&(o.groupNumber=s.push(null)-1),u="",x=0,C=(i=o.options?this._randSelect(o.options):o.stack).length;x{"use strict";var u=i(65606),_=65536,w=4294967295;var x=i(92861).Buffer,C=i.g.crypto||i.g.msCrypto;C&&C.getRandomValues?o.exports=function randomBytes(o,s){if(o>w)throw new RangeError("requested too many random bytes");var i=x.allocUnsafe(o);if(o>0)if(o>_)for(var j=0;j{"use strict";function _typeof(o){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}Object.defineProperty(s,"__esModule",{value:!0}),s.CopyToClipboard=void 0;var u=_interopRequireDefault(i(96540)),_=_interopRequireDefault(i(17965)),w=["text","onCopy","options","children"];function _interopRequireDefault(o){return o&&o.__esModule?o:{default:o}}function ownKeys(o,s){var i=Object.keys(o);if(Object.getOwnPropertySymbols){var u=Object.getOwnPropertySymbols(o);s&&(u=u.filter((function(s){return Object.getOwnPropertyDescriptor(o,s).enumerable}))),i.push.apply(i,u)}return i}function _objectSpread(o){for(var s=1;s=0||(_[i]=o[i]);return _}(o,s);if(Object.getOwnPropertySymbols){var w=Object.getOwnPropertySymbols(o);for(u=0;u=0||Object.prototype.propertyIsEnumerable.call(o,i)&&(_[i]=o[i])}return _}function _defineProperties(o,s){for(var i=0;i{"use strict";var u=i(25264).CopyToClipboard;u.CopyToClipboard=u,o.exports=u},81214:(o,s,i)=>{"use strict";function _typeof(o){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}Object.defineProperty(s,"__esModule",{value:!0}),s.DebounceInput=void 0;var u=_interopRequireDefault(i(96540)),_=_interopRequireDefault(i(20181)),w=["element","onChange","value","minLength","debounceTimeout","forceNotifyByEnter","forceNotifyOnBlur","onKeyDown","onBlur","inputRef"];function _interopRequireDefault(o){return o&&o.__esModule?o:{default:o}}function _objectWithoutProperties(o,s){if(null==o)return{};var i,u,_=function _objectWithoutPropertiesLoose(o,s){if(null==o)return{};var i,u,_={},w=Object.keys(o);for(u=0;u=0||(_[i]=o[i]);return _}(o,s);if(Object.getOwnPropertySymbols){var w=Object.getOwnPropertySymbols(o);for(u=0;u=0||Object.prototype.propertyIsEnumerable.call(o,i)&&(_[i]=o[i])}return _}function ownKeys(o,s){var i=Object.keys(o);if(Object.getOwnPropertySymbols){var u=Object.getOwnPropertySymbols(o);s&&(u=u.filter((function(s){return Object.getOwnPropertyDescriptor(o,s).enumerable}))),i.push.apply(i,u)}return i}function _objectSpread(o){for(var s=1;s=u?i.notify(o):s.length>_.length&&i.notify(_objectSpread(_objectSpread({},o),{},{target:_objectSpread(_objectSpread({},o.target),{},{value:""})}))}))})),_defineProperty(_assertThisInitialized(i),"onKeyDown",(function(o){"Enter"===o.key&&i.forceNotify(o);var s=i.props.onKeyDown;s&&(o.persist(),s(o))})),_defineProperty(_assertThisInitialized(i),"onBlur",(function(o){i.forceNotify(o);var s=i.props.onBlur;s&&(o.persist(),s(o))})),_defineProperty(_assertThisInitialized(i),"createNotifier",(function(o){if(o<0)i.notify=function(){return null};else if(0===o)i.notify=i.doNotify;else{var s=(0,_.default)((function(o){i.isDebouncing=!1,i.doNotify(o)}),o);i.notify=function(o){i.isDebouncing=!0,s(o)},i.flush=function(){return s.flush()},i.cancel=function(){i.isDebouncing=!1,s.cancel()}}})),_defineProperty(_assertThisInitialized(i),"doNotify",(function(){i.props.onChange.apply(void 0,arguments)})),_defineProperty(_assertThisInitialized(i),"forceNotify",(function(o){var s=i.props.debounceTimeout;if(i.isDebouncing||!(s>0)){i.cancel&&i.cancel();var u=i.state.value,_=i.props.minLength;u.length>=_?i.doNotify(o):i.doNotify(_objectSpread(_objectSpread({},o),{},{target:_objectSpread(_objectSpread({},o.target),{},{value:u})}))}})),i.isDebouncing=!1,i.state={value:void 0===o.value||null===o.value?"":o.value};var u=i.props.debounceTimeout;return i.createNotifier(u),i}return function _createClass(o,s,i){return s&&_defineProperties(o.prototype,s),i&&_defineProperties(o,i),Object.defineProperty(o,"prototype",{writable:!1}),o}(DebounceInput,[{key:"componentDidUpdate",value:function componentDidUpdate(o){if(!this.isDebouncing){var s=this.props,i=s.value,u=s.debounceTimeout,_=o.debounceTimeout,w=o.value,x=this.state.value;void 0!==i&&w!==i&&x!==i&&this.setState({value:i}),u!==_&&this.createNotifier(u)}}},{key:"componentWillUnmount",value:function componentWillUnmount(){this.flush&&this.flush()}},{key:"render",value:function render(){var o,s,i=this.props,_=i.element,x=(i.onChange,i.value,i.minLength,i.debounceTimeout,i.forceNotifyByEnter),C=i.forceNotifyOnBlur,j=i.onKeyDown,L=i.onBlur,B=i.inputRef,$=_objectWithoutProperties(i,w),V=this.state.value;o=x?{onKeyDown:this.onKeyDown}:j?{onKeyDown:j}:{},s=C?{onBlur:this.onBlur}:L?{onBlur:L}:{};var U=B?{ref:B}:{};return u.default.createElement(_,_objectSpread(_objectSpread(_objectSpread(_objectSpread({},$),{},{onChange:this.onChange,value:V},o),s),U))}}]),DebounceInput}(u.default.PureComponent);s.DebounceInput=x,_defineProperty(x,"defaultProps",{element:"input",type:"text",onKeyDown:void 0,onBlur:void 0,value:void 0,minLength:0,debounceTimeout:100,forceNotifyByEnter:!0,forceNotifyOnBlur:!0,inputRef:void 0})},24677:(o,s,i)=>{"use strict";var u=i(81214).DebounceInput;u.DebounceInput=u,o.exports=u},22551:(o,s,i)=>{"use strict";var u=i(96540),_=i(69982);function p(o){for(var s="https://reactjs.org/docs/error-decoder.html?invariant="+o,i=1;i