@package-verse/esmpack 1.0.22 → 1.0.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/App.html +19 -0
- package/Test.html +19 -0
- package/dist/serve/WebServer.js +15 -1
- package/dist/serve/WebServer.js.map +1 -1
- package/dist/serve/send/sendFileList.js +38 -0
- package/dist/serve/send/sendFileList.js.map +1 -0
- package/dist/ui/HtmlControl.js +47 -0
- package/dist/ui/HtmlControl.js.map +1 -0
- package/dist/ui/PropertyStore.js +53 -0
- package/dist/ui/PropertyStore.js.map +1 -0
- package/dist/ui/StringHelper.js +69 -0
- package/dist/ui/StringHelper.js.map +1 -0
- package/dist/ui/XNode.js +85 -0
- package/dist/ui/XNode.js.map +1 -0
- package/dist/ui/app/App.js +24 -0
- package/dist/ui/app/App.js.map +1 -0
- package/dist/ui/core/sleep.js +13 -0
- package/dist/ui/core/sleep.js.map +1 -0
- package/dist/ui/file-list/FileList.js +51 -0
- package/dist/ui/file-list/FileList.js.map +1 -0
- package/package.json +1 -1
- package/src/serve/WebServer.ts +17 -1
- package/src/serve/send/sendFileList.ts +49 -0
- package/src/ui/HtmlControl.ts +59 -0
- package/src/ui/PropertyStore.ts +67 -0
- package/src/ui/StringHelper.ts +81 -0
- package/src/ui/XNode.ts +98 -0
- package/src/ui/app/App.css +25 -0
- package/src/ui/app/App.tsx +37 -0
- package/src/ui/core/sleep.ts +13 -0
- package/src/ui/file-list/FileList.css +25 -0
- package/src/ui/file-list/FileList.tsx +57 -0
- package/tsconfig.json +2 -1
- package/tsconfig.tsbuildinfo +1 -0
- package/dist/tsconfig.tsbuildinfo +0 -1
package/App.html
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<head>
|
|
3
|
+
<title>JS Components</title>
|
|
4
|
+
</head>
|
|
5
|
+
<body>
|
|
6
|
+
<script type="importmap">
|
|
7
|
+
{
|
|
8
|
+
"imports": {
|
|
9
|
+
"@package-verse/esmpack/": "/node_modules/@package-verse/esmpack/"
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
</script>
|
|
13
|
+
<script>
|
|
14
|
+
const cs = document.currentScript;
|
|
15
|
+
import("@package-verse/esmpack/dist/ui/app/App.js")
|
|
16
|
+
.then((r) => ESMPack.render(r, cs), (error) => cs.replaceWith(document.createTextNode(error.stack || error)));
|
|
17
|
+
</script>
|
|
18
|
+
</body>
|
|
19
|
+
</html>
|
package/Test.html
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<head>
|
|
3
|
+
<title>JS Components</title>
|
|
4
|
+
</head>
|
|
5
|
+
<body>
|
|
6
|
+
<script type="importmap">
|
|
7
|
+
{
|
|
8
|
+
"imports": {
|
|
9
|
+
"@package-verse/esmpack/": "/"
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
</script>
|
|
13
|
+
<script>
|
|
14
|
+
const cs = document.currentScript;
|
|
15
|
+
import("@package-verse/esmpack/dist/ui/app/App.js")
|
|
16
|
+
.then((r) => ESMPack.render(r, cs), (error) => cs.replaceWith(document.createTextNode(error.stack || error)));
|
|
17
|
+
</script>
|
|
18
|
+
</body>
|
|
19
|
+
</html>
|
package/dist/serve/WebServer.js
CHANGED
|
@@ -6,9 +6,23 @@ import { createProxyMiddleware, fixRequestBody } from "http-proxy-middleware";
|
|
|
6
6
|
import colors from "colors";
|
|
7
7
|
import sendJSHost from "./send/sendJSHost.js";
|
|
8
8
|
import sendNonJSModule from "./send/sendNonJSModule.js";
|
|
9
|
+
import sendFileList from "./send/sendFileList.js";
|
|
9
10
|
let middleware;
|
|
10
11
|
export default function WebServer(req, res) {
|
|
11
|
-
const
|
|
12
|
+
const url = new URL(req.url, "http://a");
|
|
13
|
+
const pathname = url.pathname.substring(1);
|
|
14
|
+
if (!pathname) {
|
|
15
|
+
// send list...
|
|
16
|
+
res.writeHead(301, {
|
|
17
|
+
"location": "/node_modules/@package-verse/esmpack/App.html"
|
|
18
|
+
});
|
|
19
|
+
res.end();
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (pathname === "$search") {
|
|
23
|
+
sendFileList(url, req, res);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
12
26
|
// check if path exists...
|
|
13
27
|
const fullPath = path.resolve(ProcessOptions.cwd, pathname);
|
|
14
28
|
if (existsSync(fullPath)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebServer.js","sourceRoot":"","sources":["../../src/serve/WebServer.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,aAAa,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,UAAU,MAAM,sBAAsB,CAAC;AAC9C,OAAO,eAAe,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"WebServer.js","sourceRoot":"","sources":["../../src/serve/WebServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { readdirSync, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { join, relative } from "node:path";
|
|
3
|
+
import { ProcessOptions } from "../../ProcessArgs.js";
|
|
4
|
+
export default function sendFileList(url, req, res) {
|
|
5
|
+
const packed = /yes|true/i.test(url.searchParams.get("packed"));
|
|
6
|
+
const search = url.searchParams.get("search") || "";
|
|
7
|
+
const entries = readdirSync(ProcessOptions.cwd, { recursive: true, withFileTypes: true })
|
|
8
|
+
.filter((d) => !d.isDirectory()
|
|
9
|
+
&& !d.name.startsWith(".")
|
|
10
|
+
&& d.name.endsWith(".js")
|
|
11
|
+
&& d.name !== "node_modules"
|
|
12
|
+
&& !d.parentPath.replaceAll("\\", "/").includes("node_modules/")
|
|
13
|
+
&& (search ? d.name.toLowerCase().includes(search.toLowerCase()) : true))
|
|
14
|
+
.map((d) => {
|
|
15
|
+
const fullPath = relative(ProcessOptions.cwd, join(d.parentPath, d.name)).replaceAll("\\", "/");
|
|
16
|
+
let size = 0, mtime = new Date();
|
|
17
|
+
try {
|
|
18
|
+
const s = statSync(fullPath);
|
|
19
|
+
size = s.size;
|
|
20
|
+
mtime = s.mtime;
|
|
21
|
+
}
|
|
22
|
+
catch { }
|
|
23
|
+
const isPacked = /\@Pack/.test(readFileSync(fullPath, "utf-8"));
|
|
24
|
+
return { name: d.name, fullPath, isPacked, size, mtime };
|
|
25
|
+
})
|
|
26
|
+
.filter((x) => packed ? x.isPacked : true)
|
|
27
|
+
.sort((a, b) => {
|
|
28
|
+
// if (a.isDir !== b.isDir) return a.isDir ? -1 : 1;
|
|
29
|
+
return a.name.localeCompare(b.name);
|
|
30
|
+
});
|
|
31
|
+
const text = JSON.stringify(entries);
|
|
32
|
+
res.writeHead(200, {
|
|
33
|
+
"Content-Type": "text/json",
|
|
34
|
+
"cache-control": "no-cache"
|
|
35
|
+
});
|
|
36
|
+
res.end(text);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=sendFileList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sendFileList.js","sourceRoot":"","sources":["../../../src/serve/send/sendFileList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE9D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,GAAQ,EAAE,GAAoB,EAAE,GAAmB;IAIpF,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEhE,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEpD,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAC,CAAC;SACnF,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACV,CAAC,CAAC,CAAC,WAAW,EAAE;WACb,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;WACvB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;WACtB,CAAC,CAAC,IAAI,KAAK,cAAc;WACzB,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC;WAC7D,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAC3E;SACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACP,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAChG,IAAI,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC;YACD,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC7B,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;YACd,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QAChE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC7D,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;SACzC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACX,oDAAoD;QACpD,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAGP,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAErC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,cAAc,EAAE,WAAW;QAC3B,eAAe,EAAE,UAAU;KAC5B,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
const ESMPack = window.ESMPack ??= {};
|
|
2
|
+
ESMPack.render = (imports, cs) => {
|
|
3
|
+
const name = customElements.getName(imports.default);
|
|
4
|
+
const c = document.createElement(name);
|
|
5
|
+
cs.replaceWith(c);
|
|
6
|
+
};
|
|
7
|
+
export default class HtmlControl extends HTMLElement {
|
|
8
|
+
connectedCallback() {
|
|
9
|
+
this.onConnected().catch(console.error);
|
|
10
|
+
}
|
|
11
|
+
onConnected() {
|
|
12
|
+
const ready = (async () => {
|
|
13
|
+
await this.prepare();
|
|
14
|
+
})();
|
|
15
|
+
Object.defineProperty(this, "onConnected", { value: () => ready });
|
|
16
|
+
return ready;
|
|
17
|
+
}
|
|
18
|
+
getAttributeAsNumber(name, def) {
|
|
19
|
+
const a = this.getAttribute(name);
|
|
20
|
+
if (!a) {
|
|
21
|
+
return def;
|
|
22
|
+
}
|
|
23
|
+
const n = Number.parseFloat(a);
|
|
24
|
+
return Number.isNaN(n) ? def : n;
|
|
25
|
+
}
|
|
26
|
+
getAttributeAsTime(name, def) {
|
|
27
|
+
const a = this.getAttribute(name);
|
|
28
|
+
if (!a) {
|
|
29
|
+
return def;
|
|
30
|
+
}
|
|
31
|
+
let n = Number.parseFloat(a);
|
|
32
|
+
if (Number.isNaN(n)) {
|
|
33
|
+
n = def;
|
|
34
|
+
}
|
|
35
|
+
if (a.endsWith("ms")) {
|
|
36
|
+
return n;
|
|
37
|
+
}
|
|
38
|
+
if (a.endsWith("s")) {
|
|
39
|
+
return n * 1000;
|
|
40
|
+
}
|
|
41
|
+
if (a.endsWith("min")) {
|
|
42
|
+
return n * 60 * 1000;
|
|
43
|
+
}
|
|
44
|
+
return n;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=HtmlControl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HtmlControl.js","sourceRoot":"","sources":["../../src/ui/HtmlControl.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAI,MAAc,CAAC,OAAO,KAAK,EAAE,CAAC;AAC/C,OAAO,CAAC,MAAM,GAAG,CAAC,OAAO,EAAE,EAAqB,EAAE,EAAE;IAChD,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACvC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,CAAC,OAAO,OAAgB,WAAY,SAAQ,WAAW;IAEzD,iBAAiB;QAEb,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,WAAW;QAEP,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE;YAEtB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAEzB,CAAC,CAAC,EAAE,CAAC;QAEL,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,EAAC,CAAC,CAAA;QACjE,OAAO,KAAK,CAAC;IACjB,CAAC;IAIS,oBAAoB,CAAC,IAAY,EAAE,GAAW;QACpD,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,CAAC,EAAE,CAAC;YACL,OAAO,GAAG,CAAC;QACf,CAAC;QACD,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC/B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAES,kBAAkB,CAAC,IAAY,EAAE,GAAW;QAClD,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,CAAC,EAAE,CAAC;YACL,OAAO,GAAG,CAAC;QACf,CAAC;QACD,IAAI,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAClB,CAAC,GAAG,GAAG,CAAC;QACZ,CAAC;QACD,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACnB,OAAO,CAAC,CAAC;QACb,CAAC;QACD,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QACzB,CAAC;QACD,OAAO,CAAC,CAAC;IACb,CAAC;CAEJ"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { StringHelper } from "./StringHelper.js";
|
|
2
|
+
export class PropertyStore {
|
|
3
|
+
static register(key, fx) {
|
|
4
|
+
this.properties.set(key, fx);
|
|
5
|
+
}
|
|
6
|
+
static setProperty(element, key, value) {
|
|
7
|
+
switch (key) {
|
|
8
|
+
case "text":
|
|
9
|
+
case "textContent":
|
|
10
|
+
element.textContent = value?.toString();
|
|
11
|
+
return;
|
|
12
|
+
case "innerHTML":
|
|
13
|
+
element.innerHTML = value?.toString();
|
|
14
|
+
return;
|
|
15
|
+
case "style":
|
|
16
|
+
case "class":
|
|
17
|
+
element.setAttribute(key, value?.toString());
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const handler = this.properties.get(key);
|
|
21
|
+
if (handler) {
|
|
22
|
+
handler(element, value);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (key.startsWith("style")) {
|
|
26
|
+
key = StringHelper.fromCamelToHyphen(key.substring(5));
|
|
27
|
+
element.style.setProperty(key, value);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
element.setAttribute(key, value);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
PropertyStore.properties = new Map();
|
|
34
|
+
PropertyStore.register("style-display", (e, v) => {
|
|
35
|
+
if (typeof v === "boolean") {
|
|
36
|
+
if (v) {
|
|
37
|
+
if (e.style.display === "none") {
|
|
38
|
+
e.style.removeProperty("display");
|
|
39
|
+
}
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
e.style.display = "none";
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
e.style.display = v?.toString() ?? "";
|
|
46
|
+
});
|
|
47
|
+
PropertyStore.register("event-click", (e, v) => {
|
|
48
|
+
e.addEventListener("click", v);
|
|
49
|
+
});
|
|
50
|
+
PropertyStore.register("event-input", (e, v) => {
|
|
51
|
+
e.addEventListener("input", v);
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=PropertyStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PropertyStore.js","sourceRoot":"","sources":["../../src/ui/PropertyStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,OAAO,aAAa;IAItB,MAAM,CAAC,QAAQ,CAAC,GAAW,EAAE,EAA8C;QACvE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,OAAoB,EAAE,GAAW,EAAE,KAAU;QAC5D,QAAO,GAAG,EAAE,CAAC;YACT,KAAK,MAAM,CAAC;YACZ,KAAK,aAAa;gBACd,OAAO,CAAC,WAAW,GAAG,KAAK,EAAE,QAAQ,EAAE,CAAC;gBACxC,OAAO;YACX,KAAK,WAAW;gBACZ,OAAO,CAAC,SAAS,GAAG,KAAK,EAAE,QAAQ,EAAE,CAAC;gBACtC,OAAO;YACX,KAAK,OAAO,CAAC;YACb,KAAK,OAAO;gBACR,OAAO,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAC7C,OAAO;QACf,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACxB,OAAO;QACX,CAAC;QAED,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,GAAG,GAAG,YAAY,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACvD,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACtC,OAAO;QACX,CAAC;QAED,OAAO,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;;AAlCc,wBAAU,GAAyD,IAAI,GAAG,EAAE,CAAC;AAqChG,aAAa,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;IAC7C,IAAI,OAAO,CAAC,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,CAAC,EAAE,CAAC;YACJ,IAAG,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;gBAC5B,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YACtC,CAAC;YACD,OAAO;QACX,CAAC;QACD,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;QACzB,OAAO;IACX,CAAC;IACD,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC1C,CAAC,CAAC,CAAC;AAIH,aAAa,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;IAC3C,CAAC,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,aAAa,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;IAC3C,CAAC,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export class StringHelper {
|
|
2
|
+
static escapeRegExp(text) {
|
|
3
|
+
return text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
4
|
+
}
|
|
5
|
+
static createContainsRegExp(text) {
|
|
6
|
+
return new RegExp(this.escapeRegExp(text), "i");
|
|
7
|
+
}
|
|
8
|
+
static createContainsAnyWordRegExp(text) {
|
|
9
|
+
return new RegExp(text.split(/\s+/g).map((x) => `(${this.escapeRegExp(x)})`).join("|"), "i");
|
|
10
|
+
}
|
|
11
|
+
static containsIgnoreCase(source, test) {
|
|
12
|
+
if (!source) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
if (!test) {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
return this.createContainsRegExp(test).test(source);
|
|
19
|
+
}
|
|
20
|
+
static containsAnyWordIgnoreCase(source, test) {
|
|
21
|
+
if (!source) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
if (!test) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
return this.createContainsAnyWordRegExp(test).test(source);
|
|
28
|
+
}
|
|
29
|
+
static fromCamelToHyphen(input) {
|
|
30
|
+
return input.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase();
|
|
31
|
+
}
|
|
32
|
+
static fromCamelToUnderscore(input) {
|
|
33
|
+
return input.replace(/([a-z])([A-Z])/g, "$1_$2").toLowerCase();
|
|
34
|
+
}
|
|
35
|
+
static fromCamelToPascal(input) {
|
|
36
|
+
return input[0].toUpperCase() + input.substr(1);
|
|
37
|
+
}
|
|
38
|
+
static fromHyphenToCamel(input) {
|
|
39
|
+
return input.replace(/-([a-z])/g, (g) => g[1].toUpperCase());
|
|
40
|
+
}
|
|
41
|
+
static fromUnderscoreToCamel(input) {
|
|
42
|
+
return input.replace(/\_([a-z])/g, (g) => g[1].toUpperCase());
|
|
43
|
+
}
|
|
44
|
+
static fromPascalToCamel(input) {
|
|
45
|
+
return input[0].toLowerCase() + input.substr(1);
|
|
46
|
+
}
|
|
47
|
+
static fromPascalToTitleCase(s) {
|
|
48
|
+
return s.replace(/([A-Z])/gm, (x, g, i) => i ? " " + x : x);
|
|
49
|
+
}
|
|
50
|
+
;
|
|
51
|
+
static parseTime(text, def = 0) {
|
|
52
|
+
text = text?.trim();
|
|
53
|
+
if (!text) {
|
|
54
|
+
return def;
|
|
55
|
+
}
|
|
56
|
+
const time = parseFloat(text);
|
|
57
|
+
if (text.endsWith("ms")) {
|
|
58
|
+
return time;
|
|
59
|
+
}
|
|
60
|
+
if (text.endsWith("s")) {
|
|
61
|
+
return time * 1000;
|
|
62
|
+
}
|
|
63
|
+
if (text.endsWith("min")) {
|
|
64
|
+
return time * 60 * 1000;
|
|
65
|
+
}
|
|
66
|
+
return time;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=StringHelper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StringHelper.js","sourceRoot":"","sources":["../../src/ui/StringHelper.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/XNode.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { PropertyStore } from "./PropertyStore.js";
|
|
2
|
+
export class XNode {
|
|
3
|
+
static create(
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
5
|
+
name, attribs, ...nodes) {
|
|
6
|
+
if (typeof name === "function") {
|
|
7
|
+
return name(attribs ?? {}, ...nodes);
|
|
8
|
+
}
|
|
9
|
+
return new XNode(name, attribs, nodes);
|
|
10
|
+
}
|
|
11
|
+
static render(root, node) {
|
|
12
|
+
return node.render(root);
|
|
13
|
+
}
|
|
14
|
+
static append(root, node) {
|
|
15
|
+
return node.appendTo(root);
|
|
16
|
+
}
|
|
17
|
+
constructor(name, attributes, children) {
|
|
18
|
+
this.name = name;
|
|
19
|
+
this.attributes = attributes;
|
|
20
|
+
this.children = children;
|
|
21
|
+
}
|
|
22
|
+
appendTo(parent, doc = parent.ownerDocument ?? document) {
|
|
23
|
+
const element = doc.createElement(this.name);
|
|
24
|
+
this.render(element);
|
|
25
|
+
parent.appendChild(element);
|
|
26
|
+
return element;
|
|
27
|
+
}
|
|
28
|
+
render(root) {
|
|
29
|
+
const { attributes, children } = this;
|
|
30
|
+
if (attributes) {
|
|
31
|
+
for (const key in attributes) {
|
|
32
|
+
if (Object.prototype.hasOwnProperty.call(attributes, key)) {
|
|
33
|
+
PropertyStore.setProperty(root, key, attributes[key]);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (children) {
|
|
38
|
+
for (const iterator of children.flat(2)) {
|
|
39
|
+
switch (typeof iterator) {
|
|
40
|
+
case "object":
|
|
41
|
+
const child = root.ownerDocument.createElement(iterator.name);
|
|
42
|
+
iterator.render(child);
|
|
43
|
+
root.appendChild(child);
|
|
44
|
+
continue;
|
|
45
|
+
case "boolean":
|
|
46
|
+
if (!iterator) {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
root.append(iterator?.toString());
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return root;
|
|
55
|
+
}
|
|
56
|
+
renderToString(nest = "") {
|
|
57
|
+
const { name, attributes, children } = this;
|
|
58
|
+
let a = "";
|
|
59
|
+
if (attributes) {
|
|
60
|
+
for (const key in attributes) {
|
|
61
|
+
if (Object.prototype.hasOwnProperty.call(attributes, key)) {
|
|
62
|
+
const element = attributes[key];
|
|
63
|
+
a += ` ${key}=${JSON.stringify(element)}`;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (this.children) {
|
|
68
|
+
for (const child of this.children) {
|
|
69
|
+
if (typeof child === "string") {
|
|
70
|
+
children.push(child);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (!child) {
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
children.push(child.renderToString(nest + "\t"));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (!name) {
|
|
80
|
+
return `\n${nest}\t${children.join("\n\t")}`;
|
|
81
|
+
}
|
|
82
|
+
return `${nest}<${name}${a}>\n${nest}\t${children.join("\n\t")}\n${nest}</${name}>`;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=XNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"XNode.js","sourceRoot":"","sources":["../../src/ui/XNode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import HtmlControl from "../HtmlControl.js";
|
|
2
|
+
import { XNode } from "../XNode.js";
|
|
3
|
+
import "./App.css";
|
|
4
|
+
import "../file-list/FileList.js";
|
|
5
|
+
export default class App extends HtmlControl {
|
|
6
|
+
async prepare() {
|
|
7
|
+
this.oninput = (e) => {
|
|
8
|
+
this.fileList.setAttribute("search", this.search.value);
|
|
9
|
+
this.fileList.setAttribute("packed", this.packed.checked ? "true" : "false");
|
|
10
|
+
};
|
|
11
|
+
XNode.render(this, XNode.create("div", null,
|
|
12
|
+
XNode.create("header", null,
|
|
13
|
+
XNode.create("input", { type: "search" }),
|
|
14
|
+
XNode.create("input", { type: "checkbox", checked: "true" }),
|
|
15
|
+
" Only Packed"),
|
|
16
|
+
XNode.create("main", null,
|
|
17
|
+
XNode.create("file-list", null))));
|
|
18
|
+
this.fileList = this.querySelector("file-list");
|
|
19
|
+
this.search = this.querySelector(`input[type="search"]`);
|
|
20
|
+
this.packed = this.querySelector(`input[type="checkbox"]`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
customElements.define("app-container", App);
|
|
24
|
+
//# sourceMappingURL=App.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.js","sourceRoot":"","sources":["../../../src/ui/app/App.tsx"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,WAAW,CAAC;AAEnB,OAAO,0BAA0B,CAAC;AAElC,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,WAAW;IAMxC,KAAK,CAAC,OAAO;QAET,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,EAAE;YACjB,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACxD,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACjF,CAAC,CAAC;QAEF,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;YACf;gBACI,wBAAO,IAAI,EAAC,QAAQ,GAAE;gBACtB,wBAAO,IAAI,EAAC,UAAU,EAAC,OAAO,EAAC,MAAM,GAAE;+BAClC;YACT;gBACI,+BAAuB,CACpB,CACL,CAAC,CAAC;QAER,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAgB,CAAC;QAC/D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAAqB,CAAC;QAC7E,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAqB,CAAC;IACnF,CAAC;CACJ;AAED,cAAc,CAAC,MAAM,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export const sleep = (n, signal) => new Promise((resolve, reject) => {
|
|
2
|
+
const c = setTimeout(() => {
|
|
3
|
+
if (signal?.aborted) {
|
|
4
|
+
return;
|
|
5
|
+
}
|
|
6
|
+
resolve();
|
|
7
|
+
}, n);
|
|
8
|
+
signal?.addEventListener("abort", () => {
|
|
9
|
+
reject("aborted");
|
|
10
|
+
clearTimeout(c);
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=sleep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sleep.js","sourceRoot":"","sources":["../../../src/ui/core/sleep.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,MAAoB,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IACpF,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE;QACtB,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YAClB,OAAO;QACX,CAAC;QACD,OAAO,EAAE,CAAC;IACd,CAAC,EAAE,CAAC,CAAC,CAAC;IACN,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,SAAS,CAAC,CAAC;QAClB,YAAY,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import "../core.js";
|
|
2
|
+
import { sleep } from "../core/sleep.js";
|
|
3
|
+
import HtmlControl from "../HtmlControl.js";
|
|
4
|
+
import { XNode } from "../XNode.js";
|
|
5
|
+
import "./FileList.css";
|
|
6
|
+
const logError = (error) => {
|
|
7
|
+
if (/abort|cancel|timeout/i.test(error?.stack ?? error)) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
console.error(error);
|
|
11
|
+
};
|
|
12
|
+
class FileList extends HtmlControl {
|
|
13
|
+
constructor() {
|
|
14
|
+
super(...arguments);
|
|
15
|
+
this.ac = new AbortController();
|
|
16
|
+
}
|
|
17
|
+
attributeChangedCallback(name, oldValue, newValue) {
|
|
18
|
+
switch (name) {
|
|
19
|
+
case "search":
|
|
20
|
+
case "packed":
|
|
21
|
+
this.ac.abort();
|
|
22
|
+
this.ac = new AbortController();
|
|
23
|
+
this.updateSearch(this.ac.signal).catch(logError);
|
|
24
|
+
break;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async prepare() {
|
|
28
|
+
this.updateSearch(this.ac.signal).catch(logError);
|
|
29
|
+
}
|
|
30
|
+
async updateSearch(signal) {
|
|
31
|
+
await sleep(250, signal);
|
|
32
|
+
const search = this.getAttribute("search") || "";
|
|
33
|
+
const packed = this.getAttribute("packed") || "true";
|
|
34
|
+
const url = new URL("/$search", location.href);
|
|
35
|
+
url.searchParams.set("search", search);
|
|
36
|
+
url.searchParams.set("packed", packed);
|
|
37
|
+
const rs = await fetch(url, { signal });
|
|
38
|
+
const items = await rs.json();
|
|
39
|
+
this.innerHTML = "";
|
|
40
|
+
for (const { name, fullPath, isPacked } of items) {
|
|
41
|
+
XNode.append(this, XNode.create("div", null,
|
|
42
|
+
XNode.create("a", { href: "/" + fullPath.replace(".js", ".html") },
|
|
43
|
+
isPacked ? "🌐" : "📄",
|
|
44
|
+
name)));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
FileList.observedAttributes = ["search", "packed"];
|
|
49
|
+
export default FileList;
|
|
50
|
+
customElements.define("file-list", FileList);
|
|
51
|
+
//# sourceMappingURL=FileList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileList.js","sourceRoot":"","sources":["../../../src/ui/file-list/FileList.tsx"],"names":[],"mappings":"AAAA,OAAO,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,gBAAgB,CAAC;AAExB,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,EAAE;IACvB,IAAG,uBAAuB,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,KAAK,CAAC,EAAE,CAAC;QACrD,OAAO;IACX,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC,CAAA;AAED,MAAqB,QAAS,SAAQ,WAAW;IAAjD;;QAII,OAAE,GAAG,IAAI,eAAe,EAAE,CAAC;IAoC/B,CAAC;IAlCG,wBAAwB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ;QAC7C,QAAO,IAAI,EAAE,CAAC;YACV,KAAK,QAAQ,CAAC;YACd,KAAK,QAAQ;gBACT,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;gBAChB,IAAI,CAAC,EAAE,GAAG,IAAI,eAAe,EAAE,CAAC;gBAChC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAClD,MAAM;QACd,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO;QACV,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAmB;QAClC,MAAM,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC;QACrD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC/C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACvC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAE9B,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QAEpB,KAAI,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,KAAK,EAAE,CAAC;YAC9C,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;gBACf,oBAAG,IAAI,EAAE,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;oBAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;oBAAG,IAAI,CAAK,CACnF,CAAC,CAAA;QACX,CAAC;IACL,CAAC;;AApCM,2BAAkB,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,AAAvB,CAAwB;eAFhC,QAAQ;AA0C7B,cAAc,CAAC,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC"}
|
package/package.json
CHANGED
package/src/serve/WebServer.ts
CHANGED
|
@@ -7,12 +7,28 @@ import { createProxyMiddleware, fixRequestBody } from "http-proxy-middleware";
|
|
|
7
7
|
import colors from "colors";
|
|
8
8
|
import sendJSHost from "./send/sendJSHost.js";
|
|
9
9
|
import sendNonJSModule from "./send/sendNonJSModule.js";
|
|
10
|
+
import sendFileList from "./send/sendFileList.js";
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
let middleware;
|
|
13
14
|
|
|
14
15
|
export default function WebServer(req: IncomingMessage, res: ServerResponse) {
|
|
15
|
-
const
|
|
16
|
+
const url = new URL(req.url, "http://a");
|
|
17
|
+
const pathname = url.pathname.substring(1);
|
|
18
|
+
|
|
19
|
+
if (!pathname) {
|
|
20
|
+
// send list...
|
|
21
|
+
res.writeHead(301, {
|
|
22
|
+
"location": "/node_modules/@package-verse/esmpack/App.html"
|
|
23
|
+
})
|
|
24
|
+
res.end();
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (pathname === "$search") {
|
|
29
|
+
sendFileList(url, req, res);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
16
32
|
|
|
17
33
|
// check if path exists...
|
|
18
34
|
const fullPath = path.resolve(ProcessOptions.cwd, pathname);
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { readdirSync, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { IncomingMessage, ServerResponse } from "node:http";
|
|
3
|
+
import { join, relative } from "node:path";
|
|
4
|
+
import { ProcessOptions } from "../../ProcessArgs.js";
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
export default function sendFileList(url: URL, req: IncomingMessage, res: ServerResponse) {
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
const packed = /yes|true/i.test(url.searchParams.get("packed"));
|
|
12
|
+
|
|
13
|
+
const search = url.searchParams.get("search") || "";
|
|
14
|
+
|
|
15
|
+
const entries = readdirSync(ProcessOptions.cwd, { recursive: true, withFileTypes: true})
|
|
16
|
+
.filter((d) =>
|
|
17
|
+
!d.isDirectory()
|
|
18
|
+
&& !d.name.startsWith(".")
|
|
19
|
+
&& d.name.endsWith(".js")
|
|
20
|
+
&& d.name !== "node_modules"
|
|
21
|
+
&& !d.parentPath.replaceAll("\\", "/").includes("node_modules/")
|
|
22
|
+
&& (search ? d.name.toLowerCase().includes(search.toLowerCase()) : true)
|
|
23
|
+
)
|
|
24
|
+
.map((d) => {
|
|
25
|
+
const fullPath = relative(ProcessOptions.cwd, join(d.parentPath, d.name)).replaceAll("\\", "/");
|
|
26
|
+
let size = 0, mtime = new Date();
|
|
27
|
+
try {
|
|
28
|
+
const s = statSync(fullPath);
|
|
29
|
+
size = s.size;
|
|
30
|
+
mtime = s.mtime;
|
|
31
|
+
} catch {}
|
|
32
|
+
const isPacked = /\@Pack/.test(readFileSync(fullPath, "utf-8"));
|
|
33
|
+
return { name: d.name, fullPath, isPacked, size, mtime };
|
|
34
|
+
})
|
|
35
|
+
.filter((x) => packed ? x.isPacked : true)
|
|
36
|
+
.sort((a, b) => {
|
|
37
|
+
// if (a.isDir !== b.isDir) return a.isDir ? -1 : 1;
|
|
38
|
+
return a.name.localeCompare(b.name);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
const text = JSON.stringify(entries);
|
|
43
|
+
|
|
44
|
+
res.writeHead(200, {
|
|
45
|
+
"Content-Type": "text/json",
|
|
46
|
+
"cache-control": "no-cache"
|
|
47
|
+
});
|
|
48
|
+
res.end(text);
|
|
49
|
+
}
|