-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.js
123 lines (100 loc) · 3.88 KB
/
server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
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") {
// forbid probably
}
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 fetch(
new URL(staticAsset, import.meta.url),
);
return new Response(response.body, {
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 fetch(
new URL(assetMap["/packages/[package]"], import.meta.url),
);
return new Response(response.body, {
headers: { "content-type": contentType("html") },
});
}
if (dest === "style") {
const [, cssFilePath] = packageName.split('css/');
const response = await fetch(
new URL(
assetMap[`/packages/[package]/css/${cssFilePath}`],
import.meta.url,
),
);
return new Response(response.body, {
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 fetch(
new URL(
assetMap[`/packages/[package]/${jsContext}${jsFilePath}`],
import.meta.url,
),
);
return new Response(response.body, {
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);
}