A javascript REST ORM that is offline and real-time capable

Overview

Rekord

Build Status devDependency Status Dependency Status License Alpha

Rekord is an ORM - a way to define properties and relationships - that interacts with local storage, a RESTful service, and a real-time service. Rekord does this in a generic way so you can use any libraries you wish or your own implementation - making it very easy to integrate into your existing projects. Rekord's design allows for offline capable and real-time applications if desired - offering complete control over how and where your data is stored. Rekord is the most powerful client-side Model/Active Record/ORM you'll find guaranteed - or your money back!

Download Stats

Features

  • Relationships hasOne, belongsTo, hasMany, hasManyThrough, hasRemote, hasList, & hasReference
  • Polymorphic relationships for hasOne, belongsTo & hasMany
  • Validation (59 rules, 6 expressions, 14 transforms, and custom functions) through rekord-validation
  • Migrations through rekord-migrations
  • "Sessions" through rekord-session
  • Batch REST execution for any/all types and operations
  • Inheritance (with extend option)
  • Horizontal scaling with sharding
  • Supports composite keys
  • Purging algorithms and "Contexts" to control memory/local storage usage
  • Specify default values
  • Handle collisions with a "revision" field
  • Handle propagating primary key changes returned by the server
  • Automatically refresh when application becomes online
  • Cache no data, all data, or only pending changes
  • Send only changed values to REST/real-time APIs or entire object
  • Convert values between client & server data types
  • Easily order by field, combination of fields, custom function, or expression
  • Use "Projections" to define subsets of data for efficient use
  • Control what information from relationships (if any) is stored locally or sent to the REST api
  • Add dynamic fields to model objects (setting & getting)
  • Data returned from REST calls or real-time events is intelligibly merged to avoid overwriting local unsaved changes
  • Add updated_at and created_at timestamps and their automatic behavior with a single option
  • Configurable date/timestamp transformations
  • Add custom methods to the model objects
  • Asynchronous methods return Promises which can be chained together
  • Load bootstrapped data with model.boot( model or array of models )
  • Execute searches (fields are sent to REST API and an array of models is expected) with model.search( query, options, ... )
  • Execute paginated searches
  • Add global event listeners to the "database" or all model instances
  • Stores data locally through Rekord.store interface (ex: storkjs)
  • Stores data remotely through Rekord.rest interface (ex: angular, jquery, ajax, pouchdb, firebase, knexjs)
  • Real-time changes through Rekord.live interface (ex: pubsub, pouchdb, firebase)
  • Create a live filtered view of any collection
  • Create a live paginated view of any collection
  • All collections have the following notable operations: sort, page, filtered, where, subtract, intersect, complement, clear, removeWhere, min, max, first, last, sum, avg, count, pluck, reduce, random, chunk, reverse, & group
  • Model collections have the following notable operations: removeWhere, update, updateWhere, & saveWhere

FAQ (client-side usage)

  1. Does Rekord directly interact with a database?
    No, of course not. It interacts with a REST API.

  2. Why do I need to use Rekord?
    Working with relational data in javascript can be painful. Rekord eases that pain by allowing you to use plain looking objects that can have any type of relationship with other objects. Rekord takes into consideration things like foreign keys - where you need object A successfully remotely saved before you can save object B. These types of constraints are ugly and bothersome to handle yourself and easily result in bugs. If you're familiar with server-side ORMs, then Rekord should be really easy to pick up. You'll find all the same features and even more!

  3. How are ID collisions avoided?
    The key for a model can be given when creating a model - otherwise the key will be given a UUID. This is necessary to be offline capable, models need keys so related models can reference it. If the keyChanges option is used the server can return a different key (like an auto-incrementing value) and the key changes will be propagated to all references to that model (foreign keys).

  4. What do you mean by capable?
    Caching data/changes locally and real-time behavior is optional - if you don't want either feature then you don't need to include an implementation.

  5. Rekord can handle horizontal scaling via sharding?
    Yes! You can say models of type X can exist on REST endpoints A, B, & C. You can provide a function which takes a model and returns the set of REST endpoints that need to be sent saves/removes. When you query on a sharded type it can contact all REST endpoints and combine the results.

  6. Why do some functions in the API start with $?
    The Rekord.Model and Rekord.Search classes can have custom properties therefore to avoid collisions the functions and private variables start with $. If your design includes properties like status, operation, db, relations, etc it won't interfere with Rekord.

