@ui5/mcp-server 0.1.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 +9 -0
- package/LICENSE +201 -0
- package/LICENSES/Apache-2.0.txt +73 -0
- package/README.md +131 -0
- package/bin/ui5mcp.js +2 -0
- package/lib/Context.d.ts +28 -0
- package/lib/Context.js +71 -0
- package/lib/Context.js.map +1 -0
- package/lib/api.d.ts +3 -0
- package/lib/api.js +3 -0
- package/lib/api.js.map +1 -0
- package/lib/cli.d.ts +1 -0
- package/lib/cli.js +12 -0
- package/lib/cli.js.map +1 -0
- package/lib/registerTools.d.ts +133 -0
- package/lib/registerTools.js +59 -0
- package/lib/registerTools.js.map +1 -0
- package/lib/resources/documentation/getDocumentation.d.ts +18 -0
- package/lib/resources/documentation/getDocumentation.js +70 -0
- package/lib/resources/documentation/getDocumentation.js.map +1 -0
- package/lib/server.d.ts +10 -0
- package/lib/server.js +113 -0
- package/lib/server.js.map +1 -0
- package/lib/tools/create_ui5_app/ODataMetadata.d.ts +55 -0
- package/lib/tools/create_ui5_app/ODataMetadata.js +99 -0
- package/lib/tools/create_ui5_app/ODataMetadata.js.map +1 -0
- package/lib/tools/create_ui5_app/createSuccessMessage.d.ts +13 -0
- package/lib/tools/create_ui5_app/createSuccessMessage.js +45 -0
- package/lib/tools/create_ui5_app/createSuccessMessage.js.map +1 -0
- package/lib/tools/create_ui5_app/create_ui5_app.d.ts +8 -0
- package/lib/tools/create_ui5_app/create_ui5_app.js +273 -0
- package/lib/tools/create_ui5_app/create_ui5_app.js.map +1 -0
- package/lib/tools/create_ui5_app/index.d.ts +3 -0
- package/lib/tools/create_ui5_app/index.js +58 -0
- package/lib/tools/create_ui5_app/index.js.map +1 -0
- package/lib/tools/create_ui5_app/isValidUrl.d.ts +16 -0
- package/lib/tools/create_ui5_app/isValidUrl.js +59 -0
- package/lib/tools/create_ui5_app/isValidUrl.js.map +1 -0
- package/lib/tools/create_ui5_app/schema.d.ts +135 -0
- package/lib/tools/create_ui5_app/schema.js +67 -0
- package/lib/tools/create_ui5_app/schema.js.map +1 -0
- package/lib/tools/create_ui5_app/templateProcessor.d.ts +67 -0
- package/lib/tools/create_ui5_app/templateProcessor.js +59 -0
- package/lib/tools/create_ui5_app/templateProcessor.js.map +1 -0
- package/lib/tools/create_ui5_app/ui5Version.d.ts +2 -0
- package/lib/tools/create_ui5_app/ui5Version.js +6 -0
- package/lib/tools/create_ui5_app/ui5Version.js.map +1 -0
- package/lib/tools/get_api_reference/createUriForSymbol.d.ts +2 -0
- package/lib/tools/get_api_reference/createUriForSymbol.js +49 -0
- package/lib/tools/get_api_reference/createUriForSymbol.js.map +1 -0
- package/lib/tools/get_api_reference/getApiReference.d.ts +10 -0
- package/lib/tools/get_api_reference/getApiReference.js +51 -0
- package/lib/tools/get_api_reference/getApiReference.js.map +1 -0
- package/lib/tools/get_api_reference/index.d.ts +3 -0
- package/lib/tools/get_api_reference/index.js +38 -0
- package/lib/tools/get_api_reference/index.js.map +1 -0
- package/lib/tools/get_api_reference/lib/ApiReferenceProvider.d.ts +85 -0
- package/lib/tools/get_api_reference/lib/ApiReferenceProvider.js +452 -0
- package/lib/tools/get_api_reference/lib/ApiReferenceProvider.js.map +1 -0
- package/lib/tools/get_api_reference/lib/apiReferenceResources.d.ts +18 -0
- package/lib/tools/get_api_reference/lib/apiReferenceResources.js +138 -0
- package/lib/tools/get_api_reference/lib/apiReferenceResources.js.map +1 -0
- package/lib/tools/get_api_reference/lib/formatSymbol.d.ts +24 -0
- package/lib/tools/get_api_reference/lib/formatSymbol.js +109 -0
- package/lib/tools/get_api_reference/lib/formatSymbol.js.map +1 -0
- package/lib/tools/get_api_reference/schema.d.ts +16 -0
- package/lib/tools/get_api_reference/schema.js +12 -0
- package/lib/tools/get_api_reference/schema.js.map +1 -0
- package/lib/tools/get_guidelines/guidelines.d.ts +1 -0
- package/lib/tools/get_guidelines/guidelines.js +6 -0
- package/lib/tools/get_guidelines/guidelines.js.map +1 -0
- package/lib/tools/get_guidelines/index.d.ts +3 -0
- package/lib/tools/get_guidelines/index.js +30 -0
- package/lib/tools/get_guidelines/index.js.map +1 -0
- package/lib/tools/get_project_info/getProjectInfo.d.ts +2 -0
- package/lib/tools/get_project_info/getProjectInfo.js +205 -0
- package/lib/tools/get_project_info/getProjectInfo.js.map +1 -0
- package/lib/tools/get_project_info/index.d.ts +3 -0
- package/lib/tools/get_project_info/index.js +28 -0
- package/lib/tools/get_project_info/index.js.map +1 -0
- package/lib/tools/get_project_info/schema.d.ts +87 -0
- package/lib/tools/get_project_info/schema.js +28 -0
- package/lib/tools/get_project_info/schema.js.map +1 -0
- package/lib/tools/get_version_info/getVersionInfo.d.ts +8 -0
- package/lib/tools/get_version_info/getVersionInfo.js +41 -0
- package/lib/tools/get_version_info/getVersionInfo.js.map +1 -0
- package/lib/tools/get_version_info/index.d.ts +9 -0
- package/lib/tools/get_version_info/index.js +33 -0
- package/lib/tools/get_version_info/index.js.map +1 -0
- package/lib/tools/get_version_info/schema.d.ts +66 -0
- package/lib/tools/get_version_info/schema.js +16 -0
- package/lib/tools/get_version_info/schema.js.map +1 -0
- package/lib/tools/get_version_info/types.d.ts +5 -0
- package/lib/tools/get_version_info/types.js +2 -0
- package/lib/tools/get_version_info/types.js.map +1 -0
- package/lib/tools/run_ui5_linter/index.d.ts +3 -0
- package/lib/tools/run_ui5_linter/index.js +86 -0
- package/lib/tools/run_ui5_linter/index.js.map +1 -0
- package/lib/tools/run_ui5_linter/migrationGuides.d.ts +6 -0
- package/lib/tools/run_ui5_linter/migrationGuides.js +88 -0
- package/lib/tools/run_ui5_linter/migrationGuides.js.map +1 -0
- package/lib/tools/run_ui5_linter/resultContext.d.ts +3 -0
- package/lib/tools/run_ui5_linter/resultContext.js +236 -0
- package/lib/tools/run_ui5_linter/resultContext.js.map +1 -0
- package/lib/tools/run_ui5_linter/runUi5Linter.d.ts +2 -0
- package/lib/tools/run_ui5_linter/runUi5Linter.js +72 -0
- package/lib/tools/run_ui5_linter/runUi5Linter.js.map +1 -0
- package/lib/tools/run_ui5_linter/schema.d.ts +340 -0
- package/lib/tools/run_ui5_linter/schema.js +55 -0
- package/lib/tools/run_ui5_linter/schema.js.map +1 -0
- package/lib/utils/cdnHelper.d.ts +9 -0
- package/lib/utils/cdnHelper.js +50 -0
- package/lib/utils/cdnHelper.js.map +1 -0
- package/lib/utils/dataStorageHelper.d.ts +2 -0
- package/lib/utils/dataStorageHelper.js +65 -0
- package/lib/utils/dataStorageHelper.js.map +1 -0
- package/lib/utils/ui5Framework.d.ts +4 -0
- package/lib/utils/ui5Framework.js +6 -0
- package/lib/utils/ui5Framework.js.map +1 -0
- package/lib/utils.d.ts +10 -0
- package/lib/utils.js +87 -0
- package/lib/utils.js.map +1 -0
- package/npm-shrinkwrap.json +7880 -0
- package/package.json +121 -0
- package/resources/docs/1.136.7/00737d6c1b864dc3ab72ef56611491c4.md +155 -0
- package/resources/docs/1.136.7/0187ea5e2eff4166b0453b9dcc8fc64f.md +164 -0
- package/resources/docs/1.136.7/032be2cb2e1d4115af20862673bedcdb.md +12 -0
- package/resources/docs/1.136.7/28fcd55b04654977b63dacbee0552712.md +317 -0
- package/resources/docs/1.136.7/676b636446c94eada183b1218a824717.md +135 -0
- package/resources/docs/1.136.7/a87ca843bcee469f82a9072927a7dcdb.md +355 -0
- package/resources/docs/1.136.7/b0fb4de7364f4bcbb053a99aa645affe.md +126 -0
- package/resources/docs/1.136.7/fe1a6dba940e479fb7c3bc753f92b28c.md +670 -0
- package/resources/docs/1.136.7/index.json +58 -0
- package/resources/guidelines.md +104 -0
- package/resources/migrationGuides/deprecated-controller-factory.md +116 -0
- package/resources/migrationGuides/deprecated-getLibraryResourceBundle.md +62 -0
- package/resources/migrationGuides/deprecated-jquery-sap-require.md +141 -0
- package/resources/migrationGuides/deprecated-messagePage.md +162 -0
- package/resources/migrationGuides/deprecated-table-table-property.md +154 -0
- package/resources/template-js/LICENSE +201 -0
- package/resources/template-js/README.md +87 -0
- package/resources/template-js/_.editorconfig +22 -0
- package/resources/template-js/_.gitignore +17 -0
- package/resources/template-js/eslint.config.js +68 -0
- package/resources/template-js/karma-ci-cov.conf.js +20 -0
- package/resources/template-js/karma-ci.conf.js +9 -0
- package/resources/template-js/karma.conf.js +9 -0
- package/resources/template-js/package.json +34 -0
- package/resources/template-js/ui5-dist.yaml +18 -0
- package/resources/template-js/ui5.yaml +24 -0
- package/resources/template-js/webapp/Component.js +41 -0
- package/resources/template-js/webapp/controller/App.controller.js +10 -0
- package/resources/template-js/webapp/controller/BaseController.js +67 -0
- package/resources/template-js/webapp/controller/Main.controller.js +14 -0
- package/resources/template-js/webapp/i18n/i18n.properties +3 -0
- package/resources/template-js/webapp/i18n/i18n_en.properties +3 -0
- package/resources/template-js/webapp/index-cdn.html +34 -0
- package/resources/template-js/webapp/index.html +34 -0
- package/resources/template-js/webapp/manifest.json +103 -0
- package/resources/template-js/webapp/model/formatter.js +9 -0
- package/resources/template-js/webapp/model/models.js +11 -0
- package/resources/template-js/webapp/test/Test.qunit.html +16 -0
- package/resources/template-js/webapp/test/integration/HelloJourney.js +85 -0
- package/resources/template-js/webapp/test/integration/opaTests.qunit.js +1 -0
- package/resources/template-js/webapp/test/integration/pages/Main.js +112 -0
- package/resources/template-js/webapp/test/testsuite.qunit.html +18 -0
- package/resources/template-js/webapp/test/testsuite.qunit.js +37 -0
- package/resources/template-js/webapp/test/unit/controller/Main.qunit.js +11 -0
- package/resources/template-js/webapp/test/unit/unitTests.qunit.js +1 -0
- package/resources/template-js/webapp/test-lt1_124/integration/HelloJourney.js +85 -0
- package/resources/template-js/webapp/test-lt1_124/integration/opaTests.qunit.html +31 -0
- package/resources/template-js/webapp/test-lt1_124/integration/opaTests.qunit.js +11 -0
- package/resources/template-js/webapp/test-lt1_124/integration/pages/Main.js +112 -0
- package/resources/template-js/webapp/test-lt1_124/testsuite.qunit.html +13 -0
- package/resources/template-js/webapp/test-lt1_124/testsuite.qunit.js +9 -0
- package/resources/template-js/webapp/test-lt1_124/unit/controller/Main.qunit.js +11 -0
- package/resources/template-js/webapp/test-lt1_124/unit/unitTests.qunit.html +30 -0
- package/resources/template-js/webapp/test-lt1_124/unit/unitTests.qunit.js +12 -0
- package/resources/template-js/webapp/view/App.view.xml +9 -0
- package/resources/template-js/webapp/view/Main.view.xml +90 -0
- package/resources/template-ts/LICENSE +201 -0
- package/resources/template-ts/README.md +101 -0
- package/resources/template-ts/_.editorconfig +23 -0
- package/resources/template-ts/_.gitignore +18 -0
- package/resources/template-ts/_.nycrc.json +7 -0
- package/resources/template-ts/_tsconfig.json +21 -0
- package/resources/template-ts/eslint.config.mjs +27 -0
- package/resources/template-ts/package.json +40 -0
- package/resources/template-ts/ui5-coverage.yaml +40 -0
- package/resources/template-ts/ui5-dist.yaml +18 -0
- package/resources/template-ts/ui5.yaml +27 -0
- package/resources/template-ts/webapp/Component.ts +49 -0
- package/resources/template-ts/webapp/controller/App.controller.ts +11 -0
- package/resources/template-ts/webapp/controller/BaseController.ts +83 -0
- package/resources/template-ts/webapp/controller/Main.controller.ts +19 -0
- package/resources/template-ts/webapp/i18n/i18n.properties +3 -0
- package/resources/template-ts/webapp/i18n/i18n_en.properties +3 -0
- package/resources/template-ts/webapp/index-cdn.html +35 -0
- package/resources/template-ts/webapp/index.html +35 -0
- package/resources/template-ts/webapp/manifest.json +105 -0
- package/resources/template-ts/webapp/model/formatter.ts +5 -0
- package/resources/template-ts/webapp/model/models.ts +15 -0
- package/resources/template-ts/webapp/test/Test.qunit.html +16 -0
- package/resources/template-ts/webapp/test/integration/HelloJourney.ts +84 -0
- package/resources/template-ts/webapp/test/integration/opaTests.qunit.ts +2 -0
- package/resources/template-ts/webapp/test/integration/pages/MainPage.ts +112 -0
- package/resources/template-ts/webapp/test/testsuite.qunit.html +18 -0
- package/resources/template-ts/webapp/test/testsuite.qunit.ts +33 -0
- package/resources/template-ts/webapp/test/unit/controller/Main.qunit.ts +8 -0
- package/resources/template-ts/webapp/test/unit/unitTests.qunit.ts +2 -0
- package/resources/template-ts/webapp/test-lt1_124/integration/HelloJourney.ts +86 -0
- package/resources/template-ts/webapp/test-lt1_124/integration/opaTests.qunit.html +34 -0
- package/resources/template-ts/webapp/test-lt1_124/integration/opaTests.qunit.ts +8 -0
- package/resources/template-ts/webapp/test-lt1_124/integration/pages/MainPage.ts +112 -0
- package/resources/template-ts/webapp/test-lt1_124/testsuite.qunit.html +13 -0
- package/resources/template-ts/webapp/test-lt1_124/testsuite.qunit.ts +9 -0
- package/resources/template-ts/webapp/test-lt1_124/unit/controller/Main.qunit.ts +8 -0
- package/resources/template-ts/webapp/test-lt1_124/unit/unitTests.qunit.html +37 -0
- package/resources/template-ts/webapp/test-lt1_124/unit/unitTests.qunit.ts +8 -0
- package/resources/template-ts/webapp/view/App.view.xml +9 -0
- package/resources/template-ts/webapp/view/Main.view.xml +90 -0
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { Mutex } from "async-mutex";
|
|
4
|
+
import { Ui5TypeInfoKind } from "@ui5/linter/Ui5TypeInfoMatcher";
|
|
5
|
+
import { NotFoundError } from "../../../utils.js";
|
|
6
|
+
import { formatSymbol, summarizeSymbol } from "./formatSymbol.js";
|
|
7
|
+
export var SymbolKind;
|
|
8
|
+
(function (SymbolKind) {
|
|
9
|
+
// ConcreteSymbol kinds
|
|
10
|
+
SymbolKind["Class"] = "class";
|
|
11
|
+
SymbolKind["Interface"] = "interface";
|
|
12
|
+
SymbolKind["Namespace"] = "namespace";
|
|
13
|
+
SymbolKind["Enum"] = "enum";
|
|
14
|
+
SymbolKind["Member"] = "member";
|
|
15
|
+
SymbolKind["Object"] = "object";
|
|
16
|
+
SymbolKind["Typedef"] = "typedef";
|
|
17
|
+
SymbolKind["Function"] = "function";
|
|
18
|
+
// ConcreteSymbolField kinds are added dynamically added here
|
|
19
|
+
SymbolKind["Property"] = "property";
|
|
20
|
+
SymbolKind["Constructor"] = "constructor";
|
|
21
|
+
SymbolKind["Method"] = "method";
|
|
22
|
+
SymbolKind["Event"] = "event";
|
|
23
|
+
SymbolKind["Parameter"] = "parameter";
|
|
24
|
+
SymbolKind["EnumProperty"] = "enum-property";
|
|
25
|
+
SymbolKind["Ui5Property"] = "ui5-property";
|
|
26
|
+
SymbolKind["Ui5Event"] = "ui5-event";
|
|
27
|
+
SymbolKind["Ui5Aggregation"] = "ui5-aggregation";
|
|
28
|
+
SymbolKind["Ui5Association"] = "ui5-association";
|
|
29
|
+
SymbolKind["Ui5SpecialSetting"] = "ui5-specialSetting";
|
|
30
|
+
})(SymbolKind || (SymbolKind = {}));
|
|
31
|
+
const RELEVANT_UI5_TYPE_INFO_TYPES = [
|
|
32
|
+
Ui5TypeInfoKind.Module,
|
|
33
|
+
Ui5TypeInfoKind.Namespace,
|
|
34
|
+
Ui5TypeInfoKind.Class,
|
|
35
|
+
Ui5TypeInfoKind.Constructor,
|
|
36
|
+
Ui5TypeInfoKind.Function,
|
|
37
|
+
Ui5TypeInfoKind.Method,
|
|
38
|
+
Ui5TypeInfoKind.Property,
|
|
39
|
+
Ui5TypeInfoKind.Enum,
|
|
40
|
+
Ui5TypeInfoKind.MetadataAggregation,
|
|
41
|
+
Ui5TypeInfoKind.MetadataAssociation,
|
|
42
|
+
Ui5TypeInfoKind.MetadataEvent,
|
|
43
|
+
Ui5TypeInfoKind.MetadataProperty,
|
|
44
|
+
];
|
|
45
|
+
export default class ApiReferenceProvider {
|
|
46
|
+
apiJsonsRootDir;
|
|
47
|
+
index;
|
|
48
|
+
// private formatter: SymbolFormatter;
|
|
49
|
+
symbolCache = new Map();
|
|
50
|
+
apiJsonLoadMutex = new Mutex();
|
|
51
|
+
constructor(apiJsonsRootDir, index) {
|
|
52
|
+
this.apiJsonsRootDir = apiJsonsRootDir;
|
|
53
|
+
this.index = index;
|
|
54
|
+
}
|
|
55
|
+
static async create(apiJsonsRootDir) {
|
|
56
|
+
const indexPath = path.join(apiJsonsRootDir, "index.json");
|
|
57
|
+
try {
|
|
58
|
+
const index = await readFile(indexPath, "utf-8");
|
|
59
|
+
const indexParsed = JSON.parse(index);
|
|
60
|
+
return new ApiReferenceProvider(apiJsonsRootDir, indexParsed);
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
throw new Error(`Failed to read API reference index at ${indexPath}: ${err.message}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async findSymbol(query) {
|
|
67
|
+
const result = await this._findSymbol(query);
|
|
68
|
+
if (Array.isArray(result)) {
|
|
69
|
+
return result.map((s) => {
|
|
70
|
+
return formatSymbol(s.symbol, s.library, s.moduleName);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
return formatSymbol(result.symbol, result.library, result.moduleName);
|
|
74
|
+
}
|
|
75
|
+
async findSymbolAndSummarize(query) {
|
|
76
|
+
const result = await this._findSymbol(query);
|
|
77
|
+
if (Array.isArray(result)) {
|
|
78
|
+
return result.map((s) => {
|
|
79
|
+
if (isConcreteSymbol(s.symbol)) {
|
|
80
|
+
// Only concrete symbols can be summarized, others are usually already compact enough
|
|
81
|
+
return summarizeSymbol(s.symbol, s.library, s.moduleName);
|
|
82
|
+
}
|
|
83
|
+
return formatSymbol(s.symbol, s.library, s.moduleName);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
if (isConcreteSymbol(result.symbol)) {
|
|
87
|
+
// Only concrete symbols should be summarized, others are usually already compact enough
|
|
88
|
+
return summarizeSymbol(result.symbol, result.library, result.moduleName);
|
|
89
|
+
}
|
|
90
|
+
return formatSymbol(result.symbol, result.library, result.moduleName);
|
|
91
|
+
}
|
|
92
|
+
async _findSymbol(query) {
|
|
93
|
+
// Index contains normalized module names in the format "<string>.<string>",
|
|
94
|
+
// so we need to normalize the fqn as well
|
|
95
|
+
let searchKey = this._normalizeForIndex(query);
|
|
96
|
+
let indexEntry;
|
|
97
|
+
let entityField;
|
|
98
|
+
while (!indexEntry) {
|
|
99
|
+
indexEntry = this.index[searchKey];
|
|
100
|
+
if (indexEntry) {
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
// Split at last dot and try again
|
|
104
|
+
const lastDotIndex = searchKey.lastIndexOf(".");
|
|
105
|
+
if (lastDotIndex === -1) {
|
|
106
|
+
// No more dots, we cannot split further
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
entityField = searchKey.substring(lastDotIndex + 1);
|
|
110
|
+
searchKey = searchKey.substring(0, lastDotIndex);
|
|
111
|
+
}
|
|
112
|
+
if (!indexEntry) {
|
|
113
|
+
throw new NotFoundError(`Could not find symbol for query '${query}'`);
|
|
114
|
+
}
|
|
115
|
+
const apiJson = await this._getApiJson(indexEntry.filePath);
|
|
116
|
+
const symbol = apiJson.symbols.get(indexEntry.name);
|
|
117
|
+
if (!symbol) {
|
|
118
|
+
// Unexpected internal error. If the symbol is found in the index, it must be in the referenced JSON
|
|
119
|
+
throw new Error(`Failed to find indexed symbol '${indexEntry.name}' in API JSON file '${indexEntry.filePath}'`);
|
|
120
|
+
}
|
|
121
|
+
if (symbol.visibility === "private" || symbol.visibility === "restricted") {
|
|
122
|
+
throw new NotFoundError(`Symbol '${symbol.name}' is not public API`);
|
|
123
|
+
}
|
|
124
|
+
if (!entityField) {
|
|
125
|
+
return {
|
|
126
|
+
symbol,
|
|
127
|
+
library: apiJson.library,
|
|
128
|
+
moduleName: symbol.module,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
const fieldSymbol = this._getFieldInSymbol(symbol, entityField);
|
|
132
|
+
if (fieldSymbol) {
|
|
133
|
+
return {
|
|
134
|
+
symbol: fieldSymbol,
|
|
135
|
+
library: apiJson.library,
|
|
136
|
+
moduleName: symbol.module,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
if (symbol.extends) {
|
|
140
|
+
// If not found, try to look in the parent chain
|
|
141
|
+
try {
|
|
142
|
+
return await this._findSymbol(`${symbol.extends}#${entityField}`);
|
|
143
|
+
}
|
|
144
|
+
catch (_err) {
|
|
145
|
+
// Ignore errors from recursive call and continue the fallback chain below
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const symbols = this._findSymbolsInModule(this._normalizeForModuleName(query), apiJson);
|
|
149
|
+
if (symbols.length) {
|
|
150
|
+
return symbols;
|
|
151
|
+
}
|
|
152
|
+
throw new NotFoundError(`Could not find field '${entityField}' in symbol '${symbol.name}' of library '${apiJson.library}'`);
|
|
153
|
+
}
|
|
154
|
+
_findSymbolsInModule(moduleName, symbolCache) {
|
|
155
|
+
// Attempt to search for symbols with a matching module name
|
|
156
|
+
// E.g. when searching for "sap/ui/core/library", there is no dedicated symbol for it.
|
|
157
|
+
// Instead, we will return all symbols contained in that module
|
|
158
|
+
const moduleMatches = [];
|
|
159
|
+
for (const symbol of symbolCache.symbols.values()) {
|
|
160
|
+
if (symbol.module?.toLowerCase() === moduleName) {
|
|
161
|
+
moduleMatches.push({
|
|
162
|
+
symbol,
|
|
163
|
+
library: symbolCache.library,
|
|
164
|
+
moduleName: moduleName,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return moduleMatches;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Searches for a field (e.g. method, property, event) by name within a UI5 symbol.
|
|
172
|
+
*
|
|
173
|
+
* @param symbol The ConcreteSymbol to search within.
|
|
174
|
+
* @param field The name of the field to find.
|
|
175
|
+
* @returns The found entity (method, property, event, etc.) or undefined if not found.
|
|
176
|
+
*/
|
|
177
|
+
_getFieldInSymbol(symbol, field) {
|
|
178
|
+
switch (symbol.kind) {
|
|
179
|
+
case "class": {
|
|
180
|
+
// Check for the constructor separately as it's not in a collection.
|
|
181
|
+
if (field === "constructor" && symbol.constructor) {
|
|
182
|
+
return {
|
|
183
|
+
kind: SymbolKind.Constructor,
|
|
184
|
+
...symbol.constructor,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
// Search through methods, properties, and events directly on the class symbol.
|
|
188
|
+
let found = this._findFieldByName(field, symbol.methods, SymbolKind.Method) ??
|
|
189
|
+
this._findFieldByName(field, symbol.properties, SymbolKind.Property) ??
|
|
190
|
+
this._findFieldByName(field, symbol.events, SymbolKind.Event);
|
|
191
|
+
if (found) {
|
|
192
|
+
return found;
|
|
193
|
+
}
|
|
194
|
+
// If not found, search within the 'ui5-metadata' object.
|
|
195
|
+
if (symbol["ui5-metadata"]) {
|
|
196
|
+
const metadata = symbol["ui5-metadata"];
|
|
197
|
+
found =
|
|
198
|
+
this._findFieldByName(field, metadata.properties, SymbolKind.Ui5Property) ??
|
|
199
|
+
this._findFieldByName(field, metadata.aggregations, SymbolKind.Ui5Aggregation) ??
|
|
200
|
+
this._findFieldByName(field, metadata.associations, SymbolKind.Ui5Association) ??
|
|
201
|
+
this._findFieldByName(field, metadata.events, SymbolKind.Ui5Event) ??
|
|
202
|
+
this._findFieldByName(field, metadata.specialSettings, SymbolKind.Ui5SpecialSetting);
|
|
203
|
+
}
|
|
204
|
+
return found;
|
|
205
|
+
}
|
|
206
|
+
case "namespace":
|
|
207
|
+
case "member": // 'member' is treated like 'namespace' or 'object'.
|
|
208
|
+
case "object":
|
|
209
|
+
return (this._findFieldByName(field, symbol.methods, SymbolKind.Method) ??
|
|
210
|
+
this._findFieldByName(field, symbol.properties, SymbolKind.Property) ??
|
|
211
|
+
this._findFieldByName(field, symbol.events, SymbolKind.Event));
|
|
212
|
+
case "interface":
|
|
213
|
+
return this._findFieldByName(field, symbol.methods, SymbolKind.Method) ??
|
|
214
|
+
this._findFieldByName(field, symbol.events, SymbolKind.Event);
|
|
215
|
+
case "enum":
|
|
216
|
+
return this._findFieldByName(field, symbol.properties, SymbolKind.EnumProperty);
|
|
217
|
+
case "typedef":
|
|
218
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
219
|
+
return this._findFieldByName(field, symbol.properties, SymbolKind.Property) ??
|
|
220
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
221
|
+
this._findFieldByName(field, symbol.parameters, SymbolKind.Parameter);
|
|
222
|
+
case "function":
|
|
223
|
+
// A function symbol might have parameters to search through.
|
|
224
|
+
return this._findFieldByName(field, symbol.parameters, SymbolKind.Parameter);
|
|
225
|
+
default:
|
|
226
|
+
// Ensure all cases are handled for type safety and provide a fallback.
|
|
227
|
+
return undefined;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
_findFieldByName(fieldName, symbolFields, fieldKind) {
|
|
231
|
+
const match = symbolFields?.find((item) => item.name.toLowerCase() === fieldName);
|
|
232
|
+
if (match) {
|
|
233
|
+
return {
|
|
234
|
+
kind: fieldKind,
|
|
235
|
+
...match,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
;
|
|
240
|
+
async getSymbolForUi5Type(ui5TypeInfo) {
|
|
241
|
+
const symbolInfo = await this._getSymbolForUi5Type(ui5TypeInfo);
|
|
242
|
+
return formatSymbol(symbolInfo.symbol, symbolInfo.library, symbolInfo.moduleName);
|
|
243
|
+
}
|
|
244
|
+
async getSymbolForUi5TypeAndSummarize(ui5TypeInfo) {
|
|
245
|
+
const symbolInfo = await this._getSymbolForUi5Type(ui5TypeInfo);
|
|
246
|
+
if (isConcreteSymbol(symbolInfo.symbol)) {
|
|
247
|
+
// Only concrete symbols should be summarized, others are usually already compact enough
|
|
248
|
+
return summarizeSymbol(symbolInfo.symbol, symbolInfo.library, symbolInfo.moduleName);
|
|
249
|
+
}
|
|
250
|
+
return formatSymbol(symbolInfo.symbol, symbolInfo.library, symbolInfo.moduleName);
|
|
251
|
+
}
|
|
252
|
+
async _getSymbolForUi5Type(ui5TypeInfo) {
|
|
253
|
+
const typeInfo = this._parseUi5TypeInfo(ui5TypeInfo);
|
|
254
|
+
if (!typeInfo) {
|
|
255
|
+
throw new Error(`Could not extract module name from Ui5TypeInfo`);
|
|
256
|
+
}
|
|
257
|
+
const { moduleName, relevantNode } = typeInfo;
|
|
258
|
+
const indexEntry = this.index[this._normalizeForIndex(moduleName)];
|
|
259
|
+
if (!indexEntry) {
|
|
260
|
+
throw new Error(`Could not find symbol for module '${moduleName}'`);
|
|
261
|
+
}
|
|
262
|
+
const apiJson = await this._getApiJson(indexEntry.filePath);
|
|
263
|
+
const symbol = apiJson.symbols.get(indexEntry.name);
|
|
264
|
+
if (!symbol) {
|
|
265
|
+
// Unexpected internal error. If the symbol is found in the index, it must be in the referenced JSON
|
|
266
|
+
throw new Error(`Failed to find indexed symbol '${indexEntry.name}' in API JSON file '${indexEntry.filePath}'`);
|
|
267
|
+
}
|
|
268
|
+
if (!isUi5ClassSymbol(symbol) && !isUi5NamespaceSymbol(symbol) &&
|
|
269
|
+
!isUi5InterfaceSymbol(symbol) && !isUi5EnumSymbol(symbol)) {
|
|
270
|
+
throw new Error(`Expected API reference node to be class, interface or namespace or enum ` +
|
|
271
|
+
`but got ${symbol.kind}`);
|
|
272
|
+
}
|
|
273
|
+
const fieldSymbol = this._findSymbolForSubType(symbol, relevantNode);
|
|
274
|
+
if (!fieldSymbol) {
|
|
275
|
+
throw new Error(`Could not find field '${relevantNode.name}' in symbol '${symbol.name}' of library '${apiJson.library}'`);
|
|
276
|
+
}
|
|
277
|
+
return {
|
|
278
|
+
symbol: fieldSymbol,
|
|
279
|
+
library: apiJson.library,
|
|
280
|
+
moduleName: indexEntry.name,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
_parseUi5TypeInfo(ui5TypeInfo) {
|
|
284
|
+
if (ui5TypeInfo.kind === Ui5TypeInfoKind.Module) {
|
|
285
|
+
return {
|
|
286
|
+
moduleName: ui5TypeInfo.name,
|
|
287
|
+
relevantNode: ui5TypeInfo,
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
let relevantNode;
|
|
291
|
+
let namespace;
|
|
292
|
+
while ("parent" in ui5TypeInfo && ui5TypeInfo.parent) {
|
|
293
|
+
if (ui5TypeInfo.parent.kind === Ui5TypeInfoKind.Module) {
|
|
294
|
+
relevantNode ??= ui5TypeInfo;
|
|
295
|
+
return {
|
|
296
|
+
moduleName: ui5TypeInfo.parent.name,
|
|
297
|
+
relevantNode,
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
else if (ui5TypeInfo.parent.kind === Ui5TypeInfoKind.Namespace) {
|
|
301
|
+
if (namespace) {
|
|
302
|
+
namespace = `${ui5TypeInfo.parent.name}.${namespace}`;
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
namespace = ui5TypeInfo.parent.name;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
namespace = null;
|
|
310
|
+
}
|
|
311
|
+
if (!relevantNode && RELEVANT_UI5_TYPE_INFO_TYPES.includes(ui5TypeInfo.kind)) {
|
|
312
|
+
relevantNode = ui5TypeInfo;
|
|
313
|
+
}
|
|
314
|
+
ui5TypeInfo = ui5TypeInfo.parent;
|
|
315
|
+
}
|
|
316
|
+
if (ui5TypeInfo.kind === Ui5TypeInfoKind.Namespace) {
|
|
317
|
+
// If the last node is a namespace, we can still return it as a module to cover the "mocked" jQuery types
|
|
318
|
+
return {
|
|
319
|
+
moduleName: namespace ?? ui5TypeInfo.name,
|
|
320
|
+
relevantNode: relevantNode ?? ui5TypeInfo,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
return undefined;
|
|
324
|
+
}
|
|
325
|
+
_findSymbolForSubType(symbol, ui5TypeInfo) {
|
|
326
|
+
const fieldToFind = ui5TypeInfo.name.toLowerCase();
|
|
327
|
+
switch (ui5TypeInfo.kind) {
|
|
328
|
+
case Ui5TypeInfoKind.Module:
|
|
329
|
+
case Ui5TypeInfoKind.Namespace:
|
|
330
|
+
case Ui5TypeInfoKind.Class:
|
|
331
|
+
return symbol;
|
|
332
|
+
case Ui5TypeInfoKind.Constructor:
|
|
333
|
+
if (!isUi5ClassSymbol(symbol)) {
|
|
334
|
+
throw new Error(`Expected API reference to be a class, but got ${symbol.kind}`);
|
|
335
|
+
}
|
|
336
|
+
if (!symbol.constructor) {
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
return {
|
|
340
|
+
kind: SymbolKind.Constructor,
|
|
341
|
+
...symbol.constructor,
|
|
342
|
+
};
|
|
343
|
+
case Ui5TypeInfoKind.Function:
|
|
344
|
+
case Ui5TypeInfoKind.Method:
|
|
345
|
+
if (!isUi5ClassSymbol(symbol) && !isUi5NamespaceSymbol(symbol) && !isUi5InterfaceSymbol(symbol)) {
|
|
346
|
+
throw new Error(`Expected API reference to be a class, namespace or interface, but got ${symbol.kind}`);
|
|
347
|
+
}
|
|
348
|
+
return this._findFieldByName(fieldToFind, symbol.methods, ui5TypeInfo.kind === Ui5TypeInfoKind.Method ? SymbolKind.Method : SymbolKind.Function);
|
|
349
|
+
case Ui5TypeInfoKind.MetadataEvent:
|
|
350
|
+
if (!isUi5ClassSymbol(symbol) && !isUi5NamespaceSymbol(symbol) && !isUi5InterfaceSymbol(symbol)) {
|
|
351
|
+
throw new Error(`Expected API reference to be a class, namespace or interface, but got ${symbol.kind}`);
|
|
352
|
+
}
|
|
353
|
+
return this._findFieldByName(fieldToFind, symbol.events, SymbolKind.Event);
|
|
354
|
+
case Ui5TypeInfoKind.Property:
|
|
355
|
+
if (!isUi5ClassSymbol(symbol) && !isUi5NamespaceSymbol(symbol)) {
|
|
356
|
+
throw new Error(`Expected API reference to be a class or namespace, but got ${symbol.kind}`);
|
|
357
|
+
}
|
|
358
|
+
return this._findFieldByName(fieldToFind, symbol.properties, SymbolKind.Property);
|
|
359
|
+
case Ui5TypeInfoKind.Enum:
|
|
360
|
+
if (!isUi5EnumSymbol(symbol)) {
|
|
361
|
+
throw new Error(`Expected API reference to be an enum, but got ${symbol.kind}`);
|
|
362
|
+
}
|
|
363
|
+
return this._findFieldByName(fieldToFind, symbol.properties, SymbolKind.EnumProperty);
|
|
364
|
+
case Ui5TypeInfoKind.MetadataAggregation:
|
|
365
|
+
if (!isUi5ClassSymbol(symbol)) {
|
|
366
|
+
throw new Error(`Expected API reference to be a class, but got ${symbol.kind}`);
|
|
367
|
+
}
|
|
368
|
+
return this._findFieldByName(fieldToFind, symbol["ui5-metadata"]?.aggregations, SymbolKind.Ui5Aggregation);
|
|
369
|
+
case Ui5TypeInfoKind.MetadataAssociation:
|
|
370
|
+
if (!isUi5ClassSymbol(symbol)) {
|
|
371
|
+
throw new Error(`Expected API reference to be a class, but got ${symbol.kind}`);
|
|
372
|
+
}
|
|
373
|
+
return this._findFieldByName(fieldToFind, symbol["ui5-metadata"]?.associations, SymbolKind.Ui5Association);
|
|
374
|
+
case Ui5TypeInfoKind.MetadataProperty:
|
|
375
|
+
if (!isUi5ClassSymbol(symbol)) {
|
|
376
|
+
throw new Error(`Expected API reference to be a class, but got ${symbol.kind}`);
|
|
377
|
+
}
|
|
378
|
+
return this._findFieldByName(fieldToFind, symbol["ui5-metadata"]?.properties, SymbolKind.Ui5Property);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
async _getApiJson(filePath) {
|
|
382
|
+
if (this.symbolCache.has(filePath)) {
|
|
383
|
+
return this.symbolCache.get(filePath);
|
|
384
|
+
}
|
|
385
|
+
const release = await this.apiJsonLoadMutex.acquire();
|
|
386
|
+
const apiJsonPath = path.join(this.apiJsonsRootDir, filePath);
|
|
387
|
+
try {
|
|
388
|
+
// Check again inside the mutex whether another thread has already loaded the file
|
|
389
|
+
if (this.symbolCache.has(filePath)) {
|
|
390
|
+
return this.symbolCache.get(filePath);
|
|
391
|
+
}
|
|
392
|
+
const apiJsonContent = await readFile(apiJsonPath, "utf-8");
|
|
393
|
+
const apiJsonParsed = JSON.parse(apiJsonContent);
|
|
394
|
+
const SymbolCache = {
|
|
395
|
+
symbols: new Map(apiJsonParsed.symbols.map((s) => [s.name, s])),
|
|
396
|
+
library: apiJsonParsed.library,
|
|
397
|
+
};
|
|
398
|
+
this.symbolCache.set(filePath, SymbolCache);
|
|
399
|
+
return SymbolCache;
|
|
400
|
+
}
|
|
401
|
+
catch (err) {
|
|
402
|
+
throw new Error(`Failed to read API JSON file at ${apiJsonPath}: ${err.message}`);
|
|
403
|
+
}
|
|
404
|
+
finally {
|
|
405
|
+
release();
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Normalizes the search query by removing white space, replacing slashes and hashes with dots,
|
|
410
|
+
* and making it lower case (to allow case-insensitive search).
|
|
411
|
+
*
|
|
412
|
+
* @param query - The search query to normalize. E.g. " module:sap/ui/core/Component#onInit "
|
|
413
|
+
* @returns The normalized query. E.g. "sap.ui.core.Component"
|
|
414
|
+
*/
|
|
415
|
+
_normalizeForIndex(query) {
|
|
416
|
+
query = query.trim().toLowerCase();
|
|
417
|
+
// Remove any leading "module:" prefix
|
|
418
|
+
if (query.startsWith("module:")) {
|
|
419
|
+
query = query.substring("module:".length);
|
|
420
|
+
}
|
|
421
|
+
// Remove any white space, tabulator and newline characters
|
|
422
|
+
query = query.replace(/\s+/g, "");
|
|
423
|
+
// Replace slashes and hashes with dots
|
|
424
|
+
query = query.replace(/[/#]/g, ".");
|
|
425
|
+
return query;
|
|
426
|
+
}
|
|
427
|
+
_normalizeForModuleName(query) {
|
|
428
|
+
query = this._normalizeForIndex(query);
|
|
429
|
+
query = query.replace(/\./g, "/");
|
|
430
|
+
return query;
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
export function isUi5ClassSymbol(symbol) {
|
|
434
|
+
return symbol.kind === "class";
|
|
435
|
+
}
|
|
436
|
+
export function isUi5InterfaceSymbol(symbol) {
|
|
437
|
+
return symbol.kind === "interface";
|
|
438
|
+
}
|
|
439
|
+
export function isUi5NamespaceSymbol(symbol) {
|
|
440
|
+
return symbol.kind === "namespace" || symbol.kind === "member";
|
|
441
|
+
}
|
|
442
|
+
export function isUi5EnumSymbol(symbol) {
|
|
443
|
+
return symbol.kind === "enum";
|
|
444
|
+
}
|
|
445
|
+
const CONCRETE_SYMBOL_KINDS = [
|
|
446
|
+
SymbolKind.Class, SymbolKind.Interface, SymbolKind.Namespace, SymbolKind.Enum,
|
|
447
|
+
SymbolKind.Member, SymbolKind.Object, SymbolKind.Typedef, SymbolKind.Function,
|
|
448
|
+
];
|
|
449
|
+
export function isConcreteSymbol(symbol) {
|
|
450
|
+
return !!symbol.kind && CONCRETE_SYMBOL_KINDS.includes(symbol.kind);
|
|
451
|
+
}
|
|
452
|
+
//# sourceMappingURL=ApiReferenceProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApiReferenceProvider.js","sourceRoot":"","sources":["../../../../src/tools/get_api_reference/lib/ApiReferenceProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Ui5Framework } from "../../../utils/ui5Framework.js";
|
|
2
|
+
interface ApiReferenceIndexEntry {
|
|
3
|
+
/**
|
|
4
|
+
* Value of the "name" property of the respective symbol in the api.json
|
|
5
|
+
*/
|
|
6
|
+
name: string;
|
|
7
|
+
/**
|
|
8
|
+
* Path to the api.json file containing the symbol, relative to the directory containing the index.json
|
|
9
|
+
*/
|
|
10
|
+
filePath: string;
|
|
11
|
+
}
|
|
12
|
+
export type ApiReferenceIndex = Record<string, ApiReferenceIndexEntry>;
|
|
13
|
+
export declare function getApiJsonDir(frameworkName: Ui5Framework, frameworkVersion: string): Promise<string>;
|
|
14
|
+
export declare function fetchApiJsons(targetDir: string, frameworkName: Ui5Framework, frameworkVersion: string): Promise<string[]>;
|
|
15
|
+
export declare function _createApiIndex(targetDir: string, apiJsonPaths: string[]): Promise<void>;
|
|
16
|
+
export declare function _fetchApiJson(targetPath: string, url: string): Promise<string>;
|
|
17
|
+
export declare function getLibrariesForVersion(baseUrl: string): Promise<string[]>;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
2
|
+
import { createWriteStream } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { getLogger } from "@ui5/logger";
|
|
5
|
+
import { dirExists, fileExists, InvalidInputError } from "../../../utils.js";
|
|
6
|
+
import { fetchCdn, fetchCdnRaw, getBaseUrl } from "../../../utils/cdnHelper.js";
|
|
7
|
+
import { getDataDir, synchronize } from "../../../utils/dataStorageHelper.js";
|
|
8
|
+
import { isUi5Framework } from "../../../utils/ui5Framework.js";
|
|
9
|
+
import { pipeline } from "node:stream/promises";
|
|
10
|
+
const log = getLogger("tools:get_api_reference:resources");
|
|
11
|
+
export async function getApiJsonDir(frameworkName, frameworkVersion) {
|
|
12
|
+
frameworkVersion = frameworkVersion.toLowerCase();
|
|
13
|
+
// Validate input params since they are used to construct a file path
|
|
14
|
+
if (!isUi5Framework(frameworkName)) {
|
|
15
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
16
|
+
throw new InvalidInputError(`Invalid framework name: ${frameworkName}. Expected "OpenUI5" or "SAPUI5".`);
|
|
17
|
+
}
|
|
18
|
+
if (typeof frameworkVersion !== "string" || /^[a-zA-Z0-9.-]+$/.exec(frameworkVersion) === null) {
|
|
19
|
+
throw new InvalidInputError(`Invalid framework version: ${frameworkVersion}`);
|
|
20
|
+
}
|
|
21
|
+
const dirName = `${frameworkName.toLowerCase()}-${frameworkVersion}`;
|
|
22
|
+
const apiJsonRootDir = getDataDir("api_json_files");
|
|
23
|
+
const targetDir = path.join(apiJsonRootDir, dirName);
|
|
24
|
+
if (await dirExists(targetDir)) {
|
|
25
|
+
if (!await fileExists(path.join(targetDir, "index.json"))) {
|
|
26
|
+
// Missing index.json indicates use of an old version of the UI5 MCP server
|
|
27
|
+
// Remove the directory and re-fetch resources
|
|
28
|
+
log.warn(`Incomplete API JSON data found for ${frameworkName} version ${frameworkVersion}, re-fetching...`);
|
|
29
|
+
await rm(targetDir, { recursive: true, force: true });
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
// Use cached data
|
|
33
|
+
return targetDir;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
await synchronize(dirName, async () => {
|
|
37
|
+
// Check again whether dir exists by now
|
|
38
|
+
if (await dirExists(targetDir)) {
|
|
39
|
+
// Use cached data
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
log.info(`Fetching API JSON files for ${frameworkName} version ${frameworkVersion}...`);
|
|
43
|
+
const stagingDir = path.join(apiJsonRootDir, "staging", dirName);
|
|
44
|
+
try {
|
|
45
|
+
// Ensure that the parent directory exists, but do not create the target directory
|
|
46
|
+
// as this causes an EPERM error in following rename operation on Windows
|
|
47
|
+
await mkdir(path.dirname(targetDir), { recursive: true });
|
|
48
|
+
const filePaths = await fetchApiJsons(stagingDir, frameworkName, frameworkVersion);
|
|
49
|
+
await _createApiIndex(stagingDir, filePaths);
|
|
50
|
+
// Move staging directory to target directory
|
|
51
|
+
await rename(stagingDir, targetDir);
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
if (e instanceof Error) {
|
|
55
|
+
log.error(e.message);
|
|
56
|
+
if (e.cause && e.cause instanceof Error) {
|
|
57
|
+
log.error(`Cause: ${e.cause.message}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
await rm(targetDir, { recursive: true, force: true });
|
|
61
|
+
throw e;
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
// Always cleanup staging directory
|
|
65
|
+
await rm(stagingDir, { recursive: true, force: true });
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
return targetDir;
|
|
69
|
+
}
|
|
70
|
+
export async function fetchApiJsons(targetDir, frameworkName, frameworkVersion) {
|
|
71
|
+
await mkdir(targetDir, { recursive: true });
|
|
72
|
+
// Create a base URL like "https://ui5.sap.com/1.120.30" or "https://sdk.openui5.org/1.120.30"
|
|
73
|
+
const baseUrl = getBaseUrl(frameworkName, frameworkVersion);
|
|
74
|
+
// Get all libraries for version
|
|
75
|
+
const libraryNames = await getLibrariesForVersion(baseUrl);
|
|
76
|
+
const filePaths = await Promise.all(libraryNames.map(async (libName) => {
|
|
77
|
+
try {
|
|
78
|
+
const targetPath = path.join(targetDir, `${libName}.api.json`);
|
|
79
|
+
const url = `${baseUrl}/test-resources/${libName.replaceAll(".", "/")}/designtime/api.json`;
|
|
80
|
+
return await _fetchApiJson(targetPath, url);
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
if (err instanceof Error &&
|
|
84
|
+
err.message.includes("The requested resource does not exist") &&
|
|
85
|
+
libName !== "sap.ui.core") {
|
|
86
|
+
// Ignore 404 errors for libraries that might not have an API JSON file
|
|
87
|
+
// always throw for core to catch general issues with the URL
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
throw err;
|
|
91
|
+
}
|
|
92
|
+
}));
|
|
93
|
+
return filePaths.filter((p) => !!p); // Filter out undefined entries
|
|
94
|
+
}
|
|
95
|
+
export async function _createApiIndex(targetDir, apiJsonPaths) {
|
|
96
|
+
const indexMap = new Map();
|
|
97
|
+
await Promise.all(apiJsonPaths.map(async (apiJsonPath) => {
|
|
98
|
+
const apiJson = await readFile(apiJsonPath, "utf-8");
|
|
99
|
+
const apiJsonParsed = JSON.parse(apiJson);
|
|
100
|
+
for (const symbol of apiJsonParsed.symbols) {
|
|
101
|
+
let moduleName = symbol.name.toLowerCase();
|
|
102
|
+
if (moduleName.startsWith("module:")) {
|
|
103
|
+
// Normalize module names
|
|
104
|
+
moduleName = moduleName.substring("module:".length).replaceAll("/", ".");
|
|
105
|
+
}
|
|
106
|
+
if (indexMap.has(moduleName)) {
|
|
107
|
+
log.verbose(`Duplicate symbol name found: ${moduleName} in ${apiJsonPath}`);
|
|
108
|
+
// Ignore this entry unless it matches the module name exactly
|
|
109
|
+
if (moduleName !== symbol.module) {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
indexMap.set(moduleName, {
|
|
114
|
+
name: symbol.name,
|
|
115
|
+
filePath: path.relative(targetDir, apiJsonPath),
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}));
|
|
119
|
+
const indexPath = path.join(targetDir, "index.json");
|
|
120
|
+
await writeFile(indexPath, JSON.stringify(Object.fromEntries(indexMap), null, 4), "utf-8");
|
|
121
|
+
}
|
|
122
|
+
export async function _fetchApiJson(targetPath, url) {
|
|
123
|
+
const response = await fetchCdnRaw(url);
|
|
124
|
+
await pipeline(response.body, createWriteStream(targetPath));
|
|
125
|
+
return targetPath;
|
|
126
|
+
}
|
|
127
|
+
export async function getLibrariesForVersion(baseUrl) {
|
|
128
|
+
const url = `${baseUrl}/resources/sap-ui-version.json`;
|
|
129
|
+
const sapUiVersionJson = await fetchCdn(url);
|
|
130
|
+
return sapUiVersionJson.libraries
|
|
131
|
+
.filter(({ name, npmPackageName }) => {
|
|
132
|
+
return !!npmPackageName && !name.startsWith("themelib_");
|
|
133
|
+
})
|
|
134
|
+
.map(({ name }) => {
|
|
135
|
+
return name;
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=apiReferenceResources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiReferenceResources.js","sourceRoot":"","sources":["../../../../src/tools/get_api_reference/lib/apiReferenceResources.ts"],"names":[],"mappings":"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"}
|