Cruddl
Create a GraphQL API for your database, using the GraphQL SDL to model your schema.
Install / Use
/learn @AEB-labs/CruddlREADME
cruddl
cruddl - create a cuddly GraphQL API for your database, using the GraphQL SDL to model your schema.
This TypeScript library creates an executable GraphQL schema from a model definition and provides queries and mutations to access a database. Currently, it supports the multi-model database ArangoDB. The concept being inspired by existing projects like prisma and join-monster, cruddl exploits the expressiveness of the Arango Query Language (AQL) to generate one tailored query for each GraphQL request.
Features
- Schema definition using GraphQL types, fields and directives
- Modelling features like relations, embedded lists and objects
- Query features include filtering, sorting, cursor-based pagination and arbitrary nesting
- Schema validation
- Role-based authorization (field and type-based; static and data-dependent)
- Pluggable database backends (currently supports ArangoDB and an in-memory implementation)
Usage
npm install --save cruddl
Install ArangoDB and create a new database.
import { ArangoDBAdapter } from 'cruddl';
const db = new ArangoDBAdapter({
databaseName: 'databaseName',
url: 'http://localhost:8529',
user: 'root',
password: '',
});
If you just want to explore the features, you can also use an in-memory database implementation - but don't use this for anything else.
import { InMemoryAdapter } from 'cruddl';
const db = new InMemoryAdapter();
Define your data model and create a project:
import { Project } from 'cruddl';
const project = new Project({
sources: [
{
name: 'schema.graphqls',
body: `
type Movie @rootEntity {
title: String
actors: Actor @relation
}
type Actor @rootEntity {
name: String
movies: Movie @relation(inverseOf: "actors")
}`,
},
{
name: 'permission-profiles.json',
body: JSON.stringify({
permissionProfiles: {
default: {
permissions: [
{
roles: ['users'],
access: 'readWrite',
},
],
},
},
}),
},
],
getExecutionOptions: ({ context }) => ({ authContext: { authRoles: ['users'] } }),
getOperationIdentifier: ({ context }) => context as object, // each operation is executed with an unique context object
});
Then, create the GraphQL schema and serve it:
import { ApolloServer } from 'apollo-server';
const schema = project.createSchema(db);
db.updateSchema(project.getModel()); // create missing collections
const server = new ApolloServer({
schema,
context: ({ req }) => req, // pass request as context so we have a unique context object for each operation
});
server.listen(4000, () => console.log('Server is running on http://localhost:4000/'));
See the modelling guide and the api documentation for details.
Usage in a browser environment
The core of cruddl perfectly works in a browser (e.g., using webpack), and this can be useful to
generate a mock GraphQL schema on the fly or to validate a cruddl project. However, the ArangoDB
adapter only works with node imports like path. Unless you configure webpack to provide mock
modules for them, you will get an error when you import cruddl in a webpack environment. To solve
this, you can import the core symbols from cruddl/core and the InMemoryAdapter from
cruddl/inmemory.
Running Tests
For consistency, tests shall be run against a single arangodb node:
- npm i
- npm run arangodb:start
- ensure you have access to console at http://localhost:8529
- npm run test
When done, stop the instance with npm run arangodb:stop
See the regression tests guide for details on running, filtering, and updating regression tests.
Documentation
Supported versions
cruddl currently supports the following versions of ArangoDB:
- 3.12
Starting with ArangoDB 3.12, the default locale for new databases has been changed from en_US to
en_US_POSIX. cruddl does not support en_US_POSIX at the moment. If you don't have a locale
configured on your operating system (LANG is not set), you need to change the locale to en_US.
You can either configure the locale on the operating system, or use the --default-language=en_US
option. Do not use --icu-language, as this will change the behavior in a different way, which is
also currently not supported by cruddl.
Related Skills
Writing Hookify Rules
84.7kThis skill should be used when the user asks to "create a hookify rule", "write a hook rule", "configure hookify", "add a hookify rule", or needs guidance on hookify rule syntax and patterns.
review-duplication
99.6kUse this skill during code reviews to proactively investigate the codebase for duplicated functionality, reinvented wheels, or failure to reuse existing project best practices and shared utilities.
feishu-drive
342.0k|
things-mac
342.0kManage Things 3 via the `things` CLI on macOS (add/update projects+todos via URL scheme; read/search/list from the local Things database)
