diff options
Diffstat (limited to 'tools')
-rwxr-xr-x | tools/generate_types_deno.ts | 100 | ||||
-rwxr-xr-x | tools/jsdoc_checker.js | 24 |
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()} `; } |