├── resources └── scripts │ ├── openapi-icon-tool │ ├── .gitignore │ ├── settings.gradle │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ └── config.properties │ │ │ └── java │ │ │ ├── IconTool.java │ │ │ └── Utils.java │ ├── gradle │ │ └── wrapper │ │ │ └── gradle-wrapper.properties │ ├── README.md │ ├── build.gradle │ ├── gradlew.bat │ └── gradlew │ ├── display-annotation-addition-tool │ ├── settings.gradle │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ └── config.properties │ │ │ └── java │ │ │ ├── DisplayAnnotationTool.java │ │ │ └── Utils.java │ ├── gradle │ │ └── wrapper │ │ │ └── gradle-wrapper.properties │ ├── README.md │ ├── build.gradle │ ├── gradlew.bat │ └── gradlew │ └── README.md ├── .github ├── ISSUE_TEMPLATE │ ├── config.yml │ ├── 06_new_task.yml │ ├── 03_improvement.yml │ ├── 05_new_epic.yml │ ├── 02_documentation_issue.yml │ ├── 01_bug_report.yml │ └── 04_new_feature.yml ├── CODEOWNERS └── workflows │ ├── add_connector_label.yml │ └── openapi_connecor_issue_creator.yml ├── .gitignore ├── issue_template.md ├── docs ├── file-templates │ ├── Package.md │ └── Module.md ├── quality-assuarance-guide.md └── module-contribution-guide.md ├── pull_request_template.md ├── LICENSE └── README.md /resources/scripts/openapi-icon-tool/.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .gradle 3 | -------------------------------------------------------------------------------- /resources/scripts/openapi-icon-tool/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'openapi-icon-tool' 2 | 3 | -------------------------------------------------------------------------------- /resources/scripts/display-annotation-addition-tool/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'display-annotation-addition-tool' 2 | 3 | -------------------------------------------------------------------------------- /resources/scripts/display-annotation-addition-tool/src/main/resources/config.properties: -------------------------------------------------------------------------------- 1 | openApiConnectorsPath= -------------------------------------------------------------------------------- /resources/scripts/openapi-icon-tool/src/main/resources/config.properties: -------------------------------------------------------------------------------- 1 | iconsSourcePath= 2 | openApiConnectorsPath= -------------------------------------------------------------------------------- /resources/scripts/openapi-icon-tool/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: true 2 | contact_links: 3 | - name: Issue with Open API to Ballerina Generator Tool 4 | url: https://github.com/ballerina-platform/ballerina-openapi/issues/new/choose 5 | about: Please open issues relating to the API to Ballerina Generator Tool. -------------------------------------------------------------------------------- /resources/scripts/display-annotation-addition-tool/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # Lines starting with '#' are comments. 2 | # Each line is a file pattern followed by one or more owners. 3 | 4 | # See: https://help.github.com/articles/about-codeowners/ 5 | 6 | # These owners will be the default owners for everything in the repo. 7 | * @indikasampath2000 @abeykoon 8 | -------------------------------------------------------------------------------- /resources/scripts/README.md: -------------------------------------------------------------------------------- 1 | This directory contains the tools and scripts used to automate different things 2 | related to connector developement. 3 | 4 | Every tool needs to have Readme.md file containing following. 5 | 6 | 1. What script/tool is about, what is does 7 | 2. How to setup, mention dependecies if any 8 | 3. Commands to run to achieve each usecase 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled class file 2 | *.class 3 | 4 | # Log file 5 | *.log 6 | 7 | # BlueJ files 8 | *.ctxt 9 | 10 | # Mobile Tools for Java (J2ME) 11 | .mtj.tmp/ 12 | 13 | # Package Files # 14 | *.jar 15 | *.war 16 | *.nar 17 | *.ear 18 | *.zip 19 | *.tar.gz 20 | *.rar 21 | 22 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 23 | hs_err_pid* 24 | -------------------------------------------------------------------------------- /resources/scripts/display-annotation-addition-tool/README.md: -------------------------------------------------------------------------------- 1 | # OpenAPI Connectors Display Annotation Addition Tool 2 | 3 | ## Usage of tool 4 | This is tool is to add display tag in openapi specification and annotations for openapi connectors 5 | 6 | ## How to setup 7 | Add values for both the `openApiConnectorsPath` in `config.properties` file. 8 | `openApiConnectorsPath` represents location of generated connectors -------------------------------------------------------------------------------- /resources/scripts/openapi-icon-tool/README.md: -------------------------------------------------------------------------------- 1 | # OpenAPI Connectors Icon Addition Tool 2 | 3 | ## Usage of tool 4 | This is tool is to add connector icons for openapi generated connectors 5 | 6 | ## How to setup 7 | Add values for both the `iconsSourcePath` and `openApiConnectorsPath` in `config.properties` file. 8 | `iconsSourcePath` represents location of icons and `openApiConnectorsPath` represents location of generated connectors -------------------------------------------------------------------------------- /resources/scripts/openapi-icon-tool/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java' 3 | id 'application' 4 | } 5 | 6 | group 'org.example' 7 | version '1.0-SNAPSHOT' 8 | 9 | repositories { 10 | mavenCentral() 11 | } 12 | 13 | dependencies { 14 | implementation group: 'log4j', name: 'log4j', version: '1.2.17' 15 | testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0' 16 | testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0' 17 | } 18 | 19 | test { 20 | useJUnitPlatform() 21 | } -------------------------------------------------------------------------------- /resources/scripts/display-annotation-addition-tool/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java' 3 | } 4 | 5 | group 'org.example' 6 | version '1.0-SNAPSHOT' 7 | 8 | repositories { 9 | mavenCentral() 10 | } 11 | 12 | dependencies { 13 | implementation group: 'log4j', name: 'log4j', version: '1.2.17' 14 | implementation 'com.moandjiezana.toml:toml4j:0.7.2' 15 | testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0' 16 | testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0' 17 | } 18 | 19 | test { 20 | useJUnitPlatform() 21 | } -------------------------------------------------------------------------------- /issue_template.md: -------------------------------------------------------------------------------- 1 | **Description:** 2 | 3 | 4 | **Suggested Labels:** 5 | 6 | 7 | **Suggested Assignees:** 8 | 9 | 10 | **Affected Product Version:** 11 | 12 | **OS, DB, other environment details and versions:** 13 | 14 | **Steps to reproduce:** 15 | 16 | 17 | **Related Issues:** 18 | -------------------------------------------------------------------------------- /.github/workflows/add_connector_label.yml: -------------------------------------------------------------------------------- 1 | on: 2 | issues: 3 | types: [opened] 4 | 5 | jobs: 6 | apply-label: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/github-script@v4 10 | with: 11 | script: | 12 | var body = context.payload.issue.body 13 | var words = body.split(" "); 14 | console.log(words) 15 | for (var i = 0; i < words.length - 1; i++) { 16 | var word = words[i] 17 | if(word.startsWith('Name\n\nmodule/') | word.startsWith('Name\n\nconnectors/') | word.startsWith('Name\n\ntools/')) { 18 | var label = word.substring(6) 19 | console.log(label) 20 | github.issues.addLabels({ 21 | issue_number: context.issue.number, 22 | owner: context.repo.owner, 23 | repo: context.repo.repo, 24 | labels: [label] 25 | }) 26 | break 27 | } 28 | } 29 | 30 | 31 | -------------------------------------------------------------------------------- /docs/file-templates/Package.md: -------------------------------------------------------------------------------- 1 | Connects to from Ballerina 2 | 3 | ## Package overview 4 | 5 | The is a [Ballerina](https://ballerina.io/) connector for . 6 | This package provides ... (briefly describe the functionalities of the connector). 7 | 8 | ### Compatibility 9 | 10 | | | Version | 11 | |--------------------|----------------------| 12 | | Ballerina Language | \ | 13 | | API | \ | 14 | 15 | ## Report issues 16 | To report bugs, request new features, start new discussions, view project boards, etc., go to the [Ballerina Extended Library repository](https://github.com/ballerina-platform/ballerina-extended-library) 17 | 18 | ## Useful links 19 | - Discuss code changes of the Ballerina project in [ballerina-dev@googlegroups.com](mailto:ballerina-dev@googlegroups.com). 20 | - Chat live with us via our [Discord server](https://discord.gg/ballerinalang). 21 | - Post all technical questions on Stack Overflow with the [#ballerina](https://stackoverflow.com/questions/tagged/ballerina) tag 22 | -------------------------------------------------------------------------------- /docs/file-templates/Module.md: -------------------------------------------------------------------------------- 1 | ## Overview 2 | 3 | (Explain what the connector module does) 4 | 5 | This module supports version. 6 | 7 | ## Prerequisites 8 | 9 | Before using this connector in your Ballerina application, complete the following: 10 | 11 | * steps to create an account in 12 | * steps to generate required tokens 13 | 14 | ## Quickstart 15 | 16 | To use the module in your Ballerina application, follow the steps below: 17 | 18 | ### Step 1 - Import connector 19 | 20 | ```ballerina 21 | // Ballerina code snippet to add the import statement. 22 | ``` 23 | 24 | ### Step 2 - Create a new connector instance 25 | 26 | ```ballerina 27 | // Ballerina code snippet to create a new client object from user configurations. 28 | ``` 29 | 30 | ### Step 3 - Invoke connector operation 31 | 32 | ```ballerina 33 | // Ballerina code snippet to invoke one or more connector operations. 34 | ``` 35 | 36 | After completing the above steps you can run your Ballerina program using the following command. 37 | 38 | ```shell script 39 | $ bal run 40 | ``` 41 | 42 | ## Samples 43 | 44 | You can find the list of samples related to the module in [here](link/to/the/samples) 45 | -------------------------------------------------------------------------------- /.github/workflows/openapi_connecor_issue_creator.yml: -------------------------------------------------------------------------------- 1 | # This workflow uses actions that are not certified by GitHub. 2 | # They are provided by a third-party and are governed by 3 | # separate terms of service, privacy policy, and support 4 | # documentation. 5 | 6 | name: Weekly Open API Connector Issue 7 | on: 8 | schedule: 9 | - cron: 30 0 * * 1 10 | 11 | jobs: 12 | create_issue: 13 | name: Create weekly open api issue 14 | runs-on: ubuntu-latest 15 | permissions: 16 | issues: write 17 | steps: 18 | - name: Get current date 19 | id: date 20 | run: echo "::set-output name=date::$(date +'%Y-%m-%d')" 21 | - name: Create weekly open api issue 22 | uses: imjohnbo/issue-bot@3daae12aa54d38685d7ff8459fc8a2aee8cea98b 23 | with: 24 | assignees: "abeykoon" 25 | labels: "Component/Connector,Team/Connector,Type/Improvement,connectors/openapi" 26 | title: "[Improvement]: [Week Start. ${{ steps.date.outputs.date }}] Generate Open API Connectors " 27 | body: | 28 | ### Connector Name 29 | 30 | connectors/openapi (Open API Connector) 31 | 32 | ### Suggested improvement 33 | 34 | Generate following connectors Using [Open API to Ballerina](https://github.com/ballerina-platform/ballerina-openapi) tool. 35 | 36 | - [ ] - [Connector Name](link to the Open API) 37 | 38 | ### Related issues 39 | 40 | N/A 41 | 42 | pinned: true 43 | close-previous: false 44 | env: 45 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 46 | -------------------------------------------------------------------------------- /resources/scripts/openapi-icon-tool/src/main/java/IconTool.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2021 WSO2 Inc. (http://www.wso2.org) All Rights Reserved. 2 | // 3 | // WSO2 Inc. licenses this file to you under the Apache License, 4 | // Version 2.0 (the "License"); you may not use this file except 5 | // in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, 11 | // software distributed under the License is distributed on an 12 | // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 13 | // KIND, either express or implied. See the License for the 14 | // specific language governing permissions and limitations 15 | // under the License. 16 | 17 | import java.io.File; 18 | import java.io.IOException; 19 | import java.util.List; 20 | 21 | public class IconTool { 22 | static String iconsSourcePath; 23 | static String openApiConnectorsPath; 24 | public static void main(String[] args) throws IOException { 25 | iconsSourcePath = Utils.getConfigValue("iconsSourcePath"); 26 | openApiConnectorsPath = Utils.getConfigValue("openApiConnectorsPath"); 27 | List ballerinaPackages = Utils.findBallerinaPackages(openApiConnectorsPath); 28 | for (String packagePath : ballerinaPackages) { 29 | String[] packageNameSplit = packagePath.split("/"); 30 | String moduleName = packageNameSplit[packageNameSplit.length - 1]; 31 | boolean resourcesFolderExist = Utils.isResourcesFolderExist(packagePath); 32 | if (resourcesFolderExist) { 33 | String iconPath = Utils.findConnectorIcon(moduleName, iconsSourcePath); 34 | Utils.addConnectorIcon(packagePath, iconPath, moduleName); 35 | } else { 36 | File folderToCreate = new File(packagePath + "/resources"); 37 | folderToCreate.mkdir(); 38 | String iconPath = Utils.findConnectorIcon(moduleName, iconsSourcePath); 39 | Utils.addConnectorIcon(packagePath, iconPath, moduleName); 40 | } 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /resources/scripts/display-annotation-addition-tool/src/main/java/DisplayAnnotationTool.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2021 WSO2 Inc. (http://www.wso2.org) All Rights Reserved. 2 | // 3 | // WSO2 Inc. licenses this file to you under the Apache License, 4 | // Version 2.0 (the "License"); you may not use this file except 5 | // in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, 11 | // software distributed under the License is distributed on an 12 | // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 13 | // KIND, either express or implied. See the License for the 14 | // specific language governing permissions and limitations 15 | // under the License. 16 | 17 | import java.io.IOException; 18 | import java.util.List; 19 | 20 | public class DisplayAnnotationTool { 21 | public static void main(String[] args) throws IOException { 22 | String openApiPath = Utils.getConfigValue("openApiConnectorsPath"); 23 | List ballerinaPackages = Utils.findBallerinaPackages(openApiPath); 24 | for (String packagePath : ballerinaPackages) { 25 | System.out.println(packagePath); 26 | String[] packageNameSplit = packagePath.split("/"); 27 | String moduleName = packageNameSplit[packageNameSplit.length - 1]; 28 | String[] splitNames = moduleName.split("."); 29 | String connectorName = null; 30 | for (String splitName : splitNames) { 31 | String splitCapitalizedName = splitName.substring(0, 1).toUpperCase(); 32 | connectorName = splitCapitalizedName + " "; 33 | } 34 | boolean isDisplayAnnotationAvailable = Utils.isDisplayAnnotationExist(packagePath); 35 | if (!isDisplayAnnotationAvailable) { 36 | Utils.addDisplayAnnotation(packagePath, moduleName, connectorName); 37 | } 38 | String yamlPath = packagePath + "/openapi.yaml"; 39 | boolean isOpenApiDisplayTagAvailable = Utils.isOpenApiDisplayTagExist(yamlPath); 40 | if (!isOpenApiDisplayTagAvailable) { 41 | Utils.addDisplayTag(yamlPath, moduleName, connectorName); 42 | } 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/06_new_task.yml: -------------------------------------------------------------------------------- 1 | # pls refer https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/configuring-issue-templates-for-your-repository 2 | name: ✍️ New Task 3 | description: Create a new task 4 | title: "[Task]: " 5 | labels: [Type/Task,Team/Connector,Component/Connector] 6 | body: 7 | - type: dropdown 8 | id: Connector-name 9 | attributes: 10 | label: Connector Name 11 | description: Choose the connector your task is related to (choose other if it is not) 12 | options: 13 | - connectors/openapi (Open API Connector) 14 | - connectors/samples (Connector Samples/Templates) 15 | - connectors/cdata (CDATA Connectors) 16 | - module/aws-dynamodb (AWS Dynamo DB) 17 | - module/aws-lambda (AWS Lambda) 18 | - module/aws-s3 (AWS S3) 19 | - module/aws-ses (AWS SES) 20 | - module/aws-simpledb (AWS Simple DB) 21 | - module/aws-sns (AWS SNS) 22 | - module/aws-sqs (AWS SQS) 23 | - module/azure-ad (Azure Active Directory) 24 | - module/azure-eventhub (Azure Event Hub) 25 | - module/azure-servicebus (Azure Servicebus) 26 | - module/azure-storageservice (Azure Blob & Storage Service) 27 | - module/cosmosdb (Cosmos DB) 28 | - module/gcalendar (Google Calendar) 29 | - module/gdrive (Google Drive) 30 | - module/github (Github) 31 | - module/gmail (Gmail) 32 | - module/google-peopleapi (People API) 33 | - module/gsheet (Google Sheet) 34 | - module/microsoft-excel (MS Excel) 35 | - module/microsoft-onedrive (MS OneDrive) 36 | - module/microsoft-onenote (MS OneNote) 37 | - module/microsoft-teams (MS Teams) 38 | - module/mongodb (Mongo DB) 39 | - module/netsuite (Netsuite) 40 | - module/outlook-calendar (Outlook Calendar) 41 | - module/outlook-mail (Outlook Mail) 42 | - module/peoplehr (People HR) 43 | - module/redis (Redis) 44 | - module/salesforce (Salesforce) 45 | - module/slack (Slack) 46 | - module/snowflake (SnowFlake) 47 | - module/twilio (Twilio) 48 | - module/twitter (Twitter) 49 | - module/storage-space (Storage Space Connector) 50 | - other (None Listed Above) 51 | validations: 52 | required: true 53 | - type: textarea 54 | id: task-description 55 | attributes: 56 | label: Task Description 57 | description: Describe the task to be performed 58 | placeholder: A clear and concise description of what needs to be done. Specify a scope if relevent. 59 | validations: 60 | required: true 61 | 62 | -------------------------------------------------------------------------------- /pull_request_template.md: -------------------------------------------------------------------------------- 1 | ## Purpose 2 | > Describe the problems, issues, or needs driving this feature/fix and include links to related issues in the following format: Resolves issue1, issue2, etc. 3 | 4 | ## Goals 5 | > Describe the solutions that this feature/fix will introduce to resolve the problems described above 6 | 7 | ## Approach 8 | > Describe how you are implementing the solutions. Include an animated GIF or screenshot if the change affects the UI (email documentation@wso2.com to review all UI text). Include a link to a Markdown file or Google doc if the feature write-up is too long to paste here. 9 | 10 | ## User stories 11 | > Summary of user stories addressed by this change> 12 | 13 | ## Release note 14 | > Brief description of the new feature or bug fix as it will appear in the release notes 15 | 16 | ## Documentation 17 | > Link(s) to product documentation that addresses the changes of this PR. If no doc impact, enter “N/A” plus brief explanation of why there’s no doc impact 18 | 19 | ## Training 20 | > Link to the PR for changes to the training content in https://github.com/wso2/WSO2-Training, if applicable 21 | 22 | ## Certification 23 | > Type “Sent” when you have provided new/updated certification questions, plus four answers for each question (correct answer highlighted in bold), based on this change. Certification questions/answers should be sent to certification@wso2.com and NOT pasted in this PR. If there is no impact on certification exams, type “N/A” and explain why. 24 | 25 | ## Marketing 26 | > Link to drafts of marketing content that will describe and promote this feature, including product page changes, technical articles, blog posts, videos, etc., if applicable 27 | 28 | ## Automation tests 29 | - Unit tests 30 | > Code coverage information 31 | - Integration tests 32 | > Details about the test cases and coverage 33 | 34 | ## Security checks 35 | - Followed secure coding standards in http://wso2.com/technical-reports/wso2-secure-engineering-guidelines? yes/no 36 | - Ran FindSecurityBugs plugin and verified report? yes/no 37 | - Confirmed that this PR doesn't commit any keys, passwords, tokens, usernames, or other secrets? yes/no 38 | 39 | ## Samples 40 | > Provide high-level details about the samples related to this feature 41 | 42 | ## Related PRs 43 | > List any other related PRs 44 | 45 | ## Migrations (if applicable) 46 | > Describe migration steps and platforms on which migration has been tested 47 | 48 | ## Test environment 49 | > List all JDK versions, operating systems, databases, and browser/versions on which this feature/fix was tested 50 | 51 | ## Learning 52 | > Describe the research phase and any blog posts, patterns, libraries, or add-ons you used to solve the problem. -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/03_improvement.yml: -------------------------------------------------------------------------------- 1 | # pls refer https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/configuring-issue-templates-for-your-repository 2 | name: 🤔 Improvement Request 3 | description: Create an improvement request for an existing feature 4 | title: "[Improvement]: " 5 | labels: [Type/Improvement,Team/Connector,Component/Connector] 6 | body: 7 | - type: dropdown 8 | id: Connector-name 9 | attributes: 10 | label: Connector Name 11 | description: Choose the connector you are suggesting improvement for 12 | options: 13 | - connectors/openapi (Open API Connector) 14 | - connectors/samples (Connector Samples/Templates) 15 | - connectors/cdata (CDATA Connectors) 16 | - module/aws-dynamodb (AWS Dynamo DB) 17 | - module/aws-lambda (AWS Lambda) 18 | - module/aws-s3 (AWS S3) 19 | - module/aws-ses (AWS SES) 20 | - module/aws-simpledb (AWS Simple DB) 21 | - module/aws-sns (AWS SNS) 22 | - module/aws-sqs (AWS SQS) 23 | - module/azure-ad (Azure Active Directory) 24 | - module/azure-eventhub (Azure Event Hub) 25 | - module/azure-servicebus (Azure Servicebus) 26 | - module/azure-storageservice (Azure Blob & Storage Service) 27 | - module/cosmosdb (Cosmos DB) 28 | - module/gcalendar (Google Calendar) 29 | - module/gdrive (Google Drive) 30 | - module/github (Github) 31 | - module/gmail (Gmail) 32 | - module/google-peopleapi (People API) 33 | - module/gsheet (Google Sheet) 34 | - module/microsoft-excel (MS Excel) 35 | - module/microsoft-onedrive (MS OneDrive) 36 | - module/microsoft-onenote (MS OneNote) 37 | - module/microsoft-teams (MS Teams) 38 | - module/mongodb (Mongo DB) 39 | - module/netsuite (Netsuite) 40 | - module/outlook-calendar (Outlook Calendar) 41 | - module/outlook-mail (Outlook Mail) 42 | - module/peoplehr (People HR) 43 | - module/redis (Redis) 44 | - module/salesforce (Salesforce) 45 | - module/slack (Slack) 46 | - module/snowflake (SnowFlake) 47 | - module/twilio (Twilio) 48 | - module/twitter (Twitter) 49 | - module/storage-space (Storage Space Connector) 50 | - other (None Listed Above) 51 | validations: 52 | required: true 53 | - type: textarea 54 | id: improvement-request 55 | attributes: 56 | label: Suggested improvement 57 | validations: 58 | required: true 59 | - type: textarea 60 | id: related-issues 61 | attributes: 62 | label: Related issues 63 | description: Is your feature request related to a problem? Please describe. 64 | placeholder: A clear and concise description of what the problem is. 65 | value: "I am trying to do [...] but [...]" 66 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/05_new_epic.yml: -------------------------------------------------------------------------------- 1 | # pls refer https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/configuring-issue-templates-for-your-repository 2 | name: 🌱 New Epic 3 | description: Create a new epic 4 | title: "[Epic]: " 5 | labels: [Type/Epic,Team/Connector,Component/Connector] 6 | body: 7 | - type: dropdown 8 | id: Connector-name 9 | attributes: 10 | label: Connector Name 11 | description: Choose the connector your epic is related to (choose other if it is not) 12 | options: 13 | - connectors/openapi (Open API Connector) 14 | - connectors/samples (Connector Samples/Templates) 15 | - connectors/cdata (CDATA Connectors) 16 | - module/aws-dynamodb (AWS Dynamo DB) 17 | - module/aws-lambda (AWS Lambda) 18 | - module/aws-s3 (AWS S3) 19 | - module/aws-ses (AWS SES) 20 | - module/aws-simpledb (AWS Simple DB) 21 | - module/aws-sns (AWS SNS) 22 | - module/aws-sqs (AWS SQS) 23 | - module/azure-ad (Azure Active Directory) 24 | - module/azure-eventhub (Azure Event Hub) 25 | - module/azure-servicebus (Azure Servicebus) 26 | - module/azure-storageservice (Azure Blob & Storage Service) 27 | - module/cosmosdb (Cosmos DB) 28 | - module/gcalendar (Google Calendar) 29 | - module/gdrive (Google Drive) 30 | - module/github (Github) 31 | - module/gmail (Gmail) 32 | - module/google-peopleapi (People API) 33 | - module/gsheet (Google Sheet) 34 | - module/microsoft-excel (MS Excel) 35 | - module/microsoft-onedrive (MS OneDrive) 36 | - module/microsoft-onenote (MS OneNote) 37 | - module/microsoft-teams (MS Teams) 38 | - module/mongodb (Mongo DB) 39 | - module/netsuite (Netsuite) 40 | - module/outlook-calendar (Outlook Calendar) 41 | - module/outlook-mail (Outlook Mail) 42 | - module/peoplehr (People HR) 43 | - module/redis (Redis) 44 | - module/salesforce (Salesforce) 45 | - module/slack (Slack) 46 | - module/snowflake (SnowFlake) 47 | - module/twilio (Twilio) 48 | - module/twitter (Twitter) 49 | - module/storage-space (Storage Space Connector) 50 | - other (None Listed Above) 51 | validations: 52 | required: true 53 | - type: textarea 54 | id: epic-description 55 | attributes: 56 | label: Epic description 57 | description: Describe the epic 58 | placeholder: A clear and concise description of what is the epic. 59 | validations: 60 | required: true 61 | - type: textarea 62 | id: tasks 63 | attributes: 64 | label: Related tasks 65 | description: Mention the tasks related to the epic 66 | value: "- [ ] **Task1** 67 | - [ ] **Task2** " 68 | validations: 69 | required: false 70 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/02_documentation_issue.yml: -------------------------------------------------------------------------------- 1 | # pls refer https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/configuring-issue-templates-for-your-repository 2 | name: 📖 Doc Issue/Improvement Report 3 | description: File a documentation issue/improvement 4 | title: "[Docs]: " 5 | labels: [Type/Docs,Team/Connector,Component/Connector] 6 | body: 7 | - type: markdown 8 | attributes: 9 | value: | 10 | Thanks for taking the time to improve our docs! 11 | - type: dropdown 12 | id: Connector-name 13 | attributes: 14 | label: Connector Name 15 | description: Choose the connector you are reporting the documentation issue/improvement against 16 | options: 17 | - connectors/openapi (Open API Connector) 18 | - connectors/samples (Connector Samples/Templates) 19 | - connectors/cdata (CDATA Connectors) 20 | - module/aws-dynamodb (AWS Dynamo DB) 21 | - module/aws-lambda (AWS Lambda) 22 | - module/aws-s3 (AWS S3) 23 | - module/aws-ses (AWS SES) 24 | - module/aws-simpledb (AWS Simple DB) 25 | - module/aws-sns (AWS SNS) 26 | - module/aws-sqs (AWS SQS) 27 | - module/azure-ad (Azure Active Directory) 28 | - module/azure-eventhub (Azure Event Hub) 29 | - module/azure-servicebus (Azure Servicebus) 30 | - module/azure-storageservice (Azure Blob & Storage Service) 31 | - module/cosmosdb (Cosmos DB) 32 | - module/gcalendar (Google Calendar) 33 | - module/gdrive (Google Drive) 34 | - module/github (Github) 35 | - module/gmail (Gmail) 36 | - module/google-peopleapi (People API) 37 | - module/gsheet (Google Sheet) 38 | - module/microsoft-excel (MS Excel) 39 | - module/microsoft-onedrive (MS OneDrive) 40 | - module/microsoft-onenote (MS OneNote) 41 | - module/microsoft-teams (MS Teams) 42 | - module/mongodb (Mongo DB) 43 | - module/netsuite (Netsuite) 44 | - module/outlook-calendar (Outlook Calendar) 45 | - module/outlook-mail (Outlook Mail) 46 | - module/peoplehr (People HR) 47 | - module/redis (Redis) 48 | - module/salesforce (Salesforce) 49 | - module/slack (Slack) 50 | - module/snowflake (SnowFlake) 51 | - module/twilio (Twilio) 52 | - module/twitter (Twitter) 53 | - module/storage-space (Storage Space Connector) 54 | - other (None Listed Above) 55 | validations: 56 | required: true 57 | - type: textarea 58 | id: issue-description 59 | attributes: 60 | label: Documentation Issue/Improvement 61 | placeholder: Tell us what you see! 62 | validations: 63 | required: true 64 | - type: textarea 65 | id: suggestions 66 | attributes: 67 | label: Relevant suggestions 68 | description: If you are suggesting a text as the solution please specify below 69 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/01_bug_report.yml: -------------------------------------------------------------------------------- 1 | # pls refer https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/configuring-issue-templates-for-your-repository 2 | name: 🐞 Bug Report 3 | description: File a bug report 4 | title: "[Bug]: " 5 | labels: [Type/Bug,Team/Connector,Component/Connector] 6 | body: 7 | - type: markdown 8 | attributes: 9 | value: | 10 | Thanks for taking the time to fill out this bug report! 11 | - type: dropdown 12 | id: Connector-name 13 | attributes: 14 | label: Connector Name 15 | description: Choose the connector you are reporting the bug against 16 | options: 17 | - connectors/openapi (Open API Connector) 18 | - connectors/samples (Connector Samples/Templates) 19 | - connectors/cdata (CDATA Connectors) 20 | - module/aws-dynamodb (AWS Dynamo DB) 21 | - module/aws-lambda (AWS Lambda) 22 | - module/aws-s3 (AWS S3) 23 | - module/aws-ses (AWS SES) 24 | - module/aws-simpledb (AWS Simple DB) 25 | - module/aws-sns (AWS SNS) 26 | - module/aws-sqs (AWS SQS) 27 | - module/azure-ad (Azure Active Directory) 28 | - module/azure-eventhub (Azure Event Hub) 29 | - module/azure-servicebus (Azure Servicebus) 30 | - module/azure-storageservice (Azure Blob & Storage Service) 31 | - module/cosmosdb (Cosmos DB) 32 | - module/gcalendar (Google Calendar) 33 | - module/gdrive (Google Drive) 34 | - module/github (Github) 35 | - module/gmail (Gmail) 36 | - module/google-peopleapi (People API) 37 | - module/gsheet (Google Sheet) 38 | - module/microsoft-excel (MS Excel) 39 | - module/microsoft-onedrive (MS OneDrive) 40 | - module/microsoft-onenote (MS OneNote) 41 | - module/microsoft-teams (MS Teams) 42 | - module/mongodb (Mongo DB) 43 | - module/netsuite (Netsuite) 44 | - module/outlook-calendar (Outlook Calendar) 45 | - module/outlook-mail (Outlook Mail) 46 | - module/peoplehr (People HR) 47 | - module/redis (Redis) 48 | - module/salesforce (Salesforce) 49 | - module/slack (Slack) 50 | - module/snowflake (SnowFlake) 51 | - module/twilio (Twilio) 52 | - module/twitter (Twitter) 53 | - module/storage-space (Storage Space Connector) 54 | - other (None Listed Above) 55 | validations: 56 | required: true 57 | - type: textarea 58 | id: what-happened 59 | attributes: 60 | label: What happened? 61 | description: Also tell us, what did you expect to happen? 62 | placeholder: Tell us what you see! 63 | value: "A bug happened!" 64 | validations: 65 | required: true 66 | - type: textarea 67 | id: logs 68 | attributes: 69 | label: Relevant log output 70 | description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. 71 | render: shell 72 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/04_new_feature.yml: -------------------------------------------------------------------------------- 1 | # pls refer https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/configuring-issue-templates-for-your-repository 2 | name: 💡 New Feature Request 3 | description: Create a new feature request 4 | title: "[Feature]: " 5 | labels: [Type/New Feature,Team/Connector,Component/Connector] 6 | body: 7 | - type: dropdown 8 | id: Connector-name 9 | attributes: 10 | label: Connector Name 11 | description: Choose the connector you are suggesting new feature for 12 | options: 13 | - connectors/openapi (Open API Connector) 14 | - connectors/samples (Connector Samples/Templates) 15 | - connectors/cdata (CDATA Connectors) 16 | - module/aws-dynamodb (AWS Dynamo DB) 17 | - module/aws-lambda (AWS Lambda) 18 | - module/aws-s3 (AWS S3) 19 | - module/aws-ses (AWS SES) 20 | - module/aws-simpledb (AWS Simple DB) 21 | - module/aws-sns (AWS SNS) 22 | - module/aws-sqs (AWS SQS) 23 | - module/azure-ad (Azure Active Directory) 24 | - module/azure-eventhub (Azure Event Hub) 25 | - module/azure-servicebus (Azure Servicebus) 26 | - module/azure-storageservice (Azure Blob & Storage Service) 27 | - module/cosmosdb (Cosmos DB) 28 | - module/gcalendar (Google Calendar) 29 | - module/gdrive (Google Drive) 30 | - module/github (Github) 31 | - module/gmail (Gmail) 32 | - module/google-peopleapi (People API) 33 | - module/gsheet (Google Sheet) 34 | - module/microsoft-excel (MS Excel) 35 | - module/microsoft-onedrive (MS OneDrive) 36 | - module/microsoft-onenote (MS OneNote) 37 | - module/microsoft-teams (MS Teams) 38 | - module/mongodb (Mongo DB) 39 | - module/netsuite (Netsuite) 40 | - module/outlook-calendar (Outlook Calendar) 41 | - module/outlook-mail (Outlook Mail) 42 | - module/peoplehr (People HR) 43 | - module/redis (Redis) 44 | - module/salesforce (Salesforce) 45 | - module/slack (Slack) 46 | - module/snowflake (SnowFlake) 47 | - module/twilio (Twilio) 48 | - module/twitter (Twitter) 49 | - module/storage-space (Storage Space Connector) 50 | - other (None Listed Above) 51 | validations: 52 | required: true 53 | - type: textarea 54 | id: feature-request 55 | attributes: 56 | label: Suggested feature 57 | description: Describe the feature you'd like 58 | placeholder: A clear and concise description of what you want to happen. Include any alternative solutions you've considered. 59 | validations: 60 | required: true 61 | - type: textarea 62 | id: related-issues 63 | attributes: 64 | label: Related issues 65 | description: Is your feature request related to a problem? Please describe. 66 | placeholder: A clear and concise description of what the problem is. 67 | value: "I am trying to do [...] but [...]" 68 | -------------------------------------------------------------------------------- /resources/scripts/openapi-icon-tool/gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /resources/scripts/display-annotation-addition-tool/gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /resources/scripts/display-annotation-addition-tool/src/main/java/Utils.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2021 WSO2 Inc. (http://www.wso2.org) All Rights Reserved. 2 | // 3 | // WSO2 Inc. licenses this file to you under the Apache License, 4 | // Version 2.0 (the "License"); you may not use this file except 5 | // in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, 11 | // software distributed under the License is distributed on an 12 | // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 13 | // KIND, either express or implied. See the License for the 14 | // specific language governing permissions and limitations 15 | // under the License. 16 | 17 | import org.apache.log4j.Logger; 18 | import java.io.File; 19 | import java.io.IOException; 20 | import java.nio.file.Files; 21 | import java.io.FileReader; 22 | import java.util.Properties; 23 | import java.nio.file.Path; 24 | import java.nio.file.Paths; 25 | import java.util.ArrayList; 26 | import java.util.List; 27 | import java.util.stream.Collectors; 28 | import java.util.stream.Stream; 29 | 30 | public class Utils { 31 | private static final Logger log = Logger.getLogger(Utils.class); 32 | /** 33 | * This is the method to fetch all available ballerina packages. 34 | * @param repoBasePath This is the base path where ballerina packages available. 35 | * @return List This returns list of absolute paths to the packages available. 36 | */ 37 | public static List findBallerinaPackages(String repoBasePath) { 38 | List fileList = new ArrayList(); 39 | try { 40 | File folder = new File(repoBasePath); 41 | File[] files = folder.listFiles(); 42 | for (File file : files) { 43 | fileList.add(file.getAbsolutePath()); 44 | } 45 | } catch (Exception e) { 46 | log.error(e); 47 | } 48 | return fileList; 49 | } 50 | 51 | /** 52 | * This is the method to check whether display annotation exists. 53 | * @param packagePath This is the path to ballerina package. 54 | */ 55 | public static boolean isDisplayAnnotationExist(String packagePath) throws IOException { 56 | List lines = Files.readAllLines(Path.of(packagePath + "/client.bal")); 57 | for (String line : lines) { 58 | if (line.matches("(.*)@display(.*)label(.*)iconPath(.*)")) { 59 | return true; 60 | } 61 | } 62 | return false; 63 | } 64 | 65 | /** 66 | * This is the method to check whether display tag exists. 67 | * @param yamlPath This is the path to yaml file of ballerina package. 68 | */ 69 | public static boolean isOpenApiDisplayTagExist(String yamlPath) throws IOException { 70 | List lines = Files.readAllLines(Path.of(yamlPath)); 71 | for (String line : lines) { 72 | if (line.matches("(.*)x-display(.*)")) { 73 | return true; 74 | } 75 | if (line.matches("(.*)x-ballerina-display(.*)")) { 76 | return true; 77 | } 78 | } 79 | return false; 80 | } 81 | 82 | /** 83 | * This is the method to add display annotation. 84 | * @param packagePath This is the path to ballerina package. 85 | * @param moduleName This is the module name of ballerina package. 86 | * @param connectorName This is the connector name of ballerina package. 87 | */ 88 | public static void addDisplayAnnotation(String packagePath, String moduleName, String connectorName) throws IOException { 89 | Path path = Paths.get(packagePath + "/client.bal"); 90 | Stream lines = Files.lines(path); 91 | String stringToReplace = "@display {label: \"" + connectorName + "\", iconPath: \"resources/" + moduleName + ".svg\"}\npublic isolated client class Client {"; 92 | List replaced = lines.map(line -> line.replaceAll("public isolated client class Client \\{", stringToReplace)).collect(Collectors.toList()); 93 | Files.write(path, replaced); 94 | lines.close(); 95 | } 96 | 97 | /** 98 | * This is the method to add display tag. 99 | * @param yamlPath This is the path to yaml file of ballerina package. 100 | * @param moduleName This is the module name of ballerina package. 101 | * @param connectorName This is the connector name of ballerina package. 102 | */ 103 | public static void addDisplayTag(String yamlPath, String moduleName, String connectorName) throws IOException { 104 | Path path = Paths.get(yamlPath); 105 | Stream lines = Files.lines(path); 106 | String stringToReplace = "info:\n x-ballerina-display:\n label: " + connectorName + "\n iconPath: \"resources/" + moduleName + ".svg\""; 107 | List replaced = lines.map(line -> line.replaceAll("info:", stringToReplace)).collect(Collectors.toList()); 108 | Files.write(path, replaced); 109 | lines.close(); 110 | } 111 | 112 | /** 113 | * This is the method to get value from config file. 114 | * @param config This is the config file key. 115 | * @return String This returns config file value. 116 | */ 117 | public static String getConfigValue(String config) throws IOException { 118 | String configValue = new String(); 119 | String currentPath = new java.io.File(".").getCanonicalPath(); 120 | currentPath = currentPath + "/src/main/resources/config.properties"; 121 | File configFile = new File(currentPath); 122 | try { 123 | FileReader reader = new FileReader(configFile); 124 | Properties prop = new Properties(); 125 | prop.load(reader); 126 | configValue = prop.getProperty(config); 127 | } catch (IOException e) { 128 | log.error(e); 129 | } 130 | return configValue; 131 | } 132 | } 133 | -------------------------------------------------------------------------------- /resources/scripts/openapi-icon-tool/src/main/java/Utils.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2021 WSO2 Inc. (http://www.wso2.org) All Rights Reserved. 2 | // 3 | // WSO2 Inc. licenses this file to you under the Apache License, 4 | // Version 2.0 (the "License"); you may not use this file except 5 | // in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, 11 | // software distributed under the License is distributed on an 12 | // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 13 | // KIND, either express or implied. See the License for the 14 | // specific language governing permissions and limitations 15 | // under the License. 16 | 17 | import java.io.File; 18 | import java.io.FileReader; 19 | import java.io.IOException; 20 | import java.nio.file.Files; 21 | import java.nio.file.Path; 22 | import java.nio.file.Paths; 23 | import java.nio.file.StandardCopyOption; 24 | import java.util.ArrayList; 25 | import java.util.List; 26 | import java.util.Properties; 27 | import org.apache.log4j.Logger; 28 | 29 | /** 30 | * This class contains functions which are used for identifying ballerina packages 31 | * within a repo, add resources folder for each ballerina packages and add relevant 32 | * icons inside those resources folders. 33 | */ 34 | public class Utils { 35 | private static final Logger log = Logger.getLogger(Utils.class); 36 | /** 37 | * This is the method to fetch all available ballerina packages. 38 | * @param repoBasePath This is the base path where ballerina packages available. 39 | * @return List This returns list of absolute paths to the packages available. 40 | */ 41 | public static List findBallerinaPackages(String repoBasePath) { 42 | List fileList = new ArrayList(); 43 | try { 44 | File folder = new File(repoBasePath); 45 | File[] files = folder.listFiles(); 46 | for (File file : files) { 47 | fileList.add(file.toString()); 48 | } 49 | } catch (Exception e) { 50 | log.error(e); 51 | } 52 | return fileList; 53 | } 54 | 55 | /** 56 | * This is the method to check availability of resources folder. 57 | * @param ballerinaPackagePath This is the base path where ballerina packages available. 58 | * @return boolean This returns whether resource folder available or not. 59 | */ 60 | public static boolean isResourcesFolderExist(String ballerinaPackagePath) { 61 | File folder = new File(ballerinaPackagePath); 62 | File[] files = folder.listFiles(); 63 | if (files != null) { 64 | for (File file : files) { 65 | if (file.getName().equals("resources")) { 66 | return true; 67 | } 68 | } 69 | } 70 | return false; 71 | } 72 | 73 | /** 74 | * This is the method to obtain icon's absolute path. 75 | * @param packageName This is the path to a specific ballerina package. 76 | * @param iconFolderPath This is the base path where all icons available. 77 | * @return String This returns a specific ballerina icon's absolute path if icon available 78 | */ 79 | public static String findConnectorIcon(String packageName, String iconFolderPath) { 80 | File folder = new File(iconFolderPath); 81 | File[] files = folder.listFiles(); 82 | if (files != null) { 83 | for (File file : files) { 84 | if (file.getName().equals(packageName + ".svg")) { 85 | return file.getAbsolutePath(); 86 | } 87 | } 88 | } 89 | return null; 90 | } 91 | 92 | /** 93 | * This is the method to add icons. 94 | * @param ballerinaPackagePath This is the path to a specific ballerina package. 95 | * @param iconPath This is the icon path to copy. 96 | * @param moduleName This is the module name of ballerina package where icon being added. 97 | * @return Nothing. 98 | */ 99 | public static void addReplaceIcon(String ballerinaPackagePath, String iconPath, String moduleName) throws IOException { 100 | String destination = ballerinaPackagePath + "/resources/" + moduleName + ".svg"; 101 | Path sourcePath = Paths.get(iconPath); 102 | Path destinationPath = Paths.get(destination); 103 | Files.copy(sourcePath, destinationPath, StandardCopyOption.REPLACE_EXISTING); 104 | } 105 | 106 | /** 107 | * This is the method to get value from config file. 108 | * @param config This is the config file key. 109 | * @return String This returns config file value. 110 | */ 111 | public static String getConfigValue(String config) throws IOException { 112 | String configValue = new String(); 113 | String currentPath = new java.io.File(".").getCanonicalPath(); 114 | currentPath = currentPath + "/src/main/resources/config.properties"; 115 | File configFile = new File(currentPath); 116 | try { 117 | FileReader reader = new FileReader(configFile); 118 | Properties prop = new Properties(); 119 | prop.load(reader); 120 | configValue = prop.getProperty(config); 121 | } catch (IOException e) { 122 | log.error(e); 123 | } 124 | return configValue; 125 | } 126 | 127 | /** 128 | * This is the method to add icons. 129 | * @param packagePath This is the package path. 130 | * @param iconPath This returns path to icon. 131 | * @param moduleName This returns path to module. 132 | */ 133 | public static void addConnectorIcon(String packagePath, String iconPath, String moduleName) throws IOException { 134 | if (iconPath != null) { 135 | addReplaceIcon(packagePath, iconPath, moduleName); 136 | } else { 137 | log.error("No icon available for " + packagePath); 138 | } 139 | } 140 | } -------------------------------------------------------------------------------- /resources/scripts/openapi-icon-tool/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # 4 | # Copyright 2015 the original author or authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | ## 21 | ## Gradle start up script for UN*X 22 | ## 23 | ############################################################################## 24 | 25 | # Attempt to set APP_HOME 26 | # Resolve links: $0 may be a link 27 | PRG="$0" 28 | # Need this for relative symlinks. 29 | while [ -h "$PRG" ] ; do 30 | ls=`ls -ld "$PRG"` 31 | link=`expr "$ls" : '.*-> \(.*\)$'` 32 | if expr "$link" : '/.*' > /dev/null; then 33 | PRG="$link" 34 | else 35 | PRG=`dirname "$PRG"`"/$link" 36 | fi 37 | done 38 | SAVED="`pwd`" 39 | cd "`dirname \"$PRG\"`/" >/dev/null 40 | APP_HOME="`pwd -P`" 41 | cd "$SAVED" >/dev/null 42 | 43 | APP_NAME="Gradle" 44 | APP_BASE_NAME=`basename "$0"` 45 | 46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 48 | 49 | # Use the maximum available, or set MAX_FD != -1 to use that value. 50 | MAX_FD="maximum" 51 | 52 | warn () { 53 | echo "$*" 54 | } 55 | 56 | die () { 57 | echo 58 | echo "$*" 59 | echo 60 | exit 1 61 | } 62 | 63 | # OS specific support (must be 'true' or 'false'). 64 | cygwin=false 65 | msys=false 66 | darwin=false 67 | nonstop=false 68 | case "`uname`" in 69 | CYGWIN* ) 70 | cygwin=true 71 | ;; 72 | Darwin* ) 73 | darwin=true 74 | ;; 75 | MSYS* | MINGW* ) 76 | msys=true 77 | ;; 78 | NONSTOP* ) 79 | nonstop=true 80 | ;; 81 | esac 82 | 83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 84 | 85 | 86 | # Determine the Java command to use to start the JVM. 87 | if [ -n "$JAVA_HOME" ] ; then 88 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 89 | # IBM's JDK on AIX uses strange locations for the executables 90 | JAVACMD="$JAVA_HOME/jre/sh/java" 91 | else 92 | JAVACMD="$JAVA_HOME/bin/java" 93 | fi 94 | if [ ! -x "$JAVACMD" ] ; then 95 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 96 | 97 | Please set the JAVA_HOME variable in your environment to match the 98 | location of your Java installation." 99 | fi 100 | else 101 | JAVACMD="java" 102 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 103 | 104 | Please set the JAVA_HOME variable in your environment to match the 105 | location of your Java installation." 106 | fi 107 | 108 | # Increase the maximum file descriptors if we can. 109 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 110 | MAX_FD_LIMIT=`ulimit -H -n` 111 | if [ $? -eq 0 ] ; then 112 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 113 | MAX_FD="$MAX_FD_LIMIT" 114 | fi 115 | ulimit -n $MAX_FD 116 | if [ $? -ne 0 ] ; then 117 | warn "Could not set maximum file descriptor limit: $MAX_FD" 118 | fi 119 | else 120 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 121 | fi 122 | fi 123 | 124 | # For Darwin, add options to specify how the application appears in the dock 125 | if $darwin; then 126 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 127 | fi 128 | 129 | # For Cygwin or MSYS, switch paths to Windows format before running java 130 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then 131 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 132 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 133 | 134 | JAVACMD=`cygpath --unix "$JAVACMD"` 135 | 136 | # We build the pattern for arguments to be converted via cygpath 137 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 138 | SEP="" 139 | for dir in $ROOTDIRSRAW ; do 140 | ROOTDIRS="$ROOTDIRS$SEP$dir" 141 | SEP="|" 142 | done 143 | OURCYGPATTERN="(^($ROOTDIRS))" 144 | # Add a user-defined pattern to the cygpath arguments 145 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 146 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 147 | fi 148 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 149 | i=0 150 | for arg in "$@" ; do 151 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 152 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 153 | 154 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 155 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 156 | else 157 | eval `echo args$i`="\"$arg\"" 158 | fi 159 | i=`expr $i + 1` 160 | done 161 | case $i in 162 | 0) set -- ;; 163 | 1) set -- "$args0" ;; 164 | 2) set -- "$args0" "$args1" ;; 165 | 3) set -- "$args0" "$args1" "$args2" ;; 166 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;; 167 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 168 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 169 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 170 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 171 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 172 | esac 173 | fi 174 | 175 | # Escape application args 176 | save () { 177 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 178 | echo " " 179 | } 180 | APP_ARGS=`save "$@"` 181 | 182 | # Collect all arguments for the java command, following the shell quoting and substitution rules 183 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 184 | 185 | exec "$JAVACMD" "$@" 186 | -------------------------------------------------------------------------------- /resources/scripts/display-annotation-addition-tool/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # 4 | # Copyright 2015 the original author or authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | ## 21 | ## Gradle start up script for UN*X 22 | ## 23 | ############################################################################## 24 | 25 | # Attempt to set APP_HOME 26 | # Resolve links: $0 may be a link 27 | PRG="$0" 28 | # Need this for relative symlinks. 29 | while [ -h "$PRG" ] ; do 30 | ls=`ls -ld "$PRG"` 31 | link=`expr "$ls" : '.*-> \(.*\)$'` 32 | if expr "$link" : '/.*' > /dev/null; then 33 | PRG="$link" 34 | else 35 | PRG=`dirname "$PRG"`"/$link" 36 | fi 37 | done 38 | SAVED="`pwd`" 39 | cd "`dirname \"$PRG\"`/" >/dev/null 40 | APP_HOME="`pwd -P`" 41 | cd "$SAVED" >/dev/null 42 | 43 | APP_NAME="Gradle" 44 | APP_BASE_NAME=`basename "$0"` 45 | 46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 48 | 49 | # Use the maximum available, or set MAX_FD != -1 to use that value. 50 | MAX_FD="maximum" 51 | 52 | warn () { 53 | echo "$*" 54 | } 55 | 56 | die () { 57 | echo 58 | echo "$*" 59 | echo 60 | exit 1 61 | } 62 | 63 | # OS specific support (must be 'true' or 'false'). 64 | cygwin=false 65 | msys=false 66 | darwin=false 67 | nonstop=false 68 | case "`uname`" in 69 | CYGWIN* ) 70 | cygwin=true 71 | ;; 72 | Darwin* ) 73 | darwin=true 74 | ;; 75 | MSYS* | MINGW* ) 76 | msys=true 77 | ;; 78 | NONSTOP* ) 79 | nonstop=true 80 | ;; 81 | esac 82 | 83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 84 | 85 | 86 | # Determine the Java command to use to start the JVM. 87 | if [ -n "$JAVA_HOME" ] ; then 88 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 89 | # IBM's JDK on AIX uses strange locations for the executables 90 | JAVACMD="$JAVA_HOME/jre/sh/java" 91 | else 92 | JAVACMD="$JAVA_HOME/bin/java" 93 | fi 94 | if [ ! -x "$JAVACMD" ] ; then 95 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 96 | 97 | Please set the JAVA_HOME variable in your environment to match the 98 | location of your Java installation." 99 | fi 100 | else 101 | JAVACMD="java" 102 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 103 | 104 | Please set the JAVA_HOME variable in your environment to match the 105 | location of your Java installation." 106 | fi 107 | 108 | # Increase the maximum file descriptors if we can. 109 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 110 | MAX_FD_LIMIT=`ulimit -H -n` 111 | if [ $? -eq 0 ] ; then 112 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 113 | MAX_FD="$MAX_FD_LIMIT" 114 | fi 115 | ulimit -n $MAX_FD 116 | if [ $? -ne 0 ] ; then 117 | warn "Could not set maximum file descriptor limit: $MAX_FD" 118 | fi 119 | else 120 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 121 | fi 122 | fi 123 | 124 | # For Darwin, add options to specify how the application appears in the dock 125 | if $darwin; then 126 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 127 | fi 128 | 129 | # For Cygwin or MSYS, switch paths to Windows format before running java 130 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then 131 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 132 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 133 | 134 | JAVACMD=`cygpath --unix "$JAVACMD"` 135 | 136 | # We build the pattern for arguments to be converted via cygpath 137 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 138 | SEP="" 139 | for dir in $ROOTDIRSRAW ; do 140 | ROOTDIRS="$ROOTDIRS$SEP$dir" 141 | SEP="|" 142 | done 143 | OURCYGPATTERN="(^($ROOTDIRS))" 144 | # Add a user-defined pattern to the cygpath arguments 145 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 146 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 147 | fi 148 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 149 | i=0 150 | for arg in "$@" ; do 151 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 152 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 153 | 154 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 155 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 156 | else 157 | eval `echo args$i`="\"$arg\"" 158 | fi 159 | i=`expr $i + 1` 160 | done 161 | case $i in 162 | 0) set -- ;; 163 | 1) set -- "$args0" ;; 164 | 2) set -- "$args0" "$args1" ;; 165 | 3) set -- "$args0" "$args1" "$args2" ;; 166 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;; 167 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 168 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 169 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 170 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 171 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 172 | esac 173 | fi 174 | 175 | # Escape application args 176 | save () { 177 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 178 | echo " " 179 | } 180 | APP_ARGS=`save "$@"` 181 | 182 | # Collect all arguments for the java command, following the shell quoting and substitution rules 183 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 184 | 185 | exec "$JAVACMD" "$@" 186 | -------------------------------------------------------------------------------- /docs/quality-assuarance-guide.md: -------------------------------------------------------------------------------- 1 | # Quality Assurance Guide for Ballerina Extended Library Modules 2 | 3 | - Authors: @NipunaRanasinghe 4 | - Reviewers: @abeykoon @anupama-pathirage 5 | - Created: 2023/05/26 6 | - Updated: 2023/05/29 7 | 8 | ## Introduction 9 | 10 | This document outlines a set of rules and guidelines to be followed during the development, testing, and documentation 11 | stages of the Ballerina extended library development lifecycle. 12 | By adhering to this checklist, Ballerina extended library developers can effectively evaluate and validate the 13 | functionality, compatibility, security, performance, documentation, and code quality aspects of the modules. 14 | 15 | ## Library Structure 16 | 17 | We have enforced a common structure for all Ballerina extended library modules to ensure the consistency and 18 | maintainability of the modules. 19 | 20 | - Refer to the [Repository Structure](module-contribution-guide.md#repository-structure) section of the Ballerina 21 | extended library contribution guide for more information on the recommended structure. 22 | 23 | ## Code Quality 24 | 25 | - The Ballerina coding standards and styles guide should always be followed within the Ballerina package. 26 | - The `Clean Code` Book can be considered as a good reference. 27 | - Also refer 28 | to [Ballerina anti-patterns](https://docs.google.com/document/d/1y6QVqaZzZt9jMpYV4jP5WRS_W_KoC4y40Uuoh1ALu8E/edit?usp=sharing) 29 | documentation. 30 | 31 | - If the extended library module contains a native (i.e. Java) implementation, 32 | - Java coding standards and best practices must be followed. 33 | - Java static analysis tools such as [Checkstyle](https://checkstyle.sourceforge.io/) 34 | and [SpotBugs](https://spotbugs.github.io/) should be configured to ensure code quality. 35 | - Appropriate comments and documentation should be included in the code for maintainability. 36 | - Necessary code reviews and peer reviews should be conducted whenever adding new features or making significant 37 | changes to the existing code. 38 | 39 | ## Functionality 40 | 41 | - All the library APIs in the module should work as expected. 42 | - Edge cases and error scenarios should be appropriately handled within the functions. 43 | - Unit tests should be added to verify the functionality of each API. 44 | - All required features and functionalities should be implemented. 45 | - Better to create a proposal document and get it approved before starting the implementation. 46 | - Any known issues or limitations with the module should be proactively identified and addressed/documented properly. 47 | 48 | ## Compatibility 49 | 50 | - The module should be tested with different versions of Ballerina to ensure compatibility. For handwritten ballerinax 51 | modules, There should be separate branches for each Swan Lake update version so that separate workflows can be 52 | configured for each version to ensure the compatibility. 53 | - The `Package.md` file of the module should include an updated compatibility section with the following information: 54 | - minimum-compatible Ballerina version (e.g., Swan Lake 2201.4.1) 55 | - version of the external library or API that the module is compatible with. (e.g., Azure Service Bus SDK 7.13.1) 56 | - The `Module.md` should contain clear instructions on how to set up compatible prerequisites (e.g., accounts, access 57 | tokens, etc.) for the module to work. 58 | 59 | ## Documentation 60 | 61 | - Each module should have a `Package.md` file with the following information: 62 | - Brief overview of the module. 63 | - Compatibility section that contains the minimum-compatible Ballerina version and the version of the external 64 | library or API that the module is compatible with. 65 | - Community links such as the repository, issue tracker, and discussion channels. 66 | - The recommended template for the Package.md file can be found in [here](file-templates/Package.md) 67 | - Each module should have a `Module.md` file with the following information: 68 | - Brief overview of the module. 69 | - List of prerequisites (e.g., accounts, access tokens, etc.) required to use the module. 70 | - Quick start guide that contains step-by-step instructions (along with code snippets) of a simple use case. 71 | - Link to the `samples`/`examples` directory that contains more real world examples. 72 | - The recommended template for the Module.md file can be found in [here](file-templates/Module.md) 73 | - For handwritten connectors, the spec and the proposals should be added to `docs/spec` and `docs/proposals`directories 74 | respectively. 75 | - Ballerina API documentation should follow the best practices. 76 | Refer to the https://ballerina.io/learn/generate-code-documentation/#write-ballerina-documentation for more details. 77 | - All of the above documentation components should be kept updated along with any impacting changes or additions to the 78 | module. 79 | 80 | ## Testing 81 | 82 | - Unit tests should be written to cover the functionality of the module. 83 | - It is required to have 80% or more code coverage for the extended library modules. 84 | - Test cases for edge cases, error handling, and boundary conditions should be included. 85 | - It is strongly recommended to add new test cases for any bug fixes or enhancements introduced. 86 | 87 | ## Security 88 | 89 | - The module should be reviewed for potential security vulnerabilities (i.e. input validation or injection attacks). 90 | - Best practices for security, such as following secure coding standards and avoiding common pitfalls, should be 91 | followed. 92 | - Each extended library module should ideally have security checks in place to ensure that the module does not contain 93 | any security vulnerabilities coming from its third-party dependencies. This can be done by using a security scanning 94 | tool such as Trivy, which is already integrated into the standard library build process. 95 | 96 | ### Trivy Scan Report 97 | 98 | Following steps can be taken to identify the security vulnerabilities of the third-party dependencies using Trivy. 99 | 100 | - Refer to [installation](https://aquasecurity.github.io/trivy/latest/getting-started/installation/) guide for 101 | installing Trivy based on your operating system. 102 | - Navigate to the module directory and execute the `./gradlew build` command to build the module. 103 | - Now, execute the `trivy fs ballerina/lib` command to start the Trivy scan. If there is any vulnerability there will be 104 | a similar report as below. 105 | ```shell 106 | 2021-09-05T20:01:46.858+0530 INFO Number of language-specific files: 189 107 | 2021-09-05T20:01:46.858+0530 INFO Detecting jar vulnerabilities... 108 | 109 | bcprov-jdk15on-1.61.jar (jar) 110 | =========================================== 111 | Total: 1 (UNKNOWN: 0, LOW: 0, MEDIUM: 1, HIGH: 0, CRITICAL: 0) 112 | 113 | +---------------------------------+------------------+----------+-------------------+---------------+---------------------------------------+ 114 | | LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION | TITLE | 115 | +---------------------------------+------------------+----------+-------------------+---------------+---------------------------------------+ 116 | | org.bouncycastle:bcprov-jdk15on | CVE-2020-15522 | MEDIUM | 1.61 | 1.66 | bouncycastle: Timing issue | 117 | | | | | | | within the EC math library | 118 | | | | | | | -->avd.aquasec.com/nvd/cve-2020-15522 | 119 | +---------------------------------+------------------+----------+-------------------+---------------+---------------------------------------+ 120 | ``` 121 | - Find and update the installed vulnerable dependency for the vulnerability fixed version as in the report or the latest 122 | stable version (recommended). 123 | - The results should be recorded in a GitHub issue in the form of a report. The issue must be tagged with the relevant 124 | milestone. 125 | 126 | Additionally, a security vulnerability can be notified either from internal security tests and scans or 127 | the mailing list. More on that is explained [here](https://ballerina.io/security/). 128 | 129 | ## Tooling Support 130 | 131 | Library developers must verify that the tooling support is available and working as expected for a given library. 132 | Even though there are many tools available, the primary focus should be on the Ballerina VSCode plugin. 133 | 134 | - The following features are expected be tested and verified on each extended library module. 135 | - Syntax highlighting 136 | - Diagnostics 137 | - Code completions 138 | - Code actions 139 | - Formatting 140 | - Hover 141 | 142 | ## Community Feedback 143 | 144 | - All the extended library related issues and discussions should be tracked in the [Ballerina Extended Library 145 | repository](https://github.com/ballerina-platform/ballerina-extended-library) 146 | - Feedback and suggestions received from the community should be considered high-priority and addressed in a timely 147 | manner. 148 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /docs/module-contribution-guide.md: -------------------------------------------------------------------------------- 1 | # Adding a new Ballerina Extended Library Module 2 | - Authors: @NipunaRanasinghe @ThisaruGuruge 3 | - Reviewers: @abeykoon 4 | - Created: 2023/05/11 5 | - Updated: 2023/05/11 6 | 7 | ## Table of Contents 8 | 9 | 1. [Introduction](#introduction) 10 | 2. [Prerequisites](#prerequisites) 11 | 3. [Repository creation](#repository-creation) 12 | * 3.1 [Repository naming Conventions](#repository-naming-conventions) 13 | 4. [Repository initialization](#repository-initialization) 14 | 5. [Repository structure](#repository-structure) 15 | * 5.1 [The `.github/` directory](#the-github-directory-required) 16 | * 5.1.1 [The `workflows/` directory](#the-workflows-directory-required) 17 | * 5.2 [The `ballerina/` directory](#the-ballerina-directory-gradle-submodulerequired) 18 | * 5.2.1 [The `ballerina.toml` file](#the-ballerinatoml-file-required) 19 | * 5.2.2 [The `Package.md` file](#the-packagemd-file-required) 20 | * 5.2.3 [The `Module.md` file](#the-modulemd-file-required) 21 | * 5.2.4 [The other files](#the-other-files-optional) 22 | * 5.3 [The `build-config/` directory](#the-build-config-directory-required) 23 | * 5.4 [The `ballerina-tests/` directory](#the-ballerina-tests-directory-gradle-submoduleoptional) 24 | * 5.5 [The `compiler-plugin/` directory](#the-compiler-plugin-directory-gradle-submoduleoptional) 25 | * 5.6 [The `compiler-plugin-tests/` directory](#the-compiler-plugin-tests-directory-gradle-submoduleoptional) 26 | * 5.7 [The `docs/` directory](#the-docs-directory-optional) 27 | * 5.8 [The `examples/` directory](#the-examples-directory-gradle-submoduleoptional) 28 | * 5.9 [The `native/` directory](#the-native-directory-gradle-submoduleoptional) 29 | * 5.10 [Other Build Files](#other-build-files) 30 | * 5.10.1 [The `LICENSE` file](#the-license-file-required) 31 | * 5.10.2 [The `README.md` file](#the-readmemd-file-required) 32 | * 5.10.3 [The `build.gradle` file](#the-buildgradle-file-required) 33 | * 5.10.4 [The `gradle.properties` file](#the-gradleproperties-file-required) 34 | * 5.10.5 [The `gradlew` and `gradlew.bat` files](#the-gradlew-and-gradlewbat-files-required) 35 | * 5.10.6 [The `settings.gradle` file](#the-settingsgradle-file-required) 36 | * 5.10.7 [The `spotbugs-exclude.xml` file](#the-spotbugs-excludexml-file-optional) 37 | 6. [Ballerina Extended Library Dashboard](#ballerina-extended-library-dashboard) 38 | 39 | ## Introduction 40 | 41 | This guide provides instructions on how to create a new Ballerina Extended Library module repository. 42 | It explains the directory structure and CI/CD configuration files that are required for a Ballerina Extended Library module repository. 43 | 44 | Examples of the directory structure and common files can be found in existing Ballerina Extended Library module 45 | repositories. The links to these repositories are available on the [Ballerina Extended Library Dashboard](https://github.com/ballerina-platform/ballerina-extended-library#status-dashboard). 46 | 47 | The [Ballerina Azure Service Bus Module](https://github.com/ballerina-platform/module-ballerinax-azure-service-bus) would be a reference to follow along with this guide. 48 | 49 | ## Prerequisites 50 | 51 | - Install [Ballerina](https://ballerina.io/downloads) 52 | - Install [Gradle](https://gradle.org/releases/) (7.1 or above is recommended) 53 | - Create a [GitHub access token](https://docs.github.com/en/enterprise-server@3.4/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token) 54 | - Set up the following environment variables in your local environment. 55 | - `packageUser` - Your GitHub username 56 | - `packagePAT` - Your GitHub access token 57 | 58 | ## Repository Creation 59 | 60 | - The new repository should be created under the [Ballerina Platform Organization](https://github.com/ballerina-platform). 61 | - The repository request can be created by filling out the **GitHub Repo Creation Request Form** in WSO2 internal apps. 62 | 63 | ### Repository naming conventions 64 | 65 | The repository name should start with the `module-ballerinax-` prefix and then the module name. 66 | 67 | > Note: If the module is related to a known vendor (e.g. Google, AWS, etc.), it is recommended use the vendor name as a prefix, separated by a full stop. 68 | 69 | Example Names: 70 | 71 | - module-ballerinax-github 72 | - module-ballerinax-aws.s3 73 | - module-ballerinax-googleapis.gmail 74 | 75 | ## Repository Initialization 76 | 77 | 1. Clone the repository and navigate to the repository directory. 78 | 2. Run the following command to configure Gradle in your project. 79 | ```shell 80 | gradle init 81 | ``` 82 | 83 | This will open an interactive Gradle CLI to initialize the repository. Use the *default options* to generate the Gradle scripts. 84 | 85 | Example output of the `gradle init` command: 86 | 87 | ``` 88 | Select type of project to generate: 89 | 1: basic 90 | 2: application 91 | 3: library 92 | 4: Gradle plugin 93 | Enter selection (default: basic) [1..4] # Select Option 1 (Hit Enter) 94 | 95 | Select build script DSL: 96 | 1: Groovy 97 | 2: Kotlin 98 | Enter selection (default: Groovy) [1..2] # Select Option 1 (Hit Enter) 99 | 100 | Project name (default: module-ballerina-sample): # Select the repository name (Hit Enter) 101 | 102 | Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no] # Select no (Hit Enter) 103 | ``` 104 | 105 | 3. Create a new directory named `ballerina` inside the repository. This directory will contain the Ballerina module source code. 106 | 107 | ```shell 108 | mkdir ballerina 109 | ``` 110 | 111 | Move to the `ballerina` directory and initialize it as a Ballerina module. 112 | 113 | ```shell 114 | cd ballerina 115 | bal init 116 | ``` 117 | 118 | Then follow the instructions in the following [Directory Structure](#directory-structure) section to add/update the files. 119 | 120 | ## Repository structure 121 | 122 | Ballerina extended library modules should be structured to be aligned with the following directory structure. 123 | 124 | ```shell 125 | . 126 | ├── .github/ 127 | ├── ballerina/ 128 | ├── ballerina-tests/ 129 | ├── build-config/ 130 | ├── compiler-plugin/ 131 | ├── compiler-plugin-tests/ 132 | ├── docs/ 133 | ├── examples/ 134 | └── native/ 135 | ``` 136 | 137 | ### The `.github` directory [Required] 138 | 139 | This directory contains the GitHub workflow scripts and other configurations required for the module. The following structure should be maintained in this directory. 140 | 141 | ```shell 142 | .github 143 | ├── CODEOWNERS 144 | ├── pull_request_template.md 145 | └── workflows/ 146 | ├── build-timestamped-master.yml 147 | ├── build-with-bal-test-native.yml 148 | ├── central-publish.yml 149 | ├── process-load-test-result.yml 150 | ├── publish-release.yml 151 | ├── pull-request.yml 152 | ├── stale_check.yml 153 | ├── trigger-load-tests.yml 154 | ├── trivy-scan.yml 155 | └── update-spec.yml 156 | ``` 157 | 158 | - `CODEOWNERS`: This file contains the GitHub usernames of the module owners. This is used to notify the module owners on pull requests. 159 | - `pull_request_template.md`: This file contains the template for the pull request description. 160 | 161 | #### The `workflows` directory [Required] 162 | 163 | This directory contains the GitHub workflow scripts. The following workflow scripts are required for a Ballerina module. 164 | 165 | ##### The `central-publish.yml` workflow script [Required] 166 | 167 | This workflow script is used to publish the module to the [Ballerina Central](https://central.ballerina.io/) PROD environment. This workflow can be triggered manually on demand. 168 | 169 | ##### The `central-publish-dev-stage.yml` workflow script [Required] 170 | 171 | This workflow script is used to publish the module to the [Ballerina Central](https://central.ballerina.io/) DEV or STAGE environments. This workflow can be triggered manually on demand. 172 | 173 | ##### The `pull-request.yml` workflow script [Required] 174 | 175 | This workflow script is used to build and run tests on pull requests. It has two main jobs, `Build on Ubuntu`and `Build on Windows`, which are required checks for a pull request. 176 | This workflow script is triggered automatically when a pull request is created or updated. 177 | 178 | > **Note:** The above-mentioned checks (`Build on Ubuntu` and `Build on Windows`) should be marked as `required` in repo settings. 179 | 180 | ### The `ballerina` directory [Gradle Submodule][Required] 181 | 182 | This directory contains the Ballerina module source code including the `Ballerina.toml`, `Module.md`, and `Package.md` files and the tests. 183 | 184 | #### The `Ballerina.toml` file [Required] 185 | 186 | This file contains the Ballerina module metadata. The following is the recommended template for the `Ballerina.toml` file. 187 | 188 | ```toml 189 | [package] 190 | distribution = "" # e.g: "2201.5.0" 191 | org = "ballerinax" # DO NOT CHANGE 192 | name = "" # e.g: "twillio", "aws.s3", "googleapis.gmail" 193 | version = "" # e.g: "1.0.0" 194 | license= [""] # e.g: ["Apache-2.0"] 195 | authors = [""] # e.g: "wso2", "ballerina" 196 | keywords = ["list", "of", "keywords"] # e.g: ["IT Operations/Message Brokers", "Cost/Paid", "Vendor/Microsoft"] 197 | icon = "" # e.g: "icon.png" 198 | repository = "" # e.g: "https://github.com/ballerina-platform/module-ballerinax-azure-service-bus 199 | 200 | [build-options] 201 | observabilityIncluded = true 202 | ``` 203 | 204 | Refer to the [Ballerina Package References](https://ballerina.io/learn/package-references/#the-ballerinatoml-file/) documentation for detailed information on all the available properties. 205 | 206 | #### The `Package.md` file [Required] 207 | 208 | This file contains the Ballerina package documentation, which will be shown in Ballerina central. (e.g. [Google Sheets Central Documentation](https://central.ballerina.io/ballerinax/googleapis.sheets/3.2.0)) 209 | 210 | > The recommended template for the `Package.md` file can be found in [here](file-templates/Package.md) 211 | 212 | #### The `Module.md` file [Required] 213 | 214 | This file contains the Ballerina module documentation, which will be shown in API docs. 215 | (e.g. `Overview` section of the [Google Sheets API Docs](https://lib.ballerina.io/ballerinax/googleapis.sheets/3.2.0)). 216 | 217 | > The recommended template for the `Module.md` file can be found in [here](file-templates/Module.md) 218 | 219 | #### The other files [Optional] 220 | In addition to the above-mentioned files, a Ballerina package can contain other directories and files as required. 221 | Refer to the [Ballerina Package References](https://ballerina.io/learn/package-references/) documentation for more information on other supported files and directories. 222 | 223 | ### The `build-config` directory [Required] 224 | 225 | This directory contains the build configurations for the module. The following structure should be maintained in this directory. 226 | 227 | ```shell 228 | build-config 229 | ├── checkstyle 230 | └── resources 231 | ``` 232 | 233 | #### The `checkstyle` directory [Optional] 234 | 235 | This directory contains the checkstyle configurations for the module. This is required only if a module has Java (native) code. It includes a `build.gradle` file. 236 | 237 | ### The `ballerina-tests` directory [Gradle Submodule][Optional] 238 | 239 | This directory contains the Ballerina tests that cannot be included in the `ballerina` directory (e.g. the tests that are required to be run with the compiler plugin). It also includes a `build.gradle` file, which is used to build and run the `ballerina-tests` submodule. 240 | 241 | ### The `compiler-plugin` directory [Gradle Submodule][Optional] 242 | 243 | This directory contains the compiler plugin source code. It also includes a `build.gradle` file, which is used to build the `compiler-plugin` submodule. 244 | 245 | ### The `compiler-plugin-tests` directory [Gradle Submodule][Optional] 246 | 247 | This directory contains the compiler plugin tests written using [TestNG](https://testng.org/doc/). It also includes a `build.gradle` file, which is used to build and run the compiler-plugin-tests submodule. This is required only if the module has a compiler plugin. 248 | 249 | ### The `docs` directory [Optional] 250 | 251 | This directory contains the module specifications. It may include a `proposals` directory to add the implemented proposals. 252 | 253 | ### The `examples` directory [Gradle Submodule][Optional] 254 | 255 | This directory contains the examples for the module. It includes a `build.gradle` file, which is used to build the `examples` submodule. 256 | 257 | ### The `native` directory [Gradle Submodule][Optional] 258 | 259 | This directory contains the Java native code of the module. This is required only if the module has native code. 260 | It also includes a `build.gradle` file, which is used to build the `native` submodule. 261 | 262 | ### Other build files 263 | 264 | Apart from the above-mentioned directories, there are other files that are required for the build. These files are 265 | required to be added to the root directory of the module. 266 | 267 | Following are the files that are required for the build. 268 | ``` 269 | . 270 | ├── LICENSE 271 | ├── README.md 272 | ├── build.gradle 273 | ├── gradle.properties 274 | ├── gradlew 275 | ├── gradlew.bat 276 | ├── settings.gradle 277 | ├── spotbugs-exclude.xml 278 | ``` 279 | 280 | ### The `LICENSE` file [Required] 281 | 282 | This file contains the license of the module. All the Ballerina Extended Library modules use the `Apache-2` license. 283 | 284 | ### The `README.md` file [Required] 285 | 286 | This file contains the description and the build steps of the module. Usually the content of this file is similar to the `Module.md` and `Package.md` files of the Ballerina module. 287 | 288 | It also includes the status badges for the module including the `Latest Version`, `Build Status`, `Bugs Cound`, and the `Open Pull Requests` badges. 289 | 290 | ### The `build.gradle` file [Required] 291 | 292 | This file contains the build configurations of the module. It includes the configurations for adding other Ballerina module dependencies. 293 | 294 | ### The `gradle.properties` file [Required] 295 | 296 | This file contains the dependency versions of the module. 297 | 298 | ### The `gradlew` and `gradlew.bat` files [Required] 299 | 300 | These files are auto-generated using the `gradle wrapper` command. These files are required to build the module using the Gradle wrapper. 301 | 302 | ### The `settings.gradle` file [Required] 303 | 304 | This file contains the Gradle settings of the module. It includes the Gradle submodules of the module. The above-mentioned directories related to `Gradle Submodule` should be added to this file using the following convention. 305 | 306 | ``` 307 | ballerina -> -ballerina 308 | ballerina-tests -> -ballerina-tests 309 | compiler-plugin -> -compiler-plugin 310 | compiler-plugin-tests -> -compiler-plugin-tests 311 | examples -> -examples 312 | native -> -native 313 | ``` 314 | 315 | This file also includes the Gradle plugins that are used to build the module. 316 | 317 | ### The `spotbugs-exclude.xml` file [Optional] 318 | 319 | This file is used to skip specific spotbugs warnings/errors. This is required only if the module has Java (native) code. 320 | 321 | ## Ballerina Extended Library Dashboard 322 | 323 | Once your Ballerina extended library is implemented and published to the Ballerina Central, you can add it to 324 | the [Ballerina Extended Library Dashboard](https://github.com/ballerina-platform/ballerina-extended-library#status-dashboard). 325 | This dashboard is used to track the build status of all the Ballerina extended libraries. 326 | Edit the [README.md](https://github.com/ballerina-platform/ballerina-extended-library/blob/main/README.md) file of the 327 | Ballerina Extended Library Dashboard and, add your library status badges to the table 328 | under [Connectors](https://github.com/ballerina-platform/ballerina-extended-library/blob/main/README.md#connectors-1) 329 | section. 330 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [DEPRICATED] ballerina-extended-library 2 | 3 | ## The Ballerina Extended Library 4 | 5 | The [Ballerina](https://ballerina.io/) extended library includes useful libraries that are not shipped with core Ballerina 6 | distribution. When building Ballerina applications these extensions are commonly used. 7 | 8 | *Connectors* take a major part of the extended library. They are useful to call external SaaS applications within Ballerina 9 | program you write. The connectors we have cover a wide spectrum of SaaS applications from databases to ERP, CRM, CMS and social media platforms. These libraries enable Ballerina application developers to do various application integrations, trigger notifications and automation of solutions. The connectors are deeply integrated with Ballerina language itself so that output of one connector can be transformed easily in the way your next connector needs. They are "Ballerina Stubs" for various APIs out there. 10 | 11 | All connectors and other libraries are made available on [Ballerina Central](https://central.ballerina.io/). 12 | 13 | ### Repository Organization 14 | 15 | This is the Parent repository of the Ballerina Extended Library and used to report bugs, request new features, start new discussions, view project boards, etc. 16 | 17 | #### Connectors 18 | To enable independent releases of each connector, we have made the following repository arrangement. 19 | 20 | 1. Independently developed connectors. 21 | - each connector code is separated into a child repository. Therefore to go through the code, please refer to the relevant child repository. 22 | 2. Open API generated connectors. 23 | - We have developed a tool to generate Ballerina connector out of a given Open API specification called [ballerina-openapi](https://github.com/ballerina-platform/ballerina-openapi). The connectors generated out of this tool reside at the repository [ballerinax-openapi-connectors](https://github.com/ballerina-platform/ballerinax-openapi-connectors). Please check in the directory `openapi`. 24 | 25 | All above repositories are owned and maintained by the Ballerina Ecosystem Team who is responsible for governing, ensuring security and quality, doing timely releases, maintaining backward compatibility, etc. 26 | 27 | ### Contributing to Ballerina 28 | 29 | As an open source project, Ballerina welcomes contributions from the community. To start contributing, read these [contribution guidelines](https://github.com/ballerina-platform/ballerina-lang/blob/master/CONTRIBUTING.md) for information on how you should go about contributing to our project. 30 | 31 | Check the issue tracker for open issues that interest you. We look forward to receiving your contributions. 32 | 33 | ### Code of Conduct 34 | 35 | All contributors are encouraged to read the [Ballerina Code of Conduct](https://ballerina.io/code-of-conduct). 36 | 37 | ### License 38 | 39 | Ballerina code is distributed under [Apache license 2.0](https://github.com/ballerina-platform/ballerina-lang/blob/master/LICENSE). 40 | 41 | ### Useful links 42 | 43 | * Chat live with us on our [Discord server](https://discord.gg/ballerinalang). 44 | * Technical questions should be posted on Stack Overflow with the [#ballerina](https://stackoverflow.com/questions/tagged/ballerina) tag. 45 | * Ballerina performance test results are available [here](performance/benchmarks/summary.md). 46 | 47 | ### Status Dashboard 48 | 49 | #### Connectors 50 | 51 | |Connector| Latest Version | Build | Security Checks | Bugs | Open Pull Requests | GraalVM Check | Code Coverage | 52 | |:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:| 53 | [GitHub](https://github.com/ballerina-platform/module-ballerinax-github) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-github.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-github/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-github/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-github/actions/workflows/daily-build.yml) | ![Trivy](https://img.shields.io/badge/-N%2FA-green) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fgithub&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fgithub) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-github.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-github/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-github/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-github/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-github/branch/master/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/master) 54 | [Twilio](https://github.com/ballerina-platform/module-ballerinax-twilio) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-twilio.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-twilio/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-twilio/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-twilio/actions/workflows/daily-build.yml) | ![Trivy](https://img.shields.io/badge/-N%2FA-green) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Ftwilio&label=&color=yellow&logo=github)](https://github.com/ballerina-platform/ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Ftwilio) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-twilio.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-twilio/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-twilio/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-twilio/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-twilio/branch/master/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/master) 55 | [GSheet](https://github.com/ballerina-platform/module-ballerinax-googleapis.sheets) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-googleapis.sheets.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-googleapis.sheets/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-googleapis.sheets/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-googleapis.sheets/actions/workflows/daily-build.yml) | ![Trivy](https://img.shields.io/badge/-N%2FA-green) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fgsheet&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fgsheet) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-googleapis.sheets.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-googleapis.sheets/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-googleapis.sheets/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-googleapis.sheets/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-googleapis.sheets/branch/master/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/master) 56 | [Gmail](https://github.com/ballerina-platform/module-ballerinax-googleapis.gmail) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-googleapis.gmail.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-googleapis.gmail/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-googleapis.gmail/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-googleapis.gmail/actions/workflows/daily-build.yml) | ![Trivy](https://img.shields.io/badge/-N%2FA-green) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fgmail&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fgmail) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-googleapis.gmail.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-googleapis.gmail/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-googleapis.gmail/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-googleapis.gmail/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-googleapis.gmail/branch/master/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/master) 57 | [Slack](https://github.com/ballerina-platform/module-ballerinax-slack) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-slack.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-slack/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-slack/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-slack/actions/workflows/daily-build.yml) | ![Trivy](https://img.shields.io/badge/-N%2FA-green) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fslack&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fslack) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-slack.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-slack/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-slack/build-with-bal-test-native.yml?label=)]((https://github.com/ballerina-platform/module-ballerinax-slack/actions/workflows/build-with-bal-test-native.yml)) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-slack/branch/master/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/master) 58 | [Google Calendar](https://github.com/ballerina-platform/module-ballerinax-googleapis.calendar) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-googleapis.calendar.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-googleapis.calendar/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-googleapis.calendar/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-googleapis.calendar/actions/workflows/daily-build.yml) | ![Trivy](https://img.shields.io/badge/-N%2FA-green) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fgcalendar&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fgcalendar) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-googleapis.calendar.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-googleapis.calendar/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-googleapis.calendar/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-googleapis.calendar/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-googleapis.calendar/branch/main/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/main) 59 | [Salesforce](https://github.com/ballerina-platform/module-ballerinax-sfdc) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-sfdc.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-sfdc/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-sfdc/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-sfdc/actions/workflows/daily-build.yml) | [![Trivy](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-sfdc/trivy-scan.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-sfdc/actions/workflows/trivy-scan.yml) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fsalesforce&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fsalesforce) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-sfdc.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-sfdc/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-sfdc/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-sfdc/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-sfdc/branch/master/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/master) 60 | [Netsuite](https://github.com/ballerina-platform/module-ballerinax-netsuite) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-netsuite.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-netsuite/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-netsuite/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-netsuite/actions/workflows/daily-build.yml) | ![Trivy](https://img.shields.io/badge/-N%2FA-green) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fnetsuite&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fnetsuite) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-netsuite.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-netsuite/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-netsuite/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-netsuite/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-netsuite/branch/master/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/master) 61 | [Google Drive](https://github.com/ballerina-platform/module-ballerinax-googleapis.drive) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-googleapis.drive.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-googleapis.drive/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-googleapis.drive/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-googleapis.drive/actions/workflows/daily-build.yml) | ![Trivy](https://img.shields.io/badge/-N%2FA-green) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fgdrive&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fgdrive) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-googleapis.drive.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-googleapis.drive/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-googleapis.drive/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-googleapis.drive/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-googleapis.drive/branch/main/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/main) 62 | [Azure EventHub](https://github.com/ballerina-platform/module-ballerinax-azure.eventhub) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-azure.eventhub.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-azure.eventhub/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-azure.eventhub/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-azure.eventhub/actions/workflows/daily-build.yml) | ![Trivy](https://img.shields.io/badge/-N%2FA-green) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fazure-eventhub&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fazure-eventhub) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-azure.eventhub.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-azure.eventhub/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-azure.eventhub/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-azure.eventhub/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-azure.eventhub/branch/master/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/master) 63 | [CosmosDB](https://github.com/ballerina-platform/module-ballerinax-azure-cosmosdb) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-azure-cosmosdb.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-azure-cosmosdb/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-azure-cosmosdb/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-azure-cosmosdb/actions/workflows/daily-build.yml) | [![Trivy](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-azure-cosmosdb/trivy-scan.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-azure-cosmosdb/actions/workflows/trivy-scan.yml) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fcosmosdb&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fcosmosdb) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-azure-cosmosdb.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-azure-cosmosdb/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-azure-cosmosdb/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-azure.cosmosdb/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-azure-cosmosdb/branch/main/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/main) 64 | [Azure Service Bus](https://github.com/ballerina-platform/module-ballerinax-azure-service-bus) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-azure-service-bus.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-azure-service-bus/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-azure-service-bus/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-azure-service-bus/actions/workflows/daily-build.yml) | [![Trivy](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-azure-service-bus/trivy-scan.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-azure-service-bus/actions/workflows/trivy-scan.yml) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fazure-servicebus&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fazure-servicebus) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-azure-service-bus.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-azure-service-bus/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-azure-service-bus/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-azure-service-bus/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-azure-service-bus/branch/main/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/main) 65 | [Azure Storage Service](https://github.com/ballerina-platform/module-ballerinax-azure-storage-service) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-azure-storage-service.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-azure-storage-service/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-azure-storage-service/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-azure-storage-service/actions/workflows/daily-build.yml) | ![Trivy](https://img.shields.io/badge/-N%2FA-green) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fazure-storageservice&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fazure-storageservice) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-azure-storage-service.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-azure-storage-service/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-azure-storage-service/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-azure-storage-service/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-azure-storage-service/branch/main/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/main) 66 | [MongoDB](https://github.com/ballerina-platform/module-ballerinax-mongodb) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-mongodb.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-mongodb/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-mongodb/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-mongodb/actions/workflows/daily-build.yml) | [![Trivy](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-mongodb/trivy-scan.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-mongodb/actions/workflows/trivy-scan.yml) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fmongodb&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fmongodb) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-mongodb.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-mongodb/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-mongodb/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-mongodb/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-mongodb/branch/master/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/master) 67 | [Redis](https://github.com/ballerina-platform/module-ballerinax-redis) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-redis.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-redis/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-redis/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-redis/actions/workflows/daily-build.yml) | [![Trivy](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-redis/trivy-scan.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-redis/actions/workflows/trivy-scan.yml) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fredis&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fredis) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-redis.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-redis/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-redis/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-redis/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-redis/branch/master/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/master) 68 | [AWS S3](https://github.com/ballerina-platform/module-ballerinax-aws.s3) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-aws.s3.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-aws.s3/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-aws.s3/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-aws.s3/actions/workflows/daily-build.yml) | ![Trivy](https://img.shields.io/badge/-N%2FA-green) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Faws-s3&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Faws-s3) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-aws.s3.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-aws.s3/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-aws.s3/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-aws.s3/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-aws.s3/branch/master/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/master) 69 | [AWS SQS](https://github.com/ballerina-platform/module-ballerinax-aws.sqs) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-aws.sqs.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-aws.sqs/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-aws.sqs/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-aws.sqs/actions/workflows/daily-build.yml) | ![Trivy](https://img.shields.io/badge/-N%2FA-green) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Faws-sqs&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Faws-sqs) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-aws.sqs.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-aws.sqs/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-aws.sqs/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-aws.sqs/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-aws.sqs/branch/master/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/master) 70 | [Google People API](https://github.com/ballerina-platform/module-ballerinax-googleapis.people) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-googleapis.people.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-googleapis.people/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-googleapis.people/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-googleapis.people/actions/workflows/daily-build.yml) | ![Trivy](https://img.shields.io/badge/-N%2FA-green) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fgoogle-peopleapi&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fgoogle-peopleapi) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-googleapis.people.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-googleapis.people/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-googleapis.people/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-googleapis.people/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-googleapis.people/branch/main/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/main) 71 | [MS OneDrive](https://github.com/ballerina-platform/module-ballerinax-microsoft.onedrive) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-microsoft.onedrive.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-microsoft.onedrive/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-microsoft.onedrive/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-microsoft.onedrive/actions/workflows/daily-build.yml) | ![Trivy](https://img.shields.io/badge/-N%2FA-green) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fmicrosoft-onedrive&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fmicrosoft-onedrive) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-microsoft.onedrive.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-microsoft.onedrive/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-microsoft.onedrive/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-microsoft.onedrive/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-microsoft.onedrive/branch/master/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/master) 72 | [MS Excel](https://github.com/ballerina-platform/module-ballerinax-microsoft.sheets) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-microsoft.sheets.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-microsoft.sheets/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-microsoft.sheets/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-microsoft.sheets/actions/workflows/daily-build.yml) | ![Trivy](https://img.shields.io/badge/-N%2FA-green) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fmicrosoft-excel&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fmicrosoft-excel) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-microsoft.sheets.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-microsoft.sheets/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-microsoft.sheets/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-microsoft.sheets/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-microsoft.sheets/branch/master/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/master) 73 | [Twitter](https://github.com/ballerina-platform/module-ballerinax-twitter) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-twitter.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-twitter/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-twitter/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-twitter/actions/workflows/daily-build.yml) | [![Trivy](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-twitter/trivy-scan.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-twitter/actions/workflows/trivy-scan.yml) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Ftwitter&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Ftwitter) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-twitter.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-twitter/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-twitter/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-twitter/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-twitter/branch/main/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/main) 74 | [MS Teams](https://github.com/ballerina-platform/module-ballerinax-microsoft.teams) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-microsoft.teams.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-microsoft.teams/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-microsoft.teams/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-microsoft.teams/actions/workflows/daily-build.yml) | ![Trivy](https://img.shields.io/badge/-N%2FA-green) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fmicrosoft-teams&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fmicrosoft-teams) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-microsoft.teams.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-microsoft.teams/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-microsoft.teams/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-microsoft.teams/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-microsoft.teams/branch/main/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/main) 75 | [Azure AD](https://github.com/ballerina-platform/module-ballerinax-azure.ad) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-azure.ad.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-azure.ad/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-azure.ad/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-azure.ad/actions/workflows/daily-build.yml) | ![Trivy](https://img.shields.io/badge/-N%2FA-green) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fazure-ad&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fazure-ad) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-azure.ad.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-azure.ad/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-azure.ad/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-azure.ad/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-azure.ad/branch/master/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/master) 76 | [Outlook Calendar](https://github.com/ballerina-platform/module-ballerinax-microsoft.outlook.calendar) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-microsoft.outlook.calendar.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-microsoft.outlook.calendar/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-microsoft.outlook.calendar/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-microsoft.outlook.calendar/actions/workflows/daily-build.yml) | ![Trivy](https://img.shields.io/badge/-N%2FA-green) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Foutlook-calendar&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Foutlook-calendar) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-microsoft.outlook.calendar.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-microsoft.outlook.calendar/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-microsoft.outlook.calendar/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-microsoft.outlook.calendar/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-microsoft.outlook.calendar/branch/main/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/main) 77 | [Outlook Mail](https://github.com/ballerina-platform/module-ballerinax-microsoft.outlook.mail) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-microsoft.outlook.mail.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-microsoft.outlook.mail/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-microsoft.outlook.mail/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-microsoft.outlook.mail/actions/workflows/daily-build.yml) | ![Trivy](https://img.shields.io/badge/-N%2FA-green) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Foutlook-mail&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Foutlook-mail) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-microsoft.outlook.mail.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-microsoft.outlook.mail/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-microsoft.outlook.mail/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-microsoft.outlook.mail/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-microsoft.outlook.mail/branch/main/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/main) 78 | [MS OneNote](https://github.com/ballerina-platform/module-ballerinax-microsoft.onenote) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-microsoft.onenote.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-microsoft.onenote/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-microsoft.onenote/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-microsoft.onenote/actions/workflows/daily-build.yml) | ![Trivy](https://img.shields.io/badge/-N%2FA-green) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fmicrosoft-onenote&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fmicrosoft-onenote) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-microsoft.onenote.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-microsoft.onenote/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-microsoft.onenote/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-microsoft.onenote/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-microsoft.onenote/branch/main/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/main) 79 | [SnowFlake](https://github.com/ballerina-platform/module-ballerinax-snowflake) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-snowflake.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-snowflake/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-snowflake/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-snowflake/actions/workflows/daily-build.yml) | [![Trivy](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-snowflake/trivy-scan.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-snowflake/actions/workflows/trivy-scan.yml) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fsnowflake&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fsnowflake) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-snowflake.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-snowflake/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-snowflake/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-snowflake/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-snowflake/branch/main/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/main) 80 | [AWS SES](https://github.com/ballerina-platform/module-ballerinax-aws.ses) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-aws.ses.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-aws.ses/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-aws.ses/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-aws.ses/actions/workflows/daily-build.yml) | ![Trivy](https://img.shields.io/badge/-N%2FA-green) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Faws-ses&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Faws-ses) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-aws.ses.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-aws.ses/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-aws.ses/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-aws.ses/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-aws.ses/branch/master/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/master) 81 | [AWS-SNS](https://github.com/ballerina-platform/module-ballerinax-aws.sns) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-aws.sns.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-aws.sns/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-aws.sns/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-aws.sns/actions/workflows/daily-build.yml) | ![Trivy](https://img.shields.io/badge/-N%2FA-green) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Faws-sns&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Faws-sns) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-aws.sns.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-aws.sns/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-aws.sns/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-aws.sns/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-aws.sns/branch/main/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/main) 82 | [AWS-DynamoDB](https://github.com/ballerina-platform/module-ballerinax-aws.dynamodb) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-aws.dynamodb.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-aws.dynamodb/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-aws.dynamodb/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-aws.dynamodb/actions/workflows/daily-build.yml) | ![Trivy](https://img.shields.io/badge/-N%2FA-green) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fmodule/aws-dynamodb&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fmodule/aws-dynamodb) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-aws.dynamodb.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-aws.dynamodb/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-aws.dynamodb/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-aws.dynamodb/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-aws.dynamodb/branch/main/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/main) 83 | [AWS-SimpleDB](https://github.com/ballerina-platform/module-ballerinax-aws.simpledb) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-aws.simpledb.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-aws.simpledb/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-aws.simpledb/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-aws.simpledb/actions/workflows/daily-build.yml) | ![Trivy](https://img.shields.io/badge/-N%2FA-green) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fmodule/aws-simpledb&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fmodule/aws-simpledb) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-aws.simpledb.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-aws.simpledb/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-aws.simpledb/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-aws.simpledb/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-aws.simpledb/branch/main/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/main) 84 | [PeopleHR](https://github.com/ballerina-platform/module-ballerinax-peoplehr) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-peoplehr.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-peoplehr/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-peoplehr/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-peoplehr/actions/workflows/daily-build.yml) | ![Trivy](https://img.shields.io/badge/-N%2FA-green) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fmodule/peoplehr&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Amodule%2Fmodule/peoplehr) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-peoplehr.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-peoplehr/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-peoplehr/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-peoplehr/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-peoplehr/branch/main/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/main) 85 | [CData Connect](https://github.com/ballerina-platform/module-ballerinax-cdata.connect) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/module-ballerinax-cdata.connect.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-cdata.connect/releases) | [![Build](https://github.com/ballerina-platform/module-ballerinax-cdata.connect/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/module-ballerinax-cdata.connect/actions/workflows/daily-build.yml) | [![Trivy](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-cdata.connect/trivy-scan.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-cdata.connect/actions/workflows/trivy-scan.yml) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Aconnectors%2Fcdata&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Aconnectors%2Fcdata) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/module-ballerinax-cdata.connect.svg?label=)](https://github.com/ballerina-platform/module-ballerinax-cdata.connect/pulls) | [![GraalVM Check](https://img.shields.io/github/actions/workflow/status/ballerina-platform/module-ballerinax-cdata.connect/build-with-bal-test-native.yml?label=)](https://github.com/ballerina-platform/module-ballerinax-cdata.connect/actions/workflows/build-with-bal-test-native.yml) | [![codecov](https://codecov.io/gh/ballerina-platform/module-ballerinax-cdata.connect/branch/main/graph/badge.svg)](https://codecov.io/gh/ballerina-platform/main) 86 | 87 | *N/A (Not Available) - Security checks have not been added for these modules because there are no added external Java dependencies, relying solely on the Ballerina distribution. 88 | 89 | **Generated Connectors** 90 | 91 | |Type| Latest Version | Build | Bugs | Open Pull Requests | 92 | |:---:|:---:|:---:|:---:|:---:| 93 | [Open API Connectors](https://github.com/ballerina-platform/ballerinax-openapi-connectors) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/ballerinax-openapi-connectors.svg?label=)](https://github.com/ballerina-platform/ballerinax-openapi-connectors/releases) | [![Build](https://github.com/ballerina-platform/ballerinax-openapi-connectors/actions/workflows/daily-build.yml/badge.svg)](https://github.com/ballerina-platform/ballerinax-openapi-connectors/actions/workflows/daily-build.yml) | [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Aconnectors%2Fopenapi&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Aconnectors%2Fopenapi) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/ballerinax-openapi-connectors.svg?label=)](https://github.com/ballerina-platform/ballerinax-openapi-connectors/pulls) 94 | 95 | **Connector Generator Tools** 96 | 97 | |Tool Name| Latest Version | Bugs | Open Pull Requests | 98 | |:---:|:---:|:---:|:---:| 99 | [Open API](https://github.com/ballerina-platform/ballerina-openapi) | [![GitHub Release](https://img.shields.io/github/release/ballerina-platform/ballerina-openapi.svg?label=)](https://github.com/ballerina-platform/ballerina-openapi/releases)| [![Bugs](https://img.shields.io/github/issues-search/ballerina-platform/ballerina-extended-library?query=is%3Aopen+label%3AType%2FBug+label%3Atools%2Fopenapi&label=&color=yellow&logo=github)](https://github.com/ballerina-platform//ballerina-extended-library/issues?q=is%3Aopen+label%3AType%2FBug+label%3Atools%2Fopenapi) | [![GitHub pull-requests](https://img.shields.io/github/issues-pr/ballerina-platform/ballerina-openapi.svg?label=)](https://github.com/ballerina-platform/ballerina-openapi/pulls) 100 | --------------------------------------------------------------------------------