modelValues.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. // Property keys needs to be prefixed with a non-numeric character so that
  2. // they are not considered indexes when used as object keys.
  3. const PROP_KEY_PREFIX = 'k_';
  4. function values(model, args) {
  5. switch (args.length) {
  6. case 1:
  7. return values1(model, args);
  8. case 2:
  9. return values2(model, args);
  10. case 3:
  11. return values3(model, args);
  12. default:
  13. return valuesN(model, args);
  14. }
  15. }
  16. function propKey(model, props) {
  17. switch (props.length) {
  18. case 1:
  19. return propKey1(model, props);
  20. case 2:
  21. return propKey2(model, props);
  22. case 3:
  23. return propKey3(model, props);
  24. default:
  25. return propKeyN(model, props);
  26. }
  27. }
  28. function hasProps(model, props) {
  29. for (let i = 0; i < props.length; ++i) {
  30. const value = model[props[i]];
  31. if (isNullOrUndefined(value)) {
  32. return false;
  33. }
  34. }
  35. return true;
  36. }
  37. function values1(model, args) {
  38. return [model[args[0]]];
  39. }
  40. function values2(model, args) {
  41. return [model[args[0]], model[args[1]]];
  42. }
  43. function values3(model, args) {
  44. return [model[args[0]], model[args[1]], model[args[2]]];
  45. }
  46. function valuesN(model, args) {
  47. const ret = new Array(args.length);
  48. for (let i = 0, l = args.length; i < l; ++i) {
  49. ret[i] = model[args[i]];
  50. }
  51. return ret;
  52. }
  53. function propKey1(model, props) {
  54. return PROP_KEY_PREFIX + propToStr(model[props[0]]);
  55. }
  56. function propKey2(model, props) {
  57. return PROP_KEY_PREFIX + propToStr(model[props[0]]) + ',' + propToStr(model[props[1]]);
  58. }
  59. function propKey3(model, props) {
  60. return (
  61. PROP_KEY_PREFIX +
  62. propToStr(model[props[0]]) +
  63. ',' +
  64. propToStr(model[props[1]]) +
  65. ',' +
  66. propToStr(model[props[2]])
  67. );
  68. }
  69. function propKeyN(model, props) {
  70. // Needs to be `var` instead of `let` to prevent a weird optimization bailout.
  71. var key = PROP_KEY_PREFIX;
  72. for (let i = 0, l = props.length; i < l; ++i) {
  73. key += propToStr(model[props[i]]);
  74. if (i < l - 1) {
  75. key += ',';
  76. }
  77. }
  78. return key;
  79. }
  80. function propToStr(value) {
  81. if (value === null) {
  82. return 'null';
  83. } else if (value === undefined) {
  84. return 'undefined';
  85. } else if (typeof value === 'object') {
  86. return JSON.stringify(value);
  87. } else {
  88. return `${value}`;
  89. }
  90. }
  91. function isNullOrUndefined(val) {
  92. return val === null || val === undefined;
  93. }
  94. module.exports = {
  95. PROP_KEY_PREFIX,
  96. propToStr,
  97. values,
  98. hasProps,
  99. propKey
  100. };