diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2024-09-23 15:18:52 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-23 19:18:52 +0000 |
commit | 33f169beb90814b7f2f62a8c0e3990722ae3db4c (patch) | |
tree | 9877fb3b7dcbfd4482afc530467c072e38601f55 /tools/generate_types_deno.ts | |
parent | e1c8d2755e23182875b8fefeb558e603dd981418 (diff) |
chore: add code generation for @types/deno (#25545)
Diffstat (limited to 'tools/generate_types_deno.ts')
-rwxr-xr-x | tools/generate_types_deno.ts | 100 |
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]; +} |