3.2.4 • Published 8 days ago

yekonga-server v3.2.4

Weekly downloads
144
License
MIT
Repository
-
Last release
8 days ago

Yekonga Server

oclif Version Downloads/week License

Yekonga Server is an open source backend that can be deployed to any infrastructure that can run Node.js.

Description

Yekonga Server works with the Express web application framework. It can be added to existing web applications, or run by itself.

Contents

Getting Started

Installing

you can install globelly

npm install -g yekonga-server 

OR direct to your project

npm install --save yekonga-server

Create server

VERSION
  yekonga-server/2.1.7 win32-x64 node-v14.15.4

USAGE
  $ yekonga [COMMAND]

COMMANDS
  create    Describe the command here
  generate  Describe the command here
  help      display help for yekonga
  

Create project command

USAGE
  $ yekonga create [PROJECT]

OPTIONS
  -d, --dirname=dirname  app directory name
  -f, --force            Force generate / overide existing
  -h, --help             show CLI help
  -n, --name=name        app name
  -p, --port=port        [default: 1093] server running port
  -p, --public=public    [default: public] generate public directory
  -t, --triggers         create triggers function
  -t, --template         generate template
  -v, --version          show CLI version

Generate triggers command

USAGE
  $ yekonga generate

OPTIONS
  -c, --config=config      App config file name
  -d, --database=database  App database structure file name
  -f, --force              Force generate / overide existing
  -h, --help               show CLI help
  -t, --trigger=trigger    Trigger name
  -t, --triggers           Force generate / overide existing
  -v, --version            show CLI version

Running Yekonga Server

require('yekonga-server');
// configation json file
const config = require('./config.json');

// database structure json file
const database = require('./database.json');

// set configarations
Yekonga.setConfig(config, database); 

// start the server
Yekonga.startServer();  

Database structure

database structure is json array of objects, Database structure sample json file with "users" collection

[
    {
        "_id": { "collection": "users" },
        "userId": { "type": "String", "default": null, "required": true },
        "firstName": { "type": "String", "default": null, "required": true },
        "lastName": { "type": "String", "default": null, "required": true },
        "email": { "type": "String", "default": null, "required": true },
        "password": { "type": "String", "default": null, "required": true },
        "role": { "type": "String", "default": null, "required": true },
        "token": { "type": "String", "default": null, "required": false },
        "status": { "type": "Number", "default": 0, "required": true },
        "isActive": { "type": "Boolean", "default": false, "required": true },
        "createdAt": { "type": "Date", "default": "now", "required": false },
        "updatedAt": { "type": "Date", "default": "now", "required": false }
    },
]

Take one field of users collection

"userId": { "type": "String", "default": null, "required": true },
  • "userId" is the field of the collection/table
  • "type" => userId.type is data type to be stored
  • "default" => userId.default is default value
  • "required" => userId.required werether the value required or not

Database structure can be accessed via

Yekonga.Schema

Configuration

Configuration value can be accessed as below

// config value can be access by 
Yekonga.Config.{key}

// example
Yekonga.Config.appName
Yekonga.Config.ports.server

Configuration is the json file with below data

KeyDefault ValueTypeDescription
appNameSystemStringOptionName of the application
appIdnullStringOptionApplication ID
masterKeynullStringOptionapplication key
enableAppKeyfalsebooleanOptionMake api access require appId or not
domainnullstringOptionmain domain that allow to access app
domainAlias[]arrayOptionall alowed domains
addressSystemStringOptionhost IP address
baseUrlSystemStringOption-
restApiSystemStringOption-
restAuthApiSystemStringOption-
secureOnlySystemStringOption-
debugSystemStringOption-
endToEndEncryptionSystemStringOption-
authPlaygroundEnableSystemStringOption-
apiPlaygroundEnableSystemStringOption-
enableDashboardfalsebooleanOption-
allowCreateFrontendfalsebooleanOption-
namingConvectioncamelcaseStringOptioncamelcase, underscorecase
columnNamingConvectionunderscorecaseStringOption-
namingConvectionOptions"camelcase", "underscorecase"arrayOption-
publicpublicStringOption-
cloudnullStringOption-
logFilenullStringOption-
emailTemplatenullStringOption-
googleApiKeynullStringOption-
permissionsmore...objectOption-
graphqlmore...objectOption-
defaultDatabasemongoDBStringOption-
databasemore...objectrequired-
authenticationmore...objectOption-
portsmore...objectOption-
mailmore...objectOption-

