diff --git a/cmd/lsjson/main.js b/cmd/lsjson/main.js index a1ef21d..cc336d7 100644 --- a/cmd/lsjson/main.js +++ b/cmd/lsjson/main.js @@ -54,8 +54,15 @@ const decoder = new TextDecoder(); */ export async function lsjson(location, flags = {}) { const isDirectory = location.endsWith("/"); - const init = { method: isDirectory ? "GET" : "HEAD" }; - const url = `${location}?${new URLSearchParams(flags)}`; + const init = { method: "GET" }; + const segments = location.split("/"); + let filename; + // If file, remove the last segment to query the parent directory. + if (!isDirectory) { + filename = segments.pop(); + } + const params = new URLSearchParams(flags); + const url = `${segments.join("/")}?${params}`; let response = await fetch(url, init); if (!response.ok) { @@ -63,39 +70,10 @@ export async function lsjson(location, flags = {}) { } let maxDepth = Number(flags.max_depth || (flags.recursive ? Infinity : 1)); - if (!flags.recursive) { + if (!isDirectory || !flags.recursive) { maxDepth = 1; } - if (!isDirectory) { - const headers = response.headers; - const { pathname } = new URL(location); - const Path = pathname.slice(1); - const Name = pathname.split("/").pop(); - const item = { - Path, - Name, - Size: Number(headers.get("Content-Length")), - MimeType: headers.get("Content-Type"), - ModTime: headers.get("Last-Modified"), - IsDir: false, - }; - - const body = new ReadableStream({ - start(controller) { - controller.enqueue(encoder.encode("[\n")); - controller.enqueue(encoder.encode(JSON.stringify(item) + "\n")); - controller.enqueue(encoder.encode("]\n")); - }, - }); - - return new Response(body, { - headers: { - "Content-Type": "application/json", - }, - }); - } - /** * A stream of JSON-encoded file objects, one per chunk/line. * Each JSON stringified line is followed by a comma and a newline. @@ -158,6 +136,13 @@ export async function lsjson(location, flags = {}) { } const name = basename(pathname); + + // If listing a file, skip other files. + if (filename && name !== filename) { + item = null; + return; + } + item.Name = name; /** @@ -220,12 +205,14 @@ export async function lsjson(location, flags = {}) { }); rewriter.on(`tr data[value]`, { element(element) { + if (!item) return; const value = element.getAttribute("value"); item.Size = Number(value); }, }); rewriter.on(`tr time[datetime]`, { element(element) { + if (!item) return; const value = element.getAttribute("datetime"); if (value) { item.ModTime = toLocaleISOString(value); diff --git a/deno.lock b/deno.lock index ac74844..8677ca5 100644 --- a/deno.lock +++ b/deno.lock @@ -19,7 +19,7 @@ "npm:base32-decode@^1.0.0": "npm:base32-decode@1.0.0", "npm:base32-encode@^2.0.0": "npm:base32-encode@2.0.0", "npm:fast-check@^3.19.0": "npm:fast-check@3.19.0", - "npm:wrangler@^3.62.0": "npm:wrangler@3.62.0_esbuild@0.17.19" + "npm:wrangler@^3.63.1": "npm:wrangler@3.63.1_esbuild@0.17.19" }, "npm": { "@cloudflare/kv-asset-handler@0.3.4": { @@ -28,24 +28,24 @@ "mime": "mime@3.0.0" } }, - "@cloudflare/workerd-darwin-64@1.20240620.1": { - "integrity": "sha512-YWeS2aE8jAzDefuus/3GmZcFGu3Ef94uCAoxsQuaEXNsiGM9NeAhPpKC1BJAlcv168U/Q1J+6hckcGtipf6ZcQ==", + "@cloudflare/workerd-darwin-64@1.20240701.0": { + "integrity": "sha512-XAZa4ZP+qyTn6JQQACCPH09hGZXP2lTnWKkmg5mPwT8EyRzCKLkczAf98vPP5bq7JZD/zORdFWRY0dOTap8zTQ==", "dependencies": {} }, - "@cloudflare/workerd-darwin-arm64@1.20240620.1": { - "integrity": "sha512-3rdND+EHpmCrwYX6hvxIBSBJ0f40tRNxond1Vfw7GiR1MJVi3gragiBx75UDFHCxfRw3J0GZ1qVlkRce2/Xbsg==", + "@cloudflare/workerd-darwin-arm64@1.20240701.0": { + "integrity": "sha512-w80ZVAgfH4UwTz7fXZtk7KmS2FzlXniuQm4ku4+cIgRTilBAuKqjpOjwUCbx5g13Gqcm9NuiHce+IDGtobRTIQ==", "dependencies": {} }, - "@cloudflare/workerd-linux-64@1.20240620.1": { - "integrity": "sha512-tURcTrXGeSbYqeM5ISVcofY20StKbVIcdxjJvNYNZ+qmSV9Fvn+zr7rRE+q64pEloVZfhsEPAlUCnFso5VV4XQ==", + "@cloudflare/workerd-linux-64@1.20240701.0": { + "integrity": "sha512-UWLr/Anxwwe/25nGv451MNd2jhREmPt/ws17DJJqTLAx6JxwGWA15MeitAIzl0dbxRFAJa+0+R8ag2WR3F/D6g==", "dependencies": {} }, - "@cloudflare/workerd-linux-arm64@1.20240620.1": { - "integrity": "sha512-TThvkwNxaZFKhHZnNjOGqIYCOk05DDWgO+wYMuXg15ymN/KZPnCicRAkuyqiM+R1Fgc4kwe/pehjP8pbmcf6sg==", + "@cloudflare/workerd-linux-arm64@1.20240701.0": { + "integrity": "sha512-3kCnF9kYgov1ggpuWbgpXt4stPOIYtVmPCa7MO2xhhA0TWP6JDUHRUOsnmIgKrvDjXuXqlK16cdg3v+EWsaPJg==", "dependencies": {} }, - "@cloudflare/workerd-windows-64@1.20240620.1": { - "integrity": "sha512-Y/BA9Yj0r7Al1HK3nDHcfISgFllw6NR3XMMPChev57vrVT9C9D4erBL3sUBfofHU+2U9L+ShLsl6obBpe3vvUw==", + "@cloudflare/workerd-windows-64@1.20240701.0": { + "integrity": "sha512-6IPGITRAeS67j3BH1rN4iwYWDt47SqJG7KlZJ5bB4UaNAia4mvMBSy/p2p4vA89bbXoDRjMtEvRu7Robu6O7hQ==", "dependencies": {} }, "@cspotcode/source-map-support@0.8.1": { @@ -286,11 +286,11 @@ "acorn-walk@8.3.3": { "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", "dependencies": { - "acorn": "acorn@8.12.0" + "acorn": "acorn@8.12.1" } }, - "acorn@8.12.0": { - "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "acorn@8.12.1": { + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dependencies": {} }, "aes-js@3.1.2": { @@ -502,19 +502,19 @@ "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", "dependencies": {} }, - "miniflare@3.20240620.0": { - "integrity": "sha512-NBMzqUE2mMlh/hIdt6U5MP+aFhEjKDq3l8CAajXAQa1WkndJdciWvzB2mfLETwoVFhMl/lphaVzyEN2AgwJpbQ==", + "miniflare@3.20240701.0": { + "integrity": "sha512-m9+I+7JNyqDGftCMKp9cK9pCZkK72hAL2mM9IWwhct+ZmucLBA8Uu6+rHQqA5iod86cpwOkrB2PrPA3wx9YNgw==", "dependencies": { "@cspotcode/source-map-support": "@cspotcode/source-map-support@0.8.1", - "acorn": "acorn@8.12.0", + "acorn": "acorn@8.12.1", "acorn-walk": "acorn-walk@8.3.3", "capnp-ts": "capnp-ts@0.7.0", "exit-hook": "exit-hook@2.2.1", "glob-to-regexp": "glob-to-regexp@0.4.1", "stoppable": "stoppable@1.1.0", "undici": "undici@5.28.4", - "workerd": "workerd@1.20240620.1", - "ws": "ws@8.17.1", + "workerd": "workerd@1.20240701.0", + "ws": "ws@8.18.0", "youch": "youch@3.3.3", "zod": "zod@3.23.8" } @@ -670,18 +670,18 @@ "ufo": "ufo@1.5.3" } }, - "workerd@1.20240620.1": { - "integrity": "sha512-Qoq+RrFNk4pvEO+kpJVn8uJ5TRE9YJx5jX5pC5LjdKlw1XeD8EdXt5k0TbByvWunZ4qgYIcF9lnVxhcDFo203g==", + "workerd@1.20240701.0": { + "integrity": "sha512-qSgNVqauqzNCij9MaJLF2c2ko3AnFioVSIxMSryGbRK+LvtGr9BKBt6JOxCb24DoJASoJDx3pe3DJHBVydUiBg==", "dependencies": { - "@cloudflare/workerd-darwin-64": "@cloudflare/workerd-darwin-64@1.20240620.1", - "@cloudflare/workerd-darwin-arm64": "@cloudflare/workerd-darwin-arm64@1.20240620.1", - "@cloudflare/workerd-linux-64": "@cloudflare/workerd-linux-64@1.20240620.1", - "@cloudflare/workerd-linux-arm64": "@cloudflare/workerd-linux-arm64@1.20240620.1", - "@cloudflare/workerd-windows-64": "@cloudflare/workerd-windows-64@1.20240620.1" + "@cloudflare/workerd-darwin-64": "@cloudflare/workerd-darwin-64@1.20240701.0", + "@cloudflare/workerd-darwin-arm64": "@cloudflare/workerd-darwin-arm64@1.20240701.0", + "@cloudflare/workerd-linux-64": "@cloudflare/workerd-linux-64@1.20240701.0", + "@cloudflare/workerd-linux-arm64": "@cloudflare/workerd-linux-arm64@1.20240701.0", + "@cloudflare/workerd-windows-64": "@cloudflare/workerd-windows-64@1.20240701.0" } }, - "wrangler@3.62.0_esbuild@0.17.19": { - "integrity": "sha512-TM1Bd8+GzxFw/JzwsC3i/Oss4LTWvIEWXXo1vZhx+7PHcsxdbnQGBBwPurHNJDSu2Pw22+2pCZiUGKexmgJksw==", + "wrangler@3.63.1_esbuild@0.17.19": { + "integrity": "sha512-fxMPNEyDc9pZNtQOuYqRikzv6lL5eP4S1zv7L/kw24uu1cCEmJ39j8bfJGzrAEqKDNsiFXVjEka0RjlpgEVWPg==", "dependencies": { "@cloudflare/kv-asset-handler": "@cloudflare/kv-asset-handler@0.3.4", "@esbuild-plugins/node-globals-polyfill": "@esbuild-plugins/node-globals-polyfill@0.2.3_esbuild@0.17.19", @@ -691,7 +691,7 @@ "date-fns": "date-fns@3.6.0", "esbuild": "esbuild@0.17.19", "fsevents": "fsevents@2.3.3", - "miniflare": "miniflare@3.20240620.0", + "miniflare": "miniflare@3.20240701.0", "nanoid": "nanoid@3.3.7", "path-to-regexp": "path-to-regexp@6.2.2", "resolve": "resolve@1.22.8", @@ -702,8 +702,8 @@ "xxhash-wasm": "xxhash-wasm@1.0.2" } }, - "ws@8.17.1": { - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "ws@8.18.0": { + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dependencies": {} }, "xxhash-wasm@1.0.2": { @@ -745,7 +745,7 @@ "npm:base32-decode@^1.0.0", "npm:base32-encode@^2.0.0", "npm:fast-check@^3.19.0", - "npm:wrangler@^3.62.0" + "npm:wrangler@^3.63.1" ] } }