modelClone.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. const { isObject, cloneDeep } = require('../utils/objectUtils');
  2. const { hiddenProps } = require('./modelUtils');
  3. const { defineNonEnumerableProperty } = require('./modelUtils');
  4. function clone(model, shallow, stripInternal) {
  5. let clone = null;
  6. const omitFromJson = model.$omitFromJson();
  7. const omitFromDatabaseJson = model.$omitFromDatabaseJson();
  8. if (!shallow && !stripInternal) {
  9. clone = cloneSimple(model);
  10. } else {
  11. clone = cloneWithOpt(model, shallow, stripInternal);
  12. }
  13. if (omitFromJson) {
  14. clone.$omitFromJson(omitFromJson);
  15. }
  16. if (omitFromDatabaseJson) {
  17. clone.$omitFromDatabaseJson(omitFromDatabaseJson);
  18. }
  19. clone = copyHiddenProps(model, clone);
  20. return clone;
  21. }
  22. function cloneSimple(model) {
  23. const clone = new model.constructor();
  24. const keys = Object.keys(model);
  25. for (let i = 0, l = keys.length; i < l; ++i) {
  26. const key = keys[i];
  27. const value = model[key];
  28. if (isObject(value)) {
  29. clone[key] = cloneObject(value);
  30. } else {
  31. clone[key] = value;
  32. }
  33. }
  34. return clone;
  35. }
  36. function cloneWithOpt(model, shallow, stripInternal) {
  37. const clone = new model.constructor();
  38. const keys = Object.keys(model);
  39. const relations = model.constructor.getRelations();
  40. for (let i = 0, l = keys.length; i < l; ++i) {
  41. const key = keys[i];
  42. const value = model[key];
  43. if ((shallow && key in relations) || (stripInternal && key[0] === '$')) {
  44. continue;
  45. }
  46. if (isObject(value)) {
  47. clone[key] = cloneObject(value);
  48. } else {
  49. clone[key] = value;
  50. }
  51. }
  52. return clone;
  53. }
  54. function cloneObject(value) {
  55. if (Array.isArray(value)) {
  56. return cloneArray(value);
  57. } else if (value.$isObjectionModel) {
  58. return clone(value, false, false);
  59. } else if (Buffer.isBuffer(value)) {
  60. return new Buffer(value);
  61. } else {
  62. return cloneDeep(value);
  63. }
  64. }
  65. function cloneArray(value) {
  66. const ret = new Array(value.length);
  67. for (let i = 0, l = ret.length; i < l; ++i) {
  68. const item = value[i];
  69. if (isObject(item)) {
  70. ret[i] = cloneObject(item);
  71. } else {
  72. ret[i] = item;
  73. }
  74. }
  75. return ret;
  76. }
  77. function copyHiddenProps(model, clone) {
  78. for (let i = 0, l = hiddenProps.length; i < l; ++i) {
  79. const prop = hiddenProps[i];
  80. if (model.hasOwnProperty(prop)) {
  81. defineNonEnumerableProperty(clone, prop, model[prop]);
  82. }
  83. }
  84. return clone;
  85. }
  86. module.exports = {
  87. clone
  88. };