@swagger-api/apidom-core 0.92.0 → 0.93.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,10 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [0.93.0](https://github.com/swagger-api/apidom/compare/v0.92.0...v0.93.0) (2024-01-23)
7
+
8
+ **Note:** Version bump only for package @swagger-api/apidom-core
9
+
6
10
  # [0.92.0](https://github.com/swagger-api/apidom/compare/v0.91.0...v0.92.0) (2024-01-12)
7
11
 
8
12
  **Note:** Version bump only for package @swagger-api/apidom-core
@@ -15,7 +15,7 @@ class SourceMap extends _minim.ArrayElement {
15
15
  return this.children.filter(item => item.classes.contains('position')).get(1);
16
16
  }
17
17
  set position(position) {
18
- if (position === null) {
18
+ if (typeof position === 'undefined') {
19
19
  return;
20
20
  }
21
21
  const start = new _minim.ArrayElement([position.start.row, position.start.column, position.start.char]);
@@ -8,6 +8,7 @@ var _stampit = _interopRequireDefault(require("stampit"));
8
8
  var _shortUniqueId = _interopRequireDefault(require("short-unique-id"));
9
9
  var _ElementIdentityError = _interopRequireDefault(require("./errors/ElementIdentityError.cjs"));
10
10
  var _index = require("../predicates/index.cjs");
11
+ // @TODO(oliwia.rogala@smartbear.com): transforming this stamp to class will break backward compatibility
11
12
  const IdentityManager = exports.IdentityManager = (0, _stampit.default)({
12
13
  props: {
13
14
  uuid: null,
@@ -1,9 +1,7 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
4
3
  exports.__esModule = true;
5
4
  exports.default = void 0;
6
- var _stampit = _interopRequireDefault(require("stampit"));
7
5
  var _ramdaAdjunct = require("ramda-adjunct");
8
6
  var _index = require("../predicates/index.cjs");
9
7
  const computeEdges = (element, edges = new WeakMap()) => {
@@ -74,18 +72,20 @@ const transcludeChildOfArrayElement = (search, replace, edges) => {
74
72
  * clone in before passing it to initializer of this stamp.
75
73
  */
76
74
 
77
- const Transcluder = _stampit.default.init(function TranscluderConstructor({
78
- element
79
- }) {
80
- let edges;
81
- this.transclude = function transclude(search, replace) {
82
- var _edges;
75
+ class Transcluder {
76
+ constructor({
77
+ element
78
+ }) {
79
+ this.element = element;
80
+ }
81
+ transclude(search, replace) {
82
+ var _this$edges;
83
83
  // shortcut 1. - replacing entire ApiDOM tree
84
- if (search === element) return replace;
84
+ if (search === this.element) return replace;
85
85
  // shortcut 2. - replacing nothing
86
- if (search === replace) return element;
87
- edges = (_edges = edges) != null ? _edges : computeEdges(element);
88
- const parent = edges.get(search);
86
+ if (search === replace) return this.element;
87
+ this.edges = (_this$edges = this.edges) != null ? _this$edges : computeEdges(this.element);
88
+ const parent = this.edges.get(search);
89
89
  if ((0, _ramdaAdjunct.isUndefined)(parent)) {
90
90
  return undefined;
91
91
  }
@@ -97,13 +97,13 @@ const Transcluder = _stampit.default.init(function TranscluderConstructor({
97
97
  */
98
98
  if ((0, _index.isObjectElement)(parent)) {
99
99
  // @ts-ignore
100
- transcludeChildOfObjectElement(search, replace, edges);
100
+ transcludeChildOfObjectElement(search, replace, this.edges);
101
101
  } else if ((0, _index.isArrayElement)(parent)) {
102
- transcludeChildOfArrayElement(search, replace, edges);
102
+ transcludeChildOfArrayElement(search, replace, this.edges);
103
103
  } else if ((0, _index.isMemberElement)(parent)) {
104
- transcludeChildOfMemberElement(search, replace, edges);
104
+ transcludeChildOfMemberElement(search, replace, this.edges);
105
105
  }
106
- return element;
107
- };
108
- });
106
+ return this.element;
107
+ }
108
+ }
109
109
  var _default = exports.default = Transcluder;
@@ -9,7 +9,7 @@ var _Transcluder = _interopRequireDefault(require("./Transcluder.cjs"));
9
9
  * clone in before passing it to this function.
10
10
  */
11
11
  const transclude = (search, replace, element) => {
12
- const transcluder = (0, _Transcluder.default)({
12
+ const transcluder = new _Transcluder.default({
13
13
  element
14
14
  });
15
15
  return transcluder.transclude(search, replace);
@@ -3,64 +3,62 @@
3
3
  var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
4
4
  exports.__esModule = true;
5
5
  exports.default = void 0;
6
- var _stampit = _interopRequireDefault(require("stampit"));
7
6
  var _visitor = require("./visitor.cjs");
8
7
  var _ephemeralArray = _interopRequireDefault(require("./ast/ephemeral-array.cjs"));
9
8
  var _ephemeralObject = _interopRequireDefault(require("./ast/ephemeral-object.cjs"));
10
9
  var _index = require("../../../predicates/index.cjs");
11
- /* eslint-disable @typescript-eslint/naming-convention */
12
- const Visitor = _stampit.default.init(function _Visitor() {
13
- const references = new WeakMap();
14
- this.BooleanElement = function _BooleanElement(element) {
15
- return element.toValue();
16
- };
17
- this.NumberElement = function _NumberElement(element) {
18
- return element.toValue();
19
- };
20
- this.StringElement = function _StringElement(element) {
21
- return element.toValue();
22
- };
23
- this.NullElement = function _NullElement() {
24
- return null;
25
- };
26
- this.ObjectElement = {
27
- enter(element) {
28
- if (references.has(element)) {
29
- return references.get(element).toReference();
10
+ /* eslint-disable class-methods-use-this */
11
+
12
+ class Visitor {
13
+ ObjectElement = {
14
+ enter: element => {
15
+ if (this.references.has(element)) {
16
+ return this.references.get(element).toReference();
30
17
  }
31
18
  const ephemeral = new _ephemeralObject.default(element.content);
32
- references.set(element, ephemeral);
19
+ this.references.set(element, ephemeral);
33
20
  return ephemeral;
34
21
  }
35
22
  };
36
- this.EphemeralObject = {
37
- leave(ephemeral) {
23
+ EphemeralObject = {
24
+ leave: ephemeral => {
38
25
  return ephemeral.toObject();
39
26
  }
40
27
  };
41
- this.MemberElement = {
42
- enter(element) {
28
+ MemberElement = {
29
+ enter: element => {
43
30
  return [element.key, element.value];
44
31
  }
45
32
  };
46
- this.ArrayElement = {
47
- enter(element) {
48
- if (references.has(element)) {
49
- return references.get(element).toReference();
33
+ ArrayElement = {
34
+ enter: element => {
35
+ if (this.references.has(element)) {
36
+ return this.references.get(element).toReference();
50
37
  }
51
38
  const ephemeral = new _ephemeralArray.default(element.content);
52
- references.set(element, ephemeral);
39
+ this.references.set(element, ephemeral);
53
40
  return ephemeral;
54
41
  }
55
42
  };
56
- this.EphemeralArray = {
57
- leave(ephemeral) {
43
+ EphemeralArray = {
44
+ leave: ephemeral => {
58
45
  return ephemeral.toArray();
59
46
  }
60
47
  };
61
- });
62
- /* eslint-enable */
63
-
48
+ references = new WeakMap();
49
+ BooleanElement(element) {
50
+ return element.toValue();
51
+ }
52
+ NumberElement(element) {
53
+ return element.toValue();
54
+ }
55
+ StringElement(element) {
56
+ return element.toValue();
57
+ }
58
+ NullElement() {
59
+ return null;
60
+ }
61
+ }
64
62
  const serializer = element => {
65
63
  if (!(0, _index.isElement)(element)) return element;
66
64
 
@@ -68,6 +66,6 @@ const serializer = element => {
68
66
  if ((0, _index.isStringElement)(element) || (0, _index.isNumberElement)(element) || (0, _index.isBooleanElement)(element) || (0, _index.isNullElement)(element)) {
69
67
  return element.toValue();
70
68
  }
71
- return (0, _visitor.visit)(element, Visitor());
69
+ return (0, _visitor.visit)(element, new Visitor());
72
70
  };
73
71
  var _default = exports.default = serializer;
@@ -3,86 +3,79 @@
3
3
  var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
4
4
  exports.__esModule = true;
5
5
  exports.default = void 0;
6
- var _stampit = _interopRequireDefault(require("stampit"));
7
6
  var _visitor = require("../../traversal/visitor.cjs");
8
7
  var _index = _interopRequireDefault(require("./value/index.cjs"));
9
- const YamlVisitor = (0, _stampit.default)({
10
- props: {
11
- result: '',
12
- indent: 0,
13
- indentChar: ' '
14
- },
15
- init({
8
+ class YamlVisitor {
9
+ static indentChar = ' ';
10
+ constructor({
16
11
  directive = false,
17
12
  indent = 0
18
13
  } = {}) {
19
14
  this.result = directive ? '%YAML 1.2\n---\n' : '';
20
15
  this.indent = indent;
21
- },
22
- methods: {
23
- NumberElement(element) {
24
- this.result += (0, _index.default)(element);
25
- },
26
- BooleanElement(element) {
27
- const value = (0, _index.default)(element);
28
- this.result += value ? 'true' : 'false';
29
- },
30
- StringElement(element) {
31
- // for simplicity and avoiding ambiguity we always wrap strings in quotes
32
- this.result += JSON.stringify((0, _index.default)(element));
33
- },
34
- NullElement() {
35
- this.result += 'null';
36
- },
37
- ArrayElement(element) {
38
- if (element.length === 0) {
39
- this.result += '[]';
40
- return false;
41
- }
42
- element.forEach(item => {
43
- const visitor = YamlVisitor({
44
- indent: this.indent + 1
45
- });
46
- const indent = this.indentChar.repeat(this.indent);
47
- (0, _visitor.visit)(item, visitor);
48
- const {
49
- result
50
- } = visitor;
51
- this.result += result.startsWith('\n') ? `\n${indent}-${result}` : `\n${indent}- ${result}`;
52
- });
16
+ }
17
+ NumberElement(element) {
18
+ this.result += (0, _index.default)(element);
19
+ }
20
+ BooleanElement(element) {
21
+ const value = (0, _index.default)(element);
22
+ this.result += value ? 'true' : 'false';
23
+ }
24
+ StringElement(element) {
25
+ // for simplicity and avoiding ambiguity we always wrap strings in quotes
26
+ this.result += JSON.stringify((0, _index.default)(element));
27
+ }
28
+ NullElement() {
29
+ this.result += 'null';
30
+ }
31
+ ArrayElement(element) {
32
+ if (element.length === 0) {
33
+ this.result += '[]';
53
34
  return false;
54
- },
55
- ObjectElement(element) {
56
- if (element.length === 0) {
57
- this.result += '{}';
58
- return false;
59
- }
60
- element.forEach((value, key) => {
61
- const keyVisitor = YamlVisitor({
62
- indent: this.indent + 1
63
- });
64
- const valueVisitor = YamlVisitor({
65
- indent: this.indent + 1
66
- });
67
- const indent = this.indentChar.repeat(this.indent);
68
- (0, _visitor.visit)(key, keyVisitor);
69
- (0, _visitor.visit)(value, valueVisitor);
70
- const {
71
- result: keyResult
72
- } = keyVisitor;
73
- const {
74
- result: valueResult
75
- } = valueVisitor;
76
- this.result += valueResult.startsWith('\n') ? `\n${indent}${keyResult}:${valueResult}` : `\n${indent}${keyResult}: ${valueResult}`;
35
+ }
36
+ element.forEach(item => {
37
+ const visitor = new YamlVisitor({
38
+ indent: this.indent + 1
77
39
  });
40
+ const indent = YamlVisitor.indentChar.repeat(this.indent);
41
+ (0, _visitor.visit)(item, visitor);
42
+ const {
43
+ result
44
+ } = visitor;
45
+ this.result += result.startsWith('\n') ? `\n${indent}-${result}` : `\n${indent}- ${result}`;
46
+ });
47
+ return false;
48
+ }
49
+ ObjectElement(element) {
50
+ if (element.length === 0) {
51
+ this.result += '{}';
78
52
  return false;
79
53
  }
54
+ element.forEach((value, key) => {
55
+ const keyVisitor = new YamlVisitor({
56
+ indent: this.indent + 1
57
+ });
58
+ const valueVisitor = new YamlVisitor({
59
+ indent: this.indent + 1
60
+ });
61
+ const indent = YamlVisitor.indentChar.repeat(this.indent);
62
+ (0, _visitor.visit)(key, keyVisitor);
63
+ (0, _visitor.visit)(value, valueVisitor);
64
+ const {
65
+ result: keyResult
66
+ } = keyVisitor;
67
+ const {
68
+ result: valueResult
69
+ } = valueVisitor;
70
+ this.result += valueResult.startsWith('\n') ? `\n${indent}${keyResult}:${valueResult}` : `\n${indent}${keyResult}: ${valueResult}`;
71
+ });
72
+ return false;
80
73
  }
81
- });
74
+ }
82
75
  const serializer = (element, {
83
76
  directive = false
84
77
  } = {}) => {
85
- const visitor = YamlVisitor({
78
+ const visitor = new YamlVisitor({
86
79
  directive
87
80
  });
88
81
  (0, _visitor.visit)(element, visitor);
@@ -1,36 +1,30 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
4
3
  exports.__esModule = true;
5
4
  exports.default = void 0;
6
- var _stampit = _interopRequireDefault(require("stampit"));
7
5
  var _visitor = require("../traversal/visitor.cjs");
8
- const SymbolicExpressionsVisitor = (0, _stampit.default)({
9
- props: {
10
- nestingLevel: 0,
11
- result: ''
12
- },
13
- methods: {
14
- enter(element) {
15
- const {
16
- element: elementName
17
- } = element;
18
- const capitalizedElementName = elementName.charAt(0).toUpperCase() + elementName.slice(1);
19
- const indent = ' '.repeat(this.nestingLevel);
20
- this.result += this.nestingLevel > 0 ? '\n' : '';
21
- this.result += `${indent}(${capitalizedElementName}Element`;
22
- this.nestingLevel += 1;
23
- },
24
- leave() {
25
- this.nestingLevel -= 1;
26
- this.result += ')';
27
- }
6
+ class SymbolicExpressionsVisitor {
7
+ result = '';
8
+ nestingLevel = 0;
9
+ enter(element) {
10
+ const {
11
+ element: elementName
12
+ } = element;
13
+ const capitalizedElementName = elementName.charAt(0).toUpperCase() + elementName.slice(1);
14
+ const indent = ' '.repeat(this.nestingLevel);
15
+ this.result += this.nestingLevel > 0 ? '\n' : '';
16
+ this.result += `${indent}(${capitalizedElementName}Element`;
17
+ this.nestingLevel += 1;
28
18
  }
29
- });
19
+ leave() {
20
+ this.nestingLevel -= 1;
21
+ this.result += ')';
22
+ }
23
+ }
30
24
 
31
25
  // transforms ApiDOM into S-expressions (Symbolic Expressions)
32
26
  const sexprs = element => {
33
- const visitor = SymbolicExpressionsVisitor();
27
+ const visitor = new SymbolicExpressionsVisitor();
34
28
  (0, _visitor.visit)(element, visitor);
35
29
  return visitor.result;
36
30
  };
@@ -6,7 +6,7 @@ var _minim = require("minim");
6
6
  var _visitor = require("./visitor.cjs");
7
7
  // finds all elements matching the predicate
8
8
  const filter = (predicate, element) => {
9
- const visitor = (0, _visitor.PredicateVisitor)({
9
+ const visitor = new _visitor.PredicateVisitor({
10
10
  predicate
11
11
  });
12
12
  (0, _visitor.visit)(element, visitor);
@@ -6,7 +6,7 @@ var _ramda = require("ramda");
6
6
  var _visitor = require("./visitor.cjs");
7
7
  // find first element that satisfies the provided predicate
8
8
  const find = (predicate, element) => {
9
- const visitor = (0, _visitor.PredicateVisitor)({
9
+ const visitor = new _visitor.PredicateVisitor({
10
10
  predicate,
11
11
  returnOnTrue: _visitor.BREAK
12
12
  });
@@ -3,44 +3,35 @@
3
3
  var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
4
4
  exports.__esModule = true;
5
5
  exports.default = void 0;
6
- var _stampit = _interopRequireDefault(require("stampit"));
7
6
  var _ramda = require("ramda");
8
7
  var _ramdaAdjunct = require("ramda-adjunct");
9
8
  var _index = require("../predicates/index.cjs");
10
9
  var _visitor = require("./visitor.cjs");
11
10
  var _index2 = _interopRequireDefault(require("../transformers/serializers/value/index.cjs"));
12
- const Visitor = (0, _stampit.default)({
13
- props: {
14
- result: [],
15
- offset: 0,
16
- includeRightBound: false
17
- },
18
- // @ts-ignore
19
- init({
20
- offset = this.offset,
21
- includeRightBound = this.includeRightBound
22
- }) {
11
+ class Visitor {
12
+ constructor({
13
+ offset = 0,
14
+ includeRightBound = false
15
+ } = {}) {
23
16
  this.result = [];
24
17
  this.offset = offset;
25
18
  this.includeRightBound = includeRightBound;
26
- },
27
- methods: {
28
- enter(element) {
29
- if (!(0, _index.hasElementSourceMap)(element)) {
30
- return undefined; // dive in
31
- }
32
- const sourceMapElement = element.getMetaProperty('sourceMap');
33
- const charStart = (0, _index2.default)(sourceMapElement.positionStart.get(2));
34
- const charEnd = (0, _index2.default)(sourceMapElement.positionEnd.get(2));
35
- const isWithinOffsetRange = this.offset >= charStart && (this.offset < charEnd || this.includeRightBound && this.offset <= charEnd);
36
- if (isWithinOffsetRange) {
37
- this.result.push(element);
38
- return undefined; // push to stack and dive in
39
- }
40
- return false; // skip entire sub-tree
19
+ }
20
+ enter(element) {
21
+ if (!(0, _index.hasElementSourceMap)(element)) {
22
+ return undefined; // dive in
23
+ }
24
+ const sourceMapElement = element.getMetaProperty('sourceMap');
25
+ const charStart = (0, _index2.default)(sourceMapElement.positionStart.get(2));
26
+ const charEnd = (0, _index2.default)(sourceMapElement.positionEnd.get(2));
27
+ const isWithinOffsetRange = this.offset >= charStart && (this.offset < charEnd || this.includeRightBound && this.offset <= charEnd);
28
+ if (isWithinOffsetRange) {
29
+ this.result.push(element);
30
+ return undefined; // push to stack and dive in
41
31
  }
32
+ return false; // skip entire sub-tree
42
33
  }
43
- });
34
+ }
44
35
  // Finds the most inner node at the given offset.
45
36
  // If includeRightBound is set, also finds nodes that end at the given offset.
46
37
  // findAtOffset :: Number -> Element -> Element | Undefined
@@ -54,7 +45,7 @@ const findAtOffset = (options, element) => {
54
45
  offset = (0, _ramda.pathOr)(0, ['offset'], options);
55
46
  includeRightBound = (0, _ramda.pathOr)(false, ['includeRightBound'], options);
56
47
  }
57
- const visitor = Visitor({
48
+ const visitor = new Visitor({
58
49
  offset,
59
50
  includeRightBound
60
51
  });
@@ -1,44 +1,32 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
4
3
  exports.__esModule = true;
5
4
  exports.default = void 0;
6
- var _stampit = _interopRequireDefault(require("stampit"));
7
5
  var _visitor = require("./visitor.cjs");
8
- /* eslint-disable no-param-reassign */
9
-
10
- const Visitor = (0, _stampit.default)({
11
- props: {
12
- parent: null,
13
- parentEdges: null
14
- },
15
- init() {
6
+ class Visitor {
7
+ constructor() {
16
8
  this.parentEdges = new WeakMap();
17
- },
18
- methods: {
19
- ObjectElement(objectElement) {
20
- this.parentEdges.set(objectElement, this.parent);
21
- this.parent = objectElement;
22
- },
23
- ArrayElement(arrayElement) {
24
- this.parentEdges.set(arrayElement, this.parent);
25
- this.parent = arrayElement;
26
- },
27
- MemberElement(memberElement) {
28
- this.parentEdges.set(memberElement, this.parent);
29
- this.parent = memberElement;
30
- },
31
- enter(element) {
32
- this.parentEdges.set(element, this.parent);
33
- }
34
9
  }
35
- });
36
-
37
- /* eslint-enable */
10
+ ObjectElement(objectElement) {
11
+ this.parentEdges.set(objectElement, this.parent);
12
+ this.parent = objectElement;
13
+ }
14
+ ArrayElement(arrayElement) {
15
+ this.parentEdges.set(arrayElement, this.parent);
16
+ this.parent = arrayElement;
17
+ }
18
+ MemberElement(memberElement) {
19
+ this.parentEdges.set(memberElement, this.parent);
20
+ this.parent = memberElement;
21
+ }
22
+ enter(element) {
23
+ this.parentEdges.set(element, this.parent);
24
+ }
25
+ }
38
26
 
39
27
  // computes upwards edges from every child to its parent
40
28
  const parents = element => {
41
- const visitor = Visitor();
29
+ const visitor = new Visitor();
42
30
  (0, _visitor.visit)(element, visitor);
43
31
  return visitor.parentEdges;
44
32
  };
@@ -1,35 +1,32 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
4
3
  exports.__esModule = true;
5
4
  exports.default = exports.CallbackVisitor = void 0;
6
- var _stampit = _interopRequireDefault(require("stampit"));
7
5
  var _ramda = require("ramda");
8
6
  var _ramdaAdjunct = require("ramda-adjunct");
9
7
  var _visitor = require("./visitor.cjs");
10
8
  var _index = require("../predicates/index.cjs");
11
- const CallbackVisitor = exports.CallbackVisitor = (0, _stampit.default)(_visitor.PredicateVisitor, {
12
- props: {
13
- callback: _ramdaAdjunct.noop
14
- },
15
- // @ts-ignore
16
- init({
17
- callback = this.callback
9
+ class CallbackVisitor extends _visitor.PredicateVisitor {
10
+ constructor({
11
+ callback = _ramdaAdjunct.noop,
12
+ ...rest
18
13
  } = {}) {
14
+ super({
15
+ ...rest
16
+ });
19
17
  this.callback = callback;
20
- },
21
- methods: {
22
- enter(element) {
23
- if (this.predicate(element)) {
24
- this.callback(element);
25
- return this.returnOnTrue;
26
- }
27
- return this.returnOnFalse;
18
+ }
19
+ enter(element) {
20
+ if (this.predicate(element)) {
21
+ this.callback(element);
22
+ return this.returnOnTrue;
28
23
  }
24
+ return this.returnOnFalse;
29
25
  }
30
- });
26
+ }
31
27
 
32
28
  // executes the callback on this element and all descendants
29
+ exports.CallbackVisitor = CallbackVisitor;
33
30
  const traverse = (options, element) => {
34
31
  let callback;
35
32
  let predicate;
@@ -40,7 +37,7 @@ const traverse = (options, element) => {
40
37
  callback = (0, _ramda.pathOr)(_ramdaAdjunct.noop, ['callback'], options);
41
38
  predicate = (0, _ramda.pathOr)(_index.isElement, ['predicate'], options);
42
39
  }
43
- const visitor = CallbackVisitor({
40
+ const visitor = new CallbackVisitor({
44
41
  callback,
45
42
  predicate
46
43
  });