@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.
- package/LICENSE +21 -0
- package/README.md +560 -0
- package/dist/constants/browser-headers.d.ts +48 -0
- package/dist/constants/browser-headers.d.ts.map +1 -0
- package/dist/constants/browser-headers.js +166 -0
- package/dist/constants/browser-headers.js.map +1 -0
- package/dist/index.d.ts +83 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +215 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/analyze-api.schema.d.ts +42 -0
- package/dist/schemas/analyze-api.schema.d.ts.map +1 -0
- package/dist/schemas/analyze-api.schema.js +23 -0
- package/dist/schemas/analyze-api.schema.js.map +1 -0
- package/dist/schemas/apple-docs.schema.d.ts +18 -0
- package/dist/schemas/apple-docs.schema.d.ts.map +1 -0
- package/dist/schemas/apple-docs.schema.js +10 -0
- package/dist/schemas/apple-docs.schema.js.map +1 -0
- package/dist/schemas/doc-content.schema.d.ts +24 -0
- package/dist/schemas/doc-content.schema.d.ts.map +1 -0
- package/dist/schemas/doc-content.schema.js +10 -0
- package/dist/schemas/doc-content.schema.js.map +1 -0
- package/dist/schemas/documentation-updates.schema.d.ts +27 -0
- package/dist/schemas/documentation-updates.schema.d.ts.map +1 -0
- package/dist/schemas/documentation-updates.schema.js +12 -0
- package/dist/schemas/documentation-updates.schema.js.map +1 -0
- package/dist/schemas/framework-symbols.schema.d.ts +24 -0
- package/dist/schemas/framework-symbols.schema.d.ts.map +1 -0
- package/dist/schemas/framework-symbols.schema.js +11 -0
- package/dist/schemas/framework-symbols.schema.js.map +1 -0
- package/dist/schemas/index.d.ts +15 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +15 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/platform-compatibility.schema.d.ts +18 -0
- package/dist/schemas/platform-compatibility.schema.d.ts.map +1 -0
- package/dist/schemas/platform-compatibility.schema.js +8 -0
- package/dist/schemas/platform-compatibility.schema.js.map +1 -0
- package/dist/schemas/references.schema.d.ts +18 -0
- package/dist/schemas/references.schema.d.ts.map +1 -0
- package/dist/schemas/references.schema.js +9 -0
- package/dist/schemas/references.schema.js.map +1 -0
- package/dist/schemas/related-apis.schema.d.ts +21 -0
- package/dist/schemas/related-apis.schema.d.ts.map +1 -0
- package/dist/schemas/related-apis.schema.js +9 -0
- package/dist/schemas/related-apis.schema.js.map +1 -0
- package/dist/schemas/sample-code.schema.d.ts +21 -0
- package/dist/schemas/sample-code.schema.d.ts.map +1 -0
- package/dist/schemas/sample-code.schema.js +10 -0
- package/dist/schemas/sample-code.schema.js.map +1 -0
- package/dist/schemas/search.schema.d.ts +15 -0
- package/dist/schemas/search.schema.d.ts.map +1 -0
- package/dist/schemas/search.schema.js +8 -0
- package/dist/schemas/search.schema.js.map +1 -0
- package/dist/schemas/similar-apis.schema.d.ts +21 -0
- package/dist/schemas/similar-apis.schema.d.ts.map +1 -0
- package/dist/schemas/similar-apis.schema.js +9 -0
- package/dist/schemas/similar-apis.schema.js.map +1 -0
- package/dist/schemas/technologies.schema.d.ts +21 -0
- package/dist/schemas/technologies.schema.d.ts.map +1 -0
- package/dist/schemas/technologies.schema.js +10 -0
- package/dist/schemas/technologies.schema.js.map +1 -0
- package/dist/schemas/technology-overviews.schema.d.ts +24 -0
- package/dist/schemas/technology-overviews.schema.d.ts.map +1 -0
- package/dist/schemas/technology-overviews.schema.js +11 -0
- package/dist/schemas/technology-overviews.schema.js.map +1 -0
- package/dist/schemas/wwdc.schemas.d.ts +208 -0
- package/dist/schemas/wwdc.schemas.d.ts.map +1 -0
- package/dist/schemas/wwdc.schemas.js +97 -0
- package/dist/schemas/wwdc.schemas.js.map +1 -0
- package/dist/tools/definitions.d.ts +10 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +690 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/doc-fetcher.d.ts +19 -0
- package/dist/tools/doc-fetcher.d.ts.map +1 -0
- package/dist/tools/doc-fetcher.js +487 -0
- package/dist/tools/doc-fetcher.js.map +1 -0
- package/dist/tools/doc-formatter.d.ts +69 -0
- package/dist/tools/doc-formatter.d.ts.map +1 -0
- package/dist/tools/doc-formatter.js +208 -0
- package/dist/tools/doc-formatter.js.map +1 -0
- package/dist/tools/find-similar-apis.d.ts +5 -0
- package/dist/tools/find-similar-apis.d.ts.map +1 -0
- package/dist/tools/find-similar-apis.js +275 -0
- package/dist/tools/find-similar-apis.js.map +1 -0
- package/dist/tools/get-documentation-updates.d.ts +5 -0
- package/dist/tools/get-documentation-updates.d.ts.map +1 -0
- package/dist/tools/get-documentation-updates.js +244 -0
- package/dist/tools/get-documentation-updates.js.map +1 -0
- package/dist/tools/get-platform-compatibility.d.ts +5 -0
- package/dist/tools/get-platform-compatibility.d.ts.map +1 -0
- package/dist/tools/get-platform-compatibility.js +205 -0
- package/dist/tools/get-platform-compatibility.js.map +1 -0
- package/dist/tools/get-related-apis.d.ts +5 -0
- package/dist/tools/get-related-apis.d.ts.map +1 -0
- package/dist/tools/get-related-apis.js +155 -0
- package/dist/tools/get-related-apis.js.map +1 -0
- package/dist/tools/get-sample-code.d.ts +5 -0
- package/dist/tools/get-sample-code.d.ts.map +1 -0
- package/dist/tools/get-sample-code.js +375 -0
- package/dist/tools/get-sample-code.js.map +1 -0
- package/dist/tools/get-technology-overviews.d.ts +5 -0
- package/dist/tools/get-technology-overviews.d.ts.map +1 -0
- package/dist/tools/get-technology-overviews.js +306 -0
- package/dist/tools/get-technology-overviews.js.map +1 -0
- package/dist/tools/handlers.d.ts +29 -0
- package/dist/tools/handlers.d.ts.map +1 -0
- package/dist/tools/handlers.js +350 -0
- package/dist/tools/handlers.js.map +1 -0
- package/dist/tools/list-technologies.d.ts +5 -0
- package/dist/tools/list-technologies.d.ts.map +1 -0
- package/dist/tools/list-technologies.js +165 -0
- package/dist/tools/list-technologies.js.map +1 -0
- package/dist/tools/resolve-references-batch.d.ts +5 -0
- package/dist/tools/resolve-references-batch.d.ts.map +1 -0
- package/dist/tools/resolve-references-batch.js +199 -0
- package/dist/tools/resolve-references-batch.js.map +1 -0
- package/dist/tools/search-framework-symbols.d.ts +7 -0
- package/dist/tools/search-framework-symbols.d.ts.map +1 -0
- package/dist/tools/search-framework-symbols.js +235 -0
- package/dist/tools/search-framework-symbols.js.map +1 -0
- package/dist/tools/search-parser.d.ts +15 -0
- package/dist/tools/search-parser.d.ts.map +1 -0
- package/dist/tools/search-parser.js +188 -0
- package/dist/tools/search-parser.js.map +1 -0
- package/dist/tools/search-result-parser.d.ts +52 -0
- package/dist/tools/search-result-parser.d.ts.map +1 -0
- package/dist/tools/search-result-parser.js +137 -0
- package/dist/tools/search-result-parser.js.map +1 -0
- package/dist/tools/tools-guide.d.ts +124 -0
- package/dist/tools/tools-guide.d.ts.map +1 -0
- package/dist/tools/tools-guide.js +389 -0
- package/dist/tools/tools-guide.js.map +1 -0
- package/dist/tools/wwdc/content-extractor.d.ts +9 -0
- package/dist/tools/wwdc/content-extractor.d.ts.map +1 -0
- package/dist/tools/wwdc/content-extractor.js +520 -0
- package/dist/tools/wwdc/content-extractor.js.map +1 -0
- package/dist/tools/wwdc/topics-extractor.d.ts +32 -0
- package/dist/tools/wwdc/topics-extractor.d.ts.map +1 -0
- package/dist/tools/wwdc/topics-extractor.js +146 -0
- package/dist/tools/wwdc/topics-extractor.js.map +1 -0
- package/dist/tools/wwdc/video-list-extractor.d.ts +13 -0
- package/dist/tools/wwdc/video-list-extractor.d.ts.map +1 -0
- package/dist/tools/wwdc/video-list-extractor.js +238 -0
- package/dist/tools/wwdc/video-list-extractor.js.map +1 -0
- package/dist/tools/wwdc/wwdc-handlers.d.ts +32 -0
- package/dist/tools/wwdc/wwdc-handlers.d.ts.map +1 -0
- package/dist/tools/wwdc/wwdc-handlers.js +791 -0
- package/dist/tools/wwdc/wwdc-handlers.js.map +1 -0
- package/dist/types/apple-docs.d.ts +112 -0
- package/dist/types/apple-docs.d.ts.map +1 -0
- package/dist/types/apple-docs.js +5 -0
- package/dist/types/apple-docs.js.map +1 -0
- package/dist/types/cache.d.ts +28 -0
- package/dist/types/cache.d.ts.map +1 -0
- package/dist/types/cache.js +5 -0
- package/dist/types/cache.js.map +1 -0
- package/dist/types/content-sections.d.ts +37 -0
- package/dist/types/content-sections.d.ts.map +1 -0
- package/dist/types/content-sections.js +5 -0
- package/dist/types/content-sections.js.map +1 -0
- package/dist/types/error.d.ts +39 -0
- package/dist/types/error.d.ts.map +1 -0
- package/dist/types/error.js +21 -0
- package/dist/types/error.js.map +1 -0
- package/dist/types/headers.d.ts +95 -0
- package/dist/types/headers.d.ts.map +1 -0
- package/dist/types/headers.js +5 -0
- package/dist/types/headers.js.map +1 -0
- package/dist/types/http.d.ts +31 -0
- package/dist/types/http.d.ts.map +1 -0
- package/dist/types/http.js +5 -0
- package/dist/types/http.js.map +1 -0
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +12 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/search.d.ts +62 -0
- package/dist/types/search.d.ts.map +1 -0
- package/dist/types/search.js +5 -0
- package/dist/types/search.js.map +1 -0
- package/dist/types/sections.d.ts +64 -0
- package/dist/types/sections.d.ts.map +1 -0
- package/dist/types/sections.js +5 -0
- package/dist/types/sections.js.map +1 -0
- package/dist/types/tools/platform.d.ts +33 -0
- package/dist/types/tools/platform.d.ts.map +1 -0
- package/dist/types/tools/platform.js +5 -0
- package/dist/types/tools/platform.js.map +1 -0
- package/dist/types/tools/sample-code.d.ts +23 -0
- package/dist/types/tools/sample-code.d.ts.map +1 -0
- package/dist/types/tools/sample-code.js +5 -0
- package/dist/types/tools/sample-code.js.map +1 -0
- package/dist/types/tools/technology.d.ts +18 -0
- package/dist/types/tools/technology.d.ts.map +1 -0
- package/dist/types/tools/technology.js +5 -0
- package/dist/types/tools/technology.js.map +1 -0
- package/dist/types/tools/updates.d.ts +23 -0
- package/dist/types/tools/updates.d.ts.map +1 -0
- package/dist/types/tools/updates.js +5 -0
- package/dist/types/tools/updates.js.map +1 -0
- package/dist/types/wwdc.d.ts +200 -0
- package/dist/types/wwdc.d.ts.map +1 -0
- package/dist/types/wwdc.js +5 -0
- package/dist/types/wwdc.js.map +1 -0
- package/dist/utils/cache-warmer.d.ts +22 -0
- package/dist/utils/cache-warmer.d.ts.map +1 -0
- package/dist/utils/cache-warmer.js +115 -0
- package/dist/utils/cache-warmer.js.map +1 -0
- package/dist/utils/cache.d.ts +109 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +302 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/constants.d.ts +178 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +266 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/error-handler.d.ts +80 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +437 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/framework-mapper.d.ts +84 -0
- package/dist/utils/framework-mapper.d.ts.map +1 -0
- package/dist/utils/framework-mapper.js +534 -0
- package/dist/utils/framework-mapper.js.map +1 -0
- package/dist/utils/http-client.d.ts +130 -0
- package/dist/utils/http-client.d.ts.map +1 -0
- package/dist/utils/http-client.js +464 -0
- package/dist/utils/http-client.js.map +1 -0
- package/dist/utils/http-headers-generator.d.ts +151 -0
- package/dist/utils/http-headers-generator.d.ts.map +1 -0
- package/dist/utils/http-headers-generator.js +407 -0
- package/dist/utils/http-headers-generator.js.map +1 -0
- package/dist/utils/logger.d.ts +44 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +73 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/preloader.d.ts +20 -0
- package/dist/utils/preloader.d.ts.map +1 -0
- package/dist/utils/preloader.js +82 -0
- package/dist/utils/preloader.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +28 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +48 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/topic-mapper.d.ts +18 -0
- package/dist/utils/topic-mapper.d.ts.map +1 -0
- package/dist/utils/topic-mapper.js +182 -0
- package/dist/utils/topic-mapper.js.map +1 -0
- package/dist/utils/url-converter.d.ts +22 -0
- package/dist/utils/url-converter.d.ts.map +1 -0
- package/dist/utils/url-converter.js +70 -0
- package/dist/utils/url-converter.js.map +1 -0
- package/dist/utils/user-agent-pool.d.ts +241 -0
- package/dist/utils/user-agent-pool.d.ts.map +1 -0
- package/dist/utils/user-agent-pool.js +557 -0
- package/dist/utils/user-agent-pool.js.map +1 -0
- package/dist/utils/wwdc-data-source-path.d.ts +9 -0
- package/dist/utils/wwdc-data-source-path.d.ts.map +1 -0
- package/dist/utils/wwdc-data-source-path.js +22 -0
- package/dist/utils/wwdc-data-source-path.js.map +1 -0
- package/dist/utils/wwdc-data-source.d.ts +36 -0
- package/dist/utils/wwdc-data-source.d.ts.map +1 -0
- package/dist/utils/wwdc-data-source.js +133 -0
- package/dist/utils/wwdc-data-source.js.map +1 -0
- 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"}
|