Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/soya-miruku/treevial
ORM for surrealdb
https://github.com/soya-miruku/treevial
orm surrealdb surrealdb-client surrealdb-driver typescript
Last synced: about 1 month ago
JSON representation
ORM for surrealdb
- Host: GitHub
- URL: https://github.com/soya-miruku/treevial
- Owner: soya-miruku
- Created: 2023-02-01T09:20:25.000Z (almost 2 years ago)
- Default Branch: main
- Last Pushed: 2023-02-20T01:40:44.000Z (over 1 year ago)
- Last Synced: 2024-04-14T21:45:36.096Z (7 months ago)
- Topics: orm, surrealdb, surrealdb-client, surrealdb-driver, typescript
- Language: TypeScript
- Homepage:
- Size: 52.7 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
Treevial
ORM for SurrealDB.
> **Note**
>NOTE: UPDATE/UPDATE MANY feature has not yet been implemented, i am now working on LUCID which will provide more rich features, however since the API would be different, i am pushing this code here, incase anyone would like to use/expand upon it.
>check out Lucid [here](https://github.com/itsezc/lucid)
Key Features •
How To Use •
License## Key Features
* Define Schemas, with fields and relationships as well as indexes and constraints
* Sync Data model (though basic atm), renames, adds, drops, etc.
* Flexible with data types, supports all of SurrealDB's data types and a Prisma-like query builder
* Fully typesafe, easily infer your data model when doing a simple select or a more complex count or boolean query
* SELECT, DELETE, DELETE MANY, CREATE, CREATE MANY
* Framework agnostic, use it with any framework
* Easily handle recursive relationships without any hassle of circular references
* And a lot more## How To Use
To clone and run this application, you'll need [Git](https://git-scm.com)
```bash
# Clone this repository
$ git clone [email protected]:soya-miruku/Treevial.git# Go into the repository
$ cd Treevial# Install dependencies
$ bun install# Run the tests
$ bun run src/tests
```## Usage
```ts
import { AdapterFactory, inferFull Treevial } from './surreal';// first we will need to define a model, currently we can use the MultiDef class to do so (ideally it would be good to have a Define class which would be used to define a single model)
const schemas = Treevial.MultiDef(({ number, string, date, array, record, relation, object, enums }) => ({
User: {
id: string(), //ideally we should have an id type
name: string(),
email: string({ required: true, index: 'idx_user_email' }),
password: string(),
createdOn: date({ required: false, default: () => new Date() }),
updatedAt: date(),
posts: array(record(() => schemas.defs.post)),
following: relation({
edge: object({
createdAt: date({ default: () => new Date() }),
how: enums(['post', 'search'], { required: true }),
}),
out: object(() => schemas.defs.user),
name: 'follows',
inverse: false,
}),
followers: relation({
edge: object({ createdAt: date({ default: () => new Date() }), how: enums(['post', 'search']) }),
out: object(() => schemas.defs.user),
name: 'follows',
inverse: true,
}),
},
Post: {
id: string({ required: true }),
createdOn: date({ required: false }),
content: string({ required: false }),
},
});// if you want to infer the basic type/ full type of a model you can use the inferFull function or the inferBasic function and there are also a few more
type User = inferFull;// initialise the client (still need to work on creating a proper connection)
schemas.initialize();
const adapter = AdapterFactory.Create({
type: 'surreal',
auth: {
username: 'root',
password: 'root',
port: 8000,
host: '127.0.0.1',
database: 'ttest',
namespace: 'ttest',
},
});const client = await adapter.Connect({ ...schemas.defined }); //creates the client with all the schemas
// now we can use the client to do queries or whatever else, if you are familiar with Prisma, this works alot like that
--------------------------------------------
// FIND MANY
const user = await client.User.FindMany({
select: {
id: true,
name: true,
email: true,
posts: {
_count: true,
as: 'postCount',
},
following: {
_count: true,
as: 'followingCount',
},
},
where: {
age: { gt: 10 },
}
})--------------------------------------------
// CREATE
const user = await client.User.Create({
data: {
name: 'myname',
email: '[email protected]',
}
}) // fields marked as required will be (...well) required XD```
## You may also like...
- [Lucid](https://github.com/itsezc/lucid) - A full fledged ORM for SurrealDB
## License
MIT
---
> GitHub [@soya-miruku](https://github.com/soya-miruku)