Permissions configuration

KeyDefault ValueTypeDescription
authActions[]arrayOption-
guestActions[]arrayOption-

Graphql configuration

KeyDefault ValueTypeDescription
apiRoutenullstringOptiongraphql api route
apiAuthRoutenullstringOptiongraphql api route
customTypesnullstringOptionrelative path of custom graphql schema
customResolversnullstringOptionrelative path of custom graphql resolver
customAuthTypesnullstringOptionrelative path of auth custom graphql schema
customAuthResolversnullstringOptionrelative path of auth custom graphql resolver
enabledForClasses[]arrayOption-
disabledForClasses[]arrayOption-
authResolvers[]arrayOption-
authClasses[]arrayOption-
guestResolvers[]arrayOption-
guestClasses[]arrayOption-
authQuerymore...stringOption-

Graphql.authQuery configuration

KeyDefault ValueTypeDescription
user[]arrayOptionfield that are to be queried on users
account[]arrayOptionfield that are to be queried on accounts

Database configuration

KeyDefault ValueTypeDescription
{key}more...objectOption-

Database.{key} configuration

KeyDefault ValueTypeDescription
typenullstringOption-
hostnullstringOption-
portnullstringOption-
databaseNamenullstringOption-
usernamenullstringOption-
passwordnullstringOption-
prefixnullstringOption-
generateIDnullstringOption-
generateIDLenghnullstringOption-

Authentication configuration

KeyDefault ValueTypeDescription
saltRound7numberOption-
algorithmHS512stringOption-
tokenSecretnullstringOption-
cryptojsKeynullstringOption-
cryptojsIvnullstringOption-

Ports configuration

KeyDefault ValueTypeDescription
servernullnumberOption-
securenullnumberOption-
socketnullnumberOption-
redisnullnumberOption-

Mail configuration

KeyDefault ValueTypeDescription
smtpmore...objectOption-

Mail.smtp configuration

KeyDefault ValueTypeDescription
servicenullstringOption-
hostnullstringOption-
portnullnumberOption-
securenullbooleanOption-
fromnullstringOption-
domainnullstringOption-
usernamenullstringOption-
passwordnullstringOption-

Database Function

DataModel Functions

All DataModel method return promise

Yekonga.DataModel.{Class}.{method}(args);
MethodParamsResultDescription
findOnefilter, context, isAdminobjectreturn object of Model class eg User
findfilter, context, isAdminarrayreturn array of object of Model class eg User
paginatefilter, context, isAdminobjectreturn object of Model class eg User
downloadfilter, context, isAdminobjectreturn object of Model class eg User
summaryfilter, context, isAdminobjectreturn object of Model class eg User
countfilter, context, isAdminobjectreturn object of Model class eg User
sumfilter, context, isAdminobjectreturn object of Model class eg User
maxfilter, context, isAdminobjectreturn object of Model class eg User
minfilter, context, isAdminobjectreturn object of Model class eg User
graphfilter, context, isAdminobjectreturn object of Model class eg User
createfilter, context, isAdminobjectreturn object of Model class eg User
updatefilter, context, isAdminobjectreturn object of Model class eg User
deletefilter, context, isAdminobjectreturn object of Model class eg User

Examples

let user = await Yekonga.DataModel.User.findOne({}, null, true);

Database Functions

Examples

// single user object
let users = Yekonga.DB.table('users')
    .where('userId', 'xxx')
    .findOne();

// list of users
let users = Yekonga.DB.table('users').find();

Cloud Functions

Define Functions

Define function

Yekonga.Cloud.define('someFunction', async function(data) {

});

Run defined function

Yekonga.Cloud.run('someFunction', data);

Trigger Functions

Before Login

Yekonga.Cloud.beforeLogin(async (data) => { /* code goes here */ });

After Login

Yekonga.Cloud.afterLogin(async (data) => { /* code goes here */ });

Before OTP

Yekonga.Cloud.beforeOtp(async (data) => { /* code goes here */ });

After OTP

Yekonga.Cloud.afterOtp(async (data) => { /* code goes here */ });

Before Registration

Yekonga.Cloud.beforeRegistration(async (data) => { /* code goes here */ });

After Registration

Yekonga.Cloud.afterRegistration(async (data) => { /* code goes here */ });

Before Reset Password

Yekonga.Cloud.beforeResetPassword(async (data) => { /* code goes here */ });

