1.0.2 • Published 6 years ago

mongoose-transform-field-plugin v1.0.2

Weekly downloads
3
License
MIT
Repository
github
Last release
6 years ago

mongoose-transform-field-plugin

An automatic field transformation plugin for Mongoose 5. Any transformations are registered as save, update and findOneAndUpdate middleware.

NPM link

Build Status Coverage Status Greenkeeper badge Supports Node >= 6 Supports Mongoose >= 5.0


Table of Contents

Asynchronous transformation

Direct usage

import * as bcrypt from 'bcrypt';
import * as mongoose from 'mongoose';
import {AsyncTransform, MongooseTransformFieldPlugin} from 'mongoose-transform-field-plugin';

const schema = new mongoose.Schema({
  password: String
});

const transformer: AsyncTransform<string> = (pwd: string): Promise<string> => {
  return bcrypt.hash(pwd, 12);
};

// Run as non-parallel Mongoose middleware by default
MongooseTransformFieldPlugin.transformAsync(schema, 'password', transformer);

// Run as non-parallel Mongoose middleware explicitly
MongooseTransformFieldPlugin.transformAsync(schema, 'password', false, transformer);

// Run as a parallel Mongoose middleware
MongooseTransformFieldPlugin.transformAsync(schema, 'password', true, transformer);

Schema plugin usage

import * as bcrypt from 'bcrypt';
import * as mongoose from 'mongoose';
import {AsyncTransform, MongooseTransformFieldPlugin, TransformAsyncOptions} from 'mongoose-transform-field-plugin';

const schema = new mongoose.Schema({
  password: String
});

const transform: AsyncTransform<string> = (pwd: string): Promise<string> => {
  return bcrypt.hash(pwd, 12);
};

// Run as non-parallel Mongoose middleware by default
let config: TransformAsyncOptions<string> = {
  field: 'password',
  transformer: transform
};
schema.plugin(MongooseTransformFieldPlugin.transformAsync.plugin, config);

// Run as non-parallel Mongoose middleware explicitly
config = {
  field: 'password',
  parallel: false,
  transformer: transform
};
schema.plugin(MongooseTransformFieldPlugin.transformAsync.plugin, config);

// Run as a parallel Mongoose middleware
config = {
  field: 'password',
  parallel: true,
  transformer: transform
};
schema.plugin(MongooseTransformFieldPlugin.transformAsync.plugin, config);

Normalisation

This transforms accented characters from a string, trims it and makes it lowercase before storing it in another field. Useful if you want some basic search functionality.

import * as mongoose from 'mongoose';
import {MongooseTransformFieldPlugin} from 'mongoose-transform-field-plugin';

const schema = new mongoose.Schema({
  firstname: String,
  firstname_normalised: {
    select: false,
    type: String
  },
  lastname: String,
  lastname_normalised: {
    select: false,
    type: String
  }
});

const fields = {
  firstname: 'firstname_normalised', // firstname will be normalised into the firstname_normalised field
  lastname: 'lastname_normalised' // lastname will be normalised into the lastname_normalised field
};

// Direct usage
MongooseTransformFieldPlugin.normalise(schema, fields);

// Plugin usage
schema.plugin(MongooseTransformFieldPlugin.normalise.plugin, fields);

Synchronous Transformations

You should really use schema setters instead, but this is included for completeness' sake.

import * as bcrypt from 'bcrypt';
import * as mongoose from 'mongoose';
import {MongooseTransformFieldPlugin, SyncTransform, TransformSyncOptions} from 'mongoose-transform-field-plugin';

const schema = new mongoose.Schema({
  password: String
});

const transform: SyncTransform<string> = (pwd: string): string => {
  return bcrypt.hashSync(pwd, 12);
};

// Direct usage
MongooseTransformFieldPlugin.transformSync(schema, 'password', transform);

// Plugin usage
const conf: TransformSyncOptions<string> = {
  field: 'password',
  transformer: transform
};

schema.plugin(MongooseTransformFieldPlugin.transformSync.plugin, conf);