Files
sineQL/README.md

3.8 KiB

sineQL

sineQL is a web API query language that mimics graphQL, designed solely for fun.

sineQL consists of two languages - the schema language, and the query language. sineQL assumes that the records are related in a non-looping tree-structure, defined by the schema language.

Example Server

A simple express server using sineQL.

//express for testing
const express = require('express');
const app = express();

app.use(express.text());

//test the library
const sineQL = require('sineql');
const schema = require('./schema.js');
const handler = require('./handler.js');

const sine = sineQL(schema, handler, { debug: true });

//open the endpoint
app.post('/sineql', async (req, res) => {
	const [code, result] = await sine(req.body);
	res.status(code).send(result);
});

//startup
const port = process.env.WEB_PORT || 4000;
app.listen(port, err => {
	console.log(`listening to *:${port}`);
});
const schema = `
scalar Date

type Book {
	String title
	Date published
}

type Author {
	String name
	Book books
}
`;

module.exports = schema;
//TODO: define the handler object's API properly
const handler = {
	Book: () => null,
	Author: () => null
};

module.exports = handler;

Create a matching client-side function pointing to the server.

//create the wave function, wrapping a fetch to the server
const wave = body => fetch('http://example.com/sineql', {
    method: 'POST',
    headers: {
       'Content-Type': 'text/plain'
    },
    body: body
});

//get a list of content
wave('Author { name books { title } }')
    .then(blob => blob.text())
    .then(text => console.log(text))
    .catch(e => console.error(e))
;

The Schema Language

The schema language is a layout of how queries should be made, as well as what can be made with them. There are two built-in keywords for the schema language:

  • type
  • scalar

type is used for defining new compound types. scalar is for defining new scalar types, such as Date.

The built-in types for the schema language are:

  • String
  • Integer
  • Float
  • Boolean

These can be combined into compound types as so:

scalar Date

type Book {
	String title
	Date published
}

type Author {
	String name
	Book books
}

The Query Language

The query langauge can be used to request data from a server, either in whole or in part by listing its type and its needed fields:

Author {
	name
	books {
		title
		published
	}
}

The fields can be altered as well, using the query language's built-in keywords:

  • create
  • update
  • delete
  • match
  • set

create, update and delete work as expected.

Create

When using create, match will find an existing record and associate that with the created values (multiple matches is an error):

Author {
	match name "Kenneth Grahame"
	create books {
		create title "The Wind in the Willows"
	}
}

You can create multiple records at once by surrounding them with []:

create Book [
	{
		set title "The Philosepher's Kidney Stone"
	}
	{
		set title "The Chamber Pot of Secrets"
	}
	{
		set title "The Prisoner of Aunt Kazban"
	}
	{
		set title "The Goblet of the Fire Cocktail"
	}
	{
		set title "The Order for Kleenex"
	}
	{
		set title "The Half-Priced Pharmacy"
	}
	{
		set title "Yeah, I Got Nothing"
	}
]

Update

When using update, match will find all existing records and update those using the set keyword:

update Book {
	match title "The Wind in the Willows"
	set published "15 June 1908"
}
update Book {
	match title "The Wind in the Willows"
	set title "The Fart in the Fronds"
}

Delete

When using delete, only match is valid, and will delete all matching records:

delete Book {
	match title "The Fart in the Fronds"
}

You can use as many instances of match and set as you like, as long as the result is valid.