@mnaoumov/typescript-dev-toolkit 3.6.4 → 3.7.1
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/cjs/formatters/dprint.cjs +10 -3
- package/dist/lib/cjs/formatters/dprint.d.cts +5 -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/dist/lib/esm/formatters/dprint.d.mts +5 -0
- package/dist/lib/esm/formatters/dprint.mjs +10 -3
- 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,118 @@
|
|
|
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
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
var __defProp = Object.defineProperty;
|
|
8
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
9
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
10
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
11
|
+
var __export = (target, all) => {
|
|
12
|
+
for (var name in all)
|
|
13
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
14
|
+
};
|
|
15
|
+
var __copyProps = (to, from, except, desc) => {
|
|
16
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
17
|
+
for (let key of __getOwnPropNames(from))
|
|
18
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
19
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
20
|
+
}
|
|
21
|
+
return to;
|
|
22
|
+
};
|
|
23
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
24
|
+
var outdated_references_exports = {};
|
|
25
|
+
__export(outdated_references_exports, {
|
|
26
|
+
OUTDATED_REFERENCE_ALLOW_MARKER: () => OUTDATED_REFERENCE_ALLOW_MARKER,
|
|
27
|
+
assertNoOutdatedReferences: () => assertNoOutdatedReferences,
|
|
28
|
+
findOutdatedReferences: () => findOutdatedReferences,
|
|
29
|
+
findOutdatedReferencesInText: () => findOutdatedReferencesInText,
|
|
30
|
+
formatOutdatedReferences: () => formatOutdatedReferences
|
|
31
|
+
});
|
|
32
|
+
module.exports = __toCommonJS(outdated_references_exports);
|
|
33
|
+
var import_node_fs = require('node:fs');
|
|
34
|
+
var import_promises = require('node:fs/promises');
|
|
35
|
+
var import_node_path = require('node:path');
|
|
36
|
+
const OUTDATED_REFERENCE_ALLOW_MARKER = "outdated-reference-ok";
|
|
37
|
+
const OUTDATED_REFERENCE_PATTERNS = [
|
|
38
|
+
{
|
|
39
|
+
hint: "a module path or repository link of the retired `obsidian-dev-utils` package; name the `@mnaoumov/*` package that has it now",
|
|
40
|
+
regExp: /obsidian-dev-utils\//u
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
hint: "an import of the retired `obsidian-dev-utils` package; import the `@mnaoumov/*` package that has it now",
|
|
44
|
+
regExp: /from\s+['"]obsidian-dev-utils['"]/u
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
hint: "the legacy `__obsidianDevUtils` console recipe; use `getSharedAbortController()` or the `Symbol.for('@mnaoumov/typescript-lib/state')` slot",
|
|
48
|
+
regExp: /__obsidianDevUtils\.sharedAbortController/u
|
|
49
|
+
}
|
|
50
|
+
];
|
|
51
|
+
async function assertNoOutdatedReferences(rootDirectory) {
|
|
52
|
+
const references = await findOutdatedReferences(rootDirectory);
|
|
53
|
+
if (references.length > 0) {
|
|
54
|
+
throw new Error(`${String(references.length)} outdated reference(s):
|
|
55
|
+
${formatOutdatedReferences(references)}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async function findOutdatedReferences(rootDirectory) {
|
|
59
|
+
const readmePath = (0, import_node_path.join)(rootDirectory, "README.md");
|
|
60
|
+
const files = [
|
|
61
|
+
...(0, import_node_fs.existsSync)(readmePath) ? [readmePath] : [],
|
|
62
|
+
...await listFiles((0, import_node_path.join)(rootDirectory, "docs", "src", "content", "docs"), (name) => /\.mdx?$/u.test(name), ["api"]),
|
|
63
|
+
...await listFiles((0, import_node_path.join)(rootDirectory, "src"), isScannedSource, []),
|
|
64
|
+
...await listFiles((0, import_node_path.join)(rootDirectory, "scripts"), isScannedSource, [])
|
|
65
|
+
];
|
|
66
|
+
const references = [];
|
|
67
|
+
for (const file of files) {
|
|
68
|
+
references.push(...findOutdatedReferencesInText((0, import_node_path.relative)(rootDirectory, file).replaceAll("\\", "/"), await (0, import_promises.readFile)(file, "utf-8")));
|
|
69
|
+
}
|
|
70
|
+
return references;
|
|
71
|
+
}
|
|
72
|
+
function findOutdatedReferencesInText(filePath, text) {
|
|
73
|
+
const references = [];
|
|
74
|
+
for (const [index, line] of text.split(/\r?\n/u).entries()) {
|
|
75
|
+
if (line.includes(OUTDATED_REFERENCE_ALLOW_MARKER)) {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
for (const pattern of OUTDATED_REFERENCE_PATTERNS) {
|
|
79
|
+
if (pattern.regExp.test(line)) {
|
|
80
|
+
references.push({ filePath, hint: pattern.hint, line: index + 1, text: line.trim() });
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return references;
|
|
86
|
+
}
|
|
87
|
+
function formatOutdatedReferences(references) {
|
|
88
|
+
return references.map((reference) => `${reference.filePath}:${String(reference.line)} - ${reference.text} (${reference.hint})`).join("\n");
|
|
89
|
+
}
|
|
90
|
+
function isScannedSource(name) {
|
|
91
|
+
return name.endsWith(".ts") && !name.endsWith(".d.ts") && !name.endsWith(".test.ts") && name !== "__merged.ts";
|
|
92
|
+
}
|
|
93
|
+
async function listFiles(directory, isIncluded, excludedDirectories) {
|
|
94
|
+
const files = [];
|
|
95
|
+
if (!(0, import_node_fs.existsSync)(directory)) {
|
|
96
|
+
return files;
|
|
97
|
+
}
|
|
98
|
+
for (const entry of await (0, import_promises.readdir)(directory, { withFileTypes: true })) {
|
|
99
|
+
const entryPath = (0, import_node_path.join)(directory, entry.name);
|
|
100
|
+
if (entry.isDirectory()) {
|
|
101
|
+
if (!excludedDirectories.includes(entry.name)) {
|
|
102
|
+
files.push(...await listFiles(entryPath, isIncluded, excludedDirectories));
|
|
103
|
+
}
|
|
104
|
+
} else if (isIncluded(entry.name)) {
|
|
105
|
+
files.push(entryPath);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return files.sort();
|
|
109
|
+
}
|
|
110
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
111
|
+
0 && (module.exports = {
|
|
112
|
+
OUTDATED_REFERENCE_ALLOW_MARKER,
|
|
113
|
+
assertNoOutdatedReferences,
|
|
114
|
+
findOutdatedReferences,
|
|
115
|
+
findOutdatedReferencesInText,
|
|
116
|
+
formatOutdatedReferences
|
|
117
|
+
});
|
|
118
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2RvY3Mtc2l0ZS9vdXRkYXRlZC1yZWZlcmVuY2VzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmluZHMgcmVmZXJlbmNlcyB0byB0aGUgcmV0aXJlZCBgb2JzaWRpYW4tZGV2LXV0aWxzYCBwYWNrYWdlIHRoYXQgcG9pbnQgYSByZWFkZXIgYXQgc29tZXRoaW5nIHRoYXQgbm8gbG9uZ2VyXG4gKiBleGlzdHM6IG9uZSBvZiBpdHMgbW9kdWxlIHBhdGhzLCBhIGxpbmsgaW50byBpdHMgcmVwb3NpdG9yeSwgb3IgdGhlIGxlZ2FjeSBjb25zb2xlIHJlY2lwZSBmb3IgdGhlIHNoYXJlZCBhYm9ydFxuICogY29udHJvbGxlci5cbiAqXG4gKiBUaGUgYmFyZSBuYW1lIGBvYnNpZGlhbi1kZXYtdXRpbHNgIGlzIE5PVCBmbGFnZ2VkOiBgQG1uYW91bW92L29ic2lkaWFuLWxpYmAga2VlcHMgaXQgb24gcHVycG9zZSBhcyBhIHdpcmUgbmFtZSAoaXRzXG4gKiBkZWJ1ZyBuYW1lc3BhY2UsIENTUyBjbGFzcyBhbmQgZXZlbnQgcHJlZml4KSwgYW5kIGEgbWlncmF0aW9uIG5vdGUgbWF5IG5hbWUgdGhlIHBhY2thZ2UuIFdoYXQgaXMgZmxhZ2dlZCBpcyB0aGVcbiAqIG5hbWUgdXNlZCBhcyBhbiBBRERSRVNTLlxuICpcbiAqIFNjYW5uZWQsIHdoZXJlIHByZXNlbnQ6IGBSRUFETUUubWRgLCB0aGUgZ3VpZGVzIHVuZGVyIGBkb2NzL3NyYy9jb250ZW50L2RvY3NgIChub3QgdGhlIGdlbmVyYXRlZCBBUEkgcmVmZXJlbmNlLFxuICogd2hpY2ggaXMgcmVuZGVyZWQgZnJvbSB0aGUgVFNEb2MgdGhpcyBhbHNvIHNjYW5zKSwgYW5kIGV2ZXJ5IG5vbi10ZXN0IGAudHNgIGZpbGUgdW5kZXIgYHNyYy9gIGFuZCBgc2NyaXB0cy9gLlxuICogYENIQU5HRUxPRy5tZGAgaXMgaGlzdG9yeSBhbmQgaXMgbm90IHNjYW5uZWQuIEEgbGluZSB0aGF0IG5hbWVzIGFuIG9sZCBhZGRyZXNzIG9uIHB1cnBvc2UsIHN1Y2ggYXMgYSBtaWdyYXRpb25cbiAqIG5vdGUsIGNhcnJpZXMgYG91dGRhdGVkLXJlZmVyZW5jZS1va2Agb24gdGhhdCBsaW5lLlxuICovXG5cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIHJlYWRkaXIsXG4gIHJlYWRGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHtcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnbm9kZTpwYXRoJztcblxuLyoqXG4gKiBUaGUgbWFya2VyIHRoYXQgYWxsb3dzIGFuIG91dGRhdGVkIHJlZmVyZW5jZSBvbiBpdHMgbGluZS5cbiAqL1xuZXhwb3J0IGNvbnN0IE9VVERBVEVEX1JFRkVSRU5DRV9BTExPV19NQVJLRVIgPSAnb3V0ZGF0ZWQtcmVmZXJlbmNlLW9rJztcblxuaW50ZXJmYWNlIE91dGRhdGVkUmVmZXJlbmNlUGF0dGVybiB7XG4gIHJlYWRvbmx5IGhpbnQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcmVnRXhwOiBSZWdFeHA7XG59XG5cbmNvbnN0IE9VVERBVEVEX1JFRkVSRU5DRV9QQVRURVJOUzogcmVhZG9ubHkgT3V0ZGF0ZWRSZWZlcmVuY2VQYXR0ZXJuW10gPSBbXG4gIHtcbiAgICBoaW50OiAnYSBtb2R1bGUgcGF0aCBvciByZXBvc2l0b3J5IGxpbmsgb2YgdGhlIHJldGlyZWQgYG9ic2lkaWFuLWRldi11dGlsc2AgcGFja2FnZTsgbmFtZSB0aGUgYEBtbmFvdW1vdi8qYCBwYWNrYWdlIHRoYXQgaGFzIGl0IG5vdycsXG4gICAgcmVnRXhwOiAvb2JzaWRpYW4tZGV2LXV0aWxzXFwvL3VcbiAgfSxcbiAge1xuICAgIGhpbnQ6ICdhbiBpbXBvcnQgb2YgdGhlIHJldGlyZWQgYG9ic2lkaWFuLWRldi11dGlsc2AgcGFja2FnZTsgaW1wb3J0IHRoZSBgQG1uYW91bW92LypgIHBhY2thZ2UgdGhhdCBoYXMgaXQgbm93JyxcbiAgICByZWdFeHA6IC9mcm9tXFxzK1snXCJdb2JzaWRpYW4tZGV2LXV0aWxzWydcIl0vdVxuICB9LFxuICB7XG4gICAgaGludDogJ3RoZSBsZWdhY3kgYF9fb2JzaWRpYW5EZXZVdGlsc2AgY29uc29sZSByZWNpcGU7IHVzZSBgZ2V0U2hhcmVkQWJvcnRDb250cm9sbGVyKClgIG9yIHRoZSBgU3ltYm9sLmZvcihcXCdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvc3RhdGVcXCcpYCBzbG90JyxcbiAgICByZWdFeHA6IC9fX29ic2lkaWFuRGV2VXRpbHNcXC5zaGFyZWRBYm9ydENvbnRyb2xsZXIvdVxuICB9XG5dO1xuXG4vKipcbiAqIEFuIG91dGRhdGVkIHJlZmVyZW5jZSBmb3VuZCBpbiBhIGZpbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3V0ZGF0ZWRSZWZlcmVuY2Uge1xuICAvKipcbiAgICogVGhlIGZpbGUncyBwYXRoLCByZWxhdGl2ZSB0byB0aGUgcGFja2FnZSByb290LlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogV2hhdCB0byB3cml0ZSBpbnN0ZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgaGludDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgMS1iYXNlZCBsaW5lLlxuICAgKi9cbiAgcmVhZG9ubHkgbGluZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbGluZSdzIHRleHQsIHRyaW1tZWQuXG4gICAqL1xuICByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIG91dGRhdGVkIHJlZmVyZW5jZXMgaW4gdGhlIHBhY2thZ2UgYW5kIHRocm93cyB3aGVuIHRoZXJlIGlzIG9uZSwgZm9yIGEgZ2F0ZSB0ZXN0IG9yIHNjcmlwdC5cbiAqXG4gKiBAcGFyYW0gcm9vdERpcmVjdG9yeSAtIFRoZSBwYWNrYWdlIHJvb3QuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZXJlIGlzIG5vbmUuXG4gKiBAdGhyb3dzIHtFcnJvcn0gTGlzdGluZyBldmVyeSByZWZlcmVuY2UsIG9uZSBwZXIgbGluZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzc2VydE5vT3V0ZGF0ZWRSZWZlcmVuY2VzKHJvb3REaXJlY3Rvcnk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWZlcmVuY2VzID0gYXdhaXQgZmluZE91dGRhdGVkUmVmZXJlbmNlcyhyb290RGlyZWN0b3J5KTtcbiAgaWYgKHJlZmVyZW5jZXMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtTdHJpbmcocmVmZXJlbmNlcy5sZW5ndGgpfSBvdXRkYXRlZCByZWZlcmVuY2Uocyk6XFxuJHtmb3JtYXRPdXRkYXRlZFJlZmVyZW5jZXMocmVmZXJlbmNlcyl9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgb3V0ZGF0ZWQgcmVmZXJlbmNlcyBpbiB0aGUgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0gcm9vdERpcmVjdG9yeSAtIFRoZSBwYWNrYWdlIHJvb3QuXG4gKiBAcmV0dXJucyBUaGUgb3V0ZGF0ZWQgcmVmZXJlbmNlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRPdXRkYXRlZFJlZmVyZW5jZXMocm9vdERpcmVjdG9yeTogc3RyaW5nKTogUHJvbWlzZTxPdXRkYXRlZFJlZmVyZW5jZVtdPiB7XG4gIGNvbnN0IHJlYWRtZVBhdGggPSBqb2luKHJvb3REaXJlY3RvcnksICdSRUFETUUubWQnKTtcbiAgY29uc3QgZmlsZXMgPSBbXG4gICAgLi4uZXhpc3RzU3luYyhyZWFkbWVQYXRoKSA/IFtyZWFkbWVQYXRoXSA6IFtdLFxuICAgIC4uLmF3YWl0IGxpc3RGaWxlcyhqb2luKHJvb3REaXJlY3RvcnksICdkb2NzJywgJ3NyYycsICdjb250ZW50JywgJ2RvY3MnKSwgKG5hbWUpID0+IC9cXC5tZHg/JC91LnRlc3QobmFtZSksIFsnYXBpJ10pLFxuICAgIC4uLmF3YWl0IGxpc3RGaWxlcyhqb2luKHJvb3REaXJlY3RvcnksICdzcmMnKSwgaXNTY2FubmVkU291cmNlLCBbXSksXG4gICAgLi4uYXdhaXQgbGlzdEZpbGVzKGpvaW4ocm9vdERpcmVjdG9yeSwgJ3NjcmlwdHMnKSwgaXNTY2FubmVkU291cmNlLCBbXSlcbiAgXTtcbiAgY29uc3QgcmVmZXJlbmNlczogT3V0ZGF0ZWRSZWZlcmVuY2VbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICByZWZlcmVuY2VzLnB1c2goLi4uZmluZE91dGRhdGVkUmVmZXJlbmNlc0luVGV4dChyZWxhdGl2ZShyb290RGlyZWN0b3J5LCBmaWxlKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKSwgYXdhaXQgcmVhZEZpbGUoZmlsZSwgJ3V0Zi04JykpKTtcbiAgfVxuICByZXR1cm4gcmVmZXJlbmNlcztcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgb3V0ZGF0ZWQgcmVmZXJlbmNlcyBpbiBvbmUgZmlsZSdzIHRleHQuXG4gKlxuICogQHBhcmFtIGZpbGVQYXRoIC0gVGhlIGZpbGUncyBwYXRoLCB1c2VkIGluIHRoZSByZXN1bHQuXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSBmaWxlJ3MgdGV4dC5cbiAqIEByZXR1cm5zIFRoZSBvdXRkYXRlZCByZWZlcmVuY2VzLCBpbiBsaW5lIG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZE91dGRhdGVkUmVmZXJlbmNlc0luVGV4dChmaWxlUGF0aDogc3RyaW5nLCB0ZXh0OiBzdHJpbmcpOiBPdXRkYXRlZFJlZmVyZW5jZVtdIHtcbiAgY29uc3QgcmVmZXJlbmNlczogT3V0ZGF0ZWRSZWZlcmVuY2VbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgbGluZV0gb2YgdGV4dC5zcGxpdCgvXFxyP1xcbi91KS5lbnRyaWVzKCkpIHtcbiAgICBpZiAobGluZS5pbmNsdWRlcyhPVVREQVRFRF9SRUZFUkVOQ0VfQUxMT1dfTUFSS0VSKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBPVVREQVRFRF9SRUZFUkVOQ0VfUEFUVEVSTlMpIHtcbiAgICAgIGlmIChwYXR0ZXJuLnJlZ0V4cC50ZXN0KGxpbmUpKSB7XG4gICAgICAgIHJlZmVyZW5jZXMucHVzaCh7IGZpbGVQYXRoLCBoaW50OiBwYXR0ZXJuLmhpbnQsIGxpbmU6IGluZGV4ICsgMSwgdGV4dDogbGluZS50cmltKCkgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVmZXJlbmNlcztcbn1cblxuLyoqXG4gKiBGb3JtYXRzIHJlZmVyZW5jZXMgb25lIHBlciBsaW5lLCBhcyBgcGF0aDpsaW5lIC0gdGV4dCAoaGludClgLlxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2VzIC0gVGhlIHJlZmVyZW5jZXMuXG4gKiBAcmV0dXJucyBUaGUgZm9ybWF0dGVkIHRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRPdXRkYXRlZFJlZmVyZW5jZXMocmVmZXJlbmNlczogcmVhZG9ubHkgT3V0ZGF0ZWRSZWZlcmVuY2VbXSk6IHN0cmluZyB7XG4gIHJldHVybiByZWZlcmVuY2VzLm1hcCgocmVmZXJlbmNlKSA9PiBgJHtyZWZlcmVuY2UuZmlsZVBhdGh9OiR7U3RyaW5nKHJlZmVyZW5jZS5saW5lKX0gLSAke3JlZmVyZW5jZS50ZXh0fSAoJHtyZWZlcmVuY2UuaGludH0pYCkuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIGlzU2Nhbm5lZFNvdXJjZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIG5hbWUuZW5kc1dpdGgoJy50cycpICYmICFuYW1lLmVuZHNXaXRoKCcuZC50cycpICYmICFuYW1lLmVuZHNXaXRoKCcudGVzdC50cycpICYmIG5hbWUgIT09ICdfX21lcmdlZC50cyc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3RGaWxlcyhkaXJlY3Rvcnk6IHN0cmluZywgaXNJbmNsdWRlZDogKG5hbWU6IHN0cmluZykgPT4gYm9vbGVhbiwgZXhjbHVkZWREaXJlY3RvcmllczogcmVhZG9ubHkgc3RyaW5nW10pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoIWV4aXN0c1N5bmMoZGlyZWN0b3J5KSkge1xuICAgIHJldHVybiBmaWxlcztcbiAgfVxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGF3YWl0IHJlYWRkaXIoZGlyZWN0b3J5LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBjb25zdCBlbnRyeVBhdGggPSBqb2luKGRpcmVjdG9yeSwgZW50cnkubmFtZSk7XG4gICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGlmICghZXhjbHVkZWREaXJlY3Rvcmllcy5pbmNsdWRlcyhlbnRyeS5uYW1lKSkge1xuICAgICAgICBmaWxlcy5wdXNoKC4uLmF3YWl0IGxpc3RGaWxlcyhlbnRyeVBhdGgsIGlzSW5jbHVkZWQsIGV4Y2x1ZGVkRGlyZWN0b3JpZXMpKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzSW5jbHVkZWQoZW50cnkubmFtZSkpIHtcbiAgICAgIGZpbGVzLnB1c2goZW50cnlQYXRoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZpbGVzLnNvcnQoKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBaUJBLHFCQUEyQjtBQUMzQixzQkFHTztBQUNQLHVCQUdPO0FBS0EsTUFBTSxrQ0FBa0M7QUFPL0MsTUFBTSw4QkFBbUU7QUFBQSxFQUN2RTtBQUFBLElBQ0UsTUFBTTtBQUFBLElBQ04sUUFBUTtBQUFBLEVBQ1Y7QUFBQSxFQUNBO0FBQUEsSUFDRSxNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsRUFDVjtBQUFBLEVBQ0E7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
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.cts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Finds references to the retired `obsidian-dev-utils` package that point a reader at something that no longer
|
|
6
|
+
* exists: one of its module paths, a link into its repository, or the legacy console recipe for the shared abort
|
|
7
|
+
* controller.
|
|
8
|
+
*
|
|
9
|
+
* The bare name `obsidian-dev-utils` is NOT flagged: `@mnaoumov/obsidian-lib` keeps it on purpose as a wire name (its
|
|
10
|
+
* debug namespace, CSS class and event prefix), and a migration note may name the package. What is flagged is the
|
|
11
|
+
* name used as an ADDRESS.
|
|
12
|
+
*
|
|
13
|
+
* Scanned, where present: `README.md`, the guides under `docs/src/content/docs` (not the generated API reference,
|
|
14
|
+
* which is rendered from the TSDoc this also scans), and every non-test `.ts` file under `src/` and `scripts/`.
|
|
15
|
+
* `CHANGELOG.md` is history and is not scanned. A line that names an old address on purpose, such as a migration
|
|
16
|
+
* note, carries `outdated-reference-ok` on that line.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* The marker that allows an outdated reference on its line.
|
|
20
|
+
*/
|
|
21
|
+
export declare const OUTDATED_REFERENCE_ALLOW_MARKER = "outdated-reference-ok";
|
|
22
|
+
/**
|
|
23
|
+
* An outdated reference found in a file.
|
|
24
|
+
*/
|
|
25
|
+
export interface OutdatedReference {
|
|
26
|
+
/**
|
|
27
|
+
* The file's path, relative to the package root.
|
|
28
|
+
*/
|
|
29
|
+
readonly filePath: string;
|
|
30
|
+
/**
|
|
31
|
+
* What to write instead.
|
|
32
|
+
*/
|
|
33
|
+
readonly hint: string;
|
|
34
|
+
/**
|
|
35
|
+
* The 1-based line.
|
|
36
|
+
*/
|
|
37
|
+
readonly line: number;
|
|
38
|
+
/**
|
|
39
|
+
* The line's text, trimmed.
|
|
40
|
+
*/
|
|
41
|
+
readonly text: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Finds the outdated references in the package and throws when there is one, for a gate test or script.
|
|
45
|
+
*
|
|
46
|
+
* @param rootDirectory - The package root.
|
|
47
|
+
* @returns A promise that resolves when there is none.
|
|
48
|
+
* @throws {Error} Listing every reference, one per line.
|
|
49
|
+
*/
|
|
50
|
+
export declare function assertNoOutdatedReferences(rootDirectory: string): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Finds the outdated references in the package.
|
|
53
|
+
*
|
|
54
|
+
* @param rootDirectory - The package root.
|
|
55
|
+
* @returns The outdated references.
|
|
56
|
+
*/
|
|
57
|
+
export declare function findOutdatedReferences(rootDirectory: string): Promise<OutdatedReference[]>;
|
|
58
|
+
/**
|
|
59
|
+
* Finds the outdated references in one file's text.
|
|
60
|
+
*
|
|
61
|
+
* @param filePath - The file's path, used in the result.
|
|
62
|
+
* @param text - The file's text.
|
|
63
|
+
* @returns The outdated references, in line order.
|
|
64
|
+
*/
|
|
65
|
+
export declare function findOutdatedReferencesInText(filePath: string, text: string): OutdatedReference[];
|
|
66
|
+
/**
|
|
67
|
+
* Formats references one per line, as `path:line - text (hint)`.
|
|
68
|
+
*
|
|
69
|
+
* @param references - The references.
|
|
70
|
+
* @returns The formatted text.
|
|
71
|
+
*/
|
|
72
|
+
export declare function formatOutdatedReferences(references: readonly OutdatedReference[]): string;
|
|
@@ -76,11 +76,18 @@ async function format(options) {
|
|
|
76
76
|
throw new Error("dprint.json not found");
|
|
77
77
|
}
|
|
78
78
|
const command = rewrite ? "fmt" : "check";
|
|
79
|
-
const
|
|
80
|
-
await (0, import_root.execFromRoot)([
|
|
79
|
+
const hasPaths = paths !== void 0 && paths.length > 0;
|
|
80
|
+
await (0, import_root.execFromRoot)([
|
|
81
|
+
...(0, import_package_manager.resolveToolCommand)({ tool: "dprint" }),
|
|
82
|
+
command,
|
|
83
|
+
"--config",
|
|
84
|
+
dprintJsonPath,
|
|
85
|
+
...hasPaths ? ["--allow-no-files"] : [],
|
|
86
|
+
{ batchedArguments: hasPaths ? paths : ["**/*"] }
|
|
87
|
+
]);
|
|
81
88
|
}
|
|
82
89
|
// Annotate the CommonJS export names for ESM import in node:
|
|
83
90
|
0 && (module.exports = {
|
|
84
91
|
format
|
|
85
92
|
});
|
|
86
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9mb3JtYXR0ZXJzL2RwcmludC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogRm9ybWF0IHRoZSBzb3VyY2UgY29kZS5cbiAqL1xuXG5pbXBvcnQgeyBhc3NlcnROb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB7IHJlc29sdmVUb29sQ29tbWFuZCB9IGZyb20gJy4uL3BhY2thZ2UtbWFuYWdlci50cyc7XG5pbXBvcnQgeyBSZXBvUGF0aHMgfSBmcm9tICcuLi9yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7XG4gIGV4ZWNGcm9tUm9vdCxcbiAgZ2V0Um9vdEZvbGRlcixcbiAgcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmVcbn0gZnJvbSAnLi4vcm9vdC50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgdGhlIHtAbGluayBmb3JtYXR9IGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGBkcHJpbnQuanNvbmAgdXNlZCB3aGVuIHRoZSBwcm9qZWN0IGhhcyBub25lIG9mIGl0cyBvd24uIFdpdGhvdXQgaXQsIGEgcHJvamVjdCB3aXRoIG5vIGBkcHJpbnQuanNvbmBcbiAgICogZmFpbHMuXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0Q29uZmlnRmlsZVBhdGg/
|
|
93
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9mb3JtYXR0ZXJzL2RwcmludC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogRm9ybWF0IHRoZSBzb3VyY2UgY29kZS5cbiAqL1xuXG5pbXBvcnQgeyBhc3NlcnROb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB7IHJlc29sdmVUb29sQ29tbWFuZCB9IGZyb20gJy4uL3BhY2thZ2UtbWFuYWdlci50cyc7XG5pbXBvcnQgeyBSZXBvUGF0aHMgfSBmcm9tICcuLi9yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7XG4gIGV4ZWNGcm9tUm9vdCxcbiAgZ2V0Um9vdEZvbGRlcixcbiAgcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmVcbn0gZnJvbSAnLi4vcm9vdC50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgdGhlIHtAbGluayBmb3JtYXR9IGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGBkcHJpbnQuanNvbmAgdXNlZCB3aGVuIHRoZSBwcm9qZWN0IGhhcyBub25lIG9mIGl0cyBvd24uIFdpdGhvdXQgaXQsIGEgcHJvamVjdCB3aXRoIG5vIGBkcHJpbnQuanNvbmBcbiAgICogZmFpbHMuXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0Q29uZmlnRmlsZVBhdGg/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGZpbGUgcGF0aHMgdG8gZm9ybWF0LiBJZiBvbWl0dGVkLCBmb3JtYXRzIHRoZSBlbnRpcmUgcHJvamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhzPzogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmV3cml0ZSB0aGUgc291cmNlIGNvZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgcmV3cml0ZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRm9ybWF0IHRoZSBzb3VyY2UgY29kZS5cbiAqXG4gKiBFeHBsaWNpdCB7QGxpbmsgRm9ybWF0T3B0aW9ucy5wYXRoc30gZ2V0IGAtLWFsbG93LW5vLWZpbGVzYDogYSBsaXN0IGBkcHJpbnQuanNvbmAgZXhjbHVkZXMgZW50aXJlbHkgKGEgcHJlLWNvbW1pdFxuICogaG9vayBzdGFnaW5nIG9ubHkgYSBgZGVtby12YXVsdC9gIGZpbGUpIGlzIG5vdGhpbmcgdG8gZm9ybWF0LCBub3QgYW4gZXJyb3IsIHdoaWxlIGRwcmludCB3b3VsZCBleGl0IGAxNGAgd2l0aFxuICogYE5vIGZpbGVzIGZvdW5kIHRvIGZvcm1hdGAuIFRoZSB3aG9sZS1wcm9qZWN0IHJ1biBrZWVwcyB0aGUgY2hlY2ssIHNpbmNlIGZpbmRpbmcgbm90aGluZyB0aGVyZSBpcyBhIGJyb2tlblxuICogY29uZmlndXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgRm9ybWF0T3B0aW9uc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNvdXJjZSBjb2RlIGhhcyBiZWVuIGZvcm1hdHRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZvcm1hdChvcHRpb25zPzogRm9ybWF0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGRlZmF1bHRDb25maWdGaWxlUGF0aCwgcGF0aHMsIHJld3JpdGUgPSB0cnVlIH0gPSBvcHRpb25zID8/IHt9O1xuICBjb25zdCByb290Rm9sZGVyID0gZ2V0Um9vdEZvbGRlcigpO1xuICBhc3NlcnROb25OdWxsYWJsZShyb290Rm9sZGVyLCAnUm9vdCBmb2xkZXIgbm90IGZvdW5kJyk7XG4gIGxldCBkcHJpbnRKc29uUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogUmVwb1BhdGhzLkRwcmludEpzb24gfSk7XG4gIGlmICghZXhpc3RzU3luYyhkcHJpbnRKc29uUGF0aCkgJiYgZGVmYXVsdENvbmZpZ0ZpbGVQYXRoKSB7XG4gICAgZHByaW50SnNvblBhdGggPSBkZWZhdWx0Q29uZmlnRmlsZVBhdGg7XG4gIH1cblxuICBpZiAoIWV4aXN0c1N5bmMoZHByaW50SnNvblBhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdkcHJpbnQuanNvbiBub3QgZm91bmQnKTtcbiAgfVxuXG4gIGNvbnN0IGNvbW1hbmQgPSByZXdyaXRlID8gJ2ZtdCcgOiAnY2hlY2snO1xuICBjb25zdCBoYXNQYXRocyA9IHBhdGhzICE9PSB1bmRlZmluZWQgJiYgcGF0aHMubGVuZ3RoID4gMDtcbiAgYXdhaXQgZXhlY0Zyb21Sb290KFtcbiAgICAuLi5yZXNvbHZlVG9vbENvbW1hbmQoeyB0b29sOiAnZHByaW50JyB9KSxcbiAgICBjb21tYW5kLFxuICAgICctLWNvbmZpZycsXG4gICAgZHByaW50SnNvblBhdGgsXG4gICAgLi4uaGFzUGF0aHMgPyBbJy0tYWxsb3ctbm8tZmlsZXMnXSA6IFtdLFxuICAgIHsgYmF0Y2hlZEFyZ3VtZW50czogaGFzUGF0aHMgPyBwYXRocyA6IFsnKiovKiddIH1cbiAgXSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1BLHlCQUFrQztBQUNsQyxxQkFBMkI7QUFFM0IsNkJBQW1DO0FBQ25DLHdCQUEwQjtBQUMxQixrQkFJTztBQW9DUCxlQUFzQixPQUFPLFNBQXdDO0FBQ25FLFFBQU0sRUFBRSx1QkFBdUIsT0FBTyxVQUFVLEtBQUssSUFBSSxXQUFXLENBQUM7QUFDckUsUUFBTSxpQkFBYSwyQkFBYztBQUNqQyw0Q0FBa0IsWUFBWSx1QkFBdUI7QUFDckQsTUFBSSxxQkFBaUIscUNBQXdCLEVBQUUsTUFBTSw0QkFBVSxXQUFXLENBQUM7QUFDM0UsTUFBSSxLQUFDLDJCQUFXLGNBQWMsS0FBSyx1QkFBdUI7QUFDeEQscUJBQWlCO0FBQUEsRUFDbkI7QUFFQSxNQUFJLEtBQUMsMkJBQVcsY0FBYyxHQUFHO0FBQy9CLFVBQU0sSUFBSSxNQUFNLHVCQUF1QjtBQUFBLEVBQ3pDO0FBRUEsUUFBTSxVQUFVLFVBQVUsUUFBUTtBQUNsQyxRQUFNLFdBQVcsVUFBVSxVQUFhLE1BQU0sU0FBUztBQUN2RCxZQUFNLDBCQUFhO0FBQUEsSUFDakIsT0FBRywyQ0FBbUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUFBLElBQ3hDO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBLEdBQUcsV0FBVyxDQUFDLGtCQUFrQixJQUFJLENBQUM7QUFBQSxJQUN0QyxFQUFFLGtCQUFrQixXQUFXLFFBQVEsQ0FBQyxNQUFNLEVBQUU7QUFBQSxFQUNsRCxDQUFDO0FBQ0g7IiwibmFtZXMiOltdfQ==
|
|
@@ -27,6 +27,11 @@ export interface FormatOptions {
|
|
|
27
27
|
/**
|
|
28
28
|
* Format the source code.
|
|
29
29
|
*
|
|
30
|
+
* Explicit {@link FormatOptions.paths} get `--allow-no-files`: a list `dprint.json` excludes entirely (a pre-commit
|
|
31
|
+
* hook staging only a `demo-vault/` file) is nothing to format, not an error, while dprint would exit `14` with
|
|
32
|
+
* `No files found to format`. The whole-project run keeps the check, since finding nothing there is a broken
|
|
33
|
+
* configuration.
|
|
34
|
+
*
|
|
30
35
|
* @param options - The {@link FormatOptions}.
|
|
31
36
|
* @returns A {@link Promise} that resolves when the source code has been formatted.
|
|
32
37
|
*/
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.mts" />
|
|
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';
|
|
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;
|