Giter Site home page Giter Site logo

vuex-orm-decorators's Introduction

vuex-orm-decorators

Decorator Syntax for Vuex ORM for better type safety and a better experience.

NPM npm bundle size GitHub issues Snyk Vulnerabilities for GitHub Repo

Typescript Decorators to simplify vuex-orm integration in typescript projects. If you are using the vue-module-decorators or vue-property-decorator packages then this will allow you to use the vuex-orm plugin in the same way.

Using the decorators allows better type safety in your projects by allowing you to create conventional Typescript properties, and anotate them as fields for a better experience. Intellisense in Visual Studio Code just works with the annotations, where it doesn't in the vanilla plugin without boilerplate.

This documentation isn't supposed to be a replacement for the vuex-orm documentation, if you are unfamiliar with the concepts of vuex-orm then check out their documentation: https://vuex-orm.github.io/vuex-orm/guide/prologue/what-is-vuex-orm.html. I have linked to relevant guide pages in their documation throughout this documentation.

Contribute

If you have improvements or contributions to make, I will happily check and merge in pull requests.

 

Setup

Installation

npm install -D vuex-orm-decorators

This package targets es2015, if you need to target es5 then you will need to get VUE-CLI to transpile this package.

Auto Model Registration

Models can automatically register themselves in the database. To do so, instead of installing the vuex-orm database, install the wrapper provided by this library as follows:

import Vue from 'vue';
import Vuex from 'vuex';
import { ORMDatabase } from 'vuex-orm-decorators'

Vue.use(Vuex);

export default new Vuex.Store({
    state: {},
    modules: {},
    plugins: [ORMDatabase.install()],
});

When you use a model it registers itself in the database automatically if it has not already. If you do not want auto registered models, simply install the vanilla database and register them as you would normally.

Typescript

  1. Set ExperimentalDecorators to true.
  2. Set importHelpers: truein tsconfig.json.
  3. Set emitHelpers: true in tsconfig.json (only required in typescript 2)

 

Usage

Basic Usage

Out of the box a vuex-orm model is defined as:

import { Model } from '@vuex-orm/core';

class User extends Model {
  static entity = 'users';

  static fields () {
    return {
      id: this.attr(undefined),
      name: this.attr('')
    };
  }
}

The defined fields don't gain type checking by Typescript in this way because they are never defined as properties of the model class. With this decorator library though it allows you to write the same in the following way to achieve type checking on your queried models:

import { Model } from '@vuex-orm/core'
import { AttrField, StringField } from 'vuex-orm-decorators'


@OrmModel('users')
class User extends Model{

    @AttrField(undefined)
    public id!: number;

    @StringField()
    public name!: string;
}

Getters

To create a fully reactive getter, simply add your getters to the model class:

import { Model } from '@vuex-orm/core';
import { AttrField, StringField } from 'vuex-orm-decorators';


@OrmModel('users')
class User extends Model{

    @AttrField(undefined)
    public id!: number;

    @StringField()
    public name!: string;

    public get lowerName(){
        return this.name.toLowerCase();
    }
}

Setting a Primary Key

Rather than setting a primary key by setting the static property primaryKey with the magic string name of the property you want to be the primary key, you can simply annotate the property with the @PrimaryKey decorator as follows:

import { Model } from '@vuex-orm/core';
import { AttrField, StringField } from 'vuex-orm-decorators';


@OrmModel('users')
class User extends Model{

    @PrimaryKey()
    @AttrField(undefined)
    public uuid!: number;

    @StringField()
    public name!: string;
}

In this example the property uuid replaces the default id property as the primary key.

Single Table Inheritance

If your model extends a base model, then STI inheritance needs to be used. The base entity name needs to be provided as the second argument to the ORMModel decorator. To use a discriminator field the third and fourth arguments provide the type mapping and property name overrides.

Generic Types

You can create the generic attr field type using the @AttrField decorator.

Auto Increment

To create auto increment fields which use the @Increment decorator.

Primative Types

Like the vuex-orm library, you can create primative fields using the following decorators:

  1. @StringField creates a string field
  2. @NumberField creates a number field
  3. @BooleanField creates a boolean field

Creating Relationships

You can create all relationships defined in the vuex-orm library. All the relationship decorators take the exact same arguments as the vanilla vuex-orm library static functions.

  1. @HasManyField creates a HasMany relationship field
  2. @HasOneField creates a HasOne relationship field
  3. @BelongsToField creates an inverse HasOne relationship field
  4. @HasManyByField creates a HasManyBy relationship field
  5. @HasManyThroughField creates a HasManyThrough relationship field
  6. @BelongsToManyField creates a BelongsToMany relationship field
  7. @MorphToField creates a MorphTo relationship field
  8. @MorphOneField creates a MorphOne relationship field
  9. @MorphManyField creates a MorphMany relationship field
  10. @MorphToManyField creates a MorphToMany relationship field
  11. @MorphedByManyField creates a MorphedByMany relationship field

vuex-orm-decorators's People

Contributors

scotley avatar hamishbrindle avatar armaaar avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.