Installation

The easiest way to install rekord is through bower via bower install rekord.

  • rekord.js is 387KB (68KB gzipped)
  • rekord.min.js is 115KB (29KB gzipped)

Examples

Examples exist in a separate project: https://github.com/Rekord/rekord-examples

Bindings

Bindings are used to implement core pieces of functionality in rekord - these interfaces allows any library to work with rekord.

  • Angular - implements Rekord.rest and adds Rekord.Sync
  • React - adds Rekord.Sync
  • StorkJS - implements Rekord.store
  • PubSub - implements Rekord.live
  • Firebase - implements Rekord.store, Rekord.rest, & Rekord.live
  • PouchDB - implements Rekord.store, Rekord.rest, & Rekord.live
  • jQuery - implements Rekord.rest
  • Ajax - implements Rekord.rest, dependency free
  • Knex.JS - implements Rekord.rest on the server-side
  • Debugging - implements Rekord.debug

Add-Ons

Add-Ons add new functionality to Rekord.

Rekord's Life Cycle:

Rekord Life Cycle

Documentation

The main documentation is located here. Additional documentation can be found here:

Comments
  • Add relationships (1-N, 1-1, N-1, M-N)

    Add relationships (1-N, 1-1, N-1, M-N)

    Add options to pass to Neuro function called belongsTo, hasOne, hasMany, hasManyThrough

    • Every relationship has a property on the model to which it's stored on.
    • Options should be available to either store the object or it's ID in the property.
    • belongsTo and hasOne refers to a single item where hasMany and hasManyThrough is an array. - Options should be available to send or not send the property the rest/live services.
    • Options should be available to load models from rest/live services.
    • belongsTo has a key on the current model that points to another model. The other model may have a hasMany relationship back.
    • hasOne has a key on the current model that points to another model. The other model most likely doesn't have a hasMany relationship back because it typically doesn't know who it belongs to. When a relationship is removed from the model the related model is permanently deleted. A cascade = false option can be specified to override this functionality.
    • hasMany has a key on the related model - so when a relationship is removed from the model the related model is permanently deleted. A cascade = false option can be specified to override this functionality.
    • belongsTo has an option to add a discriminator column and map of Model types based on the discriminated value.
    • When a model is removed that has belongsTo relationships, clear the property on the related model.
    • When a model is removed that has hasOne relationship & cascade !== false, remove the related model.
    • When a model is removed that has a hasMany relationship & cascade !== false, remove all related models.
    • When a model is removed that has a hasManyThrough relationship, remove all related relation models.

    Implementation

    Add a NeuroRelationship class which provides the following functions (names pending):

    {
      init: function(model, database, options) {},
      relate: function(model or key) {},
      unrelate: function(model or key) {},
      set: function(models or keys) {},
      save: function(model)
    }
    
    enhancement 
    opened by ClickerMonkey 5
  • Add migrations

    Add migrations

    A version is stored in the database - each migration is tied to a version - up to the current version. When data is loaded locally and its version is less than the current version - each model is ran through the migration before being handed over the database to be "loaded".

    enhancement 
    opened by ClickerMonkey 4
  • Relationship saving needs to be timed correctly

    Relationship saving needs to be timed correctly

    • hasOne: If related is new, wait until it's done saving before saving the model
    • hasMany: If model is new, wait until model is done saving before saving related
    • hasManyThrough: If model is new, wait until model is done saving before saving through
    bug 
    opened by ClickerMonkey 3
  • Add NeuroQuery

    Add NeuroQuery

    A subset of all models in a database given some condition.

    Features

    • When models are ninja-saved they are re-evaluated by the query condition, if it's no longer a match for the query then it's removed.
    • When models are ninja-removed, they are removed from the query.
    • When the model-added event is triggered on the database, that new model is looked at and potentially added to the query.
    • A query can have a comparator (and comparatorNullsFirst)
    • Query will have the following methods: min, max, sum, avg, first, last, count. Each of the methods can accept a property name to pull a value from or a function which takes a model and returns a number. The count method doesn't need an argument, it will simply return the number of objects in the query.
    • Query can have a subquery. A subquery watches for events on a query and runs an additional query check for inclusion.
    • A query can have the option live: false which means it doesn't listen on model or database events. This is useful for temporary queries.
    • A query's where parameter can be a function or an object where the models in the query must match the where object. (a createWhere function will be added similar to createComparator)
    • Query will have a remove method which can remove all models in the query OR if a function is given all models in the query which return a truhy value when passed to the function.
    • Query will have an update method which takes a set of new values to be applied to all models in the query. Optionally an additional filtering function can be passed.
    • Query will have a groupBy method which takes a property or an array of properties AND an aggregation definition and generates an array of grouped values. The aggregation definition has fields as keys and the type of aggregation as the value (min, max, avg, sum, first, last, count). A third argument can be specified which is a function to use to further filter down the models that are looked at when grouped (having). The resulting array will have a $count variable which is the number of models grouped into that row and can optionally have a $group variable which is an array of all of those models (if a fourth property is specified). Maybe something like this instead?
    query.group({
      by: ['user_id', 'done'],
      select: { cost: 'sum' },
      where: function(model) {},
      having: function(result) {},
      comparator: '-cost',
      accumulate: true
    }); // = [{user_id: 3, done: true, cost: 456}, {user_id: 3, done: false, cost: 123}]
    

    Ideally, Query should be used as the core storage of models over NeuroMap for NeuroDatabase & NeuroRelations so they can take advantage of all the sweet methods.

    This is one big task!

    enhancement 
    opened by ClickerMonkey 3
  • Relationship loaded from remote data, but calls checkSave on hasMany

    Relationship loaded from remote data, but calls checkSave on hasMany

    Perhaps remote updates should not call checkSave in some instances? We shouldn't be loading related models and they cause a SAVE on the parent object.

    bug 
    opened by ClickerMonkey 2
  • Add option for collections to be raw arrays with the functions set on them on each instantiation

    Add option for collections to be raw arrays with the functions set on them on each instantiation

    This will allow collections to work seamlessly with libraries like Angular & VueJS which expect native arrays - and not objects that "extend" arrays. This does add a slight performance cost per instantiation, but it should happen less frequently. The current work-around for this libraries is to call .slice() on the collection which might be more costly - especially if that operation is done every update/scope cycle.

    The user will need to define this behavior before Rekord is defined. Either through an attribute on the script which includes the library or through a short definition. For examples:

    <script src="rekord.js" native-array></script>
    

    OR

    <script>var Rekord = {nativeArray: true}</script>
    <script src="rekord.js"></script>
    

    OR

    <script>var RekordOptions = {nativeArray: true}</script>
    <script src="rekord.js"></script>
    
    enhancement 
    opened by ClickerMonkey 2
  • Add query & lazy option to relationships

    Add query & lazy option to relationships

    • lazy options counteracts with the loadRelations option on NeuroDatabase
    • query option is a templated string (using the fields of the object) URL to load an object/array of objects from to populate the relation. For example: /api/1.0/tasks/bylist/{task_list_id}
    • Add RemoteQuery to accept a plain object for reset which will set the collection to a single model. This will allow single relationships to use the query option.
    enhancement 
    opened by ClickerMonkey 2
  • Additional Collection functions

    Additional Collection functions

    • Add possible where parameter to NeuroModelCollection.update.
    • Add remove function to NeuroModelCollection which can optionally take where parameters.
    • Add NeuroFilteredCollection which has a parent collection it listens to and an additional where function.
    • Replace NeuroDatabase.models with NeuroModelCollection instead of NeuroMap.
    • Add filter to NeuroCollection.
    • Add subtract to NeuroCollection and NeuroModelCollection.
    enhancement 
    opened by ClickerMonkey 2
  • Add parent-child relationship

    Add parent-child relationship

    • Table per class hierarchy (parent has discriminator fields which decides it's type)
    • Table per subclass (parent doesn't have table (no store/rest/live) but all models can exist)
    • Parent table has discriminator option which points to a child table with extra fields to add to parent. Child table has parent option which points to the Parent.

    Not sure the best way to implement this yet!

    enhancement 
    opened by ClickerMonkey 2
  • Add polymorphic relationships

    Add polymorphic relationships

    A model can be related to multiple models based on discriminating id & type.

    nameOfMorph: {
      fields: 'parent_id', // field or fields that point to related object
      discriminator: 'parent_type', // field that determines the 
      mapping: { // a mapping from discriminator to the class
        'discriminator_value': DiscriminatedClass
      }
    }
    

    A model can reference a discriminated model

    nameOfRelatedMorph: {
       model: ClassWithDiscriminator,
       morph: 'nameOfMorphInClassAbove',
    }
    
    enhancement 
    opened by ClickerMonkey 2
  • How to get in touch regarding a security concern

    How to get in touch regarding a security concern

    Hey there!

    I belong to an open source security research community, and a member (@yetingli) has found an issue, but doesn’t know the best way to disclose it.

    If not a hassle, might you kindly add a SECURITY.md file with an email, or another contact method? GitHub recommends this best practice to ensure security issues are responsibly disclosed, and it would serve as a simple instruction for security researchers in the future.

    Thank you for your consideration, and I look forward to hearing from you!

    (cc @huntr-helper)

    opened by zidingz 1
  • Bump qs from 6.5.2 to 6.5.3

    Bump qs from 6.5.2 to 6.5.3

    Bumps qs from 6.5.2 to 6.5.3.

    Changelog

    Sourced from qs's changelog.

    6.5.3

    • [Fix] parse: ignore __proto__ keys (#428)
    • [Fix] utils.merge: avoid a crash with a null target and a truthy non-array source
    • [Fix] correctly parse nested arrays
    • [Fix] stringify: fix a crash with strictNullHandling and a custom filter/serializeDate (#279)
    • [Fix] utils: merge: fix crash when source is a truthy primitive & no options are provided
    • [Fix] when parseArrays is false, properly handle keys ending in []
    • [Fix] fix for an impossible situation: when the formatter is called with a non-string value
    • [Fix] utils.merge: avoid a crash with a null target and an array source
    • [Refactor] utils: reduce observable [[Get]]s
    • [Refactor] use cached Array.isArray
    • [Refactor] stringify: Avoid arr = arr.concat(...), push to the existing instance (#269)
    • [Refactor] parse: only need to reassign the var once
    • [Robustness] stringify: avoid relying on a global undefined (#427)
    • [readme] remove travis badge; add github actions/codecov badges; update URLs
    • [Docs] Clean up license text so it’s properly detected as BSD-3-Clause
    • [Docs] Clarify the need for "arrayLimit" option
    • [meta] fix README.md (#399)
    • [meta] add FUNDING.yml
    • [actions] backport actions from main
    • [Tests] always use String(x) over x.toString()
    • [Tests] remove nonexistent tape option
    • [Dev Deps] backport from main
    Commits
    • 298bfa5 v6.5.3
    • ed0f5dc [Fix] parse: ignore __proto__ keys (#428)
    • 691e739 [Robustness] stringify: avoid relying on a global undefined (#427)
    • 1072d57 [readme] remove travis badge; add github actions/codecov badges; update URLs
    • 12ac1c4 [meta] fix README.md (#399)
    • 0338716 [actions] backport actions from main
    • 5639c20 Clean up license text so it’s properly detected as BSD-3-Clause
    • 51b8a0b add FUNDING.yml
    • 45f6759 [Fix] fix for an impossible situation: when the formatter is called with a no...
    • f814a7f [Dev Deps] backport from main
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump decode-uri-component from 0.2.0 to 0.2.2

    Bump decode-uri-component from 0.2.0 to 0.2.2

    Bumps decode-uri-component from 0.2.0 to 0.2.2.

    Release notes

    Sourced from decode-uri-component's releases.

    v0.2.2

    • Prevent overwriting previously decoded tokens 980e0bf

    https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.1...v0.2.2

    v0.2.1

    • Switch to GitHub workflows 76abc93
    • Fix issue where decode throws - fixes #6 746ca5d
    • Update license (#1) 486d7e2
    • Tidelift tasks a650457
    • Meta tweaks 66e1c28

    https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.1

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Polymorphic hasRelation/hasRelations

    Polymorphic hasRelation/hasRelations

    The model is given an object/collection of objects from a remote source. Typically the parent model has the discriminator to know how to parse the input into a model. However sometimes you are given an object/collection that has its own ID and own type.

    Person { contacts: [ { id: 1, type: 'phone' }, { id: 2, type: 'email ' } ] }

    enhancement 
    opened by ClickerMonkey 0
  • Polymorphic field parsing order should not matter

    Polymorphic field parsing order should not matter

    When a polymorphic relationship is being initialized and it comes to a given object to which there is and ID and discriminator on the parent object, if those properties were not parsed yet they are not detected and the model is not referenced.

    • Set non-relations first in putRemoteData.
    • Then set relations.
    bug 
    opened by ClickerMonkey 0
  • Add decoding/encoding registries & parsers.

    Add decoding/encoding registries & parsers.

    Rekord.addDecoder('boolean', {strict: Boolean}, function(value, params) {
      if ( params.strict ) ...
      return value;
    });
    
    var Model = Rekord({
      decodings: {
        property: 'boolean(strict:true)',
      }
    });
    

    You can also pipe one decoder/encoder to another.

    enhancement 
    opened by ClickerMonkey 0
Releases(1.5.11)
Owner
Rekord
A javascript REST ORM that is offline and real-time capable
Rekord
Jsynchronous.js - Data synchronization for games and real-time web apps.

Jsynchronous.js Synchronize your rapidly changing app state with all connected browsers. Jsynchronous ensures all clients see the same data as what’s

Sirius 111 Dec 16, 2022
Adapter based JavaScript ORM for Node.js and the browser

firenze.js A database agnostic adapter-based object relational mapper (ORM) targetting node.js and the browser. Visit http://firenze.js.org for docume

Fahad Heylaal 130 Jul 14, 2022
TypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, MariaDB, PostgreSQL and SQLite databases.

TypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, MariaDB, PostgreSQL and SQLite datab

MikroORM 5.4k Dec 31, 2022
A simple Node.js ORM for PostgreSQL, MySQL and SQLite3 built on top of Knex.js

bookshelf.js Bookshelf is a JavaScript ORM for Node.js, built on the Knex SQL query builder. It features both Promise-based and traditional callback i

Bookshelf.js 6.3k Jan 2, 2023
An adapter-based ORM for Node.js with support for mysql, mongo, postgres, mssql (SQL Server), and more

Waterline is a next-generation storage and retrieval engine, and the default ORM used in the Sails framework. It provides a uniform API for accessing

Balderdash 5.4k Jan 4, 2023
This is a demo sample of linking NODEJS via ORM and MYSQL

Demons(Demo of Nodejs with SQL) This is a demo sample of linking NODEJS with ORM and MYSQL Connecting Node to SQL is a hard task and not much help is

Shivam Sourav Jha 3 Apr 14, 2022
A typescript data mapping tool. To support mutual transforming between domain model and orm entity.

ts-data-mapper A typescript mapping tool supports mutual transforming between domain model and orm entity. In most case, domain model is not fully com

zed 8 Mar 26, 2022
The Blog system developed by nest.js based on node.js and the database orm used typeorm, the development language used TypeScript

考拉的 Nest 实战学习系列 readme 中有很多要说的,今天刚开源还没来及更新,晚些慢慢写,其实本人最近半年多没怎么写后端代码,主要在做低代码和中台么内容,操作的也不是原生数据库而是元数据Meta,文中的原生数据库操作也当作复习下,数据库的操作为了同时适合前端和Node开发小伙伴,所以并不是很

程序员成长指北 148 Dec 22, 2022
A Node.js ORM for MySQL, SQLite, PostgreSQL, MongoDB, GitHub and serverless service like Deta, InspireCloud, CloudBase, LeanCloud.

Dittorm A Node.js ORM for MySQL, SQLite, PostgreSQL, MongoDB, GitHub and serverless service like Deta, InspireCloud, CloudBase, LeanCloud. Installatio

Waline 21 Dec 25, 2022
An easy-to-use multi SQL dialect ORM tool for Node.js

Sequelize Sequelize is a promise-based Node.js ORM tool for Postgres, MySQL, MariaDB, SQLite and Microsoft SQL Server. It features solid transaction s

Sequelize 27.3k Jan 4, 2023
An SQL-friendly ORM for Node.js

Objection.js Objection.js is an ORM for Node.js that aims to stay out of your way and make it as easy as possible to use the full power of SQL and the

Vincit 6.9k Jan 5, 2023
Next-generation ORM for Node.js & TypeScript | PostgreSQL, MySQL, MariaDB, SQL Server & SQLite

Prisma Quickstart • Website • Docs • Examples • Blog • Slack • Twitter • Prisma 1 What is Prisma? Prisma is a next-generation ORM that consists of the

Prisma 28k Jan 2, 2023
A high performance MongoDB ORM for Node.js

Iridium A High Performance, IDE Friendly ODM for MongoDB Iridium is designed to offer a high performance, easy to use and above all, editor friendly O

Sierra Softworks 570 Dec 14, 2022
Ecommerce-backend-nestjs - Ecommerce app with Nestjs + Prisma ORM + GraphQL + SQLite

ECOMMERCE BACKEND NESTJS APP Nestjs + Prisma ORM + GraphQL + SQLite USER Create Account Login Product Create Product Get Products Get Product Search P

Rui Paulo Calei 5 Apr 6, 2022
just a graphql example created by typescript + fastify + mikro-orm(postgresql) + mercurius(graphql adaptor) + type-graphql

fastify-mikro-orm-mercurius-graphql-example A MikroORM boilerplate for GraphQL made with Fastify, Mercurius, Typescript using TypeGraphQL ?? Packages

Vigen 10 Aug 28, 2022
A typesafe database ORM that exposes the full power of handwritten sql statements to the developer.

TORM A typesafe database ORM that exposes the full power of handwritten sql statements to the developer. import { torm, z } from 'https://deno.land/x/

Andrew Kaiser 15 Dec 22, 2022
Create flexible REST endpoints and controllers from Sequelize models in your Express app

Finale Create flexible REST endpoints and controllers from Sequelize models in your Express or Restify app. This project aims to be a Sequelize 4.x an

Tom Juszczyk 181 Oct 18, 2022
:rocket: One command to generate REST APIs for any MySql Database.

Xmysql : One command to generate REST APIs for any MySql database Why this ? Generating REST APIs for a MySql database which does not follow conventio

null 129 Dec 30, 2022
Social-Feeds-APIs - REST APIs to build social media sites.

express4.17.1-in-docker EXPRESS 4.17 SPA IMPORTANT NOTES: 1. Make sure you follow the steps mentioned under "PROJECT START STEPS" and ensure that the

Patel Rohan 1 Jan 3, 2022