index.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. 'use strict';
  2. var forEach = require('for-each');
  3. var availableTypedArrays = require('available-typed-arrays');
  4. var callBind = require('call-bind');
  5. var callBound = require('call-bind/callBound');
  6. var gOPD = require('gopd');
  7. var $toString = callBound('Object.prototype.toString');
  8. var hasToStringTag = require('has-tostringtag/shams')();
  9. var g = typeof globalThis === 'undefined' ? global : globalThis;
  10. var typedArrays = availableTypedArrays();
  11. var $slice = callBound('String.prototype.slice');
  12. var getPrototypeOf = Object.getPrototypeOf; // require('getprototypeof');
  13. var $indexOf = callBound('Array.prototype.indexOf', true) || function indexOf(array, value) {
  14. for (var i = 0; i < array.length; i += 1) {
  15. if (array[i] === value) {
  16. return i;
  17. }
  18. }
  19. return -1;
  20. };
  21. var cache = { __proto__: null };
  22. if (hasToStringTag && gOPD && getPrototypeOf) {
  23. forEach(typedArrays, function (typedArray) {
  24. var arr = new g[typedArray]();
  25. if (Symbol.toStringTag in arr) {
  26. var proto = getPrototypeOf(arr);
  27. var descriptor = gOPD(proto, Symbol.toStringTag);
  28. if (!descriptor) {
  29. var superProto = getPrototypeOf(proto);
  30. descriptor = gOPD(superProto, Symbol.toStringTag);
  31. }
  32. cache['$' + typedArray] = callBind(descriptor.get);
  33. }
  34. });
  35. } else {
  36. forEach(typedArrays, function (typedArray) {
  37. var arr = new g[typedArray]();
  38. var fn = arr.slice || arr.set;
  39. if (fn) {
  40. cache['$' + typedArray] = callBind(fn);
  41. }
  42. });
  43. }
  44. var tryTypedArrays = function tryAllTypedArrays(value) {
  45. var found = false;
  46. forEach(cache, function (getter, typedArray) {
  47. if (!found) {
  48. try {
  49. if ('$' + getter(value) === typedArray) {
  50. found = $slice(typedArray, 1);
  51. }
  52. } catch (e) { /**/ }
  53. }
  54. });
  55. return found;
  56. };
  57. var trySlices = function tryAllSlices(value) {
  58. var found = false;
  59. forEach(cache, function (getter, name) {
  60. if (!found) {
  61. try {
  62. getter(value);
  63. found = $slice(name, 1);
  64. } catch (e) { /**/ }
  65. }
  66. });
  67. return found;
  68. };
  69. module.exports = function whichTypedArray(value) {
  70. if (!value || typeof value !== 'object') { return false; }
  71. if (!hasToStringTag) {
  72. var tag = $slice($toString(value), 8, -1);
  73. if ($indexOf(typedArrays, tag) > -1) {
  74. return tag;
  75. }
  76. if (tag !== 'Object') {
  77. return false;
  78. }
  79. // node < 0.6 hits here on real Typed Arrays
  80. return trySlices(value);
  81. }
  82. if (!gOPD) { return null; } // unknown engine
  83. return tryTypedArrays(value);
  84. };