• Stars
    star
    144
  • Rank 255,590 (Top 6 %)
  • Language Ballerina
  • License
    Apache License 2.0
  • Created about 4 years ago
  • Updated 8 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

The Ballerina GraphQL module is part of the Ballerina Standard Library. It is a spec-compliant, production-ready GraphQL implementation for writing GraphQL APIs in Ballerina.

Ballerina GraphQL Library

Build codecov Trivy GraalVM Check GitHub Last Commit Github issues

This library provides APIs for connecting and interacting with GraphQL endpoints.

GraphQL is an open-source data query and manipulation language for APIs. GraphQL allows clients to define the structure of the data required and the same structure of the data is returned from the server, preventing the returning of excessively large amounts of data.

The Ballerina GraphQL implementation is using HTTP as the underlying protocol.

Listener

The graphql:Listener is used to listening to a given IP/Port. To create a graphql:Listener, an http:Listener or a port number can be used.

Create a standalone graphql:Listener

import ballerina/graphql;

listener graphql:Listener graphqlListener = new(4000);

Create a graphql:Listener using an http:Listener

import ballerina/graphql;
import ballerina/http;

listener http:Listener httpListener = check new(4000);
listener graphql:Listener graphqlListener = new(httpListener);

Additional configurations

When initializing the Ballerina GraphQL listener, a set of additional configurations can be provided to configure the listener including security and resiliency settings. The configurations that can be passed for this are defined in the graphql:ListenerConfiguration record.

import ballerina/graphql;

listener graphql:Listener graphqlListener = new (4000, timeout = 10, secureSocket = { key: { path: <KEYSTORE_PATH>, password: <PASSWORD>}});

Service

The Ballerina GraphQL service represents the GraphQL schema. When a service is attached to a graphql:Listener, a GraphQL schema will be auto-generated.

The GraphQL services are exposed through a single endpoint. The path of the GraphQL service endpoint can be provided via the service path of the GraphQL service. The endpoint of the following Ballerina GraphQL service will be /graphql.

import ballerina/graphql;

service /graphql on new graphql:Listener(4000) {
    // ...
}

The GraphQL service endpoint URL will be <host>:<port>/graphql.

Alternatively, a Ballerina GraphQL service can not have a path, in which case the endpoint will be the host URL and the port as the following example.

import ballerina/graphql;

service on new graphql:Listener(4000) {
    // ...
}

The GraphQL service endpoint URL will be <host>:<port>

Query type

The resource functions inside the GraphQL service can represent the resolvers of the Query root type.

When a resource function is defined inside a GraphQL service with the get accessor, the generated schema will have a Query root type and the resource function will be a field of the Query object.

Note: A GraphQL service must have at least one resource function defined. Otherwise, it will result in a compilation error.

The accessor of the resource function should always be get for a field to be considered as a Query field. The resource function name will become the name of the particular field in the GraphQL schema. The return type of the resource function will be the type of the corresponding field.

import ballerina/graphql;

service graphql:Service /graphql on new graphql:Listener(4000) {
    resource function get greeting(string name) returns string {
        return "Hello, " + name;
    }
}

The above can be queried using the GraphQL document below:

{
    greeting(name: "John")
}

The result will be the following JSON.

{
    "data": {
        "greeting": "Hello, John"
    }
}

Mutation type

The remote functions inside the GraphQL service represent the resolvers of the Mutation root type.

When a remote function is defined inside a GraphQL service, the schema will have a Mutation operation and the remote function will be a field of the Mutation object.

For example, consider the following service that has a Person record named profile. It has a Query field named profile, which returns the Person record. It also has two remote functions named updateName and updateCity, which are used as mutations.

import ballerina/graphql;

public type Person record {|
    string name;
    int age;
    string city;
|};

service /graphql on new graphql:Listener(4000) {
    private Person profile;

    function init() {
        self.profile = { name: "Walter White", age: 50, city: "Albuquerque" };
    }

    resource function get profile() returns Person {
        return self.profile;
    }

    remote function updateName(string name) returns Person {
        self.profile.name = name;
        return self.profile;
    }

    remote function updateCity(string city) returns Person {
        self.profile.city = city;
        return self.profile;
    }
}

This will generate the following schema:

type Query {
    profile: Person!
}

type Mutation {
    updateName(name: String!): Person!
    updateCity(city: String!): Person!
}

