├── .gitignore ├── README.md ├── index.js ├── package-lock.json ├── package.json └── test └── index.spec.js /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | node_modules/ 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Sequelize Transforms 2 | 3 | [Sequelize](https://github.com/sequelize/sequelize) plugin to add configurable attribute transforms. It allows you to 4 | define transform functions (aka filters) to run on attribute values when an instance is updated (through assignment, 5 | `set`, `build`, `create` etc.). The transform functions can be enabled and configured on attribute level. 6 | 7 | ## Installation 8 | 9 | ```sh 10 | npm install sequelize-transforms 11 | ``` 12 | 13 | ## Activation 14 | 15 | ### Globally 16 | 17 | To activate the plugin for all your models, call the plugin on your `sequelize` instance: 18 | 19 | ```js 20 | var sequelizeTransforms = require('sequelize-transforms'); 21 | 22 | sequelizeTransforms(sequelize); 23 | ``` 24 | 25 | ### Per Model 26 | 27 | To activate the plugin on specific models, call the plugin on the models: 28 | 29 | ```js 30 | var sequelizeTransforms = require('sequelize-transforms'); 31 | 32 | var Model = sequelize.define('Model', { /* model definition */ }); 33 | sequelizeTransforms(Model); 34 | ``` 35 | 36 | ## Usage 37 | 38 | To use transforms for an attribute, just add them to its definition: 39 | 40 | ```js 41 | var Model = sequelize.define('Model', { 42 | email: { 43 | type: Sequelize.STRING, 44 | lowercase: true, 45 | trim: true 46 | } 47 | }); 48 | ```` 49 | 50 | With this configuration, the `email` attribute will always be trimmed and transformed to lower case. 51 | 52 | ## Predefined Transforms 53 | 54 | The plugin comes with the following predefined transforms: 55 | 56 | * `trim`: trim value 57 | * `lowercase`: transform value to all lower case 58 | * `uppercase`: transform value to all upper case 59 | 60 | ## Custom Transforms 61 | 62 | It is possible to override predefined transforms or add your own by passing an object as the second argument: 63 | 64 | ```js 65 | sequelizeTransforms(sequelize, { 66 | trim: function(val, defintion) { 67 | return val.toString().replace(/ /g, '*'); 68 | }, 69 | append: function(val, definition) { 70 | return val.toString() + definition['append']; 71 | } 72 | }); 73 | ``` 74 | 75 | This would override the `trim` transform and add a new one called `append`. Every transform function is called with 76 | two parameters: the value to transform and the definition of the attribute being transformed. 77 | 78 | ## Notes 79 | 80 | * If more than one transform is defined on an attribute, then the order in which they are executed is unpredictable. 81 | This is generally not an issue as you should not use mutually exclusive transforms together, e.g. `lowercase` and `uppercase`. 82 | * If an attribute is updated with the `raw` option set to `true`, then the transforms will not be run. 83 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Sequelize = require('sequelize'); 4 | 5 | var defaultTransforms = { 6 | trim: function(val, definition) { 7 | return definition['trim'] && val ? val.toString().trim() : val; 8 | }, 9 | lowercase: function(val, definition) { 10 | return definition['lowercase'] && val ? val.toString().toLowerCase() : val; 11 | }, 12 | uppercase: function(val, definition) { 13 | return definition['uppercase'] && val ? val.toString().toUpperCase() : val; 14 | } 15 | }; 16 | 17 | function init(target, transforms) { 18 | if (target instanceof Sequelize.Model || Sequelize.Model.isPrototypeOf(target)) { 19 | transforms = Object.assign({}, defaultTransforms, transforms || {}); 20 | 21 | var names = Object.keys(transforms); 22 | var refresh = false; 23 | 24 | Object.keys(target.rawAttributes).forEach(function(attr) { 25 | var definition = target.rawAttributes[attr]; 26 | var localTransforms = []; 27 | 28 | names.forEach(function(name) { 29 | if (definition.hasOwnProperty(name)) { 30 | localTransforms.push(function(val) { 31 | return transforms[name](val, definition); 32 | }); 33 | } 34 | }); 35 | 36 | if (localTransforms.length) { 37 | refresh = true; 38 | 39 | var $set = definition.set || null; 40 | 41 | definition.set = function(val) { 42 | var self = this; 43 | 44 | localTransforms.forEach(function(fn) { 45 | val = fn.call(self, val); 46 | }); 47 | 48 | if ($set) 49 | return $set.call(this, val); 50 | else 51 | return this.setDataValue(attr, val); 52 | } 53 | } 54 | }); 55 | 56 | if (refresh) 57 | target.refreshAttributes(); 58 | } 59 | else { 60 | target.afterDefine(function(Model) { 61 | init(Model, transforms); 62 | }); 63 | } 64 | } 65 | 66 | module.exports = init; 67 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sequelize-transforms", 3 | "version": "1.0.2", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/geojson": { 8 | "version": "1.0.4", 9 | "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-1.0.4.tgz", 10 | "integrity": "sha512-idP+xKlqFG1egc5M52mDat/Z0VMrwY93LCd81dzW/IjeTIYTMWuzVu+fBf19QK/mX9K7jM2UNN5nzDRgM950GA==", 11 | "dev": true 12 | }, 13 | "@types/node": { 14 | "version": "8.0.33", 15 | "resolved": "https://registry.npmjs.org/@types/node/-/node-8.0.33.tgz", 16 | "integrity": "sha512-vmCdO8Bm1ExT+FWfC9sd9r4jwqM7o97gGy2WBshkkXbf/2nLAJQUrZfIhw27yVOtLUev6kSZc4cav/46KbDd8A==", 17 | "dev": true 18 | }, 19 | "balanced-match": { 20 | "version": "1.0.0", 21 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 22 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 23 | "dev": true 24 | }, 25 | "bluebird": { 26 | "version": "3.5.1", 27 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", 28 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", 29 | "dev": true 30 | }, 31 | "brace-expansion": { 32 | "version": "1.1.8", 33 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 34 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 35 | "dev": true, 36 | "requires": { 37 | "balanced-match": "1.0.0", 38 | "concat-map": "0.0.1" 39 | } 40 | }, 41 | "browser-stdout": { 42 | "version": "1.3.0", 43 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", 44 | "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", 45 | "dev": true 46 | }, 47 | "cls-bluebird": { 48 | "version": "2.0.1", 49 | "resolved": "https://registry.npmjs.org/cls-bluebird/-/cls-bluebird-2.0.1.tgz", 50 | "integrity": "sha1-wlmkgK4CwOUGE0MHuxPbMERu4uc=", 51 | "dev": true, 52 | "requires": { 53 | "is-bluebird": "1.0.2", 54 | "shimmer": "1.1.0" 55 | } 56 | }, 57 | "commander": { 58 | "version": "2.11.0", 59 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", 60 | "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", 61 | "dev": true 62 | }, 63 | "concat-map": { 64 | "version": "0.0.1", 65 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 66 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 67 | "dev": true 68 | }, 69 | "debug": { 70 | "version": "3.1.0", 71 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 72 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 73 | "dev": true, 74 | "requires": { 75 | "ms": "2.0.0" 76 | } 77 | }, 78 | "depd": { 79 | "version": "1.1.1", 80 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", 81 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", 82 | "dev": true 83 | }, 84 | "diff": { 85 | "version": "3.3.1", 86 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", 87 | "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", 88 | "dev": true 89 | }, 90 | "dottie": { 91 | "version": "2.0.0", 92 | "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.0.tgz", 93 | "integrity": "sha1-2hkZgci41xPKARXViYzzl8Lw3dA=", 94 | "dev": true 95 | }, 96 | "escape-string-regexp": { 97 | "version": "1.0.5", 98 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 99 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 100 | "dev": true 101 | }, 102 | "fs.realpath": { 103 | "version": "1.0.0", 104 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 105 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 106 | "dev": true 107 | }, 108 | "generic-pool": { 109 | "version": "3.1.8", 110 | "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.1.8.tgz", 111 | "integrity": "sha1-CYRLZUW8kXfsIYvTXUrYlMZb4nE=", 112 | "dev": true 113 | }, 114 | "glob": { 115 | "version": "7.1.2", 116 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 117 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 118 | "dev": true, 119 | "requires": { 120 | "fs.realpath": "1.0.0", 121 | "inflight": "1.0.6", 122 | "inherits": "2.0.3", 123 | "minimatch": "3.0.4", 124 | "once": "1.4.0", 125 | "path-is-absolute": "1.0.1" 126 | } 127 | }, 128 | "growl": { 129 | "version": "1.10.3", 130 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", 131 | "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", 132 | "dev": true 133 | }, 134 | "has-flag": { 135 | "version": "2.0.0", 136 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", 137 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", 138 | "dev": true 139 | }, 140 | "he": { 141 | "version": "1.1.1", 142 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", 143 | "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", 144 | "dev": true 145 | }, 146 | "inflection": { 147 | "version": "1.12.0", 148 | "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", 149 | "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=", 150 | "dev": true 151 | }, 152 | "inflight": { 153 | "version": "1.0.6", 154 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 155 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 156 | "dev": true, 157 | "requires": { 158 | "once": "1.4.0", 159 | "wrappy": "1.0.2" 160 | } 161 | }, 162 | "inherits": { 163 | "version": "2.0.3", 164 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 165 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 166 | "dev": true 167 | }, 168 | "is-bluebird": { 169 | "version": "1.0.2", 170 | "resolved": "https://registry.npmjs.org/is-bluebird/-/is-bluebird-1.0.2.tgz", 171 | "integrity": "sha1-CWQ5Bg9KpBGr7hkUOoTWpVNG1uI=", 172 | "dev": true 173 | }, 174 | "lodash": { 175 | "version": "4.17.4", 176 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 177 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", 178 | "dev": true 179 | }, 180 | "minimatch": { 181 | "version": "3.0.4", 182 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 183 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 184 | "dev": true, 185 | "requires": { 186 | "brace-expansion": "1.1.8" 187 | } 188 | }, 189 | "minimist": { 190 | "version": "0.0.8", 191 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 192 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 193 | "dev": true 194 | }, 195 | "mkdirp": { 196 | "version": "0.5.1", 197 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 198 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 199 | "dev": true, 200 | "requires": { 201 | "minimist": "0.0.8" 202 | } 203 | }, 204 | "mocha": { 205 | "version": "4.0.1", 206 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.0.1.tgz", 207 | "integrity": "sha512-evDmhkoA+cBNiQQQdSKZa2b9+W2mpLoj50367lhy+Klnx9OV8XlCIhigUnn1gaTFLQCa0kdNhEGDr0hCXOQFDw==", 208 | "dev": true, 209 | "requires": { 210 | "browser-stdout": "1.3.0", 211 | "commander": "2.11.0", 212 | "debug": "3.1.0", 213 | "diff": "3.3.1", 214 | "escape-string-regexp": "1.0.5", 215 | "glob": "7.1.2", 216 | "growl": "1.10.3", 217 | "he": "1.1.1", 218 | "mkdirp": "0.5.1", 219 | "supports-color": "4.4.0" 220 | } 221 | }, 222 | "moment": { 223 | "version": "2.18.1", 224 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz", 225 | "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=", 226 | "dev": true 227 | }, 228 | "moment-timezone": { 229 | "version": "0.5.13", 230 | "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.13.tgz", 231 | "integrity": "sha1-mc5cfYJyYusPH3AgRBd/YHRde5A=", 232 | "dev": true, 233 | "requires": { 234 | "moment": "2.18.1" 235 | } 236 | }, 237 | "ms": { 238 | "version": "2.0.0", 239 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 240 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 241 | "dev": true 242 | }, 243 | "nan": { 244 | "version": "2.7.0", 245 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", 246 | "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=", 247 | "dev": true 248 | }, 249 | "once": { 250 | "version": "1.4.0", 251 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 252 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 253 | "dev": true, 254 | "requires": { 255 | "wrappy": "1.0.2" 256 | } 257 | }, 258 | "path-is-absolute": { 259 | "version": "1.0.1", 260 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 261 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 262 | "dev": true 263 | }, 264 | "retry-as-promised": { 265 | "version": "2.3.1", 266 | "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-2.3.1.tgz", 267 | "integrity": "sha1-91BZGD+XMHccCbrR7tV1N5McvJ0=", 268 | "dev": true, 269 | "requires": { 270 | "bluebird": "3.5.1", 271 | "debug": "2.6.9" 272 | }, 273 | "dependencies": { 274 | "debug": { 275 | "version": "2.6.9", 276 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 277 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 278 | "dev": true, 279 | "requires": { 280 | "ms": "2.0.0" 281 | } 282 | } 283 | } 284 | }, 285 | "semver": { 286 | "version": "5.4.1", 287 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", 288 | "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", 289 | "dev": true 290 | }, 291 | "sequelize": { 292 | "version": "4.13.5", 293 | "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-4.13.5.tgz", 294 | "integrity": "sha512-0sOQBWYnnzP8pkmo6E4vFHIy5Ye2U3zNHcKo5HCRxdjOXs7G+uybiUd6vRh+Sj0XsBVfhwdADyjf0jmmirUWFA==", 295 | "dev": true, 296 | "requires": { 297 | "bluebird": "3.5.1", 298 | "cls-bluebird": "2.0.1", 299 | "debug": "3.1.0", 300 | "depd": "1.1.1", 301 | "dottie": "2.0.0", 302 | "generic-pool": "3.1.8", 303 | "inflection": "1.12.0", 304 | "lodash": "4.17.4", 305 | "moment": "2.18.1", 306 | "moment-timezone": "0.5.13", 307 | "retry-as-promised": "2.3.1", 308 | "semver": "5.4.1", 309 | "terraformer-wkt-parser": "1.1.2", 310 | "toposort-class": "1.0.1", 311 | "uuid": "3.1.0", 312 | "validator": "8.2.0", 313 | "wkx": "0.4.2" 314 | } 315 | }, 316 | "shimmer": { 317 | "version": "1.1.0", 318 | "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.1.0.tgz", 319 | "integrity": "sha1-l9c3cTf/u6tCVSLkKf4KqJpIizU=", 320 | "dev": true 321 | }, 322 | "sqlite3": { 323 | "version": "3.1.13", 324 | "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-3.1.13.tgz", 325 | "integrity": "sha512-JxXKPJnkZ6NuHRojq+g2WXWBt3M1G9sjZaYiHEWSTGijDM3cwju/0T2XbWqMXFmPqDgw+iB7zKQvnns4bvzXlw==", 326 | "dev": true, 327 | "requires": { 328 | "nan": "2.7.0", 329 | "node-pre-gyp": "0.6.38" 330 | }, 331 | "dependencies": { 332 | "abbrev": { 333 | "version": "1.1.1", 334 | "bundled": true, 335 | "dev": true 336 | }, 337 | "ajv": { 338 | "version": "4.11.8", 339 | "bundled": true, 340 | "dev": true, 341 | "requires": { 342 | "co": "4.6.0", 343 | "json-stable-stringify": "1.0.1" 344 | } 345 | }, 346 | "ansi-regex": { 347 | "version": "2.1.1", 348 | "bundled": true, 349 | "dev": true 350 | }, 351 | "aproba": { 352 | "version": "1.2.0", 353 | "bundled": true, 354 | "dev": true 355 | }, 356 | "are-we-there-yet": { 357 | "version": "1.1.4", 358 | "bundled": true, 359 | "dev": true, 360 | "requires": { 361 | "delegates": "1.0.0", 362 | "readable-stream": "2.3.3" 363 | } 364 | }, 365 | "asn1": { 366 | "version": "0.2.3", 367 | "bundled": true, 368 | "dev": true 369 | }, 370 | "assert-plus": { 371 | "version": "0.2.0", 372 | "bundled": true, 373 | "dev": true 374 | }, 375 | "asynckit": { 376 | "version": "0.4.0", 377 | "bundled": true, 378 | "dev": true 379 | }, 380 | "aws-sign2": { 381 | "version": "0.6.0", 382 | "bundled": true, 383 | "dev": true 384 | }, 385 | "aws4": { 386 | "version": "1.6.0", 387 | "bundled": true, 388 | "dev": true 389 | }, 390 | "balanced-match": { 391 | "version": "1.0.0", 392 | "bundled": true, 393 | "dev": true 394 | }, 395 | "bcrypt-pbkdf": { 396 | "version": "1.0.1", 397 | "bundled": true, 398 | "dev": true, 399 | "optional": true, 400 | "requires": { 401 | "tweetnacl": "0.14.5" 402 | } 403 | }, 404 | "block-stream": { 405 | "version": "0.0.9", 406 | "bundled": true, 407 | "dev": true, 408 | "requires": { 409 | "inherits": "2.0.3" 410 | } 411 | }, 412 | "boom": { 413 | "version": "2.10.1", 414 | "bundled": true, 415 | "dev": true, 416 | "requires": { 417 | "hoek": "2.16.3" 418 | } 419 | }, 420 | "brace-expansion": { 421 | "version": "1.1.8", 422 | "bundled": true, 423 | "dev": true, 424 | "requires": { 425 | "balanced-match": "1.0.0", 426 | "concat-map": "0.0.1" 427 | } 428 | }, 429 | "caseless": { 430 | "version": "0.12.0", 431 | "bundled": true, 432 | "dev": true 433 | }, 434 | "co": { 435 | "version": "4.6.0", 436 | "bundled": true, 437 | "dev": true 438 | }, 439 | "code-point-at": { 440 | "version": "1.1.0", 441 | "bundled": true, 442 | "dev": true 443 | }, 444 | "combined-stream": { 445 | "version": "1.0.5", 446 | "bundled": true, 447 | "dev": true, 448 | "requires": { 449 | "delayed-stream": "1.0.0" 450 | } 451 | }, 452 | "concat-map": { 453 | "version": "0.0.1", 454 | "bundled": true, 455 | "dev": true 456 | }, 457 | "console-control-strings": { 458 | "version": "1.1.0", 459 | "bundled": true, 460 | "dev": true 461 | }, 462 | "core-util-is": { 463 | "version": "1.0.2", 464 | "bundled": true, 465 | "dev": true 466 | }, 467 | "cryptiles": { 468 | "version": "2.0.5", 469 | "bundled": true, 470 | "dev": true, 471 | "requires": { 472 | "boom": "2.10.1" 473 | } 474 | }, 475 | "dashdash": { 476 | "version": "1.14.1", 477 | "bundled": true, 478 | "dev": true, 479 | "requires": { 480 | "assert-plus": "1.0.0" 481 | }, 482 | "dependencies": { 483 | "assert-plus": { 484 | "version": "1.0.0", 485 | "bundled": true, 486 | "dev": true 487 | } 488 | } 489 | }, 490 | "debug": { 491 | "version": "2.6.9", 492 | "bundled": true, 493 | "dev": true, 494 | "requires": { 495 | "ms": "2.0.0" 496 | } 497 | }, 498 | "deep-extend": { 499 | "version": "0.4.2", 500 | "bundled": true, 501 | "dev": true 502 | }, 503 | "delayed-stream": { 504 | "version": "1.0.0", 505 | "bundled": true, 506 | "dev": true 507 | }, 508 | "delegates": { 509 | "version": "1.0.0", 510 | "bundled": true, 511 | "dev": true 512 | }, 513 | "ecc-jsbn": { 514 | "version": "0.1.1", 515 | "bundled": true, 516 | "dev": true, 517 | "optional": true, 518 | "requires": { 519 | "jsbn": "0.1.1" 520 | } 521 | }, 522 | "extend": { 523 | "version": "3.0.1", 524 | "bundled": true, 525 | "dev": true 526 | }, 527 | "extsprintf": { 528 | "version": "1.3.0", 529 | "bundled": true, 530 | "dev": true 531 | }, 532 | "forever-agent": { 533 | "version": "0.6.1", 534 | "bundled": true, 535 | "dev": true 536 | }, 537 | "form-data": { 538 | "version": "2.1.4", 539 | "bundled": true, 540 | "dev": true, 541 | "requires": { 542 | "asynckit": "0.4.0", 543 | "combined-stream": "1.0.5", 544 | "mime-types": "2.1.17" 545 | } 546 | }, 547 | "fs.realpath": { 548 | "version": "1.0.0", 549 | "bundled": true, 550 | "dev": true 551 | }, 552 | "fstream": { 553 | "version": "1.0.11", 554 | "bundled": true, 555 | "dev": true, 556 | "requires": { 557 | "graceful-fs": "4.1.11", 558 | "inherits": "2.0.3", 559 | "mkdirp": "0.5.1", 560 | "rimraf": "2.6.2" 561 | } 562 | }, 563 | "fstream-ignore": { 564 | "version": "1.0.5", 565 | "bundled": true, 566 | "dev": true, 567 | "requires": { 568 | "fstream": "1.0.11", 569 | "inherits": "2.0.3", 570 | "minimatch": "3.0.4" 571 | } 572 | }, 573 | "gauge": { 574 | "version": "2.7.4", 575 | "bundled": true, 576 | "dev": true, 577 | "requires": { 578 | "aproba": "1.2.0", 579 | "console-control-strings": "1.1.0", 580 | "has-unicode": "2.0.1", 581 | "object-assign": "4.1.1", 582 | "signal-exit": "3.0.2", 583 | "string-width": "1.0.2", 584 | "strip-ansi": "3.0.1", 585 | "wide-align": "1.1.2" 586 | } 587 | }, 588 | "getpass": { 589 | "version": "0.1.7", 590 | "bundled": true, 591 | "dev": true, 592 | "requires": { 593 | "assert-plus": "1.0.0" 594 | }, 595 | "dependencies": { 596 | "assert-plus": { 597 | "version": "1.0.0", 598 | "bundled": true, 599 | "dev": true 600 | } 601 | } 602 | }, 603 | "glob": { 604 | "version": "7.1.2", 605 | "bundled": true, 606 | "dev": true, 607 | "requires": { 608 | "fs.realpath": "1.0.0", 609 | "inflight": "1.0.6", 610 | "inherits": "2.0.3", 611 | "minimatch": "3.0.4", 612 | "once": "1.4.0", 613 | "path-is-absolute": "1.0.1" 614 | } 615 | }, 616 | "graceful-fs": { 617 | "version": "4.1.11", 618 | "bundled": true, 619 | "dev": true 620 | }, 621 | "har-schema": { 622 | "version": "1.0.5", 623 | "bundled": true, 624 | "dev": true 625 | }, 626 | "har-validator": { 627 | "version": "4.2.1", 628 | "bundled": true, 629 | "dev": true, 630 | "requires": { 631 | "ajv": "4.11.8", 632 | "har-schema": "1.0.5" 633 | } 634 | }, 635 | "has-unicode": { 636 | "version": "2.0.1", 637 | "bundled": true, 638 | "dev": true 639 | }, 640 | "hawk": { 641 | "version": "3.1.3", 642 | "bundled": true, 643 | "dev": true, 644 | "requires": { 645 | "boom": "2.10.1", 646 | "cryptiles": "2.0.5", 647 | "hoek": "2.16.3", 648 | "sntp": "1.0.9" 649 | } 650 | }, 651 | "hoek": { 652 | "version": "2.16.3", 653 | "bundled": true, 654 | "dev": true 655 | }, 656 | "http-signature": { 657 | "version": "1.1.1", 658 | "bundled": true, 659 | "dev": true, 660 | "requires": { 661 | "assert-plus": "0.2.0", 662 | "jsprim": "1.4.1", 663 | "sshpk": "1.13.1" 664 | } 665 | }, 666 | "inflight": { 667 | "version": "1.0.6", 668 | "bundled": true, 669 | "dev": true, 670 | "requires": { 671 | "once": "1.4.0", 672 | "wrappy": "1.0.2" 673 | } 674 | }, 675 | "inherits": { 676 | "version": "2.0.3", 677 | "bundled": true, 678 | "dev": true 679 | }, 680 | "ini": { 681 | "version": "1.3.4", 682 | "bundled": true, 683 | "dev": true 684 | }, 685 | "is-fullwidth-code-point": { 686 | "version": "1.0.0", 687 | "bundled": true, 688 | "dev": true, 689 | "requires": { 690 | "number-is-nan": "1.0.1" 691 | } 692 | }, 693 | "is-typedarray": { 694 | "version": "1.0.0", 695 | "bundled": true, 696 | "dev": true 697 | }, 698 | "isarray": { 699 | "version": "1.0.0", 700 | "bundled": true, 701 | "dev": true 702 | }, 703 | "isstream": { 704 | "version": "0.1.2", 705 | "bundled": true, 706 | "dev": true 707 | }, 708 | "jsbn": { 709 | "version": "0.1.1", 710 | "bundled": true, 711 | "dev": true, 712 | "optional": true 713 | }, 714 | "json-schema": { 715 | "version": "0.2.3", 716 | "bundled": true, 717 | "dev": true 718 | }, 719 | "json-stable-stringify": { 720 | "version": "1.0.1", 721 | "bundled": true, 722 | "dev": true, 723 | "requires": { 724 | "jsonify": "0.0.0" 725 | } 726 | }, 727 | "json-stringify-safe": { 728 | "version": "5.0.1", 729 | "bundled": true, 730 | "dev": true 731 | }, 732 | "jsonify": { 733 | "version": "0.0.0", 734 | "bundled": true, 735 | "dev": true 736 | }, 737 | "jsprim": { 738 | "version": "1.4.1", 739 | "bundled": true, 740 | "dev": true, 741 | "requires": { 742 | "assert-plus": "1.0.0", 743 | "extsprintf": "1.3.0", 744 | "json-schema": "0.2.3", 745 | "verror": "1.10.0" 746 | }, 747 | "dependencies": { 748 | "assert-plus": { 749 | "version": "1.0.0", 750 | "bundled": true, 751 | "dev": true 752 | } 753 | } 754 | }, 755 | "mime-db": { 756 | "version": "1.30.0", 757 | "bundled": true, 758 | "dev": true 759 | }, 760 | "mime-types": { 761 | "version": "2.1.17", 762 | "bundled": true, 763 | "dev": true, 764 | "requires": { 765 | "mime-db": "1.30.0" 766 | } 767 | }, 768 | "minimatch": { 769 | "version": "3.0.4", 770 | "bundled": true, 771 | "dev": true, 772 | "requires": { 773 | "brace-expansion": "1.1.8" 774 | } 775 | }, 776 | "minimist": { 777 | "version": "0.0.8", 778 | "bundled": true, 779 | "dev": true 780 | }, 781 | "mkdirp": { 782 | "version": "0.5.1", 783 | "bundled": true, 784 | "dev": true, 785 | "requires": { 786 | "minimist": "0.0.8" 787 | } 788 | }, 789 | "ms": { 790 | "version": "2.0.0", 791 | "bundled": true, 792 | "dev": true 793 | }, 794 | "node-pre-gyp": { 795 | "version": "0.6.38", 796 | "bundled": true, 797 | "dev": true, 798 | "requires": { 799 | "hawk": "3.1.3", 800 | "mkdirp": "0.5.1", 801 | "nopt": "4.0.1", 802 | "npmlog": "4.1.2", 803 | "rc": "1.2.1", 804 | "request": "2.81.0", 805 | "rimraf": "2.6.2", 806 | "semver": "5.4.1", 807 | "tar": "2.2.1", 808 | "tar-pack": "3.4.0" 809 | } 810 | }, 811 | "nopt": { 812 | "version": "4.0.1", 813 | "bundled": true, 814 | "dev": true, 815 | "requires": { 816 | "abbrev": "1.1.1", 817 | "osenv": "0.1.4" 818 | } 819 | }, 820 | "npmlog": { 821 | "version": "4.1.2", 822 | "bundled": true, 823 | "dev": true, 824 | "requires": { 825 | "are-we-there-yet": "1.1.4", 826 | "console-control-strings": "1.1.0", 827 | "gauge": "2.7.4", 828 | "set-blocking": "2.0.0" 829 | } 830 | }, 831 | "number-is-nan": { 832 | "version": "1.0.1", 833 | "bundled": true, 834 | "dev": true 835 | }, 836 | "oauth-sign": { 837 | "version": "0.8.2", 838 | "bundled": true, 839 | "dev": true 840 | }, 841 | "object-assign": { 842 | "version": "4.1.1", 843 | "bundled": true, 844 | "dev": true 845 | }, 846 | "once": { 847 | "version": "1.4.0", 848 | "bundled": true, 849 | "dev": true, 850 | "requires": { 851 | "wrappy": "1.0.2" 852 | } 853 | }, 854 | "os-homedir": { 855 | "version": "1.0.2", 856 | "bundled": true, 857 | "dev": true 858 | }, 859 | "os-tmpdir": { 860 | "version": "1.0.2", 861 | "bundled": true, 862 | "dev": true 863 | }, 864 | "osenv": { 865 | "version": "0.1.4", 866 | "bundled": true, 867 | "dev": true, 868 | "requires": { 869 | "os-homedir": "1.0.2", 870 | "os-tmpdir": "1.0.2" 871 | } 872 | }, 873 | "path-is-absolute": { 874 | "version": "1.0.1", 875 | "bundled": true, 876 | "dev": true 877 | }, 878 | "performance-now": { 879 | "version": "0.2.0", 880 | "bundled": true, 881 | "dev": true 882 | }, 883 | "process-nextick-args": { 884 | "version": "1.0.7", 885 | "bundled": true, 886 | "dev": true 887 | }, 888 | "punycode": { 889 | "version": "1.4.1", 890 | "bundled": true, 891 | "dev": true 892 | }, 893 | "qs": { 894 | "version": "6.4.0", 895 | "bundled": true, 896 | "dev": true 897 | }, 898 | "rc": { 899 | "version": "1.2.1", 900 | "bundled": true, 901 | "dev": true, 902 | "requires": { 903 | "deep-extend": "0.4.2", 904 | "ini": "1.3.4", 905 | "minimist": "1.2.0", 906 | "strip-json-comments": "2.0.1" 907 | }, 908 | "dependencies": { 909 | "minimist": { 910 | "version": "1.2.0", 911 | "bundled": true, 912 | "dev": true 913 | } 914 | } 915 | }, 916 | "readable-stream": { 917 | "version": "2.3.3", 918 | "bundled": true, 919 | "dev": true, 920 | "requires": { 921 | "core-util-is": "1.0.2", 922 | "inherits": "2.0.3", 923 | "isarray": "1.0.0", 924 | "process-nextick-args": "1.0.7", 925 | "safe-buffer": "5.1.1", 926 | "string_decoder": "1.0.3", 927 | "util-deprecate": "1.0.2" 928 | } 929 | }, 930 | "request": { 931 | "version": "2.81.0", 932 | "bundled": true, 933 | "dev": true, 934 | "requires": { 935 | "aws-sign2": "0.6.0", 936 | "aws4": "1.6.0", 937 | "caseless": "0.12.0", 938 | "combined-stream": "1.0.5", 939 | "extend": "3.0.1", 940 | "forever-agent": "0.6.1", 941 | "form-data": "2.1.4", 942 | "har-validator": "4.2.1", 943 | "hawk": "3.1.3", 944 | "http-signature": "1.1.1", 945 | "is-typedarray": "1.0.0", 946 | "isstream": "0.1.2", 947 | "json-stringify-safe": "5.0.1", 948 | "mime-types": "2.1.17", 949 | "oauth-sign": "0.8.2", 950 | "performance-now": "0.2.0", 951 | "qs": "6.4.0", 952 | "safe-buffer": "5.1.1", 953 | "stringstream": "0.0.5", 954 | "tough-cookie": "2.3.3", 955 | "tunnel-agent": "0.6.0", 956 | "uuid": "3.1.0" 957 | } 958 | }, 959 | "rimraf": { 960 | "version": "2.6.2", 961 | "bundled": true, 962 | "dev": true, 963 | "requires": { 964 | "glob": "7.1.2" 965 | } 966 | }, 967 | "safe-buffer": { 968 | "version": "5.1.1", 969 | "bundled": true, 970 | "dev": true 971 | }, 972 | "semver": { 973 | "version": "5.4.1", 974 | "bundled": true, 975 | "dev": true 976 | }, 977 | "set-blocking": { 978 | "version": "2.0.0", 979 | "bundled": true, 980 | "dev": true 981 | }, 982 | "signal-exit": { 983 | "version": "3.0.2", 984 | "bundled": true, 985 | "dev": true 986 | }, 987 | "sntp": { 988 | "version": "1.0.9", 989 | "bundled": true, 990 | "dev": true, 991 | "requires": { 992 | "hoek": "2.16.3" 993 | } 994 | }, 995 | "sshpk": { 996 | "version": "1.13.1", 997 | "bundled": true, 998 | "dev": true, 999 | "requires": { 1000 | "asn1": "0.2.3", 1001 | "assert-plus": "1.0.0", 1002 | "bcrypt-pbkdf": "1.0.1", 1003 | "dashdash": "1.14.1", 1004 | "ecc-jsbn": "0.1.1", 1005 | "getpass": "0.1.7", 1006 | "jsbn": "0.1.1", 1007 | "tweetnacl": "0.14.5" 1008 | }, 1009 | "dependencies": { 1010 | "assert-plus": { 1011 | "version": "1.0.0", 1012 | "bundled": true, 1013 | "dev": true 1014 | } 1015 | } 1016 | }, 1017 | "string-width": { 1018 | "version": "1.0.2", 1019 | "bundled": true, 1020 | "dev": true, 1021 | "requires": { 1022 | "code-point-at": "1.1.0", 1023 | "is-fullwidth-code-point": "1.0.0", 1024 | "strip-ansi": "3.0.1" 1025 | } 1026 | }, 1027 | "string_decoder": { 1028 | "version": "1.0.3", 1029 | "bundled": true, 1030 | "dev": true, 1031 | "requires": { 1032 | "safe-buffer": "5.1.1" 1033 | } 1034 | }, 1035 | "stringstream": { 1036 | "version": "0.0.5", 1037 | "bundled": true, 1038 | "dev": true 1039 | }, 1040 | "strip-ansi": { 1041 | "version": "3.0.1", 1042 | "bundled": true, 1043 | "dev": true, 1044 | "requires": { 1045 | "ansi-regex": "2.1.1" 1046 | } 1047 | }, 1048 | "strip-json-comments": { 1049 | "version": "2.0.1", 1050 | "bundled": true, 1051 | "dev": true 1052 | }, 1053 | "tar": { 1054 | "version": "2.2.1", 1055 | "bundled": true, 1056 | "dev": true, 1057 | "requires": { 1058 | "block-stream": "0.0.9", 1059 | "fstream": "1.0.11", 1060 | "inherits": "2.0.3" 1061 | } 1062 | }, 1063 | "tar-pack": { 1064 | "version": "3.4.0", 1065 | "bundled": true, 1066 | "dev": true, 1067 | "requires": { 1068 | "debug": "2.6.9", 1069 | "fstream": "1.0.11", 1070 | "fstream-ignore": "1.0.5", 1071 | "once": "1.4.0", 1072 | "readable-stream": "2.3.3", 1073 | "rimraf": "2.6.2", 1074 | "tar": "2.2.1", 1075 | "uid-number": "0.0.6" 1076 | } 1077 | }, 1078 | "tough-cookie": { 1079 | "version": "2.3.3", 1080 | "bundled": true, 1081 | "dev": true, 1082 | "requires": { 1083 | "punycode": "1.4.1" 1084 | } 1085 | }, 1086 | "tunnel-agent": { 1087 | "version": "0.6.0", 1088 | "bundled": true, 1089 | "dev": true, 1090 | "requires": { 1091 | "safe-buffer": "5.1.1" 1092 | } 1093 | }, 1094 | "tweetnacl": { 1095 | "version": "0.14.5", 1096 | "bundled": true, 1097 | "dev": true, 1098 | "optional": true 1099 | }, 1100 | "uid-number": { 1101 | "version": "0.0.6", 1102 | "bundled": true, 1103 | "dev": true 1104 | }, 1105 | "util-deprecate": { 1106 | "version": "1.0.2", 1107 | "bundled": true, 1108 | "dev": true 1109 | }, 1110 | "uuid": { 1111 | "version": "3.1.0", 1112 | "bundled": true, 1113 | "dev": true 1114 | }, 1115 | "verror": { 1116 | "version": "1.10.0", 1117 | "bundled": true, 1118 | "dev": true, 1119 | "requires": { 1120 | "assert-plus": "1.0.0", 1121 | "core-util-is": "1.0.2", 1122 | "extsprintf": "1.3.0" 1123 | }, 1124 | "dependencies": { 1125 | "assert-plus": { 1126 | "version": "1.0.0", 1127 | "bundled": true, 1128 | "dev": true 1129 | } 1130 | } 1131 | }, 1132 | "wide-align": { 1133 | "version": "1.1.2", 1134 | "bundled": true, 1135 | "dev": true, 1136 | "requires": { 1137 | "string-width": "1.0.2" 1138 | } 1139 | }, 1140 | "wrappy": { 1141 | "version": "1.0.2", 1142 | "bundled": true, 1143 | "dev": true 1144 | } 1145 | } 1146 | }, 1147 | "supports-color": { 1148 | "version": "4.4.0", 1149 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", 1150 | "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", 1151 | "dev": true, 1152 | "requires": { 1153 | "has-flag": "2.0.0" 1154 | } 1155 | }, 1156 | "terraformer": { 1157 | "version": "1.0.8", 1158 | "resolved": "https://registry.npmjs.org/terraformer/-/terraformer-1.0.8.tgz", 1159 | "integrity": "sha1-UeCtiXRvzyFh3G9lqnDkI3fItZM=", 1160 | "dev": true, 1161 | "requires": { 1162 | "@types/geojson": "1.0.4" 1163 | } 1164 | }, 1165 | "terraformer-wkt-parser": { 1166 | "version": "1.1.2", 1167 | "resolved": "https://registry.npmjs.org/terraformer-wkt-parser/-/terraformer-wkt-parser-1.1.2.tgz", 1168 | "integrity": "sha1-M2oMj8gglKWv+DKI9prt7NNpvww=", 1169 | "dev": true, 1170 | "requires": { 1171 | "terraformer": "1.0.8" 1172 | } 1173 | }, 1174 | "toposort-class": { 1175 | "version": "1.0.1", 1176 | "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", 1177 | "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=", 1178 | "dev": true 1179 | }, 1180 | "uuid": { 1181 | "version": "3.1.0", 1182 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", 1183 | "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", 1184 | "dev": true 1185 | }, 1186 | "validator": { 1187 | "version": "8.2.0", 1188 | "resolved": "https://registry.npmjs.org/validator/-/validator-8.2.0.tgz", 1189 | "integrity": "sha512-Yw5wW34fSv5spzTXNkokD6S6/Oq92d8q/t14TqsS3fAiA1RYnxSFSIZ+CY3n6PGGRCq5HhJTSepQvFUS2QUDxA==", 1190 | "dev": true 1191 | }, 1192 | "wkx": { 1193 | "version": "0.4.2", 1194 | "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.4.2.tgz", 1195 | "integrity": "sha1-d201pjSlwi5lbkdEvetU+D/Szo0=", 1196 | "dev": true, 1197 | "requires": { 1198 | "@types/node": "8.0.33" 1199 | } 1200 | }, 1201 | "wrappy": { 1202 | "version": "1.0.2", 1203 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1204 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1205 | "dev": true 1206 | } 1207 | } 1208 | } 1209 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sequelize-transforms", 3 | "version": "2.0.0", 4 | "description": "Sequelize plugin to add configurable attribute transforms.", 5 | "homepage": "https://github.com/allmas-tn/sequelize-transforms#readme", 6 | "license": "MIT", 7 | "main": "index.js", 8 | "keywords": [ 9 | "sequelize", 10 | "transforms", 11 | "trim", 12 | "uppercase", 13 | "lowercase" 14 | ], 15 | "author": "Haykel Ben Jemia (http://www.allmas-tn.com)", 16 | "repository": { 17 | "type": "git", 18 | "url": "git+ssh://git@github.com/allmas-tn/sequelize-transforms.git" 19 | }, 20 | "bugs": { 21 | "url": "https://github.com/allmas-tn/sequelize-transforms/issues" 22 | }, 23 | "devDependencies": { 24 | "lodash": "^4.17.4", 25 | "mocha": "^4.0.1", 26 | "sequelize": "^4.13.5", 27 | "sqlite3": "^3.1.13" 28 | }, 29 | "scripts": { 30 | "test": "mocha --reporter spec" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /test/index.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var assert = require('assert'); 4 | var _ = require('lodash'); 5 | var Sequelize = require('sequelize'); 6 | var sequelizeTransforms = require('..'); 7 | 8 | var sequelize; 9 | var testString = ' Test String '; 10 | 11 | var modelDefinition = { 12 | noTransforms: { 13 | type: Sequelize.STRING 14 | }, 15 | trim: { 16 | type: Sequelize.STRING, 17 | trim: true 18 | }, 19 | lowercase: { 20 | type: Sequelize.STRING, 21 | lowercase: true 22 | }, 23 | uppercase: { 24 | type: Sequelize.STRING, 25 | uppercase: true 26 | }, 27 | combined: { 28 | type: Sequelize.STRING, 29 | trim: true, 30 | lowercase: true 31 | }, 32 | customSetter: { 33 | type: Sequelize.STRING, 34 | trim: true, 35 | lowercase: true, 36 | set: function(val) { 37 | return this.setDataValue('customSetter', val + '##'); 38 | } 39 | }, 40 | customTransform: { 41 | type: Sequelize.STRING, 42 | append: '(postfix)' 43 | } 44 | }; 45 | 46 | var instanceDefinition = { 47 | noTransforms: testString, 48 | trim: testString, 49 | lowercase: testString, 50 | uppercase: testString, 51 | combined: testString, 52 | customSetter: testString, 53 | customTransform: testString 54 | }; 55 | 56 | function defineModel() { 57 | // use a deep clone because sequelizeTransforms will modify the model definition by adding/replacing setters 58 | return sequelize.define('Model', _.cloneDeep(modelDefinition)); 59 | } 60 | 61 | describe('Sequelize transforms', function() { 62 | 63 | beforeEach(function() { 64 | sequelize = new Sequelize('db', 'u', 'p', {dialect: 'sqlite', operatorsAliases: false}); 65 | }); 66 | 67 | it('default transforms should not fail for null values', function() { 68 | sequelizeTransforms(sequelize); 69 | 70 | var Model = defineModel(); 71 | 72 | assert.doesNotThrow(function() { 73 | Model.build({ 74 | trim: null, 75 | lowercase: null, 76 | uppercase: null 77 | }); 78 | }); 79 | }); 80 | 81 | it('should run default transforms on configured attributes', function() { 82 | sequelizeTransforms(sequelize); 83 | 84 | var Model = defineModel(); 85 | var instance = Model.build(instanceDefinition); 86 | 87 | assert.strictEqual(instance.noTransforms, ' Test String '); 88 | assert.strictEqual(instance.trim, 'Test String'); 89 | assert.strictEqual(instance.lowercase, ' test string '); 90 | assert.strictEqual(instance.uppercase, ' TEST STRING '); 91 | assert.strictEqual(instance.combined, 'test string'); 92 | assert.strictEqual(instance.customSetter, 'test string##'); 93 | assert.strictEqual(instance.customTransform, ' Test String '); 94 | }); 95 | 96 | it('should run custom transforms', function() { 97 | sequelizeTransforms(sequelize, { 98 | trim: function(val, defintion) { 99 | return val.toString().replace(/ /g, '*'); 100 | }, 101 | append: function(val, definition) { 102 | return val.toString() + definition['append']; 103 | } 104 | }); 105 | 106 | var Model = defineModel(); 107 | var instance = Model.build(instanceDefinition); 108 | 109 | assert.strictEqual(instance.noTransforms, ' Test String '); 110 | assert.strictEqual(instance.trim, '**Test*String**'); 111 | assert.strictEqual(instance.lowercase, ' test string '); 112 | assert.strictEqual(instance.uppercase, ' TEST STRING '); 113 | assert.strictEqual(instance.combined, '**test*string**'); 114 | assert.strictEqual(instance.customSetter, '**test*string**##'); 115 | assert.strictEqual(instance.customTransform, ' Test String (postfix)'); 116 | }); 117 | 118 | it('should allow configuration on model', function() { 119 | var Model = defineModel(); 120 | 121 | var instance = Model.build(instanceDefinition); 122 | 123 | assert.strictEqual(instance.trim, ' Test String '); 124 | 125 | sequelizeTransforms(Model); 126 | instance = Model.build(instanceDefinition); 127 | 128 | assert.strictEqual(instance.trim, 'Test String'); 129 | }); 130 | 131 | }); 132 | --------------------------------------------------------------------------------