diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b512c09 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/css/style.css b/css/style.css deleted file mode 100644 index ac93dc6..0000000 --- a/css/style.css +++ /dev/null @@ -1,3 +0,0 @@ -jspm-package-name, jspm-package-version, jspm-package-description, jspm-package-license, jspm-package-file{ - display: block; -} \ No newline at end of file diff --git a/deploy.js b/deploy.js deleted file mode 100644 index 28fe663..0000000 --- a/deploy.js +++ /dev/null @@ -1,110 +0,0 @@ -// currently copy of server.js with Deno.readFile instead of fetch -import { serve } from "https://deno.land/std@0.116.0/http/server.ts"; -import { contentType, lookup } from "https://deno.land/x/media_types@v2.11.0/mod.ts"; -// import { removeSlashes } from "./functions/remove-slash.js"; - -const assetMap = { - "/": "./index.html", - "/dom/main.js": "./dom/main.js", - "/functions/main.js": "./functions/main.js", - "/functions/remove-slash.js": "./functions/remove-slash.js", - "/packages": "./packages.html", - "/packages/[package]": "./package.html", - "/packages/[package]/css/style.css": "./css/style.css", - "/packages/[package]/dom/main.js": "./dom/main.js", - "/packages/[package]/functions/main.js": "./functions/main.js", - "/packages/[package]/functions/remove-slash.js": "./functions/remove-slash.js", - "/packages/[package]/components/package.js": "./components/package.js", -}; - -async function requestHandler(request) { - try { - const site = request.headers.get("sec-fetch-site"); - if (site !== "same-origin") { - // 👻 - } - const mode = request.headers.get("sec-fetch-mode"); - const dest = request.headers.get("sec-fetch-dest"); - - const { pathname } = new URL(request.url); - - const staticAsset = assetMap[pathname]; - - if (staticAsset) { - const response = await Deno.readFile(staticAsset); - - return new Response(response, { - headers: { "content-type": contentType(lookup(staticAsset)) }, - }); - } - - // const [pathPrefix, packageName] = removeSlashes(pathname).split("/"); - - if (pathname.startsWith("/packages/")) { - const packageName = pathname.substring(10); - - if (packageName) { - if (mode === "navigate" || dest === "document") { - const response = await Deno.readFile(assetMap["/packages/[package]"]) - - return new Response(response, { - headers: { "content-type": contentType("html") }, - }); - } - - if (dest === "style") { - const [, cssFilePath] = packageName.split('css/'); - const response = await Deno.readFile(assetMap[`/packages/[package]/css/${cssFilePath}`]); - - return new Response(response, { - headers: { "content-type": contentType("css") }, - }); - } - - if (dest === "script") { - const jsContexts = ['functions/', 'components/', 'dom/']; - const jsContext = jsContexts.find(jsContext => packageName.includes(jsContext)); - - if(jsContext){ - const [, jsFilePath] = packageName.split(jsContext) - const response = await Deno.readFile(assetMap[`/packages/[package]/${jsContext}${jsFilePath}`]); - - return new Response(response, { - headers: { "content-type": contentType("js") }, - }); - } - } - } - } - - if (pathname.startsWith("/api/")) { - const packageName = pathname.substring(5); - const NPM_PROVIDER_URL = "https://ga.jspm.io/npm:"; - - let version = packageName.split("@")[packageName.startsWith('@') ? 2 : 1]; - - if (!version) { - const response = await fetch(`${NPM_PROVIDER_URL}${packageName}`); - version = await response.text(); - } - - return fetch(`${NPM_PROVIDER_URL}${packageName}@${version}/package.json`); - } - - return new Response("404", { - headers: { "content-type": contentType("html") }, - }); - } catch (error) { - return new Response(error.message || error.toString(), { status: 500 }); - } -} - -if (import.meta?.main) { - const timestamp = Date.now(); - const humanReadableDateTime = new Date(timestamp).toLocaleString(); - - console.log("Current Date: ", humanReadableDateTime); - console.info(`Server Listening on http://localhost:8000`); - - await serve(requestHandler); -} diff --git a/dom/main.js b/dom/main.js deleted file mode 100644 index a2614b5..0000000 --- a/dom/main.js +++ /dev/null @@ -1,25 +0,0 @@ -import { render, jsx } from 'nano-jsx'; -import { marked } from 'marked'; -import Package from '../components/package.js'; - -async function main({ mountDOMElement, packageName }) { - try { - const { default: data } = await import(`/api/${packageName}`, { - assert: { type: "json" }, - }); - - const { name, description, keywords, version, homepage, license, files, exports } = data; - - // /^readme\.[^\.]+$/i - const readme = files.find(file => file.toLowerCase() === 'readme.md'); - // Dry this - const readmeFile = await fetch(`https://ga.jspm.io/npm:${name}@${version}/${readme}`); - const readmeFileContent = await readmeFile.text(); - const html = marked.parse(readmeFileContent); - render(jsx`<${Package} name=${name} description=${description} version=${version} homepage=${homepage} license=${license} files=${files} exports=${exports} readme=${html} />`, mountDOMElement) - } catch (error) { - console.error(error); - } -} - -export { main }; diff --git a/functions/main.js b/functions/main.js deleted file mode 100644 index e4180d9..0000000 --- a/functions/main.js +++ /dev/null @@ -1 +0,0 @@ -export { removeSlashes } from './remove-slash.js'; \ No newline at end of file diff --git a/functions/package/[[package]].js b/functions/package/[[package]].js new file mode 100644 index 0000000..cc7f978 --- /dev/null +++ b/functions/package/[[package]].js @@ -0,0 +1,100 @@ +import { Helmet, jsx, renderSSR } from "nano-jsx"; +import { marked } from "marked"; +import Package from "../../components/package.js"; + +async function customFetch(url, options){ + const response = await fetch(url, options); + if(response.status === 404 || response.status === 500){ + throw new Error(`fetch error on ${url}`); + } + return response; +} + +async function onRequestGet({ params, env, waitUntil }) { + try { + const NPM_PROVIDER_URL = "https://ga.jspm.io/npm:"; + const packageName = params.package.join("/"); + const baseURL = `${NPM_PROVIDER_URL}${packageName}`; + const jspmPackage = await fetch( + `${baseURL}/package.json`, + { + cf: { + cacheTtlByStatus: { "200-299": 86400, 404: 1, "500-599": 0 }, + }, + }, + ) + const readmeFilesToFetch = ["README.md", "readme.md"]; + + const readmeResponse = await Promise.any( + readmeFilesToFetch.map((file) => + customFetch( + `${baseURL}/${file}`, + { + cf: { + cacheTtlByStatus: { "200-299": 86400, 404: 1, "500-599": 0 }, + }, + }, + ) + ), + ); + + const readmeFileContent = await readmeResponse.text(); + + const readmeHTML = marked.parse(readmeFileContent); + + const { + name, + description, + keywords, + version, + homepage, + license, + files, + exports, + } = await jspmPackage.json(); + + const app = renderSSR( + jsx + `<${Package} name=${name} description=${description} version=${version} homepage=${homepage} license=${license} files=${files} exports=${exports} readme=${readmeHTML} keywords=${keywords} />`, + ); + + const { body, head, footer } = Helmet.SSR(app); + + const css = ` + jspm-package-name, jspm-package-version, jspm-package-description, jspm-package-license, jspm-package-file{ + display: block; + } + `; + + const html = ` + + +
+