2.66.0 • Published 2 months ago

@smartsoft001/nestjs v2.66.0

Weekly downloads
852
License
-
Repository
-
Last release
2 months ago

📦 @smartsoft001/nestjs

npm downloads

🚀 Usage

npm install @smartsoft001/nestjs

⚙️ Configuration

The library uses the SharedConfig class for authentication and permissions configuration:

Token Configuration

FieldTypeDescription
tokenConfig.secretOrPrivateKeystringSecret or private key for signing tokens
tokenConfig.expiredInnumberToken expiration time in seconds

Permissions Configuration

FieldTypeDescription
permissions.createArray<string>List of permissions for create operations
permissions.readArray<string>List of permissions for read operations
permissions.updateArray<string>List of permissions for update operations
permissions.deleteArray<string>List of permissions for delete operations
permissions.[key]Array<string>Any additional custom permissions

Types

export type PermissionType = 'create' | 'read' | 'update' | 'delete' | string;

Modules

SharedModule

The SharedModule is a dynamic NestJS module that provides shared configuration and services across the application. It offers two static methods for configuration: forFeature() and forRoot().


forFeature() Method

The forFeature() method configures the module's core functionalities:

static forFeature(config: SharedConfig): DynamicModule

Parameters:

  • config: An object of type SharedConfig containing the module's configuration.

Returns:

A DynamicModule object with the following elements:

  • Providers: SharedConfig, JwtStrategy, PermissionService
  • Exports: SharedConfig, PermissionService, JwtStrategy

Example Usage:

import { SharedModule, SharedConfig } from '@smartsoft001/nestjs';

@Module({
  imports: [
    SharedModule.forFeature({
      tokenConfig: {
        secretOrPrivateKey: 'secret_key',
        expiredIn: 3600,
      },
      permissions: {
        create: ['admin'],
        read: ['user', 'admin'],
        update: ['admin'],
        delete: ['admin'],
      },
    }),
  ],
})
export class AppModule {}

forRoot() Method

The forRoot() method extends the forFeature() configuration by adding database settings:

static forRoot(config: SharedConfig & {
  db: {
    host: string;
    port: number;
    database: string;
    username?: string;
    password?: string;
  };
}): DynamicModule

Parameters:

  • config: An extended SharedConfig object that includes additional database settings.

Returns:

A DynamicModule object that imports and exports the forFeature() configuration.

Example Usage:

import { SharedModule, SharedConfig } from '@smartsoft001/nestjs';

@Module({
  imports: [
    SharedModule.forRoot({
      tokenConfig: {
        secretOrPrivateKey: 'secret_key',
        expiredIn: 3600,
      },
      permissions: {
        create: ['admin'],
        read: ['user', 'admin'],
        update: ['admin'],
        delete: ['admin'],
      },
      db: {
        host: 'localhost',
        port: 5432,
        database: 'my_database',
        username: 'user',
        password: 'password',
      },
    }),
  ],
})
export class AppModule {}

Summary

The SharedModule provides flexible configuration for various use cases, enabling easy sharing of authorization, permissions, and database settings across the entire NestJS application.

Decorators

@User Decorator

The @User decorator is a custom parameter decorator in NestJS that simplifies retrieving the user object from an HTTP request.

Functionality

The @User decorator performs the following actions:

  • Extracts the request object (req) from the execution context.
  • Returns the req.user value, which typically contains information about the authenticated user.

Usage

The @User decorator can be used in NestJS controllers to easily access user data:

import { Controller, Get } from '@nestjs/common';

import { IUser } from '@smartsoft001/users';

import { User } from './user.decorator';

@Controller('profile')
export class ProfileController {
  @Get()
  getProfile(@User() user: IUser) {
    return user;
  }
}

Auth

After registering the authentication module, you can use JwtStrategy and PermissionService as follows:


Using JwtStrategy

