findRef.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.$findRef = exports.$$findRef = void 0;
  4. const codegen_1 = require("@jsonjoy.com/util/lib/codegen");
  5. const hasOwnProperty_1 = require("@jsonjoy.com/util/lib/hasOwnProperty");
  6. const $$findRef = (path) => {
  7. if (!path.length) {
  8. return {
  9. deps: [],
  10. js: /* js */ `(function(){return function(val){return {val:val}}})`,
  11. };
  12. }
  13. let loop = '';
  14. for (let i = 0; i < path.length; i++) {
  15. const key = JSON.stringify(path[i]);
  16. loop += /* js */ `
  17. obj = val;
  18. key = ${key};
  19. if (obj instanceof Array) {
  20. var length = obj.length;
  21. if (key === '-') key = length;
  22. else {
  23. var key2 = ${~~path[i]};
  24. ${String(~~path[i]) !== String(path[i]) ? `if ('' + key2 !== key) throw new Error('INVALID_INDEX');` : ''}
  25. ${~~path[i] < 0 ? `throw new Error('INVALID_INDEX');` : ''}
  26. key = key2;
  27. }
  28. val = obj[key];
  29. } else if (typeof obj === 'object' && !!obj) {
  30. val = has(obj, key) ? obj[key] : undefined;
  31. } else throw new Error('NOT_FOUND');
  32. `;
  33. }
  34. const js = /* js */ `(function(has, path){
  35. return function(val) {
  36. var obj, key;
  37. ${loop}
  38. return {val:val, obj:obj, key:key};
  39. };
  40. })`;
  41. return {
  42. deps: [hasOwnProperty_1.hasOwnProperty, path],
  43. js,
  44. };
  45. };
  46. exports.$$findRef = $$findRef;
  47. const $findRef = (path) => (0, codegen_1.compileClosure)((0, exports.$$findRef)(path));
  48. exports.$findRef = $findRef;