type Person {
    name: String!
    age: Int!
    city: String!
}

Note: A GraphQL schema must have a root Query type. Therefore, a Ballerina GraphQL service must have at least one resource function defined.

This can be mutated using the following document.

mutation updatePerson {
    updateName(name: "Mr. Lambert") {
        ... ProfileFragment
    }
    updateCity(city: "New Hampshire") {
        ... ProfileFragment
    }
}

fragment ProfileFragment on Person {
    name
    city
}

Note: This document uses two mutations and each mutation requests the same fields from the service using a fragment (ProfileFragment).

Result:

{
    "data": {
        "updateName": {
            "name": "Mr. Lambert",
            "city": "Albuquerque"
        },
        "updateCity": {
            "name": "Mr. Lambert",
            "city": "New Hampshire"
        }
    }
}

See how the result changes the Person record. The first mutation changes only the name and it populates the result of the updateName field. Then, it will execute the updateCity operation and populate the result. This is because the execution of the mutation operations will be done serially in the same order as they are specified in the document.

Subscription Type

The subscription type can be used to continuously fetch the data from a GraphQL service.

The resource functions inside the GraphQL service with the subscribe accessor can represent the resolvers of the Subscription root type.

When a resource function is defined inside a GraphQL service with the subscribe accessor, the generated schema will have a Subscription root type and the resource function will be a field of the Subscription object.

The accessor of the resource function should always be subscribe for a field to be considered as a Subscription field. The resource function name will become the name of the particular field in the GraphQL schema. The return type of the resource function will be the type of the corresponding field.

The resource functions that belongs to Subscription type must return a stream of any type. Any other return type will result in a compilation error.

The return type

import ballerina/graphql;

service graphql:Service /graphql on new graphql:Listener(4000) {
    resource function subscribe messages() returns stream<string> {
        return ["Walter", "Jesse", "Mike"].toStream();
    }
}

The above can be queried using the GraphQL document below:

subscription {
    messages
}

When a subscription type is defined, a websocket service will be created to call the subscription. The above service will create the service as follows:

ws://<host>:4000/graphql

This can be accessed using a websocket client. When the returned stream has a new entry, it will be broadcasted to the subscribers.

Additional configurations

Additional configurations of a Ballerina GraphQL service can be provided using the graphql:ServiceConfig. These configurations include security-related configurations for the GraphQL service.

Security configurations

A GraphQL service can be secured by setting the auth field in the graphql:ServiceConfig. Ballerina GraphQL services support Basic Authentication, JWT Authentication, and OAuth2 Authentication.

@graphql:SeviceConfig {
    auth: [
        {
            oauth2IntrospectionConfig: {
                url: <auth_introspection_url>,
                tokenTypeHint: <access_token>,
                scopeKey: <scope_key>,
                clientConfig: {
                    secureSocket: {
                       cert: {
                           path: <truststore_path>,
                           password: <password>
                       }
                    }
                }
            },
            scopes: [<comma_separated_list_of_scopes>]
        }
    ]
}
service graphql:Service /graphql on new graphql:Listener(4000) {
    // Service definition
}
Maximum query depth

When a maximum query depth is provided, all the queries exceeding that limit will be rejected at the validation phase and will not be executed.

import ballerina/graphql;

@graphql:ServiceConfig {
    maxQueryDepth: 2
}
service graphql:Service /graphql on new graphql:Listener(9090) {
    // Service definition
}

The above service only accepts queries of less than 2 levels. For an example, consider the following document:

query getData {
    book {
        author {
            books {
                author {
                    books
                }
            }
        }
    }
}

The result for the above query is the following JSON:

{
    "errors": [
        {
            "message": "Query \"getData\" has depth of 5, which exceeds max depth of 2",
            "locations": [
                {
                    "line": 1,
                    "column": 1
                }
            ]
        }
    ]
}
Context init

This field is used to initialize the graphql:Context object. Usage of the graphql:Context will be described in a separate section.

Context

The graphql:Context can be used to pass meta-information among the graphql resolver (resource/remote) functions. It will be created per each request, with a defined set of attributes. Attributes can be stored in the graphql:Context object using key-value pairs. The key should always be a string. The type of the value is value:Cloneable|isolated object {}. This means the values can be any immutable type, readonly value, or an isolated object. These attributes can be set using a function, which can be given as a service configuration parameter.

