github.com/nektos/act@v0.2.63/pkg/runner/testdata/actions/node12/node_modules/webidl-conversions/lib/index.js (about)

     1  "use strict";
     2  
     3  var conversions = {};
     4  module.exports = conversions;
     5  
     6  function sign(x) {
     7      return x < 0 ? -1 : 1;
     8  }
     9  
    10  function evenRound(x) {
    11      // Round x to the nearest integer, choosing the even integer if it lies halfway between two.
    12      if ((x % 1) === 0.5 && (x & 1) === 0) { // [even number].5; round down (i.e. floor)
    13          return Math.floor(x);
    14      } else {
    15          return Math.round(x);
    16      }
    17  }
    18  
    19  function createNumberConversion(bitLength, typeOpts) {
    20      if (!typeOpts.unsigned) {
    21          --bitLength;
    22      }
    23      const lowerBound = typeOpts.unsigned ? 0 : -Math.pow(2, bitLength);
    24      const upperBound = Math.pow(2, bitLength) - 1;
    25  
    26      const moduloVal = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength) : Math.pow(2, bitLength);
    27      const moduloBound = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength - 1) : Math.pow(2, bitLength - 1);
    28  
    29      return function(V, opts) {
    30          if (!opts) opts = {};
    31  
    32          let x = +V;
    33  
    34          if (opts.enforceRange) {
    35              if (!Number.isFinite(x)) {
    36                  throw new TypeError("Argument is not a finite number");
    37              }
    38  
    39              x = sign(x) * Math.floor(Math.abs(x));
    40              if (x < lowerBound || x > upperBound) {
    41                  throw new TypeError("Argument is not in byte range");
    42              }
    43  
    44              return x;
    45          }
    46  
    47          if (!isNaN(x) && opts.clamp) {
    48              x = evenRound(x);
    49  
    50              if (x < lowerBound) x = lowerBound;
    51              if (x > upperBound) x = upperBound;
    52              return x;
    53          }
    54  
    55          if (!Number.isFinite(x) || x === 0) {
    56              return 0;
    57          }
    58  
    59          x = sign(x) * Math.floor(Math.abs(x));
    60          x = x % moduloVal;
    61  
    62          if (!typeOpts.unsigned && x >= moduloBound) {
    63              return x - moduloVal;
    64          } else if (typeOpts.unsigned) {
    65              if (x < 0) {
    66                x += moduloVal;
    67              } else if (x === -0) { // don't return negative zero
    68                return 0;
    69              }
    70          }
    71  
    72          return x;
    73      }
    74  }
    75  
    76  conversions["void"] = function () {
    77      return undefined;
    78  };
    79  
    80  conversions["boolean"] = function (val) {
    81      return !!val;
    82  };
    83  
    84  conversions["byte"] = createNumberConversion(8, { unsigned: false });
    85  conversions["octet"] = createNumberConversion(8, { unsigned: true });
    86  
    87  conversions["short"] = createNumberConversion(16, { unsigned: false });
    88  conversions["unsigned short"] = createNumberConversion(16, { unsigned: true });
    89  
    90  conversions["long"] = createNumberConversion(32, { unsigned: false });
    91  conversions["unsigned long"] = createNumberConversion(32, { unsigned: true });
    92  
    93  conversions["long long"] = createNumberConversion(32, { unsigned: false, moduloBitLength: 64 });
    94  conversions["unsigned long long"] = createNumberConversion(32, { unsigned: true, moduloBitLength: 64 });
    95  
    96  conversions["double"] = function (V) {
    97      const x = +V;
    98  
    99      if (!Number.isFinite(x)) {
   100          throw new TypeError("Argument is not a finite floating-point value");
   101      }
   102  
   103      return x;
   104  };
   105  
   106  conversions["unrestricted double"] = function (V) {
   107      const x = +V;
   108  
   109      if (isNaN(x)) {
   110          throw new TypeError("Argument is NaN");
   111      }
   112  
   113      return x;
   114  };
   115  
   116  // not quite valid, but good enough for JS
   117  conversions["float"] = conversions["double"];
   118  conversions["unrestricted float"] = conversions["unrestricted double"];
   119  
   120  conversions["DOMString"] = function (V, opts) {
   121      if (!opts) opts = {};
   122  
   123      if (opts.treatNullAsEmptyString && V === null) {
   124          return "";
   125      }
   126  
   127      return String(V);
   128  };
   129  
   130  conversions["ByteString"] = function (V, opts) {
   131      const x = String(V);
   132      let c = undefined;
   133      for (let i = 0; (c = x.codePointAt(i)) !== undefined; ++i) {
   134          if (c > 255) {
   135              throw new TypeError("Argument is not a valid bytestring");
   136          }
   137      }
   138  
   139      return x;
   140  };
   141  
   142  conversions["USVString"] = function (V) {
   143      const S = String(V);
   144      const n = S.length;
   145      const U = [];
   146      for (let i = 0; i < n; ++i) {
   147          const c = S.charCodeAt(i);
   148          if (c < 0xD800 || c > 0xDFFF) {
   149              U.push(String.fromCodePoint(c));
   150          } else if (0xDC00 <= c && c <= 0xDFFF) {
   151              U.push(String.fromCodePoint(0xFFFD));
   152          } else {
   153              if (i === n - 1) {
   154                  U.push(String.fromCodePoint(0xFFFD));
   155              } else {
   156                  const d = S.charCodeAt(i + 1);
   157                  if (0xDC00 <= d && d <= 0xDFFF) {
   158                      const a = c & 0x3FF;
   159                      const b = d & 0x3FF;
   160                      U.push(String.fromCodePoint((2 << 15) + (2 << 9) * a + b));
   161                      ++i;
   162                  } else {
   163                      U.push(String.fromCodePoint(0xFFFD));
   164                  }
   165              }
   166          }
   167      }
   168  
   169      return U.join('');
   170  };
   171  
   172  conversions["Date"] = function (V, opts) {
   173      if (!(V instanceof Date)) {
   174          throw new TypeError("Argument is not a Date object");
   175      }
   176      if (isNaN(V)) {
   177          return undefined;
   178      }
   179  
   180      return V;
   181  };
   182  
   183  conversions["RegExp"] = function (V, opts) {
   184      if (!(V instanceof RegExp)) {
   185          V = new RegExp(V);
   186      }
   187  
   188      return V;
   189  };