1 | "use strict";
|
---|
2 |
|
---|
3 | var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
|
---|
4 | exports.__esModule = true;
|
---|
5 | exports.default = void 0;
|
---|
6 | var _ramda = require("ramda");
|
---|
7 | var _ramdaAdjunct = require("ramda-adjunct");
|
---|
8 | var _index = require("../predicates/index.cjs");
|
---|
9 | var _visitor = require("./visitor.cjs");
|
---|
10 | var _index2 = _interopRequireDefault(require("../transformers/serializers/value/index.cjs"));
|
---|
11 | class Visitor {
|
---|
12 | result;
|
---|
13 | offset;
|
---|
14 | includeRightBound;
|
---|
15 | constructor({
|
---|
16 | offset = 0,
|
---|
17 | includeRightBound = false
|
---|
18 | } = {}) {
|
---|
19 | this.result = [];
|
---|
20 | this.offset = offset;
|
---|
21 | this.includeRightBound = includeRightBound;
|
---|
22 | }
|
---|
23 | enter(element) {
|
---|
24 | if (!(0, _index.hasElementSourceMap)(element)) {
|
---|
25 | return undefined; // dive in
|
---|
26 | }
|
---|
27 | const sourceMapElement = element.getMetaProperty('sourceMap');
|
---|
28 | const charStart = (0, _index2.default)(sourceMapElement.positionStart.get(2));
|
---|
29 | const charEnd = (0, _index2.default)(sourceMapElement.positionEnd.get(2));
|
---|
30 | const isWithinOffsetRange = this.offset >= charStart && (this.offset < charEnd || this.includeRightBound && this.offset <= charEnd);
|
---|
31 | if (isWithinOffsetRange) {
|
---|
32 | this.result.push(element);
|
---|
33 | return undefined; // push to stack and dive in
|
---|
34 | }
|
---|
35 | return false; // skip entire sub-tree
|
---|
36 | }
|
---|
37 | }
|
---|
38 | // Finds the most inner node at the given offset.
|
---|
39 | // If includeRightBound is set, also finds nodes that end at the given offset.
|
---|
40 | // findAtOffset :: Number -> Element -> Element | Undefined
|
---|
41 | const findAtOffset = (options, element) => {
|
---|
42 | let offset;
|
---|
43 | let includeRightBound;
|
---|
44 | if ((0, _ramdaAdjunct.isNumber)(options)) {
|
---|
45 | offset = options;
|
---|
46 | includeRightBound = false;
|
---|
47 | } else {
|
---|
48 | offset = (0, _ramda.pathOr)(0, ['offset'], options);
|
---|
49 | includeRightBound = (0, _ramda.pathOr)(false, ['includeRightBound'], options);
|
---|
50 | }
|
---|
51 | const visitor = new Visitor({
|
---|
52 | offset,
|
---|
53 | includeRightBound
|
---|
54 | });
|
---|
55 | (0, _visitor.visit)(element, visitor);
|
---|
56 | return (0, _ramda.last)(visitor.result);
|
---|
57 | };
|
---|
58 | var _default = exports.default = findAtOffset; |
---|