Context init

The graphql:Context can be initialized using a function. The function signature is as follows:

isolated function (http:RequestContext requestContext, http:Request request) returns graphql:Context|error {}

The values from the http:RequestContext and the http:Request can be set as attributes of the graphql:Context since they are passed as arguments for this function. Then the function should be provided as a graphql:ServiceConfig parameter.

Following are examples for providing the context init function.

Provide the init function directly
import ballerina/graphql;
import ballerina/http;

@graphql:ServiceConfig {
    contextInit: isolated function(http:RequestContext requestContext, http:Request request) returns graphql:Context|error {
        graphql:Context context = new;
        context.set("<key>", <value>);
        return context;
    }
}
service on new graphql:Listener(4000) {
    // ...
}
Provide the init function as a function pointer
import ballerina/graphql;
import ballerina/http;

isolated function initContext(http:RequestContext requestContext, http:Request request) returns graphql:Context|error {
    graphql:Context context = new;
    context.set("<key>", <value>);
    return context;
}

@graphql:ServiceConfig {
    contextInit: initContext
}
service on new graphql:Listener(4000) {
    // ...
}

Note: Even if the context init function is not provided, a default, empty context will be created per each request.

Use the context in resolver functions

If the graphql:Context needs to be accessed, the resolver function has to add it as the first parameter of the function. Following is an example:

service on new graphql:Listener(4000) {
    resource function get greet(graphql:Context context) returns string {
        return "Hello, World!";
    }
}

This is similar to any remote function, or a resource function inside a service object used as a GraphQL object type.

Retrieve attributes from the context

There are two methods to retrieve attributes from the graphql:Context.

get() function

This will return the value of the attribute using the provided key. If the key does not exist, it will return a graphql:Error.

resource function get greeting(graphql:Context context) returns string|error {
    var username = check context.get("username");
    if username is string {
        return "Hello, " + username;
    }
    return "Hello, World!";
}
remove() function

This function will remove the attribute for a provided key, and return the value. If the key does not exist, it will return a graphql:Error.

Note: Even though this is supported, destructive-modification of the graphql:Context is discouraged. This is because these modifications may affect the parallel executions in queries.

resource function get greeting(graphql:Context context) returns string|error {
    var username = check context.remove("username");
    if username is string {
        return "Hello, " + username;
    }
    return "Hello, World!";
}

Types

The Ballerina GraphQL resources can return the following types:

Return types

Scalar types

The following Ballerina types are considered as Scalar types:

  • int
  • string
  • boolean
  • float
resource function get greeting() returns string {
    return "Hello, World";
}

This can be queried using the following document:

{
    greeting
}

Result:

{
    "data": {
        "greeting": "Hello, World"
    }
}

Enums

When a resource or a remote function returns an enum value, it will be mapped to a GraphQL ENUM type.

import ballerina/graphql;

public enum Color {
    RED,
    GREEN,
    BLUE
}

service on new graphql:Listener(4000) {
    resource function get color(int code) returns Color {
        // ...
    }
}

The above service will generate the following GraphQL schema.

type Query {
    color: Color!
}

enum Color {
    RED
    GREEN
    BLUE
}
Record types

When a resource function is returning a record type, each field of the record can be queried separately. Each record type is mapped to a GraphQL OBJECT type and the fields of the record type are mapped to the fields of the OBJECT type.

public type Person record {|
    string name;
    int age;
|};

resource function get profile() returns Person {
    return { name: "Walter White", age: 51 };
}

This will generate the following schema.

type Query {
    profile: Person!
}

type Person {
    name: String!
    age: Int!
}

This can be queried using the following document:

{
    profile {
        name
        age
    }
}

Result:

{
    "data": {
        "profile": {
            "name": "Walter White",
            "age": 51
        }
    }
}

Each field can be queried separately as shown in the following document:

{
    profile {
        name
    }
}

Result:

{
    "data": {
        "profile": {
            "name": "Walter White"
        }
    }
}

Service types

When a resource function returns a service type, the service type is mapped to a GraphQL OBJECT type and the resource functions of the service type will be mapped as the fields of the OBJECT.

When a service type is returned from a graphql:Service, the returning service type should also follow the rules of the graphql:Service explained above.

import ballerina/graphql;