JwtStrategy is automatically used by AuthGuard('jwt'). You don't need to call it directly. Instead, use it indirectly via the @UseGuards() decorator:

import { Controller, Get, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';

@Controller('secure')
@UseGuards(AuthGuard('jwt'))
export class SecureController {
  @Get()
  getSecureData() {
    return 'This is protected content';
  }
}

Using PermissionService

PermissionService can be injected into controllers or services and used directly. Here are the main usage patterns:

1. Injecting the Service

import { Injectable } from '@nestjs/common';
import { PermissionService } from './permission.service';

@Injectable()
export class SomeService {
  constructor(private permissionService: PermissionService) {}

  // ...
}

2. Validating Permissions

import { User } from './user.decorator';

@Get('admin-panel')
adminPanel(@User() user) {
  this.permissionService.valid('admin-panel', user);
  return 'Admin Panel';
}

3. Handling Errors

try {
  this.permissionService.valid('some-action', user);
  // Perform the protected action
} catch (error) {
  if (error instanceof DomainForbiddenError) {
    // Handle lack of permissions
  }
  throw error;
}

4. Using in a Custom Guard

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { PermissionService } from './permission.service';

@Injectable()
export class CustomPermissionGuard implements CanActivate {
  constructor(private permissionService: PermissionService) {}

  canActivate(context: ExecutionContext): boolean {
    const request = context.switchToHttp().getRequest();
    const user = request.user;
    const requiredPermission = 'some-permission';

    try {
      this.permissionService.valid(requiredPermission, user);
      return true;
    } catch (error) {
      return false;
    }
  }
}

5. Checking Multiple Permissions

multipleChecks(@User() user) {
  this.permissionService.valid('permission1', user);
  this.permissionService.valid('permission2', user);
  // If both checks pass, perform the action
}

Notes

  • PermissionService throws a DomainForbiddenError if the required permissions are missing. Always be prepared to handle this exception or let it be caught by a global exception filter.

Filters

AppExceptionFilter Overview

The AppExceptionFilter class implements the ExceptionFilter interface and is used for handling exceptions in a NestJS application.

Functionality

The filter intercepts all exceptions and processes them as follows:

  • For HttpException, it uses the original HTTP status and message.
  • For DomainValidationError, it sets a 400 (Bad Request) status.
  • For DomainForbiddenError, it sets a 403 (Forbidden) status.
  • For all other exceptions, it sets a 500 (Internal Server Error) status.

Logging

The filter logs exception details (stack trace or message) using Logger.error().

Response

The filter returns an HTTP response with the appropriate status code and optionally a JSON object containing error details.

Usage

To use this filter globally in a NestJS application, register it in the main module:

import { Module } from '@nestjs/common';
import { APP_FILTER } from '@nestjs/core';

import { AppExceptionFilter } from '@smartsoft001/nestjs';

@Module({
  providers: [
    {
      provide: APP_FILTER,
      useClass: AppExceptionFilter,
    },
  ],
})
export class AppModule {}

This filter ensures consistent error handling throughout the application, mapping different exception types to appropriate HTTP status codes and formatting responses accordingly.

2.66.0

2 months ago

2.65.0

2 months ago

2.64.0

4 months ago

2.62.0

4 months ago

2.61.0

5 months ago

2.60.0

5 months ago

1.1.91

2 years ago

1.1.90

2 years ago

1.1.78

2 years ago

1.1.77

2 years ago

1.1.75

2 years ago

1.1.81

2 years ago

1.1.85

2 years ago

1.1.84

2 years ago

1.1.83

2 years ago

1.1.82

2 years ago

1.1.89

2 years ago

1.1.88

2 years ago

1.1.70

2 years ago

1.1.72

2 years ago

1.1.71

2 years ago

1.1.63

2 years ago

1.1.62

2 years ago

1.1.61

2 years ago

1.1.67

2 years ago

1.1.66

2 years ago

1.1.65

2 years ago

1.1.64

2 years ago

1.1.69

2 years ago

1.1.68

2 years ago

1.1.59

2 years ago

1.1.58

2 years ago

1.1.57

2 years ago

1.1.60

2 years ago

1.1.56

2 years ago

1.1.52

2 years ago

1.1.51

2 years ago

1.1.50

2 years ago

1.1.55

2 years ago

1.1.54

2 years ago

1.1.53

2 years ago

1.1.34

3 years ago

1.1.33

3 years ago

1.1.32

3 years ago

1.1.38

2 years ago

1.1.37

3 years ago

1.1.36

3 years ago

1.1.35

3 years ago

1.1.39

2 years ago

1.1.41

2 years ago

1.1.40

2 years ago

1.1.19

3 years ago

1.1.22

3 years ago

1.1.21

3 years ago

1.1.24

3 years ago

1.1.16

3 years ago

1.1.15

3 years ago

1.1.14

3 years ago

1.1.18

3 years ago

1.1.17

3 years ago

1.1.13

3 years ago

1.0.777

3 years ago

1.0.776

3 years ago

1.1.12

3 years ago

1.1.11

3 years ago

1.1.10

3 years ago

1.1.1

3 years ago

1.1.7

3 years ago

1.1.6

3 years ago

1.1.4

3 years ago

1.0.761

3 years ago

1.0.767

3 years ago

1.0.766

3 years ago

1.0.763

3 years ago

1.0.762

3 years ago

1.0.765

3 years ago

1.0.764

3 years ago

1.0.759

3 years ago

1.0.758

3 years ago

1.0.745

3 years ago

1.0.744

3 years ago

1.0.747

3 years ago

1.0.746

3 years ago

1.0.741

3 years ago

1.0.740

3 years ago

1.0.743

3 years ago

1.0.742

3 years ago

1.0.737

3 years ago

1.0.734

3 years ago

1.0.733

3 years ago

1.0.736

3 years ago

1.0.735

3 years ago

1.0.732

3 years ago

1.0.731

3 years ago

1.0.727

3 years ago

1.0.726

3 years ago

1.0.729

3 years ago

1.0.728

3 years ago

1.0.750

3 years ago

1.0.756

3 years ago

1.0.755

3 years ago

1.0.757

3 years ago

1.0.752

3 years ago

1.0.751

3 years ago

1.0.754

3 years ago

1.0.749

3 years ago

1.0.748

3 years ago

1.0.723

3 years ago

1.0.725

3 years ago

1.0.724

3 years ago

1.0.721

3 years ago

1.0.720

3 years ago

1.0.719

3 years ago

1.0.716

3 years ago

1.0.715

3 years ago

1.0.718

3 years ago

1.0.717

3 years ago

1.0.713

3 years ago

1.0.703

3 years ago

1.0.712

3 years ago

1.0.711

3 years ago

1.0.709

3 years ago

1.0.708

3 years ago

1.0.705

3 years ago

1.0.704

3 years ago

1.0.707

3 years ago

1.0.706

3 years ago

1.0.661

3 years ago

1.0.668

3 years ago

1.0.667

3 years ago

1.0.669

3 years ago

1.0.682

3 years ago

1.0.681

3 years ago

1.0.684

3 years ago

1.0.683

3 years ago

1.0.680

3 years ago

1.0.689

3 years ago

1.0.688

3 years ago

1.0.687

3 years ago

1.0.671

3 years ago

1.0.670

3 years ago

1.0.672

3 years ago

1.0.679

3 years ago

1.0.678

3 years ago

1.0.675

3 years ago

1.0.674

3 years ago

1.0.677

3 years ago

1.0.676

3 years ago

1.0.693

3 years ago

1.0.694

3 years ago

1.0.690

3 years ago

1.0.696

3 years ago

1.0.699

3 years ago

1.0.698

3 years ago

1.0.701

3 years ago

1.0.700

3 years ago

1.0.702

3 years ago

1.0.660

4 years ago

1.0.651

4 years ago

1.0.650

4 years ago

1.0.657

4 years ago

1.0.656

4 years ago

1.0.659

4 years ago

1.0.658

4 years ago

1.0.653

4 years ago

1.0.652

4 years ago

1.0.655

4 years ago

1.0.654

4 years ago

1.0.649

4 years ago

1.0.624

4 years ago

1.0.623

4 years ago

1.0.625

4 years ago

1.0.622

4 years ago

1.0.617

4 years ago

1.0.616

4 years ago

1.0.613

4 years ago

1.0.612

4 years ago

1.0.615

4 years ago

1.0.614

4 years ago

1.0.611

4 years ago

1.0.610

4 years ago

1.0.609

4 years ago

1.0.648

4 years ago

1.0.643

4 years ago

1.0.639

4 years ago

1.0.638

4 years ago

1.0.635

4 years ago

1.0.634

4 years ago

1.0.637

4 years ago

1.0.636

4 years ago

1.0.631

4 years ago

1.0.630

4 years ago

1.0.633

4 years ago

1.0.632

4 years ago

1.0.628

4 years ago

1.0.627

4 years ago

1.0.629

4 years ago

1.0.607

4 years ago

1.0.606

4 years ago

1.0.605

4 years ago

1.0.594

4 years ago

1.0.593

4 years ago

1.0.596

4 years ago

1.0.595

4 years ago

1.0.598

4 years ago

1.0.597

4 years ago

1.0.599

4 years ago

1.0.601

4 years ago

1.0.604

4 years ago

1.0.603

4 years ago

1.0.600

4 years ago

1.0.561

4 years ago

1.0.560

4 years ago

1.0.562

4 years ago

1.0.569

4 years ago

1.0.568

4 years ago

1.0.565

4 years ago

1.0.567

4 years ago

1.0.566

4 years ago

1.0.558

4 years ago

1.0.559

4 years ago

1.0.556

4 years ago

1.0.582

4 years ago

1.0.581

4 years ago

1.0.580

4 years ago

1.0.587

4 years ago

1.0.586

4 years ago

1.0.589

4 years ago

1.0.588

4 years ago

1.0.572

4 years ago

1.0.571

4 years ago

1.0.574

4 years ago

1.0.570

4 years ago

1.0.579

4 years ago

1.0.576

4 years ago

1.0.575

4 years ago

1.0.578

4 years ago

1.0.577

4 years ago

1.0.590

4 years ago

1.0.592

4 years ago

1.0.591

4 years ago

1.0.540

4 years ago

1.0.539

4 years ago

1.0.536

4 years ago

1.0.538

4 years ago

1.0.537

4 years ago

1.0.535

4 years ago

1.0.534

4 years ago

1.0.533

4 years ago

1.0.530

4 years ago

1.0.532

4 years ago

1.0.531

4 years ago

1.0.529

4 years ago

1.0.528

4 years ago

1.0.525

4 years ago

1.0.527

4 years ago

1.0.526

4 years ago

1.0.524

4 years ago

1.0.523

4 years ago

1.0.521

4 years ago

1.0.520

4 years ago

1.0.522

4 years ago

1.0.519

4 years ago

1.0.518

4 years ago

1.0.517

4 years ago

1.0.514

4 years ago

1.0.516

4 years ago

1.0.513

4 years ago

1.0.512

4 years ago

1.0.511

4 years ago

1.0.503

4 years ago

1.0.505

4 years ago

1.0.504

4 years ago

1.0.510

4 years ago

1.0.507

4 years ago

1.0.506

4 years ago

1.0.509

4 years ago

1.0.508

4 years ago

1.0.502

4 years ago

1.0.500

4 years ago

1.0.497

4 years ago

1.0.499

4 years ago

1.0.498

4 years ago

1.0.495

4 years ago

1.0.494

4 years ago

1.0.496

4 years ago

1.0.493

4 years ago

1.0.491

4 years ago

1.0.492

4 years ago

1.0.490

4 years ago

1.0.489

4 years ago

1.0.486

4 years ago

1.0.485

4 years ago

1.0.488

4 years ago

1.0.487

4 years ago

1.0.484

4 years ago

1.0.483

4 years ago

1.0.482

4 years ago

1.0.481

4 years ago

1.0.480

4 years ago

1.0.477

4 years ago

1.0.479

4 years ago

1.0.478

4 years ago

1.0.476

4 years ago

1.0.473

4 years ago

1.0.475

4 years ago

1.0.474

4 years ago

1.0.472

4 years ago

1.0.471

4 years ago

1.0.470

4 years ago

1.0.469

4 years ago

1.0.468

4 years ago

1.0.466

4 years ago

1.0.467

4 years ago

1.0.465

4 years ago

1.0.464

4 years ago

1.0.462

4 years ago

1.0.459

4 years ago

1.0.458

4 years ago

1.0.457

4 years ago

1.0.455

4 years ago

1.0.454

4 years ago

1.0.456

4 years ago

1.0.453

4 years ago

1.0.451

4 years ago

1.0.452

4 years ago

1.0.450

4 years ago

1.0.449

4 years ago

1.0.448

4 years ago

1.0.447

4 years ago

1.0.444

4 years ago

1.0.446

4 years ago

1.0.439

4 years ago

1.0.438

4 years ago

1.0.437

4 years ago

1.0.436

4 years ago

1.0.435

4 years ago

1.0.431

4 years ago

1.0.430

4 years ago

1.0.433

4 years ago

1.0.432

4 years ago

1.0.434

4 years ago

1.0.429

4 years ago

1.0.428

4 years ago

1.0.427

4 years ago

1.0.426

4 years ago

1.0.425

4 years ago

1.0.424

4 years ago

1.0.423

4 years ago

1.0.422

4 years ago

1.0.421

4 years ago

1.0.419

4 years ago

1.0.418

4 years ago

1.0.417

4 years ago

1.0.415

4 years ago

1.0.416

4 years ago

1.0.414

4 years ago

1.0.413

4 years ago

1.0.412

4 years ago

1.0.411

4 years ago

1.0.410

4 years ago

1.0.408

4 years ago

1.0.409

4 years ago

1.0.407

4 years ago

1.0.405

4 years ago

1.0.404

4 years ago

1.0.403

4 years ago

1.0.401

4 years ago

1.0.399

4 years ago

1.0.398

4 years ago

1.0.394

4 years ago

1.0.391

4 years ago

1.0.390

4 years ago

1.0.387

4 years ago

1.0.388

4 years ago

1.0.384

4 years ago

1.0.383

4 years ago

1.0.382

4 years ago

1.0.381

4 years ago

1.0.380

4 years ago

1.0.378

4 years ago

1.0.376

4 years ago

1.0.375

4 years ago

1.0.372

4 years ago

1.0.369

4 years ago

1.0.357

4 years ago

1.0.354

4 years ago

1.0.356

4 years ago

1.0.355

4 years ago

1.0.353

4 years ago

1.0.352

4 years ago

1.0.351

4 years ago

1.0.350

4 years ago

1.0.349

4 years ago

1.0.348

4 years ago

1.0.347

4 years ago

1.0.345

4 years ago

1.0.346

4 years ago

1.0.344

4 years ago

1.0.342

4 years ago

1.0.341

4 years ago

1.0.340

4 years ago

1.0.339

4 years ago

1.0.338

4 years ago

1.0.336

4 years ago

1.0.332

4 years ago

1.0.333

4 years ago

1.0.331

4 years ago

1.0.330

4 years ago

1.0.329

4 years ago

1.0.328

4 years ago

1.0.327

4 years ago

1.0.326

4 years ago

1.0.325

4 years ago

1.0.324

4 years ago

1.0.323

4 years ago

1.0.321

4 years ago

1.0.322

4 years ago

1.0.320

4 years ago

1.0.319

4 years ago

1.0.318

4 years ago

1.0.317

4 years ago

1.0.316

4 years ago

1.0.315

4 years ago

1.0.314

4 years ago

1.0.313

4 years ago

1.0.312

4 years ago

1.0.311

4 years ago

1.0.310

4 years ago

1.0.309

4 years ago

1.0.308

4 years ago

1.0.307

4 years ago

1.0.306

4 years ago

1.0.305

4 years ago

1.0.304

4 years ago

1.0.303

4 years ago

1.0.302

4 years ago

1.0.301

4 years ago

1.0.300

4 years ago

1.0.299

4 years ago

1.0.298

4 years ago

1.0.297

4 years ago

1.0.296

4 years ago

1.0.295

4 years ago

1.0.294

4 years ago

1.0.293

4 years ago

1.0.292

4 years ago

1.0.291

4 years ago

1.0.290

4 years ago

1.0.289

4 years ago

1.0.288

4 years ago

1.0.287

4 years ago

1.0.286

4 years ago

1.0.285

4 years ago

1.0.284

4 years ago

1.0.283

4 years ago

1.0.282

4 years ago

1.0.281

4 years ago

1.0.280

4 years ago

1.0.277

4 years ago

1.0.279

4 years ago

1.0.278

4 years ago

1.0.276

4 years ago

1.0.275

4 years ago

1.0.274

4 years ago

1.0.269

4 years ago

1.0.271

4 years ago

1.0.270

4 years ago

1.0.273

4 years ago

1.0.272

4 years ago

1.0.268

4 years ago

1.0.267

4 years ago

1.0.264

4 years ago

1.0.263

4 years ago

1.0.266

4 years ago

1.0.265

4 years ago

1.0.262

4 years ago

1.0.260

4 years ago

1.0.261

4 years ago

1.0.257

4 years ago

1.0.256

4 years ago

1.0.259

4 years ago

1.0.258

4 years ago

1.0.255

4 years ago

1.0.254

4 years ago

1.0.253

4 years ago

1.0.252

4 years ago

1.0.251

4 years ago

1.0.250

4 years ago

1.0.249

4 years ago

1.0.239

4 years ago

1.0.238

4 years ago

1.0.237

4 years ago

1.0.236

4 years ago

1.0.235

4 years ago

1.0.233

4 years ago

1.0.234

4 years ago

1.0.231

4 years ago

1.0.230

4 years ago

1.0.232

4 years ago

1.0.228

4 years ago

1.0.229

4 years ago

1.0.227

4 years ago

1.0.224

4 years ago

1.0.226

4 years ago

1.0.225

4 years ago

1.0.220

4 years ago

1.0.222

4 years ago

1.0.221

4 years ago

1.0.223

4 years ago

1.0.219

4 years ago

1.0.217

4 years ago

1.0.216

4 years ago

1.0.218

4 years ago

1.0.215

4 years ago

1.0.213

4 years ago

1.0.214

4 years ago

1.0.211

4 years ago

1.0.212

4 years ago

1.0.210

4 years ago

1.0.209

4 years ago

1.0.208

4 years ago

1.0.207

4 years ago

1.0.206

4 years ago

1.0.205

4 years ago

1.0.204

4 years ago

1.0.203

4 years ago

1.0.202

4 years ago

1.0.201

4 years ago

1.0.200

4 years ago

1.0.199

4 years ago

1.0.198

4 years ago

1.0.197

4 years ago

1.0.196

4 years ago

1.0.195

4 years ago

1.0.194

4 years ago

1.0.193

4 years ago

1.0.192

4 years ago

1.0.187

4 years ago

1.0.186

4 years ago

1.0.189

4 years ago

1.0.188

4 years ago

1.0.190

4 years ago

1.0.191

4 years ago

1.0.183

4 years ago

1.0.185

4 years ago

1.0.182

4 years ago

1.0.181

4 years ago

1.0.180

4 years ago

1.0.178

4 years ago

1.0.177

4 years ago

1.0.179

4 years ago

1.0.176

4 years ago

1.0.175

4 years ago

1.0.174

4 years ago

1.0.173

4 years ago

1.0.172

4 years ago

1.0.171

4 years ago

1.0.170

4 years ago

1.0.169

4 years ago

1.0.168

4 years ago

1.0.165

4 years ago

1.0.167

4 years ago

1.0.166

4 years ago

1.0.154

4 years ago

1.0.155

4 years ago

1.0.153

4 years ago

1.0.152

4 years ago

1.0.151

4 years ago

1.0.149

4 years ago

1.0.150

4 years ago

1.0.148

4 years ago

1.0.147

4 years ago

1.0.146

4 years ago

1.0.145

4 years ago

1.0.144

4 years ago

1.0.143

4 years ago

1.0.142

4 years ago

1.0.141

4 years ago

1.0.140

4 years ago

1.0.139

4 years ago

1.0.138

4 years ago

1.0.137

4 years ago

1.0.136

4 years ago

1.0.135

4 years ago

1.0.134

4 years ago

1.0.133

4 years ago

1.0.132

5 years ago

1.0.131

5 years ago

1.0.130

5 years ago

1.0.120

5 years ago

1.0.119

5 years ago

1.0.118

5 years ago

1.0.117

5 years ago

1.0.106

5 years ago

1.0.105

5 years ago

1.0.104

5 years ago

1.0.73

5 years ago

1.0.72

5 years ago

1.0.74

5 years ago

1.0.84

5 years ago

1.0.94

5 years ago

1.0.71

5 years ago

1.0.70

5 years ago

1.0.69

5 years ago

1.0.68

5 years ago

1.0.67

5 years ago

1.0.66

5 years ago

1.0.65

5 years ago

1.0.64

5 years ago

1.0.63

5 years ago

1.0.62

5 years ago

1.0.61

5 years ago

1.0.60

5 years ago

1.0.59

5 years ago

1.0.58

5 years ago

1.0.57

5 years ago

1.0.56

5 years ago

1.0.55

5 years ago

1.0.54

5 years ago

1.0.53

5 years ago

1.0.52

5 years ago

1.0.51

5 years ago

1.0.50

5 years ago

1.0.49

5 years ago

1.0.48

5 years ago

1.0.47

5 years ago

1.0.44

5 years ago

1.0.46

5 years ago

1.0.45

5 years ago

1.0.43

5 years ago

1.0.42

5 years ago

1.0.41

5 years ago

1.0.40

5 years ago

1.0.39

5 years ago

1.0.38

5 years ago

1.0.37

5 years ago

1.0.36

5 years ago

1.0.35

5 years ago

1.0.34

5 years ago

1.0.33

5 years ago

1.0.32

5 years ago

1.0.29

5 years ago

1.0.28

5 years ago

1.0.27

5 years ago

1.0.31

5 years ago

1.0.30

5 years ago

1.0.26

5 years ago

1.0.25

5 years ago

1.0.24

5 years ago

1.0.23

5 years ago

1.0.19

5 years ago

1.0.18

5 years ago

1.0.22

5 years ago

1.0.21

5 years ago

1.0.20

5 years ago

1.0.16

5 years ago

1.0.15

5 years ago

1.0.14

5 years ago

1.0.13

5 years ago

1.0.12

5 years ago

1.0.11

5 years ago

1.0.10

5 years ago

1.0.9

5 years ago

1.0.8

5 years ago

1.0.7

5 years ago

1.0.6

5 years ago

1.0.5

5 years ago

1.0.4

5 years ago

1.0.3

5 years ago

1.0.2

5 years ago

1.0.1

5 years ago