Skip to content

Add more comments #1993

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 31 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 18 commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
61d9bfe
refactor: optimize file system operations by removing async/await for…
Bashamega Apr 23, 2025
7b92b7d
chore: better naming
Bashamega Apr 23, 2025
746f705
feat: extract summary from MDN comments for better documentation
Bashamega Apr 23, 2025
9521a10
generate
Bashamega Apr 23, 2025
a995e00
remove comments
Bashamega Apr 23, 2025
ca08f27
Remove hashing
Bashamega Apr 23, 2025
7f82e1f
regenerate
Bashamega Apr 23, 2025
9afe136
-
Bashamega Apr 23, 2025
a2b7a93
feat: comments for iterator
Bashamega Apr 24, 2025
d6d08f7
Merge branch 'microsoft:main' into descriptions
Bashamega Apr 24, 2025
d65d812
generate
Bashamega Apr 24, 2025
04ba40c
-
Bashamega Apr 24, 2025
7da9e85
-
Bashamega Apr 24, 2025
576b872
-
Bashamega Apr 24, 2025
16ef393
-
Bashamega Apr 24, 2025
5110391
-
Bashamega Apr 24, 2025
63c359d
generate
Bashamega Apr 24, 2025
7a40173
clean
Bashamega Apr 24, 2025
fdddfa6
remove await
Bashamega Apr 25, 2025
968a4e4
simplify
Bashamega Apr 25, 2025
0123276
refactor: extract title generation logic into a separate function
Bashamega Apr 25, 2025
e146dfe
refactor: remove descriptions parameter from emitFlavor and emitWebId…
Bashamega Apr 27, 2025
d97bcb7
-
Bashamega Apr 27, 2025
de83ebc
Merge branch 'microsoft:main' into descriptions
Bashamega Apr 27, 2025
7386df6
generate
Bashamega Apr 27, 2025
619d3c2
merge branches
Bashamega Apr 28, 2025
7d3c431
refactor: optimize file processing in generateDescriptions function u…
Bashamega Apr 28, 2025
3c7d15a
Merge branches
Bashamega Apr 29, 2025
ebfc8c4
Merge branch 'microsoft:main' into descriptions
Bashamega May 4, 2025
ff14106
Update
Bashamega May 4, 2025
88daf24
-
Bashamega May 4, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
763 changes: 628 additions & 135 deletions baselines/audioworklet.generated.d.ts

Large diffs are not rendered by default.

22,400 changes: 17,964 additions & 4,436 deletions baselines/dom.generated.d.ts

Large diffs are not rendered by default.

390 changes: 325 additions & 65 deletions baselines/dom.iterable.generated.d.ts

Large diffs are not rendered by default.

6,402 changes: 5,316 additions & 1,086 deletions baselines/serviceworker.generated.d.ts

Large diffs are not rendered by default.

354 changes: 295 additions & 59 deletions baselines/serviceworker.iterable.generated.d.ts

Large diffs are not rendered by default.

6,076 changes: 5,045 additions & 1,031 deletions baselines/sharedworker.generated.d.ts

Large diffs are not rendered by default.

354 changes: 295 additions & 59 deletions baselines/sharedworker.iterable.generated.d.ts

Large diffs are not rendered by default.

763 changes: 628 additions & 135 deletions baselines/ts5.5/audioworklet.generated.d.ts

Large diffs are not rendered by default.

22,390 changes: 17,959 additions & 4,431 deletions baselines/ts5.5/dom.generated.d.ts

Large diffs are not rendered by default.

390 changes: 325 additions & 65 deletions baselines/ts5.5/dom.iterable.generated.d.ts

Large diffs are not rendered by default.

6,402 changes: 5,316 additions & 1,086 deletions baselines/ts5.5/serviceworker.generated.d.ts

Large diffs are not rendered by default.

354 changes: 295 additions & 59 deletions baselines/ts5.5/serviceworker.iterable.generated.d.ts

Large diffs are not rendered by default.

6,076 changes: 5,045 additions & 1,031 deletions baselines/ts5.5/sharedworker.generated.d.ts

Large diffs are not rendered by default.

354 changes: 295 additions & 59 deletions baselines/ts5.5/sharedworker.iterable.generated.d.ts

Large diffs are not rendered by default.

7,226 changes: 6,002 additions & 1,224 deletions baselines/ts5.5/webworker.generated.d.ts

Large diffs are not rendered by default.

354 changes: 295 additions & 59 deletions baselines/ts5.5/webworker.iterable.generated.d.ts

Large diffs are not rendered by default.

763 changes: 628 additions & 135 deletions baselines/ts5.6/audioworklet.generated.d.ts

Large diffs are not rendered by default.

22,400 changes: 17,964 additions & 4,436 deletions baselines/ts5.6/dom.generated.d.ts

Large diffs are not rendered by default.

390 changes: 325 additions & 65 deletions baselines/ts5.6/dom.iterable.generated.d.ts

Large diffs are not rendered by default.

6,402 changes: 5,316 additions & 1,086 deletions baselines/ts5.6/serviceworker.generated.d.ts