service graphql:Service /graphql on new graphql:Listener(4000) {
    resource function get profile() returns Person {
        return new("Walter White", 51);
    }
}

service class Person {
    private string name;
    private int age;

    public function init(string name, int age) {
        self.name = name;
        self.age = age;
    }

    resource function get name() returns string {
        return self.name;
    }

    resource function get age() returns int {
        return self.age;
    }
}

This will generate the following schema:

type Query {
    profile: Person!
}

type Person {
    name: String!
    age: Int!
}

This can be queried using the following document:

query getProfile {
    profile {
        name
    }
}

The above will result in the following JSON:

{
    "data": {
        "profile": {
            "name": "Walter White"
        }
    }
}

Arrays

A GraphQL resource function can return an array of the types mentioned above. When a resource function is returning an array, the result will be a JSON array.

public type Person record {|
    string name;
    int age;
|};

resource function get people() returns Person[] {
    Person p1 = { name: "Walter White", age: 51 };
    Person p2 = { name: "James Moriarty", age: 45 };
    Person p3 = { name: "Tom Marvolo Riddle", age: 71 };
    return [p1, p2, p3];
}

This will generate the following schema:

type Query {
    profile: [Person!]!
}

type Person {
    name: String!
    age: Int!
}

This can be queried using the following document:

{
    people {
        name
    }
}

Result:

{
    "data": {
        "people": [
            {
                "name": "Walter White"
            },
            {
                "name": "James Moriarty"
            },
            {
                "name": "Tom Marvolo Riddle"
            }
        ]
    }
}

Note: Each element in the array consists only of the required name field.

Optional types

A Ballerina GraphQL resource function can return an optional type. When the return value is (), the resulting field in the JSON will be null.

public type Person record {|
    string name;
    int age;
|};

resource function get profile(int id) returns Person? {
    if (id == 1) {
        return { name: "Walter White", age: 51 };
    }
}

This will generate the following schema:

type Query {
    profile: Person
}

type Person {
    name: String!
    age: Int!
}

This can be queried using the following document:

{
    profile(id: 1) {
        name
    }
}

Result:

{
    "data": {
        "profile": {
            "name": "Walter White"
        }
    }
}

If the following document is used:

{
    profile(id: 4) {
        name
    }
}

This will be the result:

{
    "data": {
        "profile": null
    }
}

Union types

The Ballerina GraphQL service can return a union of distinct service types. This will be mapped to a GraphQL UNION type.

Note: Since Ballerina supports union types by nature, directly returning a union type is also allowed (but not recommended). The recommended way is to define a union type name separately and then use that type name as shown in the following example. If a union type is returned directly without providing a type name (returns T1|T2|T3), the type name will be T1_T2_T3.

import ballerina/graphql;

public type StudentOrTeacher Student|Teacher;

service /graphql on new graphql:Listener(4000) {
    resource function get profile(int purity) returns StudentOrTeacher {
        if (purity < 90) {
            return new Student(1, "Jesse Pinkman");
        } else {
            return new Teacher(737, "Walter White", "Chemistry");
        }
    }
}

distinct service class Student {
    private int id;
    private string name;

    public function init(int id, string name) {
        self.id = id;
        self.name = name;
    }

    resource function get id() returns int {
        return self.id;
    }

    resource function get name() returns string {
        return self.name;
    }
}

distinct service class Teacher {
    private int id;
    private string name;
    private string subject;

    public function init(int id, string name, string subject) {
        self.id = id;
        self.name = name;
        self.subject = subject;
    }

    resource function get id() returns int {
        return self.id;
    }

    resource function get name() returns string {
        return self.name;
    }

    resource function get subject() returns string {
        return self.subject;
    }
}

This will generate the following schema:

type Query {
    profile(purity: Int!): StudentOrTeacher!
}

type Student {
    id: Int!
    name: String!
}

type Teacher {
    id: Int!
    name: String!
    subject: String!
}

union StudentOrTeacher Student|Teacher

This can be queried using the following document:

query {
    profile(purity: 75) {
        ... on Student {
            name
        }
        ... on Teacher {
            name
            subject
        }
    }
}

The result will be:

{
    "data": {
        "profile": {
            "name": "Jesse Pinkman"
        }
    }
}

If the following document is used:

query {
    profile(purity: 99) {
        ... on Student {
            name
        }
        ... on Teacher {
            name
            subject
        }
    }
}

