常に日本語で応答してください
これはDenoのプロジェクトです deno test -A でテストできます
| 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"; |
| 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です
見出しの1つめのファイル名に見出しの2つめの名前の関数を作成しexportしてください。
まず、指定したパス以下の拡張子が .ts のファイルを列挙します。
その後、各ファイルからjsrのimport文を抽出します。(例は ./example.ts にあります。 from "jsr:@std/path@~1.0.3 のような部分を抽出してください)
それを集計して jsr:@std/path の部分を抽出しリストとして返してください
見出しの1つめのファイル名に見出しの2つめの名前の関数を作成しexportしてください。
Deno.makeTempDirを使うと一時ディレクトリを作成できます。そのディレクトリをcwdとして次のコマンドを実行する関数を作ってください。
deno add $(collectJSRの引数)
ディレクトリ以下にdeno.jsonが生成されます。このJSON形式のファイルのimportsフィールドの値を集計しリストで返してください。