DmitrySoshnikov / babel-plugin-transform-modern-regexp

Babel plugin for modern RegExp features in JavaScript
MIT License
81 stars 8 forks source link

Implement runtime support #3

Open DmitrySoshnikov opened 7 years ago

DmitrySoshnikov commented 7 years ago

NOTE: this is mostly for spec-compatibility; practically regexes can be used without runtime

As the comments says, a transform can accept includeRuntime option (which is currently disabled).

If the option is passed, regexes are wrapped into RegExpTree wrapper, and provide extra functionality at runtime (e.g. accessing captured named groups on matched result).

The runtime implementation already exists, we need to pull it into a separate package, which can be auto-required by the transform.

const re = new RegExp(`

  # A regular expression for date.

  (?<year>\\d{4})-    # year part of a date
  (?<month>\\d{2})-   # month part of a date
  (?<day>\\d{2})      # day part of a date

`, 'x');

const result = re.exec('2017-04-17');

console.log(result.groups.year); // 2017

Is translated into:

// Auto-require `regexp-tree-runtime`, it should be in the dependencies.

const RegExpTree = require('regexp-tree-runtime');

...

const re = new RegExpTree(/(\d{4})-(\d{2})-(\d{2})/, {
  flags: 'x',
  source: <original-source>,
  groups: {
    year: 1,
    month: 2,
    day: 3,
  },
});

const result = re.exec('2017-04-17');

console.log(result.groups.year); // 2017
mike-marcacci commented 6 years ago

Is this still the latest on this issue? Named capture groups would be a game changer for me, and I can try to find time to work on this if it's still the preferred strategy.

DmitrySoshnikov commented 6 years ago

@mike-marcacci, yes, would be great to add this, and I agree, actual usage of the groups is a game changer. We can discuss any strategy here, those described above are just an example, I'm happy to consider any alternatives you have. And of course I'll appreciate a PR.

CC @nicolo-ribaudo who was trying to add a PR to Babel, but the https://github.com/babel/babel/pull/7105 PR itself seems stuck there forever, so we can add it here.

nicolo-ribaudo commented 6 years ago

Yeah sorry, currently I'm working on decorators which are a more requested feature. I will revisit that PR after them.