The result will be:

{
    "data": {
        "profile": {
            "name": "Walter White",
            "subject": "Chemistry"
        }
    }
}

Errors

A Ballerina GraphQL resource function can return an error with the union of the types mentioned above.

Note: A resource or a remote function cannot return only an error, any subtype of an error, or, an error?, which will result in a compilation error.

public type Person record {|
    string name;
    int age;
|};

resource function get profile(int id) returns Person|error {
    if (id == 1) {
        return { name: "Walter White", age: 51 };
    } else {
        return error(string `Invalid ID provided: ${id}`);
    }
}

This can be queried using the following document:

{
    profile(id: 5) {
        name
    }
}

Result:

{
    "errors": [
        {
            "message": "Invalid ID provided: 5",
            "locations": [
                {
                    "line": 2,
                    "column": 4
                }
            ]
        }
    ]
}

Hierarchical resource paths

A resource function inside a GraphQL service can have hierarchical paths. When a hierarchical path is present, each level of the hierarchical path maps to the GraphQL field of the same name, and the type of that field will be mapped to an OBJECT type with the same name.

import ballerina/graphql;

service graphql:Service /graphql on new graphq:Listener(4000) {
    resource function profile/name/first() returns string {
        return "Walter";
    }

    resource function profile/name/last() returns string {
        return "White"
    }

    resource function profile/age() returns int {
        return 51;
    }
}

The above service will create the following schema:

type Query {
    profile: profile!
}

type profile {
    name: name!
    age: Int!
}

type name {
    first: String!
    last: String!
}

Note: The field name and the type names are equal.

Issues and projects

Issues and Projects tabs are disabled for this repository as this is part of the Ballerina Library. To report bugs, request new features, start new discussions, view project boards, etc., go to the Ballerina Library parent repository. This repository only contains the source code for the module.

Build from the source

Prerequisites

  1. Download and install Java SE Development Kit (JDK) version 17 (from one of the following locations).

    • Oracle

    • OpenJDK

      Note: Set the JAVA_HOME environment variable to the path name of the directory into which you installed JDK.

  2. Generate a Github access token with read package permissions, then set the following env variables:

    export packageUser=<Your GitHub Username>
    export packagePAT=<GitHub Personal Access Token>
    

Build options

Execute the commands below to build from the source.

  1. To build the package:

    ./gradlew clean build
    
  2. To run the tests:

    ./gradlew clean test
    
  3. To run a group of tests

    ./gradlew clean test -Pgroups=<test_group_names>
    
  4. To build the without the tests:

    ./gradlew clean build -x test
    
  5. To debug package with a remote debugger:

    ./gradlew clean build -Pdebug=<port>
    
  6. To debug with Ballerina language:

    ./gradlew clean build -PbalJavaDebug=<port>
    
  7. Publish the generated artifacts to the local Ballerina central repository:

    ./gradlew clean build -PpublishToLocalCentral=true
    
  8. Publish the generated artifacts to the Ballerina central repository:

    ./gradlew clean build -PpublishToCentral=true
    

Contribute to Ballerina

As an open-source project, Ballerina welcomes contributions from the community.

For more information, go to the contribution guidelines.

Code of conduct

All the contributors are encouraged to read the Ballerina Code of Conduct.

Useful links

More Repositories

1

ballerina-lang

The Ballerina Programming Language
Ballerina
3,286
star
2

lsp4intellij

This language client library provides language server protocol support for IntelliJ IDEA and other Jetbrains IDEs.
Java
413
star
3

ballerina-spec

Ballerina Language and Platform Specifications
HTML
171
star
4

ballerina-dev-website

Dev version of the ballerina.io website
HTML
163
star
5

nballerina

Ballerina compiler that generates native executables.
Ballerina
142
star
6

ballerina-library

The Ballerina Library
Ballerina
137
star
7

module-ballerina-jwt

Ballerina JWT module.
Ballerina
130
star
8

openapi-tools

Ballerina OpenApi-Tool
Java
129
star
9

module-ballerina-grpc

Ballerina gRPC Module
Ballerina
128
star
10

ballerina-release

Ballerina release scripts
Python
126
star
11

openapi-connectors

Generate Ballerina connector with OpenAPI definition
Ballerina
126
star
12

module-ballerina-http

