regexp-flags-detection.js 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. 'use strict';
  2. var globalThis = require('../internals/global-this');
  3. var fails = require('../internals/fails');
  4. // babel-minify and Closure Compiler transpiles RegExp('.', 'd') -> /./d and it causes SyntaxError
  5. var RegExp = globalThis.RegExp;
  6. var FLAGS_GETTER_IS_CORRECT = !fails(function () {
  7. var INDICES_SUPPORT = true;
  8. try {
  9. RegExp('.', 'd');
  10. } catch (error) {
  11. INDICES_SUPPORT = false;
  12. }
  13. var O = {};
  14. // modern V8 bug
  15. var calls = '';
  16. var expected = INDICES_SUPPORT ? 'dgimsy' : 'gimsy';
  17. var addGetter = function (key, chr) {
  18. // eslint-disable-next-line es/no-object-defineproperty -- safe
  19. Object.defineProperty(O, key, { get: function () {
  20. calls += chr;
  21. return true;
  22. } });
  23. };
  24. var pairs = {
  25. dotAll: 's',
  26. global: 'g',
  27. ignoreCase: 'i',
  28. multiline: 'm',
  29. sticky: 'y'
  30. };
  31. if (INDICES_SUPPORT) pairs.hasIndices = 'd';
  32. for (var key in pairs) addGetter(key, pairs[key]);
  33. // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
  34. var result = Object.getOwnPropertyDescriptor(RegExp.prototype, 'flags').get.call(O);
  35. return result !== expected || calls !== expected;
  36. });
  37. module.exports = { correct: FLAGS_GETTER_IS_CORRECT };