UpdateModifiers.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. 'use strict';
  2. var $TypeError = require('es-errors/type');
  3. var callBound = require('call-bound');
  4. var hasOwn = require('hasown');
  5. var isRegExpRecord = require('../helpers/records/regexp-record');
  6. var $charAt = callBound('String.prototype.charAt');
  7. // https://262.ecma-international.org/16.0/#sec-updatemodifiers
  8. module.exports = function UpdateModifiers(rer, add, remove) {
  9. if (!isRegExpRecord(rer)) {
  10. throw new $TypeError('Assertion failed: `rer` must be a RegExp Record');
  11. }
  12. if (typeof add !== 'string') {
  13. throw new $TypeError('Assertion failed: `add` must be a string');
  14. }
  15. if (typeof remove !== 'string') {
  16. throw new $TypeError('Assertion failed: `remove` must be a string');
  17. }
  18. // 1. Assert: add and remove have no elements in common.
  19. var adds = { __proto__: null };
  20. var removes = { __proto__: null };
  21. for (var i = 0; i < add.length; i++) {
  22. var toAdd = $charAt(add, i);
  23. adds[toAdd] = true;
  24. }
  25. for (var j = 0; j < remove.length; j++) {
  26. var toRemove = $charAt(remove, j);
  27. if (hasOwn(adds, toRemove)) {
  28. throw new $TypeError('Assertion failed: `add` and `remove` have elements in common');
  29. }
  30. removes[toRemove] = true;
  31. }
  32. var ignoreCase = rer['[[IgnoreCase]]']; // step 2
  33. var multiline = rer['[[Multiline]]']; // step 3
  34. var dotAll = rer['[[DotAll]]']; // step 4
  35. var unicode = rer['[[Unicode]]']; // step 5
  36. var unicodeSets = rer['[[UnicodeSets]]']; // step 6
  37. var capturingGroupsCount = rer['[[CapturingGroupsCount]]']; // step 7
  38. if (hasOwn(removes, 'i')) {
  39. ignoreCase = false; // step 8
  40. } else if (hasOwn(adds, 'i')) {
  41. ignoreCase = true; // step 9
  42. }
  43. if (hasOwn(removes, 'm')) {
  44. multiline = false; // step 10
  45. } else if (hasOwn(adds, 'm')) {
  46. multiline = true; // step 11
  47. }
  48. if (hasOwn(removes, 's')) {
  49. dotAll = false; // step 12
  50. } else if (hasOwn(adds, 's')) {
  51. dotAll = true; // step 13
  52. }
  53. return {
  54. '[[IgnoreCase]]': !!ignoreCase,
  55. '[[Multiline]]': !!multiline,
  56. '[[DotAll]]': !!dotAll,
  57. '[[Unicode]]': !!unicode,
  58. '[[UnicodeSets]]': !!unicodeSets,
  59. '[[CapturingGroupsCount]]': capturingGroupsCount
  60. }; // step 14
  61. };