summaryrefslogtreecommitdiff
path: root/tools/generate_types_deno.ts
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2024-09-23 15:18:52 -0400
committerGitHub <noreply@github.com>2024-09-23 19:18:52 +0000
commit33f169beb90814b7f2f62a8c0e3990722ae3db4c (patch)
tree9877fb3b7dcbfd4482afc530467c072e38601f55 /tools/generate_types_deno.ts
parente1c8d2755e23182875b8fefeb558e603dd981418 (diff)
chore: add code generation for @types/deno (#25545)
Diffstat (limited to 'tools/generate_types_deno.ts')
-rwxr-xr-xtools/generate_types_deno.ts100
1 files changed, 100 insertions, 0 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];
+}