| Functionality | Go | Typescript | MVP |
|---|---|---|---|
| Schema in code | ✔️ | ✔️ | ✔️ |
| privacy | ✔️ | ✔️ | ✔️ |
| EntQuery | ✔️ | ✔️ | |
| Mutations/actions | ✔️ | ✔️ | ✔️ |
| per field privacy | ✔️ | ||
| data loaders (n+1 issue) | ✔️ | ✔️ | |
| support different caches | ✔️ | ||
| per request in memory cache (raw data) | ✔️ | ✔️ | |
| per request in memory cache (viewer|ents) | ✔️ | ||
| auth | ✔️ | ✔️ | |
| patterns | mixins | ✔️ | ✔️ | |
| Correct imports in generated file | ✔️ | ✔️ | ✔️ |
| custom functions/accessors in ents | ✔️ | ✔️ | ✔️ |
| custom top level functions | ✔️ | ✔️ | ✔️ |
| sharding | |||
| file uploads | ✔️ | ✔️ | |
| encryption at rest | |||
| Fb style fbobject and everything that comes with that e.g. FriendFeed style indices etc and go from there |
|||
| can viewer do | |||
| load multiple ids easily | ✔️ | ✔️ | ✔️ |
| concurrency | ✔️ | ✔️ | ✔️ |
| load ents/ids from unique/indices | ✔️ | ✔️ | ✔️ |
| Init/setup | ✔️ | ✔️ | |
| CLI | ✔️ | ✔️ | ✔️ |
| database migrations | ✔️ | ✔️ | ✔️ |
| ent configuration (code ideal/yaml second) | ✔️ | ✔️ | |
| load assoc config in memory once | ✔️ | ||
| deleted_at and similar ways to change behavior | ✔️ | ||
| dockerize everything to run in production/download easily | ✔️ | ✔️ | |
| Different primary id types | ✔️ | ||
| privacy at creation/edit/etc | ✔️ | ✔️ | |
| sql builder/custom sql queries | ✔️ | ✔️ | ✔️ |
| Colocation (part of sharding) | |||
| Payments | |||
| integration with microservices/different data sources | |||
| different databases (other than postgres) | |||
| GraphQL | ✔️ | ✔️ | ✔️ |
| easy testing | ✔️ | ||
| import from db | strong follow-on | ||
| import from other schemas? | strong follow-on | ||
| feature flags (+ built into permissions) |
| Functionality | Go | Typescript | MVP |
|---|---|---|---|
| Fields | ✔️ | ✔️ | ✔️ |
| Custom Table name | ✔️ | ✔️ | ✔️ |
| Default Table name | ✔️ | ✔️ | |
| Edges | ✔️ | ✔️ | ✔️ |
| actions | ✔️ | ✔️ | ✔️ |
| composite indices | ✔️ | ✔️ | |
| composite unique fields | ✔️ | ✔️ | |
| composite primary keys | ✔️ | ✔️ | |
| patterns | ✔️ | ✔️ | |
| hide from graphql | ✔️ | ✔️ |
| Functionality | Go | Typescript | MVP |
|---|---|---|---|
| Server default (stored in db) | ✔️ | ✔️ | ✔️ |
| override db name | ✔️ | ✔️ | ✔️ |
| override graphql name | ✔️ | ✔️ | ✔️ |
| unique field | ✔️ | ✔️ | ✔️ |
| hide from graphql | ✔️ | ✔️ | ✔️ |
| private | ✔️ | ✔️ | ✔️ |
| index | ✔️ | ✔️ | ✔️ |
| foreign key | ✔️ | ✔️ | ✔️ |
| field edge | ✔️ | ✔️ | ✔️ |
| primary key | ✔️ | ✔️ | |
| disableUserEditable | ✔️ | ✔️ | |
| default value on create | ✔️ | ✔️ | |
| default value on edit | ✔️ | ✔️ |
| Functionality | Go | Typescript | MVP |
|---|---|---|---|
| validate | ✔️ | ✔️ | ✔️ |
| format | ✔️ | ✔️ | ✔️ |
| allow blank? | |||
| allow nil? |
| Functionality | Go | Typescript | MVP |
|---|---|---|---|
| Uuid | ✔️ | ✔️ | ✔️ |
| String | ✔️ | ✔️ | ✔️ |
| int | ✔️ | ✔️ | ✔️ |
| float | ✔️ | ✔️ | ✔️ |
| bool | ✔️ | ✔️ | ✔️ |
| time | ✔️ | ✔️ | ✔️ |
| ints | ✔️ | ✔️ | ✔️ |
| strings | ✔️ | ✔️ | ✔️ |
| floats | ✔️ | ✔️ | ✔️ |
| json (but not postgres type) | ✔️ | ✔️ | |
| postgres json | |||
| string enums | ✔️ | ✔️ | |
| int enums | |||
| custom type (part of json) | ✔️ | ✔️ | |
| ✔️ | ✔️ | ✔️ | |
| password | ✔️ | ✔️ | ✔️ |
| phone number | ✔️ | ✔️ | ✔️ |
| Url | ✔️ | ✔️ |
| Functionality | Go | Typescript | MVP |
|---|---|---|---|
| foreign keys | ✔️ | ✔️ | ✔️ |
| assoc edges | ✔️ | ✔️ | ✔️ |
| assoc group | ✔️ | ✔️ | ✔️ |
| three way edge with id in data field | ✔️ | ||
| Easy customizations for the popular edges in different frameworks etc: e.g. one-way, many-to-many that does the right thing |
✔️ | ||
| polymorphic edges | ✔️ | ✔️ | |
| "join tables" | ✔️ |
| Functionality | Go | Typescript | MVP |
|---|---|---|---|
| unique | ✔️ | ✔️ | ✔️ |
| symmetric | ✔️ | ✔️ | ✔️ |
| Inverse | ✔️ | ✔️ | ✔️ |
| Counts | ✔️ | ✔️ | |
| polymorphic edges | ✔️ |
| Functionality | Go | Typescript | MVP |
|---|---|---|---|
| status | ✔️ |
| Functionality | Go | Typescript | MVP |
|---|---|---|---|
| base case (everything) | ✔️ | ✔️ | ✔️ |
| persisted queries | ✔️ | ||
| only gql errors returned to the user | ✔️ | ||
| Subscriptions | |||
| easy testing | ✔️ | ✔️ | |
| entquery | ✔️ | ✔️ |
| Functionality | Go | Typescript | MVP |
|---|---|---|---|
| ids | ✔️ | ✔️ | |
| Edges | ✔️ | ✔️ | |
| fetch one id | ✔️ | ||
| Intersection | |||
| per edge privacy | ✔️ | ||
| union | |||
| custom logic | |||
| counts (raw | privacy backed) | ✔️ | ✔️ | |
| ordering (sort by time/ name etc easily) | ✔️ | ||
| filters e.g. pagination | ✔️ | ✔️ | |
| named custom queries | ✔️ | ✔️ | |
| toggle btw crazy joins and loading objects one by one |
| Functionality | Go | Typescript | MVP |
|---|---|---|---|
| default | ✔️ | ||
| Up | ✔️ | ||
| down | ✔️ | ||
| custom fields | ✔️ |
| Functionality | Go | Typescript | MVP |
|---|---|---|---|
| custom actions (schema) | ✔️ | ✔️ | ✔️ |
| Easy create/edit/delete generated/editable | ✔️ | ✔️ | ✔️ |
| observers | ✔️ | ✔️ | ✔️ |
| validators | ✔️ | ✔️ | ✔️ |
| triggers | ✔️ | ✔️ | ✔️ |
| permissions | ✔️ | ✔️ | ✔️ |
| inverse edge (write field edge) | ✔️ | ✔️ | ✔️ |
| nullable fields | ✔️ | ✔️ | ✔️ |
| custom mutation fields | ✔️ | ✔️ | |
| custom data/time for edges | ✔️ | ✔️ | ✔️ |
| placeholders and resolvers | ✔️ | ✔️ | ✔️ |
| integrate fields | ✔️ | ✔️ | ✔️ |
| built in transactions | ✔️ | ✔️ | ✔️ |
| default observers (send text | email | slack) | strong nice to have | ||
| custom actions called from custom functions | ✔️ |
| Functionality | Go | Typescript | MVP |
|---|---|---|---|
| Redis | ✔️ | ||
| Memory | ✔️ | ||
| memcache |
| Functionality | Go | Typescript | MVP |
|---|---|---|---|
| passwordless | |||
| email/password | ✔️ | ✔️ | ✔️ |
| phone number/pin | ✔️ | ✔️ | |
| auth0 | ✔️ | ✔️ | |
| passport | ✔️ | ✔️ | |
| github | |||
| sessions | |||
| stateless | |||
| mfa | |||
| 2fa | |||
| apple | |||
| Face ID |
| Functionality | Go | Typescript | MVP |
|---|---|---|---|
| Uuid | ✔️ | ✔️ | ✔️ |
| int64 (auto increment) | ✔️ | ||
| Int32 (auto increment) | |||
| custom id (not auto increment) |