index.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. 'use strict';
  2. var forEach = require('for-each');
  3. var availableTypedArrays = require('available-typed-arrays');
  4. var callBound = require('call-bind/callBound');
  5. var gOPD = require('gopd');
  6. var $toString = callBound('Object.prototype.toString');
  7. var hasToStringTag = require('has-tostringtag/shams')();
  8. var g = typeof globalThis === 'undefined' ? global : globalThis;
  9. var typedArrays = availableTypedArrays();
  10. var $slice = callBound('String.prototype.slice');
  11. var toStrTags = {};
  12. var getPrototypeOf = Object.getPrototypeOf; // require('getprototypeof');
  13. if (hasToStringTag && gOPD && getPrototypeOf) {
  14. forEach(typedArrays, function (typedArray) {
  15. if (typeof g[typedArray] === 'function') {
  16. var arr = new g[typedArray]();
  17. if (Symbol.toStringTag in arr) {
  18. var proto = getPrototypeOf(arr);
  19. var descriptor = gOPD(proto, Symbol.toStringTag);
  20. if (!descriptor) {
  21. var superProto = getPrototypeOf(proto);
  22. descriptor = gOPD(superProto, Symbol.toStringTag);
  23. }
  24. toStrTags[typedArray] = descriptor.get;
  25. }
  26. }
  27. });
  28. }
  29. var tryTypedArrays = function tryAllTypedArrays(value) {
  30. var foundName = false;
  31. forEach(toStrTags, function (getter, typedArray) {
  32. if (!foundName) {
  33. try {
  34. var name = getter.call(value);
  35. if (name === typedArray) {
  36. foundName = name;
  37. }
  38. } catch (e) {}
  39. }
  40. });
  41. return foundName;
  42. };
  43. var isTypedArray = require('is-typed-array');
  44. module.exports = function whichTypedArray(value) {
  45. if (!isTypedArray(value)) { return false; }
  46. if (!hasToStringTag || !(Symbol.toStringTag in value)) { return $slice($toString(value), 8, -1); }
  47. return tryTypedArrays(value);
  48. };