After Reset Password

Yekonga.Cloud.afterResetPassword(async (data) => { /* code goes here */ });

Before Change Password

Yekonga.Cloud.beforeChangePassword(async (data) => { /* code goes here */ });

After Change Password

Yekonga.Cloud.afterChangePassword(async (data) => { /* code goes here */ });

Before Logout

Yekonga.Cloud.beforeLogout(async (data) => { /* code goes here */ });

After Logout

Yekonga.Cloud.afterLogout(async (data) => { /* code goes here */ });

Before Find

Yekonga.Cloud.beforeFind('User', async (filter, context) => { /* code goes here */ });

After Find

Yekonga.Cloud.afterFind('User', async (filter, context) => { /* code goes here */ });

Before Save

Yekonga.Cloud.beforeSave('User', async (input, filter, context) => { /* code goes here */ });

After Save

Yekonga.Cloud.afterSave('User', async (result, input, context) => { /* code goes here */ });

Before Create

Yekonga.Cloud.beforeCreate('User', async (input, filter, context) => { /* code goes here */ });

After Create

Yekonga.Cloud.afterCreate('User', async (result, input, context) => { /* code goes here */ });

Before Update

Yekonga.Cloud.beforeUpdate('User', async (input, filter, context) => { /* code goes here */ });

After Update

Yekonga.Cloud.afterUpdate('User', async (result, input, context) => { /* code goes here */ });

Before Delete

Yekonga.Cloud.beforeDelete('User', async (filter, context) => { /* code goes here */ });

After Delete

Yekonga.Cloud.afterDelete('User', async (result, context) => { /* code goes here */ });

Custom url

const app = Yekonga.route;

app.get('/custom-url', function(req, res){

    return res.send('This is custom url');
});

Helper functions