Large diffs are not rendered by default.

354 changes: 295 additions & 59 deletions baselines/ts5.6/serviceworker.iterable.generated.d.ts

Large diffs are not rendered by default.

6,076 changes: 5,045 additions & 1,031 deletions baselines/ts5.6/sharedworker.generated.d.ts

Large diffs are not rendered by default.

354 changes: 295 additions & 59 deletions baselines/ts5.6/sharedworker.iterable.generated.d.ts

Large diffs are not rendered by default.

7,226 changes: 6,002 additions & 1,224 deletions baselines/ts5.6/webworker.generated.d.ts

Large diffs are not rendered by default.

354 changes: 295 additions & 59 deletions baselines/ts5.6/webworker.iterable.generated.d.ts

Large diffs are not rendered by default.

7,226 changes: 6,002 additions & 1,224 deletions baselines/webworker.generated.d.ts

Large diffs are not rendered by default.

354 changes: 295 additions & 59 deletions baselines/webworker.iterable.generated.d.ts

Large diffs are not rendered by default.

1,763 changes: 0 additions & 1,763 deletions inputfiles/comments.json

Large diffs are not rendered by default.

99 changes: 64 additions & 35 deletions src/build.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { getInterfaceElementMergeData } from "./build/webref/elements.js";
import { getInterfaceToEventMap } from "./build/webref/events.js";
import { getWebidls } from "./build/webref/idl.js";
import jsonc from "jsonc-parser";
import { generateDescription } from "./build/mdn-comments.js";
import { generateDescriptions } from "./build/mdn-comments.js";