Ballerina HTTP Module
Java
124
star
13

module-ballerinax-nats

Ballerina NATS Module.
Ballerina
124
star
14

ballerina-platform.github.io

ballerina-platform.github.io - Github pages based ballerina.io website
HTML
124
star
15

ballerina-action

Dockerfile
124
star
16

module-ballerina-io

Ballerina io Module
Ballerina
123
star
17

module-ballerina-tcp

Ballerina socket module
Java
122
star
18

module-ballerina-oauth2

Ballerina OAuth2 Module
Ballerina
122
star
19

module-ballerina-websocket

Ballerina WebSocket Module
Java
121
star
20

module-ballerina-websub

Ballerina Websub module.
Ballerina
120
star
21

module-ballerina-mime

Ballerina MIME Module
Java
119
star
22

plugin-intellij

Ballerina extension for IntelliJ IDEA.
Java
119
star
23

module-ballerinax-mysql

Ballerina mysql Module
Ballerina
119
star
24

module-ballerina-auth

Ballerina Auth Module
Java
119
star
25

module-ballerina-sql

Ballerina SQL Module
Java
119
star
26

module-ballerina-email

Ballerina module to send and receive emails
Java
119
star
27

module-ballerinax-kafka

Ballerina Kafka Module.
Ballerina
119
star
28

module-ballerina-udp

Ballerina UDP module enables transport layer communication over UDP protocol.
Java
118
star
29

module-ballerinax-java.jdbc

Ballerina JDBC Module
Ballerina
118
star
30

module-ballerina-cache

Ballerina cache Module
Ballerina
118
star
31

module-ballerina-log

Ballerina log Module
Ballerina
118
star
32

module-ballerina-c2c

Ballerina Code2Cloud implementation
Java
118
star
33

module-ballerinax-slack

Ballerina slack module
Ballerina
118
star
34

module-ballerinax-azure-cosmosdb

Ballerina
118
star
35

plugin-vscode-compiler-toolkit

Compiler tools for Ballerina developers
TypeScript
118
star
36

ballerina-dev-tools

Ballerina Developer Tooling
Java
118
star
37

module-ballerinax-stan

Ballerina NATS Streaming Module.
Java
117
star
38

module-ballerina-crypto

Ballerina crypto Module
Ballerina
117
star
39

module-ballerina-websubhub

This modules includes a bunch of APIs to facilitate writing different WebSub Hub implementations
Ballerina
116
star
40

module-ballerinax-googleapis.calendar

Connector repository for Google Calendar API.
Ballerina
116
star
41

module-ballerina-xmldata

Ballerina xml utils Module
Ballerina
116
star
42

module-ballerinax-postgresql

Ballerina PostgreSQL DB module
Ballerina
116
star
43

module-ballerinax-java.jms

Ballerina
116
star
44

module-ballerina-file

Ballerina File Module
Ballerina
116
star
45

module-ballerinax-azure-service-bus

Ballerina
116
star
46

module-ballerinax-aws.dynamodb

This is to keep the Amazon DynamoDB connector for Ballerina.
Ballerina
116
star
47

module-ballerinax-aws.s3

Ballerina
116
star
48

module-ballerina-task

Ballerina task Module
Java
116
star
49

module-ballerina-time

Ballerina time Module
Ballerina
116
star
50

module-ballerinax-azure.functions

The implementation of Azure Functions compiler extension for Ballerina.
Java
116
star
51

module-ballerinax-datamapper

A compiler extension to extract abstract representation of Ballerina connector actions and their associated types
Java
116
star
52

module-ballerina-uuid

Ballerina UUID Module
Ballerina
116
star
53

module-ballerinax-netsuite

The Ballerina connector to perform operations on Netsuite integrate cloud system.
Ballerina
116
star
54

module-ballerinax-twitter

This repo is to keep Ballerina Twitter connector implementation for Ballerina
Ballerina
116
star
55

ballerina-update-tool

Ballerina Update Tool implementation to manage Ballerina versions
Java
116
star
56

module-ballerinax-ai.agent

Ballerina ReAct type Agent module using Large language models (LLMs)
Ballerina
115
star
57

module-ballerina-os

Ballerina system Module
Java
115
star
58

module-ballerinax-jaeger

Ballerina Jaeger Observability Extension Module
Java
115
star
59

module-ballerinax-aws.sqs