MethodParamsResultDescription
Yekonga.Helper.execAsync(cmd, pipe, callback)String-String-
Yekonga.Helper.encrypt(data)String-
Yekonga.Helper.decrypt(data)String-
Yekonga.Helper.bcrypt(value)String-
Yekonga.Helper.formatPhone(value)String-
Yekonga.Helper.get, async (url, headers)String-
Yekonga.Helper.post, async (url, body, headers, multipart)String-
Yekonga.Helper.request(method, options)String-
Yekonga.Helper.saveFile(data, dir)String-
Yekonga.Helper.generateFile(template, options)String-
Yekonga.Helper.createFile(file, data, isRoot)String-
Yekonga.Helper.writeFile(file, data, isRoot)String-
Yekonga.Helper.readFile(file)String-
Yekonga.Helper.copy(source, dist, root)String-
Yekonga.Helper.rootpath(filename)String-
Yekonga.Helper.realpath(filename)String-
Yekonga.Helper.setLocation(location)String-
Yekonga.Helper.checkLocation(name, tag, parent)String-
Yekonga.Helper.storeFile(req, res)String-
Yekonga.Helper.setLocalAddress, async (content)String-
Yekonga.Helper.getSystemInfo()String-
Yekonga.Helper.textTemplate(templateString, data)String-
Yekonga.Helper.uuid()String-
Yekonga.Helper.uuid3()String-
Yekonga.Helper.uuid4()String-
Yekonga.Helper.uuid5()String-
Yekonga.Helper.uniqueId(table)String-
Yekonga.Helper.getRandomString(length, type)String-
Yekonga.Helper.getRandomInt(length)String-
Yekonga.Helper.getHexString(length)String-
Yekonga.Helper.databaseUUID()String-
Yekonga.Helper.getTitle(value)String-
Yekonga.Helper.getHeading(value)String-
Yekonga.Helper.getSentence(value)String-
Yekonga.Helper.getSlug(value)String-
Yekonga.Helper.getLink(value)String-
Yekonga.Helper.getName(value)String-
Yekonga.Helper.getTable(value)String-
Yekonga.Helper.getClass(value)String-
Yekonga.Helper.getClassVariable(value, singular)String-
Yekonga.Helper.getVariable(value)String-
Yekonga.Helper.getColumn(value)String-
Yekonga.Helper.formatToVariables(value)String-
Yekonga.Helper.formatToColumn(value)String-
Yekonga.Helper.getDefaultValues(value)String-
Yekonga.Helper.getValidFields(input, validFields, isCreate, relations)String-
Yekonga.Helper.getUnderscore(value)String-
Yekonga.Helper.isRelation(value)String-
Yekonga.Helper.isBoolean(value)String-
Yekonga.Helper.toPlural(value)String-
Yekonga.Helper.toSingular(value)String-
Yekonga.Helper.getTableByName(value)String-
Yekonga.Helper.getPrimaryName(schema)String-
Yekonga.Helper.getChildren(schema)String-
Yekonga.Helper.getParents(schema)String-
Yekonga.Helper.getRelationName(table)String-
Yekonga.Helper.getAbbreviation(name)String-
Yekonga.Helper.getTimestampInt(value)String-
Yekonga.Helper.getIsoTimestamp(value)String-
Yekonga.Helper.toTimestampString(value, format = 'YYYY-MM-DD HH:mm:ss')String-
Yekonga.Helper.getTimestamp(format = 'YYYY-MM-DD HH:mm:ss')String-
Yekonga.Helper.getDate(format = 'YYYY-MM-DD')String-
Yekonga.Helper.getTime(format = 'HH:mm')String-
Yekonga.Helper.copyJson(value)String-
Yekonga.Helper.isGeneralTable(data, ignore = false)String-
Yekonga.Helper.isId(name)String-
Yekonga.Helper.isColumnUrl(name)String-
Yekonga.Helper.isColumnMultiple(name)String-
Yekonga.Helper.isLongText(name)String-
Yekonga.Helper.isTimestampColumn(name, data)String-
Yekonga.Helper.isSearchColumn(name, data)String-
Yekonga.Helper.isTypeColumn(name, data)String-
Yekonga.Helper.isMap(name)String-
Yekonga.Helper.isNumeric(value)String-
Yekonga.Helper.getGraphqlType(name, field, isInput = false)String-
Yekonga.Helper.getMongodbType(name, field)String-
Yekonga.Helper.getMongodbDefault(name, field)String-
Yekonga.Helper.getType(name, value)String-
Yekonga.Helper.getInput(name, type)String-
Yekonga.Helper.bcryptPassword(value)String-
Yekonga.Helper.attemptLoginasync (key, value, password, type = "normal")String-
Yekonga.Helper.getLoginDataasync (user, accountId = null)String-
Yekonga.Helper.getToken(payload)String-
Yekonga.Helper.getRelatedTable(value)String-
Yekonga.Helper.getSchemaOf(name)String-
Yekonga.Helper.schemaToData(name)String-
Yekonga.Helper.getTableDataWithRelations()String-
Yekonga.Helper.translateasync (content, from, to)String-
Yekonga.Helper.colorize = function colorize(color, output)String-
Yekonga.Helper.printLog(title, text, color = 'white', newLine = true)String-
Yekonga.Helper.log(title, text, color = 'white')String-
Yekonga.Helper.logInline(title, text, color = 'white')String-
Yekonga.Helper.waitasync (time = 10000)String-
Yekonga.Helper.hasManyThrough(child, data)String-
Yekonga.Helper.addSlashes(value)String-
Yekonga.Helper.escape(value)String-
Yekonga.Helper.validateEmail(email)String-
Yekonga.Helper.isEmail(email)String-
Yekonga.Helper.translateProcessasync (live, locale, lang, flag)String-
Yekonga.Helper.createLanguageasync (db, locale, lang, flag)String-
Yekonga.Helper.saveTranslationasync (db, row)String-
Yekonga.Helper.savePermissionasync (db, row)String-
Yekonga.Helper.translateBandleasync (trans, locale, db)String-
Yekonga.Helper.encryptUrl(body)String-
Yekonga.Helper.decryptUrl(body)String-
Yekonga.Helper.isPermitted(key, defaultValue = false)String-
Yekonga.Helper.sendMailasync (options)String-
Yekonga.Helper.getEmailContent(name, content)String-
Yekonga.Helper.getRegistrationEmailasync (name, content)String-
Yekonga.Helper.getResetPasswordEmailasync (name, content)String-

Graphql

Custom Action

Action for approve user example

Yekonga.Cloud.setAction('User', 'approve', async ({params})=>{
    const {where, action, accessRole } = (params)? params: {};

    return await Yekonga.DataModel.User.update({ status: 1}, where, null, true);
})

The mutation for above will be as shown below

mutation {
    userAction(where:{userId:{equalTo:"xxx"}}, action:"approve") {
        status
        message
    }
}
  • User is class name
  • approve is action name, can be anything string

