Skip to content

Instantly share code, notes, and snippets.

@kuuote
Created July 21, 2025 08:15
Show Gist options
  • Save kuuote/ee3e06376f30393b49d8e74b04a569a9 to your computer and use it in GitHub Desktop.
Save kuuote/ee3e06376f30393b49d8e74b04a569a9 to your computer and use it in GitHub Desktop.
import { fromFileUrl } from "jsr:@std/path@~1.0.3/from-file-url";
import { resolve } from "jsr:@std/path@~1.0.3/resolve";
import { DduItem } from "jsr:@shougo/ddu-vim/types";
import { deadline } from "jsr:@std/async@^1.0.1/deadline";
import { parseArgs } from "jsr:@std/cli@^1.0.1/parse-args";
import {
readableStreamFromWorker,
writableStreamFromWorker,
} from "jsr:@lambdalisue/workerio@^4.0.1";

常に日本語で応答してください

これはDenoのプロジェクトです deno test -A でテストできます

import { collectJSR } from "./jsr.ts";
export async function collectNewImports(jsrPackages: string[]): Promise<string[]> {
const tempDir = await Deno.makeTempDir();
const command = new Deno.Command("deno", {
args: ["add", ...jsrPackages],
cwd: tempDir,
});
const { stdout, stderr } = await command.output();
if (stderr.length > 0) {
console.error(new TextDecoder().decode(stderr));
}
const denoJsonPath = `${tempDir}/deno.json`;
try {
const denoJsonContent = await Deno.readTextFile(denoJsonPath);
const denoJson = JSON.parse(denoJsonContent);
const imports = denoJson.imports || {};
return Object.values(imports);
} finally {
await Deno.remove(tempDir, { recursive: true });
}
}
import { assertEquals } from "jsr:@std/assert@~1.0.0";
import { collectNewImports } from "./import.ts";
Deno.test("collectNewImports should return a list of new imports", async () => {
const jsrPackages = [
"jsr:@std/path",
"jsr:@std/json",
];
const imports = await collectNewImports(jsrPackages);
assertEquals(imports.length > 0, true);
assertEquals(imports.some(imp => imp.includes("jsr:@std/path")), true);
assertEquals(imports.some(imp => imp.includes("jsr:@std/json")), true);
});
import { walk } from "jsr:@std/fs@^0.224.0/walk";
export async function collectJSR(path: string): Promise<string[]> {
const jsrImports: Set<string> = new Set();
for await (const entry of walk(path, {
exts: [".ts"],
includeDirs: false,
})) {
const content = await Deno.readTextFile(entry.path);
const matches = content.matchAll(/from "(jsr:[^/]+\/[^@/]+)(@[^/]+)?/g);
for (const match of matches) {
jsrImports.add(match[1]);
}
}
return Array.from(jsrImports);
}
import { assertEquals } from "jsr:@std/assert@~1.0.0";
import { collectJSR } from "./jsr.ts";
Deno.test("collectJSR should return a list of JSR packages", async () => {
// テスト用のディレクトリとファイルを作成
await Deno.mkdir("./test_dir", { recursive: true });
await Deno.writeTextFile("./test_dir/file1.ts", 'import { join } from "jsr:@std/path@~1.0.3";');
await Deno.writeTextFile("./test_dir/file2.ts", 'import { parse } from "jsr:@std/json@~1.0.0";');
await Deno.writeTextFile("./test_dir/file3.ts", 'import { a } from "npm:[email protected]";'); // JSRではない
const packages = await collectJSR("./test_dir");
assertEquals(packages.length, 2);
assertEquals(packages.includes("jsr:@std/path"), true);
assertEquals(packages.includes("jsr:@std/json"), true);
// クリーンアップ
await Deno.remove("./test_dir", { recursive: true });
});
import { parseArgs } from "jsr:@std/cli@^1.0.1/parse-args";
import { collectJSR } from "./jsr.ts";
async function main() {
const args = parseArgs(Deno.args, {
string: ["path"],
default: { path: "." },
});
const path = args.path;
try {
const packages = await collectJSR(path);
if (packages.length > 0) {
console.log("Found JSR packages:");
packages.forEach((pkg) => console.log(pkg));
} else {
console.log(`No JSR packages found in ${path}`);
}
} catch (error) {
console.error(`Error: ${error.message}`);
}
}
if (import.meta.main) {
main();
}

欲しい物はDenoで動くCLIです

jsr.ts collectJSR

見出しの1つめのファイル名に見出しの2つめの名前の関数を作成しexportしてください。 まず、指定したパス以下の拡張子が .ts のファイルを列挙します。 その後、各ファイルからjsrのimport文を抽出します。(例は ./example.ts にあります。 from "jsr:@std/path@~1.0.3 のような部分を抽出してください) それを集計して jsr:@std/path の部分を抽出しリストとして返してください

import.ts collectNewImports

見出しの1つめのファイル名に見出しの2つめの名前の関数を作成しexportしてください。 Deno.makeTempDirを使うと一時ディレクトリを作成できます。そのディレクトリをcwdとして次のコマンドを実行する関数を作ってください。 deno add $(collectJSRの引数) ディレクトリ以下にdeno.jsonが生成されます。このJSON形式のファイルのimportsフィールドの値を集計しリストで返してください。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment