@mweinbach/apple-docs-mcp 1.0.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 (267) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +560 -0
  3. package/dist/constants/browser-headers.d.ts +48 -0
  4. package/dist/constants/browser-headers.d.ts.map +1 -0
  5. package/dist/constants/browser-headers.js +166 -0
  6. package/dist/constants/browser-headers.js.map +1 -0
  7. package/dist/index.d.ts +83 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +215 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/schemas/analyze-api.schema.d.ts +42 -0
  12. package/dist/schemas/analyze-api.schema.d.ts.map +1 -0
  13. package/dist/schemas/analyze-api.schema.js +23 -0
  14. package/dist/schemas/analyze-api.schema.js.map +1 -0
  15. package/dist/schemas/apple-docs.schema.d.ts +18 -0
  16. package/dist/schemas/apple-docs.schema.d.ts.map +1 -0
  17. package/dist/schemas/apple-docs.schema.js +10 -0
  18. package/dist/schemas/apple-docs.schema.js.map +1 -0
  19. package/dist/schemas/doc-content.schema.d.ts +24 -0
  20. package/dist/schemas/doc-content.schema.d.ts.map +1 -0
  21. package/dist/schemas/doc-content.schema.js +10 -0
  22. package/dist/schemas/doc-content.schema.js.map +1 -0
  23. package/dist/schemas/documentation-updates.schema.d.ts +27 -0
  24. package/dist/schemas/documentation-updates.schema.d.ts.map +1 -0
  25. package/dist/schemas/documentation-updates.schema.js +12 -0
  26. package/dist/schemas/documentation-updates.schema.js.map +1 -0
  27. package/dist/schemas/framework-symbols.schema.d.ts +24 -0
  28. package/dist/schemas/framework-symbols.schema.d.ts.map +1 -0
  29. package/dist/schemas/framework-symbols.schema.js +11 -0
  30. package/dist/schemas/framework-symbols.schema.js.map +1 -0
  31. package/dist/schemas/index.d.ts +15 -0
  32. package/dist/schemas/index.d.ts.map +1 -0
  33. package/dist/schemas/index.js +15 -0
  34. package/dist/schemas/index.js.map +1 -0
  35. package/dist/schemas/platform-compatibility.schema.d.ts +18 -0
  36. package/dist/schemas/platform-compatibility.schema.d.ts.map +1 -0
  37. package/dist/schemas/platform-compatibility.schema.js +8 -0
  38. package/dist/schemas/platform-compatibility.schema.js.map +1 -0
  39. package/dist/schemas/references.schema.d.ts +18 -0
  40. package/dist/schemas/references.schema.d.ts.map +1 -0
  41. package/dist/schemas/references.schema.js +9 -0
  42. package/dist/schemas/references.schema.js.map +1 -0
  43. package/dist/schemas/related-apis.schema.d.ts +21 -0
  44. package/dist/schemas/related-apis.schema.d.ts.map +1 -0
  45. package/dist/schemas/related-apis.schema.js +9 -0
  46. package/dist/schemas/related-apis.schema.js.map +1 -0
  47. package/dist/schemas/sample-code.schema.d.ts +21 -0
  48. package/dist/schemas/sample-code.schema.d.ts.map +1 -0
  49. package/dist/schemas/sample-code.schema.js +10 -0
  50. package/dist/schemas/sample-code.schema.js.map +1 -0
  51. package/dist/schemas/search.schema.d.ts +15 -0
  52. package/dist/schemas/search.schema.d.ts.map +1 -0
  53. package/dist/schemas/search.schema.js +8 -0
  54. package/dist/schemas/search.schema.js.map +1 -0
  55. package/dist/schemas/similar-apis.schema.d.ts +21 -0
  56. package/dist/schemas/similar-apis.schema.d.ts.map +1 -0
  57. package/dist/schemas/similar-apis.schema.js +9 -0
  58. package/dist/schemas/similar-apis.schema.js.map +1 -0
  59. package/dist/schemas/technologies.schema.d.ts +21 -0
  60. package/dist/schemas/technologies.schema.d.ts.map +1 -0
  61. package/dist/schemas/technologies.schema.js +10 -0
  62. package/dist/schemas/technologies.schema.js.map +1 -0
  63. package/dist/schemas/technology-overviews.schema.d.ts +24 -0
  64. package/dist/schemas/technology-overviews.schema.d.ts.map +1 -0
  65. package/dist/schemas/technology-overviews.schema.js +11 -0
  66. package/dist/schemas/technology-overviews.schema.js.map +1 -0
  67. package/dist/schemas/wwdc.schemas.d.ts +208 -0
  68. package/dist/schemas/wwdc.schemas.d.ts.map +1 -0
  69. package/dist/schemas/wwdc.schemas.js +97 -0
  70. package/dist/schemas/wwdc.schemas.js.map +1 -0
  71. package/dist/tools/definitions.d.ts +10 -0
  72. package/dist/tools/definitions.d.ts.map +1 -0
  73. package/dist/tools/definitions.js +690 -0
  74. package/dist/tools/definitions.js.map +1 -0
  75. package/dist/tools/doc-fetcher.d.ts +19 -0
  76. package/dist/tools/doc-fetcher.d.ts.map +1 -0
  77. package/dist/tools/doc-fetcher.js +487 -0
  78. package/dist/tools/doc-fetcher.js.map +1 -0
  79. package/dist/tools/doc-formatter.d.ts +69 -0
  80. package/dist/tools/doc-formatter.d.ts.map +1 -0
  81. package/dist/tools/doc-formatter.js +208 -0
  82. package/dist/tools/doc-formatter.js.map +1 -0
  83. package/dist/tools/find-similar-apis.d.ts +5 -0
  84. package/dist/tools/find-similar-apis.d.ts.map +1 -0
  85. package/dist/tools/find-similar-apis.js +275 -0
  86. package/dist/tools/find-similar-apis.js.map +1 -0
  87. package/dist/tools/get-documentation-updates.d.ts +5 -0
  88. package/dist/tools/get-documentation-updates.d.ts.map +1 -0
  89. package/dist/tools/get-documentation-updates.js +244 -0
  90. package/dist/tools/get-documentation-updates.js.map +1 -0
  91. package/dist/tools/get-platform-compatibility.d.ts +5 -0
  92. package/dist/tools/get-platform-compatibility.d.ts.map +1 -0
  93. package/dist/tools/get-platform-compatibility.js +205 -0
  94. package/dist/tools/get-platform-compatibility.js.map +1 -0
  95. package/dist/tools/get-related-apis.d.ts +5 -0
  96. package/dist/tools/get-related-apis.d.ts.map +1 -0
  97. package/dist/tools/get-related-apis.js +155 -0
  98. package/dist/tools/get-related-apis.js.map +1 -0
  99. package/dist/tools/get-sample-code.d.ts +5 -0
  100. package/dist/tools/get-sample-code.d.ts.map +1 -0
  101. package/dist/tools/get-sample-code.js +375 -0
  102. package/dist/tools/get-sample-code.js.map +1 -0
  103. package/dist/tools/get-technology-overviews.d.ts +5 -0
  104. package/dist/tools/get-technology-overviews.d.ts.map +1 -0
  105. package/dist/tools/get-technology-overviews.js +306 -0
  106. package/dist/tools/get-technology-overviews.js.map +1 -0
  107. package/dist/tools/handlers.d.ts +29 -0
  108. package/dist/tools/handlers.d.ts.map +1 -0
  109. package/dist/tools/handlers.js +350 -0
  110. package/dist/tools/handlers.js.map +1 -0
  111. package/dist/tools/list-technologies.d.ts +5 -0
  112. package/dist/tools/list-technologies.d.ts.map +1 -0
  113. package/dist/tools/list-technologies.js +165 -0
  114. package/dist/tools/list-technologies.js.map +1 -0
  115. package/dist/tools/resolve-references-batch.d.ts +5 -0
  116. package/dist/tools/resolve-references-batch.d.ts.map +1 -0
  117. package/dist/tools/resolve-references-batch.js +199 -0
  118. package/dist/tools/resolve-references-batch.js.map +1 -0
  119. package/dist/tools/search-framework-symbols.d.ts +7 -0
  120. package/dist/tools/search-framework-symbols.d.ts.map +1 -0
  121. package/dist/tools/search-framework-symbols.js +235 -0
  122. package/dist/tools/search-framework-symbols.js.map +1 -0
  123. package/dist/tools/search-parser.d.ts +15 -0
  124. package/dist/tools/search-parser.d.ts.map +1 -0
  125. package/dist/tools/search-parser.js +188 -0
  126. package/dist/tools/search-parser.js.map +1 -0
  127. package/dist/tools/search-result-parser.d.ts +52 -0
  128. package/dist/tools/search-result-parser.d.ts.map +1 -0
  129. package/dist/tools/search-result-parser.js +137 -0
  130. package/dist/tools/search-result-parser.js.map +1 -0
  131. package/dist/tools/tools-guide.d.ts +124 -0
  132. package/dist/tools/tools-guide.d.ts.map +1 -0
  133. package/dist/tools/tools-guide.js +389 -0
  134. package/dist/tools/tools-guide.js.map +1 -0
  135. package/dist/tools/wwdc/content-extractor.d.ts +9 -0
  136. package/dist/tools/wwdc/content-extractor.d.ts.map +1 -0
  137. package/dist/tools/wwdc/content-extractor.js +520 -0
  138. package/dist/tools/wwdc/content-extractor.js.map +1 -0
  139. package/dist/tools/wwdc/topics-extractor.d.ts +32 -0
  140. package/dist/tools/wwdc/topics-extractor.d.ts.map +1 -0
  141. package/dist/tools/wwdc/topics-extractor.js +146 -0
  142. package/dist/tools/wwdc/topics-extractor.js.map +1 -0
  143. package/dist/tools/wwdc/video-list-extractor.d.ts +13 -0
  144. package/dist/tools/wwdc/video-list-extractor.d.ts.map +1 -0
  145. package/dist/tools/wwdc/video-list-extractor.js +238 -0
  146. package/dist/tools/wwdc/video-list-extractor.js.map +1 -0
  147. package/dist/tools/wwdc/wwdc-handlers.d.ts +32 -0
  148. package/dist/tools/wwdc/wwdc-handlers.d.ts.map +1 -0
  149. package/dist/tools/wwdc/wwdc-handlers.js +791 -0
  150. package/dist/tools/wwdc/wwdc-handlers.js.map +1 -0
  151. package/dist/types/apple-docs.d.ts +112 -0
  152. package/dist/types/apple-docs.d.ts.map +1 -0
  153. package/dist/types/apple-docs.js +5 -0
  154. package/dist/types/apple-docs.js.map +1 -0
  155. package/dist/types/cache.d.ts +28 -0
  156. package/dist/types/cache.d.ts.map +1 -0
  157. package/dist/types/cache.js +5 -0
  158. package/dist/types/cache.js.map +1 -0
  159. package/dist/types/content-sections.d.ts +37 -0
  160. package/dist/types/content-sections.d.ts.map +1 -0
  161. package/dist/types/content-sections.js +5 -0
  162. package/dist/types/content-sections.js.map +1 -0
  163. package/dist/types/error.d.ts +39 -0
  164. package/dist/types/error.d.ts.map +1 -0
  165. package/dist/types/error.js +21 -0
  166. package/dist/types/error.js.map +1 -0
  167. package/dist/types/headers.d.ts +95 -0
  168. package/dist/types/headers.d.ts.map +1 -0
  169. package/dist/types/headers.js +5 -0
  170. package/dist/types/headers.js.map +1 -0
  171. package/dist/types/http.d.ts +31 -0
  172. package/dist/types/http.d.ts.map +1 -0
  173. package/dist/types/http.js +5 -0
  174. package/dist/types/http.js.map +1 -0
  175. package/dist/types/index.d.ts +11 -0
  176. package/dist/types/index.d.ts.map +1 -0
  177. package/dist/types/index.js +12 -0
  178. package/dist/types/index.js.map +1 -0
  179. package/dist/types/search.d.ts +62 -0
  180. package/dist/types/search.d.ts.map +1 -0
  181. package/dist/types/search.js +5 -0
  182. package/dist/types/search.js.map +1 -0
  183. package/dist/types/sections.d.ts +64 -0
  184. package/dist/types/sections.d.ts.map +1 -0
  185. package/dist/types/sections.js +5 -0
  186. package/dist/types/sections.js.map +1 -0
  187. package/dist/types/tools/platform.d.ts +33 -0
  188. package/dist/types/tools/platform.d.ts.map +1 -0
  189. package/dist/types/tools/platform.js +5 -0
  190. package/dist/types/tools/platform.js.map +1 -0
  191. package/dist/types/tools/sample-code.d.ts +23 -0
  192. package/dist/types/tools/sample-code.d.ts.map +1 -0
  193. package/dist/types/tools/sample-code.js +5 -0
  194. package/dist/types/tools/sample-code.js.map +1 -0
  195. package/dist/types/tools/technology.d.ts +18 -0
  196. package/dist/types/tools/technology.d.ts.map +1 -0
  197. package/dist/types/tools/technology.js +5 -0
  198. package/dist/types/tools/technology.js.map +1 -0
  199. package/dist/types/tools/updates.d.ts +23 -0
  200. package/dist/types/tools/updates.d.ts.map +1 -0
  201. package/dist/types/tools/updates.js +5 -0
  202. package/dist/types/tools/updates.js.map +1 -0
  203. package/dist/types/wwdc.d.ts +200 -0
  204. package/dist/types/wwdc.d.ts.map +1 -0
  205. package/dist/types/wwdc.js +5 -0
  206. package/dist/types/wwdc.js.map +1 -0
  207. package/dist/utils/cache-warmer.d.ts +22 -0
  208. package/dist/utils/cache-warmer.d.ts.map +1 -0
  209. package/dist/utils/cache-warmer.js +115 -0
  210. package/dist/utils/cache-warmer.js.map +1 -0
  211. package/dist/utils/cache.d.ts +109 -0
  212. package/dist/utils/cache.d.ts.map +1 -0
  213. package/dist/utils/cache.js +302 -0
  214. package/dist/utils/cache.js.map +1 -0
  215. package/dist/utils/constants.d.ts +178 -0
  216. package/dist/utils/constants.d.ts.map +1 -0
  217. package/dist/utils/constants.js +266 -0
  218. package/dist/utils/constants.js.map +1 -0
  219. package/dist/utils/error-handler.d.ts +80 -0
  220. package/dist/utils/error-handler.d.ts.map +1 -0
  221. package/dist/utils/error-handler.js +437 -0
  222. package/dist/utils/error-handler.js.map +1 -0
  223. package/dist/utils/framework-mapper.d.ts +84 -0
  224. package/dist/utils/framework-mapper.d.ts.map +1 -0
  225. package/dist/utils/framework-mapper.js +534 -0
  226. package/dist/utils/framework-mapper.js.map +1 -0
  227. package/dist/utils/http-client.d.ts +130 -0
  228. package/dist/utils/http-client.d.ts.map +1 -0
  229. package/dist/utils/http-client.js +464 -0
  230. package/dist/utils/http-client.js.map +1 -0
  231. package/dist/utils/http-headers-generator.d.ts +151 -0
  232. package/dist/utils/http-headers-generator.d.ts.map +1 -0
  233. package/dist/utils/http-headers-generator.js +407 -0
  234. package/dist/utils/http-headers-generator.js.map +1 -0
  235. package/dist/utils/logger.d.ts +44 -0
  236. package/dist/utils/logger.d.ts.map +1 -0
  237. package/dist/utils/logger.js +73 -0
  238. package/dist/utils/logger.js.map +1 -0
  239. package/dist/utils/preloader.d.ts +20 -0
  240. package/dist/utils/preloader.d.ts.map +1 -0
  241. package/dist/utils/preloader.js +82 -0
  242. package/dist/utils/preloader.js.map +1 -0
  243. package/dist/utils/rate-limiter.d.ts +28 -0
  244. package/dist/utils/rate-limiter.d.ts.map +1 -0
  245. package/dist/utils/rate-limiter.js +48 -0
  246. package/dist/utils/rate-limiter.js.map +1 -0
  247. package/dist/utils/topic-mapper.d.ts +18 -0
  248. package/dist/utils/topic-mapper.d.ts.map +1 -0
  249. package/dist/utils/topic-mapper.js +182 -0
  250. package/dist/utils/topic-mapper.js.map +1 -0
  251. package/dist/utils/url-converter.d.ts +22 -0
  252. package/dist/utils/url-converter.d.ts.map +1 -0
  253. package/dist/utils/url-converter.js +70 -0
  254. package/dist/utils/url-converter.js.map +1 -0
  255. package/dist/utils/user-agent-pool.d.ts +241 -0
  256. package/dist/utils/user-agent-pool.d.ts.map +1 -0
  257. package/dist/utils/user-agent-pool.js +557 -0
  258. package/dist/utils/user-agent-pool.js.map +1 -0
  259. package/dist/utils/wwdc-data-source-path.d.ts +9 -0
  260. package/dist/utils/wwdc-data-source-path.d.ts.map +1 -0
  261. package/dist/utils/wwdc-data-source-path.js +22 -0
  262. package/dist/utils/wwdc-data-source-path.js.map +1 -0
  263. package/dist/utils/wwdc-data-source.d.ts +36 -0
  264. package/dist/utils/wwdc-data-source.d.ts.map +1 -0
  265. package/dist/utils/wwdc-data-source.js +133 -0
  266. package/dist/utils/wwdc-data-source.js.map +1 -0
  267. package/package.json +83 -0
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Simple logger utility for consistent logging across the application
3
+ */
4
+ export var LogLevel;
5
+ (function (LogLevel) {
6
+ LogLevel["DEBUG"] = "debug";
7
+ LogLevel["INFO"] = "info";
8
+ LogLevel["WARN"] = "warn";
9
+ LogLevel["ERROR"] = "error";
10
+ })(LogLevel || (LogLevel = {}));
11
+ class Logger {
12
+ enabled = process.env.MCP_DEBUG === 'true';
13
+ level = LogLevel.INFO;
14
+ /**
15
+ * Log debug message
16
+ */
17
+ debug(message, ...args) {
18
+ if (this.enabled && this.shouldLog(LogLevel.DEBUG)) {
19
+ console.log(`[DEBUG] ${message}`, ...args);
20
+ }
21
+ }
22
+ /**
23
+ * Log info message
24
+ */
25
+ info(message, ...args) {
26
+ if (this.enabled && this.shouldLog(LogLevel.INFO)) {
27
+ console.log(`[INFO] ${message}`, ...args);
28
+ }
29
+ }
30
+ /**
31
+ * Log warning message
32
+ */
33
+ warn(message, ...args) {
34
+ if (this.shouldLog(LogLevel.WARN)) {
35
+ console.warn(`[WARN] ${message}`, ...args);
36
+ }
37
+ }
38
+ /**
39
+ * Log error message
40
+ */
41
+ error(message, error) {
42
+ if (this.shouldLog(LogLevel.ERROR)) {
43
+ console.error(`[ERROR] ${message}`);
44
+ if (error) {
45
+ console.error(error);
46
+ }
47
+ }
48
+ }
49
+ /**
50
+ * Check if should log based on level
51
+ */
52
+ shouldLog(level) {
53
+ const levels = [LogLevel.DEBUG, LogLevel.INFO, LogLevel.WARN, LogLevel.ERROR];
54
+ const currentLevelIndex = levels.indexOf(this.level);
55
+ const messageLevelIndex = levels.indexOf(level);
56
+ return messageLevelIndex >= currentLevelIndex;
57
+ }
58
+ /**
59
+ * Set log level
60
+ */
61
+ setLevel(level) {
62
+ this.level = level;
63
+ }
64
+ /**
65
+ * Enable/disable logging
66
+ */
67
+ setEnabled(enabled) {
68
+ this.enabled = enabled;
69
+ }
70
+ }
71
+ // Export singleton instance
72
+ export const logger = new Logger();
73
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAN,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,2BAAe,CAAA;IACf,yBAAa,CAAA;IACb,yBAAa,CAAA;IACb,2BAAe,CAAA;AACjB,CAAC,EALW,QAAQ,KAAR,QAAQ,QAKnB;AAED,MAAM,MAAM;IACF,OAAO,GAAY,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,MAAM,CAAC;IACpD,KAAK,GAAa,QAAQ,CAAC,IAAI,CAAC;IAExC;;OAEG;IACH,KAAK,CAAC,OAAe,EAAE,GAAG,IAAW;QACnC,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAe,EAAE,GAAG,IAAW;QAClC,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAe,EAAE,GAAG,IAAW;QAClC,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,UAAU,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAe,EAAE,KAAe;QACpC,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;YACpC,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,KAAe;QAC/B,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9E,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAChD,OAAO,iBAAiB,IAAI,iBAAiB,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,KAAe;QACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,OAAgB;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,4BAA4B;AAC5B,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Framework preloader for performance optimization
3
+ */
4
+ /**
5
+ * Preload popular framework indexes
6
+ */
7
+ export declare function preloadPopularFrameworks(): Promise<void>;
8
+ /**
9
+ * Preload specific frameworks based on user patterns
10
+ */
11
+ export declare function preloadFrameworksByUsage(recentFrameworks: string[]): Promise<void>;
12
+ /**
13
+ * Get preload statistics
14
+ */
15
+ export declare function getPreloadStats(): {
16
+ preloadedFrameworks: string[];
17
+ totalCached: number;
18
+ cacheHitRate: string;
19
+ };
20
+ //# sourceMappingURL=preloader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preloader.d.ts","sourceRoot":"","sources":["../../src/utils/preloader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkBH;;GAEG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC,CAwB9D;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,gBAAgB,EAAE,MAAM,EAAE,GACzB,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI;IACjC,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACpB,CAYF"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Framework preloader for performance optimization
3
+ */
4
+ import { searchFrameworkSymbols } from '../tools/search-framework-symbols.js';
5
+ import { indexCache } from './cache.js';
6
+ import { logger } from './logger.js';
7
+ import { normalizeFrameworkName, getFrameworksByCategory } from './framework-mapper.js';
8
+ /**
9
+ * Popular frameworks to preload (using normalized names)
10
+ */
11
+ const POPULAR_FRAMEWORKS = [
12
+ ...getFrameworksByCategory('UI'), // SwiftUI, UIKit, etc.
13
+ ...getFrameworksByCategory('Foundation'), // Foundation, Combine, Swift
14
+ ...getFrameworksByCategory('Data').slice(0, 2), // Core Data, CloudKit
15
+ ...getFrameworksByCategory('Graphics').slice(0, 2), // Core Graphics, Metal
16
+ ...getFrameworksByCategory('Games').slice(0, 3), // ARKit, SceneKit, SpriteKit
17
+ ].map(f => f.toLowerCase());
18
+ /**
19
+ * Preload popular framework indexes
20
+ */
21
+ export async function preloadPopularFrameworks() {
22
+ logger.info('Starting framework preload...');
23
+ const preloadPromises = POPULAR_FRAMEWORKS.map(async (framework) => {
24
+ try {
25
+ // Check if already cached
26
+ const cacheKey = `framework-index-${framework}`;
27
+ if (indexCache.has(cacheKey)) {
28
+ logger.debug(`Framework ${framework} already cached, skipping...`);
29
+ return;
30
+ }
31
+ // Load framework index with minimal results
32
+ logger.info(`Preloading framework: ${framework}`);
33
+ await searchFrameworkSymbols(framework, 'all', undefined, 'swift', 1);
34
+ logger.info(`Successfully preloaded: ${framework}`);
35
+ }
36
+ catch (error) {
37
+ logger.error(`Failed to preload ${framework}:`, error);
38
+ }
39
+ });
40
+ await Promise.all(preloadPromises);
41
+ logger.info('Framework preload completed');
42
+ }
43
+ /**
44
+ * Preload specific frameworks based on user patterns
45
+ */
46
+ export async function preloadFrameworksByUsage(recentFrameworks) {
47
+ // Normalize framework names and filter out popular ones
48
+ const frameworksToPreload = recentFrameworks
49
+ .map(f => normalizeFrameworkName(f))
50
+ .filter(f => f && !POPULAR_FRAMEWORKS.includes(f.toLowerCase()))
51
+ .map(f => f.toLowerCase());
52
+ if (frameworksToPreload.length === 0) {
53
+ return;
54
+ }
55
+ logger.info(`Preloading ${frameworksToPreload.length} user-specific frameworks...`);
56
+ const preloadPromises = frameworksToPreload.map(async (framework) => {
57
+ try {
58
+ await searchFrameworkSymbols(framework, 'all', undefined, 'swift', 1);
59
+ logger.info(`Preloaded user framework: ${framework}`);
60
+ }
61
+ catch (error) {
62
+ logger.error(`Failed to preload user framework ${framework}:`, error);
63
+ }
64
+ });
65
+ await Promise.all(preloadPromises);
66
+ }
67
+ /**
68
+ * Get preload statistics
69
+ */
70
+ export function getPreloadStats() {
71
+ const stats = indexCache.getStats();
72
+ const preloadedFrameworks = POPULAR_FRAMEWORKS.filter(framework => {
73
+ const cacheKey = `framework-index-${framework}`;
74
+ return indexCache.has(cacheKey);
75
+ });
76
+ return {
77
+ preloadedFrameworks,
78
+ totalCached: stats.size,
79
+ cacheHitRate: stats.hitRate,
80
+ };
81
+ }
82
+ //# sourceMappingURL=preloader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preloader.js","sourceRoot":"","sources":["../../src/utils/preloader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Rate limiter for API requests
3
+ */
4
+ export declare class RateLimiter {
5
+ private requests;
6
+ private readonly maxRequests;
7
+ private readonly windowMs;
8
+ constructor(maxRequests?: 100, windowMs?: 60000);
9
+ /**
10
+ * Check if a request can be made
11
+ */
12
+ canMakeRequest(): boolean;
13
+ /**
14
+ * Get current usage statistics
15
+ */
16
+ getStats(): {
17
+ currentRequests: number;
18
+ maxRequests: number;
19
+ windowMs: number;
20
+ utilizationRate: string;
21
+ };
22
+ /**
23
+ * Reset the rate limiter
24
+ */
25
+ reset(): void;
26
+ }
27
+ export declare const globalRateLimiter: RateLimiter;
28
+ //# sourceMappingURL=rate-limiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,WAAW,MAAqC,EAAE,QAAQ,QAAuB;IAK7F;;OAEG;IACH,cAAc,IAAI,OAAO;IAazB;;OAEG;IACH,QAAQ,IAAI;QACV,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,eAAe,EAAE,MAAM,CAAC;KACvB;IAYH;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AAGD,eAAO,MAAM,iBAAiB,aAA4E,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Rate limiter for API requests
3
+ */
4
+ import { RATE_LIMIT } from './constants.js';
5
+ export class RateLimiter {
6
+ requests = [];
7
+ maxRequests;
8
+ windowMs;
9
+ constructor(maxRequests = RATE_LIMIT.MAX_REQUESTS_PER_MINUTE, windowMs = RATE_LIMIT.WINDOW_MS) {
10
+ this.maxRequests = maxRequests;
11
+ this.windowMs = windowMs;
12
+ }
13
+ /**
14
+ * Check if a request can be made
15
+ */
16
+ canMakeRequest() {
17
+ const now = Date.now();
18
+ // Remove old requests outside the time window
19
+ this.requests = this.requests.filter(time => now - time < this.windowMs);
20
+ if (this.requests.length >= this.maxRequests) {
21
+ return false;
22
+ }
23
+ this.requests.push(now);
24
+ return true;
25
+ }
26
+ /**
27
+ * Get current usage statistics
28
+ */
29
+ getStats() {
30
+ const now = Date.now();
31
+ this.requests = this.requests.filter(time => now - time < this.windowMs);
32
+ return {
33
+ currentRequests: this.requests.length,
34
+ maxRequests: this.maxRequests,
35
+ windowMs: this.windowMs,
36
+ utilizationRate: ((this.requests.length / this.maxRequests) * 100).toFixed(2) + '%',
37
+ };
38
+ }
39
+ /**
40
+ * Reset the rate limiter
41
+ */
42
+ reset() {
43
+ this.requests = [];
44
+ }
45
+ }
46
+ // Create a global rate limiter instance
47
+ export const globalRateLimiter = new RateLimiter(RATE_LIMIT.MAX_REQUESTS_PER_MINUTE, RATE_LIMIT.WINDOW_MS);
48
+ //# sourceMappingURL=rate-limiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,MAAM,OAAO,WAAW;IACd,QAAQ,GAAa,EAAE,CAAC;IACf,WAAW,CAAS;IACpB,QAAQ,CAAS;IAElC,YAAY,WAAW,GAAG,UAAU,CAAC,uBAAuB,EAAE,QAAQ,GAAG,UAAU,CAAC,SAAS;QAC3F,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,8CAA8C;QAC9C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEzE,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC7C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,QAAQ;QAMN,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEzE,OAAO;YACL,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;YACrC,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG;SACpF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;CACF;AAED,wCAAwC;AACxC,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,WAAW,CAAC,UAAU,CAAC,uBAAuB,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * WWDC video topic classification mapping
3
+ */
4
+ export declare const STANDARD_TOPICS: readonly ["Accessibility & Inclusion", "App Services", "App Store, Distribution & Marketing", "Audio & Video", "Business & Education", "Design", "Developer Tools", "Essentials", "Graphics & Games", "Health & Fitness", "Maps & Location", "Machine Learning & AI", "Photos & Camera", "Privacy & Security", "Safari & Web", "Spatial Computing", "Swift", "SwiftUI & UI Frameworks", "System Services"];
5
+ export type StandardTopic = typeof STANDARD_TOPICS[number];
6
+ /**
7
+ * Infer topic categories based on video title and content
8
+ */
9
+ export declare function inferTopics(title: string, description?: string): StandardTopic[];
10
+ /**
11
+ * Validate if a topic is a standard topic
12
+ */
13
+ export declare function isStandardTopic(topic: string): topic is StandardTopic;
14
+ /**
15
+ * Normalize topic name to standard format
16
+ */
17
+ export declare function normalizeTopicName(topic: string): StandardTopic | null;
18
+ //# sourceMappingURL=topic-mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topic-mapper.d.ts","sourceRoot":"","sources":["../../src/utils/topic-mapper.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,eAAe,4YAoBlB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;AAgI3D;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE,CAiBhF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,aAAa,CAErE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAuBtE"}
@@ -0,0 +1,182 @@
1
+ /**
2
+ * WWDC video topic classification mapping
3
+ */
4
+ // Standard topic categories (based on Apple's official categories)
5
+ export const STANDARD_TOPICS = [
6
+ 'Accessibility & Inclusion',
7
+ 'App Services',
8
+ 'App Store, Distribution & Marketing',
9
+ 'Audio & Video',
10
+ 'Business & Education',
11
+ 'Design',
12
+ 'Developer Tools',
13
+ 'Essentials',
14
+ 'Graphics & Games',
15
+ 'Health & Fitness',
16
+ 'Maps & Location',
17
+ 'Machine Learning & AI',
18
+ 'Photos & Camera',
19
+ 'Privacy & Security',
20
+ 'Safari & Web',
21
+ 'Spatial Computing',
22
+ 'Swift',
23
+ 'SwiftUI & UI Frameworks',
24
+ 'System Services',
25
+ ];
26
+ // Keywords to topic mapping
27
+ const TOPIC_KEYWORDS = {
28
+ // Accessibility & Inclusion
29
+ 'accessibility': ['Accessibility & Inclusion'],
30
+ 'voiceover': ['Accessibility & Inclusion'],
31
+ 'inclusion': ['Accessibility & Inclusion'],
32
+ 'assistive': ['Accessibility & Inclusion'],
33
+ // App Services
34
+ 'cloudkit': ['App Services'],
35
+ 'push notification': ['App Services'],
36
+ 'app intents': ['App Services'],
37
+ 'siri': ['App Services'],
38
+ 'widgets': ['App Services'],
39
+ 'app shortcuts': ['App Services'],
40
+ // App Store, Distribution & Marketing
41
+ 'app store': ['App Store, Distribution & Marketing'],
42
+ 'testflight': ['App Store, Distribution & Marketing'],
43
+ 'app review': ['App Store, Distribution & Marketing'],
44
+ 'marketing': ['App Store, Distribution & Marketing'],
45
+ 'app analytics': ['App Store, Distribution & Marketing'],
46
+ // Audio & Video
47
+ 'avfoundation': ['Audio & Video'],
48
+ 'audio': ['Audio & Video'],
49
+ 'video': ['Audio & Video'],
50
+ 'media': ['Audio & Video'],
51
+ 'streaming': ['Audio & Video'],
52
+ 'hls': ['Audio & Video'],
53
+ // Business & Education
54
+ 'business': ['Business & Education'],
55
+ 'education': ['Business & Education'],
56
+ 'classroom': ['Business & Education'],
57
+ 'enterprise': ['Business & Education'],
58
+ // Design
59
+ 'design': ['Design'],
60
+ 'ui': ['Design', 'SwiftUI & UI Frameworks'],
61
+ 'ux': ['Design'],
62
+ 'human interface': ['Design'],
63
+ 'sf symbols': ['Design'],
64
+ // Developer Tools
65
+ 'xcode': ['Developer Tools'],
66
+ 'swift package': ['Developer Tools'],
67
+ 'instruments': ['Developer Tools'],
68
+ 'debugging': ['Developer Tools'],
69
+ 'testing': ['Developer Tools'],
70
+ 'swift testing': ['Developer Tools', 'Swift'],
71
+ // Graphics & Games
72
+ 'metal': ['Graphics & Games'],
73
+ 'game': ['Graphics & Games'],
74
+ 'graphics': ['Graphics & Games'],
75
+ 'realitykit': ['Graphics & Games', 'Spatial Computing'],
76
+ 'scenekit': ['Graphics & Games'],
77
+ // Health & Fitness
78
+ 'healthkit': ['Health & Fitness'],
79
+ 'workout': ['Health & Fitness'],
80
+ 'carekit': ['Health & Fitness'],
81
+ 'researchkit': ['Health & Fitness'],
82
+ // Machine Learning & AI
83
+ 'machine learning': ['Machine Learning & AI'],
84
+ 'ml': ['Machine Learning & AI'],
85
+ 'core ml': ['Machine Learning & AI'],
86
+ 'create ml': ['Machine Learning & AI'],
87
+ 'ai': ['Machine Learning & AI'],
88
+ 'intelligence': ['Machine Learning & AI'],
89
+ // Maps & Location
90
+ 'mapkit': ['Maps & Location'],
91
+ 'location': ['Maps & Location'],
92
+ 'maps': ['Maps & Location'],
93
+ 'core location': ['Maps & Location'],
94
+ // Photos & Camera
95
+ 'photos': ['Photos & Camera'],
96
+ 'camera': ['Photos & Camera'],
97
+ 'image': ['Photos & Camera'],
98
+ 'photokit': ['Photos & Camera'],
99
+ // Privacy & Security
100
+ 'privacy': ['Privacy & Security'],
101
+ 'security': ['Privacy & Security'],
102
+ 'keychain': ['Privacy & Security'],
103
+ 'encryption': ['Privacy & Security'],
104
+ // Safari & Web
105
+ 'safari': ['Safari & Web'],
106
+ 'webkit': ['Safari & Web'],
107
+ 'web': ['Safari & Web'],
108
+ 'javascript': ['Safari & Web'],
109
+ 'wkwebview': ['Safari & Web'],
110
+ // Spatial Computing
111
+ 'visionos': ['Spatial Computing'],
112
+ 'spatial': ['Spatial Computing'],
113
+ 'ar': ['Spatial Computing'],
114
+ 'arkit': ['Spatial Computing'],
115
+ 'reality': ['Spatial Computing'],
116
+ // Swift
117
+ 'swift': ['Swift'],
118
+ 'swiftdata': ['Swift'],
119
+ 'concurrency': ['Swift'],
120
+ 'async': ['Swift'],
121
+ 'actor': ['Swift'],
122
+ // SwiftUI & UI Frameworks
123
+ 'swiftui': ['SwiftUI & UI Frameworks'],
124
+ 'uikit': ['SwiftUI & UI Frameworks'],
125
+ 'appkit': ['SwiftUI & UI Frameworks'],
126
+ 'catalyst': ['SwiftUI & UI Frameworks'],
127
+ // System Services
128
+ 'foundation': ['System Services'],
129
+ 'core data': ['System Services'],
130
+ 'file system': ['System Services'],
131
+ 'networking': ['System Services'],
132
+ 'background': ['System Services'],
133
+ };
134
+ /**
135
+ * Infer topic categories based on video title and content
136
+ */
137
+ export function inferTopics(title, description) {
138
+ const topics = new Set();
139
+ const searchText = `${title} ${description || ''}`.toLowerCase();
140
+ // Iterate through all keywords
141
+ for (const [keyword, mappedTopics] of Object.entries(TOPIC_KEYWORDS)) {
142
+ if (searchText.includes(keyword.toLowerCase())) {
143
+ mappedTopics.forEach(topic => topics.add(topic));
144
+ }
145
+ }
146
+ // If no topics found, return Essentials as default
147
+ if (topics.size === 0) {
148
+ topics.add('Essentials');
149
+ }
150
+ return Array.from(topics);
151
+ }
152
+ /**
153
+ * Validate if a topic is a standard topic
154
+ */
155
+ export function isStandardTopic(topic) {
156
+ return STANDARD_TOPICS.includes(topic);
157
+ }
158
+ /**
159
+ * Normalize topic name to standard format
160
+ */
161
+ export function normalizeTopicName(topic) {
162
+ // First check if it's already a standard topic
163
+ if (isStandardTopic(topic)) {
164
+ return topic;
165
+ }
166
+ // Try exact match (case-insensitive)
167
+ const lowerTopic = topic.toLowerCase();
168
+ for (const standardTopic of STANDARD_TOPICS) {
169
+ if (standardTopic.toLowerCase() === lowerTopic) {
170
+ return standardTopic;
171
+ }
172
+ }
173
+ // Try partial match
174
+ for (const standardTopic of STANDARD_TOPICS) {
175
+ if (standardTopic.toLowerCase().includes(lowerTopic) ||
176
+ lowerTopic.includes(standardTopic.toLowerCase())) {
177
+ return standardTopic;
178
+ }
179
+ }
180
+ return null;
181
+ }
182
+ //# sourceMappingURL=topic-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topic-mapper.js","sourceRoot":"","sources":["../../src/utils/topic-mapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * URL conversion utilities for Apple Developer Documentation
3
+ */
4
+ /**
5
+ * Convert a web URL to a JSON API URL
6
+ * @param webUrl The web URL to convert
7
+ * @returns The corresponding JSON API URL
8
+ */
9
+ export declare function convertToJsonApiUrl(webUrl: string): string | null;
10
+ /**
11
+ * Validate if URL is from Apple Developer domain
12
+ * @param url The URL to validate
13
+ * @returns True if valid Apple Developer URL
14
+ */
15
+ export declare function isValidAppleDeveloperUrl(url: string): boolean;
16
+ /**
17
+ * Extract API name from URL
18
+ * @param url The URL to extract name from
19
+ * @returns The API name
20
+ */
21
+ export declare function extractApiNameFromUrl(url: string): string;
22
+ //# sourceMappingURL=url-converter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-converter.d.ts","sourceRoot":"","sources":["../../src/utils/url-converter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsCjE;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAO7D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMzD"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * URL conversion utilities for Apple Developer Documentation
3
+ */
4
+ /**
5
+ * Convert a web URL to a JSON API URL
6
+ * @param webUrl The web URL to convert
7
+ * @returns The corresponding JSON API URL
8
+ */
9
+ export function convertToJsonApiUrl(webUrl) {
10
+ try {
11
+ // Remove trailing slash if present
12
+ if (webUrl.endsWith('/')) {
13
+ webUrl = webUrl.slice(0, -1);
14
+ }
15
+ // Extract the path from the URL
16
+ const urlObj = new URL(webUrl);
17
+ // Check if it's an Apple Developer URL
18
+ if (urlObj.hostname !== 'developer.apple.com') {
19
+ return null;
20
+ }
21
+ let path = urlObj.pathname;
22
+ // For documentation URLs, format for the JSON API
23
+ if (path.includes('/documentation/')) {
24
+ // Remove /documentation/ prefix
25
+ path = path.replace('/documentation/', '');
26
+ // Convert to JSON API URL format
27
+ return `https://developer.apple.com/tutorials/data/documentation/${path}.json`;
28
+ }
29
+ // For tutorial URLs, try to format for the JSON API
30
+ if (path.includes('/tutorials/')) {
31
+ // Try to convert tutorials URL to JSON API format
32
+ // Remove /tutorials/ prefix and add .json
33
+ const tutorialPath = path.replace('/tutorials/', '');
34
+ return `https://developer.apple.com/tutorials/data/${tutorialPath}.json`;
35
+ }
36
+ // If not a recognized URL format, return the original URL
37
+ return webUrl;
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ }
43
+ /**
44
+ * Validate if URL is from Apple Developer domain
45
+ * @param url The URL to validate
46
+ * @returns True if valid Apple Developer URL
47
+ */
48
+ export function isValidAppleDeveloperUrl(url) {
49
+ try {
50
+ const urlObj = new URL(url);
51
+ return urlObj.hostname === 'developer.apple.com';
52
+ }
53
+ catch {
54
+ return false;
55
+ }
56
+ }
57
+ /**
58
+ * Extract API name from URL
59
+ * @param url The URL to extract name from
60
+ * @returns The API name
61
+ */
62
+ export function extractApiNameFromUrl(url) {
63
+ try {
64
+ return new URL(url).pathname.split('/').pop() || 'Unknown API';
65
+ }
66
+ catch {
67
+ return 'Unknown API';
68
+ }
69
+ }
70
+ //# sourceMappingURL=url-converter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-converter.js","sourceRoot":"","sources":["../../src/utils/url-converter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,IAAI,CAAC;QACH,mCAAmC;QACnC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;QAED,gCAAgC;QAChC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAE/B,uCAAuC;QACvC,IAAI,MAAM,CAAC,QAAQ,KAAK,qBAAqB,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC;QAE3B,kDAAkD;QAClD,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACrC,gCAAgC;YAChC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;YAC3C,iCAAiC;YACjC,OAAO,4DAA4D,IAAI,OAAO,CAAC;QACjF,CAAC;QAED,oDAAoD;QACpD,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACjC,kDAAkD;YAClD,0CAA0C;YAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YACrD,OAAO,8CAA8C,YAAY,OAAO,CAAC;QAC3E,CAAC;QAED,0DAA0D;QAC1D,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAAW;IAClD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,MAAM,CAAC,QAAQ,KAAK,qBAAqB,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,aAAa,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,aAAa,CAAC;IACvB,CAAC;AACH,CAAC"}