@mnaoumov/typescript-dev-toolkit 3.6.4 → 3.7.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/lib/cjs/docs-site/docs-snippets.cjs +310 -0
- package/dist/lib/cjs/docs-site/docs-snippets.d.cts +136 -0
- package/dist/lib/cjs/docs-site/index.cjs +7 -1
- package/dist/lib/cjs/docs-site/index.d.cts +2 -0
- package/dist/lib/cjs/docs-site/outdated-references.cjs +118 -0
- package/dist/lib/cjs/docs-site/outdated-references.d.cts +72 -0
- package/dist/lib/esm/docs-site/docs-snippets.d.mts +136 -0
- package/dist/lib/esm/docs-site/docs-snippets.mjs +298 -0
- package/dist/lib/esm/docs-site/index.d.mts +2 -0
- package/dist/lib/esm/docs-site/index.mjs +5 -1
- package/dist/lib/esm/docs-site/outdated-references.d.mts +72 -0
- package/dist/lib/esm/docs-site/outdated-references.mjs +96 -0
- package/docs-site/docs-snippets/package.json +6 -0
- package/docs-site/outdated-references/package.json +6 -0
- package/package.json +2 -1
|
@@ -0,0 +1,310 @@
|
|
|
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 docs_snippets_exports = {};
|
|
58
|
+
__export(docs_snippets_exports, {
|
|
59
|
+
assertDocsSnippetsCompile: () => assertDocsSnippetsCompile,
|
|
60
|
+
extractDocsSnippets: () => extractDocsSnippets,
|
|
61
|
+
findDocsSnippetProblems: () => findDocsSnippetProblems,
|
|
62
|
+
formatDocsSnippetProblems: () => formatDocsSnippetProblems
|
|
63
|
+
});
|
|
64
|
+
module.exports = __toCommonJS(docs_snippets_exports);
|
|
65
|
+
var import_promises = require('node:fs/promises');
|
|
66
|
+
var import_node_path = require('node:path');
|
|
67
|
+
var import_typescript = require('typescript');
|
|
68
|
+
const CHECKED_LANGUAGES = /* @__PURE__ */ new Map([
|
|
69
|
+
["javascript", true],
|
|
70
|
+
["js", true],
|
|
71
|
+
["ts", false],
|
|
72
|
+
["typescript", false]
|
|
73
|
+
]);
|
|
74
|
+
const LINE_AFTER_FENCE_OFFSET = 2;
|
|
75
|
+
const MARKER_REG_EXP = /^<!--\s*snippet-check:\s*(?<kind>[a-z]+)\b(?<text>.*?)-->$/su;
|
|
76
|
+
const DIAGNOSTIC_DECLARED_BUT_VALUE_NEVER_READ = 6133;
|
|
77
|
+
const DIAGNOSTIC_ALL_IMPORTS_UNUSED = 6192;
|
|
78
|
+
const DIAGNOSTIC_DECLARED_BUT_NEVER_USED = 6196;
|
|
79
|
+
const DIAGNOSTIC_ALL_DESTRUCTURED_ELEMENTS_UNUSED = 6198;
|
|
80
|
+
const IGNORED_DIAGNOSTIC_CODES = /* @__PURE__ */ new Set([
|
|
81
|
+
DIAGNOSTIC_ALL_DESTRUCTURED_ELEMENTS_UNUSED,
|
|
82
|
+
DIAGNOSTIC_ALL_IMPORTS_UNUSED,
|
|
83
|
+
DIAGNOSTIC_DECLARED_BUT_NEVER_USED,
|
|
84
|
+
DIAGNOSTIC_DECLARED_BUT_VALUE_NEVER_READ
|
|
85
|
+
]);
|
|
86
|
+
const DIAGNOSTIC_VARIABLE_IMPLICITLY_ANY = 7005;
|
|
87
|
+
const DIAGNOSTIC_PARAMETER_IMPLICITLY_ANY = 7006;
|
|
88
|
+
const DIAGNOSTIC_MEMBER_IMPLICITLY_ANY = 7008;
|
|
89
|
+
const DIAGNOSTIC_BINDING_ELEMENT_IMPLICITLY_ANY = 7031;
|
|
90
|
+
const DIAGNOSTIC_VARIABLE_IMPLICITLY_ANY_IN_SOME_LOCATIONS = 7034;
|
|
91
|
+
const DIAGNOSTIC_ARROW_FUNCTION_CAPTURES_GLOBAL_THIS = 7041;
|
|
92
|
+
const DIAGNOSTIC_ELEMENT_IMPLICITLY_ANY = 7053;
|
|
93
|
+
const JAVASCRIPT_IGNORED_DIAGNOSTIC_CODES = /* @__PURE__ */ new Set([
|
|
94
|
+
DIAGNOSTIC_ARROW_FUNCTION_CAPTURES_GLOBAL_THIS,
|
|
95
|
+
DIAGNOSTIC_BINDING_ELEMENT_IMPLICITLY_ANY,
|
|
96
|
+
DIAGNOSTIC_ELEMENT_IMPLICITLY_ANY,
|
|
97
|
+
DIAGNOSTIC_MEMBER_IMPLICITLY_ANY,
|
|
98
|
+
DIAGNOSTIC_PARAMETER_IMPLICITLY_ANY,
|
|
99
|
+
DIAGNOSTIC_VARIABLE_IMPLICITLY_ANY,
|
|
100
|
+
DIAGNOSTIC_VARIABLE_IMPLICITLY_ANY_IN_SOME_LOCATIONS
|
|
101
|
+
]);
|
|
102
|
+
async function assertDocsSnippetsCompile(params) {
|
|
103
|
+
const problems = await findDocsSnippetProblems(params);
|
|
104
|
+
if (problems.length > 0) {
|
|
105
|
+
throw new Error(`${String(problems.length)} problem(s) in the documentation snippets:
|
|
106
|
+
${formatDocsSnippetProblems(problems)}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
function extractDocsSnippets(markdown) {
|
|
110
|
+
const lines = markdown.split(/\r?\n/u);
|
|
111
|
+
const snippets = [];
|
|
112
|
+
let openFence = null;
|
|
113
|
+
let codeLines = [];
|
|
114
|
+
let pendingSkipReason = null;
|
|
115
|
+
let pendingContext = [];
|
|
116
|
+
for (const [index, line] of lines.entries()) {
|
|
117
|
+
if (openFence) {
|
|
118
|
+
const content = stripPrefix(line, openFence.prefix);
|
|
119
|
+
if (content.trimEnd() === openFence.fence) {
|
|
120
|
+
const isJavaScript = CHECKED_LANGUAGES.get(openFence.language);
|
|
121
|
+
if (isJavaScript !== void 0) {
|
|
122
|
+
snippets.push({
|
|
123
|
+
code: codeLines.join("\n"),
|
|
124
|
+
codeStartLine: openFence.startLine,
|
|
125
|
+
context: openFence.context.join("\n"),
|
|
126
|
+
isJavaScript,
|
|
127
|
+
language: openFence.language,
|
|
128
|
+
skipReason: openFence.skipReason
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
openFence = null;
|
|
132
|
+
codeLines = [];
|
|
133
|
+
} else {
|
|
134
|
+
codeLines.push(content);
|
|
135
|
+
}
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
const fenceMatch = /^(?<prefix>(?:\s*>)*\s*)(?<fence>`{3,}|~{3,})(?<language>[\w-]*)/u.exec(line);
|
|
139
|
+
if (fenceMatch?.groups) {
|
|
140
|
+
openFence = {
|
|
141
|
+
context: pendingContext,
|
|
142
|
+
fence: fenceMatch.groups["fence"] ?? "",
|
|
143
|
+
language: (fenceMatch.groups["language"] ?? "").toLowerCase(),
|
|
144
|
+
prefix: fenceMatch.groups["prefix"] ?? "",
|
|
145
|
+
skipReason: pendingSkipReason,
|
|
146
|
+
startLine: index + LINE_AFTER_FENCE_OFFSET
|
|
147
|
+
};
|
|
148
|
+
pendingSkipReason = null;
|
|
149
|
+
pendingContext = [];
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
const text = line.replace(/^(?:\s*>)*\s*/u, "").trim();
|
|
153
|
+
const markerMatch = MARKER_REG_EXP.exec(text);
|
|
154
|
+
const kind = markerMatch?.groups?.["kind"];
|
|
155
|
+
const markerText = (markerMatch?.groups?.["text"] ?? "").trim();
|
|
156
|
+
if (kind === "skip") {
|
|
157
|
+
pendingSkipReason = markerText.replace(/^[-—:]\s*/u, "");
|
|
158
|
+
} else if (kind === "context") {
|
|
159
|
+
pendingContext.push(markerText);
|
|
160
|
+
} else if (text !== "") {
|
|
161
|
+
pendingSkipReason = null;
|
|
162
|
+
pendingContext = [];
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return snippets;
|
|
166
|
+
}
|
|
167
|
+
async function findDocsSnippetProblems(params) {
|
|
168
|
+
const rootDirectory = (0, import_node_path.resolve)(params.rootDirectory);
|
|
169
|
+
const docsDirectory = (0, import_node_path.join)(rootDirectory, params.docsDirectory ?? "docs/src/content/docs");
|
|
170
|
+
const problems = [];
|
|
171
|
+
const virtualFiles = /* @__PURE__ */ new Map();
|
|
172
|
+
const rootNames = [];
|
|
173
|
+
const snippetsDirectory = (0, import_node_path.join)(rootDirectory, "docs", "__snippets__");
|
|
174
|
+
function addVirtualFile(path, file) {
|
|
175
|
+
virtualFiles.set(normalizePath(path), file);
|
|
176
|
+
rootNames.push(path);
|
|
177
|
+
}
|
|
178
|
+
const prelude = params.prelude ?? "";
|
|
179
|
+
if (prelude !== "") {
|
|
180
|
+
addVirtualFile((0, import_node_path.join)(snippetsDirectory, "prelude.ts"), { code: prelude, codeStartLine: 1, contextLineCount: 0, filePath: "<prelude>" });
|
|
181
|
+
}
|
|
182
|
+
for (const guidePath of await listGuides(docsDirectory)) {
|
|
183
|
+
const filePath = toPosix((0, import_node_path.relative)(rootDirectory, guidePath));
|
|
184
|
+
const markdown = await (0, import_promises.readFile)(guidePath, "utf-8");
|
|
185
|
+
for (const snippet of extractDocsSnippets(markdown)) {
|
|
186
|
+
if (snippet.skipReason === "") {
|
|
187
|
+
problems.push({
|
|
188
|
+
filePath,
|
|
189
|
+
line: snippet.codeStartLine - 1,
|
|
190
|
+
message: "A `snippet-check: skip` marker must give its reason."
|
|
191
|
+
});
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
if (snippet.skipReason !== null) {
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
const extension = snippet.isJavaScript ? "js" : "ts";
|
|
198
|
+
const baseName = `${toPosix((0, import_node_path.relative)(docsDirectory, guidePath)).replaceAll("/", "__")}.L${String(snippet.codeStartLine)}.${extension}`;
|
|
199
|
+
const context = snippet.context === "" ? "" : `${snippet.context}
|
|
200
|
+
`;
|
|
201
|
+
addVirtualFile((0, import_node_path.join)(snippetsDirectory, baseName), {
|
|
202
|
+
code: `${context}${snippet.code}
|
|
203
|
+
export {};
|
|
204
|
+
`,
|
|
205
|
+
codeStartLine: snippet.codeStartLine,
|
|
206
|
+
contextLineCount: context === "" ? 0 : context.split("\n").length - 1,
|
|
207
|
+
filePath
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
problems.push(...compileSnippets({ compilerOptions: params.compilerOptions ?? {}, rootDirectory, rootNames, virtualFiles }));
|
|
212
|
+
return problems;
|
|
213
|
+
}
|
|
214
|
+
function formatDocsSnippetProblems(problems) {
|
|
215
|
+
return problems.map((problem) => `${problem.filePath}:${String(problem.line)} - ${problem.message}`).join("\n");
|
|
216
|
+
}
|
|
217
|
+
function compileSnippets(params) {
|
|
218
|
+
const { rootDirectory, rootNames, virtualFiles } = params;
|
|
219
|
+
const configPath = (0, import_node_path.join)(rootDirectory, "tsconfig.json");
|
|
220
|
+
const parsed = (0, import_typescript.getParsedCommandLineOfConfigFile)(configPath, {}, {
|
|
221
|
+
...import_typescript.sys,
|
|
222
|
+
onUnRecoverableConfigFileDiagnostic(diagnostic) {
|
|
223
|
+
throw new Error((0, import_typescript.flattenDiagnosticMessageText)(diagnostic.messageText, "\n"));
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
if (!parsed) {
|
|
227
|
+
throw new Error(`Cannot read ${configPath}`);
|
|
228
|
+
}
|
|
229
|
+
const compilerOptions = {
|
|
230
|
+
...parsed.options,
|
|
231
|
+
...params.compilerOptions,
|
|
232
|
+
allowJs: true,
|
|
233
|
+
checkJs: true,
|
|
234
|
+
composite: false,
|
|
235
|
+
incremental: false,
|
|
236
|
+
noEmit: true,
|
|
237
|
+
noUnusedLocals: false,
|
|
238
|
+
noUnusedParameters: false
|
|
239
|
+
};
|
|
240
|
+
delete compilerOptions.tsBuildInfoFile;
|
|
241
|
+
const host = (0, import_typescript.createCompilerHost)(compilerOptions, true);
|
|
242
|
+
const originalGetSourceFile = host.getSourceFile.bind(host);
|
|
243
|
+
const originalFileExists = host.fileExists.bind(host);
|
|
244
|
+
const originalReadFile = host.readFile.bind(host);
|
|
245
|
+
host.fileExists = (fileName) => virtualFiles.has(normalizePath(fileName)) || originalFileExists(fileName);
|
|
246
|
+
host.readFile = (fileName) => virtualFiles.get(normalizePath(fileName))?.code ?? originalReadFile(fileName);
|
|
247
|
+
host.getSourceFile = (fileName, languageVersionOrOptions, onError, shouldCreateNewSourceFile) => {
|
|
248
|
+
const virtualFile = virtualFiles.get(normalizePath(fileName));
|
|
249
|
+
if (virtualFile) {
|
|
250
|
+
const scriptKind = fileName.endsWith(".js") ? import_typescript.ScriptKind.JS : import_typescript.ScriptKind.TS;
|
|
251
|
+
return (0, import_typescript.createSourceFile)(fileName, virtualFile.code, languageVersionOrOptions, true, scriptKind);
|
|
252
|
+
}
|
|
253
|
+
return originalGetSourceFile(fileName, languageVersionOrOptions, onError, shouldCreateNewSourceFile);
|
|
254
|
+
};
|
|
255
|
+
const program = (0, import_typescript.createProgram)({ host, options: compilerOptions, rootNames });
|
|
256
|
+
const problems = [];
|
|
257
|
+
for (const rootName of rootNames) {
|
|
258
|
+
const sourceFile = program.getSourceFile(rootName);
|
|
259
|
+
const virtualFile = virtualFiles.get(normalizePath(rootName));
|
|
260
|
+
if (!sourceFile || !virtualFile) {
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
const isJavaScript = rootName.endsWith(".js");
|
|
264
|
+
const diagnostics = [...program.getSyntacticDiagnostics(sourceFile), ...program.getSemanticDiagnostics(sourceFile)];
|
|
265
|
+
for (const diagnostic of diagnostics) {
|
|
266
|
+
if (IGNORED_DIAGNOSTIC_CODES.has(diagnostic.code) || isJavaScript && JAVASCRIPT_IGNORED_DIAGNOSTIC_CODES.has(diagnostic.code)) {
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
const fileLine = diagnostic.start === void 0 ? 0 : sourceFile.getLineAndCharacterOfPosition(diagnostic.start).line;
|
|
270
|
+
const snippetLine = Math.max(0, fileLine - virtualFile.contextLineCount);
|
|
271
|
+
problems.push({
|
|
272
|
+
filePath: virtualFile.filePath,
|
|
273
|
+
line: virtualFile.codeStartLine + snippetLine,
|
|
274
|
+
message: `TS${String(diagnostic.code)}: ${(0, import_typescript.flattenDiagnosticMessageText)(diagnostic.messageText, " ")}`
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return problems;
|
|
279
|
+
}
|
|
280
|
+
async function listGuides(directory) {
|
|
281
|
+
const guides = [];
|
|
282
|
+
for (const entry of await (0, import_promises.readdir)(directory, { withFileTypes: true })) {
|
|
283
|
+
const entryPath = (0, import_node_path.join)(directory, entry.name);
|
|
284
|
+
if (entry.isDirectory()) {
|
|
285
|
+
if (entry.name !== "api") {
|
|
286
|
+
guides.push(...await listGuides(entryPath));
|
|
287
|
+
}
|
|
288
|
+
} else if (/\.mdx?$/u.test(entry.name)) {
|
|
289
|
+
guides.push(entryPath);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return guides.sort();
|
|
293
|
+
}
|
|
294
|
+
function normalizePath(path) {
|
|
295
|
+
return toPosix((0, import_node_path.resolve)(path)).toLowerCase();
|
|
296
|
+
}
|
|
297
|
+
function stripPrefix(line, prefix) {
|
|
298
|
+
return line.startsWith(prefix) ? line.slice(prefix.length) : line.replace(/^(?:\s*>)*\s?/u, "");
|
|
299
|
+
}
|
|
300
|
+
function toPosix(path) {
|
|
301
|
+
return path.replaceAll("\\", "/");
|
|
302
|
+
}
|
|
303
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
304
|
+
0 && (module.exports = {
|
|
305
|
+
assertDocsSnippetsCompile,
|
|
306
|
+
extractDocsSnippets,
|
|
307
|
+
findDocsSnippetProblems,
|
|
308
|
+
formatDocsSnippetProblems
|
|
309
|
+
});
|
|
310
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvZG9jcy1zbmlwcGV0cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogRXh0cmFjdHMgdGhlIGNvZGUgc25pcHBldHMgb2YgYSBwYWNrYWdlJ3MgZG9jdW1lbnRhdGlvbiBndWlkZXMgYW5kIHR5cGUtY2hlY2tzIHRoZW0gYWdhaW5zdCBpdHMgc291cmNlcy5cbiAqXG4gKiBBIGd1aWRlJ3Mgc25pcHBldCBpcyBjb2RlIGEgcmVhZGVyIGNvcGllcywgc28gYSByZW5hbWVkIG1lbWJlciBvciBhIHN0YWxlIGltcG9ydCBwYXRoIGluIGl0IGlzIGEgYnVnIHRoYXQgc2hpcHNcbiAqIHRvIHRoZSBzaXRlIHdpdGggZXZlcnkgY2hlY2sgZ3JlZW4uIEV2ZXJ5IGZlbmNlZCBgdHNgLCBgdHlwZXNjcmlwdGAsIGBqc2Agb3IgYGphdmFzY3JpcHRgIGJsb2NrIGluXG4gKiBgZG9jcy9zcmMvY29udGVudC9kb2NzYCBpcyBjb21waWxlZCBhcyBpdHMgb3duIG1vZHVsZSwgd2l0aCB0aGUgcHJvamVjdCdzIGB0c2NvbmZpZy5qc29uYCwgc28gYW4gaW1wb3J0IG9mIHRoZVxuICogcGFja2FnZSdzIG93biBuYW1lIHJlc29sdmVzIHdoZXJldmVyIHRoYXQgY29uZmlndXJhdGlvbiBzZW5kcyBpdCAoaXRzIGBwYXRoc2AsIG9yIHRoZSBgY29tcGlsZXJPcHRpb25zYCBwYXNzZWRcbiAqIGhlcmUpIGFuZCBhIHdyb25nIG5hbWUgZmFpbHMuIEEgYHRzYCAvIGB0eXBlc2NyaXB0YCBibG9jayBpcyBjb21waWxlZCBhcyBUeXBlU2NyaXB0OyBhIGBqc2AgLyBgamF2YXNjcmlwdGAgYmxvY2ssXG4gKiBvZnRlbiBhIGRldnRvb2xzLWNvbnNvbGUgcmVjaXBlLCBpcyBjb21waWxlZCBhcyBKYXZhU2NyaXB0IHdpdGggYGNoZWNrSnNgLCBzbyBhIHdyb25nIG1lbWJlciBvZiBhIHR5cGVkIG9iamVjdFxuICogc3RpbGwgZmFpbHMgd2hpbGUgYW4gdW50eXBlZCBsb29rdXAgZG9lcyBub3QuIFRoZSBnZW5lcmF0ZWQgQVBJIHJlZmVyZW5jZSAoYGRvY3Mvc3JjL2NvbnRlbnQvZG9jcy9hcGlgKSBpc1xuICogc2tpcHBlZDogaXQgaXMgcmVuZGVyZWQgZnJvbSB0aGUgVFNEb2MuXG4gKlxuICogVGhyZWUgdGhpbmdzIHNoYXBlIHdoYXQgYSBzbmlwcGV0IGlzIGNvbXBpbGVkIHdpdGgsIGVhY2ggYnV0IHRoZSBmaXJzdCB3cml0dGVuIGluIHRoZSBndWlkZSBhcyBhbiBIVE1MIGNvbW1lbnQsXG4gKiBpbnZpc2libGUgb24gdGhlIHNpdGUsIG9uIHRoZSBsaW5lcyByaWdodCBhYm92ZSB0aGUgZmVuY2U6XG4gKlxuICogLSBUaGUgbmFtZXMgZXZlcnkgZ3VpZGUgbWF5IHVzZSB3aXRob3V0IGRlY2xhcmluZyB0aGVtIGFyZSB0aGUgcGFja2FnZSdzIGBwcmVsdWRlYCwgY29tcGlsZWQgYXMgYSBtb2R1bGUgb2YgaXRzXG4gKiAgIG93biAoYSBgZGVjbGFyZSBnbG9iYWxgIGJsb2NrLCB3aXRoIHRoZSBpbXBvcnRzIGl0IG5lZWRzKS5cbiAqIC0gYDwhLS0gc25pcHBldC1jaGVjazogY29udGV4dCA8VHlwZVNjcmlwdD4gLS0+YCBwcmVwZW5kcyBkZWNsYXJhdGlvbnMgdG8gdGhhdCBvbmUgc25pcHBldCwgZm9yIHRoZSBuYW1lcyBpdHNcbiAqICAgcHJvc2UgaGFzIGFscmVhZHkgaW50cm9kdWNlZCAoYGRlY2xhcmUgY29uc3QgbGlua0VsOiBIVE1MQW5jaG9yRWxlbWVudDtgKS4gU2V2ZXJhbCBzdWNoIGxpbmVzIGFkZCB1cC5cbiAqIC0gYDwhLS0gc25pcHBldC1jaGVjazogc2tpcCA8cmVhc29uPiAtLT5gIGV4ZW1wdHMgYSBzbmlwcGV0IHRoYXQgaXMgZGVsaWJlcmF0ZWx5IG5vdCBjb21waWxhYmxlLCBzdWNoIGFzXG4gKiAgIHBzZXVkby1jb2RlLiBUaGUgcmVhc29uIGlzIHJlcXVpcmVkLCBzbyBhIHNraXAgaXMgYSBkZWNpc2lvbiBzb21lYm9keSB3cm90ZSBkb3duLCBuZXZlciBhIHNpbGVudCBob2xlLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ29tcGlsZXJPcHRpb25zLFxuICBTb3VyY2VGaWxlXG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQge1xuICByZWFkZGlyLFxuICByZWFkRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7XG4gIGpvaW4sXG4gIHJlbGF0aXZlLFxuICByZXNvbHZlXG59IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQge1xuICBjcmVhdGVDb21waWxlckhvc3QsXG4gIGNyZWF0ZVByb2dyYW0sXG4gIGNyZWF0ZVNvdXJjZUZpbGUsXG4gIGZsYXR0ZW5EaWFnbm9zdGljTWVzc2FnZVRleHQsXG4gIGdldFBhcnNlZENvbW1hbmRMaW5lT2ZDb25maWdGaWxlLFxuICBTY3JpcHRLaW5kLFxuICBzeXNcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbi8qKlxuICogVGhlIGxhbmd1YWdlcyBvZiB0aGUgZmVuY2VkIGJsb2NrcyB0aGF0IGFyZSB0eXBlLWNoZWNrZWQsIGFuZCB3aGV0aGVyIGVhY2ggaXMgSmF2YVNjcmlwdC5cbiAqL1xuY29uc3QgQ0hFQ0tFRF9MQU5HVUFHRVM6IFJlYWRvbmx5TWFwPHN0cmluZywgYm9vbGVhbj4gPSBuZXcgTWFwKFtcbiAgWydqYXZhc2NyaXB0JywgdHJ1ZV0sXG4gIFsnanMnLCB0cnVlXSxcbiAgWyd0cycsIGZhbHNlXSxcbiAgWyd0eXBlc2NyaXB0JywgZmFsc2VdXG5dKTtcblxuLyoqXG4gKiBUaGUgb2Zmc2V0IGZyb20gYSBmZW5jZSBsaW5lJ3MgMC1iYXNlZCBpbmRleCB0byB0aGUgMS1iYXNlZCBsaW5lIG9mIHRoZSBjb2RlIGFmdGVyIGl0LlxuICovXG5jb25zdCBMSU5FX0FGVEVSX0ZFTkNFX09GRlNFVCA9IDI7XG5cbmNvbnN0IE1BUktFUl9SRUdfRVhQID0gL148IS0tXFxzKnNuaXBwZXQtY2hlY2s6XFxzKig/PGtpbmQ+W2Etel0rKVxcYig/PHRleHQ+Lio/KS0tPiQvc3U7XG5cbi8qKlxuICogRGlhZ25vc3RpY3MgYSBzbmlwcGV0IGlzIG5vdCBoZWxkIHRvOiBhbiBpbGx1c3RyYXRpb24gZGVjbGFyZXMgbmFtZXMgaXQgbmV2ZXIgcmVhZHMuXG4gKi9cbmNvbnN0IERJQUdOT1NUSUNfREVDTEFSRURfQlVUX1ZBTFVFX05FVkVSX1JFQUQgPSA2MTMzO1xuY29uc3QgRElBR05PU1RJQ19BTExfSU1QT1JUU19VTlVTRUQgPSA2MTkyO1xuY29uc3QgRElBR05PU1RJQ19ERUNMQVJFRF9CVVRfTkVWRVJfVVNFRCA9IDYxOTY7XG5jb25zdCBESUFHTk9TVElDX0FMTF9ERVNUUlVDVFVSRURfRUxFTUVOVFNfVU5VU0VEID0gNjE5ODtcbmNvbnN0IElHTk9SRURfRElBR05PU1RJQ19DT0RFUyA9IG5ldyBTZXQoW1xuICBESUFHTk9TVElDX0FMTF9ERVNUUlVDVFVSRURfRUxFTUVOVFNfVU5VU0VELFxuICBESUFHTk9TVElDX0FMTF9JTVBPUlRTX1VOVVNFRCxcbiAgRElBR05PU1RJQ19ERUNMQVJFRF9CVVRfTkVWRVJfVVNFRCxcbiAgRElBR05PU1RJQ19ERUNMQVJFRF9CVVRfVkFMVUVfTkVWRVJfUkVBRFxuXSk7XG5cbi8qKlxuICogVGhlIGltcGxpY2l0LWBhbnlgIGRpYWdub3N0aWNzLCB3aGljaCBhIEphdmFTY3JpcHQgc25pcHBldCBpcyBub3QgaGVsZCB0bzogYSBjb25zb2xlIHJlY2lwZSBoYXMgbm8gYW5ub3RhdGlvbnMgdG9cbiAqIGdpdmUsIGFuZCBhbiB1bnR5cGVkIGxvb2t1cCBzdWNoIGFzIGEgYFN5bWJvbC5mb3JgIHNsb3Qgb24gYGdsb2JhbFRoaXNgIGlzIHdoYXQgcGxhaW4gSmF2YVNjcmlwdCBkb2VzLlxuICovXG5jb25zdCBESUFHTk9TVElDX1ZBUklBQkxFX0lNUExJQ0lUTFlfQU5ZID0gNzAwNTtcbmNvbnN0IERJQUdOT1NUSUNfUEFSQU1FVEVSX0lNUExJQ0lUTFlfQU5ZID0gNzAwNjtcbmNvbnN0IERJQUdOT1NUSUNfTUVNQkVSX0lNUExJQ0lUTFlfQU5ZID0gNzAwODtcbmNvbnN0IERJQUdOT1NUSUNfQklORElOR19FTEVNRU5UX0lNUExJQ0lUTFlfQU5ZID0gNzAzMTtcbmNvbnN0IERJQUdOT1NUSUNfVkFSSUFCTEVfSU1QTElDSVRMWV9BTllfSU5fU09NRV9MT0NBVElPTlMgPSA3MDM0O1xuY29uc3QgRElBR05PU1RJQ19BUlJPV19GVU5DVElPTl9DQVBUVVJFU19HTE9CQUxfVEhJUyA9IDcwNDE7XG5jb25zdCBESUFHTk9TVElDX0VMRU1FTlRfSU1QTElDSVRMWV9BTlkgPSA3MDUzO1xuY29uc3QgSkFWQVNDUklQVF9JR05PUkVEX0RJQUdOT1NUSUNfQ09ERVMgPSBuZXcgU2V0KFtcbiAgRElBR05PU1RJQ19BUlJPV19GVU5DVElPTl9DQVBUVVJFU19HTE9CQUxfVEhJUyxcbiAgRElBR05PU1RJQ19CSU5ESU5HX0VMRU1FTlRfSU1QTElDSVRMWV9BTlksXG4gIERJQUdOT1NUSUNfRUxFTUVOVF9JTVBMSUNJVExZX0FOWSxcbiAgRElBR05PU1RJQ19NRU1CRVJfSU1QTElDSVRMWV9BTlksXG4gIERJQUdOT1NUSUNfUEFSQU1FVEVSX0lNUExJQ0lUTFlfQU5ZLFxuICBESUFHTk9TVElDX1ZBUklBQkxFX0lNUExJQ0lUTFlfQU5ZLFxuICBESUFHTk9TVElDX1ZBUklBQkxFX0lNUExJQ0lUTFlfQU5ZX0lOX1NPTUVfTE9DQVRJT05TXG5dKTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYXNzZXJ0RG9jc1NuaXBwZXRzQ29tcGlsZX06IHRoZSBzYW1lIGFzIHtAbGluayBmaW5kRG9jc1NuaXBwZXRQcm9ibGVtc30gdGFrZXMuXG4gKi9cbmV4cG9ydCB0eXBlIEFzc2VydERvY3NTbmlwcGV0c0NvbXBpbGVQYXJhbXMgPSBGaW5kRG9jc1NuaXBwZXRQcm9ibGVtc1BhcmFtcztcblxuLyoqXG4gKiBPbmUgZmVuY2VkIGNvZGUgYmxvY2sgb2YgYSBndWlkZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2NzU25pcHBldCB7XG4gIC8qKlxuICAgKiBUaGUgY29kZSwgd2l0aCBhbnkgYmxvY2txdW90ZSBvciBpbmRlbnRhdGlvbiBwcmVmaXggb2YgdGhlIGZlbmNlIHN0cmlwcGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgMS1iYXNlZCBsaW5lIG9mIHRoZSBndWlkZSBvbiB3aGljaCB0aGUgY29kZSBzdGFydHMgKHRoZSBsaW5lIGFmdGVyIHRoZSBvcGVuaW5nIGZlbmNlKS5cbiAgICovXG4gIHJlYWRvbmx5IGNvZGVTdGFydExpbmU6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGRlY2xhcmF0aW9ucyBvZiB0aGUgYHNuaXBwZXQtY2hlY2s6IGNvbnRleHRgIG1hcmtlcnMgYWJvdmUgdGhlIGZlbmNlLCBqb2luZWQgYnkgbmV3bGluZXMuXG4gICAqL1xuICByZWFkb25seSBjb250ZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHNuaXBwZXQgaXMgSmF2YVNjcmlwdCByYXRoZXIgdGhhbiBUeXBlU2NyaXB0LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNKYXZhU2NyaXB0OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbGFuZ3VhZ2Ugb2YgdGhlIGZlbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFuZ3VhZ2U6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlYXNvbiBnaXZlbiBieSBhIGBzbmlwcGV0LWNoZWNrOiBza2lwYCBtYXJrZXIsIG9yIGBudWxsYCB3aGVuIHRoZSBzbmlwcGV0IGlzIGNoZWNrZWQuXG4gICAqL1xuICByZWFkb25seSBza2lwUmVhc29uOiBudWxsIHwgc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcHJvYmxlbSBmb3VuZCBpbiBhIGd1aWRlJ3Mgc25pcHBldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2NzU25pcHBldFByb2JsZW0ge1xuICAvKipcbiAgICogVGhlIGd1aWRlJ3MgcGF0aCwgcmVsYXRpdmUgdG8gdGhlIHBhY2thZ2Ugcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSAxLWJhc2VkIGxpbmUgb2YgdGhlIGd1aWRlLlxuICAgKi9cbiAgcmVhZG9ubHkgbGluZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGF0IGlzIHdyb25nLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBmaW5kRG9jc1NuaXBwZXRQcm9ibGVtc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmluZERvY3NTbmlwcGV0UHJvYmxlbXNQYXJhbXMge1xuICAvKipcbiAgICogQ29tcGlsZXIgb3B0aW9ucyBsYWlkIG92ZXIgdGhlIG9uZXMgYHRzY29uZmlnLmpzb25gIGdpdmVzLCBmb3IgaW5zdGFuY2UgYHBhdGhzYCB0aGF0IHJlc29sdmUgdGhlIHBhY2thZ2UncyBvd25cbiAgICogbmFtZSBvbnRvIGl0cyBzb3VyY2VzIHdoZW4gaXRzIGB0c2NvbmZpZy5qc29uYCBoYXMgbm9uZS4gQSByZWxhdGl2ZSBwYXRoIGluIHRoZW0gaXMgbm90IHJlc29sdmVkLCBzbyBwYXNzXG4gICAqIGFic29sdXRlIG9uZXMuXG4gICAqL1xuICByZWFkb25seSBjb21waWxlck9wdGlvbnM/OiBDb21waWxlck9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFRoZSBndWlkZXMgZGlyZWN0b3J5LCByZWxhdGl2ZSB0byB7QGxpbmsgRmluZERvY3NTbmlwcGV0UHJvYmxlbXNQYXJhbXMucm9vdERpcmVjdG9yeX0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnZG9jcy9zcmMvY29udGVudC9kb2NzJ2BcbiAgICovXG4gIHJlYWRvbmx5IGRvY3NEaXJlY3Rvcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBhbWJpZW50IGNvbnRleHQgZXZlcnkgc25pcHBldCBpcyBjb21waWxlZCB3aXRoOiB0aGUgbmFtZXMgYSBndWlkZSBtYXkgdXNlIHdpdGhvdXQgZGVjbGFyaW5nIHRoZW0sIHdyaXR0ZW4gYXNcbiAgICogYSBtb2R1bGUgKGBkZWNsYXJlIGdsb2JhbCB7IC4uLiB9YCwgd2l0aCB0aGUgaW1wb3J0cyBpdCBuZWVkcykuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnJ2AsIG5vIHByZWx1ZGUuXG4gICAqL1xuICByZWFkb25seSBwcmVsdWRlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFja2FnZSByb290LCBob2xkaW5nIGB0c2NvbmZpZy5qc29uYC5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3REaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIENvbXBpbGVTbmlwcGV0c1BhcmFtcyB7XG4gIHJlYWRvbmx5IGNvbXBpbGVyT3B0aW9uczogQ29tcGlsZXJPcHRpb25zO1xuICByZWFkb25seSByb290RGlyZWN0b3J5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJvb3ROYW1lczogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IHZpcnR1YWxGaWxlczogUmVhZG9ubHlNYXA8c3RyaW5nLCBWaXJ0dWFsU25pcHBldEZpbGU+O1xufVxuXG5pbnRlcmZhY2UgT3BlbkZlbmNlIHtcbiAgcmVhZG9ubHkgY29udGV4dDogc3RyaW5nW107XG4gIHJlYWRvbmx5IGZlbmNlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxhbmd1YWdlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHByZWZpeDogc3RyaW5nO1xuICByZWFkb25seSBza2lwUmVhc29uOiBudWxsIHwgc3RyaW5nO1xuICByZWFkb25seSBzdGFydExpbmU6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFZpcnR1YWxTbmlwcGV0RmlsZSB7XG4gIHJlYWRvbmx5IGNvZGU6IHN0cmluZztcbiAgcmVhZG9ubHkgY29kZVN0YXJ0TGluZTogbnVtYmVyO1xuICByZWFkb25seSBjb250ZXh0TGluZUNvdW50OiBudW1iZXI7XG4gIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVHlwZS1jaGVja3MgZXZlcnkgc25pcHBldCBvZiB0aGUgZ3VpZGVzIGFuZCB0aHJvd3Mgd2hlbiBvbmUgZmFpbHMsIGZvciBhIGBkb2NzOmNoZWNrLXNuaXBwZXRzYCBzY3JpcHQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQXNzZXJ0RG9jc1NuaXBwZXRzQ29tcGlsZVBhcmFtc30uXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGV2ZXJ5IHNuaXBwZXQgY29tcGlsZXMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gTGlzdGluZyBldmVyeSBwcm9ibGVtLCBvbmUgcGVyIGxpbmUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnREb2NzU25pcHBldHNDb21waWxlKHBhcmFtczogQXNzZXJ0RG9jc1NuaXBwZXRzQ29tcGlsZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9ibGVtcyA9IGF3YWl0IGZpbmREb2NzU25pcHBldFByb2JsZW1zKHBhcmFtcyk7XG4gIGlmIChwcm9ibGVtcy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke1N0cmluZyhwcm9ibGVtcy5sZW5ndGgpfSBwcm9ibGVtKHMpIGluIHRoZSBkb2N1bWVudGF0aW9uIHNuaXBwZXRzOlxcbiR7Zm9ybWF0RG9jc1NuaXBwZXRQcm9ibGVtcyhwcm9ibGVtcyl9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgZmVuY2VkIGNvZGUgYmxvY2tzIG9mIHRoZSBjaGVja2VkIGxhbmd1YWdlcyBmcm9tIGEgbWFya2Rvd24gZG9jdW1lbnQuXG4gKlxuICogQSBmZW5jZSBpbnNpZGUgYSBibG9ja3F1b3RlIG9yIGEgbGlzdCBpdGVtIGlzIHJlY29nbml6ZWQgdG9vOiBpdHMgcHJlZml4IChgPiBgLCBpbmRlbnRhdGlvbikgaXMgc3RyaXBwZWQgZnJvbVxuICogZXZlcnkgbGluZSBvZiBpdHMgY29kZS5cbiAqXG4gKiBAcGFyYW0gbWFya2Rvd24gLSBUaGUgbWFya2Rvd24gZG9jdW1lbnQuXG4gKiBAcmV0dXJucyBUaGUgc25pcHBldHMsIGluIGRvY3VtZW50IG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdERvY3NTbmlwcGV0cyhtYXJrZG93bjogc3RyaW5nKTogRG9jc1NuaXBwZXRbXSB7XG4gIGNvbnN0IGxpbmVzID0gbWFya2Rvd24uc3BsaXQoL1xccj9cXG4vdSk7XG4gIGNvbnN0IHNuaXBwZXRzOiBEb2NzU25pcHBldFtdID0gW107XG4gIGxldCBvcGVuRmVuY2U6IG51bGwgfCBPcGVuRmVuY2UgPSBudWxsO1xuICBsZXQgY29kZUxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgcGVuZGluZ1NraXBSZWFzb246IG51bGwgfCBzdHJpbmcgPSBudWxsO1xuICBsZXQgcGVuZGluZ0NvbnRleHQ6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGxpbmVdIG9mIGxpbmVzLmVudHJpZXMoKSkge1xuICAgIGlmIChvcGVuRmVuY2UpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBzdHJpcFByZWZpeChsaW5lLCBvcGVuRmVuY2UucHJlZml4KTtcbiAgICAgIGlmIChjb250ZW50LnRyaW1FbmQoKSA9PT0gb3BlbkZlbmNlLmZlbmNlKSB7XG4gICAgICAgIGNvbnN0IGlzSmF2YVNjcmlwdCA9IENIRUNLRURfTEFOR1VBR0VTLmdldChvcGVuRmVuY2UubGFuZ3VhZ2UpO1xuICAgICAgICBpZiAoaXNKYXZhU2NyaXB0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBzbmlwcGV0cy5wdXNoKHtcbiAgICAgICAgICAgIGNvZGU6IGNvZGVMaW5lcy5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgIGNvZGVTdGFydExpbmU6IG9wZW5GZW5jZS5zdGFydExpbmUsXG4gICAgICAgICAgICBjb250ZXh0OiBvcGVuRmVuY2UuY29udGV4dC5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgIGlzSmF2YVNjcmlwdCxcbiAgICAgICAgICAgIGxhbmd1YWdlOiBvcGVuRmVuY2UubGFuZ3VhZ2UsXG4gICAgICAgICAgICBza2lwUmVhc29uOiBvcGVuRmVuY2Uuc2tpcFJlYXNvblxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIG9wZW5GZW5jZSA9IG51bGw7XG4gICAgICAgIGNvZGVMaW5lcyA9IFtdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29kZUxpbmVzLnB1c2goY29udGVudCk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmZW5jZU1hdGNoID0gL14oPzxwcmVmaXg+KD86XFxzKj4pKlxccyopKD88ZmVuY2U+YHszLH18fnszLH0pKD88bGFuZ3VhZ2U+W1xcdy1dKikvdS5leGVjKGxpbmUpO1xuICAgIGlmIChmZW5jZU1hdGNoPy5ncm91cHMpIHtcbiAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBFdmVyeSBncm91cCBvZiB0aGUgZmVuY2UgcGF0dGVybiB0YWtlcyBwYXJ0IGluIGEgbWF0Y2gsIHNvIHRoZSBmYWxsYmFja3MgbmV2ZXIgYXBwbHkuICovXG4gICAgICBvcGVuRmVuY2UgPSB7XG4gICAgICAgIGNvbnRleHQ6IHBlbmRpbmdDb250ZXh0LFxuICAgICAgICBmZW5jZTogZmVuY2VNYXRjaC5ncm91cHNbJ2ZlbmNlJ10gPz8gJycsXG4gICAgICAgIGxhbmd1YWdlOiAoZmVuY2VNYXRjaC5ncm91cHNbJ2xhbmd1YWdlJ10gPz8gJycpLnRvTG93ZXJDYXNlKCksXG4gICAgICAgIHByZWZpeDogZmVuY2VNYXRjaC5ncm91cHNbJ3ByZWZpeCddID8/ICcnLFxuICAgICAgICBza2lwUmVhc29uOiBwZW5kaW5nU2tpcFJlYXNvbixcbiAgICAgICAgc3RhcnRMaW5lOiBpbmRleCArIExJTkVfQUZURVJfRkVOQ0VfT0ZGU0VUXG4gICAgICB9O1xuICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICAgIHBlbmRpbmdTa2lwUmVhc29uID0gbnVsbDtcbiAgICAgIHBlbmRpbmdDb250ZXh0ID0gW107XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0ID0gbGluZS5yZXBsYWNlKC9eKD86XFxzKj4pKlxccyovdSwgJycpLnRyaW0oKTtcbiAgICBjb25zdCBtYXJrZXJNYXRjaCA9IE1BUktFUl9SRUdfRVhQLmV4ZWModGV4dCk7XG4gICAgY29uc3Qga2luZCA9IG1hcmtlck1hdGNoPy5ncm91cHM/Llsna2luZCddO1xuICAgIGNvbnN0IG1hcmtlclRleHQgPSAobWFya2VyTWF0Y2g/Lmdyb3Vwcz8uWyd0ZXh0J10gPz8gJycpLnRyaW0oKTtcbiAgICBpZiAoa2luZCA9PT0gJ3NraXAnKSB7XG4gICAgICBwZW5kaW5nU2tpcFJlYXNvbiA9IG1hcmtlclRleHQucmVwbGFjZSgvXlst4oCUOl1cXHMqL3UsICcnKTtcbiAgICB9IGVsc2UgaWYgKGtpbmQgPT09ICdjb250ZXh0Jykge1xuICAgICAgcGVuZGluZ0NvbnRleHQucHVzaChtYXJrZXJUZXh0KTtcbiAgICB9IGVsc2UgaWYgKHRleHQgIT09ICcnKSB7XG4gICAgICBwZW5kaW5nU2tpcFJlYXNvbiA9IG51bGw7XG4gICAgICBwZW5kaW5nQ29udGV4dCA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzbmlwcGV0cztcbn1cblxuLyoqXG4gKiBUeXBlLWNoZWNrcyBldmVyeSBzbmlwcGV0IG9mIHRoZSBndWlkZXMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgRmluZERvY3NTbmlwcGV0UHJvYmxlbXNQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIHByb2JsZW1zIGZvdW5kLCBlbXB0eSB3aGVuIGV2ZXJ5IHNuaXBwZXQgY29tcGlsZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRG9jc1NuaXBwZXRQcm9ibGVtcyhwYXJhbXM6IEZpbmREb2NzU25pcHBldFByb2JsZW1zUGFyYW1zKTogUHJvbWlzZTxEb2NzU25pcHBldFByb2JsZW1bXT4ge1xuICBjb25zdCByb290RGlyZWN0b3J5ID0gcmVzb2x2ZShwYXJhbXMucm9vdERpcmVjdG9yeSk7XG4gIGNvbnN0IGRvY3NEaXJlY3RvcnkgPSBqb2luKHJvb3REaXJlY3RvcnksIHBhcmFtcy5kb2NzRGlyZWN0b3J5ID8/ICdkb2NzL3NyYy9jb250ZW50L2RvY3MnKTtcbiAgY29uc3QgcHJvYmxlbXM6IERvY3NTbmlwcGV0UHJvYmxlbVtdID0gW107XG4gIGNvbnN0IHZpcnR1YWxGaWxlcyA9IG5ldyBNYXA8c3RyaW5nLCBWaXJ0dWFsU25pcHBldEZpbGU+KCk7XG4gIGNvbnN0IHJvb3ROYW1lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc25pcHBldHNEaXJlY3RvcnkgPSBqb2luKHJvb3REaXJlY3RvcnksICdkb2NzJywgJ19fc25pcHBldHNfXycpO1xuXG4gIGZ1bmN0aW9uIGFkZFZpcnR1YWxGaWxlKHBhdGg6IHN0cmluZywgZmlsZTogVmlydHVhbFNuaXBwZXRGaWxlKTogdm9pZCB7XG4gICAgdmlydHVhbEZpbGVzLnNldChub3JtYWxpemVQYXRoKHBhdGgpLCBmaWxlKTtcbiAgICByb290TmFtZXMucHVzaChwYXRoKTtcbiAgfVxuXG4gIGNvbnN0IHByZWx1ZGUgPSBwYXJhbXMucHJlbHVkZSA/PyAnJztcbiAgaWYgKHByZWx1ZGUgIT09ICcnKSB7XG4gICAgYWRkVmlydHVhbEZpbGUoam9pbihzbmlwcGV0c0RpcmVjdG9yeSwgJ3ByZWx1ZGUudHMnKSwgeyBjb2RlOiBwcmVsdWRlLCBjb2RlU3RhcnRMaW5lOiAxLCBjb250ZXh0TGluZUNvdW50OiAwLCBmaWxlUGF0aDogJzxwcmVsdWRlPicgfSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IGd1aWRlUGF0aCBvZiBhd2FpdCBsaXN0R3VpZGVzKGRvY3NEaXJlY3RvcnkpKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSB0b1Bvc2l4KHJlbGF0aXZlKHJvb3REaXJlY3RvcnksIGd1aWRlUGF0aCkpO1xuICAgIGNvbnN0IG1hcmtkb3duID0gYXdhaXQgcmVhZEZpbGUoZ3VpZGVQYXRoLCAndXRmLTgnKTtcbiAgICBmb3IgKGNvbnN0IHNuaXBwZXQgb2YgZXh0cmFjdERvY3NTbmlwcGV0cyhtYXJrZG93bikpIHtcbiAgICAgIGlmIChzbmlwcGV0LnNraXBSZWFzb24gPT09ICcnKSB7XG4gICAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICAgIGxpbmU6IHNuaXBwZXQuY29kZVN0YXJ0TGluZSAtIDEsXG4gICAgICAgICAgbWVzc2FnZTogJ0EgYHNuaXBwZXQtY2hlY2s6IHNraXBgIG1hcmtlciBtdXN0IGdpdmUgaXRzIHJlYXNvbi4nXG4gICAgICAgIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChzbmlwcGV0LnNraXBSZWFzb24gIT09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBleHRlbnNpb24gPSBzbmlwcGV0LmlzSmF2YVNjcmlwdCA/ICdqcycgOiAndHMnO1xuICAgICAgY29uc3QgYmFzZU5hbWUgPSBgJHt0b1Bvc2l4KHJlbGF0aXZlKGRvY3NEaXJlY3RvcnksIGd1aWRlUGF0aCkpLnJlcGxhY2VBbGwoJy8nLCAnX18nKX0uTCR7U3RyaW5nKHNuaXBwZXQuY29kZVN0YXJ0TGluZSl9LiR7ZXh0ZW5zaW9ufWA7XG4gICAgICBjb25zdCBjb250ZXh0ID0gc25pcHBldC5jb250ZXh0ID09PSAnJyA/ICcnIDogYCR7c25pcHBldC5jb250ZXh0fVxcbmA7XG4gICAgICBhZGRWaXJ0dWFsRmlsZShqb2luKHNuaXBwZXRzRGlyZWN0b3J5LCBiYXNlTmFtZSksIHtcbiAgICAgICAgY29kZTogYCR7Y29udGV4dH0ke3NuaXBwZXQuY29kZX1cXG5leHBvcnQge307XFxuYCxcbiAgICAgICAgY29kZVN0YXJ0TGluZTogc25pcHBldC5jb2RlU3RhcnRMaW5lLFxuICAgICAgICBjb250ZXh0TGluZUNvdW50OiBjb250ZXh0ID09PSAnJyA/IDAgOiBjb250ZXh0LnNwbGl0KCdcXG4nKS5sZW5ndGggLSAxLFxuICAgICAgICBmaWxlUGF0aFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvYmxlbXMucHVzaCguLi5jb21waWxlU25pcHBldHMoeyBjb21waWxlck9wdGlvbnM6IHBhcmFtcy5jb21waWxlck9wdGlvbnMgPz8ge30sIHJvb3REaXJlY3RvcnksIHJvb3ROYW1lcywgdmlydHVhbEZpbGVzIH0pKTtcbiAgcmV0dXJuIHByb2JsZW1zO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgcHJvYmxlbXMgb25lIHBlciBsaW5lLCBhcyBgcGF0aDpsaW5lIC0gbWVzc2FnZWAuXG4gKlxuICogQHBhcmFtIHByb2JsZW1zIC0gVGhlIHByb2JsZW1zLlxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCB0ZXh0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RG9jc1NuaXBwZXRQcm9ibGVtcyhwcm9ibGVtczogcmVhZG9ubHkgRG9jc1NuaXBwZXRQcm9ibGVtW10pOiBzdHJpbmcge1xuICByZXR1cm4gcHJvYmxlbXMubWFwKChwcm9ibGVtKSA9PiBgJHtwcm9ibGVtLmZpbGVQYXRofToke1N0cmluZyhwcm9ibGVtLmxpbmUpfSAtICR7cHJvYmxlbS5tZXNzYWdlfWApLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiBjb21waWxlU25pcHBldHMocGFyYW1zOiBDb21waWxlU25pcHBldHNQYXJhbXMpOiBEb2NzU25pcHBldFByb2JsZW1bXSB7XG4gIGNvbnN0IHsgcm9vdERpcmVjdG9yeSwgcm9vdE5hbWVzLCB2aXJ0dWFsRmlsZXMgfSA9IHBhcmFtcztcbiAgY29uc3QgY29uZmlnUGF0aCA9IGpvaW4ocm9vdERpcmVjdG9yeSwgJ3RzY29uZmlnLmpzb24nKTtcbiAgY29uc3QgcGFyc2VkID0gZ2V0UGFyc2VkQ29tbWFuZExpbmVPZkNvbmZpZ0ZpbGUoY29uZmlnUGF0aCwge30sIHtcbiAgICAuLi5zeXMsXG4gICAgb25VblJlY292ZXJhYmxlQ29uZmlnRmlsZURpYWdub3N0aWMoZGlhZ25vc3RpYykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGZsYXR0ZW5EaWFnbm9zdGljTWVzc2FnZVRleHQoZGlhZ25vc3RpYy5tZXNzYWdlVGV4dCwgJ1xcbicpKTtcbiAgICB9XG4gIH0pO1xuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQW4gdW5yZWFkYWJsZSBjb25maWd1cmF0aW9uIHRocm93cyBpbiB0aGUgaGFuZGxlciBhYm92ZSBiZWZvcmUgdGhpcyBjYW4gYmUgcmVhY2hlZC4gKi9cbiAgaWYgKCFwYXJzZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZWFkICR7Y29uZmlnUGF0aH1gKTtcbiAgfVxuICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG4gIGNvbnN0IGNvbXBpbGVyT3B0aW9uczogQ29tcGlsZXJPcHRpb25zID0ge1xuICAgIC4uLnBhcnNlZC5vcHRpb25zLFxuICAgIC4uLnBhcmFtcy5jb21waWxlck9wdGlvbnMsXG4gICAgYWxsb3dKczogdHJ1ZSxcbiAgICBjaGVja0pzOiB0cnVlLFxuICAgIGNvbXBvc2l0ZTogZmFsc2UsXG4gICAgaW5jcmVtZW50YWw6IGZhbHNlLFxuICAgIG5vRW1pdDogdHJ1ZSxcbiAgICBub1VudXNlZExvY2FsczogZmFsc2UsXG4gICAgbm9VbnVzZWRQYXJhbWV0ZXJzOiBmYWxzZVxuICB9O1xuICBkZWxldGUgY29tcGlsZXJPcHRpb25zLnRzQnVpbGRJbmZvRmlsZTtcblxuICBjb25zdCBob3N0ID0gY3JlYXRlQ29tcGlsZXJIb3N0KGNvbXBpbGVyT3B0aW9ucywgdHJ1ZSk7XG4gIGNvbnN0IG9yaWdpbmFsR2V0U291cmNlRmlsZSA9IGhvc3QuZ2V0U291cmNlRmlsZS5iaW5kKGhvc3QpO1xuICBjb25zdCBvcmlnaW5hbEZpbGVFeGlzdHMgPSBob3N0LmZpbGVFeGlzdHMuYmluZChob3N0KTtcbiAgY29uc3Qgb3JpZ2luYWxSZWFkRmlsZSA9IGhvc3QucmVhZEZpbGUuYmluZChob3N0KTtcbiAgaG9zdC5maWxlRXhpc3RzID0gKGZpbGVOYW1lKTogYm9vbGVhbiA9PiB2aXJ0dWFsRmlsZXMuaGFzKG5vcm1hbGl6ZVBhdGgoZmlsZU5hbWUpKSB8fCBvcmlnaW5hbEZpbGVFeGlzdHMoZmlsZU5hbWUpO1xuICBob3N0LnJlYWRGaWxlID0gKGZpbGVOYW1lKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHZpcnR1YWxGaWxlcy5nZXQobm9ybWFsaXplUGF0aChmaWxlTmFtZSkpPy5jb2RlID8/IG9yaWdpbmFsUmVhZEZpbGUoZmlsZU5hbWUpO1xuICBob3N0LmdldFNvdXJjZUZpbGUgPSAoZmlsZU5hbWUsIGxhbmd1YWdlVmVyc2lvbk9yT3B0aW9ucywgb25FcnJvciwgc2hvdWxkQ3JlYXRlTmV3U291cmNlRmlsZSk6IFNvdXJjZUZpbGUgfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IHZpcnR1YWxGaWxlID0gdmlydHVhbEZpbGVzLmdldChub3JtYWxpemVQYXRoKGZpbGVOYW1lKSk7XG4gICAgaWYgKHZpcnR1YWxGaWxlKSB7XG4gICAgICBjb25zdCBzY3JpcHRLaW5kID0gZmlsZU5hbWUuZW5kc1dpdGgoJy5qcycpID8gU2NyaXB0S2luZC5KUyA6IFNjcmlwdEtpbmQuVFM7XG4gICAgICByZXR1cm4gY3JlYXRlU291cmNlRmlsZShmaWxlTmFtZSwgdmlydHVhbEZpbGUuY29kZSwgbGFuZ3VhZ2VWZXJzaW9uT3JPcHRpb25zLCB0cnVlLCBzY3JpcHRLaW5kKTtcbiAgICB9XG4gICAgcmV0dXJuIG9yaWdpbmFsR2V0U291cmNlRmlsZShmaWxlTmFtZSwgbGFuZ3VhZ2VWZXJzaW9uT3JPcHRpb25zLCBvbkVycm9yLCBzaG91bGRDcmVhdGVOZXdTb3VyY2VGaWxlKTtcbiAgfTtcblxuICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUHJvZ3JhbSh7IGhvc3QsIG9wdGlvbnM6IGNvbXBpbGVyT3B0aW9ucywgcm9vdE5hbWVzIH0pO1xuICBjb25zdCBwcm9ibGVtczogRG9jc1NuaXBwZXRQcm9ibGVtW10gPSBbXTtcbiAgZm9yIChjb25zdCByb290TmFtZSBvZiByb290TmFtZXMpIHtcbiAgICBjb25zdCBzb3VyY2VGaWxlID0gcHJvZ3JhbS5nZXRTb3VyY2VGaWxlKHJvb3ROYW1lKTtcbiAgICBjb25zdCB2aXJ0dWFsRmlsZSA9IHZpcnR1YWxGaWxlcy5nZXQobm9ybWFsaXplUGF0aChyb290TmFtZSkpO1xuICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBFdmVyeSByb290IG5hbWUgaXMgYSB2aXJ0dWFsIGZpbGUgdGhlIHByb2dyYW0gd2FzIGJ1aWx0IGZyb20uICovXG4gICAgaWYgKCFzb3VyY2VGaWxlIHx8ICF2aXJ0dWFsRmlsZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgY29uc3QgaXNKYXZhU2NyaXB0ID0gcm9vdE5hbWUuZW5kc1dpdGgoJy5qcycpO1xuICAgIGNvbnN0IGRpYWdub3N0aWNzID0gWy4uLnByb2dyYW0uZ2V0U3ludGFjdGljRGlhZ25vc3RpY3Moc291cmNlRmlsZSksIC4uLnByb2dyYW0uZ2V0U2VtYW50aWNEaWFnbm9zdGljcyhzb3VyY2VGaWxlKV07XG4gICAgZm9yIChjb25zdCBkaWFnbm9zdGljIG9mIGRpYWdub3N0aWNzKSB7XG4gICAgICBpZiAoSUdOT1JFRF9ESUFHTk9TVElDX0NPREVTLmhhcyhkaWFnbm9zdGljLmNvZGUpIHx8IChpc0phdmFTY3JpcHQgJiYgSkFWQVNDUklQVF9JR05PUkVEX0RJQUdOT1NUSUNfQ09ERVMuaGFzKGRpYWdub3N0aWMuY29kZSkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLyogdjggaWdub3JlIG5leHQgLS0gQSBkaWFnbm9zdGljIG9mIG9uZSBzb3VyY2UgZmlsZSBhbHdheXMgY2FycmllcyBpdHMgcG9zaXRpb24uICovXG4gICAgICBjb25zdCBmaWxlTGluZSA9IGRpYWdub3N0aWMuc3RhcnQgPT09IHVuZGVmaW5lZCA/IDAgOiBzb3VyY2VGaWxlLmdldExpbmVBbmRDaGFyYWN0ZXJPZlBvc2l0aW9uKGRpYWdub3N0aWMuc3RhcnQpLmxpbmU7XG4gICAgICBjb25zdCBzbmlwcGV0TGluZSA9IE1hdGgubWF4KDAsIGZpbGVMaW5lIC0gdmlydHVhbEZpbGUuY29udGV4dExpbmVDb3VudCk7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtcbiAgICAgICAgZmlsZVBhdGg6IHZpcnR1YWxGaWxlLmZpbGVQYXRoLFxuICAgICAgICBsaW5lOiB2aXJ0dWFsRmlsZS5jb2RlU3RhcnRMaW5lICsgc25pcHBldExpbmUsXG4gICAgICAgIG1lc3NhZ2U6IGBUUyR7U3RyaW5nKGRpYWdub3N0aWMuY29kZSl9OiAke2ZsYXR0ZW5EaWFnbm9zdGljTWVzc2FnZVRleHQoZGlhZ25vc3RpYy5tZXNzYWdlVGV4dCwgJyAnKX1gXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHByb2JsZW1zO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0R3VpZGVzKGRpcmVjdG9yeTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBndWlkZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZW50cnkgb2YgYXdhaXQgcmVhZGRpcihkaXJlY3RvcnksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgIGNvbnN0IGVudHJ5UGF0aCA9IGpvaW4oZGlyZWN0b3J5LCBlbnRyeS5uYW1lKTtcbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgaWYgKGVudHJ5Lm5hbWUgIT09ICdhcGknKSB7XG4gICAgICAgIGd1aWRlcy5wdXNoKC4uLmF3YWl0IGxpc3RHdWlkZXMoZW50cnlQYXRoKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICgvXFwubWR4PyQvdS50ZXN0KGVudHJ5Lm5hbWUpKSB7XG4gICAgICBndWlkZXMucHVzaChlbnRyeVBhdGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZ3VpZGVzLnNvcnQoKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdG9Qb3NpeChyZXNvbHZlKHBhdGgpKS50b0xvd2VyQ2FzZSgpO1xufVxuXG5mdW5jdGlvbiBzdHJpcFByZWZpeChsaW5lOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGxpbmUuc3RhcnRzV2l0aChwcmVmaXgpID8gbGluZS5zbGljZShwcmVmaXgubGVuZ3RoKSA6IGxpbmUucmVwbGFjZSgvXig/Olxccyo+KSpcXHM/L3UsICcnKTtcbn1cblxuZnVuY3Rpb24gdG9Qb3NpeChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBOEJBLHNCQUdPO0FBQ1AsdUJBSU87QUFDUCx3QkFRTztBQUtQLE1BQU0sb0JBQWtELG9CQUFJLElBQUk7QUFBQSxFQUM5RCxDQUFDLGNBQWMsSUFBSTtBQUFBLEVBQ25CLENBQUMsTUFBTSxJQUFJO0FBQUEsRUFDWCxDQUFDLE1BQU0sS0FBSztBQUFBLEVBQ1osQ0FBQyxjQUFjLEtBQUs7QUFDdEIsQ0FBQztBQUtELE1BQU0sMEJBQTBCO0FBRWhDLE1BQU0saUJBQWlCO0FBS3ZCLE1BQU0sMkNBQTJDO0FBQ2pELE1BQU0sZ0NBQWdDO0FBQ3RDLE1BQU0scUNBQXFDO0FBQzNDLE1BQU0sOENBQThDO0FBQ3BELE1BQU0sMkJBQTJCLG9CQUFJLElBQUk7QUFBQSxFQUN2QztBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGLENBQUM7QUFNRCxNQUFNLHFDQUFxQztBQUMz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
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.cts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Extracts the code snippets of a package's documentation guides and type-checks them against its sources.
|
|
6
|
+
*
|
|
7
|
+
* A guide's snippet is code a reader copies, so a renamed member or a stale import path in it is a bug that ships
|
|
8
|
+
* to the site with every check green. Every fenced `ts`, `typescript`, `js` or `javascript` block in
|
|
9
|
+
* `docs/src/content/docs` is compiled as its own module, with the project's `tsconfig.json`, so an import of the
|
|
10
|
+
* package's own name resolves wherever that configuration sends it (its `paths`, or the `compilerOptions` passed
|
|
11
|
+
* here) and a wrong name fails. A `ts` / `typescript` block is compiled as TypeScript; a `js` / `javascript` block,
|
|
12
|
+
* often a devtools-console recipe, is compiled as JavaScript with `checkJs`, so a wrong member of a typed object
|
|
13
|
+
* still fails while an untyped lookup does not. The generated API reference (`docs/src/content/docs/api`) is
|
|
14
|
+
* skipped: it is rendered from the TSDoc.
|
|
15
|
+
*
|
|
16
|
+
* Three things shape what a snippet is compiled with, each but the first written in the guide as an HTML comment,
|
|
17
|
+
* invisible on the site, on the lines right above the fence:
|
|
18
|
+
*
|
|
19
|
+
* - The names every guide may use without declaring them are the package's `prelude`, compiled as a module of its
|
|
20
|
+
* own (a `declare global` block, with the imports it needs).
|
|
21
|
+
* - `<!-- snippet-check: context <TypeScript> -->` prepends declarations to that one snippet, for the names its
|
|
22
|
+
* prose has already introduced (`declare const linkEl: HTMLAnchorElement;`). Several such lines add up.
|
|
23
|
+
* - `<!-- snippet-check: skip <reason> -->` exempts a snippet that is deliberately not compilable, such as
|
|
24
|
+
* pseudo-code. The reason is required, so a skip is a decision somebody wrote down, never a silent hole.
|
|
25
|
+
*/
|
|
26
|
+
import type { CompilerOptions } from 'typescript' with { 'resolution-mode': 'import' };
|
|
27
|
+
/**
|
|
28
|
+
* Parameters for {@link assertDocsSnippetsCompile}: the same as {@link findDocsSnippetProblems} takes.
|
|
29
|
+
*/
|
|
30
|
+
export type AssertDocsSnippetsCompileParams = FindDocsSnippetProblemsParams;
|
|
31
|
+
/**
|
|
32
|
+
* One fenced code block of a guide.
|
|
33
|
+
*/
|
|
34
|
+
export interface DocsSnippet {
|
|
35
|
+
/**
|
|
36
|
+
* The code, with any blockquote or indentation prefix of the fence stripped.
|
|
37
|
+
*/
|
|
38
|
+
readonly code: string;
|
|
39
|
+
/**
|
|
40
|
+
* The 1-based line of the guide on which the code starts (the line after the opening fence).
|
|
41
|
+
*/
|
|
42
|
+
readonly codeStartLine: number;
|
|
43
|
+
/**
|
|
44
|
+
* The declarations of the `snippet-check: context` markers above the fence, joined by newlines.
|
|
45
|
+
*/
|
|
46
|
+
readonly context: string;
|
|
47
|
+
/**
|
|
48
|
+
* Whether the snippet is JavaScript rather than TypeScript.
|
|
49
|
+
*/
|
|
50
|
+
readonly isJavaScript: boolean;
|
|
51
|
+
/**
|
|
52
|
+
* The language of the fence.
|
|
53
|
+
*/
|
|
54
|
+
readonly language: string;
|
|
55
|
+
/**
|
|
56
|
+
* The reason given by a `snippet-check: skip` marker, or `null` when the snippet is checked.
|
|
57
|
+
*/
|
|
58
|
+
readonly skipReason: null | string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* A problem found in a guide's snippet.
|
|
62
|
+
*/
|
|
63
|
+
export interface DocsSnippetProblem {
|
|
64
|
+
/**
|
|
65
|
+
* The guide's path, relative to the package root.
|
|
66
|
+
*/
|
|
67
|
+
readonly filePath: string;
|
|
68
|
+
/**
|
|
69
|
+
* The 1-based line of the guide.
|
|
70
|
+
*/
|
|
71
|
+
readonly line: number;
|
|
72
|
+
/**
|
|
73
|
+
* What is wrong.
|
|
74
|
+
*/
|
|
75
|
+
readonly message: string;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Parameters for {@link findDocsSnippetProblems}.
|
|
79
|
+
*/
|
|
80
|
+
export interface FindDocsSnippetProblemsParams {
|
|
81
|
+
/**
|
|
82
|
+
* Compiler options laid over the ones `tsconfig.json` gives, for instance `paths` that resolve the package's own
|
|
83
|
+
* name onto its sources when its `tsconfig.json` has none. A relative path in them is not resolved, so pass
|
|
84
|
+
* absolute ones.
|
|
85
|
+
*/
|
|
86
|
+
readonly compilerOptions?: CompilerOptions;
|
|
87
|
+
/**
|
|
88
|
+
* The guides directory, relative to {@link FindDocsSnippetProblemsParams.rootDirectory}.
|
|
89
|
+
*
|
|
90
|
+
* @default `'docs/src/content/docs'`
|
|
91
|
+
*/
|
|
92
|
+
readonly docsDirectory?: string;
|
|
93
|
+
/**
|
|
94
|
+
* The ambient context every snippet is compiled with: the names a guide may use without declaring them, written as
|
|
95
|
+
* a module (`declare global { ... }`, with the imports it needs).
|
|
96
|
+
*
|
|
97
|
+
* @default `''`, no prelude.
|
|
98
|
+
*/
|
|
99
|
+
readonly prelude?: string;
|
|
100
|
+
/**
|
|
101
|
+
* The package root, holding `tsconfig.json`.
|
|
102
|
+
*/
|
|
103
|
+
readonly rootDirectory: string;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Type-checks every snippet of the guides and throws when one fails, for a `docs:check-snippets` script.
|
|
107
|
+
*
|
|
108
|
+
* @param params - The {@link AssertDocsSnippetsCompileParams}.
|
|
109
|
+
* @returns A promise that resolves when every snippet compiles.
|
|
110
|
+
* @throws {Error} Listing every problem, one per line.
|
|
111
|
+
*/
|
|
112
|
+
export declare function assertDocsSnippetsCompile(params: AssertDocsSnippetsCompileParams): Promise<void>;
|
|
113
|
+
/**
|
|
114
|
+
* Extracts the fenced code blocks of the checked languages from a markdown document.
|
|
115
|
+
*
|
|
116
|
+
* A fence inside a blockquote or a list item is recognized too: its prefix (`> `, indentation) is stripped from
|
|
117
|
+
* every line of its code.
|
|
118
|
+
*
|
|
119
|
+
* @param markdown - The markdown document.
|
|
120
|
+
* @returns The snippets, in document order.
|
|
121
|
+
*/
|
|
122
|
+
export declare function extractDocsSnippets(markdown: string): DocsSnippet[];
|
|
123
|
+
/**
|
|
124
|
+
* Type-checks every snippet of the guides.
|
|
125
|
+
*
|
|
126
|
+
* @param params - The {@link FindDocsSnippetProblemsParams}.
|
|
127
|
+
* @returns The problems found, empty when every snippet compiles.
|
|
128
|
+
*/
|
|
129
|
+
export declare function findDocsSnippetProblems(params: FindDocsSnippetProblemsParams): Promise<DocsSnippetProblem[]>;
|
|
130
|
+
/**
|
|
131
|
+
* Formats problems one per line, as `path:line - message`.
|
|
132
|
+
*
|
|
133
|
+
* @param problems - The problems.
|
|
134
|
+
* @returns The formatted text.
|
|
135
|
+
*/
|
|
136
|
+
export declare function formatDocsSnippetProblems(problems: readonly DocsSnippetProblem[]): string;
|
|
@@ -51,10 +51,12 @@ __export(docs_site_exports, {
|
|
|
51
51
|
"docs-site-assets": () => docs_site_assets,
|
|
52
52
|
"docs-site-commands": () => docs_site_commands,
|
|
53
53
|
"docs-site-config": () => docs_site_config,
|
|
54
|
+
"docs-snippets": () => docs_snippets,
|
|
54
55
|
"link-check": () => link_check,
|
|
55
56
|
"og-image": () => og_image,
|
|
56
57
|
"og-image-page": () => og_image_page,
|
|
57
58
|
"og-images": () => og_images,
|
|
59
|
+
"outdated-references": () => outdated_references,
|
|
58
60
|
"repo-homepage": () => repo_homepage,
|
|
59
61
|
"route-data": () => route_data,
|
|
60
62
|
"satteri-github-alerts": () => satteri_github_alerts,
|
|
@@ -80,10 +82,12 @@ var docs_links = __toESM(((module) => module && module.__esModule && 'default' i
|
|
|
80
82
|
var docs_site_assets = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./docs-site-assets.cjs')), 1);
|
|
81
83
|
var docs_site_commands = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./docs-site-commands.cjs')), 1);
|
|
82
84
|
var docs_site_config = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./docs-site-config.cjs')), 1);
|
|
85
|
+
var docs_snippets = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./docs-snippets.cjs')), 1);
|
|
83
86
|
var link_check = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./link-check.cjs')), 1);
|
|
84
87
|
var og_image_page = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./og-image-page.cjs')), 1);
|
|
85
88
|
var og_image = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./og-image.cjs')), 1);
|
|
86
89
|
var og_images = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./og-images.cjs')), 1);
|
|
90
|
+
var outdated_references = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./outdated-references.cjs')), 1);
|
|
87
91
|
var repo_homepage = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./repo-homepage.cjs')), 1);
|
|
88
92
|
var route_data = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./route-data.cjs')), 1);
|
|
89
93
|
var satteri_github_alerts = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./satteri-github-alerts.cjs')), 1);
|
|
@@ -109,14 +113,16 @@ var unrendered_alerts = __toESM(((module) => module && module.__esModule && 'def
|
|
|
109
113
|
"docs-site-assets": null,
|
|
110
114
|
"docs-site-commands": null,
|
|
111
115
|
"docs-site-config": null,
|
|
116
|
+
"docs-snippets": null,
|
|
112
117
|
"link-check": null,
|
|
113
118
|
"og-image": null,
|
|
114
119
|
"og-image-page": null,
|
|
115
120
|
"og-images": null,
|
|
121
|
+
"outdated-references": null,
|
|
116
122
|
"repo-homepage": null,
|
|
117
123
|
"route-data": null,
|
|
118
124
|
"satteri-github-alerts": null,
|
|
119
125
|
"satteri-relative-links": null,
|
|
120
126
|
"unrendered-alerts": null
|
|
121
127
|
});
|
|
122
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
128
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2RvY3Mtc2l0ZS9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdhcGktZG9jLWNvbnN0YW50cycgZnJvbSAnLi9hcGktZG9jLWNvbnN0YW50cy50cyc7XG5leHBvcnQgKiBhcyAnYXBpLWRvYy1kb2N1bWVudGVkLWZpbGVzJyBmcm9tICcuL2FwaS1kb2MtZG9jdW1lbnRlZC1maWxlcy50cyc7XG5leHBvcnQgKiBhcyAnYXBpLWRvYy1qc2RvYycgZnJvbSAnLi9hcGktZG9jLWpzZG9jLnRzJztcbmV4cG9ydCAqIGFzICdhcGktZG9jLWxpbmstcmVuZGVyaW5nJyBmcm9tICcuL2FwaS1kb2MtbGluay1yZW5kZXJpbmcudHMnO1xuZXhwb3J0ICogYXMgJ2FwaS1kb2MtcGFja2FnZS1zaXRlcycgZnJvbSAnLi9hcGktZG9jLXBhY2thZ2Utc2l0ZXMudHMnO1xuZXhwb3J0ICogYXMgJ2FwaS1kb2MtcGFnZS1nZW5lcmF0aW9uJyBmcm9tICcuL2FwaS1kb2MtcGFnZS1nZW5lcmF0aW9uLnRzJztcbmV4cG9ydCAqIGFzICdhcGktZG9jLXJvdXRlLXNlZ21lbnRzJyBmcm9tICcuL2FwaS1kb2Mtcm91dGUtc2VnbWVudHMudHMnO1xuZXhwb3J0ICogYXMgJ2FwaS1kb2Mtc2V0dGluZ3MnIGZyb20gJy4vYXBpLWRvYy1zZXR0aW5ncy50cyc7XG5leHBvcnQgKiBhcyAnYXBpLWRvYy1zb3VyY2UtcHJvY2Vzc2luZycgZnJvbSAnLi9hcGktZG9jLXNvdXJjZS1wcm9jZXNzaW5nLnRzJztcbmV4cG9ydCAqIGFzICdhcGktZG9jLXRleHQtdXRpbHMnIGZyb20gJy4vYXBpLWRvYy10ZXh0LXV0aWxzLnRzJztcbmV4cG9ydCAqIGFzICdhcGktZG9jLXR5cGUtbWVyZ2luZycgZnJvbSAnLi9hcGktZG9jLXR5cGUtbWVyZ2luZy50cyc7XG5leHBvcnQgKiBhcyAnYXBpLWRvYy10eXBlcycgZnJvbSAnLi9hcGktZG9jLXR5cGVzLnRzJztcbmV4cG9ydCAqIGFzICdhcGktZG9jcycgZnJvbSAnLi9hcGktZG9jcy50cyc7XG5leHBvcnQgKiBhcyAnYXN0cm8tY29uZmlnJyBmcm9tICcuL2FzdHJvLWNvbmZpZy50cyc7XG5leHBvcnQgKiBhcyAnZG9jcy1saW5rcycgZnJvbSAnLi9kb2NzLWxpbmtzLnRzJztcbmV4cG9ydCAqIGFzICdkb2NzLXNpdGUtYXNzZXRzJyBmcm9tICcuL2RvY3Mtc2l0ZS1hc3NldHMudHMnO1xuZXhwb3J0ICogYXMgJ2RvY3Mtc2l0ZS1jb21tYW5kcycgZnJvbSAnLi9kb2NzLXNpdGUtY29tbWFuZHMudHMnO1xuZXhwb3J0ICogYXMgJ2RvY3Mtc2l0ZS1jb25maWcnIGZyb20gJy4vZG9jcy1zaXRlLWNvbmZpZy50cyc7XG5leHBvcnQgKiBhcyAnZG9jcy1zbmlwcGV0cycgZnJvbSAnLi9kb2NzLXNuaXBwZXRzLnRzJztcbmV4cG9ydCAqIGFzICdsaW5rLWNoZWNrJyBmcm9tICcuL2xpbmstY2hlY2sudHMnO1xuZXhwb3J0ICogYXMgJ29nLWltYWdlLXBhZ2UnIGZyb20gJy4vb2ctaW1hZ2UtcGFnZS50cyc7XG5leHBvcnQgKiBhcyAnb2ctaW1hZ2UnIGZyb20gJy4vb2ctaW1hZ2UudHMnO1xuZXhwb3J0ICogYXMgJ29nLWltYWdlcycgZnJvbSAnLi9vZy1pbWFnZXMudHMnO1xuZXhwb3J0ICogYXMgJ291dGRhdGVkLXJlZmVyZW5jZXMnIGZyb20gJy4vb3V0ZGF0ZWQtcmVmZXJlbmNlcy50cyc7XG5leHBvcnQgKiBhcyAncmVwby1ob21lcGFnZScgZnJvbSAnLi9yZXBvLWhvbWVwYWdlLnRzJztcbmV4cG9ydCAqIGFzICdyb3V0ZS1kYXRhJyBmcm9tICcuL3JvdXRlLWRhdGEudHMnO1xuZXhwb3J0ICogYXMgJ3NhdHRlcmktZ2l0aHViLWFsZXJ0cycgZnJvbSAnLi9zYXR0ZXJpLWdpdGh1Yi1hbGVydHMudHMnO1xuZXhwb3J0ICogYXMgJ3NhdHRlcmktcmVsYXRpdmUtbGlua3MnIGZyb20gJy4vc2F0dGVyaS1yZWxhdGl2ZS1saW5rcy50cyc7XG5leHBvcnQgKiBhcyAndW5yZW5kZXJlZC1hbGVydHMnIGZyb20gJy4vdW5yZW5kZXJlZC1hbGVydHMudHMnO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBLDZCQUFBQTtBQUFBLEVBQUEsa0NBQUFDO0FBQUEsRUFBQSx1QkFBQUM7QUFBQSxFQUFBLGdDQUFBQztBQUFBLEVBQUEsK0JBQUFDO0FBQUEsRUFBQSxpQ0FBQUM7QUFBQSxFQUFBLGdDQUFBQztBQUFBLEVBQUEsMEJBQUFDO0FBQUEsRUFBQSxtQ0FBQUM7QUFBQSxFQUFBLDRCQUFBQztBQUFBLEVBQUEsOEJBQUFDO0FBQUEsRUFBQSx1QkFBQUM7QUFBQSxFQUFBLGtCQUFBQztBQUFBLEVBQUEsc0JBQUFDO0FBQUEsRUFBQSxvQkFBQUM7QUFBQSxFQUFBLDBCQUFBQztBQUFBLEVBQUEsNEJBQUFDO0FBQUEsRUFBQSwwQkFBQUM7QUFBQSxFQUFBLHVCQUFBQztBQUFBLEVBQUEsb0JBQUFDO0FBQUEsRUFBQSxrQkFBQUM7QUFBQSxFQUFBLHVCQUFBQztBQUFBLEVBQUEsbUJBQUFDO0FBQUEsRUFBQSw2QkFBQUM7QUFBQSxFQUFBLHVCQUFBQztBQUFBLEVBQUEsb0JBQUFDO0FBQUEsRUFBQSwrQkFBQUM7QUFBQSxFQUFBLGdDQUFBQztBQUFBLEVBQUEsMkJBQUFDO0FBQUE7QUFBQTtBQUVBLElBQUE1QixvQkFBcUM7QUFDckMsSUFBQUMsMkJBQTRDO0FBQzVDLElBQUFDLGdCQUFpQztBQUNqQyxJQUFBQyx5QkFBMEM7QUFDMUMsSUFBQUMsd0JBQXlDO0FBQ3pDLElBQUFDLDBCQUEyQztBQUMzQyxJQUFBQyx5QkFBMEM7QUFDMUMsSUFBQUMsbUJBQW9DO0FBQ3BDLElBQUFDLDRCQUE2QztBQUM3QyxJQUFBQyxxQkFBc0M7QUFDdEMsSUFBQUMsdUJBQXdDO0FBQ3hDLElBQUFDLGdCQUFpQztBQUNqQyxJQUFBQyxXQUE0QjtBQUM1QixJQUFBQyxlQUFnQztBQUNoQyxJQUFBQyxhQUE4QjtBQUM5QixJQUFBQyxtQkFBb0M7QUFDcEMsSUFBQUMscUJBQXNDO0FBQ3RDLElBQUFDLG1CQUFvQztBQUNwQyxJQUFBQyxnQkFBaUM7QUFDakMsSUFBQUMsYUFBOEI7QUFDOUIsSUFBQUUsZ0JBQWlDO0FBQ2pDLElBQUFELFdBQTRCO0FBQzVCLElBQUFFLFlBQTZCO0FBQzdCLElBQUFDLHNCQUF1QztBQUN2QyxJQUFBQyxnQkFBaUM7QUFDakMsSUFBQUMsYUFBOEI7QUFDOUIsSUFBQUMsd0JBQXlDO0FBQ3pDLElBQUFDLHlCQUEwQztBQUMxQyxJQUFBQyxvQkFBcUM7IiwKICAibmFtZXMiOiBbImFwaS1kb2MtY29uc3RhbnRzIiwgImFwaS1kb2MtZG9jdW1lbnRlZC1maWxlcyIsICJhcGktZG9jLWpzZG9jIiwgImFwaS1kb2MtbGluay1yZW5kZXJpbmciLCAiYXBpLWRvYy1wYWNrYWdlLXNpdGVzIiwgImFwaS1kb2MtcGFnZS1nZW5lcmF0aW9uIiwgImFwaS1kb2Mtcm91dGUtc2VnbWVudHMiLCAiYXBpLWRvYy1zZXR0aW5ncyIsICJhcGktZG9jLXNvdXJjZS1wcm9jZXNzaW5nIiwgImFwaS1kb2MtdGV4dC11dGlscyIsICJhcGktZG9jLXR5cGUtbWVyZ2luZyIsICJhcGktZG9jLXR5cGVzIiwgImFwaS1kb2NzIiwgImFzdHJvLWNvbmZpZyIsICJkb2NzLWxpbmtzIiwgImRvY3Mtc2l0ZS1hc3NldHMiLCAiZG9jcy1zaXRlLWNvbW1hbmRzIiwgImRvY3Mtc2l0ZS1jb25maWciLCAiZG9jcy1zbmlwcGV0cyIsICJsaW5rLWNoZWNrIiwgIm9nLWltYWdlIiwgIm9nLWltYWdlLXBhZ2UiLCAib2ctaW1hZ2VzIiwgIm91dGRhdGVkLXJlZmVyZW5jZXMiLCAicmVwby1ob21lcGFnZSIsICJyb3V0ZS1kYXRhIiwgInNhdHRlcmktZ2l0aHViLWFsZXJ0cyIsICJzYXR0ZXJpLXJlbGF0aXZlLWxpbmtzIiwgInVucmVuZGVyZWQtYWxlcnRzIl0KfQo=
|
|
@@ -17,10 +17,12 @@ export * as 'docs-links' from './docs-links.cjs';
|
|
|
17
17
|
export * as 'docs-site-assets' from './docs-site-assets.cjs';
|
|
18
18
|
export * as 'docs-site-commands' from './docs-site-commands.cjs';
|
|
19
19
|
export * as 'docs-site-config' from './docs-site-config.cjs';
|
|
20
|
+
export * as 'docs-snippets' from './docs-snippets.cjs';
|
|
20
21
|
export * as 'link-check' from './link-check.cjs';
|
|
21
22
|
export * as 'og-image-page' from './og-image-page.cjs';
|
|
22
23
|
export * as 'og-image' from './og-image.cjs';
|
|
23
24
|
export * as 'og-images' from './og-images.cjs';
|
|
25
|
+
export * as 'outdated-references' from './outdated-references.cjs';
|
|
24
26
|
export * as 'repo-homepage' from './repo-homepage.cjs';
|
|
25
27
|
export * as 'route-data' from './route-data.cjs';
|
|
26
28
|
export * as 'satteri-github-alerts' from './satteri-github-alerts.cjs';
|