function mergeNamesakes(filtered: Browser.WebIdl) {
const targets = [
Expand Down Expand Up @@ -45,38 +45,42 @@ async function emitFlavor(
webidl: Browser.WebIdl,
forceKnownTypes: Set<string>,
options: EmitOptions,
descriptions: Record<string, string>,
) {
const exposed = getExposedTypes(webidl, options.global, forceKnownTypes);
mergeNamesakes(exposed);
exposed.events = webidl.events;

const result = emitWebIdl(
const result = await emitWebIdl(
exposed,
options.global[0],
"",
options.compilerBehavior,
descriptions,
);
await fs.writeFile(
new URL(`${options.name}.generated.d.ts`, options.outputFolder),
result,
);

const iterators = emitWebIdl(
const iterators = await emitWebIdl(
exposed,
options.global[0],
"sync",
options.compilerBehavior,
descriptions,
);
await fs.writeFile(
new URL(`${options.name}.iterable.generated.d.ts`, options.outputFolder),
iterators,
);

const asyncIterators = emitWebIdl(
const asyncIterators = await emitWebIdl(
exposed,
options.global[0],
"async",
options.compilerBehavior,
descriptions,
);
await fs.writeFile(
new URL(
Expand All @@ -95,7 +99,7 @@ async function emitDom() {
const addedItems = await readInputJSON("addedTypes.jsonc");
const comments = await readInputJSON("comments.json");
const deprecatedInfo = await readInputJSON("deprecatedMessage.json");
const documentationFromMDN = await generateDescription();
const documentationFromMDN = await generateDescriptions();
const removedItems = await readInputJSON("removedTypes.jsonc");

async function readInputJSON(filename: string) {
Expand Down Expand Up @@ -295,36 +299,61 @@ async function emitDom() {
recursive: true,
});

emitFlavor(webidl, new Set(knownTypes.Window), {
name: "dom",
global: ["Window"],
outputFolder,
compilerBehavior,
});
emitFlavor(webidl, new Set(knownTypes.Worker), {
name: "webworker",
global: ["Worker", "DedicatedWorker", "SharedWorker", "ServiceWorker"],
outputFolder,
compilerBehavior,
});
emitFlavor(webidl, new Set(knownTypes.Worker), {
name: "sharedworker",
global: ["SharedWorker", "Worker"],
outputFolder,
compilerBehavior,
});
emitFlavor(webidl, new Set(knownTypes.Worker), {
name: "serviceworker",
global: ["ServiceWorker", "Worker"],
outputFolder,
compilerBehavior,
});
emitFlavor(webidl, new Set(knownTypes.Worklet), {
name: "audioworklet",
global: ["AudioWorklet", "Worklet"],
outputFolder,
compilerBehavior,
});
emitFlavor(
webidl,
new Set(knownTypes.Window),
{
name: "dom",
global: ["Window"],
outputFolder,
compilerBehavior,
},
documentationFromMDN,
);
emitFlavor(
webidl,
new Set(knownTypes.Worker),
{
name: "webworker",
global: ["Worker", "DedicatedWorker", "SharedWorker", "ServiceWorker"],
outputFolder,
compilerBehavior,
},
documentationFromMDN,
);
emitFlavor(
webidl,
new Set(knownTypes.Worker),
{
name: "sharedworker",
global: ["SharedWorker", "Worker"],
outputFolder,
compilerBehavior,
},
documentationFromMDN,
);
emitFlavor(
webidl,
new Set(knownTypes.Worker),
{
name: "serviceworker",
global: ["ServiceWorker", "Worker"],
outputFolder,
compilerBehavior,
},
documentationFromMDN,
);
emitFlavor(
webidl,
new Set(knownTypes.Worklet),
{
name: "audioworklet",
global: ["AudioWorklet", "Worklet"],
outputFolder,
compilerBehavior,
},
documentationFromMDN,
);
}

function prune(
Expand Down
14 changes: 13 additions & 1 deletion src/build/emitter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@ export function emitWebIdl(
global: string,
iterator: "" | "sync" | "async",
compilerBehavior: CompilerBehavior,
descriptions: Record<string, string>,
): string {
// Global print target
const printer = createTextWriter("\n");
Expand Down Expand Up @@ -906,7 +907,18 @@ export function emitWebIdl(
comments.push("Available only in secure contexts.");
}
if (entity.mdnUrl) {
if (comments.length > 0) comments.push("");
if (comments.length == 0) {
const key = entity.mdnUrl
.split("/API/")
.pop()
?.replace("/", ".")
.split("#")[0]
.toLowerCase();
if (key && descriptions[key]) {
comments.push(descriptions[key]);
}
}
comments.push("");
comments.push(`[MDN Reference](${entity.mdnUrl})`);
}

Expand Down
86 changes: 41 additions & 45 deletions src/build/mdn-comments.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import fs from "fs/promises";
import { basename } from "path";

const basePath = new URL(
"../../inputfiles/mdn/files/en-us/web/api/",
import.meta.url,
Expand Down Expand Up @@ -43,70 +42,67 @@ function extractSummary(markdown: string): string {

// Extract the first sentence (ending in . ! or ?)
const sentenceMatch = normalizedText.match(/(.*?[.!?])(?=\s|$)/);
if (sentenceMatch) {
return sentenceMatch[0]; // Return the first full sentence
}

return normalizedText.split(" ")[0] || ""; // Fallback: first word if no sentence found
}

async function getDirectories(dirPath: URL): Promise<URL[]> {
try {
const entries = await fs.readdir(dirPath, {
withFileTypes: true,
});
return entries
.filter((entry) => entry.isDirectory())
.map((entry) => new URL(entry.name + "/", dirPath));
} catch (error) {
console.error("Error reading directories:", error);
return [];
}
return sentenceMatch ? sentenceMatch[0] : normalizedText.split(" ")[0] || "";
}

async function getIndexMdContents(
folders: URL[],
): Promise<{ [key: string]: string }> {
const results: { [key: string]: string } = {};
async function walkDirectory(dir: URL): Promise<URL[]> {
const entries = await fs.readdir(dir, { withFileTypes: true });
let results: URL[] = [];

for (const folder of folders) {
const indexPath = new URL("index.md", folder);
for (const entry of entries) {
const fullPath = new URL(`${entry.name}/`, dir);
const fullFile = new URL(entry.name, dir);

try {
const content = await fs.readFile(indexPath, "utf-8");

// Improved title extraction
const titleMatch = content.match(/title:\s*["']?([^"'\n]+)["']?/);
const filename = basename(folder.toString());
const title = titleMatch
? titleMatch[1].replace(/ extension$/, "")
: filename || "";

const summary = extractSummary(content);
results[title] = summary;
} catch (error) {
console.warn(`Skipping ${indexPath}: ${error}`);
if (entry.isDirectory()) {
results = results.concat(await walkDirectory(fullPath));
} else if (entry.isFile() && entry.name === "index.md") {
results.push(fullFile);
}
}

return results;
}

export async function generateDescription(): Promise<Record<string, string>> {
export async function generateDescriptions(): Promise<Record<string, string>> {
const stats = await fs.stat(basePath);
if (!stats.isDirectory()) {
throw new Error(
"MDN submodule does not exist; try running `git submodule update --init`",
);
}

const results: Record<string, string> = {};
try {
const folders = await getDirectories(basePath);
if (folders.length > 0) {
return await getIndexMdContents(folders);
const indexPaths = await walkDirectory(basePath);

for (const fileURL of indexPaths) {
try {
const content = await fs.readFile(fileURL, "utf-8");

const titleMatch = content.match(/title:\s*["']?([^"'\n]+)["']?/);
const title = titleMatch
? titleMatch[1].replace(/ extension$/, "").split(":")[0]
: basename(fileURL.pathname) || "";

const relPath = fileURL.pathname
.replace(basePath.pathname, "")
.replace(/\/index\.md$/, "");
const parentKey = relPath.split("/").filter(Boolean).join(".");
const fullKey = parentKey.includes(".")
? parentKey.includes(title.toLowerCase())
? parentKey
: `${parentKey}.${title}`
: title;

const summary = extractSummary(content);
results[fullKey] = summary;
} catch (error) {
console.warn(`Skipping ${fileURL.href}: ${error}`);
}
}
} catch (error) {
console.error("Error generating API descriptions:", error);
}

return {};
return results;
}