Custom Graphql

Custom graphql schema must be configued on the customTypes in Graphql Configuration in config file

Note: for auth Custom graphql resolver must be configued on the customAuthTypes in Graphql Configuration in config file

Graphql schema example

type BlockUserResponse {
    status: Boolean,
    success: Boolean
}

extend type Query {
    blockUser ( userId: String! ): BlockUserResponse,
}

Custom graphql resolver must be configued on the customResolvers in Graphql Configuration in config file

Note: for auth Custom graphql resolver must be configued on the customAuthResolvers in Graphql Configuration in config file

Graphql resolver example

module.exports = {
    Query: {
        blockUser: async function(parent, params, context) {
            // code goes here

            return  {status: false, success: false}
        }
    }
}

Authors

Contributors names and contact info ex. Robert Konga
ex. @robertkonga

Version History

License

This project is licensed under the NAME HERE License - see the LICENSE.md file for details

3.2.2

8 days ago

3.2.1

8 days ago

3.2.0

9 days ago

3.2.4

8 days ago

3.1.36

10 days ago

3.1.38

10 days ago

3.1.37

10 days ago

3.1.39

10 days ago

3.1.35

19 days ago

3.1.34

22 days ago

3.1.33

23 days ago

3.1.31

26 days ago

3.1.29

26 days ago

3.1.28

26 days ago

3.1.27

1 month ago

3.1.26

2 months ago

3.1.23

2 months ago

3.1.25

2 months ago

3.1.22

2 months ago

3.1.21

2 months ago

3.1.20

2 months ago

3.1.18

2 months ago

3.1.19

2 months ago

3.1.16

2 months ago

3.1.17

2 months ago

3.1.14

2 months ago

3.1.15

2 months ago

3.1.12

2 months ago

3.1.13

2 months ago

3.1.11

3 months ago

3.1.9

4 months ago

3.1.8

4 months ago

3.1.10

4 months ago

3.1.3

4 months ago

3.1.2

4 months ago

3.1.1

4 months ago

3.1.0

4 months ago

3.1.7

4 months ago

3.1.6

4 months ago

3.1.5

4 months ago

3.1.4

4 months ago

3.0.4

4 months ago

3.0.3

4 months ago

3.0.2

5 months ago

3.0.1

5 months ago

3.0.7

4 months ago

3.0.6

4 months ago

3.0.5

4 months ago

3.0.0

5 months ago

2.14.14

5 months ago

2.14.12

5 months ago

2.14.13

5 months ago

2.14.10

5 months ago

2.14.11

5 months ago

2.14.9

5 months ago

2.14.7

5 months ago

2.14.8

5 months ago

2.13.19

8 months ago

2.13.18

8 months ago

2.13.17

8 months ago

2.13.16

8 months ago

2.13.15

8 months ago

2.13.14

9 months ago

2.13.13

9 months ago

2.13.12

10 months ago

2.13.11

10 months ago

2.13.10

10 months ago

2.13.35

7 months ago

2.13.34

7 months ago

2.13.33

7 months ago

2.13.32

7 months ago

2.13.31

7 months ago

2.13.30

7 months ago

2.14.5

6 months ago

2.14.6

6 months ago

2.13.28

7 months ago

2.14.3

7 months ago

2.13.27

7 months ago

2.14.4

6 months ago

2.13.26

7 months ago

2.14.1

7 months ago

2.13.25

7 months ago

2.14.2

7 months ago

2.13.24

7 months ago

2.13.23

7 months ago

2.14.0

7 months ago

2.13.21

7 months ago

2.13.20

7 months ago

2.13.9

10 months ago

2.11.0

1 year ago

2.11.1

1 year ago

2.11.6

1 year ago

2.11.4

1 year ago

2.11.5

1 year ago

2.11.2

1 year ago

2.11.3

1 year ago

2.10.70

1 year ago

2.10.71

1 year ago

2.10.72

1 year ago

2.10.73

1 year ago

2.10.74

1 year ago

2.10.75

1 year ago

2.13.8

10 months ago

2.13.6

11 months ago

2.13.7

10 months ago

2.13.4

11 months ago

2.13.5

11 months ago

2.13.2

11 months ago

2.13.3

11 months ago

2.13.0

11 months ago

2.13.1

11 months ago

2.12.0

1 year ago

2.12.9

11 months ago

2.12.7

11 months ago

2.12.8

11 months ago

