summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rwxr-xr-xtools/generate_types_deno.ts100
-rwxr-xr-xtools/jsdoc_checker.js24
2 files changed, 117 insertions, 7 deletions
diff --git a/tools/generate_types_deno.ts b/tools/generate_types_deno.ts
new file mode 100755
index 000000000..265b6f537
--- /dev/null
+++ b/tools/generate_types_deno.ts
@@ -0,0 +1,100 @@
+#!/usr/bin/env -S deno run -A
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+
+// This script is used to generate the @types/deno package on DefinitelyTyped.
+
+import $ from "jsr:@david/dax@0.42.0";
+import { Node, Project } from "jsr:@ts-morph/ts-morph@23.0.0";
+import * as semver from "jsr:@std/semver@1.0.3";
+
+const rootDir = $.path(import.meta.dirname!).parentOrThrow();
+const definitelyTypedDir = rootDir.join(
+ "../DefinitelyTyped/types/deno/",
+);
+
+if (!definitelyTypedDir.existsSync()) {
+ throw new Error(`Makes sure ${definitelyTypedDir} exists.`);
+}
+
+const denoExec = rootDir.join(
+ "target/debug/deno" + (Deno.build.os === "windows" ? ".exe" : ""),
+);
+
+$.logStep("Building Deno executable...");
+await $`cargo build`;
+
+$.logStep("Creating declaration file...");
+await createDenoDtsFile();
+$.logStep("Updating package.json...");
+await updatePkgJson();
+$.logStep("Formatting...");
+await $`pnpm dprint fmt`.cwd(definitelyTypedDir);
+
+async function createDenoDtsFile() {
+ function matchesAny(text: string | undefined, patterns: string[]): boolean {
+ if (text == null) {
+ return false;
+ }
+ for (const pattern of patterns) {
+ if (text.includes(pattern)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ const text = await $`${denoExec} types`.text();
+ const project = new Project();
+ const file = project.createSourceFile(
+ definitelyTypedDir.join("index.d.ts").toString(),
+ text,
+ {
+ overwrite: true,
+ },
+ );
+
+ for (const statement of file.getStatementsWithComments()) {
+ if (Node.isCommentStatement(statement)) {
+ const statementText = statement.getText();
+ if (statementText.includes("<reference")) {
+ statement.remove();
+ continue;
+ }
+ }
+ const shouldKeepKeep = (Node.isModuleDeclaration(statement) ||
+ Node.isInterfaceDeclaration(statement) ||
+ Node.isTypeAliasDeclaration(statement) ||
+ Node.isClassDeclaration(statement)) &&
+ (matchesAny(statement.getName(), [
+ "Deno",
+ ]) || statement.getName()?.startsWith("GPU"));
+ if (!shouldKeepKeep) {
+ statement.remove();
+ continue;
+ }
+ }
+
+ file.insertStatements(
+ 0,
+ "// Copyright 2018-2024 the Deno authors. MIT license.\n\n",
+ );
+
+ file.saveSync();
+}
+
+async function updatePkgJson() {
+ const pkgJsonFile = definitelyTypedDir.join("package.json");
+ const obj = pkgJsonFile.readJsonSync();
+ const version = semver.parse(await getDenoVersion());
+ version.patch = 9999;
+ version.prerelease = undefined;
+ version.build = undefined;
+ // deno-lint-ignore no-explicit-any
+ (obj as any).version = semver.format(version);
+ pkgJsonFile.writeTextSync(JSON.stringify(obj, undefined, 4) + "\n"); // 4 spaces indent
+}
+
+async function getDenoVersion() {
+ const text = await $`${denoExec} -v`.text();
+ return text.match(/deno (.*)/)![1];
+}
diff --git a/tools/jsdoc_checker.js b/tools/jsdoc_checker.js
index 720a8ed8b..241d04273 100755
--- a/tools/jsdoc_checker.js
+++ b/tools/jsdoc_checker.js
@@ -45,33 +45,39 @@ for (const file of project.getSourceFiles()) {
}
const parent = node.getFirstAncestorByKind(ts.SyntaxKind.ModuleDeclaration);
+ const isInterfaceOrType =
+ node.getKind() === ts.SyntaxKind.InterfaceDeclaration ||
+ node.getKind() === ts.SyntaxKind.TypeAliasDeclaration;
if (parent) {
if (!node.isExported()) {
- errors.push(getErrorPrefix(node) + "export keyword");
+ errors.push(getMissingErrorPrefix(node) + "export keyword");
continue;
}
- } else if (!node.hasDeclareKeyword()) {
- errors.push(getErrorPrefix(node) + "declare keyword");
+ } else if (!isInterfaceOrType && !node.hasDeclareKeyword()) {
+ errors.push(getMissingErrorPrefix(node) + "declare keyword");
+ continue;
+ } else if (isInterfaceOrType && node.hasDeclareKeyword()) {
+ errors.push(getErrorPrefix(node) + "has incorrect declare keyword");
continue;
}
const jsDoc = node.getFirstChildIfKind(ts.SyntaxKind.JSDoc);
if (!jsDoc) {
- errors.push(getErrorPrefix(node) + "JSDoc comment");
+ errors.push(getMissingErrorPrefix(node) + "JSDoc comment");
continue;
}
const tags = jsDoc.getTags();
if (!tags.find((tag) => tag.getTagName() === "category")) {
- errors.push(getErrorPrefix(node) + "JSDoc @category tag");
+ errors.push(getMissingErrorPrefix(node) + "JSDoc @category tag");
continue;
}
if (unstableFiles.includes(file)) {
if (!tags.find((tag) => tag.getTagName() === "experimental")) {
- errors.push(getErrorPrefix(node) + "JSDoc @experimental tag");
+ errors.push(getMissingErrorPrefix(node) + "JSDoc @experimental tag");
}
}
}
@@ -81,6 +87,10 @@ if (errors.length > 0) {
throw new AggregateError(errors);
}
+function getMissingErrorPrefix(node) {
+ return getErrorPrefix(node) + `is missing a `;
+}
+
function getErrorPrefix(node) {
- return `Symbol at file://${node.getSourceFile().getFilePath()}:${node.getStartLineNumber()} is missing a `;
+ return `Symbol at file://${node.getSourceFile().getFilePath()}:${node.getStartLineNumber()} `;
}