@mnaoumov/typescript-dev-toolkit 1.3.1 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/assets/docs-site/components/ConstructorBlock.astro +16 -0
- package/assets/docs-site/components/ImportStatement.astro +12 -0
- package/assets/docs-site/components/MemberDetail.astro +101 -0
- package/assets/docs-site/components/MethodTable.astro +45 -0
- package/assets/docs-site/components/PropertyTable.astro +45 -0
- package/assets/docs-site/components/SiteTitle.astro +43 -0
- package/assets/docs-site/components/TypeSignature.astro +20 -0
- package/assets/docs-site/fonts/inter-latin-400-normal.ttf +0 -0
- package/assets/docs-site/fonts/inter-latin-700-normal.ttf +0 -0
- package/assets/docs-site/styles/global.css +221 -0
- package/dist/lib/cjs/build.cjs +1 -1
- package/dist/lib/cjs/build.d.cts +1 -1
- package/dist/lib/cjs/commitlint-config.cjs +18 -3
- package/dist/lib/cjs/commitlint-config.d.cts +6 -0
- package/dist/lib/cjs/commitlint-forbidden-patterns.cjs +2 -2
- package/dist/lib/cjs/commitlint-forbidden-patterns.d.cts +1 -1
- package/dist/lib/cjs/commitlint-spellcheck-header.cjs +2 -2
- package/dist/lib/cjs/commitlint-spellcheck-header.d.cts +1 -1
- package/dist/lib/cjs/docs-site/api-doc-constants.cjs +171 -0
- package/dist/lib/cjs/docs-site/api-doc-constants.d.cts +18 -0
- package/dist/lib/cjs/docs-site/api-doc-jsdoc.cjs +414 -0
- package/dist/lib/cjs/docs-site/api-doc-jsdoc.d.cts +149 -0
- package/dist/lib/cjs/docs-site/api-doc-link-rendering.cjs +377 -0
- package/dist/lib/cjs/docs-site/api-doc-link-rendering.d.cts +185 -0
- package/dist/lib/cjs/docs-site/api-doc-package-sites.cjs +118 -0
- package/dist/lib/cjs/docs-site/api-doc-package-sites.d.cts +36 -0
- package/dist/lib/cjs/docs-site/api-doc-page-generation.cjs +561 -0
- package/dist/lib/cjs/docs-site/api-doc-page-generation.d.cts +159 -0
- package/dist/lib/cjs/docs-site/api-doc-route-segments.cjs +42 -0
- package/dist/lib/cjs/docs-site/api-doc-route-segments.d.cts +25 -0
- package/dist/lib/cjs/docs-site/api-doc-settings.cjs +47 -0
- package/dist/lib/cjs/docs-site/api-doc-settings.d.cts +53 -0
- package/dist/lib/cjs/docs-site/api-doc-source-processing.cjs +288 -0
- package/dist/lib/cjs/docs-site/api-doc-source-processing.d.cts +75 -0
- package/dist/lib/cjs/docs-site/api-doc-text-utils.cjs +281 -0
- package/dist/lib/cjs/docs-site/api-doc-text-utils.d.cts +178 -0
- package/dist/lib/cjs/docs-site/api-doc-type-merging.cjs +157 -0
- package/dist/lib/cjs/docs-site/api-doc-type-merging.d.cts +51 -0
- package/dist/lib/cjs/docs-site/api-doc-types.cjs +22 -0
- package/dist/lib/cjs/docs-site/api-doc-types.d.cts +157 -0
- package/dist/lib/cjs/docs-site/api-docs.cjs +143 -0
- package/dist/lib/cjs/docs-site/api-docs.d.cts +34 -0
- package/dist/lib/cjs/docs-site/astro-config.cjs +169 -0
- package/dist/lib/cjs/docs-site/astro-config.d.cts +23 -0
- package/dist/lib/cjs/docs-site/docs-links.cjs +123 -0
- package/dist/lib/cjs/docs-site/docs-links.d.cts +32 -0
- package/dist/lib/cjs/docs-site/docs-site-assets.cjs +64 -0
- package/dist/lib/cjs/docs-site/docs-site-assets.d.cts +23 -0
- package/dist/lib/cjs/docs-site/docs-site-commands.cjs +72 -0
- package/dist/lib/cjs/docs-site/docs-site-commands.d.cts +29 -0
- package/dist/lib/cjs/docs-site/docs-site-config.cjs +122 -0
- package/dist/lib/cjs/docs-site/docs-site-config.d.cts +162 -0
- package/dist/lib/cjs/docs-site/index.cjs +116 -0
- package/dist/lib/cjs/docs-site/index.d.cts +26 -0
- package/dist/lib/cjs/docs-site/link-check.cjs +197 -0
- package/dist/lib/cjs/docs-site/link-check.d.cts +163 -0
- package/dist/lib/cjs/docs-site/og-image-page.cjs +45 -0
- package/dist/lib/cjs/docs-site/og-image-page.d.cts +15 -0
- package/dist/lib/cjs/docs-site/og-image.cjs +326 -0
- package/dist/lib/cjs/docs-site/og-image.d.cts +70 -0
- package/dist/lib/cjs/docs-site/og-images.cjs +170 -0
- package/dist/lib/cjs/docs-site/og-images.d.cts +41 -0
- package/dist/lib/cjs/docs-site/route-data.cjs +47 -0
- package/dist/lib/cjs/docs-site/route-data.d.cts +14 -0
- package/dist/lib/cjs/docs-site/satteri-github-alerts.cjs +97 -0
- package/dist/lib/cjs/docs-site/satteri-github-alerts.d.cts +31 -0
- package/dist/lib/cjs/docs-site/satteri-relative-links.cjs +87 -0
- package/dist/lib/cjs/docs-site/satteri-relative-links.d.cts +29 -0
- package/dist/lib/cjs/docs-site/unrendered-alerts.cjs +51 -0
- package/dist/lib/cjs/docs-site/unrendered-alerts.d.cts +38 -0
- package/dist/lib/cjs/index.cjs +4 -1
- package/dist/lib/cjs/index.d.cts +1 -0
- package/dist/lib/cjs/library-build.cjs +1 -1
- package/dist/lib/cjs/library-build.d.cts +2 -2
- package/dist/lib/cjs/linters/eslint-config.cjs +17 -17
- package/dist/lib/cjs/linters/eslint-config.d.cts +1 -7
- package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.cjs +2 -2
- package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.d.cts +5 -8
- package/dist/lib/cjs/package-manager.cjs +2 -2
- package/dist/lib/esm/build.d.mts +1 -1
- package/dist/lib/esm/build.mjs +1 -1
- package/dist/lib/esm/commitlint-config.d.mts +6 -0
- package/dist/lib/esm/commitlint-config.mjs +7 -3
- package/dist/lib/esm/commitlint-forbidden-patterns.d.mts +1 -1
- package/dist/lib/esm/commitlint-forbidden-patterns.mjs +2 -2
- package/dist/lib/esm/commitlint-spellcheck-header.d.mts +1 -1
- package/dist/lib/esm/commitlint-spellcheck-header.mjs +2 -2
- package/dist/lib/esm/docs-site/api-doc-constants.d.mts +18 -0
- package/dist/lib/esm/docs-site/api-doc-constants.mjs +143 -0
- package/dist/lib/esm/docs-site/api-doc-jsdoc.d.mts +149 -0
- package/dist/lib/esm/docs-site/api-doc-jsdoc.mjs +377 -0
- package/dist/lib/esm/docs-site/api-doc-link-rendering.d.mts +185 -0
- package/dist/lib/esm/docs-site/api-doc-link-rendering.mjs +356 -0
- package/dist/lib/esm/docs-site/api-doc-package-sites.d.mts +36 -0
- package/dist/lib/esm/docs-site/api-doc-package-sites.mjs +91 -0
- package/dist/lib/esm/docs-site/api-doc-page-generation.d.mts +159 -0
- package/dist/lib/esm/docs-site/api-doc-page-generation.mjs +548 -0
- package/dist/lib/esm/docs-site/api-doc-route-segments.d.mts +25 -0
- package/dist/lib/esm/docs-site/api-doc-route-segments.mjs +17 -0
- package/dist/lib/esm/docs-site/api-doc-settings.d.mts +53 -0
- package/dist/lib/esm/docs-site/api-doc-settings.mjs +22 -0
- package/dist/lib/esm/docs-site/api-doc-source-processing.d.mts +75 -0
- package/dist/lib/esm/docs-site/api-doc-source-processing.mjs +274 -0
- package/dist/lib/esm/docs-site/api-doc-text-utils.d.mts +178 -0
- package/dist/lib/esm/docs-site/api-doc-text-utils.mjs +239 -0
- package/dist/lib/esm/docs-site/api-doc-type-merging.d.mts +51 -0
- package/dist/lib/esm/docs-site/api-doc-type-merging.mjs +129 -0
- package/dist/lib/esm/docs-site/api-doc-types.d.mts +157 -0
- package/dist/lib/esm/docs-site/api-doc-types.mjs +6 -0
- package/dist/lib/esm/docs-site/api-docs.d.mts +34 -0
- package/dist/lib/esm/docs-site/api-docs.mjs +139 -0
- package/dist/lib/esm/docs-site/astro-config.d.mts +23 -0
- package/dist/lib/esm/docs-site/astro-config.mjs +135 -0
- package/dist/lib/esm/docs-site/docs-links.d.mts +32 -0
- package/dist/lib/esm/docs-site/docs-links.mjs +113 -0
- package/dist/lib/esm/docs-site/docs-site-assets.d.mts +23 -0
- package/dist/lib/esm/docs-site/docs-site-assets.mjs +32 -0
- package/dist/lib/esm/docs-site/docs-site-commands.d.mts +29 -0
- package/dist/lib/esm/docs-site/docs-site-commands.mjs +46 -0
- package/dist/lib/esm/docs-site/docs-site-config.d.mts +162 -0
- package/dist/lib/esm/docs-site/docs-site-config.mjs +98 -0
- package/dist/lib/esm/docs-site/index.d.mts +26 -0
- package/dist/lib/esm/docs-site/index.mjs +58 -0
- package/dist/lib/esm/docs-site/link-check.d.mts +163 -0
- package/dist/lib/esm/docs-site/link-check.mjs +166 -0
- package/dist/lib/esm/docs-site/og-image-page.d.mts +15 -0
- package/dist/lib/esm/docs-site/og-image-page.mjs +21 -0
- package/dist/lib/esm/docs-site/og-image.d.mts +70 -0
- package/dist/lib/esm/docs-site/og-image.mjs +292 -0
- package/dist/lib/esm/docs-site/og-images.d.mts +41 -0
- package/dist/lib/esm/docs-site/og-images.mjs +156 -0
- package/dist/lib/esm/docs-site/route-data.d.mts +14 -0
- package/dist/lib/esm/docs-site/route-data.mjs +23 -0
- package/dist/lib/esm/docs-site/satteri-github-alerts.d.mts +31 -0
- package/dist/lib/esm/docs-site/satteri-github-alerts.mjs +72 -0
- package/dist/lib/esm/docs-site/satteri-relative-links.d.mts +29 -0
- package/dist/lib/esm/docs-site/satteri-relative-links.mjs +63 -0
- package/dist/lib/esm/docs-site/unrendered-alerts.d.mts +38 -0
- package/dist/lib/esm/docs-site/unrendered-alerts.mjs +26 -0
- package/dist/lib/esm/index.d.mts +1 -0
- package/dist/lib/esm/index.mjs +3 -1
- package/dist/lib/esm/library-build.d.mts +2 -2
- package/dist/lib/esm/library-build.mjs +1 -1
- package/dist/lib/esm/linters/eslint-config.d.mts +1 -7
- package/dist/lib/esm/linters/eslint-config.mjs +17 -17
- package/dist/lib/esm/linters/eslint-rules/in-house-plugin.d.mts +5 -8
- package/dist/lib/esm/linters/eslint-rules/in-house-plugin.mjs +2 -2
- package/dist/lib/esm/package-manager.mjs +2 -2
- package/docs-site/api-doc-constants/package.json +6 -0
- package/docs-site/api-doc-jsdoc/package.json +6 -0
- package/docs-site/api-doc-link-rendering/package.json +6 -0
- package/docs-site/api-doc-package-sites/package.json +6 -0
- package/docs-site/api-doc-page-generation/package.json +6 -0
- package/docs-site/api-doc-route-segments/package.json +6 -0
- package/docs-site/api-doc-settings/package.json +6 -0
- package/docs-site/api-doc-source-processing/package.json +6 -0
- package/docs-site/api-doc-text-utils/package.json +6 -0
- package/docs-site/api-doc-type-merging/package.json +6 -0
- package/docs-site/api-doc-types/package.json +6 -0
- package/docs-site/api-docs/package.json +6 -0
- package/docs-site/astro-config/package.json +6 -0
- package/docs-site/docs-links/package.json +6 -0
- package/docs-site/docs-site-assets/package.json +6 -0
- package/docs-site/docs-site-commands/package.json +6 -0
- package/docs-site/docs-site-config/package.json +6 -0
- package/docs-site/index/package.json +6 -0
- package/docs-site/link-check/package.json +6 -0
- package/docs-site/og-image/package.json +6 -0
- package/docs-site/og-image-page/package.json +6 -0
- package/docs-site/og-images/package.json +6 -0
- package/docs-site/package.json +6 -0
- package/docs-site/route-data/package.json +6 -0
- package/docs-site/satteri-github-alerts/package.json +6 -0
- package/docs-site/satteri-relative-links/package.json +6 -0
- package/docs-site/unrendered-alerts/package.json +6 -0
- package/package.json +75 -5
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
(function () {
|
|
6
|
+
function ensureBrowserProcess() {
|
|
7
|
+
const browserProcess = {
|
|
8
|
+
browser: true,
|
|
9
|
+
cwd() {
|
|
10
|
+
return '/';
|
|
11
|
+
},
|
|
12
|
+
env: {},
|
|
13
|
+
platform: 'android'
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const existingProcess = globalThis.process;
|
|
17
|
+
|
|
18
|
+
if (!existingProcess) {
|
|
19
|
+
globalThis.process = browserProcess;
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (existingProcess.versions?.node) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const existingProcessRecord = existingProcess;
|
|
28
|
+
|
|
29
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
30
|
+
existingProcessRecord[key] ??= value;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
existingProcessRecord['browser'] = true;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
ensureBrowserProcess();
|
|
37
|
+
})();
|
|
38
|
+
|
|
39
|
+
"use strict";
|
|
40
|
+
var __defProp = Object.defineProperty;
|
|
41
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
42
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
43
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
44
|
+
var __export = (target, all) => {
|
|
45
|
+
for (var name in all)
|
|
46
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
47
|
+
};
|
|
48
|
+
var __copyProps = (to, from, except, desc) => {
|
|
49
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
50
|
+
for (let key of __getOwnPropNames(from))
|
|
51
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
52
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
53
|
+
}
|
|
54
|
+
return to;
|
|
55
|
+
};
|
|
56
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
57
|
+
var api_doc_link_rendering_exports = {};
|
|
58
|
+
__export(api_doc_link_rendering_exports, {
|
|
59
|
+
doesMemberPageExist: () => doesMemberPageExist,
|
|
60
|
+
findType: () => findType,
|
|
61
|
+
linkBaseType: () => linkBaseType,
|
|
62
|
+
loadExternalTypeMaps: () => loadExternalTypeMaps,
|
|
63
|
+
markdownToHtml: () => markdownToHtml,
|
|
64
|
+
memberHref: () => memberHref,
|
|
65
|
+
registerMemberPages: () => registerMemberPages,
|
|
66
|
+
registerRouteSegments: () => registerRouteSegments,
|
|
67
|
+
renderExampleMdx: () => renderExampleMdx,
|
|
68
|
+
renderMdxProse: () => renderMdxProse,
|
|
69
|
+
renderTypeWithLinks: () => renderTypeWithLinks,
|
|
70
|
+
resolveExternalTypeUrl: () => resolveExternalTypeUrl,
|
|
71
|
+
resolveLinks: () => resolveLinks,
|
|
72
|
+
resolveTsUtilityUrl: () => resolveTsUtilityUrl,
|
|
73
|
+
resolveWebApiUrl: () => resolveWebApiUrl,
|
|
74
|
+
toTypeFileSegment: () => toTypeFileSegment,
|
|
75
|
+
toTypeRouteSegment: () => toTypeRouteSegment,
|
|
76
|
+
typeHref: () => typeHref,
|
|
77
|
+
typeLink: () => typeLink
|
|
78
|
+
});
|
|
79
|
+
module.exports = __toCommonJS(api_doc_link_rendering_exports);
|
|
80
|
+
var import_reg_exp = require('@mnaoumov/typescript-lib/reg-exp');
|
|
81
|
+
var import_node_fs = require('node:fs');
|
|
82
|
+
var import_node_path = require('node:path');
|
|
83
|
+
var import_api_doc_constants = require('./api-doc-constants.cjs');
|
|
84
|
+
var import_api_doc_package_sites = require('./api-doc-package-sites.cjs');
|
|
85
|
+
var import_api_doc_route_segments = require('./api-doc-route-segments.cjs');
|
|
86
|
+
var import_api_doc_settings = require('./api-doc-settings.cjs');
|
|
87
|
+
var import_api_doc_text_utils = require('./api-doc-text-utils.cjs');
|
|
88
|
+
const moduleState = {
|
|
89
|
+
webApiTypes: {}
|
|
90
|
+
};
|
|
91
|
+
const typeFileSegments = /* @__PURE__ */ new Map();
|
|
92
|
+
const typeRouteSegments = /* @__PURE__ */ new Map();
|
|
93
|
+
const generatedMemberPages = /* @__PURE__ */ new Set();
|
|
94
|
+
function doesMemberPageExist(namespace, typeName, routeSegment) {
|
|
95
|
+
return generatedMemberPages.has(`${namespace}#${typeName}#${routeSegment}`);
|
|
96
|
+
}
|
|
97
|
+
function findType(allTypes, name, currentNamespace) {
|
|
98
|
+
if (currentNamespace !== void 0) {
|
|
99
|
+
const qualified = allTypes.get(`${currentNamespace}#${name}`);
|
|
100
|
+
if (qualified) {
|
|
101
|
+
return qualified;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
let found;
|
|
105
|
+
let matchCount = 0;
|
|
106
|
+
for (const info of allTypes.values()) {
|
|
107
|
+
if (info.name !== name) {
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
found = info;
|
|
111
|
+
matchCount++;
|
|
112
|
+
if (matchCount > 1) {
|
|
113
|
+
return void 0;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return matchCount === 1 ? found : void 0;
|
|
117
|
+
}
|
|
118
|
+
function linkBaseType(typeName, allTypes, currentNamespace) {
|
|
119
|
+
const isSimpleTypeRef = /^[a-zA-Z][a-zA-Z0-9]*(?:<.*>)?$/.test(typeName.trim());
|
|
120
|
+
return isSimpleTypeRef ? (0, import_api_doc_text_utils.escapeMdxAngleBrackets)(renderTypeWithLinks(typeName, allTypes, void 0, currentNamespace)) : typeLink(typeName, allTypes, currentNamespace);
|
|
121
|
+
}
|
|
122
|
+
function loadExternalTypeMaps(rootDirectory) {
|
|
123
|
+
try {
|
|
124
|
+
const dataPath = (0, import_node_path.join)(rootDirectory, "node_modules/typedoc-plugin-mdn-links/data/web-api.json");
|
|
125
|
+
moduleState.webApiTypes = JSON.parse((0, import_node_fs.readFileSync)(dataPath, "utf-8"));
|
|
126
|
+
console.warn(`Loaded ${String(Object.keys(moduleState.webApiTypes).length)} Web API type links`);
|
|
127
|
+
} catch {
|
|
128
|
+
moduleState.webApiTypes = {};
|
|
129
|
+
console.warn("typedoc-plugin-mdn-links data not found \u2014 Web API links will be unavailable.");
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function markdownToHtml(text) {
|
|
133
|
+
const escaped = text.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">");
|
|
134
|
+
return (0, import_api_doc_text_utils.replaceRegExpMatches)(escaped, /\[(?<text>[^\]]+)\]\((?<url>[^)]+)\)/g, (match) => {
|
|
135
|
+
const linkText = (0, import_reg_exp.getMandatoryNamedGroup)(match, "text");
|
|
136
|
+
const url = (0, import_reg_exp.getMandatoryNamedGroup)(match, "url");
|
|
137
|
+
return /^(?:https?:\/\/|\/|#|mailto:)/.test(url) ? `<a href="${url}">${linkText}</a>` : `<code>[${linkText}](${url})</code>`;
|
|
138
|
+
}).replaceAll(/`(?<code>[^`]+)`/g, "<code>$<code></code>").replaceAll("\n", "<br/>");
|
|
139
|
+
}
|
|
140
|
+
function memberHref(memberSlugString, inheritedFrom, allTypes, currentNamespace) {
|
|
141
|
+
if (!inheritedFrom) {
|
|
142
|
+
return `./${memberSlugString}/`;
|
|
143
|
+
}
|
|
144
|
+
const parentInfo = findType(allTypes, inheritedFrom, currentNamespace);
|
|
145
|
+
if (!parentInfo || !doesMemberPageExist(parentInfo.namespace, parentInfo.name, memberSlugString)) {
|
|
146
|
+
return "";
|
|
147
|
+
}
|
|
148
|
+
const parentNsDirectory = (0, import_api_doc_text_utils.getNamespaceDirectory)(parentInfo.namespace);
|
|
149
|
+
return `${getBasePath()}/api/${parentNsDirectory}/${toTypeRouteSegment(parentInfo.namespace, parentInfo.name)}/${memberSlugString}/`;
|
|
150
|
+
}
|
|
151
|
+
function registerMemberPages(types) {
|
|
152
|
+
generatedMemberPages.clear();
|
|
153
|
+
for (const info of types.values()) {
|
|
154
|
+
for (const property of info.properties) {
|
|
155
|
+
if (!property.inheritedFrom) {
|
|
156
|
+
generatedMemberPages.add(`${info.namespace}#${info.name}#${(0, import_api_doc_text_utils.memberRouteSegment)(property.name)}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
const overloadKeys = /* @__PURE__ */ new Set();
|
|
160
|
+
for (const method of info.methods) {
|
|
161
|
+
if (!method.inheritedFrom) {
|
|
162
|
+
overloadKeys.add(method.overloadKey);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
for (const overloadKey of overloadKeys) {
|
|
166
|
+
generatedMemberPages.add(`${info.namespace}#${info.name}#${(0, import_api_doc_text_utils.overloadRouteSegment)(overloadKey)}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
function registerRouteSegments(types) {
|
|
171
|
+
typeFileSegments.clear();
|
|
172
|
+
typeRouteSegments.clear();
|
|
173
|
+
const byNamespace = /* @__PURE__ */ new Map();
|
|
174
|
+
for (const info of types.values()) {
|
|
175
|
+
const list = byNamespace.get(info.namespace) ?? [];
|
|
176
|
+
list.push(info);
|
|
177
|
+
byNamespace.set(info.namespace, list);
|
|
178
|
+
}
|
|
179
|
+
for (const [namespace, infos] of byNamespace) {
|
|
180
|
+
const usedFileSegments = /* @__PURE__ */ new Set();
|
|
181
|
+
const usedRouteSegments = /* @__PURE__ */ new Set();
|
|
182
|
+
const sorted = [...infos].sort((alpha, bravo) => alpha.name.localeCompare(bravo.name));
|
|
183
|
+
for (const info of sorted) {
|
|
184
|
+
typeFileSegments.set(`${namespace}#${info.name}`, disambiguate((0, import_api_doc_route_segments.toRouteSegment)(info.name), usedFileSegments, (segment) => segment));
|
|
185
|
+
const routeBase = (0, import_api_doc_route_segments.toRouteSegmentPreserveCase)(info.name);
|
|
186
|
+
const routeSegment = disambiguate(routeBase, usedRouteSegments, (segment) => segment.toLowerCase());
|
|
187
|
+
typeRouteSegments.set(`${namespace}#${info.name}`, routeSegment);
|
|
188
|
+
if (routeSegment !== routeBase) {
|
|
189
|
+
console.warn(`Disambiguated ROUTE for "${namespace}#${info.name}": "${routeBase}" -> "${routeSegment}" (slug collision).`);
|
|
190
|
+
}
|
|
191
|
+
warnMemberSlugCollisions(info, namespace);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
function renderExampleMdx(example, allTypes, selfNamespace) {
|
|
196
|
+
return /(?:^|\n)\s*(?:```|~~~)/.test(example) ? renderMdxProse(example, allTypes, selfNamespace) : `\`\`\`ts
|
|
197
|
+
${example}
|
|
198
|
+
\`\`\``;
|
|
199
|
+
}
|
|
200
|
+
function renderMdxProse(text, allTypes, selfNamespace) {
|
|
201
|
+
const out = [];
|
|
202
|
+
for (const seg of (0, import_api_doc_text_utils.segmentMarkdown)(text)) {
|
|
203
|
+
if (seg.type === "code") {
|
|
204
|
+
out.push("", `\`\`\`${seg.lang || "ts"}`, seg.text, "```", "");
|
|
205
|
+
} else {
|
|
206
|
+
out.push((0, import_api_doc_text_utils.escapeMdxProse)(resolveLinks(seg.text, allTypes, selfNamespace)));
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return out.join("\n").replaceAll(/\n{3,}/g, "\n\n").trim();
|
|
210
|
+
}
|
|
211
|
+
function renderTypeWithLinks(typeText, allTypes, selfTypeName, selfNamespace) {
|
|
212
|
+
const MDN_OBJECT_BASE = "https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object";
|
|
213
|
+
const withObjectMethods = (0, import_api_doc_text_utils.replaceRegExpMatches)(typeText, /\bObject\.(?<method>[a-zA-Z][a-zA-Z0-9]*)\b/g, (match) => {
|
|
214
|
+
const method = (0, import_reg_exp.getMandatoryNamedGroup)(match, "method");
|
|
215
|
+
return `[Object](${MDN_OBJECT_BASE}).[${method}](${MDN_OBJECT_BASE}/${method})`;
|
|
216
|
+
});
|
|
217
|
+
return (0, import_api_doc_text_utils.replaceRegExpMatches)(
|
|
218
|
+
withObjectMethods,
|
|
219
|
+
/\[[^\]]+\]\([^)]+\)|\b(?<typeName>[a-zA-Z][a-zA-Z0-9]*)\b/g,
|
|
220
|
+
(match) => {
|
|
221
|
+
const typeName = (0, import_reg_exp.getOptionalNamedGroup)(match, "typeName");
|
|
222
|
+
if (typeName === null) {
|
|
223
|
+
return match[0];
|
|
224
|
+
}
|
|
225
|
+
if (typeName === "this" && selfTypeName) {
|
|
226
|
+
const selfInfo = findType(allTypes, selfTypeName, selfNamespace);
|
|
227
|
+
if (selfInfo) {
|
|
228
|
+
return `[${typeName}](${typeHref(selfInfo)})`;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
if (import_api_doc_constants.GENERIC_TYPE_PARAMS.has(typeName)) {
|
|
232
|
+
return typeName;
|
|
233
|
+
}
|
|
234
|
+
const info = findType(allTypes, typeName, selfNamespace);
|
|
235
|
+
if (info) {
|
|
236
|
+
return `[${typeName}](${typeHref(info)})`;
|
|
237
|
+
}
|
|
238
|
+
const externalUrl = resolveExternalTypeUrl(typeName);
|
|
239
|
+
if (externalUrl) {
|
|
240
|
+
return `[${typeName}](${externalUrl})`;
|
|
241
|
+
}
|
|
242
|
+
const tsUrl = resolveTsUtilityUrl(typeName);
|
|
243
|
+
if (tsUrl) {
|
|
244
|
+
return `[${typeName}](${tsUrl})`;
|
|
245
|
+
}
|
|
246
|
+
const globalUrl = Object.hasOwn(import_api_doc_constants.TS_GLOBAL_TYPES, typeName) ? import_api_doc_constants.TS_GLOBAL_TYPES[typeName] : void 0;
|
|
247
|
+
if (globalUrl) {
|
|
248
|
+
return `[${typeName}](${globalUrl})`;
|
|
249
|
+
}
|
|
250
|
+
const mdnUrl = resolveWebApiUrl(typeName);
|
|
251
|
+
if (mdnUrl) {
|
|
252
|
+
return `[${typeName}](${mdnUrl})`;
|
|
253
|
+
}
|
|
254
|
+
const primitiveUrl = Object.hasOwn(import_api_doc_constants.TS_PRIMITIVE_TYPES, typeName) ? import_api_doc_constants.TS_PRIMITIVE_TYPES[typeName] : void 0;
|
|
255
|
+
return primitiveUrl ? `[${typeName}](${primitiveUrl})` : typeName;
|
|
256
|
+
}
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
function resolveExternalTypeUrl(name) {
|
|
260
|
+
return (0, import_api_doc_package_sites.getPackageTypeUrl)(name) ?? (0, import_api_doc_settings.getApiDocSettings)().externalTypeLinks.get(name);
|
|
261
|
+
}
|
|
262
|
+
function resolveLinks(text, allTypes, selfNamespace) {
|
|
263
|
+
return (0, import_api_doc_text_utils.replaceRegExpMatches)(text, /\{@link\s+(?<target>[^|}]+?)(?:\s*\|\s*(?<display>[^}]+?))?\}/g, (match) => {
|
|
264
|
+
const target = (0, import_reg_exp.getMandatoryNamedGroup)(match, "target").trim();
|
|
265
|
+
const display = ((0, import_reg_exp.getOptionalNamedGroup)(match, "display")?.trim() ?? target).replaceAll(/\\(?=[<>{}])/g, "");
|
|
266
|
+
const dotMatch = /^(?<typeName>[A-Za-z]\w*)\.(?<memberName>\w+)$/.exec(target);
|
|
267
|
+
if (dotMatch) {
|
|
268
|
+
const typeName = (0, import_reg_exp.getMandatoryNamedGroup)(dotMatch, "typeName");
|
|
269
|
+
const memberName = (0, import_reg_exp.getMandatoryNamedGroup)(dotMatch, "memberName");
|
|
270
|
+
const typeInfo = findType(allTypes, typeName, selfNamespace);
|
|
271
|
+
if (typeInfo && doesMemberPageExist(typeInfo.namespace, typeInfo.name, (0, import_api_doc_text_utils.memberRouteSegment)(memberName))) {
|
|
272
|
+
const targetNsDirectory = (0, import_api_doc_text_utils.getNamespaceDirectory)(typeInfo.namespace);
|
|
273
|
+
return `[${display}](${getBasePath()}/api/${targetNsDirectory}/${toTypeRouteSegment(typeInfo.namespace, typeInfo.name)}/${(0, import_api_doc_text_utils.memberRouteSegment)(memberName)}/)`;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
const info = findType(allTypes, target, selfNamespace);
|
|
277
|
+
if (info) {
|
|
278
|
+
return display !== target && display.includes("<") ? renderTypeWithLinks(display, allTypes, void 0, selfNamespace) : `[${display}](${typeHref(info)})`;
|
|
279
|
+
}
|
|
280
|
+
const externalUrl = resolveExternalTypeUrl(target);
|
|
281
|
+
return externalUrl ? `[${display}](${externalUrl})` : `\`${display}\``;
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
function resolveTsUtilityUrl(name) {
|
|
285
|
+
const hash = import_api_doc_constants.TS_UTILITY_TYPES.get(name);
|
|
286
|
+
if (hash) {
|
|
287
|
+
if (["Iterable"].includes(name)) {
|
|
288
|
+
return `https://www.typescriptlang.org/docs/handbook/iterators-and-generators.html#${hash}`;
|
|
289
|
+
}
|
|
290
|
+
const handbookPage = ["Capitalize", "Lowercase", "Uncapitalize", "Uppercase"].includes(name) ? "2/template-literal-types" : "utility-types";
|
|
291
|
+
return `https://www.typescriptlang.org/docs/handbook/${handbookPage}.html#${hash}`;
|
|
292
|
+
}
|
|
293
|
+
return void 0;
|
|
294
|
+
}
|
|
295
|
+
function resolveWebApiUrl(name) {
|
|
296
|
+
if (!Object.hasOwn(moduleState.webApiTypes, name)) {
|
|
297
|
+
return void 0;
|
|
298
|
+
}
|
|
299
|
+
const entry = moduleState.webApiTypes[name];
|
|
300
|
+
if (typeof entry === "string") {
|
|
301
|
+
return entry;
|
|
302
|
+
}
|
|
303
|
+
if (typeof entry === "object" && entry !== null && "url" in entry) {
|
|
304
|
+
const typedEntry = entry;
|
|
305
|
+
return typedEntry.url;
|
|
306
|
+
}
|
|
307
|
+
return void 0;
|
|
308
|
+
}
|
|
309
|
+
function toTypeFileSegment(namespace, name) {
|
|
310
|
+
return typeFileSegments.get(`${namespace}#${name}`) ?? (0, import_api_doc_route_segments.toRouteSegment)(name);
|
|
311
|
+
}
|
|
312
|
+
function toTypeRouteSegment(namespace, name) {
|
|
313
|
+
return typeRouteSegments.get(`${namespace}#${name}`) ?? (0, import_api_doc_route_segments.toRouteSegmentPreserveCase)(name);
|
|
314
|
+
}
|
|
315
|
+
function typeHref(info) {
|
|
316
|
+
return `${getBasePath()}/api/${(0, import_api_doc_text_utils.getNamespaceDirectory)(info.namespace)}/${toTypeRouteSegment(info.namespace, info.name)}/`;
|
|
317
|
+
}
|
|
318
|
+
function typeLink(typeName, allTypes, currentNamespace) {
|
|
319
|
+
const cleanName = typeName.replace(/<.*>$/, "").trim();
|
|
320
|
+
const info = findType(allTypes, cleanName, currentNamespace);
|
|
321
|
+
return info ? `[${(0, import_api_doc_text_utils.escapeMdxAngleBrackets)(typeName)}](${typeHref(info)})` : `\`${typeName}\``;
|
|
322
|
+
}
|
|
323
|
+
function disambiguate(base, used, keyOf) {
|
|
324
|
+
let segment = base;
|
|
325
|
+
const FIRST_DISAMBIGUATION_SUFFIX = 2;
|
|
326
|
+
let suffix = FIRST_DISAMBIGUATION_SUFFIX;
|
|
327
|
+
while (used.has(keyOf(segment))) {
|
|
328
|
+
segment = `${base}-${String(suffix)}`;
|
|
329
|
+
suffix++;
|
|
330
|
+
}
|
|
331
|
+
used.add(keyOf(segment));
|
|
332
|
+
return segment;
|
|
333
|
+
}
|
|
334
|
+
function getBasePath() {
|
|
335
|
+
return (0, import_api_doc_settings.getApiDocSettings)().basePath;
|
|
336
|
+
}
|
|
337
|
+
function warnMemberSlugCollisions(info, namespace) {
|
|
338
|
+
const seen = /* @__PURE__ */ new Map();
|
|
339
|
+
function check(slug, original) {
|
|
340
|
+
const normalized = original.replace(/\?$/, "");
|
|
341
|
+
const existing = seen.get(slug);
|
|
342
|
+
if (existing !== void 0 && existing !== normalized) {
|
|
343
|
+
console.warn(`Member route collision in "${namespace}#${info.name}": "${existing}" and "${normalized}" both map to "/${slug}/".`);
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
seen.set(slug, normalized);
|
|
347
|
+
}
|
|
348
|
+
for (const property of info.properties) {
|
|
349
|
+
check((0, import_api_doc_text_utils.memberSlug)(property.name), property.name);
|
|
350
|
+
}
|
|
351
|
+
for (const method of info.methods) {
|
|
352
|
+
check((0, import_api_doc_text_utils.overloadSlug)(method.overloadKey), method.overloadKey);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
356
|
+
0 && (module.exports = {
|
|
357
|
+
doesMemberPageExist,
|
|
358
|
+
findType,
|
|
359
|
+
linkBaseType,
|
|
360
|
+
loadExternalTypeMaps,
|
|
361
|
+
markdownToHtml,
|
|
362
|
+
memberHref,
|
|
363
|
+
registerMemberPages,
|
|
364
|
+
registerRouteSegments,
|
|
365
|
+
renderExampleMdx,
|
|
366
|
+
renderMdxProse,
|
|
367
|
+
renderTypeWithLinks,
|
|
368
|
+
resolveExternalTypeUrl,
|
|
369
|
+
resolveLinks,
|
|
370
|
+
resolveTsUtilityUrl,
|
|
371
|
+
resolveWebApiUrl,
|
|
372
|
+
toTypeFileSegment,
|
|
373
|
+
toTypeRouteSegment,
|
|
374
|
+
typeHref,
|
|
375
|
+
typeLink
|
|
376
|
+
});
|
|
377
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy1saW5rLXJlbmRlcmluZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVHlwZS1saW5rIHJlbmRlcmluZzogdHVybnMgdHlwZSB0ZXh0IGFuZCBpbmxpbmUgbGluayB0YWdzIGludG8gbWFya2Rvd24gbGlua3MgdG8gZ2VuZXJhdGVkIHBhZ2VzXG4gKiBvciBleHRlcm5hbCByZWZlcmVuY2VzIChUeXBlU2NyaXB0IGhhbmRib29rLCBNRE4gV2ViIEFQSSwgSlMgZ2xvYmFscykuXG4gKi9cblxuaW1wb3J0IHtcbiAgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCxcbiAgZ2V0T3B0aW9uYWxOYW1lZEdyb3VwXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgVHlwZUluZm8sXG4gIFdlYkFwaUVudHJ5XG59IGZyb20gJy4vYXBpLWRvYy10eXBlcy50cyc7XG5cbmltcG9ydCB7XG4gIEdFTkVSSUNfVFlQRV9QQVJBTVMsXG4gIFRTX0dMT0JBTF9UWVBFUyxcbiAgVFNfUFJJTUlUSVZFX1RZUEVTLFxuICBUU19VVElMSVRZX1RZUEVTXG59IGZyb20gJy4vYXBpLWRvYy1jb25zdGFudHMudHMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZVR5cGVVcmwgfSBmcm9tICcuL2FwaS1kb2MtcGFja2FnZS1zaXRlcy50cyc7XG5pbXBvcnQge1xuICB0b1JvdXRlU2VnbWVudCxcbiAgdG9Sb3V0ZVNlZ21lbnRQcmVzZXJ2ZUNhc2Vcbn0gZnJvbSAnLi9hcGktZG9jLXJvdXRlLXNlZ21lbnRzLnRzJztcbmltcG9ydCB7IGdldEFwaURvY1NldHRpbmdzIH0gZnJvbSAnLi9hcGktZG9jLXNldHRpbmdzLnRzJztcbmltcG9ydCB7XG4gIGVzY2FwZU1keEFuZ2xlQnJhY2tldHMsXG4gIGVzY2FwZU1keFByb3NlLFxuICBnZXROYW1lc3BhY2VEaXJlY3RvcnksXG4gIG1lbWJlclJvdXRlU2VnbWVudCxcbiAgbWVtYmVyU2x1ZyxcbiAgb3ZlcmxvYWRSb3V0ZVNlZ21lbnQsXG4gIG92ZXJsb2FkU2x1ZyxcbiAgcmVwbGFjZVJlZ0V4cE1hdGNoZXMsXG4gIHNlZ21lbnRNYXJrZG93blxufSBmcm9tICcuL2FwaS1kb2MtdGV4dC11dGlscy50cyc7XG5cbi8qKlxuTG9hZGVkIGZyb20gdHlwZWRvYy1wbHVnaW4tbWRuLWxpbmtzIGRhdGEgYXQgcnVudGltZVxuICovXG4vKipcbk1vZHVsZS1sZXZlbCBtdXRhYmxlIHN0YXRlLCBoZWxkIGluIG9uZSBvYmplY3Qgc28gZWFjaCBtdXRhdGlvbiBuYW1lcyBpdCBleHBsaWNpdGx5LlxuICovXG5pbnRlcmZhY2UgTW9kdWxlU3RhdGUge1xuICB3ZWJBcGlUeXBlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmNvbnN0IG1vZHVsZVN0YXRlOiBNb2R1bGVTdGF0ZSA9IHtcbiAgd2ViQXBpVHlwZXM6IHt9XG59O1xuLyoqXG5Mb3dlcmNhc2VkLCBjb2xsaXNpb24tZGlzYW1iaWd1YXRlZCBPTi1ESVNLIHNlZ21lbnQgcGVyIHF1YWxpZmllZCB0eXBlIGtleSAoYCR7bmFtZXNwYWNlfSMke25hbWV9YCkuXG4gKi9cbmNvbnN0IHR5cGVGaWxlU2VnbWVudHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuLyoqXG5DYXNlLXByZXNlcnZlZCBVUkwvcm91dGUgc2VnbWVudCBwZXIgcXVhbGlmaWVkIHR5cGUga2V5IChgJHtuYW1lc3BhY2V9IyR7bmFtZX1gKS5cbiAqL1xuY29uc3QgdHlwZVJvdXRlU2VnbWVudHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4vKipcbiAqIFJvdXRlLXNlZ21lbnQga2V5cyBvZiB0aGUgbWVtYmVyIHBhZ2VzIHRoYXQgYGdlbmVyYXRlTWVtYmVyUGFnZXNgIHdpbGwgYWN0dWFsbHkgZW1pdCwgYXNcbiAqIGAke25hbWVzcGFjZX0jJHtUeXBlTmFtZX0jJHtyb3V0ZVNlZ21lbnR9YC4gT25seSBOT04taW5oZXJpdGVkIHByb3BlcnRpZXMgYW5kIG5vbi1pbmhlcml0ZWQgbWV0aG9kXG4gKiBvdmVybG9hZCBrZXlzIGdldCBhIHBhZ2UsIHNvIHRoaXMgbGV0cyBsaW5rIGVtaXR0ZXJzIGF2b2lkIHBvaW50aW5nIGF0IGEgbWVtYmVyIHBhZ2UgdGhhdCBpcyBuZXZlclxuICogZ2VuZXJhdGVkIChhbiBpbmhlcml0ZWQgbWVtYmVyLCBhbiBlbnVtIG1lbWJlciwgYW4gb3B0aW9ucy1pbnRlcmZhY2UgbWVtYmVyKSDigJQgd2hpY2ggd291bGQgNDA0LlxuICovXG5jb25zdCBnZW5lcmF0ZWRNZW1iZXJQYWdlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4vKipcbiAqIFdoZXRoZXIgYSBtZW1iZXIgcGFnZSB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgYHJvdXRlU2VnbWVudGAgb24gdGhlIGdpdmVuIHR5cGUuXG4gKlxuICogQHBhcmFtIG5hbWVzcGFjZSAtIFRoZSB0eXBlJ3MgbmFtZXNwYWNlLlxuICogQHBhcmFtIHR5cGVOYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIHJvdXRlU2VnbWVudCAtIFRoZSBtZW1iZXIncyByb3V0ZSBzZWdtZW50LlxuICogQHJldHVybnMgV2hldGhlciB0aGUgcGFnZSBpcyBnZW5lcmF0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb2VzTWVtYmVyUGFnZUV4aXN0KG5hbWVzcGFjZTogc3RyaW5nLCB0eXBlTmFtZTogc3RyaW5nLCByb3V0ZVNlZ21lbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2VuZXJhdGVkTWVtYmVyUGFnZXMuaGFzKGAke25hbWVzcGFjZX0jJHt0eXBlTmFtZX0jJHtyb3V0ZVNlZ21lbnR9YCk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGJhcmUgdHlwZSBuYW1lIHRvIGEgZG9jdW1lbnRlZCBgVHlwZUluZm9gLlxuICpcbiAqIFRoZSBtb2RlbCBtYXAgaXMga2V5ZWQgYnkgYSBxdWFsaWZpZWQgYCR7bmFtZXNwYWNlfSMke25hbWV9YCBpZGVudGl0eSwgYmVjYXVzZSBhIHBhY2thZ2VcbiAqIGNhbiBleHBvcnQgdGhlIHNhbWUgc2ltcGxlIG5hbWUgZnJvbSBkaWZmZXJlbnQgbW9kdWxlcy4gUmVzb2x1dGlvbiBpcyBiZXN0LWVmZm9ydDpcbiAqICAgMS4gUHJlZmVyIGEgdHlwZSBpbiBgY3VycmVudE5hbWVzcGFjZWAgKHRoZSByZWZlcmVuY2luZyBwYWdlJ3MgbW9kdWxlKS5cbiAqICAgMi4gT3RoZXJ3aXNlLCBpZiBleGFjdGx5IG9uZSB0eXBlIGFjcm9zcyBhbGwgbW9kdWxlcyBoYXMgdGhhdCBiYXJlIG5hbWUsIHVzZSBpdC5cbiAqICAgMy4gSWYgdGhlIGJhcmUgbmFtZSBpcyBhbWJpZ3VvdXMgKG11bHRpcGxlIG1vZHVsZXMpLCBnaXZlIHVwIChjYWxsZXIgcmVuZGVycyBwbGFpbiBjb2RlKS5cbiAqXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEBwYXJhbSBjdXJyZW50TmFtZXNwYWNlIC0gVGhlIG5hbWVzcGFjZSBvZiB0aGUgcmVmZXJlbmNpbmcgcGFnZSwgcHJlZmVycmVkIHdoZW4gdGhlIG5hbWUgaXMgYW1iaWd1b3VzLlxuICogQHJldHVybnMgVGhlIHR5cGUsIG9yIGB1bmRlZmluZWRgIHdoZW4gbm8gdHlwZSBvciBtb3JlIHRoYW4gb25lIGhhcyB0aGF0IG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kVHlwZShhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LCBuYW1lOiBzdHJpbmcsIGN1cnJlbnROYW1lc3BhY2U/OiBzdHJpbmcpOiBUeXBlSW5mbyB8IHVuZGVmaW5lZCB7XG4gIGlmIChjdXJyZW50TmFtZXNwYWNlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBxdWFsaWZpZWQgPSBhbGxUeXBlcy5nZXQoYCR7Y3VycmVudE5hbWVzcGFjZX0jJHtuYW1lfWApO1xuICAgIGlmIChxdWFsaWZpZWQpIHtcbiAgICAgIHJldHVybiBxdWFsaWZpZWQ7XG4gICAgfVxuICB9XG4gIGxldCBmb3VuZDogVHlwZUluZm8gfCB1bmRlZmluZWQ7XG4gIGxldCBtYXRjaENvdW50ID0gMDtcbiAgZm9yIChjb25zdCBpbmZvIG9mIGFsbFR5cGVzLnZhbHVlcygpKSB7XG4gICAgaWYgKGluZm8ubmFtZSAhPT0gbmFtZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZm91bmQgPSBpbmZvO1xuICAgIG1hdGNoQ291bnQrKztcbiAgICBpZiAobWF0Y2hDb3VudCA+IDEpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXRjaENvdW50ID09PSAxID8gZm91bmQgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogTGluayBhIGJhc2UgdHlwZSBleHByZXNzaW9uIGZvciB0aGUgXCJFeHRlbmRzOlwiIGxpbmUuXG4gKiBTaW1wbGUgdHlwZSByZWZlcmVuY2VzIChpZGVudGlmaWVyICsgb3B0aW9uYWwgZ2VuZXJpY3MpIHVzZSByZW5kZXJUeXBlV2l0aExpbmtzXG4gKiBzbyBlYWNoIHR5cGUgYXJndW1lbnQgZ2V0cyBpdHMgb3duIGxpbmsuXG4gKiBDb21wbGV4IGV4cHJlc3Npb25zIChvYmplY3QgdHlwZXMsIGludGVyc2VjdGlvbnMsIGV0Yy4pIGZhbGwgYmFjayB0byB0eXBlTGlua1xuICogdG8gYXZvaWQgTURYIHBhcnNpbmcgaXNzdWVzIHdpdGggYHtgLCBgfWAsIGB8YCBldGMuXG4gKlxuICogQHBhcmFtIHR5cGVOYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICogQHBhcmFtIGN1cnJlbnROYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIG9mIHRoZSByZWZlcmVuY2luZyBwYWdlLCBwcmVmZXJyZWQgd2hlbiB0aGUgbmFtZSBpcyBhbWJpZ3VvdXMuXG4gKiBAcmV0dXJucyBUaGUgbGlua2VkIHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaW5rQmFzZVR5cGUodHlwZU5hbWU6IHN0cmluZywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPiwgY3VycmVudE5hbWVzcGFjZT86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGlzU2ltcGxlVHlwZVJlZiA9IC9eW2EtekEtWl1bYS16QS1aMC05XSooPzo8Lio+KT8kLy50ZXN0KHR5cGVOYW1lLnRyaW0oKSk7XG4gIHJldHVybiBpc1NpbXBsZVR5cGVSZWYgPyBlc2NhcGVNZHhBbmdsZUJyYWNrZXRzKHJlbmRlclR5cGVXaXRoTGlua3ModHlwZU5hbWUsIGFsbFR5cGVzLCB1bmRlZmluZWQsIGN1cnJlbnROYW1lc3BhY2UpKSA6IHR5cGVMaW5rKHR5cGVOYW1lLCBhbGxUeXBlcywgY3VycmVudE5hbWVzcGFjZSk7XG59XG5cbi8qKlxuICogTG9hZHMgdGhlIFdlYiBBUEkgbGlua3MgYHR5cGVkb2MtcGx1Z2luLW1kbi1saW5rc2Agc2hpcHMsIGlmIGl0IGlzIGluc3RhbGxlZC4gV2l0aG91dCBpdCwgV2ViIEFQSSB0eXBlcyByZW5kZXJcbiAqIHVubGlua2VkLlxuICpcbiAqIEBwYXJhbSByb290RGlyZWN0b3J5IC0gVGhlIGZvbGRlciB3aG9zZSBgbm9kZV9tb2R1bGVzYCBob2xkcyB0aGUgcGFja2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRFeHRlcm5hbFR5cGVNYXBzKHJvb3REaXJlY3Rvcnk6IHN0cmluZyk6IHZvaWQge1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGFQYXRoID0gam9pbihyb290RGlyZWN0b3J5LCAnbm9kZV9tb2R1bGVzL3R5cGVkb2MtcGx1Z2luLW1kbi1saW5rcy9kYXRhL3dlYi1hcGkuanNvbicpO1xuICAgIG1vZHVsZVN0YXRlLndlYkFwaVR5cGVzID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoZGF0YVBhdGgsICd1dGYtOCcpKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zb2xlLndhcm4oYExvYWRlZCAke1N0cmluZyhPYmplY3Qua2V5cyhtb2R1bGVTdGF0ZS53ZWJBcGlUeXBlcykubGVuZ3RoKX0gV2ViIEFQSSB0eXBlIGxpbmtzYCk7XG4gIH0gY2F0Y2gge1xuICAgIG1vZHVsZVN0YXRlLndlYkFwaVR5cGVzID0ge307XG4gICAgY29uc29sZS53YXJuKCd0eXBlZG9jLXBsdWdpbi1tZG4tbGlua3MgZGF0YSBub3QgZm91bmQg4oCUIFdlYiBBUEkgbGlua3Mgd2lsbCBiZSB1bmF2YWlsYWJsZS4nKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnQgaW5saW5lIG1hcmtkb3duIHRvIEhUTUwgZm9yIHVzZSBpbiBjb21wb25lbnQgcHJvcHMgd2l0aCBzZXQ6aHRtbFxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQuXG4gKiBAcmV0dXJucyBUaGUgSFRNTC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtkb3duVG9IdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGVzY2FwZWQgPSB0ZXh0XG4gICAgLnJlcGxhY2VBbGwoJyYnLCAnJmFtcDsnKVxuICAgIC5yZXBsYWNlQWxsKCc8JywgJyZsdDsnKVxuICAgIC5yZXBsYWNlQWxsKCc+JywgJyZndDsnKTtcbiAgcmV0dXJuIHJlcGxhY2VSZWdFeHBNYXRjaGVzKGVzY2FwZWQsIC9cXFsoPzx0ZXh0PlteXFxdXSspXFxdXFwoKD88dXJsPlteKV0rKVxcKS9nLCAobWF0Y2gpID0+IHtcbiAgICBjb25zdCBsaW5rVGV4dCA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICd0ZXh0Jyk7XG4gICAgY29uc3QgdXJsID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ3VybCcpO1xuICAgIC8vIEEgcmVsYXRpdmUgVVJMIGhlcmUgaXMgYW4gaWxsdXN0cmF0aXZlIGV4YW1wbGUgcGF0aCBpbiBUU0RvYyAoZS5nLiBgW2Zvb10oZm9vLnBuZylgKSwgbm90IGFcbiAgICAvLyByZWFsIG5hdmlnYWJsZSBsaW5rIOKAlCByZW5kZXIgaXQgYXMgbGl0ZXJhbCBpbmxpbmUgY29kZSBzbyBpdCBuZWl0aGVyIDQwNHMgbm9yIGxvc2VzIG1lYW5pbmcuXG4gICAgcmV0dXJuIC9eKD86aHR0cHM/OlxcL1xcL3xcXC98I3xtYWlsdG86KS8udGVzdCh1cmwpID8gYDxhIGhyZWY9XCIke3VybH1cIj4ke2xpbmtUZXh0fTwvYT5gIDogYDxjb2RlPlske2xpbmtUZXh0fV0oJHt1cmx9KTwvY29kZT5gO1xuICB9KVxuICAgIC5yZXBsYWNlQWxsKC9gKD88Y29kZT5bXmBdKylgL2csICc8Y29kZT4kPGNvZGU+PC9jb2RlPicpXG4gICAgLnJlcGxhY2VBbGwoJ1xcbicsICc8YnIvPicpO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBocmVmIGZvciBhIG1lbWJlciwgcG9pbnRpbmcgdG8gdGhlIHBhcmVudCB0eXBlJ3MgcGFnZSBpZiBpbmhlcml0ZWRcbiAqXG4gKiBAcGFyYW0gbWVtYmVyU2x1Z1N0cmluZyAtIFRoZSBtZW1iZXIncyByb3V0ZSBzZWdtZW50LlxuICogQHBhcmFtIGluaGVyaXRlZEZyb20gLSBUaGUgbmFtZSBvZiB0aGUgdHlwZSB0aGUgbWVtYmVyIGlzIGluaGVyaXRlZCBmcm9tLCBvciBhbiBlbXB0eSBzdHJpbmcgZm9yIGFuIG93biBtZW1iZXIuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcGFyYW0gY3VycmVudE5hbWVzcGFjZSAtIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIHJlZmVyZW5jaW5nIHBhZ2UsIHByZWZlcnJlZCB3aGVuIHRoZSBuYW1lIGlzIGFtYmlndW91cy5cbiAqIEByZXR1cm5zIFRoZSBsaW5rLCBvciBhbiBlbXB0eSBzdHJpbmcgd2hlbiBubyBwYWdlIGRvY3VtZW50cyB0aGUgbWVtYmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVtYmVySHJlZihtZW1iZXJTbHVnU3RyaW5nOiBzdHJpbmcsIGluaGVyaXRlZEZyb206IHN0cmluZywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPiwgY3VycmVudE5hbWVzcGFjZT86IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghaW5oZXJpdGVkRnJvbSkge1xuICAgIC8vIE93biAobm9uLWluaGVyaXRlZCkgbWVtYmVyIOKAlCBgZ2VuZXJhdGVNZW1iZXJQYWdlc2AgYWx3YXlzIGVtaXRzIGl0cyBwYWdlIG9uIHRoaXMgc2FtZSBwYWdlLlxuICAgIHJldHVybiBgLi8ke21lbWJlclNsdWdTdHJpbmd9L2A7XG4gIH1cbiAgY29uc3QgcGFyZW50SW5mbyA9IGZpbmRUeXBlKGFsbFR5cGVzLCBpbmhlcml0ZWRGcm9tLCBjdXJyZW50TmFtZXNwYWNlKTtcbiAgaWYgKCFwYXJlbnRJbmZvIHx8ICFkb2VzTWVtYmVyUGFnZUV4aXN0KHBhcmVudEluZm8ubmFtZXNwYWNlLCBwYXJlbnRJbmZvLm5hbWUsIG1lbWJlclNsdWdTdHJpbmcpKSB7XG4gICAgLy8gVGhlIGRlY2xhcmluZyBwYXJlbnQgaGFzIG5vIGdlbmVyYXRlZCBwYWdlIGZvciB0aGlzIG1lbWJlciAoaXQgaW5oZXJpdGVkIHRoZSBtZW1iZXIgdG9vLCBvciBpc1xuICAgIC8vIHVuZG9jdW1lbnRlZCkuIFJldHVybiBubyBocmVmIHNvIHRoZSBjYWxsZXIgcmVuZGVycyBwbGFpbiB0ZXh0IGluc3RlYWQgb2YgYSBicm9rZW4gbGluay5cbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgY29uc3QgcGFyZW50TnNEaXJlY3RvcnkgPSBnZXROYW1lc3BhY2VEaXJlY3RvcnkocGFyZW50SW5mby5uYW1lc3BhY2UpO1xuICByZXR1cm4gYCR7Z2V0QmFzZVBhdGgoKX0vYXBpLyR7cGFyZW50TnNEaXJlY3Rvcnl9LyR7dG9UeXBlUm91dGVTZWdtZW50KHBhcmVudEluZm8ubmFtZXNwYWNlLCBwYXJlbnRJbmZvLm5hbWUpfS8ke21lbWJlclNsdWdTdHJpbmd9L2A7XG59XG5cbi8qKlxuICogUG9wdWxhdGUge0BsaW5rIGRvZXNNZW1iZXJQYWdlRXhpc3R9LiBNaXJyb3JzIGBnZW5lcmF0ZU1lbWJlclBhZ2VzYCdzIG93biBmaWx0ZXJpbmcgZXhhY3RseSAob25lIHBhZ2VcbiAqIHBlciBub24taW5oZXJpdGVkIHByb3BlcnR5LCBvbmUgcGVyIG5vbi1pbmhlcml0ZWQgbWV0aG9kIG92ZXJsb2FkIGtleSkuIE11c3QgcnVuIG9uY2UgYmVmb3JlIGFueVxuICogbGluayBpcyByZW5kZXJlZC5cbiAqXG4gKiBAcGFyYW0gdHlwZXMgLSBUaGUgZG9jdW1lbnRlZCB0eXBlcywga2V5ZWQgYnkgcXVhbGlmaWVkIGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJNZW1iZXJQYWdlcyh0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGdlbmVyYXRlZE1lbWJlclBhZ2VzLmNsZWFyKCk7XG4gIGZvciAoY29uc3QgaW5mbyBvZiB0eXBlcy52YWx1ZXMoKSkge1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgaW5mby5wcm9wZXJ0aWVzKSB7XG4gICAgICBpZiAoIXByb3BlcnR5LmluaGVyaXRlZEZyb20pIHtcbiAgICAgICAgZ2VuZXJhdGVkTWVtYmVyUGFnZXMuYWRkKGAke2luZm8ubmFtZXNwYWNlfSMke2luZm8ubmFtZX0jJHttZW1iZXJSb3V0ZVNlZ21lbnQocHJvcGVydHkubmFtZSl9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG92ZXJsb2FkS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIGluZm8ubWV0aG9kcykge1xuICAgICAgaWYgKCFtZXRob2QuaW5oZXJpdGVkRnJvbSkge1xuICAgICAgICBvdmVybG9hZEtleXMuYWRkKG1ldGhvZC5vdmVybG9hZEtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb3ZlcmxvYWRLZXkgb2Ygb3ZlcmxvYWRLZXlzKSB7XG4gICAgICBnZW5lcmF0ZWRNZW1iZXJQYWdlcy5hZGQoYCR7aW5mby5uYW1lc3BhY2V9IyR7aW5mby5uYW1lfSMke292ZXJsb2FkUm91dGVTZWdtZW50KG92ZXJsb2FkS2V5KX1gKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBGb3IgZXZlcnkgZG9jdW1lbnRlZCB0eXBlIGFzc2lnbiBCT1RIOlxuICogIC0gYSBsb3dlcmNhc2VkLCBudW1lcmljYWxseS1kaXNhbWJpZ3VhdGVkIEZJTEUgc2VnbWVudCAoc28gYFR5cGVBc3NlcnRlcmAgdnMgYHR5cGVBc3NlcnRlcmAsIHdoaWNoXG4gKiAgICBib3RoIGxvd2VyY2FzZSB0byBgdHlwZWFzc2VydGVyYCwgYmVjb21lIGB0eXBlYXNzZXJ0ZXJgIC8gYHR5cGVhc3NlcnRlci0yYCBvbiBkaXNrIGFuZCBuZXZlclxuICogICAgY29sbGlkZSBvbiBXaW5kb3dzJyBjYXNlLWluc2Vuc2l0aXZlIGZpbGVzeXN0ZW0pLCBhbmRcbiAqICAtIGEgY2FzZS1QUkVTRVJWRUQgUk9VVEUgc2VnbWVudCAoYFR5cGVBc3NlcnRlcmAgLyBgdHlwZUFzc2VydGVyYCkgdXNlZCBmb3IgdGhlIGV4cGxpY2l0IGBzbHVnOmBcbiAqICAgIGZyb250bWF0dGVyIGFuZCBldmVyeSBpbnRlcm5hbCBsaW5rLCBzbyB0aGUgVVJMcyBzdGF5IHByZXR0eSBhbmQgbmF0dXJhbGx5IGRpc3RpbmN0LlxuICogVGhlIHJvdXRlIGRlY291cGxlcyBmcm9tIHRoZSBmaWxlIHBhdGggdmlhIHRoZSBgc2x1ZzpgIGZyb250bWF0dGVyLCBzbyBubyBgLTJgIHN1ZmZpeCBsZWFrcyBpbnRvXG4gKiBVUkxzLiBBbHNvIHdhcm5zIGFib3V0IG1lbWJlci1zbHVnIGNvbGxpc2lvbnMgd2l0aGluIGEgdHlwZS4gTXVzdCBydW4gb25jZSBiZWZvcmUgYW55IHBhZ2UvbGluay5cbiAqXG4gKiBAcGFyYW0gdHlwZXMgLSBUaGUgZG9jdW1lbnRlZCB0eXBlcywga2V5ZWQgYnkgcXVhbGlmaWVkIGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJSb3V0ZVNlZ21lbnRzKHR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgdHlwZUZpbGVTZWdtZW50cy5jbGVhcigpO1xuICB0eXBlUm91dGVTZWdtZW50cy5jbGVhcigpO1xuICBjb25zdCBieU5hbWVzcGFjZSA9IG5ldyBNYXA8c3RyaW5nLCBUeXBlSW5mb1tdPigpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItZ3JvdXAtYnkgLS0gYE1hcC5ncm91cEJ5YCBpcyBFUzIwMjQsIGFuZCB0aGUgc2hhcmVkIGB0c2NvbmZpZy5qc29uYCB0eXBlcyBvbmx5IEVTMjAyMi5cbiAgZm9yIChjb25zdCBpbmZvIG9mIHR5cGVzLnZhbHVlcygpKSB7XG4gICAgY29uc3QgbGlzdCA9IGJ5TmFtZXNwYWNlLmdldChpbmZvLm5hbWVzcGFjZSkgPz8gW107XG4gICAgbGlzdC5wdXNoKGluZm8pO1xuICAgIGJ5TmFtZXNwYWNlLnNldChpbmZvLm5hbWVzcGFjZSwgbGlzdCk7XG4gIH1cbiAgZm9yIChjb25zdCBbbmFtZXNwYWNlLCBpbmZvc10gb2YgYnlOYW1lc3BhY2UpIHtcbiAgICBjb25zdCB1c2VkRmlsZVNlZ21lbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgdXNlZFJvdXRlU2VnbWVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBzb3J0ZWQgPSBbLi4uaW5mb3NdLnNvcnQoKGFscGhhLCBicmF2bykgPT4gYWxwaGEubmFtZS5sb2NhbGVDb21wYXJlKGJyYXZvLm5hbWUpKTtcbiAgICBmb3IgKGNvbnN0IGluZm8gb2Ygc29ydGVkKSB7XG4gICAgICB0eXBlRmlsZVNlZ21lbnRzLnNldChgJHtuYW1lc3BhY2V9IyR7aW5mby5uYW1lfWAsIGRpc2FtYmlndWF0ZSh0b1JvdXRlU2VnbWVudChpbmZvLm5hbWUpLCB1c2VkRmlsZVNlZ21lbnRzLCAoc2VnbWVudCkgPT4gc2VnbWVudCkpO1xuXG4gICAgICBjb25zdCByb3V0ZUJhc2UgPSB0b1JvdXRlU2VnbWVudFByZXNlcnZlQ2FzZShpbmZvLm5hbWUpO1xuICAgICAgLy8gRGlzYW1iaWd1YXRlIFJPVVRFUyBjYXNlLUlOU0VOU0lUSVZFTFk6IHRoZSBzbHVnIGJlY29tZXMgQXN0cm8ncyBvbi1kaXNrIG91dHB1dCBwYXRoLCBzb1xuICAgICAgLy8gYFR5cGVBc3NlcnRlcmAgYW5kIGB0eXBlQXNzZXJ0ZXJgIChzYW1lIG5hbWUgbW9kdWxvIGNhc2UpIHdvdWxkIGNvbGxpZGUgd2hlbiB0aGUgc2l0ZSBpcyBidWlsdFxuICAgICAgLy8gb24gYSBjYXNlLWluc2Vuc2l0aXZlIGZpbGVzeXN0ZW0gKFdpbmRvd3MvbWFjT1MpLCBzaWxlbnRseSBvdmVyd3JpdGluZyBvbmUgcGFnZSBzbyBldmVyeSBsaW5rXG4gICAgICAvLyB0byBpdCA0MDRzLiBDb21wYXJpbmcgbG93ZXJjYXNlZCBrZXlzIGZvcmNlcyB0aGUgc2Vjb25kIG9jY3VycmVuY2UgdG8gdGFrZSBhIGAtMmAgc3VmZml4LlxuICAgICAgY29uc3Qgcm91dGVTZWdtZW50ID0gZGlzYW1iaWd1YXRlKHJvdXRlQmFzZSwgdXNlZFJvdXRlU2VnbWVudHMsIChzZWdtZW50KSA9PiBzZWdtZW50LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgdHlwZVJvdXRlU2VnbWVudHMuc2V0KGAke25hbWVzcGFjZX0jJHtpbmZvLm5hbWV9YCwgcm91dGVTZWdtZW50KTtcbiAgICAgIGlmIChyb3V0ZVNlZ21lbnQgIT09IHJvdXRlQmFzZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYERpc2FtYmlndWF0ZWQgUk9VVEUgZm9yIFwiJHtuYW1lc3BhY2V9IyR7aW5mby5uYW1lfVwiOiBcIiR7cm91dGVCYXNlfVwiIC0+IFwiJHtyb3V0ZVNlZ21lbnR9XCIgKHNsdWcgY29sbGlzaW9uKS5gKTtcbiAgICAgIH1cbiAgICAgIHdhcm5NZW1iZXJTbHVnQ29sbGlzaW9ucyhpbmZvLCBuYW1lc3BhY2UpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlciBhbiBgQGV4YW1wbGVgIGJsb2NrIGFzIE1EWC4gSWYgdGhlIGV4YW1wbGUgYWxyZWFkeSBjb250YWlucyBhIGZlbmNlZCBjb2RlIGJsb2NrLCBpdCBpc1xuICogbm9ybWFsaXplZCB0aHJvdWdoIHtAbGluayByZW5kZXJNZHhQcm9zZX0gKGNvZGUgcHJlc2VydmVkIHJhdywgc3Vycm91bmRpbmcgcHJvc2UgZXNjYXBlZCk7XG4gKiBvdGhlcndpc2UgdGhlIHJhdyBleGFtcGxlIHRleHQgaXMgd3JhcHBlZCBpbiBhIGB0c2AgY29kZSBmZW5jZSBzbyBpdCBpcyBlbWl0dGVkIGxpdGVyYWxseS5cbiAqXG4gKiBAcGFyYW0gZXhhbXBsZSAtIFRoZSBgQGV4YW1wbGVgIHRleHQuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcGFyYW0gc2VsZk5hbWVzcGFjZSAtIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIHBhZ2UgYmVpbmcgcmVuZGVyZWQsIHByZWZlcnJlZCB3aGVuIGEgbmFtZSBpcyBhbWJpZ3VvdXMuXG4gKiBAcmV0dXJucyBUaGUgTURYLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyRXhhbXBsZU1keChleGFtcGxlOiBzdHJpbmcsIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4sIHNlbGZOYW1lc3BhY2U/OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gLyg/Ol58XFxuKVxccyooPzpgYGB8fn5+KS8udGVzdChleGFtcGxlKSA/IHJlbmRlck1keFByb3NlKGV4YW1wbGUsIGFsbFR5cGVzLCBzZWxmTmFtZXNwYWNlKSA6IGBcXGBcXGBcXGB0c1xcbiR7ZXhhbXBsZX1cXG5cXGBcXGBcXGBgO1xufVxuXG4vKipcbiAqIFJlbmRlciBtYXJrZG93biBibG9jayB0ZXh0IChhIGRlc2NyaXB0aW9uLCByZW1hcmtzLCBvciBtb2R1bGUgb3ZlcnZpZXcpIGFzIE1EWC1zYWZlIG1hcmtkb3duLlxuICogRmVuY2VkIGNvZGUgYmxvY2tzIGFyZSByZS1lbWl0dGVkIHZlcmJhdGltIChzdXJyb3VuZGVkIGJ5IGJsYW5rIGxpbmVzLCB3aXRoIGEgbGFuZ3VhZ2UpOyBwcm9zZVxuICogc2VnbWVudHMgaGF2ZSB0aGVpciBpbmxpbmUgbGluayB0YWdzIHJlc29sdmVkIGFuZCB0aGVpciBNRFgtdW5zYWZlIGNoYXJhY3RlcnMgZXNjYXBlZC5cbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0LlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICogQHBhcmFtIHNlbGZOYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIG9mIHRoZSBwYWdlIGJlaW5nIHJlbmRlcmVkLCBwcmVmZXJyZWQgd2hlbiBhIG5hbWUgaXMgYW1iaWd1b3VzLlxuICogQHJldHVybnMgVGhlIE1EWC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlck1keFByb3NlKHRleHQ6IHN0cmluZywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPiwgc2VsZk5hbWVzcGFjZT86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBzZWcgb2Ygc2VnbWVudE1hcmtkb3duKHRleHQpKSB7XG4gICAgaWYgKHNlZy50eXBlID09PSAnY29kZScpIHtcbiAgICAgIG91dC5wdXNoKCcnLCBgXFxgXFxgXFxgJHtzZWcubGFuZyB8fCAndHMnfWAsIHNlZy50ZXh0LCAnYGBgJywgJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQucHVzaChlc2NhcGVNZHhQcm9zZShyZXNvbHZlTGlua3Moc2VnLnRleHQsIGFsbFR5cGVzLCBzZWxmTmFtZXNwYWNlKSkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0LmpvaW4oJ1xcbicpLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpLnRyaW0oKTtcbn1cblxuLyoqXG4gKiBSZW5kZXIgYSB0eXBlIHN0cmluZyB3aXRoIGNsaWNrYWJsZSBsaW5rcyBmb3Iga25vd24gdHlwZXNcbiAqXG4gKiBAcGFyYW0gdHlwZVRleHQgLSBUaGUgdHlwZSB0ZXh0LlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICogQHBhcmFtIHNlbGZUeXBlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0eXBlIHRoZSBwYWdlIGRvY3VtZW50cywgd2hpY2ggYHRoaXNgIGxpbmtzIHRvLlxuICogQHBhcmFtIHNlbGZOYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIG9mIHRoZSBwYWdlIGJlaW5nIHJlbmRlcmVkLCBwcmVmZXJyZWQgd2hlbiBhIG5hbWUgaXMgYW1iaWd1b3VzLlxuICogQHJldHVybnMgVGhlIHR5cGUgdGV4dCB3aXRoIG1hcmtkb3duIGxpbmtzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyVHlwZVdpdGhMaW5rcyh0eXBlVGV4dDogc3RyaW5nLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LCBzZWxmVHlwZU5hbWU/OiBzdHJpbmcsIHNlbGZOYW1lc3BhY2U/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBQcmUtcGFzczogbGluayBPYmplY3QubWV0aG9kIHBhdHRlcm5zIHRvIE1ETiBiZWZvcmUgd29yZC1ieS13b3JkIGxpbmtpbmdcbiAgY29uc3QgTUROX09CSkVDVF9CQVNFID0gJ2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdCc7XG4gIGNvbnN0IHdpdGhPYmplY3RNZXRob2RzID0gcmVwbGFjZVJlZ0V4cE1hdGNoZXModHlwZVRleHQsIC9cXGJPYmplY3RcXC4oPzxtZXRob2Q+W2EtekEtWl1bYS16QS1aMC05XSopXFxiL2csIChtYXRjaCkgPT4ge1xuICAgIGNvbnN0IG1ldGhvZCA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdtZXRob2QnKTtcbiAgICByZXR1cm4gYFtPYmplY3RdKCR7TUROX09CSkVDVF9CQVNFfSkuWyR7bWV0aG9kfV0oJHtNRE5fT0JKRUNUX0JBU0V9LyR7bWV0aG9kfSlgO1xuICB9KTtcbiAgLy8gTWFpbiBwYXNzOiBsaW5rIGluZGl2aWR1YWwgdHlwZSBuYW1lcywgc2tpcHBpbmcgdGV4dCBhbHJlYWR5IGluc2lkZSBtYXJrZG93biBsaW5rc1xuICByZXR1cm4gcmVwbGFjZVJlZ0V4cE1hdGNoZXMoXG4gICAgd2l0aE9iamVjdE1ldGhvZHMsXG4gICAgL1xcW1teXFxdXStcXF1cXChbXildK1xcKXxcXGIoPzx0eXBlTmFtZT5bYS16QS1aXVthLXpBLVowLTldKilcXGIvZyxcbiAgICAobWF0Y2gpID0+IHtcbiAgICAgIGNvbnN0IHR5cGVOYW1lID0gZ2V0T3B0aW9uYWxOYW1lZEdyb3VwKG1hdGNoLCAndHlwZU5hbWUnKTtcbiAgICAgIGlmICh0eXBlTmFtZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbWF0Y2hbMF07XG4gICAgICB9XG4gICAgICAvLyBMaW5rIGB0aGlzYCByZXR1cm4gdHlwZSB0byB0aGUgY3VycmVudCB0eXBlJ3MgcGFnZVxuICAgICAgaWYgKHR5cGVOYW1lID09PSAndGhpcycgJiYgc2VsZlR5cGVOYW1lKSB7XG4gICAgICAgIGNvbnN0IHNlbGZJbmZvID0gZmluZFR5cGUoYWxsVHlwZXMsIHNlbGZUeXBlTmFtZSwgc2VsZk5hbWVzcGFjZSk7XG4gICAgICAgIGlmIChzZWxmSW5mbykge1xuICAgICAgICAgIHJldHVybiBgWyR7dHlwZU5hbWV9XSgke3R5cGVIcmVmKHNlbGZJbmZvKX0pYDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTa2lwIGdlbmVyaWMgdHlwZSBwYXJhbWV0ZXJzXG4gICAgICBpZiAoR0VORVJJQ19UWVBFX1BBUkFNUy5oYXModHlwZU5hbWUpKSB7XG4gICAgICAgIHJldHVybiB0eXBlTmFtZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgb3VyIG93biB0eXBlcyBmaXJzdFxuICAgICAgY29uc3QgaW5mbyA9IGZpbmRUeXBlKGFsbFR5cGVzLCB0eXBlTmFtZSwgc2VsZk5hbWVzcGFjZSk7XG4gICAgICBpZiAoaW5mbykge1xuICAgICAgICByZXR1cm4gYFske3R5cGVOYW1lfV0oJHt0eXBlSHJlZihpbmZvKX0pYDtcbiAgICAgIH1cblxuICAgICAgLy8gQSB0eXBlIGFub3RoZXIgZG9jdW1lbnRlZCBwYWNrYWdlIGRlY2xhcmVzLCBvciBvbmUgdGhlIHNpdGUgbWFwcyBpdHNlbGZcbiAgICAgIGNvbnN0IGV4dGVybmFsVXJsID0gcmVzb2x2ZUV4dGVybmFsVHlwZVVybCh0eXBlTmFtZSk7XG4gICAgICBpZiAoZXh0ZXJuYWxVcmwpIHtcbiAgICAgICAgcmV0dXJuIGBbJHt0eXBlTmFtZX1dKCR7ZXh0ZXJuYWxVcmx9KWA7XG4gICAgICB9XG5cbiAgICAgIC8vIFR5cGVTY3JpcHQgdXRpbGl0eSB0eXBlc1xuICAgICAgY29uc3QgdHNVcmwgPSByZXNvbHZlVHNVdGlsaXR5VXJsKHR5cGVOYW1lKTtcbiAgICAgIGlmICh0c1VybCkge1xuICAgICAgICByZXR1cm4gYFske3R5cGVOYW1lfV0oJHt0c1VybH0pYDtcbiAgICAgIH1cblxuICAgICAgLy8gSlMgZ2xvYmFsIHR5cGVzIChBcnJheSwgUHJvbWlzZSwgTWFwLCBldGMuKVxuICAgICAgY29uc3QgZ2xvYmFsVXJsID0gT2JqZWN0Lmhhc093bihUU19HTE9CQUxfVFlQRVMsIHR5cGVOYW1lKSA/IFRTX0dMT0JBTF9UWVBFU1t0eXBlTmFtZV0gOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoZ2xvYmFsVXJsKSB7XG4gICAgICAgIHJldHVybiBgWyR7dHlwZU5hbWV9XSgke2dsb2JhbFVybH0pYDtcbiAgICAgIH1cblxuICAgICAgLy8gV2ViIEFQSSAvIE1ETiB0eXBlc1xuICAgICAgY29uc3QgbWRuVXJsID0gcmVzb2x2ZVdlYkFwaVVybCh0eXBlTmFtZSk7XG4gICAgICBpZiAobWRuVXJsKSB7XG4gICAgICAgIHJldHVybiBgWyR7dHlwZU5hbWV9XSgke21kblVybH0pYDtcbiAgICAgIH1cblxuICAgICAgLy8gVHlwZVNjcmlwdCBwcmltaXRpdmUgdHlwZXNcbiAgICAgIGNvbnN0IHByaW1pdGl2ZVVybCA9IE9iamVjdC5oYXNPd24oVFNfUFJJTUlUSVZFX1RZUEVTLCB0eXBlTmFtZSkgPyBUU19QUklNSVRJVkVfVFlQRVNbdHlwZU5hbWVdIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHByaW1pdGl2ZVVybCA/IGBbJHt0eXBlTmFtZX1dKCR7cHJpbWl0aXZlVXJsfSlgIDogdHlwZU5hbWU7XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSB0eXBlIG5vIHBhZ2Ugb2YgdGhpcyBzaXRlIGRvY3VtZW50cyB0byB0aGUgcGFnZSB0aGF0IGRvZXM6IGFub3RoZXIgZG9jdW1lbnRlZCBwYWNrYWdlJ3Mgc2l0ZSwgb3IgYW5cbiAqIGVudHJ5IG9mIHRoZSBzaXRlJ3Mgb3duIGBleHRlcm5hbFR5cGVMaW5rc2Agc2V0dGluZy5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEByZXR1cm5zIFRoZSBVUkwsIG9yIGB1bmRlZmluZWRgIHdoZW4gbmVpdGhlciBrbm93cyB0aGUgdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVFeHRlcm5hbFR5cGVVcmwobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdldFBhY2thZ2VUeXBlVXJsKG5hbWUpID8/IGdldEFwaURvY1NldHRpbmdzKCkuZXh0ZXJuYWxUeXBlTGlua3MuZ2V0KG5hbWUpO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYEBsaW5rYCB0YWdzLCB3aXRoIG9yIHdpdGhvdXQgYSBgfCBkaXNwbGF5IHRleHRgIHBhcnQsIGluIGRlc2NyaXB0aW9uIHRleHRcbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0LlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICogQHBhcmFtIHNlbGZOYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIG9mIHRoZSBwYWdlIGJlaW5nIHJlbmRlcmVkLCBwcmVmZXJyZWQgd2hlbiBhIG5hbWUgaXMgYW1iaWd1b3VzLlxuICogQHJldHVybnMgVGhlIHRleHQgd2l0aCBtYXJrZG93biBsaW5rcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVMaW5rcyh0ZXh0OiBzdHJpbmcsIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4sIHNlbGZOYW1lc3BhY2U/OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcmVwbGFjZVJlZ0V4cE1hdGNoZXModGV4dCwgL1xce0BsaW5rXFxzKyg/PHRhcmdldD5bXnx9XSs/KSg/OlxccypcXHxcXHMqKD88ZGlzcGxheT5bXn1dKz8pKT9cXH0vZywgKG1hdGNoKSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ3RhcmdldCcpLnRyaW0oKTtcbiAgICBjb25zdCBkaXNwbGF5ID0gKGdldE9wdGlvbmFsTmFtZWRHcm91cChtYXRjaCwgJ2Rpc3BsYXknKT8udHJpbSgpID8/IHRhcmdldCkucmVwbGFjZUFsbCgvXFxcXCg/PVs8Pnt9XSkvZywgJycpO1xuXG4gICAgLy8gSGFuZGxlIFR5cGUubWVtYmVyIHJlZmVyZW5jZXMgKGUuZy4sIFBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKVxuICAgIGNvbnN0IGRvdE1hdGNoID0gL14oPzx0eXBlTmFtZT5bQS1aYS16XVxcdyopXFwuKD88bWVtYmVyTmFtZT5cXHcrKSQvLmV4ZWModGFyZ2V0KTtcbiAgICBpZiAoZG90TWF0Y2gpIHtcbiAgICAgIGNvbnN0IHR5cGVOYW1lID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChkb3RNYXRjaCwgJ3R5cGVOYW1lJyk7XG4gICAgICBjb25zdCBtZW1iZXJOYW1lID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChkb3RNYXRjaCwgJ21lbWJlck5hbWUnKTtcbiAgICAgIGNvbnN0IHR5cGVJbmZvID0gZmluZFR5cGUoYWxsVHlwZXMsIHR5cGVOYW1lLCBzZWxmTmFtZXNwYWNlKTtcbiAgICAgIGlmICh0eXBlSW5mbyAmJiBkb2VzTWVtYmVyUGFnZUV4aXN0KHR5cGVJbmZvLm5hbWVzcGFjZSwgdHlwZUluZm8ubmFtZSwgbWVtYmVyUm91dGVTZWdtZW50KG1lbWJlck5hbWUpKSkge1xuICAgICAgICBjb25zdCB0YXJnZXROc0RpcmVjdG9yeSA9IGdldE5hbWVzcGFjZURpcmVjdG9yeSh0eXBlSW5mby5uYW1lc3BhY2UpO1xuICAgICAgICByZXR1cm4gYFske2Rpc3BsYXl9XSgke2dldEJhc2VQYXRoKCl9L2FwaS8ke3RhcmdldE5zRGlyZWN0b3J5fS8ke3RvVHlwZVJvdXRlU2VnbWVudCh0eXBlSW5mby5uYW1lc3BhY2UsIHR5cGVJbmZvLm5hbWUpfS8ke21lbWJlclJvdXRlU2VnbWVudChtZW1iZXJOYW1lKX0vKWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNpbXBsZSB0eXBlIHJlZmVyZW5jZXMg4oCUIGlmIGRpc3BsYXkgY29udGFpbnMgZ2VuZXJpYyBhcmdzLCBsaW5rIGVhY2ggdHlwZSBpbmRpdmlkdWFsbHlcbiAgICBjb25zdCBpbmZvID0gZmluZFR5cGUoYWxsVHlwZXMsIHRhcmdldCwgc2VsZk5hbWVzcGFjZSk7XG4gICAgaWYgKGluZm8pIHtcbiAgICAgIHJldHVybiBkaXNwbGF5ICE9PSB0YXJnZXQgJiYgZGlzcGxheS5pbmNsdWRlcygnPCcpID8gcmVuZGVyVHlwZVdpdGhMaW5rcyhkaXNwbGF5LCBhbGxUeXBlcywgdW5kZWZpbmVkLCBzZWxmTmFtZXNwYWNlKSA6IGBbJHtkaXNwbGF5fV0oJHt0eXBlSHJlZihpbmZvKX0pYDtcbiAgICB9XG5cbiAgICBjb25zdCBleHRlcm5hbFVybCA9IHJlc29sdmVFeHRlcm5hbFR5cGVVcmwodGFyZ2V0KTtcbiAgICByZXR1cm4gZXh0ZXJuYWxVcmwgPyBgWyR7ZGlzcGxheX1dKCR7ZXh0ZXJuYWxVcmx9KWAgOiBgXFxgJHtkaXNwbGF5fVxcYGA7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGEgVHlwZVNjcmlwdCB1dGlsaXR5IHR5cGUgdG8gaXRzIGhhbmRib29rIGVudHJ5LlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHJldHVybnMgVGhlIGhhbmRib29rIFVSTCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBpcyBub3QgYSB1dGlsaXR5IHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVHNVdGlsaXR5VXJsKG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGhhc2ggPSBUU19VVElMSVRZX1RZUEVTLmdldChuYW1lKTtcbiAgaWYgKGhhc2gpIHtcbiAgICBpZiAoWydJdGVyYWJsZSddLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICByZXR1cm4gYGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL2l0ZXJhdG9ycy1hbmQtZ2VuZXJhdG9ycy5odG1sIyR7aGFzaH1gO1xuICAgIH1cbiAgICBjb25zdCBoYW5kYm9va1BhZ2UgPSBbJ0NhcGl0YWxpemUnLCAnTG93ZXJjYXNlJywgJ1VuY2FwaXRhbGl6ZScsICdVcHBlcmNhc2UnXS5pbmNsdWRlcyhuYW1lKSA/ICcyL3RlbXBsYXRlLWxpdGVyYWwtdHlwZXMnIDogJ3V0aWxpdHktdHlwZXMnOyAvLyBDc3BlbGw6ZGlzYWJsZS1saW5lXG4gICAgcmV0dXJuIGBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay8ke2hhbmRib29rUGFnZX0uaHRtbCMke2hhc2h9YDtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGEgV2ViIEFQSSB0eXBlIHRvIGl0cyBNRE4gcGFnZS5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEByZXR1cm5zIFRoZSBNRE4gVVJMLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGlzIG5vdCBhIGtub3duIFdlYiBBUEkgdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXZWJBcGlVcmwobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFPYmplY3QuaGFzT3duKG1vZHVsZVN0YXRlLndlYkFwaVR5cGVzLCBuYW1lKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgZW50cnkgPSBtb2R1bGVTdGF0ZS53ZWJBcGlUeXBlc1tuYW1lXTtcbiAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZW50cnk7XG4gIH1cbiAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ29iamVjdCcgJiYgZW50cnkgIT09IG51bGwgJiYgJ3VybCcgaW4gZW50cnkpIHtcbiAgICBjb25zdCB0eXBlZEVudHJ5ID0gZW50cnkgYXMgV2ViQXBpRW50cnk7XG4gICAgcmV0dXJuIHR5cGVkRW50cnkudXJsO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgbG93ZXJjYXNlZCBPTi1ESVNLIHNlZ21lbnQgZm9yIGEgdHlwZSAoZmlsZSBwYXRoICsgY29tcG9uZW50LWltcG9ydCByZWxhdGl2ZSBwYXRoKS5cbiAqXG4gKiBAcGFyYW0gbmFtZXNwYWNlIC0gVGhlIHR5cGUncyBuYW1lc3BhY2UuXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEByZXR1cm5zIFRoZSBzZWdtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9UeXBlRmlsZVNlZ21lbnQobmFtZXNwYWNlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlRmlsZVNlZ21lbnRzLmdldChgJHtuYW1lc3BhY2V9IyR7bmFtZX1gKSA/PyB0b1JvdXRlU2VnbWVudChuYW1lKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBjYXNlLXByZXNlcnZlZCBVUkwvUk9VVEUgc2VnbWVudCBmb3IgYSB0eXBlIChzbHVnIGZyb250bWF0dGVyICsgaW50ZXJuYWwgbGlua3MpLlxuICpcbiAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUaGUgdHlwZSdzIG5hbWVzcGFjZS5cbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHJldHVybnMgVGhlIHNlZ21lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1R5cGVSb3V0ZVNlZ21lbnQobmFtZXNwYWNlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlUm91dGVTZWdtZW50cy5nZXQoYCR7bmFtZXNwYWNlfSMke25hbWV9YCkgPz8gdG9Sb3V0ZVNlZ21lbnRQcmVzZXJ2ZUNhc2UobmFtZSk7XG59XG5cbi8qKlxuICogQWJzb2x1dGUgbGluayB0byBhIHR5cGUncyBvdmVydmlldyBwYWdlLlxuICpcbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEByZXR1cm5zIFRoZSBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZUhyZWYoaW5mbzogVHlwZUluZm8pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7Z2V0QmFzZVBhdGgoKX0vYXBpLyR7Z2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKX0vJHt0b1R5cGVSb3V0ZVNlZ21lbnQoaW5mby5uYW1lc3BhY2UsIGluZm8ubmFtZSl9L2A7XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIGFic29sdXRlIGxpbmsgdG8gYSB0eXBlIHBhZ2VcbiAqXG4gKiBAcGFyYW0gdHlwZU5hbWUgLSBUaGUgdHlwZSdzIG5hbWUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcGFyYW0gY3VycmVudE5hbWVzcGFjZSAtIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIHJlZmVyZW5jaW5nIHBhZ2UsIHByZWZlcnJlZCB3aGVuIHRoZSBuYW1lIGlzIGFtYmlndW91cy5cbiAqIEByZXR1cm5zIEEgbWFya2Rvd24gbGluaywgb3IgaW5saW5lIGNvZGUgd2hlbiB0aGUgdHlwZSBpcyBub3QgZG9jdW1lbnRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGVMaW5rKHR5cGVOYW1lOiBzdHJpbmcsIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4sIGN1cnJlbnROYW1lc3BhY2U/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjbGVhbk5hbWUgPSB0eXBlTmFtZS5yZXBsYWNlKC88Lio+JC8sICcnKS50cmltKCk7XG4gIGNvbnN0IGluZm8gPSBmaW5kVHlwZShhbGxUeXBlcywgY2xlYW5OYW1lLCBjdXJyZW50TmFtZXNwYWNlKTtcbiAgcmV0dXJuIGluZm8gPyBgWyR7ZXNjYXBlTWR4QW5nbGVCcmFja2V0cyh0eXBlTmFtZSl9XSgke3R5cGVIcmVmKGluZm8pfSlgIDogYFxcYCR7dHlwZU5hbWV9XFxgYDtcbn1cblxuZnVuY3Rpb24gZGlzYW1iaWd1YXRlKGJhc2U6IHN0cmluZywgdXNlZDogU2V0PHN0cmluZz4sIGtleU9mOiAoc2VnbWVudDogc3RyaW5nKSA9PiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgc2VnbWVudCA9IGJhc2U7XG4gIGNvbnN0IEZJUlNUX0RJU0FNQklHVUFUSU9OX1NVRkZJWCA9IDI7XG4gIGxldCBzdWZmaXggPSBGSVJTVF9ESVNBTUJJR1VBVElPTl9TVUZGSVg7XG4gIHdoaWxlICh1c2VkLmhhcyhrZXlPZihzZWdtZW50KSkpIHtcbiAgICBzZWdtZW50ID0gYCR7YmFzZX0tJHtTdHJpbmcoc3VmZml4KX1gO1xuICAgIHN1ZmZpeCsrO1xuICB9XG4gIHVzZWQuYWRkKGtleU9mKHNlZ21lbnQpKTtcbiAgcmV0dXJuIHNlZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIGdldEJhc2VQYXRoKCk6IHN0cmluZyB7XG4gIHJldHVybiBnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRoO1xufVxuXG4vKipcbiAqIFdhcm4gd2hlbiB0d28gZGlzdGluY3QgbWVtYmVycyBvZiBhIHR5cGUgcHJvZHVjZSB0aGUgc2FtZSBtZW1iZXIgc2x1ZyAoVVJML2ZpbGUgc2VnbWVudCkuIFRoZVxuICogb3B0aW9uYWwtYD9gIHN1ZmZpeCBpcyBzdHJpcHBlZCBmaXJzdCwgc28gYSBwcm9wZXJ0eSBhcHBlYXJpbmcgYXMgYm90aCByZXF1aXJlZCBhbmQgb3B0aW9uYWwgaXMgbm90XG4gKiBhIGZhbHNlIHBvc2l0aXZlLlxuICpcbiAqIEBwYXJhbSBpbmZvIC0gVGhlIHR5cGUuXG4gKiBAcGFyYW0gbmFtZXNwYWNlIC0gVGhlIHR5cGUncyBuYW1lc3BhY2UuXG4gKi9cbmZ1bmN0aW9uIHdhcm5NZW1iZXJTbHVnQ29sbGlzaW9ucyhpbmZvOiBUeXBlSW5mbywgbmFtZXNwYWNlOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGZ1bmN0aW9uIGNoZWNrKHNsdWc6IHN0cmluZywgb3JpZ2luYWw6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBvcmlnaW5hbC5yZXBsYWNlKC9cXD8kLywgJycpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gc2Vlbi5nZXQoc2x1Zyk7XG4gICAgaWYgKGV4aXN0aW5nICE9PSB1bmRlZmluZWQgJiYgZXhpc3RpbmcgIT09IG5vcm1hbGl6ZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgTWVtYmVyIHJvdXRlIGNvbGxpc2lvbiBpbiBcIiR7bmFtZXNwYWNlfSMke2luZm8ubmFtZX1cIjogXCIke2V4aXN0aW5nfVwiIGFuZCBcIiR7bm9ybWFsaXplZH1cIiBib3RoIG1hcCB0byBcIi8ke3NsdWd9L1wiLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZWVuLnNldChzbHVnLCBub3JtYWxpemVkKTtcbiAgfVxuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIGluZm8ucHJvcGVydGllcykge1xuICAgIGNoZWNrKG1lbWJlclNsdWcocHJvcGVydHkubmFtZSksIHByb3BlcnR5Lm5hbWUpO1xuICB9XG4gIGZvciAoY29uc3QgbWV0aG9kIG9mIGluZm8ubWV0aG9kcykge1xuICAgIGNoZWNrKG92ZXJsb2FkU2x1ZyhtZXRob2Qub3ZlcmxvYWRLZXkpLCBtZXRob2Qub3ZlcmxvYWRLZXkpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU9BLHFCQUdPO0FBQ1AscUJBQTZCO0FBQzdCLHVCQUFxQjtBQU9yQiwrQkFLTztBQUNQLG1DQUFrQztBQUNsQyxvQ0FHTztBQUNQLDhCQUFrQztBQUNsQyxnQ0FVTztBQVlQLE1BQU0sY0FBMkI7QUFBQSxFQUMvQixhQUFhLENBQUM7QUFDaEI7QUFJQSxNQUFNLG1CQUFtQixvQkFBSSxJ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
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.cts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Type-link rendering: turns type text and inline link tags into markdown links to generated pages
|
|
6
|
+
* or external references (TypeScript handbook, MDN Web API, JS globals).
|
|
7
|
+
*/
|
|
8
|
+
import type { TypeInfo } from './api-doc-types.cjs';
|
|
9
|
+
/**
|
|
10
|
+
* Whether a member page will be generated for `routeSegment` on the given type.
|
|
11
|
+
*
|
|
12
|
+
* @param namespace - The type's namespace.
|
|
13
|
+
* @param typeName - The type's name.
|
|
14
|
+
* @param routeSegment - The member's route segment.
|
|
15
|
+
* @returns Whether the page is generated.
|
|
16
|
+
*/
|
|
17
|
+
export declare function doesMemberPageExist(namespace: string, typeName: string, routeSegment: string): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Resolve a bare type name to a documented `TypeInfo`.
|
|
20
|
+
*
|
|
21
|
+
* The model map is keyed by a qualified `${namespace}#${name}` identity, because a package
|
|
22
|
+
* can export the same simple name from different modules. Resolution is best-effort:
|
|
23
|
+
* 1. Prefer a type in `currentNamespace` (the referencing page's module).
|
|
24
|
+
* 2. Otherwise, if exactly one type across all modules has that bare name, use it.
|
|
25
|
+
* 3. If the bare name is ambiguous (multiple modules), give up (caller renders plain code).
|
|
26
|
+
*
|
|
27
|
+
* @param allTypes - Every documented type, keyed by `${namespace}#${name}`.
|
|
28
|
+
* @param name - The type's name.
|
|
29
|
+
* @param currentNamespace - The namespace of the referencing page, preferred when the name is ambiguous.
|
|
30
|
+
* @returns The type, or `undefined` when no type or more than one has that name.
|
|
31
|
+
*/
|
|
32
|
+
export declare function findType(allTypes: Map<string, TypeInfo>, name: string, currentNamespace?: string): TypeInfo | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* Link a base type expression for the "Extends:" line.
|
|
35
|
+
* Simple type references (identifier + optional generics) use renderTypeWithLinks
|
|
36
|
+
* so each type argument gets its own link.
|
|
37
|
+
* Complex expressions (object types, intersections, etc.) fall back to typeLink
|
|
38
|
+
* to avoid MDX parsing issues with `{`, `}`, `|` etc.
|
|
39
|
+
*
|
|
40
|
+
* @param typeName - The type's name.
|
|
41
|
+
* @param allTypes - Every documented type, keyed by `${namespace}#${name}`.
|
|
42
|
+
* @param currentNamespace - The namespace of the referencing page, preferred when the name is ambiguous.
|
|
43
|
+
* @returns The linked type.
|
|
44
|
+
*/
|
|
45
|
+
export declare function linkBaseType(typeName: string, allTypes: Map<string, TypeInfo>, currentNamespace?: string): string;
|
|
46
|
+
/**
|
|
47
|
+
* Loads the Web API links `typedoc-plugin-mdn-links` ships, if it is installed. Without it, Web API types render
|
|
48
|
+
* unlinked.
|
|
49
|
+
*
|
|
50
|
+
* @param rootDirectory - The folder whose `node_modules` holds the package.
|
|
51
|
+
*/
|
|
52
|
+
export declare function loadExternalTypeMaps(rootDirectory: string): void;
|
|
53
|
+
/**
|
|
54
|
+
* Convert inline markdown to HTML for use in component props with set:html
|
|
55
|
+
*
|
|
56
|
+
* @param text - The text.
|
|
57
|
+
* @returns The HTML.
|
|
58
|
+
*/
|
|
59
|
+
export declare function markdownToHtml(text: string): string;
|
|
60
|
+
/**
|
|
61
|
+
* Build the href for a member, pointing to the parent type's page if inherited
|
|
62
|
+
*
|
|
63
|
+
* @param memberSlugString - The member's route segment.
|
|
64
|
+
* @param inheritedFrom - The name of the type the member is inherited from, or an empty string for an own member.
|
|
65
|
+
* @param allTypes - Every documented type, keyed by `${namespace}#${name}`.
|
|
66
|
+
* @param currentNamespace - The namespace of the referencing page, preferred when the name is ambiguous.
|
|
67
|
+
* @returns The link, or an empty string when no page documents the member.
|
|
68
|
+
*/
|
|
69
|
+
export declare function memberHref(memberSlugString: string, inheritedFrom: string, allTypes: Map<string, TypeInfo>, currentNamespace?: string): string;
|
|
70
|
+
/**
|
|
71
|
+
* Populate {@link doesMemberPageExist}. Mirrors `generateMemberPages`'s own filtering exactly (one page
|
|
72
|
+
* per non-inherited property, one per non-inherited method overload key). Must run once before any
|
|
73
|
+
* link is rendered.
|
|
74
|
+
*
|
|
75
|
+
* @param types - The documented types, keyed by qualified id.
|
|
76
|
+
*/
|
|
77
|
+
export declare function registerMemberPages(types: Map<string, TypeInfo>): void;
|
|
78
|
+
/**
|
|
79
|
+
* For every documented type assign BOTH:
|
|
80
|
+
* - a lowercased, numerically-disambiguated FILE segment (so `TypeAsserter` vs `typeAsserter`, which
|
|
81
|
+
* both lowercase to `typeasserter`, become `typeasserter` / `typeasserter-2` on disk and never
|
|
82
|
+
* collide on Windows' case-insensitive filesystem), and
|
|
83
|
+
* - a case-PRESERVED ROUTE segment (`TypeAsserter` / `typeAsserter`) used for the explicit `slug:`
|
|
84
|
+
* frontmatter and every internal link, so the URLs stay pretty and naturally distinct.
|
|
85
|
+
* The route decouples from the file path via the `slug:` frontmatter, so no `-2` suffix leaks into
|
|
86
|
+
* URLs. Also warns about member-slug collisions within a type. Must run once before any page/link.
|
|
87
|
+
*
|
|
88
|
+
* @param types - The documented types, keyed by qualified id.
|
|
89
|
+
*/
|
|
90
|
+
export declare function registerRouteSegments(types: Map<string, TypeInfo>): void;
|
|
91
|
+
/**
|
|
92
|
+
* Render an `@example` block as MDX. If the example already contains a fenced code block, it is
|
|
93
|
+
* normalized through {@link renderMdxProse} (code preserved raw, surrounding prose escaped);
|
|
94
|
+
* otherwise the raw example text is wrapped in a `ts` code fence so it is emitted literally.
|
|
95
|
+
*
|
|
96
|
+
* @param example - The `@example` text.
|
|
97
|
+
* @param allTypes - Every documented type, keyed by `${namespace}#${name}`.
|
|
98
|
+
* @param selfNamespace - The namespace of the page being rendered, preferred when a name is ambiguous.
|
|
99
|
+
* @returns The MDX.
|
|
100
|
+
*/
|
|
101
|
+
export declare function renderExampleMdx(example: string, allTypes: Map<string, TypeInfo>, selfNamespace?: string): string;
|
|
102
|
+
/**
|
|
103
|
+
* Render markdown block text (a description, remarks, or module overview) as MDX-safe markdown.
|
|
104
|
+
* Fenced code blocks are re-emitted verbatim (surrounded by blank lines, with a language); prose
|
|
105
|
+
* segments have their inline link tags resolved and their MDX-unsafe characters escaped.
|
|
106
|
+
*
|
|
107
|
+
* @param text - The text.
|
|
108
|
+
* @param allTypes - Every documented type, keyed by `${namespace}#${name}`.
|
|
109
|
+
* @param selfNamespace - The namespace of the page being rendered, preferred when a name is ambiguous.
|
|
110
|
+
* @returns The MDX.
|
|
111
|
+
*/
|
|
112
|
+
export declare function renderMdxProse(text: string, allTypes: Map<string, TypeInfo>, selfNamespace?: string): string;
|
|
113
|
+
/**
|
|
114
|
+
* Render a type string with clickable links for known types
|
|
115
|
+
*
|
|
116
|
+
* @param typeText - The type text.
|
|
117
|
+
* @param allTypes - Every documented type, keyed by `${namespace}#${name}`.
|
|
118
|
+
* @param selfTypeName - The name of the type the page documents, which `this` links to.
|
|
119
|
+
* @param selfNamespace - The namespace of the page being rendered, preferred when a name is ambiguous.
|
|
120
|
+
* @returns The type text with markdown links.
|
|
121
|
+
*/
|
|
122
|
+
export declare function renderTypeWithLinks(typeText: string, allTypes: Map<string, TypeInfo>, selfTypeName?: string, selfNamespace?: string): string;
|
|
123
|
+
/**
|
|
124
|
+
* Resolve a type no page of this site documents to the page that does: another documented package's site, or an
|
|
125
|
+
* entry of the site's own `externalTypeLinks` setting.
|
|
126
|
+
*
|
|
127
|
+
* @param name - The type's name.
|
|
128
|
+
* @returns The URL, or `undefined` when neither knows the type.
|
|
129
|
+
*/
|
|
130
|
+
export declare function resolveExternalTypeUrl(name: string): string | undefined;
|
|
131
|
+
/**
|
|
132
|
+
* Resolve `@link` tags, with or without a `| display text` part, in description text
|
|
133
|
+
*
|
|
134
|
+
* @param text - The text.
|
|
135
|
+
* @param allTypes - Every documented type, keyed by `${namespace}#${name}`.
|
|
136
|
+
* @param selfNamespace - The namespace of the page being rendered, preferred when a name is ambiguous.
|
|
137
|
+
* @returns The text with markdown links.
|
|
138
|
+
*/
|
|
139
|
+
export declare function resolveLinks(text: string, allTypes: Map<string, TypeInfo>, selfNamespace?: string): string;
|
|
140
|
+
/**
|
|
141
|
+
* Resolves a TypeScript utility type to its handbook entry.
|
|
142
|
+
*
|
|
143
|
+
* @param name - The type's name.
|
|
144
|
+
* @returns The handbook URL, or `undefined` when it is not a utility type.
|
|
145
|
+
*/
|
|
146
|
+
export declare function resolveTsUtilityUrl(name: string): string | undefined;
|
|
147
|
+
/**
|
|
148
|
+
* Resolves a Web API type to its MDN page.
|
|
149
|
+
*
|
|
150
|
+
* @param name - The type's name.
|
|
151
|
+
* @returns The MDN URL, or `undefined` when it is not a known Web API type.
|
|
152
|
+
*/
|
|
153
|
+
export declare function resolveWebApiUrl(name: string): string | undefined;
|
|
154
|
+
/**
|
|
155
|
+
* Resolve the lowercased ON-DISK segment for a type (file path + component-import relative path).
|
|
156
|
+
*
|
|
157
|
+
* @param namespace - The type's namespace.
|
|
158
|
+
* @param name - The type's name.
|
|
159
|
+
* @returns The segment.
|
|
160
|
+
*/
|
|
161
|
+
export declare function toTypeFileSegment(namespace: string, name: string): string;
|
|
162
|
+
/**
|
|
163
|
+
* Resolve the case-preserved URL/ROUTE segment for a type (slug frontmatter + internal links).
|
|
164
|
+
*
|
|
165
|
+
* @param namespace - The type's namespace.
|
|
166
|
+
* @param name - The type's name.
|
|
167
|
+
* @returns The segment.
|
|
168
|
+
*/
|
|
169
|
+
export declare function toTypeRouteSegment(namespace: string, name: string): string;
|
|
170
|
+
/**
|
|
171
|
+
* Absolute link to a type's overview page.
|
|
172
|
+
*
|
|
173
|
+
* @param info - The documented type.
|
|
174
|
+
* @returns The link.
|
|
175
|
+
*/
|
|
176
|
+
export declare function typeHref(info: TypeInfo): string;
|
|
177
|
+
/**
|
|
178
|
+
* Create an absolute link to a type page
|
|
179
|
+
*
|
|
180
|
+
* @param typeName - The type's name.
|
|
181
|
+
* @param allTypes - Every documented type, keyed by `${namespace}#${name}`.
|
|
182
|
+
* @param currentNamespace - The namespace of the referencing page, preferred when the name is ambiguous.
|
|
183
|
+
* @returns A markdown link, or inline code when the type is not documented.
|
|
184
|
+
*/
|
|
185
|
+
export declare function typeLink(typeName: string, allTypes: Map<string, TypeInfo>, currentNamespace?: string): string;
|