2.12.5

11 months ago

2.12.6

11 months ago

2.12.3

1 year ago

2.12.4

12 months ago

2.12.11

11 months ago

2.12.1

1 year ago

2.12.10

11 months ago

2.12.2

1 year ago

2.10.69

1 year ago

2.10.30

1 year ago

2.10.31

1 year ago

2.10.32

1 year ago

2.10.33

1 year ago

2.10.34

1 year ago

2.10.35

1 year ago

2.10.36

1 year ago

2.10.37

1 year ago

2.10.38

1 year ago

2.10.39

1 year ago

2.10.40

1 year ago

2.10.41

1 year ago

2.10.42

1 year ago

2.10.43

1 year ago

2.10.44

1 year ago

2.10.45

1 year ago

2.10.46

1 year ago

2.10.48

1 year ago

2.10.49

1 year ago

2.10.13

1 year ago

2.10.14

1 year ago

2.10.15

1 year ago

2.10.16

1 year ago

2.10.17

1 year ago

2.10.18

1 year ago

2.10.19

1 year ago

2.10.20

1 year ago

2.10.21

1 year ago

2.10.22

1 year ago

2.10.23

1 year ago

2.10.24

1 year ago

2.10.25

1 year ago

2.10.26

1 year ago

2.10.27

1 year ago

2.10.29

1 year ago

2.10.50

1 year ago

2.10.51

1 year ago

2.10.52

1 year ago

2.10.53

1 year ago

2.10.54

1 year ago

2.10.55

1 year ago

2.10.56

1 year ago

2.10.57

1 year ago

2.10.58

1 year ago

2.10.59

1 year ago

2.10.60

1 year ago

2.10.61

1 year ago

2.10.62

1 year ago

2.10.63

1 year ago

2.10.64

1 year ago

2.10.65

1 year ago

2.10.66

1 year ago

2.10.67

1 year ago

2.10.68

1 year ago

2.10.2

2 years ago

2.10.10

1 year ago

2.10.11

1 year ago

2.10.12

1 year ago

2.10.9

1 year ago

2.10.7

1 year ago

2.10.8

1 year ago

2.10.5

1 year ago

2.10.6

1 year ago

2.10.3

1 year ago

2.10.4

1 year ago

2.9.35

2 years ago

2.9.38

2 years ago

2.9.39

2 years ago

2.9.36

2 years ago

2.9.37

2 years ago

2.9.41

2 years ago

2.9.42

2 years ago

2.9.40

2 years ago

2.9.43

2 years ago

2.9.18

2 years ago

2.9.19

2 years ago

2.9.12

2 years ago

2.9.13

2 years ago

2.9.10

2 years ago

2.9.11

2 years ago

2.9.16

2 years ago

2.9.17

2 years ago

2.9.14

2 years ago

2.9.15

2 years ago

2.9.20

2 years ago

2.9.29

2 years ago

2.9.23

2 years ago

2.9.21

2 years ago

2.9.22

2 years ago

2.9.28

2 years ago

2.9.25

2 years ago

2.9.26

2 years ago

2.9.30

2 years ago

2.9.31

2 years ago

2.9.34

2 years ago

2.9.32

2 years ago

2.9.33

2 years ago

2.9.0

2 years ago

2.8.1

2 years ago

2.8.0

2 years ago

2.9.9

2 years ago

2.9.2

2 years ago

2.9.1

2 years ago

2.9.4

2 years ago

2.9.3

2 years ago

2.9.6

2 years ago

2.9.5

2 years ago

2.9.7

2 years ago

2.7.0

2 years ago

2.7.2

2 years ago

2.7.1

2 years ago

2.8.3

2 years ago

2.8.2

2 years ago

2.8.5

2 years ago

2.8.4

2 years ago

2.8.7

2 years ago

2.8.6

2 years ago

2.8.8

2 years ago

2.6.19

2 years ago

2.6.15

2 years ago

2.6.16

2 years ago

2.6.17

2 years ago

2.6.18

2 years ago

2.6.11

2 years ago

2.6.12

2 years ago

2.6.13

2 years ago

2.6.14

2 years ago

2.6.22

2 years ago

2.6.20

2 years ago

2.6.21

2 years ago

2.5.43

2 years ago

2.5.44

2 years ago

2.5.45

2 years ago

2.5.46

2 years ago

2.5.40

2 years ago

2.5.41

2 years ago

2.6.10

