@swagger-api/apidom-parser-adapter-yaml-1-2 1.8.0 → 1.10.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 +12 -0
- package/dist/apidom-parser-adapter-yaml-1-2.browser.js +33 -11
- package/dist/apidom-parser-adapter-yaml-1-2.browser.min.js +1 -1
- package/package.json +5 -5
- package/src/adapter-browser.cjs +18 -10
- package/src/adapter-browser.mjs +18 -10
- package/src/adapter-node.cjs +10 -4
- package/src/adapter-node.mjs +10 -4
- package/src/lexical-analysis/analyze.cjs +23 -3
- package/src/lexical-analysis/analyze.mjs +23 -3
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@swagger-api/apidom-parser-adapter-yaml-1-2",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.10.0",
|
|
4
4
|
"description": "Parser adapter for parsing YAML documents into base namespace.",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public",
|
|
@@ -51,9 +51,9 @@
|
|
|
51
51
|
"license": "Apache-2.0",
|
|
52
52
|
"dependencies": {
|
|
53
53
|
"@babel/runtime-corejs3": "^7.26.10",
|
|
54
|
-
"@swagger-api/apidom-ast": "^1.
|
|
55
|
-
"@swagger-api/apidom-core": "^1.
|
|
56
|
-
"@swagger-api/apidom-error": "^1.
|
|
54
|
+
"@swagger-api/apidom-ast": "^1.10.0",
|
|
55
|
+
"@swagger-api/apidom-core": "^1.10.0",
|
|
56
|
+
"@swagger-api/apidom-error": "^1.10.0",
|
|
57
57
|
"@tree-sitter-grammars/tree-sitter-yaml": "=0.7.1",
|
|
58
58
|
"@types/ramda": "~0.30.0",
|
|
59
59
|
"ramda": "~0.30.0",
|
|
@@ -75,5 +75,5 @@
|
|
|
75
75
|
"README.md",
|
|
76
76
|
"CHANGELOG.md"
|
|
77
77
|
],
|
|
78
|
-
"gitHead": "
|
|
78
|
+
"gitHead": "c72e92fc541b7df2b92335a0f2df147eb7b9b945"
|
|
79
79
|
}
|
package/src/adapter-browser.cjs
CHANGED
|
@@ -14,13 +14,16 @@ exports.namespace = _adapter.namespace;
|
|
|
14
14
|
* @public
|
|
15
15
|
*/
|
|
16
16
|
const detect = async source => {
|
|
17
|
+
let cst = null;
|
|
17
18
|
try {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
cst.delete();
|
|
21
|
-
return isError;
|
|
19
|
+
cst = await (0, _browser.default)(source);
|
|
20
|
+
return !cst.rootNode.isError;
|
|
22
21
|
} catch {
|
|
23
22
|
return false;
|
|
23
|
+
} finally {
|
|
24
|
+
if (cst !== null) {
|
|
25
|
+
cst.delete();
|
|
26
|
+
}
|
|
24
27
|
}
|
|
25
28
|
};
|
|
26
29
|
|
|
@@ -38,11 +41,16 @@ exports.detect = detect;
|
|
|
38
41
|
const parse = async (source, {
|
|
39
42
|
sourceMap = false
|
|
40
43
|
} = {}) => {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
let cst = null;
|
|
45
|
+
try {
|
|
46
|
+
cst = await (0, _browser.default)(source);
|
|
47
|
+
return (0, _index.default)(cst, {
|
|
48
|
+
sourceMap
|
|
49
|
+
});
|
|
50
|
+
} finally {
|
|
51
|
+
if (cst !== null) {
|
|
52
|
+
cst.delete();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
47
55
|
};
|
|
48
56
|
exports.parse = parse;
|
package/src/adapter-browser.mjs
CHANGED
|
@@ -7,13 +7,16 @@ export { lexicalAnalysis, syntacticAnalysis };
|
|
|
7
7
|
* @public
|
|
8
8
|
*/
|
|
9
9
|
export const detect = async source => {
|
|
10
|
+
let cst = null;
|
|
10
11
|
try {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
cst.delete();
|
|
14
|
-
return isError;
|
|
12
|
+
cst = await lexicalAnalysis(source);
|
|
13
|
+
return !cst.rootNode.isError;
|
|
15
14
|
} catch {
|
|
16
15
|
return false;
|
|
16
|
+
} finally {
|
|
17
|
+
if (cst !== null) {
|
|
18
|
+
cst.delete();
|
|
19
|
+
}
|
|
17
20
|
}
|
|
18
21
|
};
|
|
19
22
|
|
|
@@ -31,10 +34,15 @@ export const detect = async source => {
|
|
|
31
34
|
export const parse = async (source, {
|
|
32
35
|
sourceMap = false
|
|
33
36
|
} = {}) => {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
let cst = null;
|
|
38
|
+
try {
|
|
39
|
+
cst = await lexicalAnalysis(source);
|
|
40
|
+
return syntacticAnalysis(cst, {
|
|
41
|
+
sourceMap
|
|
42
|
+
});
|
|
43
|
+
} finally {
|
|
44
|
+
if (cst !== null) {
|
|
45
|
+
cst.delete();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
40
48
|
};
|
package/src/adapter-node.cjs
CHANGED
|
@@ -14,11 +14,13 @@ exports.namespace = _adapter.namespace;
|
|
|
14
14
|
* @public
|
|
15
15
|
*/
|
|
16
16
|
const detect = async source => {
|
|
17
|
+
const cst = await (0, _node.default)(source);
|
|
17
18
|
try {
|
|
18
|
-
const cst = await (0, _node.default)(source);
|
|
19
19
|
return !cst.rootNode.isError;
|
|
20
20
|
} catch {
|
|
21
21
|
return false;
|
|
22
|
+
} finally {
|
|
23
|
+
cst.delete();
|
|
22
24
|
}
|
|
23
25
|
};
|
|
24
26
|
|
|
@@ -37,8 +39,12 @@ const parse = async (source, {
|
|
|
37
39
|
sourceMap = false
|
|
38
40
|
} = {}) => {
|
|
39
41
|
const cst = await (0, _node.default)(source);
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
try {
|
|
43
|
+
return (0, _index.default)(cst, {
|
|
44
|
+
sourceMap
|
|
45
|
+
});
|
|
46
|
+
} finally {
|
|
47
|
+
cst.delete();
|
|
48
|
+
}
|
|
43
49
|
};
|
|
44
50
|
exports.parse = parse;
|
package/src/adapter-node.mjs
CHANGED
|
@@ -7,11 +7,13 @@ export { lexicalAnalysis, syntacticAnalysis };
|
|
|
7
7
|
* @public
|
|
8
8
|
*/
|
|
9
9
|
export const detect = async source => {
|
|
10
|
+
const cst = await lexicalAnalysis(source);
|
|
10
11
|
try {
|
|
11
|
-
const cst = await lexicalAnalysis(source);
|
|
12
12
|
return !cst.rootNode.isError;
|
|
13
13
|
} catch {
|
|
14
14
|
return false;
|
|
15
|
+
} finally {
|
|
16
|
+
cst.delete();
|
|
15
17
|
}
|
|
16
18
|
};
|
|
17
19
|
|
|
@@ -30,7 +32,11 @@ export const parse = async (source, {
|
|
|
30
32
|
sourceMap = false
|
|
31
33
|
} = {}) => {
|
|
32
34
|
const cst = await lexicalAnalysis(source);
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
35
|
+
try {
|
|
36
|
+
return syntacticAnalysis(cst, {
|
|
37
|
+
sourceMap
|
|
38
|
+
});
|
|
39
|
+
} finally {
|
|
40
|
+
cst.delete();
|
|
41
|
+
}
|
|
36
42
|
};
|
|
@@ -7,7 +7,8 @@ var _webTreeSitter = _interopRequireDefault(require("web-tree-sitter"));
|
|
|
7
7
|
var _apidomError = require("@swagger-api/apidom-error");
|
|
8
8
|
let parser = null;
|
|
9
9
|
let parserInitLock = null;
|
|
10
|
-
|
|
10
|
+
const activeTrees = new Set();
|
|
11
|
+
const MAX_ACTIVE_TREES = 5;
|
|
11
12
|
const createAnalyze = treeSitterYaml => async source => {
|
|
12
13
|
if (parser === null && parserInitLock === null) {
|
|
13
14
|
// acquire lock
|
|
@@ -27,8 +28,27 @@ const createAnalyze = treeSitterYaml => async source => {
|
|
|
27
28
|
if (parser === null) {
|
|
28
29
|
throw new _apidomError.ApiDOMError('Error while initializing web-tree-sitter and loading tree-sitter-yaml grammar.');
|
|
29
30
|
}
|
|
30
|
-
|
|
31
|
+
|
|
32
|
+
// prevent WASM OOM during concurrency spikes by evicting oldest trees
|
|
33
|
+
// when the pool exceeds threshold; tree.delete() is idempotent so
|
|
34
|
+
// callers that still hold a reference can safely call delete() again
|
|
35
|
+
if (activeTrees.size >= MAX_ACTIVE_TREES) {
|
|
36
|
+
const treesToEvict = [...activeTrees];
|
|
37
|
+
activeTrees.clear();
|
|
38
|
+
for (const oldTree of treesToEvict) {
|
|
39
|
+
oldTree.delete();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const tree = parser.parse(source);
|
|
43
|
+
activeTrees.add(tree);
|
|
44
|
+
|
|
45
|
+
// remove from tracking when caller deletes
|
|
46
|
+
const originalDelete = tree.delete;
|
|
47
|
+
tree.delete = function deleteAndUntrack() {
|
|
48
|
+
activeTrees.delete(this);
|
|
49
|
+
originalDelete.call(this);
|
|
50
|
+
};
|
|
31
51
|
parser.reset();
|
|
32
|
-
return
|
|
52
|
+
return tree;
|
|
33
53
|
};
|
|
34
54
|
var _default = exports.default = createAnalyze;
|
|
@@ -2,7 +2,8 @@ import Parser from 'web-tree-sitter';
|
|
|
2
2
|
import { ApiDOMError } from '@swagger-api/apidom-error';
|
|
3
3
|
let parser = null;
|
|
4
4
|
let parserInitLock = null;
|
|
5
|
-
|
|
5
|
+
const activeTrees = new Set();
|
|
6
|
+
const MAX_ACTIVE_TREES = 5;
|
|
6
7
|
const createAnalyze = treeSitterYaml => async source => {
|
|
7
8
|
if (parser === null && parserInitLock === null) {
|
|
8
9
|
// acquire lock
|
|
@@ -22,8 +23,27 @@ const createAnalyze = treeSitterYaml => async source => {
|
|
|
22
23
|
if (parser === null) {
|
|
23
24
|
throw new ApiDOMError('Error while initializing web-tree-sitter and loading tree-sitter-yaml grammar.');
|
|
24
25
|
}
|
|
25
|
-
|
|
26
|
+
|
|
27
|
+
// prevent WASM OOM during concurrency spikes by evicting oldest trees
|
|
28
|
+
// when the pool exceeds threshold; tree.delete() is idempotent so
|
|
29
|
+
// callers that still hold a reference can safely call delete() again
|
|
30
|
+
if (activeTrees.size >= MAX_ACTIVE_TREES) {
|
|
31
|
+
const treesToEvict = [...activeTrees];
|
|
32
|
+
activeTrees.clear();
|
|
33
|
+
for (const oldTree of treesToEvict) {
|
|
34
|
+
oldTree.delete();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const tree = parser.parse(source);
|
|
38
|
+
activeTrees.add(tree);
|
|
39
|
+
|
|
40
|
+
// remove from tracking when caller deletes
|
|
41
|
+
const originalDelete = tree.delete;
|
|
42
|
+
tree.delete = function deleteAndUntrack() {
|
|
43
|
+
activeTrees.delete(this);
|
|
44
|
+
originalDelete.call(this);
|
|
45
|
+
};
|
|
26
46
|
parser.reset();
|
|
27
|
-
return
|
|
47
|
+
return tree;
|
|
28
48
|
};
|
|
29
49
|
export default createAnalyze;
|