@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.
Files changed (221) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/LICENSE +201 -0
  3. package/LICENSES/Apache-2.0.txt +73 -0
  4. package/README.md +131 -0
  5. package/bin/ui5mcp.js +2 -0
  6. package/lib/Context.d.ts +28 -0
  7. package/lib/Context.js +71 -0
  8. package/lib/Context.js.map +1 -0
  9. package/lib/api.d.ts +3 -0
  10. package/lib/api.js +3 -0
  11. package/lib/api.js.map +1 -0
  12. package/lib/cli.d.ts +1 -0
  13. package/lib/cli.js +12 -0
  14. package/lib/cli.js.map +1 -0
  15. package/lib/registerTools.d.ts +133 -0
  16. package/lib/registerTools.js +59 -0
  17. package/lib/registerTools.js.map +1 -0
  18. package/lib/resources/documentation/getDocumentation.d.ts +18 -0
  19. package/lib/resources/documentation/getDocumentation.js +70 -0
  20. package/lib/resources/documentation/getDocumentation.js.map +1 -0
  21. package/lib/server.d.ts +10 -0
  22. package/lib/server.js +113 -0
  23. package/lib/server.js.map +1 -0
  24. package/lib/tools/create_ui5_app/ODataMetadata.d.ts +55 -0
  25. package/lib/tools/create_ui5_app/ODataMetadata.js +99 -0
  26. package/lib/tools/create_ui5_app/ODataMetadata.js.map +1 -0
  27. package/lib/tools/create_ui5_app/createSuccessMessage.d.ts +13 -0
  28. package/lib/tools/create_ui5_app/createSuccessMessage.js +45 -0
  29. package/lib/tools/create_ui5_app/createSuccessMessage.js.map +1 -0
  30. package/lib/tools/create_ui5_app/create_ui5_app.d.ts +8 -0
  31. package/lib/tools/create_ui5_app/create_ui5_app.js +273 -0
  32. package/lib/tools/create_ui5_app/create_ui5_app.js.map +1 -0
  33. package/lib/tools/create_ui5_app/index.d.ts +3 -0
  34. package/lib/tools/create_ui5_app/index.js +58 -0
  35. package/lib/tools/create_ui5_app/index.js.map +1 -0
  36. package/lib/tools/create_ui5_app/isValidUrl.d.ts +16 -0
  37. package/lib/tools/create_ui5_app/isValidUrl.js +59 -0
  38. package/lib/tools/create_ui5_app/isValidUrl.js.map +1 -0
  39. package/lib/tools/create_ui5_app/schema.d.ts +135 -0
  40. package/lib/tools/create_ui5_app/schema.js +67 -0
  41. package/lib/tools/create_ui5_app/schema.js.map +1 -0
  42. package/lib/tools/create_ui5_app/templateProcessor.d.ts +67 -0
  43. package/lib/tools/create_ui5_app/templateProcessor.js +59 -0
  44. package/lib/tools/create_ui5_app/templateProcessor.js.map +1 -0
  45. package/lib/tools/create_ui5_app/ui5Version.d.ts +2 -0
  46. package/lib/tools/create_ui5_app/ui5Version.js +6 -0
  47. package/lib/tools/create_ui5_app/ui5Version.js.map +1 -0
  48. package/lib/tools/get_api_reference/createUriForSymbol.d.ts +2 -0
  49. package/lib/tools/get_api_reference/createUriForSymbol.js +49 -0
  50. package/lib/tools/get_api_reference/createUriForSymbol.js.map +1 -0
  51. package/lib/tools/get_api_reference/getApiReference.d.ts +10 -0
  52. package/lib/tools/get_api_reference/getApiReference.js +51 -0
  53. package/lib/tools/get_api_reference/getApiReference.js.map +1 -0
  54. package/lib/tools/get_api_reference/index.d.ts +3 -0
  55. package/lib/tools/get_api_reference/index.js +38 -0
  56. package/lib/tools/get_api_reference/index.js.map +1 -0
  57. package/lib/tools/get_api_reference/lib/ApiReferenceProvider.d.ts +85 -0
  58. package/lib/tools/get_api_reference/lib/ApiReferenceProvider.js +452 -0
  59. package/lib/tools/get_api_reference/lib/ApiReferenceProvider.js.map +1 -0
  60. package/lib/tools/get_api_reference/lib/apiReferenceResources.d.ts +18 -0
  61. package/lib/tools/get_api_reference/lib/apiReferenceResources.js +138 -0
  62. package/lib/tools/get_api_reference/lib/apiReferenceResources.js.map +1 -0
  63. package/lib/tools/get_api_reference/lib/formatSymbol.d.ts +24 -0
  64. package/lib/tools/get_api_reference/lib/formatSymbol.js +109 -0
  65. package/lib/tools/get_api_reference/lib/formatSymbol.js.map +1 -0
  66. package/lib/tools/get_api_reference/schema.d.ts +16 -0
  67. package/lib/tools/get_api_reference/schema.js +12 -0
  68. package/lib/tools/get_api_reference/schema.js.map +1 -0
  69. package/lib/tools/get_guidelines/guidelines.d.ts +1 -0
  70. package/lib/tools/get_guidelines/guidelines.js +6 -0
  71. package/lib/tools/get_guidelines/guidelines.js.map +1 -0
  72. package/lib/tools/get_guidelines/index.d.ts +3 -0
  73. package/lib/tools/get_guidelines/index.js +30 -0
  74. package/lib/tools/get_guidelines/index.js.map +1 -0
  75. package/lib/tools/get_project_info/getProjectInfo.d.ts +2 -0
  76. package/lib/tools/get_project_info/getProjectInfo.js +205 -0
  77. package/lib/tools/get_project_info/getProjectInfo.js.map +1 -0
  78. package/lib/tools/get_project_info/index.d.ts +3 -0
  79. package/lib/tools/get_project_info/index.js +28 -0
  80. package/lib/tools/get_project_info/index.js.map +1 -0
  81. package/lib/tools/get_project_info/schema.d.ts +87 -0
  82. package/lib/tools/get_project_info/schema.js +28 -0
  83. package/lib/tools/get_project_info/schema.js.map +1 -0
  84. package/lib/tools/get_version_info/getVersionInfo.d.ts +8 -0
  85. package/lib/tools/get_version_info/getVersionInfo.js +41 -0
  86. package/lib/tools/get_version_info/getVersionInfo.js.map +1 -0
  87. package/lib/tools/get_version_info/index.d.ts +9 -0
  88. package/lib/tools/get_version_info/index.js +33 -0
  89. package/lib/tools/get_version_info/index.js.map +1 -0
  90. package/lib/tools/get_version_info/schema.d.ts +66 -0
  91. package/lib/tools/get_version_info/schema.js +16 -0
  92. package/lib/tools/get_version_info/schema.js.map +1 -0
  93. package/lib/tools/get_version_info/types.d.ts +5 -0
  94. package/lib/tools/get_version_info/types.js +2 -0
  95. package/lib/tools/get_version_info/types.js.map +1 -0
  96. package/lib/tools/run_ui5_linter/index.d.ts +3 -0
  97. package/lib/tools/run_ui5_linter/index.js +86 -0
  98. package/lib/tools/run_ui5_linter/index.js.map +1 -0
  99. package/lib/tools/run_ui5_linter/migrationGuides.d.ts +6 -0
  100. package/lib/tools/run_ui5_linter/migrationGuides.js +88 -0
  101. package/lib/tools/run_ui5_linter/migrationGuides.js.map +1 -0
  102. package/lib/tools/run_ui5_linter/resultContext.d.ts +3 -0
  103. package/lib/tools/run_ui5_linter/resultContext.js +236 -0
  104. package/lib/tools/run_ui5_linter/resultContext.js.map +1 -0
  105. package/lib/tools/run_ui5_linter/runUi5Linter.d.ts +2 -0
  106. package/lib/tools/run_ui5_linter/runUi5Linter.js +72 -0
  107. package/lib/tools/run_ui5_linter/runUi5Linter.js.map +1 -0
  108. package/lib/tools/run_ui5_linter/schema.d.ts +340 -0
  109. package/lib/tools/run_ui5_linter/schema.js +55 -0
  110. package/lib/tools/run_ui5_linter/schema.js.map +1 -0
  111. package/lib/utils/cdnHelper.d.ts +9 -0
  112. package/lib/utils/cdnHelper.js +50 -0
  113. package/lib/utils/cdnHelper.js.map +1 -0
  114. package/lib/utils/dataStorageHelper.d.ts +2 -0
  115. package/lib/utils/dataStorageHelper.js +65 -0
  116. package/lib/utils/dataStorageHelper.js.map +1 -0
  117. package/lib/utils/ui5Framework.d.ts +4 -0
  118. package/lib/utils/ui5Framework.js +6 -0
  119. package/lib/utils/ui5Framework.js.map +1 -0
  120. package/lib/utils.d.ts +10 -0
  121. package/lib/utils.js +87 -0
  122. package/lib/utils.js.map +1 -0
  123. package/npm-shrinkwrap.json +7880 -0
  124. package/package.json +121 -0
  125. package/resources/docs/1.136.7/00737d6c1b864dc3ab72ef56611491c4.md +155 -0
  126. package/resources/docs/1.136.7/0187ea5e2eff4166b0453b9dcc8fc64f.md +164 -0
  127. package/resources/docs/1.136.7/032be2cb2e1d4115af20862673bedcdb.md +12 -0
  128. package/resources/docs/1.136.7/28fcd55b04654977b63dacbee0552712.md +317 -0
  129. package/resources/docs/1.136.7/676b636446c94eada183b1218a824717.md +135 -0
  130. package/resources/docs/1.136.7/a87ca843bcee469f82a9072927a7dcdb.md +355 -0
  131. package/resources/docs/1.136.7/b0fb4de7364f4bcbb053a99aa645affe.md +126 -0
  132. package/resources/docs/1.136.7/fe1a6dba940e479fb7c3bc753f92b28c.md +670 -0
  133. package/resources/docs/1.136.7/index.json +58 -0
  134. package/resources/guidelines.md +104 -0
  135. package/resources/migrationGuides/deprecated-controller-factory.md +116 -0
  136. package/resources/migrationGuides/deprecated-getLibraryResourceBundle.md +62 -0
  137. package/resources/migrationGuides/deprecated-jquery-sap-require.md +141 -0
  138. package/resources/migrationGuides/deprecated-messagePage.md +162 -0
  139. package/resources/migrationGuides/deprecated-table-table-property.md +154 -0
  140. package/resources/template-js/LICENSE +201 -0
  141. package/resources/template-js/README.md +87 -0
  142. package/resources/template-js/_.editorconfig +22 -0
  143. package/resources/template-js/_.gitignore +17 -0
  144. package/resources/template-js/eslint.config.js +68 -0
  145. package/resources/template-js/karma-ci-cov.conf.js +20 -0
  146. package/resources/template-js/karma-ci.conf.js +9 -0
  147. package/resources/template-js/karma.conf.js +9 -0
  148. package/resources/template-js/package.json +34 -0
  149. package/resources/template-js/ui5-dist.yaml +18 -0
  150. package/resources/template-js/ui5.yaml +24 -0
  151. package/resources/template-js/webapp/Component.js +41 -0
  152. package/resources/template-js/webapp/controller/App.controller.js +10 -0
  153. package/resources/template-js/webapp/controller/BaseController.js +67 -0
  154. package/resources/template-js/webapp/controller/Main.controller.js +14 -0
  155. package/resources/template-js/webapp/i18n/i18n.properties +3 -0
  156. package/resources/template-js/webapp/i18n/i18n_en.properties +3 -0
  157. package/resources/template-js/webapp/index-cdn.html +34 -0
  158. package/resources/template-js/webapp/index.html +34 -0
  159. package/resources/template-js/webapp/manifest.json +103 -0
  160. package/resources/template-js/webapp/model/formatter.js +9 -0
  161. package/resources/template-js/webapp/model/models.js +11 -0
  162. package/resources/template-js/webapp/test/Test.qunit.html +16 -0
  163. package/resources/template-js/webapp/test/integration/HelloJourney.js +85 -0
  164. package/resources/template-js/webapp/test/integration/opaTests.qunit.js +1 -0
  165. package/resources/template-js/webapp/test/integration/pages/Main.js +112 -0
  166. package/resources/template-js/webapp/test/testsuite.qunit.html +18 -0
  167. package/resources/template-js/webapp/test/testsuite.qunit.js +37 -0
  168. package/resources/template-js/webapp/test/unit/controller/Main.qunit.js +11 -0
  169. package/resources/template-js/webapp/test/unit/unitTests.qunit.js +1 -0
  170. package/resources/template-js/webapp/test-lt1_124/integration/HelloJourney.js +85 -0
  171. package/resources/template-js/webapp/test-lt1_124/integration/opaTests.qunit.html +31 -0
  172. package/resources/template-js/webapp/test-lt1_124/integration/opaTests.qunit.js +11 -0
  173. package/resources/template-js/webapp/test-lt1_124/integration/pages/Main.js +112 -0
  174. package/resources/template-js/webapp/test-lt1_124/testsuite.qunit.html +13 -0
  175. package/resources/template-js/webapp/test-lt1_124/testsuite.qunit.js +9 -0
  176. package/resources/template-js/webapp/test-lt1_124/unit/controller/Main.qunit.js +11 -0
  177. package/resources/template-js/webapp/test-lt1_124/unit/unitTests.qunit.html +30 -0
  178. package/resources/template-js/webapp/test-lt1_124/unit/unitTests.qunit.js +12 -0
  179. package/resources/template-js/webapp/view/App.view.xml +9 -0
  180. package/resources/template-js/webapp/view/Main.view.xml +90 -0
  181. package/resources/template-ts/LICENSE +201 -0
  182. package/resources/template-ts/README.md +101 -0
  183. package/resources/template-ts/_.editorconfig +23 -0
  184. package/resources/template-ts/_.gitignore +18 -0
  185. package/resources/template-ts/_.nycrc.json +7 -0
  186. package/resources/template-ts/_tsconfig.json +21 -0
  187. package/resources/template-ts/eslint.config.mjs +27 -0
  188. package/resources/template-ts/package.json +40 -0
  189. package/resources/template-ts/ui5-coverage.yaml +40 -0
  190. package/resources/template-ts/ui5-dist.yaml +18 -0
  191. package/resources/template-ts/ui5.yaml +27 -0
  192. package/resources/template-ts/webapp/Component.ts +49 -0
  193. package/resources/template-ts/webapp/controller/App.controller.ts +11 -0
  194. package/resources/template-ts/webapp/controller/BaseController.ts +83 -0
  195. package/resources/template-ts/webapp/controller/Main.controller.ts +19 -0
  196. package/resources/template-ts/webapp/i18n/i18n.properties +3 -0
  197. package/resources/template-ts/webapp/i18n/i18n_en.properties +3 -0
  198. package/resources/template-ts/webapp/index-cdn.html +35 -0
  199. package/resources/template-ts/webapp/index.html +35 -0
  200. package/resources/template-ts/webapp/manifest.json +105 -0
  201. package/resources/template-ts/webapp/model/formatter.ts +5 -0
  202. package/resources/template-ts/webapp/model/models.ts +15 -0
  203. package/resources/template-ts/webapp/test/Test.qunit.html +16 -0
  204. package/resources/template-ts/webapp/test/integration/HelloJourney.ts +84 -0
  205. package/resources/template-ts/webapp/test/integration/opaTests.qunit.ts +2 -0
  206. package/resources/template-ts/webapp/test/integration/pages/MainPage.ts +112 -0
  207. package/resources/template-ts/webapp/test/testsuite.qunit.html +18 -0
  208. package/resources/template-ts/webapp/test/testsuite.qunit.ts +33 -0
  209. package/resources/template-ts/webapp/test/unit/controller/Main.qunit.ts +8 -0
  210. package/resources/template-ts/webapp/test/unit/unitTests.qunit.ts +2 -0
  211. package/resources/template-ts/webapp/test-lt1_124/integration/HelloJourney.ts +86 -0
  212. package/resources/template-ts/webapp/test-lt1_124/integration/opaTests.qunit.html +34 -0
  213. package/resources/template-ts/webapp/test-lt1_124/integration/opaTests.qunit.ts +8 -0
  214. package/resources/template-ts/webapp/test-lt1_124/integration/pages/MainPage.ts +112 -0
  215. package/resources/template-ts/webapp/test-lt1_124/testsuite.qunit.html +13 -0
  216. package/resources/template-ts/webapp/test-lt1_124/testsuite.qunit.ts +9 -0
  217. package/resources/template-ts/webapp/test-lt1_124/unit/controller/Main.qunit.ts +8 -0
  218. package/resources/template-ts/webapp/test-lt1_124/unit/unitTests.qunit.html +37 -0
  219. package/resources/template-ts/webapp/test-lt1_124/unit/unitTests.qunit.ts +8 -0
  220. package/resources/template-ts/webapp/view/App.view.xml +9 -0
  221. 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":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAqB1C,OAAO,EAAC,KAAK,EAAC,MAAM,aAAa,CAAC;AAClC,OAAO,EAAc,eAAe,EAAC,MAAM,gCAAgC,CAAC;AAC5E,OAAO,EAAC,aAAa,EAAC,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAC,YAAY,EAA2C,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAgBzG,MAAM,CAAN,IAAY,UAuBX;AAvBD,WAAY,UAAU;IACrB,uBAAuB;IACvB,6BAAe,CAAA;IACf,qCAAuB,CAAA;IACvB,qCAAuB,CAAA;IACvB,2BAAa,CAAA;IACb,+BAAiB,CAAA;IACjB,+BAAiB,CAAA;IACjB,iCAAmB,CAAA;IACnB,mCAAqB,CAAA;IAErB,6DAA6D;IAC7D,mCAAqB,CAAA;IACrB,yCAA2B,CAAA;IAC3B,+BAAiB,CAAA;IACjB,6BAAe,CAAA;IACf,qCAAuB,CAAA;IACvB,4CAA8B,CAAA;IAC9B,0CAA4B,CAAA;IAC5B,oCAAsB,CAAA;IACtB,gDAAkC,CAAA;IAClC,gDAAkC,CAAA;IAClC,sDAAwC,CAAA;AACzC,CAAC,EAvBW,UAAU,KAAV,UAAU,QAuBrB;AAQD,MAAM,4BAA4B,GAAG;IACpC,eAAe,CAAC,MAAM;IACtB,eAAe,CAAC,SAAS;IACzB,eAAe,CAAC,KAAK;IACrB,eAAe,CAAC,WAAW;IAC3B,eAAe,CAAC,QAAQ;IACxB,eAAe,CAAC,MAAM;IACtB,eAAe,CAAC,QAAQ;IACxB,eAAe,CAAC,IAAI;IACpB,eAAe,CAAC,mBAAmB;IACnC,eAAe,CAAC,mBAAmB;IACnC,eAAe,CAAC,aAAa;IAC7B,eAAe,CAAC,gBAAgB;CAChC,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,oBAAoB;IAKpB;IAAiC;IAJrD,sCAAsC;IAC9B,WAAW,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC7C,gBAAgB,GAAG,IAAI,KAAK,EAAE,CAAC;IAEvC,YAAoB,eAAuB,EAAU,KAAwB;QAAzD,oBAAe,GAAf,eAAe,CAAQ;QAAU,UAAK,GAAL,KAAK,CAAmB;IAAG,CAAC;IAEjF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,eAAuB;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;QAC3D,IAAI,CAAC;YACJ,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACjD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAsB,CAAC;YAC3D,OAAO,IAAI,oBAAoB,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACd,yCAAyC,SAAS,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACnF,CAAC;IACF,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa;QAC7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACvB,OAAO,YAAY,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;YACxD,CAAC,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,KAAa;QAGzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACvB,IAAI,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;oBAChC,qFAAqF;oBACrF,OAAO,eAAe,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;gBAC3D,CAAC;gBACD,OAAO,YAAY,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;YACxD,CAAC,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACrC,wFAAwF;YACxF,OAAO,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAa;QAC9B,4EAA4E;QAC5E,0CAA0C;QAC1C,IAAI,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,UAAU,CAAC;QACf,IAAI,WAAW,CAAC;QAChB,OAAO,CAAC,UAAU,EAAE,CAAC;YACpB,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACnC,IAAI,UAAU,EAAE,CAAC;gBAChB,MAAM;YACP,CAAC;YACD,kCAAkC;YAClC,MAAM,YAAY,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAChD,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;gBACzB,wCAAwC;gBACxC,MAAM;YACP,CAAC;YACD,WAAW,GAAG,SAAS,CAAC,SAAS,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;YACpD,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,CAAC,UAAU,EAAE,CAAC;YACjB,MAAM,IAAI,aAAa,CAAC,oCAAoC,KAAK,GAAG,CAAC,CAAC;QACvE,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,oGAAoG;YACpG,MAAM,IAAI,KAAK,CACd,kCAAkC,UAAU,CAAC,IAAI,uBAAuB,UAAU,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClG,CAAC;QACD,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,MAAM,CAAC,UAAU,KAAK,YAAY,EAAE,CAAC;YAC3E,MAAM,IAAI,aAAa,CAAC,WAAW,MAAM,CAAC,IAAI,qBAAqB,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,OAAO;gBACN,MAAM;gBACN,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,UAAU,EAAE,MAAM,CAAC,MAAM;aACzB,CAAC;QACH,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAChE,IAAI,WAAW,EAAE,CAAC;YACjB,OAAO;gBACN,MAAM,EAAE,WAAW;gBACnB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,UAAU,EAAE,MAAM,CAAC,MAAM;aACzB,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,gDAAgD;YAChD,IAAI,CAAC;gBACJ,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,OAAO,IAAI,WAAW,EAAE,CAAC,CAAC;YACnE,CAAC;YAAC,OAAO,IAAI,EAAE,CAAC;gBACf,0EAA0E;YAC3E,CAAC;QACF,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QACxF,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,OAAO,OAAO,CAAC;QAChB,CAAC;QAED,MAAM,IAAI,aAAa,CACtB,yBAAyB,WAAW,gBAAgB,MAAM,CAAC,IAAI,iBAAiB,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC;IACtG,CAAC;IAED,oBAAoB,CAAC,UAAkB,EAAE,WAAwB;QAChE,4DAA4D;QAC5D,sFAAsF;QACtF,+DAA+D;QAC/D,MAAM,aAAa,GAAiB,EAAE,CAAC;QACvC,KAAK,MAAM,MAAM,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACnD,IAAI,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,UAAU,EAAE,CAAC;gBACjD,aAAa,CAAC,IAAI,CAAC;oBAClB,MAAM;oBACN,OAAO,EAAE,WAAW,CAAC,OAAO;oBAC5B,UAAU,EAAE,UAAU;iBACtB,CAAC,CAAC;YACJ,CAAC;QACF,CAAC;QACD,OAAO,aAAa,CAAC;IACtB,CAAC;IAED;;;;;;OAMG;IACH,iBAAiB,CAChB,MAAsB,EACtB,KAAa;QAEb,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,OAAO,CAAC,CAAC,CAAC;gBACd,oEAAoE;gBACpE,IAAI,KAAK,KAAK,aAAa,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;oBACnD,OAAO;wBACN,IAAI,EAAE,UAAU,CAAC,WAAW;wBAC5B,GAAG,MAAM,CAAC,WAAW;qBACrB,CAAC;gBACH,CAAC;gBAED,+EAA+E;gBAC/E,IAAI,KAAK,GACR,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC;oBAC/D,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC;oBACpE,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;gBAE/D,IAAI,KAAK,EAAE,CAAC;oBACX,OAAO,KAAK,CAAC;gBACd,CAAC;gBAED,yDAAyD;gBACzD,IAAI,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;oBAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;oBACxC,KAAK;wBACJ,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,WAAW,CAAC;4BACzE,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC,cAAc,CAAC;4BAC9E,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC,cAAc,CAAC;4BAC9E,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC;4BAClE,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,eAAe,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;gBACvF,CAAC;gBAED,OAAO,KAAK,CAAC;YACd,CAAC;YACD,KAAK,WAAW,CAAC;YACjB,KAAK,QAAQ,CAAC,CAAC,oDAAoD;YACnE,KAAK,QAAQ;gBACZ,OAAO,CACN,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAG,MAA0B,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC;oBACpF,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAG,MAA0B,CAAC,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC;oBACzF,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAG,MAA0B,CAAC,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,CAClF,CAAC;YACH,KAAK,WAAW;gBACf,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC;oBACrE,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;YAChE,KAAK,MAAM;gBACV,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;YACjF,KAAK,SAAS;gBACb,iEAAiE;gBACjE,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC;oBAC1E,iEAAiE;oBACjE,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;YACxE,KAAK,UAAU;gBACd,6DAA6D;gBAC7D,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;YAC9E;gBACC,uEAAuE;gBACvE,OAAO,SAAS,CAAC;QACnB,CAAC;IACF,CAAC;IAED,gBAAgB,CACf,SAAiB,EAAE,YAA6B,EAAE,SAAqB;QAEvE,MAAM,KAAK,GAAG,YAAY,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC,CAAC;QAClF,IAAI,KAAK,EAAE,CAAC;YACX,OAAO;gBACN,IAAI,EAAE,SAAS;gBACf,GAAG,KAAK;aACR,CAAC;QACH,CAAC;IACF,CAAC;IAAA,CAAC;IAEF,KAAK,CAAC,mBAAmB,CAAC,WAAwB;QACjD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;QAChE,OAAO,YAAY,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;IACnF,CAAC;IAED,KAAK,CAAC,+BAA+B,CAAC,WAAwB;QAC7D,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;QAChE,IAAI,gBAAgB,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACzC,wFAAwF;YACxF,OAAO,eAAe,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;QACtF,CAAC;QACD,OAAO,YAAY,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;IACnF,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,WAAwB;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACrD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,EAAC,UAAU,EAAE,YAAY,EAAC,GAAG,QAAQ,CAAC;QAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,UAAU,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,qCAAqC,UAAU,GAAG,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,oGAAoG;YACpG,MAAM,IAAI,KAAK,CACd,kCAAkC,UAAU,CAAC,IAAI,uBAAuB,UAAU,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClG,CAAC;QAED,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;YAC7D,CAAC,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,KAAK,CACd,0EAA0E;gBAC1E,WAAW,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5B,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACrE,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CACd,yBAAyB,YAAY,CAAC,IAAI,gBAAgB,MAAM,CAAC,IAAI,iBAAiB,OAAO,CAAC,OAAO,GAAG,CACxG,CAAC;QACH,CAAC;QACD,OAAO;YACN,MAAM,EAAE,WAAW;YACnB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,UAAU,EAAE,UAAU,CAAC,IAAI;SAC3B,CAAC;IACH,CAAC;IAED,iBAAiB,CAAC,WAAwB;QACzC,IAAI,WAAW,CAAC,IAAI,KAAK,eAAe,CAAC,MAAM,EAAE,CAAC;YACjD,OAAO;gBACN,UAAU,EAAE,WAAW,CAAC,IAAI;gBAC5B,YAAY,EAAE,WAAW;aACzB,CAAC;QACH,CAAC;QACD,IAAI,YAAY,CAAC;QACjB,IAAI,SAAS,CAAC;QACd,OAAO,QAAQ,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;YACtD,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,KAAK,eAAe,CAAC,MAAM,EAAE,CAAC;gBACxD,YAAY,KAAK,WAAW,CAAC;gBAC7B,OAAO;oBACN,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI;oBACnC,YAAY;iBACZ,CAAC;YACH,CAAC;iBAAM,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBAClE,IAAI,SAAS,EAAE,CAAC;oBACf,SAAS,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC;gBACvD,CAAC;qBAAM,CAAC;oBACP,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;gBACrC,CAAC;YACF,CAAC;iBAAM,CAAC;gBACP,SAAS,GAAG,IAAI,CAAC;YAClB,CAAC;YACD,IAAI,CAAC,YAAY,IAAI,4BAA4B,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9E,YAAY,GAAG,WAAW,CAAC;YAC5B,CAAC;YACD,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC;QAClC,CAAC;QACD,IAAI,WAAW,CAAC,IAAI,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;YACpD,yGAAyG;YACzG,OAAO;gBACN,UAAU,EAAE,SAAS,IAAI,WAAW,CAAC,IAAI;gBACzC,YAAY,EAAE,YAAY,IAAI,WAAW;aACzC,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,qBAAqB,CACpB,MAAoE,EACpE,WAAwB;QAExB,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACnD,QAAQ,WAAW,CAAC,IAAI,EAAE,CAAC;YAC1B,KAAK,eAAe,CAAC,MAAM,CAAC;YAC5B,KAAK,eAAe,CAAC,SAAS,CAAC;YAC/B,KAAK,eAAe,CAAC,KAAK;gBACzB,OAAO,MAAM,CAAC;YACf,KAAK,eAAe,CAAC,WAAW;gBAC/B,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC/B,MAAM,IAAI,KAAK,CAAC,iDAAiD,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBACjF,CAAC;gBACD,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;oBACzB,OAAO;gBACR,CAAC;gBACD,OAAO;oBACN,IAAI,EAAE,UAAU,CAAC,WAAW;oBAC5B,GAAG,MAAM,CAAC,WAAW;iBACrB,CAAC;YACH,KAAK,eAAe,CAAC,QAAQ,CAAC;YAC9B,KAAK,eAAe,CAAC,MAAM;gBAC1B,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC;oBACjG,MAAM,IAAI,KAAK,CACd,yEAAyE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC1F,CAAC;gBACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,EACvD,WAAW,CAAC,IAAI,KAAK,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACzF,KAAK,eAAe,CAAC,aAAa;gBACjC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC;oBACjG,MAAM,IAAI,KAAK,CACd,yEAAyE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC1F,CAAC;gBACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC,MAAoB,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;YAC1F,KAAK,eAAe,CAAC,QAAQ;gBAC5B,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC;oBAChE,MAAM,IAAI,KAAK,CAAC,8DAA8D,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC9F,CAAC;gBACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;YACnF,KAAK,eAAe,CAAC,IAAI;gBACxB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC9B,MAAM,IAAI,KAAK,CAAC,iDAAiD,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBACjF,CAAC;gBACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;YACvF,KAAK,eAAe,CAAC,mBAAmB;gBACvC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC/B,MAAM,IAAI,KAAK,CAAC,iDAAiD,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBACjF,CAAC;gBACD,OAAO,IAAI,CAAC,gBAAgB,CAC3B,WAAW,EAAE,MAAM,CAAC,cAAc,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC;YAChF,KAAK,eAAe,CAAC,mBAAmB;gBACvC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC/B,MAAM,IAAI,KAAK,CAAC,iDAAiD,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBACjF,CAAC;gBACD,OAAO,IAAI,CAAC,gBAAgB,CAC3B,WAAW,EAAE,MAAM,CAAC,cAAc,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC;YAChF,KAAK,eAAe,CAAC,gBAAgB;gBACpC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC/B,MAAM,IAAI,KAAK,CAAC,iDAAiD,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBACjF,CAAC;gBACD,OAAO,IAAI,CAAC,gBAAgB,CAC3B,WAAW,EAAE,MAAM,CAAC,cAAc,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;QAC5E,CAAC;IACF,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAAgB;QACjC,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;QACxC,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;QACtD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;QAC9D,IAAI,CAAC;YACJ,kFAAkF;YAClF,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACpC,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;YACxC,CAAC;YAED,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC5D,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAY,CAAC;YAC5D,MAAM,WAAW,GAAG;gBACnB,OAAO,EAAE,IAAI,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC/D,OAAO,EAAE,aAAa,CAAC,OAAO;aAC9B,CAAC;YACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YAC5C,OAAO,WAAW,CAAC;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACd,mCAAmC,WAAW,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/E,CAAC;gBAAS,CAAC;YACV,OAAO,EAAE,CAAC;QACX,CAAC;IACF,CAAC;IAED;;;;;;OAMG;IACH,kBAAkB,CAAC,KAAa;QAC/B,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACnC,sCAAsC;QACtC,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACjC,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC;QACD,2DAA2D;QAC3D,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAClC,uCAAuC;QACvC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACpC,OAAO,KAAK,CAAC;IACd,CAAC;IAED,uBAAuB,CAAC,KAAa;QACpC,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACvC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAClC,OAAO,KAAK,CAAC;IACd,CAAC;CACD;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAkB;IAClD,OAAO,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC;AAChC,CAAC;AACD,MAAM,UAAU,oBAAoB,CAAC,MAAkB;IACtD,OAAO,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC;AACpC,CAAC;AACD,MAAM,UAAU,oBAAoB,CAAC,MAAkB;IACtD,OAAO,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAkB;IACjD,OAAO,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC;AAC/B,CAAC;AAED,MAAM,qBAAqB,GAAiB;IAC3C,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI;IAC7E,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,QAAQ;CAC7E,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,MAA4C;IAC5E,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,qBAAqB,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAkB,CAAC,CAAC;AACnF,CAAC"}
@@ -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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"}