Ballerina
115
star
60

module-ballerinax-mssql

Ballerina MSSQL DB module
Ballerina
115
star
61

module-ballerinax-aws.lambda

Java
115
star
62

module-ballerina-serdes

This is the Ballerina SerDes package, which is a part of the Ballerina Language Standard Library
Java
115
star
63

module-ballerinax-oracledb

Oracle Database Connector for Ballerina
Ballerina
115
star
64

module-ballerina-xslt

Ballerina xslt module
Java
115
star
65

module-ballerina-url

Ballerina encoding module.
Ballerina
115
star
66

module-ballerinax-rabbitmq

Ballerina RabbitMQ Module.
Ballerina
115
star
67

module-ballerinax-prometheus

Ballerina Prometheus Observability Extension Module
Java
115
star
68

module-ballerinai-transaction

Ballerina internal module of transaction implementation
Ballerina
115
star
69

module-ballerinax-mysql.driver

Ballerina Azure MySQL Module
Ballerina
115
star
70

module-ballerinax-azure-storage-service

Ballerina
115
star
71

graphql-tools

Maintain the source code for GraphQL related tools.
Java
115
star
72

module-ballerina-jballerina.java.arrays

Ballerina Java Array Module
Ballerina
114
star
73

module-ballerina-constraint

Ballerina Constraint Module
Ballerina
114
star
74

module-ballerinax-choreo

Ballerina Choreo Observability Extension Module
Java
114
star
75

ballerina-performance-cloud

Ballerina Performance Tests in Cloud
Shell
114
star
76

module-ballerinax-azure.eventhub

Azure Eventhub connector
Ballerina
114
star
77

module-ballerina-regex

Ballerina Regex Module
Ballerina
114
star
78

plugin-gradle

Ballerina Gradle plugin
Groovy
114
star
79

module-ballerinax-mssql.driver

Ballerina MSSQL DB Driver
Ballerina
114
star
80

module-ballerina-random

Ballerina Random Library
Ballerina
114
star
81

module-ballerinax-health.fhir.templates

FHIR Ballerina templates
Ballerina
114
star
82

module-ballerinax-persist.sql

SQL database support of Ballerina Persist
Ballerina
114
star
83

module-ballerinax-microsoft.onedrive

The Ballerina connector to perform operations on the files, which is stored on OneDrive
Ballerina
114
star
84

ballerina-custom-jre

Generates platform-specific custom Java runtime images to be bundled with Ballerina platform distributions, which contains only the required modules for Ballerina runtime.
114
star
85

asyncapi-tools

This repository is the code base for the ballerina async-api tool
Java
114
star
86

persist-tools

Ballerina persist tools
Ballerina
113
star
87

module-ballerinax-cdata.connect

Manage Ballerina CData connector modules centrally.
Java
113
star
88

module-ballerina-persist

Ballerina Persist module
Java
113
star
89

module-ballerinax-peoplehr

Ballerina connector for People HR
Ballerina
113
star
90

module-ballerinax-aws.ses

The Ballerina connector to perform operations on Amazon Simple Email Service(Amazon SES).
Ballerina
113
star
91

module-ballerinax-googleapis.people

Repository for Google People API Connector
Ballerina
113
star
92

module-ballerinax-microsoft.teams

The Ballerina Microsoft Teams Connector for teamwork and intelligent communications.
Ballerina
113
star
93

module-ballerinax-googleapis.drive

Repository for Google Drive module.
Ballerina
113
star
94

module-ballerinax-microsoft.excel

The Ballerina connector to perform operations on Excel workbooks stored in Microsoft OneDrive.
Ballerina
113
star
95

asyncapi-triggers

This repo will contain the trigger source code generated through ballerina async api tool
Ballerina
113
star
96

module-ballerinax-aws.simpledb

This is to keep the Amazon SimpleDB connector for Ballerina.
Ballerina
112
star
97

module-ballerinax-aws.sns

This repo is to keep the newly written Amazon SNS connector for Ballerina.
Ballerina
112
star
98

module-ballerina-toml

Ballerina TOML Parser
Ballerina
112
star
99

edi-tools

This library provides the functionality required to process EDI files and implement EDI integrations.
Ballerina
112
star
100

module-ballerinax-health.fhir.r4

FHIR R4 Ballerina modules
Ballerina
112
star