@package-verse/esmpack 1.0.14 → 1.0.15
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/dist/ProcessArgs.js +15 -0
- package/dist/ProcessArgs.js.map +1 -0
- package/dist/core/RegExpExtra.js +11 -0
- package/dist/core/RegExpExtra.js.map +1 -0
- package/dist/core/tokenizeAll.js +42 -0
- package/dist/core/tokenizeAll.js.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/pack/FilePacker.js +68 -0
- package/dist/pack/FilePacker.js.map +1 -0
- package/dist/pack/JSModule.js +12 -0
- package/dist/pack/JSModule.js.map +1 -0
- package/dist/pack/pack.js +2 -0
- package/dist/pack/pack.js.map +1 -0
- package/dist/pack/packageMap.js +42 -0
- package/dist/pack/packageMap.js.map +1 -0
- package/dist/parser/babel.js +93 -0
- package/dist/parser/babel.js.map +1 -0
- package/dist/serve/WebServer.js +60 -0
- package/dist/serve/WebServer.js.map +1 -0
- package/dist/serve/send/packageInfo.js +26 -0
- package/dist/serve/send/packageInfo.js.map +1 -0
- package/dist/serve/send/sendJS.js +48 -0
- package/dist/serve/send/sendJS.js.map +1 -0
- package/dist/serve/send/sendJSHost.js +31 -0
- package/dist/serve/send/sendJSHost.js.map +1 -0
- package/dist/serve/send/sendList.js +89 -0
- package/dist/serve/send/sendList.js.map +1 -0
- package/dist/serve/send/sendLocalFile.js +34 -0
- package/dist/serve/send/sendLocalFile.js.map +1 -0
- package/dist/serve/send/sendNonJSModule.js +30 -0
- package/dist/serve/send/sendNonJSModule.js.map +1 -0
- package/dist/serve/serve.js +124 -0
- package/dist/serve/serve.js.map +1 -0
- package/dist/test/LogDecorator.js +3 -0
- package/dist/test/LogDecorator.js.map +1 -0
- package/dist/test/TestView.js +44 -0
- package/dist/test/TestView.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +1 -1
- package/.github/workflows/node.yml +0 -25
- package/.vscode/launch.json +0 -24
- package/.vscode/settings.json +0 -199
- package/.vscode/tasks.json +0 -44
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const ProcessOptions = {
|
|
2
|
+
cwd: ""
|
|
3
|
+
};
|
|
4
|
+
const { argv } = process;
|
|
5
|
+
const { length } = argv;
|
|
6
|
+
for (let i = 0; i < length; i++) {
|
|
7
|
+
const arg = argv[i];
|
|
8
|
+
if (arg.startsWith("--")) {
|
|
9
|
+
ProcessOptions[arg] = argv[i + 1] || void 0;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
const last = argv[argv.length - 1];
|
|
13
|
+
export const fileArgument = last.startsWith("--") ? void 0 : last;
|
|
14
|
+
ProcessOptions.cwd ||= process.cwd();
|
|
15
|
+
//# sourceMappingURL=ProcessArgs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProcessArgs.js","sourceRoot":"","sources":["../src/ProcessArgs.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC1B,GAAG,EAAE,EAAE;CACV,CAAC;AAEF,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;AACzB,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;AACxB,KAAI,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAE,MAAM,EAAC,CAAC,EAAE,EAAE,CAAC;IACzB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,cAAc,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC;IAC9C,CAAC;AACL,CAAC;AAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAC,CAAC,CAAC,CAAC;AAEjC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAIlE,cAAc,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { tokenizeRegexAll } from "./tokenizeAll.js";
|
|
2
|
+
export const RegExpExtra = {
|
|
3
|
+
replaceAll(text, regExp, transformer) {
|
|
4
|
+
let r = "";
|
|
5
|
+
for (const token of tokenizeRegexAll(text, regExp)) {
|
|
6
|
+
r += transformer(token);
|
|
7
|
+
}
|
|
8
|
+
return r;
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=RegExpExtra.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RegExpExtra.js","sourceRoot":"","sources":["../../src/core/RegExpExtra.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAIpD,MAAM,CAAC,MAAM,WAAW,GAAG;IAEvB,UAAU,CAAC,IAAY,EAAE,MAAc,EAAE,WAA2C;QAChF,IAAI,CAAC,GAAG,EAAE,CAAC;QACX,KAAI,MAAM,KAAK,IAAI,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;YAChD,CAAC,IAAI,WAAW,CAAC,KAAY,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,CAAC,CAAC;IACb,CAAC;CACJ,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export function* tokenizeRegexAll(text, regex) {
|
|
2
|
+
if (!text) {
|
|
3
|
+
return;
|
|
4
|
+
}
|
|
5
|
+
regex.lastIndex = 0;
|
|
6
|
+
let start = 0;
|
|
7
|
+
for (const m of text.matchAll(regex)) {
|
|
8
|
+
if (start < m.index) {
|
|
9
|
+
yield { text: text.substring(start, m.index) };
|
|
10
|
+
}
|
|
11
|
+
yield { match: m };
|
|
12
|
+
start = m.index + m[0].length;
|
|
13
|
+
}
|
|
14
|
+
if (start < text.length) {
|
|
15
|
+
if (start) {
|
|
16
|
+
yield { text: text.substring(start) };
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
yield { text };
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// let m;
|
|
23
|
+
// let start = 0;
|
|
24
|
+
// while((m = regex.exec(text)) !== null) {
|
|
25
|
+
// const { lastIndex } = regex;
|
|
26
|
+
// if (m.index === lastIndex) {
|
|
27
|
+
// regex.lastIndex++;
|
|
28
|
+
// }
|
|
29
|
+
// if (!m?.length) {
|
|
30
|
+
// break;
|
|
31
|
+
// }
|
|
32
|
+
// if (start < m.index) {
|
|
33
|
+
// yield { text: text.substring(start, m.index)};
|
|
34
|
+
// }
|
|
35
|
+
// yield { match: m as RegExpExecArray };
|
|
36
|
+
// start = m.index + m[0].length;
|
|
37
|
+
// }
|
|
38
|
+
// if (start < text.length) {
|
|
39
|
+
// yield { text: text.substring(start) };
|
|
40
|
+
// }
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=tokenizeAll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenizeAll.js","sourceRoot":"","sources":["../../src/core/tokenizeAll.ts"],"names":[],"mappings":"AAAA,MAAM,SAAU,CAAC,CAAA,gBAAgB,CAAC,IAAY,EAAE,KAAa;IACzD,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,OAAO;IACX,CAAC;IACD,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;IACpB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAI,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAClC,IAAI,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,EAAC,CAAC;QAClD,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACnB,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAClC,CAAC;IACD,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACtB,IAAI,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,CAAC;aAAM,CAAC;YACJ,MAAM,EAAE,IAAI,EAAE,CAAC;QACnB,CAAC;IACL,CAAC;IACD,SAAS;IACT,iBAAiB;IACjB,2CAA2C;IAC3C,mCAAmC;IACnC,mCAAmC;IACnC,6BAA6B;IAC7B,QAAQ;IACR,wBAAwB;IACxB,iBAAiB;IACjB,QAAQ;IACR,6BAA6B;IAC7B,yDAAyD;IACzD,QAAQ;IACR,6CAA6C;IAC7C,qCAAqC;IACrC,IAAI;IACJ,6BAA6B;IAC7B,6CAA6C;IAC7C,IAAI;AACR,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { Babel } from "../parser/babel.js";
|
|
3
|
+
import packageMap from "./packageMap.js";
|
|
4
|
+
/**
|
|
5
|
+
* File Packer must do following tasks...
|
|
6
|
+
* 1. Visit every JavaScript file
|
|
7
|
+
* 2. Change all imports, redirect CSS imports as css.js file that will include CSS on the page ...
|
|
8
|
+
* 3. Create .pack.js with all nested imports if file imports `@web-atoms/core/dist/Pack`
|
|
9
|
+
* 4. Packed file must set all css as installed. And other modules will simply return absolute paths.
|
|
10
|
+
*
|
|
11
|
+
* For App.js following packed scripts will be generated.
|
|
12
|
+
* 1. App.pack.js
|
|
13
|
+
* Push Import Maps script tag
|
|
14
|
+
* Add import map for non js modules as well, and for this
|
|
15
|
+
* every nested dependency must be inspected.
|
|
16
|
+
* Json module should load json via hashed-dependency
|
|
17
|
+
* Image module should load path of module via hashed-dependency
|
|
18
|
+
* CSS module should inject full path to the browser
|
|
19
|
+
* Push empty module for CSS
|
|
20
|
+
* Imports all nested dependencies of App.js that should not contain fully qualified path
|
|
21
|
+
* Import dynamically loaded modules as well
|
|
22
|
+
* Imports App.js dynamically so CSS can be ready before hosting the User interface
|
|
23
|
+
*/
|
|
24
|
+
export default class FilePacker {
|
|
25
|
+
constructor(root, src, prefix) {
|
|
26
|
+
this.root = root;
|
|
27
|
+
this.src = src;
|
|
28
|
+
this.prefix = prefix;
|
|
29
|
+
this.cssImports = [];
|
|
30
|
+
this.jsonImports = [];
|
|
31
|
+
this.pathImports = [];
|
|
32
|
+
// empty
|
|
33
|
+
// let us make src relative to the root if an absolute path was supplied
|
|
34
|
+
if (path.isAbsolute(this.src)) {
|
|
35
|
+
this.src = path.relative(this.root, this.src);
|
|
36
|
+
}
|
|
37
|
+
this.absoluteSrc = path.resolve(this.root, this.src);
|
|
38
|
+
}
|
|
39
|
+
async pack() {
|
|
40
|
+
// resolve package.json
|
|
41
|
+
this.modules = await packageMap(this.root);
|
|
42
|
+
const resolve = (url, sourceFile) => this.resolve(url, sourceFile);
|
|
43
|
+
// we don't need the code
|
|
44
|
+
await Babel.transformAsync({
|
|
45
|
+
file: path.join(this.root, this.src),
|
|
46
|
+
resolve,
|
|
47
|
+
dynamicResolve: resolve
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
resolve(url, sourceFile) {
|
|
51
|
+
const moduleUrl = this.moduleUrl(url, sourceFile);
|
|
52
|
+
if (url.endsWith(".css")) {
|
|
53
|
+
this.cssImports.push(moduleUrl);
|
|
54
|
+
return url;
|
|
55
|
+
}
|
|
56
|
+
if (url.endsWith(".json")) {
|
|
57
|
+
this.jsonImports.push(moduleUrl);
|
|
58
|
+
return url;
|
|
59
|
+
}
|
|
60
|
+
if (!url.endsWith(".js")) {
|
|
61
|
+
}
|
|
62
|
+
return url;
|
|
63
|
+
}
|
|
64
|
+
moduleUrl(url, sourceFile) {
|
|
65
|
+
return url;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=FilePacker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilePacker.js","sourceRoot":"","sources":["../../src/pack/FilePacker.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,UAA2B,MAAM,iBAAiB,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,OAAO,OAAO,UAAU;IAY3B,YACoB,IAAY,EACZ,GAAW,EACX,MAAc;QAFd,SAAI,GAAJ,IAAI,CAAQ;QACZ,QAAG,GAAH,GAAG,CAAQ;QACX,WAAM,GAAN,MAAM,CAAQ;QATzB,eAAU,GAAG,EAAE,CAAC;QAEhB,gBAAW,GAAG,EAAE,CAAC;QAEjB,gBAAW,GAAG,EAAE,CAAC;QAOtB,QAAQ;QACR,wEAAwE;QACxE,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,IAAI;QAEN,uBAAuB;QACvB,IAAI,CAAC,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE3C,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAEnE,yBAAyB;QACzB,MAAM,KAAK,CAAC,cAAc,CAAC;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;YACpC,OAAO;YACP,cAAc,EAAE,OAAO;SAC1B,CAAC,CAAC;IAGP,CAAC;IAED,OAAO,CAAC,GAAW,EAAE,UAAkB;QAEnC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAElD,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAChC,OAAO,GAAG,CAAC;QACf,CAAC;QACD,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACjC,OAAO,GAAG,CAAC;QACf,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAE3B,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IAED,SAAS,CAAC,GAAW,EAAE,UAAkB;QAIrC,OAAO,GAAG,CAAC;IACf,CAAC;CACJ"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This class holds a path of single module along
|
|
3
|
+
* with it's own package info
|
|
4
|
+
*/
|
|
5
|
+
export default class JSModule {
|
|
6
|
+
constructor(p) {
|
|
7
|
+
// do nothing
|
|
8
|
+
Object.setPrototypeOf(p, JSModule.prototype);
|
|
9
|
+
return p;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=JSModule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JSModule.js","sourceRoot":"","sources":["../../src/pack/JSModule.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,QAAQ;IAYzB,YACI,CAAoB;QAEpB,aAAa;QACb,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC7C,OAAO,CAAQ,CAAC;IACpB,CAAC;CAEJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack.js","sourceRoot":"","sources":["../../src/pack/pack.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { readFile } from "fs/promises";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
const resolvedImports = new Map();
|
|
4
|
+
async function populatePackageInfo(root, imports, packageJsonPath) {
|
|
5
|
+
const { name, version, dependencies, type, module: moduleMain, main } = JSON.parse(await readFile(packageJsonPath, "utf-8"));
|
|
6
|
+
if (imports[name]) {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Dependency must specify module or main, we will not assume it.
|
|
11
|
+
* We want to keep import map small.
|
|
12
|
+
*
|
|
13
|
+
* Otherwise, caller must explicitly specify the fully qualified module path to load
|
|
14
|
+
*/
|
|
15
|
+
imports[name] = {
|
|
16
|
+
name,
|
|
17
|
+
version,
|
|
18
|
+
main: moduleMain
|
|
19
|
+
|| (type === "module" ? main : void 0)
|
|
20
|
+
|| void 0
|
|
21
|
+
};
|
|
22
|
+
for (const key of Object.keys(dependencies)) {
|
|
23
|
+
if (imports[key]) {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
await populatePackageInfo(root, imports, join(root, "node_modules", key, "package.json"));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export default function packageMap(root) {
|
|
30
|
+
let value = resolvedImports.get(root);
|
|
31
|
+
if (value) {
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
value = (async () => {
|
|
35
|
+
const moduleImports = {};
|
|
36
|
+
await populatePackageInfo(root, moduleImports, join(root, "package.json"));
|
|
37
|
+
return moduleImports;
|
|
38
|
+
})();
|
|
39
|
+
resolvedImports.set(root, value);
|
|
40
|
+
return value;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=packageMap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packageMap.js","sourceRoot":"","sources":["../../src/pack/packageMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,eAAe,GAAG,IAAI,GAAG,EAAgC,CAAC;AAYhE,KAAK,UAAU,mBAAmB,CAAC,IAAI,EAAE,OAAoB,EAAE,eAAe;IAC1E,MAAM,EACF,IAAI,EACJ,OAAO,EACP,YAAY,EACZ,IAAI,EACJ,MAAM,EAAE,UAAU,EAClB,IAAI,EACP,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;IAEzD,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChB,OAAO;IACX,CAAC;IAED;;;;;OAKG;IACH,OAAO,CAAC,IAAI,CAAC,GAAG;QACZ,IAAI;QACJ,OAAO;QACP,IAAI,EAAE,UAAU;eACT,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;eACnC,KAAK,CAAC;KAChB,CAAA;IAED,KAAI,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QACzC,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACf,SAAS;QACb,CAAC;QACD,MAAM,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC;IAC9F,CAAC;AACL,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,IAAY;IAC3C,IAAI,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtC,IAAG,KAAK,EAAE,CAAC;QACP,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,KAAK,GAAG,CAAC,KAAK,IAAG,EAAE;QACf,MAAM,aAAa,GAAG,EAAiB,CAAC;QACxC,MAAM,mBAAmB,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;QAC3E,OAAO,aAAa,CAAC;IACzB,CAAC,CAAC,EAAE,CAAC;IACL,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACjC,OAAO,KAAK,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { transformSync } from "@babel/core";
|
|
2
|
+
import { readFileSync } from "fs";
|
|
3
|
+
import { ProcessOptions } from "../ProcessArgs.js";
|
|
4
|
+
import { parse } from "path";
|
|
5
|
+
import { readFile } from "fs/promises";
|
|
6
|
+
export class Babel {
|
|
7
|
+
static transform({ file, resolve, dynamicResolve }) {
|
|
8
|
+
const presets = Babel.prepareOptions(file, dynamicResolve, resolve);
|
|
9
|
+
const p = { ...presets, filename: file };
|
|
10
|
+
const code = readFileSync(file, "utf8");
|
|
11
|
+
const result = transformSync(code, p);
|
|
12
|
+
return result.code;
|
|
13
|
+
}
|
|
14
|
+
static async transformAsync({ file, resolve, dynamicResolve }) {
|
|
15
|
+
const presets = Babel.prepareOptions(file, dynamicResolve, resolve);
|
|
16
|
+
const p = { ...presets, filename: file };
|
|
17
|
+
const code = await readFile(file, "utf8");
|
|
18
|
+
const result = transformSync(code, p);
|
|
19
|
+
return result.code;
|
|
20
|
+
}
|
|
21
|
+
static prepareOptions(file, dynamicResolve, resolve) {
|
|
22
|
+
const { base: name } = parse(file);
|
|
23
|
+
function CallExpression(node) {
|
|
24
|
+
if (node.node.callee.type !== "Import") {
|
|
25
|
+
return node;
|
|
26
|
+
}
|
|
27
|
+
const sourceFile = node.hub?.file?.inputMap?.sourcemap?.sources?.[0];
|
|
28
|
+
const [arg1] = node.node.arguments;
|
|
29
|
+
if (!arg1) {
|
|
30
|
+
return node;
|
|
31
|
+
}
|
|
32
|
+
if (arg1.type !== "StringLiteral") {
|
|
33
|
+
return node;
|
|
34
|
+
}
|
|
35
|
+
const v = dynamicResolve(arg1.value, sourceFile);
|
|
36
|
+
if (v !== arg1.value) {
|
|
37
|
+
arg1.value = v || arg1.value;
|
|
38
|
+
}
|
|
39
|
+
return node;
|
|
40
|
+
}
|
|
41
|
+
;
|
|
42
|
+
function ImportExpression(node) {
|
|
43
|
+
const sourceFile = node.hub?.file?.inputMap?.sourcemap?.sources?.[0];
|
|
44
|
+
const { source } = node.node;
|
|
45
|
+
if (source.type !== "StringLiteral") {
|
|
46
|
+
return node;
|
|
47
|
+
}
|
|
48
|
+
const v = dynamicResolve(source.value, sourceFile);
|
|
49
|
+
if (v !== source.value) {
|
|
50
|
+
source.value = v || source.value;
|
|
51
|
+
}
|
|
52
|
+
return node;
|
|
53
|
+
}
|
|
54
|
+
const presets = {
|
|
55
|
+
sourceType: "module",
|
|
56
|
+
sourceMaps: true,
|
|
57
|
+
caller: {
|
|
58
|
+
name,
|
|
59
|
+
supportsDynamicImport: true,
|
|
60
|
+
supportsTopLevelAwait: true,
|
|
61
|
+
},
|
|
62
|
+
compact: false,
|
|
63
|
+
comments: false,
|
|
64
|
+
root: ProcessOptions.cwd,
|
|
65
|
+
getModuleId: () => "v",
|
|
66
|
+
"plugins": [
|
|
67
|
+
[
|
|
68
|
+
function (babel) {
|
|
69
|
+
return {
|
|
70
|
+
name: "Import Transformer",
|
|
71
|
+
visitor: {
|
|
72
|
+
ImportDeclaration(node) {
|
|
73
|
+
const e = node.node;
|
|
74
|
+
let source = e.source?.value;
|
|
75
|
+
if (!source) {
|
|
76
|
+
return node;
|
|
77
|
+
}
|
|
78
|
+
const sourceFile = node.hub?.file?.inputMap?.sourcemap?.sources?.[0];
|
|
79
|
+
source = resolve(source, sourceFile);
|
|
80
|
+
e.source.value = source;
|
|
81
|
+
return node;
|
|
82
|
+
},
|
|
83
|
+
...(dynamicResolve ? { CallExpression, ImportExpression } : {}),
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
]
|
|
88
|
+
]
|
|
89
|
+
};
|
|
90
|
+
return presets;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=babel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"babel.js","sourceRoot":"","sources":["../../src/parser/babel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { fileArgument, ProcessOptions } from "../ProcessArgs.js";
|
|
3
|
+
import { existsSync } from "fs";
|
|
4
|
+
import sendLocalFile from "./send/sendLocalFile.js";
|
|
5
|
+
import { createProxyMiddleware, fixRequestBody } from "http-proxy-middleware";
|
|
6
|
+
import colors from "colors";
|
|
7
|
+
import sendJSHost from "./send/sendJSHost.js";
|
|
8
|
+
import sendNonJSModule from "./send/sendNonJSModule.js";
|
|
9
|
+
let middleware;
|
|
10
|
+
export default function WebServer(req, res) {
|
|
11
|
+
const pathname = new URL(req.url, "http://a").pathname.substring(1);
|
|
12
|
+
// check if path exists...
|
|
13
|
+
const fullPath = path.resolve(ProcessOptions.cwd, pathname);
|
|
14
|
+
if (existsSync(fullPath)) {
|
|
15
|
+
// server local..
|
|
16
|
+
sendLocalFile(pathname, fullPath, req, res);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const css = fullPath.replace(/\.js$/, "");
|
|
20
|
+
if (existsSync(css)) {
|
|
21
|
+
sendNonJSModule(pathname.substring(0, pathname.length - 3), req, res);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const js = fullPath.replace(/\.html$/, ".js");
|
|
25
|
+
if (existsSync(js)) {
|
|
26
|
+
sendJSHost(pathname.replace(/\.html$/, ".js"), req, res);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
// if (!fileArgument) {
|
|
30
|
+
// res.writeHead(404,{});
|
|
31
|
+
// res.end("");
|
|
32
|
+
// return;
|
|
33
|
+
// }
|
|
34
|
+
// proxy...
|
|
35
|
+
middleware ??= createProxyMiddleware({
|
|
36
|
+
target: fileArgument,
|
|
37
|
+
changeOrigin: true,
|
|
38
|
+
ws: true,
|
|
39
|
+
secure: false,
|
|
40
|
+
cookieDomainRewrite: "",
|
|
41
|
+
on: {
|
|
42
|
+
proxyReq: fixRequestBody,
|
|
43
|
+
proxyRes: (proxyReq, req, res) => {
|
|
44
|
+
if (proxyReq.statusCode >= 400) {
|
|
45
|
+
console.error(colors.red(`HTTP STATUS ${proxyReq.statusCode} for ${fileArgument}${req.url}`));
|
|
46
|
+
}
|
|
47
|
+
else if (proxyReq.statusCode >= 300) {
|
|
48
|
+
console.warn(colors.yellow(`HTTP STATUS ${proxyReq.statusCode} for ${fileArgument}${req.url}`));
|
|
49
|
+
}
|
|
50
|
+
let cookie = proxyReq.headers["set-cookie"];
|
|
51
|
+
if (cookie) {
|
|
52
|
+
cookie = cookie.map((s) => s.split(";").filter((c) => c.trim().toLocaleLowerCase() !== "secure").join(";"));
|
|
53
|
+
proxyReq.headers["set-cookie"] = cookie;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
middleware(req, res);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=WebServer.js.map
|
|
@@ -0,0 +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;AAGxD,IAAI,UAAU,CAAC;AAEf,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,GAAoB,EAAE,GAAmB;IACvE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAEpE,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC5D,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvB,iBAAiB;QACjB,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAC5C,OAAO;IACX,CAAC;IAED,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACtE,OAAO;IACX,CAAC;IAED,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAC,KAAK,CAAC,CAAC;IAC7C,IAAG,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;QAChB,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACzD,OAAO;IACX,CAAC;IAED,uBAAuB;IACvB,6BAA6B;IAC7B,mBAAmB;IACnB,cAAc;IACd,IAAI;IAEJ,WAAW;IACX,UAAU,KAAK,qBAAqB,CAAC;QACjC,MAAM,EAAE,YAAY;QACpB,YAAY,EAAE,IAAI;QAClB,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,KAAK;QACb,mBAAmB,EAAE,EAAE;QACvB,EAAE,EAAE;YACA,QAAQ,EAAE,cAAc;YACxB,QAAQ,EAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;gBAC5B,IAAI,QAAQ,CAAC,UAAU,IAAI,GAAG,EAAE,CAAC;oBACzB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,QAAQ,CAAC,UAAU,QAAQ,YAAY,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBAClG,CAAC;qBAAM,IAAI,QAAQ,CAAC,UAAU,IAAI,GAAG,EAAE,CAAC;oBACpC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CACtB,eAAe,QAAQ,CAAC,UAAU,QAAQ,YAAY,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBAC7E,CAAC;gBACD,IAAI,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;gBAC5C,IAAI,MAAM,EAAE,CAAC;oBACT,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,iBAAiB,EAAE,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC5G,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC;gBAC5C,CAAC;YACT,CAAC;SACJ;KACJ,CAAC,CAAC;IAEH,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "fs";
|
|
2
|
+
import { ProcessOptions } from "../../ProcessArgs.js";
|
|
3
|
+
import path, { join } from "path/posix";
|
|
4
|
+
const jsonText = readFileSync(join(ProcessOptions.cwd, "package.json"), "utf-8");
|
|
5
|
+
export const packageInfo = JSON.parse(jsonText);
|
|
6
|
+
const imports = {
|
|
7
|
+
[packageInfo.name + "/"]: "/"
|
|
8
|
+
};
|
|
9
|
+
for (const [key] of Object.entries(packageInfo.dependencies)) {
|
|
10
|
+
const modulePackageJsonFilePath = join(ProcessOptions.cwd, "node_modules", key, "package.json");
|
|
11
|
+
if (!existsSync(modulePackageJsonFilePath)) {
|
|
12
|
+
continue;
|
|
13
|
+
}
|
|
14
|
+
let modulePath = "/node_modules/" + key + "/";
|
|
15
|
+
// read package.json
|
|
16
|
+
const modulePackageJson = JSON.parse(readFileSync(modulePackageJsonFilePath, "utf-8"));
|
|
17
|
+
imports[key] = path.join(modulePath, modulePackageJson.module
|
|
18
|
+
|| (modulePackageJson.type === "module"
|
|
19
|
+
? modulePackageJson.main : "index.js"));
|
|
20
|
+
if (modulePackageJson.esm) {
|
|
21
|
+
modulePath += modulePackageJson.esm + "/";
|
|
22
|
+
}
|
|
23
|
+
imports[key + "/"] = modulePath;
|
|
24
|
+
}
|
|
25
|
+
export const importMap = { imports };
|
|
26
|
+
//# sourceMappingURL=packageInfo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packageInfo.js","sourceRoot":"","sources":["../../../src/serve/send/packageInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC;AAEjF,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AAEhD,MAAM,OAAO,GAAG;IACZ,CAAC,WAAW,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG;CAChC,CAAC;AAEF,KAAK,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC;IAE3D,MAAM,yBAAyB,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAG,cAAc,CAAC,CAAC;IACjG,IAAI,CAAC,UAAU,CAAC,yBAAyB,CAAC,EAAE,CAAC;QACzC,SAAS;IACb,CAAC;IAED,IAAI,UAAU,GAAG,gBAAgB,GAAG,GAAG,GAAG,GAAG,CAAC;IAE9C,oBAAoB;IACpB,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,yBAAyB,EAAE,OAAO,CAAC,CAAC,CAAC;IAEvF,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAG,iBAAiB,CAAC,MAAM;WACvD,CAAC,iBAAiB,CAAC,IAAI,KAAK,QAAQ;YACnC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IAEhD,IAAI,iBAAiB,CAAC,GAAG,EAAE,CAAC;QACxB,UAAU,IAAI,iBAAiB,CAAC,GAAG,GAAG,GAAG,CAAC;IAC9C,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,UAAU,CAAC;AAEpC,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Babel } from "../../parser/babel.js";
|
|
2
|
+
import path, { parse } from "node:path";
|
|
3
|
+
import { existsSync } from "node:fs";
|
|
4
|
+
export default function sendJS(filePath, req, res) {
|
|
5
|
+
const resolve = (url, sourceFile) => {
|
|
6
|
+
if (url.endsWith(".js")) {
|
|
7
|
+
return url;
|
|
8
|
+
}
|
|
9
|
+
if (!sourceFile) {
|
|
10
|
+
sourceFile = filePath;
|
|
11
|
+
}
|
|
12
|
+
if (!url.startsWith(".")) {
|
|
13
|
+
// we need to include .js for every module relative path
|
|
14
|
+
const tokens = url.split("/");
|
|
15
|
+
let packageName = tokens.shift();
|
|
16
|
+
if (packageName.startsWith("@")) {
|
|
17
|
+
packageName += "/" + tokens.shift();
|
|
18
|
+
}
|
|
19
|
+
if (tokens.length) {
|
|
20
|
+
if (!url.endsWith(".js")) {
|
|
21
|
+
return url + ".js";
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return url;
|
|
25
|
+
}
|
|
26
|
+
// is it referenced from source...
|
|
27
|
+
const dir = path.dirname(filePath);
|
|
28
|
+
const absoluteSourcePath = path.resolve(dir, path.dirname(sourceFile));
|
|
29
|
+
const referencedAbsolutePath = path.join(absoluteSourcePath, url);
|
|
30
|
+
if (existsSync(referencedAbsolutePath)) {
|
|
31
|
+
const relative = path.relative(dir, referencedAbsolutePath).replaceAll("\\", "/");
|
|
32
|
+
if (!relative.endsWith(".js")) {
|
|
33
|
+
return relative + ".js";
|
|
34
|
+
}
|
|
35
|
+
return relative;
|
|
36
|
+
}
|
|
37
|
+
return url + ".js";
|
|
38
|
+
};
|
|
39
|
+
let text = Babel.transform({ file: filePath, resolve, dynamicResolve: resolve });
|
|
40
|
+
const { base } = parse(filePath);
|
|
41
|
+
text += `\n//# sourceMappingURL=${base}.map`;
|
|
42
|
+
res.writeHead(200, {
|
|
43
|
+
"content-type": "text/javascript",
|
|
44
|
+
"cache-control": "no-cache"
|
|
45
|
+
});
|
|
46
|
+
res.end(text);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=sendJS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sendJS.js","sourceRoot":"","sources":["../../../src/serve/send/sendJS.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,QAAgB,EAAE,GAAoB,EAAE,GAAmB;IAEtF,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,UAAkB,EAAE,EAAE;QAEhD,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,GAAG,CAAC;QACf,CAAC;QAED,IAAG,CAAC,UAAU,EAAE,CAAC;YACb,UAAU,GAAG,QAAQ,CAAC;QAC1B,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAEvB,wDAAwD;YACxD,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,WAAW,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;YACjC,IAAI,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9B,WAAW,IAAI,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;YACxC,CAAC;YAED,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAChB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBACvB,OAAO,GAAG,GAAG,KAAK,CAAC;gBACvB,CAAC;YACL,CAAC;YAED,OAAO,GAAG,CAAC;QACf,CAAC;QAGD,kCAAkC;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QACxE,MAAM,sBAAsB,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;QAClE,IAAI,UAAU,CAAC,sBAAsB,CAAC,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAClF,IAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,QAAQ,GAAG,KAAK,CAAC;YAC5B,CAAC;YACD,OAAO,QAAQ,CAAC;QACpB,CAAC;QAGD,OAAO,GAAG,GAAG,KAAK,CAAC;IACvB,CAAC,CAAC;IAGF,IAAI,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAC,CAAC,CAAC;IAEhF,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEjC,IAAI,IAAI,0BAA0B,IAAI,MAAM,CAAC;IAE7C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;QACf,cAAc,EAAE,iBAAiB;QACjC,eAAe,EAAE,UAAU;KAC9B,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { importMap, packageInfo } from "./packageInfo.js";
|
|
2
|
+
export default function sendJSHost(path, req, res) {
|
|
3
|
+
// generate import maps
|
|
4
|
+
// for dynamic scripts
|
|
5
|
+
// this is to avoid path renaming and support dynamic module loading
|
|
6
|
+
const text = `
|
|
7
|
+
<!DOCTYPE html>
|
|
8
|
+
<html lang="en">
|
|
9
|
+
<head>
|
|
10
|
+
<meta charset="UTF-8" />
|
|
11
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
12
|
+
<title>Index of ${path}</title>
|
|
13
|
+
</head>
|
|
14
|
+
<body>
|
|
15
|
+
<script type="importmap">
|
|
16
|
+
${JSON.stringify(importMap, void 0, 2)}
|
|
17
|
+
</script>
|
|
18
|
+
<script>
|
|
19
|
+
const cs = document.currentScript;
|
|
20
|
+
import("${packageInfo.name}/${path}").then((r) => ESMPack.render(r, cs), (error) => cs.replaceWith(document.createTextNode(error.stack || error)));
|
|
21
|
+
</script>
|
|
22
|
+
</body>
|
|
23
|
+
</html>
|
|
24
|
+
`;
|
|
25
|
+
res.writeHead(200, {
|
|
26
|
+
"content-type": "text/html",
|
|
27
|
+
"cache-control": "no-cache"
|
|
28
|
+
});
|
|
29
|
+
res.end(text);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=sendJSHost.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sendJSHost.js","sourceRoot":"","sources":["../../../src/serve/send/sendJSHost.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE1D,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,IAAY,EAAE,GAAoB,EAAE,GAAmB;IAEtF,uBAAuB;IACvB,sBAAsB;IACtB,oEAAoE;IAEpE,MAAM,IAAI,GAAG;;;;;;sBAMK,IAAI;;;;UAIhB,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;;;;kBAI5B,WAAW,CAAC,IAAI,IAAI,IAAI;;;;CAIzC,CAAC;IAEE,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;QACf,cAAc,EAAE,WAAW;QAC3B,eAAe,EAAE,UAAU;KAC9B,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { readdirSync, statSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
export default function sendList(reqPath, path, req, res) {
|
|
4
|
+
const entries = readdirSync(path, { withFileTypes: true })
|
|
5
|
+
.filter((d) => !d.name.startsWith(".") && d.name !== "node_modules")
|
|
6
|
+
.map((d) => {
|
|
7
|
+
const fullPath = join(d.parentPath, d.name);
|
|
8
|
+
let size = 0, mtime = new Date();
|
|
9
|
+
try {
|
|
10
|
+
const s = statSync(fullPath);
|
|
11
|
+
size = s.size;
|
|
12
|
+
mtime = s.mtime;
|
|
13
|
+
}
|
|
14
|
+
catch { }
|
|
15
|
+
return { name: d.name, isDir: d.isDirectory(), size, mtime };
|
|
16
|
+
})
|
|
17
|
+
.sort((a, b) => {
|
|
18
|
+
if (a.isDir !== b.isDir)
|
|
19
|
+
return a.isDir ? -1 : 1;
|
|
20
|
+
return a.name.localeCompare(b.name);
|
|
21
|
+
});
|
|
22
|
+
const text = renderDirectoryListing(reqPath, entries);
|
|
23
|
+
res.writeHead(200, {
|
|
24
|
+
"Content-Type": "text/html",
|
|
25
|
+
"cache-control": "no-cache"
|
|
26
|
+
});
|
|
27
|
+
res.end(text);
|
|
28
|
+
}
|
|
29
|
+
function formatSize(bytes) {
|
|
30
|
+
if (bytes === 0)
|
|
31
|
+
return "0 B";
|
|
32
|
+
const units = ["B", "KB", "MB", "GB"];
|
|
33
|
+
const i = Math.floor(Math.log(bytes) / Math.log(1024));
|
|
34
|
+
return `${(bytes / Math.pow(1024, i)).toFixed(i === 0 ? 0 : 1)} ${units[i]}`;
|
|
35
|
+
}
|
|
36
|
+
function renderDirectoryListing(reqPath, entries) {
|
|
37
|
+
const isRoot = reqPath === "/";
|
|
38
|
+
const rows = entries
|
|
39
|
+
.map((e) => {
|
|
40
|
+
let href = reqPath.replace(/\/$/, "") + "/" + encodeURIComponent(e.name) + (e.isDir ? "/" : "");
|
|
41
|
+
const icon = e.isDir ? "📁" : (/\.(js|html)$/i.test(e.name) ? "🌐" : "📄");
|
|
42
|
+
const size = e.isDir ? "—" : formatSize(e.size);
|
|
43
|
+
const modified = e.mtime.toISOString().replace("T", " ").slice(0, 19);
|
|
44
|
+
if (e.name.endsWith(".js")) {
|
|
45
|
+
href = href.replace(/\.js$/, ".html");
|
|
46
|
+
}
|
|
47
|
+
return `<tr>
|
|
48
|
+
<td>${icon} <a href="${href.startsWith("/") ? href : "/" + href}">${e.name}${e.isDir ? "/" : ""}</a></td>
|
|
49
|
+
<td>${size}</td>
|
|
50
|
+
<td>${modified}</td>
|
|
51
|
+
</tr>`;
|
|
52
|
+
})
|
|
53
|
+
.join("\n");
|
|
54
|
+
const parentRow = isRoot
|
|
55
|
+
? ""
|
|
56
|
+
: `<tr><td>⬆️ <a href="../">../</a></td><td>—</td><td>—</td></tr>`;
|
|
57
|
+
return `<!DOCTYPE html>
|
|
58
|
+
<html lang="en">
|
|
59
|
+
<head>
|
|
60
|
+
<meta charset="UTF-8" />
|
|
61
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
62
|
+
<title>Index of ${reqPath}</title>
|
|
63
|
+
<style>
|
|
64
|
+
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
65
|
+
body { font-family: ui-monospace, 'Cascadia Code', monospace; background: #0f1117; color: #e2e8f0; min-height: 100vh; padding: 2rem; }
|
|
66
|
+
h1 { font-size: 1.25rem; color: #7dd3fc; margin-bottom: 1.5rem; border-bottom: 1px solid #1e293b; padding-bottom: .75rem; }
|
|
67
|
+
table { width: 100%; border-collapse: collapse; }
|
|
68
|
+
th { text-align: left; padding: .5rem .75rem; color: #94a3b8; font-weight: 600; font-size: .8rem; text-transform: uppercase; letter-spacing: .05em; border-bottom: 1px solid #1e293b; }
|
|
69
|
+
td { padding: .45rem .75rem; font-size: .9rem; border-bottom: 1px solid #0d1520; }
|
|
70
|
+
td:nth-child(2), td:nth-child(3) { color: #64748b; font-size: .8rem; white-space: nowrap; }
|
|
71
|
+
tr:hover td { background: #1e293b; }
|
|
72
|
+
a { color: #7dd3fc; text-decoration: none; }
|
|
73
|
+
a:hover { color: #bae6fd; text-decoration: underline; }
|
|
74
|
+
footer { margin-top: 2rem; color: #334155; font-size: .75rem; }
|
|
75
|
+
</style>
|
|
76
|
+
</head>
|
|
77
|
+
<body>
|
|
78
|
+
<h1>📂 Index of ${reqPath}</h1>
|
|
79
|
+
<table>
|
|
80
|
+
<thead><tr><th>Name</th><th>Size</th><th>Modified</th></tr></thead>
|
|
81
|
+
<tbody>
|
|
82
|
+
${parentRow}
|
|
83
|
+
${rows}
|
|
84
|
+
</tbody>
|
|
85
|
+
</table>
|
|
86
|
+
</body>
|
|
87
|
+
</html>`;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=sendList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sendList.js","sourceRoot":"","sources":["../../../src/serve/send/sendList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEhD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,OAAO,EAAE,IAAY,EAAE,GAAoB,EAAE,GAAmB;IAE7F,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAC,CAAC;SACpD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC;SACnE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACP,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5C,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,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACjE,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACX,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK;YAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAGP,MAAM,IAAI,GAAG,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAEtD,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;AAED,SAAS,UAAU,CAAC,KAAK;IACvB,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9B,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACvD,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/E,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAO,EAAE,OAAuE;IAG9G,MAAM,MAAM,GAAG,OAAO,KAAK,GAAG,CAAC;IAC/B,MAAM,IAAI,GAAG,OAAO;SACjB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,IAAI,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChG,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3E,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAEtE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC;QAED,OAAO;cACC,IAAI,aAAa,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;cACzF,IAAI;cACJ,QAAQ;YACV,CAAC;IACT,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,SAAS,GAAG,MAAM;QACtB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,iEAAiE,CAAC;IAEtE,OAAO;;;;;kBAKS,OAAO;;;;;;;;;;;;;;;;kBAgBP,OAAO;;;;MAInB,SAAS;MACT,IAAI;;;;QAIF,CAAC;AACT,CAAC"}
|