@get-technology-inc/jamf-docs-mcp-server 3.0.6 → 3.0.7
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/dist/core/constants/doc-types.d.ts +48 -0
- package/dist/core/constants/doc-types.d.ts.map +1 -0
- package/dist/core/constants/doc-types.js +58 -0
- package/dist/core/constants/doc-types.js.map +1 -0
- package/dist/core/constants/index.d.ts +16 -0
- package/dist/core/constants/index.d.ts.map +1 -0
- package/dist/core/constants/index.js +12 -0
- package/dist/core/constants/index.js.map +1 -0
- package/dist/core/constants/limits.d.ts +39 -0
- package/dist/core/constants/limits.d.ts.map +1 -0
- package/dist/core/constants/limits.js +51 -0
- package/dist/core/constants/limits.js.map +1 -0
- package/dist/core/constants/locales.d.ts +34 -0
- package/dist/core/constants/locales.d.ts.map +1 -0
- package/dist/core/constants/locales.js +20 -0
- package/dist/core/constants/locales.js.map +1 -0
- package/dist/core/constants/products.d.ts +127 -0
- package/dist/core/constants/products.d.ts.map +1 -0
- package/dist/core/constants/products.js +135 -0
- package/dist/core/constants/products.js.map +1 -0
- package/dist/core/constants/topics.d.ts +168 -0
- package/dist/core/constants/topics.d.ts.map +1 -0
- package/dist/core/constants/topics.js +186 -0
- package/dist/core/constants/topics.js.map +1 -0
- package/dist/core/constants.d.ts +7 -404
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +16 -427
- package/dist/core/constants.js.map +1 -1
- package/dist/core/http-client.d.ts +14 -2
- package/dist/core/http-client.d.ts.map +1 -1
- package/dist/core/http-client.js +148 -17
- package/dist/core/http-client.js.map +1 -1
- package/dist/core/index.d.ts +12 -12
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +12 -13
- package/dist/core/index.js.map +1 -1
- package/dist/core/resources/index.js +1 -1
- package/dist/core/resources/index.js.map +1 -1
- package/dist/core/schemas/index.d.ts +3 -1
- package/dist/core/schemas/index.d.ts.map +1 -1
- package/dist/core/schemas/index.js +12 -1
- package/dist/core/schemas/index.js.map +1 -1
- package/dist/core/schemas/output.d.ts +7 -0
- package/dist/core/schemas/output.d.ts.map +1 -1
- package/dist/core/schemas/output.js +7 -0
- package/dist/core/schemas/output.js.map +1 -1
- package/dist/core/services/article-service.d.ts +24 -0
- package/dist/core/services/article-service.d.ts.map +1 -0
- package/dist/core/services/article-service.js +118 -0
- package/dist/core/services/article-service.js.map +1 -0
- package/dist/core/services/content-parser.d.ts +38 -0
- package/dist/core/services/content-parser.d.ts.map +1 -0
- package/dist/core/services/content-parser.js +146 -0
- package/dist/core/services/content-parser.js.map +1 -0
- package/dist/core/services/ft-client.d.ts +52 -0
- package/dist/core/services/ft-client.d.ts.map +1 -0
- package/dist/core/services/ft-client.js +87 -0
- package/dist/core/services/ft-client.js.map +1 -0
- package/dist/core/services/glossary.d.ts +9 -5
- package/dist/core/services/glossary.d.ts.map +1 -1
- package/dist/core/services/glossary.js +174 -107
- package/dist/core/services/glossary.js.map +1 -1
- package/dist/core/services/interfaces/cache.d.ts +6 -6
- package/dist/core/services/interfaces/cache.d.ts.map +1 -1
- package/dist/core/services/interfaces/index.d.ts +3 -3
- package/dist/core/services/interfaces/index.d.ts.map +1 -1
- package/dist/core/services/interfaces/logger.d.ts +17 -10
- package/dist/core/services/interfaces/logger.d.ts.map +1 -1
- package/dist/core/services/interfaces/metadata.d.ts +0 -10
- package/dist/core/services/interfaces/metadata.d.ts.map +1 -1
- package/dist/core/services/interfaces/providers.d.ts +23 -10
- package/dist/core/services/interfaces/providers.d.ts.map +1 -1
- package/dist/core/services/logging.d.ts +38 -18
- package/dist/core/services/logging.d.ts.map +1 -1
- package/dist/core/services/logging.js +78 -29
- package/dist/core/services/logging.js.map +1 -1
- package/dist/core/services/maps-registry.d.ts +82 -0
- package/dist/core/services/maps-registry.d.ts.map +1 -0
- package/dist/core/services/maps-registry.js +232 -0
- package/dist/core/services/maps-registry.js.map +1 -0
- package/dist/core/services/metadata.d.ts +18 -9
- package/dist/core/services/metadata.d.ts.map +1 -1
- package/dist/core/services/metadata.js +113 -254
- package/dist/core/services/metadata.js.map +1 -1
- package/dist/core/services/search-service.d.ts +31 -0
- package/dist/core/services/search-service.d.ts.map +1 -0
- package/dist/core/services/search-service.js +471 -0
- package/dist/core/services/search-service.js.map +1 -0
- package/dist/core/services/toc-service.d.ts +30 -0
- package/dist/core/services/toc-service.d.ts.map +1 -0
- package/dist/core/services/toc-service.js +101 -0
- package/dist/core/services/toc-service.js.map +1 -0
- package/dist/core/services/tokenizer.d.ts +1 -1
- package/dist/core/services/tokenizer.d.ts.map +1 -1
- package/dist/core/services/tokenizer.js +3 -3
- package/dist/core/services/tokenizer.js.map +1 -1
- package/dist/core/services/topic-resolver.d.ts +57 -0
- package/dist/core/services/topic-resolver.d.ts.map +1 -0
- package/dist/core/services/topic-resolver.js +185 -0
- package/dist/core/services/topic-resolver.js.map +1 -0
- package/dist/core/tools/batch-get-articles.d.ts +0 -2
- package/dist/core/tools/batch-get-articles.d.ts.map +1 -1
- package/dist/core/tools/batch-get-articles.js +12 -46
- package/dist/core/tools/batch-get-articles.js.map +1 -1
- package/dist/core/tools/get-article.d.ts.map +1 -1
- package/dist/core/tools/get-article.js +29 -112
- package/dist/core/tools/get-article.js.map +1 -1
- package/dist/core/tools/get-toc.js +1 -1
- package/dist/core/tools/get-toc.js.map +1 -1
- package/dist/core/tools/search.js +5 -5
- package/dist/core/tools/search.js.map +1 -1
- package/dist/core/types/context.d.ts +5 -2
- package/dist/core/types/context.d.ts.map +1 -1
- package/dist/core/types.d.ts +141 -31
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/utils/bundle.d.ts +14 -1
- package/dist/core/utils/bundle.d.ts.map +1 -1
- package/dist/core/utils/bundle.js +19 -2
- package/dist/core/utils/bundle.js.map +1 -1
- package/dist/core/utils/format-article.d.ts +45 -0
- package/dist/core/utils/format-article.d.ts.map +1 -0
- package/dist/core/utils/format-article.js +138 -0
- package/dist/core/utils/format-article.js.map +1 -0
- package/dist/core/utils/ft-metadata.d.ts +22 -0
- package/dist/core/utils/ft-metadata.d.ts.map +1 -0
- package/dist/core/utils/ft-metadata.js +30 -0
- package/dist/core/utils/ft-metadata.js.map +1 -0
- package/dist/core/utils/sanitize.d.ts.map +1 -1
- package/dist/core/utils/sanitize.js +0 -2
- package/dist/core/utils/sanitize.js.map +1 -1
- package/dist/core/utils/url.d.ts.map +1 -1
- package/dist/core/utils/url.js +0 -1
- package/dist/core/utils/url.js.map +1 -1
- package/dist/index.js +10 -6
- package/dist/index.js.map +1 -1
- package/dist/platforms/node/http-server.d.ts +13 -0
- package/dist/platforms/node/http-server.d.ts.map +1 -0
- package/dist/platforms/node/http-server.js +231 -0
- package/dist/platforms/node/http-server.js.map +1 -0
- package/dist/platforms/node/index.d.ts +1 -1
- package/dist/platforms/node/index.d.ts.map +1 -1
- package/dist/platforms/node/index.js +1 -1
- package/dist/platforms/node/index.js.map +1 -1
- package/dist/platforms/node/logger.d.ts +13 -2
- package/dist/platforms/node/logger.d.ts.map +1 -1
- package/dist/platforms/node/logger.js +17 -4
- package/dist/platforms/node/logger.js.map +1 -1
- package/dist/transport/http-handler.d.ts +25 -0
- package/dist/transport/http-handler.d.ts.map +1 -0
- package/dist/transport/http-handler.js +193 -0
- package/dist/transport/http-handler.js.map +1 -0
- package/dist/transport/http-types.d.ts +22 -0
- package/dist/transport/http-types.d.ts.map +1 -0
- package/dist/transport/http-types.js +65 -0
- package/dist/transport/http-types.js.map +1 -0
- package/dist/transport/http.d.ts +4 -8
- package/dist/transport/http.d.ts.map +1 -1
- package/dist/transport/http.js +4 -376
- package/dist/transport/http.js.map +1 -1
- package/dist/transport/index.js +2 -2
- package/dist/transport/index.js.map +1 -1
- package/dist/transport/rate-limiter.d.ts +16 -0
- package/dist/transport/rate-limiter.d.ts.map +1 -0
- package/dist/transport/rate-limiter.js +55 -0
- package/dist/transport/rate-limiter.js.map +1 -0
- package/package.json +3 -3
- package/dist/core/services/interfaces.d.ts +0 -94
- package/dist/core/services/interfaces.d.ts.map +0 -1
- package/dist/core/services/interfaces.js +0 -8
- package/dist/core/services/interfaces.js.map +0 -1
- package/dist/core/services/scraper.d.ts +0 -90
- package/dist/core/services/scraper.d.ts.map +0 -1
- package/dist/core/services/scraper.js +0 -990
- package/dist/core/services/scraper.js.map +0 -1
- package/dist/core/utils/doc-type.d.ts +0 -12
- package/dist/core/utils/doc-type.d.ts.map +0 -1
- package/dist/core/utils/doc-type.js +0 -24
- package/dist/core/utils/doc-type.js.map +0 -1
- package/dist/platforms/node/metadata.d.ts +0 -18
- package/dist/platforms/node/metadata.d.ts.map +0 -1
- package/dist/platforms/node/metadata.js +0 -35
- package/dist/platforms/node/metadata.js.map +0 -1
|
@@ -3,30 +3,50 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Provides dual output: MCP notifications (visible to AI clients) + stderr (visible to developers).
|
|
5
5
|
* Log level filtering for MCP notifications is handled by the SDK (logging/setLevel).
|
|
6
|
+
*
|
|
7
|
+
* LoggingService is a class that holds the MCP server reference as instance state,
|
|
8
|
+
* avoiding module-level mutable singletons that are incompatible with
|
|
9
|
+
* Cloudflare Workers (where module scope persists across requests).
|
|
6
10
|
*/
|
|
7
11
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
12
|
+
import type { Logger, WriteStderrFn } from './interfaces/index.js';
|
|
13
|
+
export type { Logger, WriteStderrFn };
|
|
8
14
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
*
|
|
15
|
+
* Logging service that holds MCP server reference as instance state.
|
|
16
|
+
*
|
|
17
|
+
* Each server instance should create its own LoggingService, so that
|
|
18
|
+
* multiple servers running in the same isolate don't share state.
|
|
19
|
+
*
|
|
20
|
+
* @param writeStderr - Optional writer function for stderr-style output.
|
|
21
|
+
* Defaults to `console.error`. Pass `console.log` or a no-op for
|
|
22
|
+
* platforms without stderr (e.g. Cloudflare Workers).
|
|
15
23
|
*/
|
|
16
|
-
export
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
export declare class LoggingService {
|
|
25
|
+
private mcpServer;
|
|
26
|
+
private readonly writeStderr;
|
|
27
|
+
constructor(writeStderr?: WriteStderrFn);
|
|
28
|
+
/**
|
|
29
|
+
* Register the MCP server instance for sending log notifications.
|
|
30
|
+
* Must be called after server creation but before tools are invoked.
|
|
31
|
+
*/
|
|
32
|
+
setServer(server: McpServer): void;
|
|
33
|
+
/**
|
|
34
|
+
* Create a named logger instance.
|
|
35
|
+
*
|
|
36
|
+
* @param name - Logger name identifying the source module
|
|
37
|
+
*/
|
|
38
|
+
createLogger(name: string): Logger;
|
|
39
|
+
private log;
|
|
40
|
+
private sendMcpLog;
|
|
25
41
|
}
|
|
26
42
|
/**
|
|
27
|
-
* Create a
|
|
43
|
+
* Create a stderr-only logger (no MCP notifications).
|
|
44
|
+
*
|
|
45
|
+
* Use this for bootstrap / transport code that runs before
|
|
46
|
+
* a ServerContext is available, or outside of a request scope.
|
|
28
47
|
*
|
|
29
|
-
* @param name - Logger name identifying the source module
|
|
48
|
+
* @param name - Logger name identifying the source module
|
|
49
|
+
* @param writeStderr - Optional writer function (defaults to console.error)
|
|
30
50
|
*/
|
|
31
|
-
export declare function
|
|
51
|
+
export declare function createStderrLogger(name: string, writeStderr?: WriteStderrFn): Logger;
|
|
32
52
|
//# sourceMappingURL=logging.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../../src/core/services/logging.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../../src/core/services/logging.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEnE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;AA6BtC;;;;;;;;;GASG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;gBAEhC,WAAW,CAAC,EAAE,aAAa;IAIvC;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAIlC;;;;OAIG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAalC,OAAO,CAAC,GAAG;IAKX,OAAO,CAAC,UAAU;CAUnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,aAAa,GAC1B,MAAM,CAYR"}
|
|
@@ -3,16 +3,19 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Provides dual output: MCP notifications (visible to AI clients) + stderr (visible to developers).
|
|
5
5
|
* Log level filtering for MCP notifications is handled by the SDK (logging/setLevel).
|
|
6
|
+
*
|
|
7
|
+
* LoggingService is a class that holds the MCP server reference as instance state,
|
|
8
|
+
* avoiding module-level mutable singletons that are incompatible with
|
|
9
|
+
* Cloudflare Workers (where module scope persists across requests).
|
|
6
10
|
*/
|
|
7
|
-
let mcpServer = null;
|
|
8
11
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
12
|
+
* Default writer — delegates to console.error (Node.js stderr).
|
|
13
|
+
* Uses late binding so test spies on console.error are respected.
|
|
11
14
|
*/
|
|
12
|
-
|
|
13
|
-
|
|
15
|
+
function defaultWriteStderr(formatted) {
|
|
16
|
+
console.error(formatted);
|
|
14
17
|
}
|
|
15
|
-
function
|
|
18
|
+
function formatLogLine(level, loggerName, data) {
|
|
16
19
|
const label = level.toUpperCase();
|
|
17
20
|
let message;
|
|
18
21
|
if (typeof data === 'string') {
|
|
@@ -26,36 +29,82 @@ function writeStderr(level, loggerName, data) {
|
|
|
26
29
|
message = String(data);
|
|
27
30
|
}
|
|
28
31
|
}
|
|
29
|
-
|
|
32
|
+
return `[${label}] [${loggerName}] ${message}`;
|
|
30
33
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
+
/**
|
|
35
|
+
* Logging service that holds MCP server reference as instance state.
|
|
36
|
+
*
|
|
37
|
+
* Each server instance should create its own LoggingService, so that
|
|
38
|
+
* multiple servers running in the same isolate don't share state.
|
|
39
|
+
*
|
|
40
|
+
* @param writeStderr - Optional writer function for stderr-style output.
|
|
41
|
+
* Defaults to `console.error`. Pass `console.log` or a no-op for
|
|
42
|
+
* platforms without stderr (e.g. Cloudflare Workers).
|
|
43
|
+
*/
|
|
44
|
+
export class LoggingService {
|
|
45
|
+
mcpServer = null;
|
|
46
|
+
writeStderr;
|
|
47
|
+
constructor(writeStderr) {
|
|
48
|
+
this.writeStderr = writeStderr ?? defaultWriteStderr;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Register the MCP server instance for sending log notifications.
|
|
52
|
+
* Must be called after server creation but before tools are invoked.
|
|
53
|
+
*/
|
|
54
|
+
setServer(server) {
|
|
55
|
+
this.mcpServer = server;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Create a named logger instance.
|
|
59
|
+
*
|
|
60
|
+
* @param name - Logger name identifying the source module
|
|
61
|
+
*/
|
|
62
|
+
createLogger(name) {
|
|
63
|
+
return {
|
|
64
|
+
debug: (data) => { this.log('debug', name, data); },
|
|
65
|
+
info: (data) => { this.log('info', name, data); },
|
|
66
|
+
notice: (data) => { this.log('notice', name, data); },
|
|
67
|
+
warning: (data) => { this.log('warning', name, data); },
|
|
68
|
+
error: (data) => { this.log('error', name, data); },
|
|
69
|
+
critical: (data) => { this.log('critical', name, data); },
|
|
70
|
+
alert: (data) => { this.log('alert', name, data); },
|
|
71
|
+
emergency: (data) => { this.log('emergency', name, data); },
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
log(level, loggerName, data) {
|
|
75
|
+
this.writeStderr(formatLogLine(level, loggerName, data));
|
|
76
|
+
this.sendMcpLog(level, loggerName, data);
|
|
77
|
+
}
|
|
78
|
+
sendMcpLog(level, loggerName, data) {
|
|
79
|
+
if (this.mcpServer === null) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
// Fire-and-forget: don't await, don't throw
|
|
83
|
+
this.mcpServer.sendLoggingMessage({ level, logger: loggerName, data }).catch(() => {
|
|
84
|
+
// Silently ignore send failures (server may not be connected yet)
|
|
85
|
+
});
|
|
34
86
|
}
|
|
35
|
-
// Fire-and-forget: don't await, don't throw
|
|
36
|
-
mcpServer.sendLoggingMessage({ level, logger: loggerName, data }).catch(() => {
|
|
37
|
-
// Silently ignore send failures (server may not be connected yet)
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
function log(level, loggerName, data) {
|
|
41
|
-
writeStderr(level, loggerName, data);
|
|
42
|
-
sendMcpLog(level, loggerName, data);
|
|
43
87
|
}
|
|
44
88
|
/**
|
|
45
|
-
* Create a
|
|
89
|
+
* Create a stderr-only logger (no MCP notifications).
|
|
90
|
+
*
|
|
91
|
+
* Use this for bootstrap / transport code that runs before
|
|
92
|
+
* a ServerContext is available, or outside of a request scope.
|
|
46
93
|
*
|
|
47
|
-
* @param name - Logger name identifying the source module
|
|
94
|
+
* @param name - Logger name identifying the source module
|
|
95
|
+
* @param writeStderr - Optional writer function (defaults to console.error)
|
|
48
96
|
*/
|
|
49
|
-
export function
|
|
97
|
+
export function createStderrLogger(name, writeStderr) {
|
|
98
|
+
const writer = writeStderr ?? defaultWriteStderr;
|
|
50
99
|
return {
|
|
51
|
-
debug: (data) => {
|
|
52
|
-
info: (data) => {
|
|
53
|
-
notice: (data) => {
|
|
54
|
-
warning: (data) => {
|
|
55
|
-
error: (data) => {
|
|
56
|
-
critical: (data) => {
|
|
57
|
-
alert: (data) => {
|
|
58
|
-
emergency: (data) => {
|
|
100
|
+
debug: (data) => { writer(formatLogLine('debug', name, data)); },
|
|
101
|
+
info: (data) => { writer(formatLogLine('info', name, data)); },
|
|
102
|
+
notice: (data) => { writer(formatLogLine('notice', name, data)); },
|
|
103
|
+
warning: (data) => { writer(formatLogLine('warning', name, data)); },
|
|
104
|
+
error: (data) => { writer(formatLogLine('error', name, data)); },
|
|
105
|
+
critical: (data) => { writer(formatLogLine('critical', name, data)); },
|
|
106
|
+
alert: (data) => { writer(formatLogLine('alert', name, data)); },
|
|
107
|
+
emergency: (data) => { writer(formatLogLine('emergency', name, data)); },
|
|
59
108
|
};
|
|
60
109
|
}
|
|
61
110
|
//# sourceMappingURL=logging.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logging.js","sourceRoot":"","sources":["../../../src/core/services/logging.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"logging.js","sourceRoot":"","sources":["../../../src/core/services/logging.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maps Registry — product/version/locale → mapId resolution
|
|
3
|
+
*
|
|
4
|
+
* Builds a lookup table from FT's GET /api/khub/maps response.
|
|
5
|
+
* All mapIds are dynamically discovered, nothing hardcoded.
|
|
6
|
+
*
|
|
7
|
+
* Key concepts:
|
|
8
|
+
* - `bundleStem`: product identifier without version (e.g., "jamf-pro-documentation")
|
|
9
|
+
* Derived from `version_bundle_stem` metadata, or parsed from `bundle` values.
|
|
10
|
+
* - Each map is locale-specific (separate mapId per language)
|
|
11
|
+
* - `latestVersion=yes` marks the current version
|
|
12
|
+
*/
|
|
13
|
+
import { fetchMaps } from './ft-client.js';
|
|
14
|
+
import { type LocaleId } from '../constants.js';
|
|
15
|
+
import type { CacheProvider, MapsProvider } from './interfaces/index.js';
|
|
16
|
+
export interface MapEntry {
|
|
17
|
+
mapId: string;
|
|
18
|
+
title: string;
|
|
19
|
+
bundleStem: string;
|
|
20
|
+
version: string;
|
|
21
|
+
locale: string;
|
|
22
|
+
isLatest: boolean;
|
|
23
|
+
bundleValues: string[];
|
|
24
|
+
}
|
|
25
|
+
export interface RegistryProductInfo {
|
|
26
|
+
bundleStem: string;
|
|
27
|
+
title: string;
|
|
28
|
+
versions: string[];
|
|
29
|
+
}
|
|
30
|
+
export declare class MapsRegistry {
|
|
31
|
+
private readonly cache;
|
|
32
|
+
private entries;
|
|
33
|
+
private builtAt;
|
|
34
|
+
private buildPromise;
|
|
35
|
+
private readonly fetchMapsFn;
|
|
36
|
+
private readonly mapsProvider;
|
|
37
|
+
private readonly cacheTtl;
|
|
38
|
+
constructor(cache: CacheProvider, fetchMapsFn?: typeof fetchMaps, mapsProvider?: MapsProvider, cacheTtl?: number);
|
|
39
|
+
/**
|
|
40
|
+
* Reset the registry so the next `ensureBuilt()` call re-fetches from
|
|
41
|
+
* the API (or cache). Use this to force invalidation when stale data
|
|
42
|
+
* is suspected.
|
|
43
|
+
*/
|
|
44
|
+
reset(): void;
|
|
45
|
+
/**
|
|
46
|
+
* Build the registry from FT API (cached).
|
|
47
|
+
* Uses in-flight deduplication to prevent thundering herd when
|
|
48
|
+
* multiple concurrent callers invoke ensureBuilt() simultaneously.
|
|
49
|
+
*/
|
|
50
|
+
ensureBuilt(): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Internal build logic: fetch maps from cache or API and populate entries.
|
|
53
|
+
*/
|
|
54
|
+
private doBuild;
|
|
55
|
+
private parseMap;
|
|
56
|
+
/**
|
|
57
|
+
* Resolve a product + optional version + locale to a mapId.
|
|
58
|
+
* Returns null if not found.
|
|
59
|
+
*/
|
|
60
|
+
resolveMapId(bundleStem: string, version?: string, locale?: LocaleId): Promise<string | null>;
|
|
61
|
+
private findMap;
|
|
62
|
+
/**
|
|
63
|
+
* Resolve a legacy bundleId (e.g., "jamf-pro-documentation-11.12.0")
|
|
64
|
+
* to a mapId.
|
|
65
|
+
*/
|
|
66
|
+
resolveFromBundleId(bundleId: string, locale?: LocaleId): Promise<string | null>;
|
|
67
|
+
/**
|
|
68
|
+
* Find the glossary map for a given locale.
|
|
69
|
+
* Searches for maps with bundleStem containing "glossary".
|
|
70
|
+
*/
|
|
71
|
+
resolveGlossaryMapId(locale?: LocaleId): Promise<string | null>;
|
|
72
|
+
/**
|
|
73
|
+
* Get all unique products for a locale.
|
|
74
|
+
*/
|
|
75
|
+
getProducts(locale?: LocaleId): Promise<RegistryProductInfo[]>;
|
|
76
|
+
/**
|
|
77
|
+
* Get available versions for a product.
|
|
78
|
+
* Filters entries directly instead of rebuilding the full product catalogue.
|
|
79
|
+
*/
|
|
80
|
+
getVersions(bundleStem: string, locale?: LocaleId): Promise<string[]>;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=maps-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maps-registry.d.ts","sourceRoot":"","sources":["../../../src/core/services/maps-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhE,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAWzE,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AA+BD,qBAAa,YAAY;IASrB,OAAO,CAAC,QAAQ,CAAC,KAAK;IARxB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmB;IAC/C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA2B;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAGf,KAAK,EAAE,aAAa,EACrC,WAAW,CAAC,EAAE,OAAO,SAAS,EAC9B,YAAY,CAAC,EAAE,YAAY,EAC3B,QAAQ,CAAC,EAAE,MAAM;IAOnB;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAKb;;;;OAIG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAclC;;OAEG;YACW,OAAO;IAiBrB,OAAO,CAAC,QAAQ;IAahB;;;OAGG;IACG,YAAY,CAChB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,QAAQ,GAChB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgBzB,OAAO,CAAC,OAAO;IAkBf;;;OAGG;IACG,mBAAmB,CACvB,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,QAAQ,GAChB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAwBzB;;;OAGG;IACG,oBAAoB,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAarE;;OAEG;IACG,WAAW,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAoCpE;;;OAGG;IACG,WAAW,CACf,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,QAAQ,GAChB,OAAO,CAAC,MAAM,EAAE,CAAC;CAcrB"}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maps Registry — product/version/locale → mapId resolution
|
|
3
|
+
*
|
|
4
|
+
* Builds a lookup table from FT's GET /api/khub/maps response.
|
|
5
|
+
* All mapIds are dynamically discovered, nothing hardcoded.
|
|
6
|
+
*
|
|
7
|
+
* Key concepts:
|
|
8
|
+
* - `bundleStem`: product identifier without version (e.g., "jamf-pro-documentation")
|
|
9
|
+
* Derived from `version_bundle_stem` metadata, or parsed from `bundle` values.
|
|
10
|
+
* - Each map is locale-specific (separate mapId per language)
|
|
11
|
+
* - `latestVersion=yes` marks the current version
|
|
12
|
+
*/
|
|
13
|
+
import { fetchMaps } from './ft-client.js';
|
|
14
|
+
import { DEFAULT_LOCALE } from '../constants.js';
|
|
15
|
+
import { getMetaValue, getMetaValues, FT_META } from '../utils/ft-metadata.js';
|
|
16
|
+
import { compareVersions, extractVersionFromBundleId, stripVersionSuffix, stripCurrentSuffix, } from '../utils/bundle.js';
|
|
17
|
+
// ─── Metadata helpers ───────────────────────────────────────────
|
|
18
|
+
/**
|
|
19
|
+
* Derive bundleStem from metadata.
|
|
20
|
+
* Prefers `version_bundle_stem` (clean stem), otherwise parses `bundle` values.
|
|
21
|
+
*/
|
|
22
|
+
function deriveBundleStem(metadata) {
|
|
23
|
+
const stem = getMetaValue(metadata, FT_META.VERSION_BUNDLE_STEM);
|
|
24
|
+
if (stem !== '') {
|
|
25
|
+
return stem;
|
|
26
|
+
}
|
|
27
|
+
// Parse from bundle values: strip version suffixes and "-current"
|
|
28
|
+
const bundles = getMetaValues(metadata, FT_META.BUNDLE);
|
|
29
|
+
if (bundles.length === 0) {
|
|
30
|
+
return '';
|
|
31
|
+
}
|
|
32
|
+
// Take the shortest bundle value as it's likely the stem
|
|
33
|
+
// e.g., ['jamf-pro-documentation-11.26.0', 'jamf-pro-documentation-current']
|
|
34
|
+
// → sorted by length → 'jamf-pro-documentation-current'
|
|
35
|
+
// Then strip known suffixes
|
|
36
|
+
const sorted = [...bundles].sort((a, b) => a.length - b.length);
|
|
37
|
+
const candidate = sorted[0] ?? '';
|
|
38
|
+
return stripVersionSuffix(stripCurrentSuffix(candidate));
|
|
39
|
+
}
|
|
40
|
+
// ─── Registry ───────────────────────────────────────────────────
|
|
41
|
+
const CACHE_KEY = 'maps-registry';
|
|
42
|
+
const DEFAULT_CACHE_TTL = 24 * 60 * 60 * 1000; // 24 hours
|
|
43
|
+
const GLOSSARY_BUNDLE_STEM = 'jamf-technical-glossary';
|
|
44
|
+
export class MapsRegistry {
|
|
45
|
+
cache;
|
|
46
|
+
entries = [];
|
|
47
|
+
builtAt = 0;
|
|
48
|
+
buildPromise = null;
|
|
49
|
+
fetchMapsFn;
|
|
50
|
+
mapsProvider;
|
|
51
|
+
cacheTtl;
|
|
52
|
+
constructor(cache, fetchMapsFn, mapsProvider, cacheTtl) {
|
|
53
|
+
this.cache = cache;
|
|
54
|
+
this.fetchMapsFn = fetchMapsFn ?? fetchMaps;
|
|
55
|
+
this.mapsProvider = mapsProvider;
|
|
56
|
+
this.cacheTtl = cacheTtl ?? DEFAULT_CACHE_TTL;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Reset the registry so the next `ensureBuilt()` call re-fetches from
|
|
60
|
+
* the API (or cache). Use this to force invalidation when stale data
|
|
61
|
+
* is suspected.
|
|
62
|
+
*/
|
|
63
|
+
reset() {
|
|
64
|
+
this.builtAt = 0;
|
|
65
|
+
this.entries = [];
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Build the registry from FT API (cached).
|
|
69
|
+
* Uses in-flight deduplication to prevent thundering herd when
|
|
70
|
+
* multiple concurrent callers invoke ensureBuilt() simultaneously.
|
|
71
|
+
*/
|
|
72
|
+
async ensureBuilt() {
|
|
73
|
+
if (this.builtAt > 0 && (Date.now() - this.builtAt) < this.cacheTtl) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (this.buildPromise !== null) {
|
|
77
|
+
await this.buildPromise;
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
this.buildPromise = this.doBuild();
|
|
81
|
+
try {
|
|
82
|
+
await this.buildPromise;
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
this.buildPromise = null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Internal build logic: fetch maps from cache or API and populate entries.
|
|
90
|
+
*/
|
|
91
|
+
async doBuild() {
|
|
92
|
+
const cached = await this.cache.get(CACHE_KEY);
|
|
93
|
+
if (cached !== null) {
|
|
94
|
+
this.entries = cached;
|
|
95
|
+
this.builtAt = Date.now();
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const maps = this.mapsProvider !== undefined
|
|
99
|
+
? await this.mapsProvider.getMaps()
|
|
100
|
+
: await this.fetchMapsFn();
|
|
101
|
+
this.entries = maps.map(m => this.parseMap(m));
|
|
102
|
+
this.builtAt = Date.now();
|
|
103
|
+
await this.cache.set(CACHE_KEY, this.entries, this.cacheTtl);
|
|
104
|
+
}
|
|
105
|
+
parseMap(map) {
|
|
106
|
+
const { metadata } = map;
|
|
107
|
+
return {
|
|
108
|
+
mapId: map.id,
|
|
109
|
+
title: map.title,
|
|
110
|
+
bundleStem: deriveBundleStem(metadata),
|
|
111
|
+
version: getMetaValue(metadata, FT_META.VERSION),
|
|
112
|
+
locale: getMetaValue(metadata, FT_META.LOCALE),
|
|
113
|
+
isLatest: getMetaValue(metadata, FT_META.LATEST_VERSION) === 'yes',
|
|
114
|
+
bundleValues: getMetaValues(metadata, FT_META.BUNDLE),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Resolve a product + optional version + locale to a mapId.
|
|
119
|
+
* Returns null if not found.
|
|
120
|
+
*/
|
|
121
|
+
async resolveMapId(bundleStem, version, locale) {
|
|
122
|
+
await this.ensureBuilt();
|
|
123
|
+
const loc = locale ?? DEFAULT_LOCALE;
|
|
124
|
+
// Normalize: strip -current suffix if present
|
|
125
|
+
const normalizedStem = stripCurrentSuffix(bundleStem);
|
|
126
|
+
// Try exact locale first, then fallback to en-US
|
|
127
|
+
const match = this.findMap(normalizedStem, version, loc)
|
|
128
|
+
?? (loc !== DEFAULT_LOCALE
|
|
129
|
+
? this.findMap(normalizedStem, version, DEFAULT_LOCALE)
|
|
130
|
+
: null);
|
|
131
|
+
return match?.mapId ?? null;
|
|
132
|
+
}
|
|
133
|
+
findMap(bundleStem, version, locale) {
|
|
134
|
+
const candidates = this.entries.filter(e => e.bundleStem === bundleStem && e.locale === locale);
|
|
135
|
+
if (version !== undefined && version !== '' && version !== 'current') {
|
|
136
|
+
return candidates.find(e => e.version === version);
|
|
137
|
+
}
|
|
138
|
+
// Default: latest version
|
|
139
|
+
return candidates.find(e => e.isLatest)
|
|
140
|
+
?? candidates[0]; // fallback to any match
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Resolve a legacy bundleId (e.g., "jamf-pro-documentation-11.12.0")
|
|
144
|
+
* to a mapId.
|
|
145
|
+
*/
|
|
146
|
+
async resolveFromBundleId(bundleId, locale) {
|
|
147
|
+
await this.ensureBuilt();
|
|
148
|
+
const loc = locale ?? DEFAULT_LOCALE;
|
|
149
|
+
// Direct match against bundle metadata values
|
|
150
|
+
const direct = this.entries.find(e => e.locale === loc && e.bundleValues.includes(bundleId));
|
|
151
|
+
if (direct) {
|
|
152
|
+
return direct.mapId;
|
|
153
|
+
}
|
|
154
|
+
// Fallback: parse stem + version from bundleId
|
|
155
|
+
const stripped = stripCurrentSuffix(bundleId);
|
|
156
|
+
// Try to extract version: "jamf-pro-documentation-11.12.0" → version = "11.12.0"
|
|
157
|
+
const version = extractVersionFromBundleId(stripped);
|
|
158
|
+
if (version !== null) {
|
|
159
|
+
const stem = stripVersionSuffix(stripped);
|
|
160
|
+
return await this.resolveMapId(stem, version, locale);
|
|
161
|
+
}
|
|
162
|
+
// No version — treat as stem, resolve latest
|
|
163
|
+
return await this.resolveMapId(stripped, undefined, locale);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Find the glossary map for a given locale.
|
|
167
|
+
* Searches for maps with bundleStem containing "glossary".
|
|
168
|
+
*/
|
|
169
|
+
async resolveGlossaryMapId(locale) {
|
|
170
|
+
await this.ensureBuilt();
|
|
171
|
+
const loc = locale ?? DEFAULT_LOCALE;
|
|
172
|
+
const match = this.entries.find(e => e.bundleStem === GLOSSARY_BUNDLE_STEM && e.locale === loc) ?? this.entries.find(e => e.bundleStem === GLOSSARY_BUNDLE_STEM && e.locale === DEFAULT_LOCALE);
|
|
173
|
+
return match?.mapId ?? null;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Get all unique products for a locale.
|
|
177
|
+
*/
|
|
178
|
+
async getProducts(locale) {
|
|
179
|
+
await this.ensureBuilt();
|
|
180
|
+
const loc = locale ?? DEFAULT_LOCALE;
|
|
181
|
+
const productMap = new Map();
|
|
182
|
+
for (const entry of this.entries) {
|
|
183
|
+
if (entry.locale !== loc) {
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
if (entry.bundleStem === '') {
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
const existing = productMap.get(entry.bundleStem);
|
|
190
|
+
if (existing) {
|
|
191
|
+
if (entry.version !== '' && !existing.versions.includes(entry.version)) {
|
|
192
|
+
existing.versions.push(entry.version);
|
|
193
|
+
}
|
|
194
|
+
// Use latest version's title
|
|
195
|
+
if (entry.isLatest) {
|
|
196
|
+
existing.title = entry.title;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
productMap.set(entry.bundleStem, {
|
|
201
|
+
bundleStem: entry.bundleStem,
|
|
202
|
+
title: entry.title,
|
|
203
|
+
versions: entry.version !== '' ? [entry.version] : [],
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// Sort versions descending within each product
|
|
208
|
+
for (const product of productMap.values()) {
|
|
209
|
+
product.versions.sort((a, b) => compareVersions(b, a));
|
|
210
|
+
}
|
|
211
|
+
return [...productMap.values()];
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Get available versions for a product.
|
|
215
|
+
* Filters entries directly instead of rebuilding the full product catalogue.
|
|
216
|
+
*/
|
|
217
|
+
async getVersions(bundleStem, locale) {
|
|
218
|
+
await this.ensureBuilt();
|
|
219
|
+
const loc = locale ?? DEFAULT_LOCALE;
|
|
220
|
+
const versions = [];
|
|
221
|
+
for (const entry of this.entries) {
|
|
222
|
+
if (entry.bundleStem !== bundleStem || entry.locale !== loc) {
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
if (entry.version !== '' && !versions.includes(entry.version)) {
|
|
226
|
+
versions.push(entry.version);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return versions.sort((a, b) => compareVersions(b, a));
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=maps-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maps-registry.js","sourceRoot":"","sources":["../../../src/core/services/maps-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Metadata service for Jamf documentation
|
|
3
3
|
*
|
|
4
|
-
* Dynamically fetches product versions and topic categories from the
|
|
5
|
-
* with fallback to static constants.
|
|
4
|
+
* Dynamically fetches product versions and topic categories from the
|
|
5
|
+
* Fluid Topics MapsRegistry with fallback to static constants.
|
|
6
6
|
*/
|
|
7
7
|
import { type ProductId } from '../constants.js';
|
|
8
8
|
import type { ServerContext } from '../types/context.js';
|
|
@@ -28,25 +28,34 @@ export interface TocCategory {
|
|
|
28
28
|
children: string[];
|
|
29
29
|
}
|
|
30
30
|
/**
|
|
31
|
-
* Get all products with their latest metadata
|
|
32
|
-
* Uses
|
|
31
|
+
* Get all products with their latest metadata.
|
|
32
|
+
* Uses MapsRegistry to discover products and versions dynamically,
|
|
33
|
+
* with fallback to static JAMF_PRODUCTS constants.
|
|
33
34
|
*/
|
|
34
35
|
export declare function getProductsMetadata(ctx: ServerContext): Promise<ProductMetadata[]>;
|
|
35
36
|
/**
|
|
36
|
-
* Get the bundle ID for a specific product and version
|
|
37
|
-
* Returns the latest bundle ID if version is undefined or 'current'
|
|
37
|
+
* Get the bundle ID for a specific product and version.
|
|
38
|
+
* Returns the latest bundle ID if version is undefined or 'current'.
|
|
39
|
+
*
|
|
40
|
+
* The returned value is a legacy-compatible bundleId string
|
|
41
|
+
* (e.g. 'jamf-pro-documentation-11.24.0') used for URL construction.
|
|
38
42
|
*/
|
|
39
43
|
export declare function getBundleIdForVersion(ctx: ServerContext, productId: ProductId, version?: string): Promise<string | null>;
|
|
40
44
|
/**
|
|
41
|
-
* Get available versions for a product
|
|
45
|
+
* Get available versions for a product.
|
|
46
|
+
*
|
|
47
|
+
* Uses MapsRegistry.getVersions() to fetch versions for a single product
|
|
48
|
+
* instead of loading the full product catalogue via getProductsMetadata().
|
|
49
|
+
* Falls back to the static JAMF_PRODUCTS constant on failure.
|
|
42
50
|
*/
|
|
43
51
|
export declare function getAvailableVersions(ctx: ServerContext, productId: ProductId): Promise<string[]>;
|
|
44
52
|
/**
|
|
45
|
-
* Get all topics
|
|
53
|
+
* Get all topics. Returns manual topics from JAMF_TOPICS constants.
|
|
54
|
+
* The manual topics serve as the authoritative topic category list.
|
|
46
55
|
*/
|
|
47
56
|
export declare function getTopicsMetadata(ctx: ServerContext): Promise<TopicMetadata[]>;
|
|
48
57
|
/**
|
|
49
|
-
* Check which products have
|
|
58
|
+
* Check which products have documentation available via MapsRegistry.
|
|
50
59
|
*/
|
|
51
60
|
export declare function getProductAvailability(ctx: ServerContext): Promise<Record<string, boolean>>;
|
|
52
61
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../../src/core/services/metadata.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../../src/core/services/metadata.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAGL,KAAK,SAAS,EACf,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAMzD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,GAAG,QAAQ,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AA8DD;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CA4CxF;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,aAAa,EAClB,SAAS,EAAE,SAAS,EACpB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA0BxB;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,aAAa,EAClB,SAAS,EAAE,SAAS,GACnB,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBnB;AAMD;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAuBpF;AAMD;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,aAAa,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAkClC;AAMD;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE;QACR,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,EAAE,CAAC;QAC5B,QAAQ,EAAE,MAAM,CAAC;KAClB,EAAE,CAAC;IACJ,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAgBD;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC;IACvE,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QACN,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,EAAE,CAAC;IACJ,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAeD"}
|