@get-technology-inc/jamf-docs-mcp-server 5.6.0 → 5.8.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/dist/core/constants/sources.d.ts +124 -1
- package/dist/core/constants/sources.d.ts.map +1 -1
- package/dist/core/constants/sources.js +67 -0
- package/dist/core/constants/sources.js.map +1 -1
- package/dist/core/services/cache-key.d.ts +14 -0
- package/dist/core/services/cache-key.d.ts.map +1 -1
- package/dist/core/services/cache-key.js +3 -0
- package/dist/core/services/cache-key.js.map +1 -1
- package/dist/core/services/intercom-service.d.ts +85 -0
- package/dist/core/services/intercom-service.d.ts.map +1 -0
- package/dist/core/services/intercom-service.js +312 -0
- package/dist/core/services/intercom-service.js.map +1 -0
- package/dist/core/services/sitemap-service.d.ts +60 -0
- package/dist/core/services/sitemap-service.d.ts.map +1 -0
- package/dist/core/services/sitemap-service.js +201 -0
- package/dist/core/services/sitemap-service.js.map +1 -0
- package/dist/core/services/static-article-service.d.ts.map +1 -1
- package/dist/core/services/static-article-service.js +29 -0
- package/dist/core/services/static-article-service.js.map +1 -1
- package/dist/core/tools/get-toc.d.ts.map +1 -1
- package/dist/core/tools/get-toc.js +95 -5
- package/dist/core/tools/get-toc.js.map +1 -1
- package/dist/core/tools/list-products.d.ts.map +1 -1
- package/dist/core/tools/list-products.js +45 -11
- package/dist/core/tools/list-products.js.map +1 -1
- package/package.json +1 -1
|
@@ -12,6 +12,23 @@
|
|
|
12
12
|
* else: the article path dispatches on hostname.
|
|
13
13
|
*/
|
|
14
14
|
import { type SelectorSet } from './limits.js';
|
|
15
|
+
/**
|
|
16
|
+
* One browsable part of a static source.
|
|
17
|
+
*
|
|
18
|
+
* A Fluid Topics publication is a bundle with a TOC endpoint. A static site
|
|
19
|
+
* has no such thing, so its browsable units are declared: `path` is the URL
|
|
20
|
+
* segment that groups them and `id` is what `jamf_docs_get_toc`'s
|
|
21
|
+
* `publication` parameter accepts, which keeps both kinds of source on one
|
|
22
|
+
* tool surface rather than adding a third addressing mode.
|
|
23
|
+
*/
|
|
24
|
+
export interface StaticSection {
|
|
25
|
+
/** Publication id, e.g. `jamf-concepts-guides`. */
|
|
26
|
+
readonly id: string;
|
|
27
|
+
/** URL segment after the locale, e.g. `guides`. */
|
|
28
|
+
readonly path: string;
|
|
29
|
+
/** Title for listings. */
|
|
30
|
+
readonly title: string;
|
|
31
|
+
}
|
|
15
32
|
export interface StaticDocSource {
|
|
16
33
|
/** Stable id, used as the cache namespace discriminator. */
|
|
17
34
|
readonly id: string;
|
|
@@ -21,7 +38,17 @@ export interface StaticDocSource {
|
|
|
21
38
|
readonly baseUrl: string;
|
|
22
39
|
/** Human name, for prose and error messages. */
|
|
23
40
|
readonly name: string;
|
|
24
|
-
/**
|
|
41
|
+
/**
|
|
42
|
+
* How this source's pages are read.
|
|
43
|
+
*
|
|
44
|
+
* `html` parses the DOM with {@link StaticDocSource.selectors}. `intercom`
|
|
45
|
+
* ignores them entirely: an Intercom Help Center embeds its own data as
|
|
46
|
+
* JSON in `<script id="__NEXT_DATA__">`, and the content model is a block
|
|
47
|
+
* list rather than markup, so the rendered DOM is a view of the source of
|
|
48
|
+
* truth rather than the source itself.
|
|
49
|
+
*/
|
|
50
|
+
readonly parser: 'html' | 'intercom';
|
|
51
|
+
/** How to read this source's HTML. Unused when `parser` is not `html`. */
|
|
25
52
|
readonly selectors: SelectorSet;
|
|
26
53
|
/**
|
|
27
54
|
* Appended to every article served from this source.
|
|
@@ -32,6 +59,34 @@ export interface StaticDocSource {
|
|
|
32
59
|
* without saying which is which would be the actual error.
|
|
33
60
|
*/
|
|
34
61
|
readonly provenance?: string;
|
|
62
|
+
/**
|
|
63
|
+
* Locale codes this source uses, mapped from this server's.
|
|
64
|
+
*
|
|
65
|
+
* concepts.jamf.com uses bare short codes (`en`, `ja`, `de`) and is
|
|
66
|
+
* case-sensitive; only `zh-TW` matches this server's form exactly. Locales
|
|
67
|
+
* absent from this map are not published by the source at all — th-TH is
|
|
68
|
+
* a hard gap, `/th` and `/th-TH` both 404.
|
|
69
|
+
*/
|
|
70
|
+
readonly locales: Readonly<Record<string, string>>;
|
|
71
|
+
/**
|
|
72
|
+
* Browsable sections, exposed as publications.
|
|
73
|
+
*
|
|
74
|
+
* Empty for a source whose sections are not knowable without a request —
|
|
75
|
+
* an Intercom Help Center's collections are content, not configuration,
|
|
76
|
+
* and pinning their ids here would mean a registry edit whenever Jamf adds
|
|
77
|
+
* one. Those are discovered instead; see {@link StaticDocSource.dynamicSections}.
|
|
78
|
+
*/
|
|
79
|
+
readonly sections: readonly StaticSection[];
|
|
80
|
+
/**
|
|
81
|
+
* Set when sections come from the source at runtime rather than this table.
|
|
82
|
+
*
|
|
83
|
+
* The publication id is then `{prefix}-{slug}`, so a caller can still name
|
|
84
|
+
* one without knowing Intercom's numeric ids.
|
|
85
|
+
*/
|
|
86
|
+
readonly dynamicSections?: {
|
|
87
|
+
readonly kind: 'intercom-collections';
|
|
88
|
+
readonly idPrefix: string;
|
|
89
|
+
};
|
|
35
90
|
}
|
|
36
91
|
export declare const STATIC_DOC_SOURCES: {
|
|
37
92
|
readonly 'jamf-concepts': {
|
|
@@ -39,6 +94,7 @@ export declare const STATIC_DOC_SOURCES: {
|
|
|
39
94
|
readonly hostname: "concepts.jamf.com";
|
|
40
95
|
readonly baseUrl: "https://concepts.jamf.com";
|
|
41
96
|
readonly name: "Jamf Concepts";
|
|
97
|
+
readonly parser: "html";
|
|
42
98
|
readonly selectors: {
|
|
43
99
|
readonly CONTENT: "article, [class*=\"prose\"]";
|
|
44
100
|
readonly TITLE: "h1";
|
|
@@ -47,6 +103,53 @@ export declare const STATIC_DOC_SOURCES: {
|
|
|
47
103
|
readonly REMOVE: string;
|
|
48
104
|
};
|
|
49
105
|
readonly provenance: string;
|
|
106
|
+
readonly locales: {
|
|
107
|
+
readonly 'en-US': "en";
|
|
108
|
+
readonly 'ja-JP': "ja";
|
|
109
|
+
readonly 'de-DE': "de";
|
|
110
|
+
readonly 'es-ES': "es";
|
|
111
|
+
readonly 'fr-FR': "fr";
|
|
112
|
+
readonly 'nl-NL': "nl";
|
|
113
|
+
readonly 'zh-TW': "zh-TW";
|
|
114
|
+
readonly 'zh-CN': "zh-CN";
|
|
115
|
+
};
|
|
116
|
+
readonly sections: readonly [{
|
|
117
|
+
readonly id: "jamf-concepts-guides";
|
|
118
|
+
readonly path: "guides";
|
|
119
|
+
readonly title: "Jamf Concepts: Guides";
|
|
120
|
+
}, {
|
|
121
|
+
readonly id: "jamf-concepts-tools";
|
|
122
|
+
readonly path: "concepts";
|
|
123
|
+
readonly title: "Jamf Concepts: Open Source Tools";
|
|
124
|
+
}];
|
|
125
|
+
};
|
|
126
|
+
readonly 'jamf-support': {
|
|
127
|
+
readonly id: "jamf-support";
|
|
128
|
+
readonly hostname: "support.jamf.com";
|
|
129
|
+
readonly baseUrl: "https://support.jamf.com";
|
|
130
|
+
readonly name: "Jamf Support Knowledge Base";
|
|
131
|
+
readonly parser: "intercom";
|
|
132
|
+
readonly selectors: {
|
|
133
|
+
readonly CONTENT: "article, main";
|
|
134
|
+
readonly TITLE: "h1";
|
|
135
|
+
readonly BREADCRUMB: "[class*=\"breadcrumb\"] a";
|
|
136
|
+
readonly RELATED: "[class*=\"related\"] a";
|
|
137
|
+
readonly REMOVE: string;
|
|
138
|
+
};
|
|
139
|
+
readonly provenance: string;
|
|
140
|
+
readonly locales: {
|
|
141
|
+
readonly 'en-US': "en";
|
|
142
|
+
readonly 'de-DE': "de";
|
|
143
|
+
readonly 'es-ES': "es";
|
|
144
|
+
readonly 'fr-FR': "fr";
|
|
145
|
+
readonly 'ja-JP': "ja";
|
|
146
|
+
readonly 'zh-TW': "zh-TW";
|
|
147
|
+
};
|
|
148
|
+
readonly sections: readonly [];
|
|
149
|
+
readonly dynamicSections: {
|
|
150
|
+
readonly kind: "intercom-collections";
|
|
151
|
+
readonly idPrefix: "jamf-support";
|
|
152
|
+
};
|
|
50
153
|
};
|
|
51
154
|
};
|
|
52
155
|
export type StaticSourceId = keyof typeof STATIC_DOC_SOURCES;
|
|
@@ -62,4 +165,24 @@ export declare function staticSourceForHostname(hostname: string): StaticDocSour
|
|
|
62
165
|
* URL with a message about it.
|
|
63
166
|
*/
|
|
64
167
|
export declare function staticSourceForUrl(urlStr: string): StaticDocSource | undefined;
|
|
168
|
+
/** Every browsable section across all static sources, as publication rows. */
|
|
169
|
+
export declare const STATIC_SECTIONS: readonly {
|
|
170
|
+
source: StaticDocSource;
|
|
171
|
+
section: StaticSection;
|
|
172
|
+
}[];
|
|
173
|
+
/** The static section a publication id names, or undefined for a Fluid Topics one. */
|
|
174
|
+
export declare function staticSectionById(id: string): {
|
|
175
|
+
source: StaticDocSource;
|
|
176
|
+
section: StaticSection;
|
|
177
|
+
} | undefined;
|
|
178
|
+
/** Sources whose sections are discovered at runtime rather than declared here. */
|
|
179
|
+
export declare const DYNAMIC_SECTION_SOURCES: readonly StaticDocSource[];
|
|
180
|
+
/**
|
|
181
|
+
* Publication id for a runtime-discovered section.
|
|
182
|
+
*
|
|
183
|
+
* Built from the slug rather than Intercom's numeric id so a caller can name
|
|
184
|
+
* a collection from its URL, and so recreating a collection upstream does not
|
|
185
|
+
* change the id this server publishes.
|
|
186
|
+
*/
|
|
187
|
+
export declare function dynamicSectionId(source: StaticDocSource, slug: string): string;
|
|
65
188
|
//# sourceMappingURL=sources.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sources.d.ts","sourceRoot":"","sources":["../../../src/core/constants/sources.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,gFAAgF;IAChF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,gDAAgD;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,
|
|
1
|
+
{"version":3,"file":"sources.d.ts","sourceRoot":"","sources":["../../../src/core/constants/sources.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1D;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0BAA0B;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,gFAAgF;IAChF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,gDAAgD;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;;;;;OAQG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;IACrC,0EAA0E;IAC1E,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC;IAChC;;;;;;;OAOG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD;;;;;;;OAOG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;IAC5C;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CACjG;AAiBD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0EqB,CAAC;AAErD,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,kBAAkB,CAAC;AAE7D,mEAAmE;AACnE,eAAO,MAAM,uBAAuB,EAAE,SAAS,MAAM,EACa,CAAC;AAEnE,sEAAsE;AACtE,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAErF;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAM9E;AAED,8EAA8E;AAC9E,eAAO,MAAM,eAAe,EAAE,SAAS;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,aAAa,CAAA;CAAE,EAEhC,CAAC;AAE3D,sFAAsF;AACtF,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,MAAM,GACT;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,aAAa,CAAA;CAAE,GAAG,SAAS,CAEjE;AAED,kFAAkF;AAClF,eAAO,MAAM,uBAAuB,EAAE,SAAS,eAAe,EAEH,CAAC;AAE5D;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9E"}
|
|
@@ -31,6 +31,7 @@ export const STATIC_DOC_SOURCES = {
|
|
|
31
31
|
hostname: 'concepts.jamf.com',
|
|
32
32
|
baseUrl: 'https://concepts.jamf.com',
|
|
33
33
|
name: 'Jamf Concepts',
|
|
34
|
+
parser: 'html',
|
|
34
35
|
selectors: {
|
|
35
36
|
// Every page type — guide, concept, about — wraps its body in exactly
|
|
36
37
|
// one `<article class="prose">`. `main` is deliberately NOT listed:
|
|
@@ -47,6 +48,53 @@ export const STATIC_DOC_SOURCES = {
|
|
|
47
48
|
provenance: 'Source: Jamf Concepts (concepts.jamf.com), Jamf\'s innovation lab. ' +
|
|
48
49
|
'This is exploratory material, not official product documentation — ' +
|
|
49
50
|
'see learn.jamf.com for the supported configuration steps.',
|
|
51
|
+
locales: {
|
|
52
|
+
'en-US': 'en',
|
|
53
|
+
'ja-JP': 'ja',
|
|
54
|
+
'de-DE': 'de',
|
|
55
|
+
'es-ES': 'es',
|
|
56
|
+
'fr-FR': 'fr',
|
|
57
|
+
'nl-NL': 'nl',
|
|
58
|
+
'zh-TW': 'zh-TW',
|
|
59
|
+
'zh-CN': 'zh-CN',
|
|
60
|
+
},
|
|
61
|
+
sections: [
|
|
62
|
+
{ id: 'jamf-concepts-guides', path: 'guides', title: 'Jamf Concepts: Guides' },
|
|
63
|
+
{ id: 'jamf-concepts-tools', path: 'concepts', title: 'Jamf Concepts: Open Source Tools' },
|
|
64
|
+
],
|
|
65
|
+
},
|
|
66
|
+
'jamf-support': {
|
|
67
|
+
id: 'jamf-support',
|
|
68
|
+
hostname: 'support.jamf.com',
|
|
69
|
+
baseUrl: 'https://support.jamf.com',
|
|
70
|
+
name: 'Jamf Support Knowledge Base',
|
|
71
|
+
parser: 'intercom',
|
|
72
|
+
// Unused: the Intercom parser reads __NEXT_DATA__, not the DOM. Present
|
|
73
|
+
// because the shape requires it and because a future HTML fallback would
|
|
74
|
+
// want somewhere sensible to start.
|
|
75
|
+
selectors: {
|
|
76
|
+
CONTENT: 'article, main',
|
|
77
|
+
TITLE: 'h1',
|
|
78
|
+
BREADCRUMB: '[class*="breadcrumb"] a',
|
|
79
|
+
RELATED: '[class*="related"] a',
|
|
80
|
+
REMOVE: STATIC_PAGE_REMOVE,
|
|
81
|
+
},
|
|
82
|
+
provenance: 'Source: Jamf Support Knowledge Base (support.jamf.com). Troubleshooting ' +
|
|
83
|
+
'and known-issue articles, edited separately from the product ' +
|
|
84
|
+
'documentation on learn.jamf.com.',
|
|
85
|
+
// Six locales route and carry content. `nl` and `th` route but return an
|
|
86
|
+
// empty collection list, so they are absent rather than listed and
|
|
87
|
+
// silently empty.
|
|
88
|
+
locales: {
|
|
89
|
+
'en-US': 'en',
|
|
90
|
+
'de-DE': 'de',
|
|
91
|
+
'es-ES': 'es',
|
|
92
|
+
'fr-FR': 'fr',
|
|
93
|
+
'ja-JP': 'ja',
|
|
94
|
+
'zh-TW': 'zh-TW',
|
|
95
|
+
},
|
|
96
|
+
sections: [],
|
|
97
|
+
dynamicSections: { kind: 'intercom-collections', idPrefix: 'jamf-support' },
|
|
50
98
|
},
|
|
51
99
|
};
|
|
52
100
|
/** Every non-Fluid-Topics hostname this server will fetch from. */
|
|
@@ -70,4 +118,23 @@ export function staticSourceForUrl(urlStr) {
|
|
|
70
118
|
return undefined;
|
|
71
119
|
}
|
|
72
120
|
}
|
|
121
|
+
/** Every browsable section across all static sources, as publication rows. */
|
|
122
|
+
export const STATIC_SECTIONS = Object.values(STATIC_DOC_SOURCES).flatMap(source => source.sections.map(section => ({ source, section })));
|
|
123
|
+
/** The static section a publication id names, or undefined for a Fluid Topics one. */
|
|
124
|
+
export function staticSectionById(id) {
|
|
125
|
+
return STATIC_SECTIONS.find(row => row.section.id === id);
|
|
126
|
+
}
|
|
127
|
+
/** Sources whose sections are discovered at runtime rather than declared here. */
|
|
128
|
+
export const DYNAMIC_SECTION_SOURCES = Object.values(STATIC_DOC_SOURCES)
|
|
129
|
+
.filter(source => source.dynamicSections !== undefined);
|
|
130
|
+
/**
|
|
131
|
+
* Publication id for a runtime-discovered section.
|
|
132
|
+
*
|
|
133
|
+
* Built from the slug rather than Intercom's numeric id so a caller can name
|
|
134
|
+
* a collection from its URL, and so recreating a collection upstream does not
|
|
135
|
+
* change the id this server publishes.
|
|
136
|
+
*/
|
|
137
|
+
export function dynamicSectionId(source, slug) {
|
|
138
|
+
return `${source.dynamicSections?.idPrefix ?? source.id}-${slug}`;
|
|
139
|
+
}
|
|
73
140
|
//# sourceMappingURL=sources.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sources.js","sourceRoot":"","sources":["../../../src/core/constants/sources.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,SAAS,EAAoB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"sources.js","sourceRoot":"","sources":["../../../src/core/constants/sources.ts"],"names":[],"mappings":"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"}
|
|
@@ -111,6 +111,20 @@ export interface CacheKeySpaces {
|
|
|
111
111
|
source: string;
|
|
112
112
|
url: string;
|
|
113
113
|
};
|
|
114
|
+
/** A static source's sitemap, whole. One per source, so no per-locale part. */
|
|
115
|
+
'static-sitemap': {
|
|
116
|
+
source: string;
|
|
117
|
+
};
|
|
118
|
+
/** An Intercom Help Center's top-level collections, per locale. */
|
|
119
|
+
'intercom-collections': {
|
|
120
|
+
source: string;
|
|
121
|
+
locale: string;
|
|
122
|
+
};
|
|
123
|
+
/** One Intercom collection's article tree. Keyed on the collection, which is locale-specific. */
|
|
124
|
+
'intercom-collection-toc': {
|
|
125
|
+
source: string;
|
|
126
|
+
collection: string;
|
|
127
|
+
};
|
|
114
128
|
'maps-registry-v2': null;
|
|
115
129
|
'metadata-products-v2': null;
|
|
116
130
|
'metadata-topics': null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-key.d.ts","sourceRoot":"","sources":["../../../src/core/services/cache-key.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,CAAC,MAAM,eAAe,EAAE,OAAO,MAAM,CAAC;AAE7C,8EAA8E;AAC9E,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,CAAC,eAAe,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC;AAErE,KAAK,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAEvD;;;;;;;;;GASG;AACH,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,SAAS,aAAa,EAAE,CAAC;AAEtE;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC;AAEvF;;;;;;;;GAQG;AAMH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QACpB,OAAO,EAAE,sBAAsB,CAAC;KACjC,CAAC;IASF,eAAe,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAQ1E,QAAQ,EAAE;QAAE,MAAM,EAAE,QAAQ,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,gBAAgB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACpC,gBAAgB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IASpC,cAAc,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAClC,kBAAkB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACzD;;;;;;;;;OASG;IACH,gBAAgB,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,kBAAkB,EAAE,IAAI,CAAC;IACzB,sBAAsB,EAAE,IAAI,CAAC;IAC7B,iBAAiB,EAAE,IAAI,CAAC;IACxB,+BAA+B,EAAE,IAAI,CAAC;CACvC;AAID,MAAM,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"cache-key.d.ts","sourceRoot":"","sources":["../../../src/core/services/cache-key.ts"],"names":[],"mappings":"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"}
|
|
@@ -47,6 +47,9 @@ const CACHE_NAMESPACE_REGISTRY = {
|
|
|
47
47
|
'glossary-toc': true,
|
|
48
48
|
'glossary-content': true,
|
|
49
49
|
'static-article': true,
|
|
50
|
+
'static-sitemap': true,
|
|
51
|
+
'intercom-collections': true,
|
|
52
|
+
'intercom-collection-toc': true,
|
|
50
53
|
'maps-registry-v2': true,
|
|
51
54
|
'metadata-products-v2': true,
|
|
52
55
|
'metadata-topics': true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-key.js","sourceRoot":"","sources":["../../../src/core/services/cache-key.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;
|
|
1
|
+
{"version":3,"file":"cache-key.js","sourceRoot":"","sources":["../../../src/core/services/cache-key.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AA0IH;;;;;;GAMG;AACH,MAAM,wBAAwB,GAE1B;IACF,WAAW,EAAE,IAAI;IACjB,eAAe,EAAE,IAAI;IACrB,QAAQ,EAAE,IAAI;IACd,gBAAgB,EAAE,IAAI;IACtB,gBAAgB,EAAE,IAAI;IACtB,cAAc,EAAE,IAAI;IACpB,kBAAkB,EAAE,IAAI;IACxB,gBAAgB,EAAE,IAAI;IACtB,gBAAgB,EAAE,IAAI;IACtB,sBAAsB,EAAE,IAAI;IAC5B,yBAAyB,EAAE,IAAI;IAC/B,kBAAkB,EAAE,IAAI;IACxB,sBAAsB,EAAE,IAAI;IAC5B,iBAAiB,EAAE,IAAI;IACvB,+BAA+B,EAAE,IAAI;CACtC,CAAC;AAEF,qFAAqF;AACrF,MAAM,CAAC,MAAM,gBAAgB,GAC3B,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAqB,CAAC;AAM5D;;;;GAIG;AACH,SAAS,YAAY,CAAC,KAAuB;IAC3C,MAAM,SAAS,GAAkC,EAAE,CAAC;IACpD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC1B,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,YAAY,CAAC,KAAoB,EAAE,IAAY;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,SAAS,CACjB,mBAAmB,IAAI,QAAQ,MAAM,CAAC,KAAK,CAAC,6CAA6C,CAC1F,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAAC,YAAY,CAAC,IAAqB,EAAE,IAAI,CAAC,CAAC;QAAC,CAAC;IAC1E,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CACtB,SAAY,EACZ,GAAG,IAAqB;IAExB,6EAA6E;IAC7E,yEAAyE;IACzE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAoC,CAAC;IACrD,MAAM,OAAO,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;IACrF,OAAO,GAAG,SAAS,GAAG,OAAO,EAAc,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reading an Intercom Help Center.
|
|
3
|
+
*
|
|
4
|
+
* support.jamf.com is a Next.js app whose every page embeds its own data as
|
|
5
|
+
* JSON in `<script id="__NEXT_DATA__">`. That is the source of truth: the
|
|
6
|
+
* rendered DOM is a view of it, and parsing the JSON avoids guessing at
|
|
7
|
+
* class names that change with any theme update.
|
|
8
|
+
*
|
|
9
|
+
* The content model is a block list, not HTML, so it is rendered to Markdown
|
|
10
|
+
* here rather than going through `content-parser`.
|
|
11
|
+
*/
|
|
12
|
+
import type { StaticDocSource } from '../constants/sources.js';
|
|
13
|
+
import type { ServerContext } from '../types/context.js';
|
|
14
|
+
import type { FetchTocOptions, FetchTocResult, TocEntry } from '../types.js';
|
|
15
|
+
/**
|
|
16
|
+
* Pull the embedded page data out of an Intercom Help Center page.
|
|
17
|
+
*
|
|
18
|
+
* The opening tag carries a `nonce` attribute, so a regex anchored on
|
|
19
|
+
* `<script id="__NEXT_DATA__" type="application/json">` misses every page.
|
|
20
|
+
* Matching up to the first `>` is what makes it robust to attribute drift.
|
|
21
|
+
*/
|
|
22
|
+
export declare function parseNextData(html: string): Record<string, unknown> | null;
|
|
23
|
+
interface IntercomBlock {
|
|
24
|
+
type?: string;
|
|
25
|
+
text?: string;
|
|
26
|
+
items?: IntercomBlock[];
|
|
27
|
+
content?: IntercomBlock[];
|
|
28
|
+
summary?: string;
|
|
29
|
+
url?: string;
|
|
30
|
+
style?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Render one Intercom block.
|
|
34
|
+
*
|
|
35
|
+
* Ten types occur across the live corpus, not the four the integration notes
|
|
36
|
+
* listed. `callout` and `collapsibleSection` nest their body under `content`
|
|
37
|
+
* rather than `text`, and `subheading`, `unorderedNestedList`,
|
|
38
|
+
* `collapsibleSection`, `image`, `code` and `horizontalRule` would all be
|
|
39
|
+
* dropped by a renderer that only knew the four — silently, since a missing
|
|
40
|
+
* block leaves no trace in the output.
|
|
41
|
+
*/
|
|
42
|
+
export declare function renderBlock(block: IntercomBlock, depth?: number): string;
|
|
43
|
+
export declare function renderBlocks(blocks: IntercomBlock[], depth?: number): string;
|
|
44
|
+
export interface IntercomArticle {
|
|
45
|
+
title: string;
|
|
46
|
+
content: string;
|
|
47
|
+
description?: string;
|
|
48
|
+
lastUpdated?: string;
|
|
49
|
+
breadcrumb: string[];
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Parse one Help Center article page.
|
|
53
|
+
*
|
|
54
|
+
* `articleContent.markdown` exists on every article and is `null` on every
|
|
55
|
+
* one measured — the body is in `blocks`. Reading the field that is named
|
|
56
|
+
* for what you want is the trap here.
|
|
57
|
+
*/
|
|
58
|
+
export declare function parseIntercomArticle(html: string): IntercomArticle | null;
|
|
59
|
+
export interface IntercomCollection {
|
|
60
|
+
id: string;
|
|
61
|
+
slug: string;
|
|
62
|
+
name: string;
|
|
63
|
+
description: string;
|
|
64
|
+
url: string;
|
|
65
|
+
articleCount: number;
|
|
66
|
+
}
|
|
67
|
+
/** The Help Center's top-level collections for one locale. */
|
|
68
|
+
export declare function listIntercomCollections(ctx: ServerContext, source: StaticDocSource, locale: string): Promise<IntercomCollection[]>;
|
|
69
|
+
/**
|
|
70
|
+
* The article tree of one collection.
|
|
71
|
+
*
|
|
72
|
+
* A collection page's `__NEXT_DATA__` carries the whole subtree —
|
|
73
|
+
* subcollections and every article summary — so one request answers what
|
|
74
|
+
* crawling 356 article pages would.
|
|
75
|
+
*/
|
|
76
|
+
export declare function fetchIntercomCollectionToc(ctx: ServerContext, source: StaticDocSource, collection: IntercomCollection): Promise<TocEntry[]>;
|
|
77
|
+
/**
|
|
78
|
+
* A `FetchTocResult` for one Intercom collection.
|
|
79
|
+
*
|
|
80
|
+
* Pagination and truncation match the other TOC paths, so a caller cannot
|
|
81
|
+
* tell from the response shape which kind of source answered.
|
|
82
|
+
*/
|
|
83
|
+
export declare function fetchIntercomToc(ctx: ServerContext, source: StaticDocSource, collection: IntercomCollection, options?: FetchTocOptions): Promise<FetchTocResult>;
|
|
84
|
+
export {};
|
|
85
|
+
//# sourceMappingURL=intercom-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intercom-service.d.ts","sourceRoot":"","sources":["../../../src/core/services/intercom-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAU7E;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAQ1E;AA0BD,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,aAAa,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA+ED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,SAAI,GAAG,MAAM,CAuBnE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,KAAK,SAAI,GAAG,MAAM,CAEvE;AAID,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAqBzE;AAID,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;CACtB;AAqBD,8DAA8D;AAC9D,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,aAAa,EAClB,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAwB/B;AAED;;;;;;GAMG;AACH,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,aAAa,EAClB,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,kBAAkB,GAC7B,OAAO,CAAC,QAAQ,EAAE,CAAC,CAiCrB;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,aAAa,EAClB,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,kBAAkB,EAC9B,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,cAAc,CAAC,CAgCzB"}
|