2 years ago

2.5.42

2 years ago

2.6.1

2 years ago

2.6.0

2 years ago

2.6.3

2 years ago

2.6.2

2 years ago

2.6.5

2 years ago

2.6.4

2 years ago

2.6.7

2 years ago

2.6.6

2 years ago

2.6.9

2 years ago

2.6.8

2 years ago

2.5.36

2 years ago

2.5.37

2 years ago

2.5.38

2 years ago

2.5.39

2 years ago

2.5.33

2 years ago

2.5.34

2 years ago

2.5.35

2 years ago

2.5.29

2 years ago

2.5.25

2 years ago

2.5.26

2 years ago

2.5.28

2 years ago

2.5.21

2 years ago

2.5.22

2 years ago

2.5.23

2 years ago

2.5.24

2 years ago

2.5.20

2 years ago

2.5.32

2 years ago

2.5.30

2 years ago

2.5.31

2 years ago

2.4.5

2 years ago

2.5.6

2 years ago

2.5.8

2 years ago

2.5.7

2 years ago

2.5.9

2 years ago

2.4.7

2 years ago

2.4.6

2 years ago

2.4.9

2 years ago

2.4.8

2 years ago

2.5.14

2 years ago

2.5.15

2 years ago

2.5.16

2 years ago

2.5.17

2 years ago

2.5.10

2 years ago

2.5.11

2 years ago

2.5.12

2 years ago

2.5.13

2 years ago

2.5.0

2 years ago

2.5.2

2 years ago

2.5.1

2 years ago

2.5.4

2 years ago

2.5.3

2 years ago

2.4.3

2 years ago

2.4.2

2 years ago

2.4.0

2 years ago

2.3.5

2 years ago

2.3.0

3 years ago

2.3.2

3 years ago

2.3.1

3 years ago

2.3.3

3 years ago

2.2.9

3 years ago

2.2.5

3 years ago

2.2.4

3 years ago

2.2.7

3 years ago

2.2.6

3 years ago

2.2.8

3 years ago

2.2.3

3 years ago

2.2.1

3 years ago

2.2.2

3 years ago

2.2.0

3 years ago

2.1.25

3 years ago

2.1.23

3 years ago

2.1.24

3 years ago

2.1.22

3 years ago

2.1.20

3 years ago

2.1.19

3 years ago

2.1.16

3 years ago

2.1.17

3 years ago

2.1.14

3 years ago

2.1.15

3 years ago

2.1.13

3 years ago

2.1.9

3 years ago

2.1.12

3 years ago

2.1.10

3 years ago

2.1.11

3 years ago

2.1.7

3 years ago

2.1.4

3 years ago

2.1.3

3 years ago

2.1.6

3 years ago

2.1.5

3 years ago

2.0.3

3 years ago

2.0.2

3 years ago

2.1.2

3 years ago

2.1.1

3 years ago

2.1.0

3 years ago

2.0.1

3 years ago

2.0.0

3 years ago

1.3.19

3 years ago

1.3.18

3 years ago

1.3.13

3 years ago

1.3.14

3 years ago

1.3.11

3 years ago

1.3.12

3 years ago

1.3.17

3 years ago

1.3.15

3 years ago

1.3.16

3 years ago

1.3.10

3 years ago

1.3.9

3 years ago

1.3.7

3 years ago

1.3.6

3 years ago

1.3.8

3 years ago

1.3.4

3 years ago

1.3.3

3 years ago

1.3.2

3 years ago

1.3.1

3 years ago

1.3.0

3 years ago

1.2.28

3 years ago

1.2.24

3 years ago

1.2.25

3 years ago

1.2.23

3 years ago

1.2.22

3 years ago

1.2.20

3 years ago

1.2.21

3 years ago

1.2.18

3 years ago

1.2.19

3 years ago

1.2.16

3 years ago

1.2.17

3 years ago

1.2.15

3 years ago

1.2.12

3 years ago

1.2.13

3 years ago

1.2.11

3 years ago

1.2.10

3 years ago

1.2.9

3 years ago

1.2.8

3 years ago

1.2.7

3 years ago

1.2.6

3 years ago

1.2.5

3 years ago

1.2.4

3 years ago

1.2.3

3 years ago

1.2.2

3 years ago

1.2.1

3 years ago

1.2.0

3 years ago

1.0.2

4 years ago

1.0.1

4 years ago

1.0.0

4 years ago