From 33f169beb90814b7f2f62a8c0e3990722ae3db4c Mon Sep 17 00:00:00 2001 From: David Sherret Date: Mon, 23 Sep 2024 15:18:52 -0400 Subject: chore: add code generation for @types/deno (#25545) --- tools/generate_types_deno.ts | 100 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100755 tools/generate_types_deno.ts (limited to 'tools/generate_types_deno.ts') 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("