elit 3.0.1 → 3.0.3
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/build.d.ts +4 -12
- package/dist/build.d.ts.map +1 -0
- package/dist/chokidar.d.ts +7 -9
- package/dist/chokidar.d.ts.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +250 -21
- package/dist/config.d.ts +29 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/dom.d.ts +7 -14
- package/dist/dom.d.ts.map +1 -0
- package/dist/el.d.ts +19 -191
- package/dist/el.d.ts.map +1 -0
- package/dist/fs.d.ts +35 -35
- package/dist/fs.d.ts.map +1 -0
- package/dist/hmr.d.ts +3 -3
- package/dist/hmr.d.ts.map +1 -0
- package/dist/http.d.ts +20 -22
- package/dist/http.d.ts.map +1 -0
- package/dist/https.d.ts +12 -15
- package/dist/https.d.ts.map +1 -0
- package/dist/index.d.ts +10 -629
- package/dist/index.d.ts.map +1 -0
- package/dist/mime-types.d.ts +9 -9
- package/dist/mime-types.d.ts.map +1 -0
- package/dist/path.d.ts +22 -19
- package/dist/path.d.ts.map +1 -0
- package/dist/router.d.ts +10 -17
- package/dist/router.d.ts.map +1 -0
- package/dist/runtime.d.ts +5 -6
- package/dist/runtime.d.ts.map +1 -0
- package/dist/server.d.ts +109 -7
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +712 -137
- package/dist/server.mjs +711 -137
- package/dist/state.d.ts +21 -27
- package/dist/state.d.ts.map +1 -0
- package/dist/style.d.ts +14 -55
- package/dist/style.d.ts.map +1 -0
- package/dist/types.d.ts +26 -240
- package/dist/types.d.ts.map +1 -0
- package/dist/ws.d.ts +14 -17
- package/dist/ws.d.ts.map +1 -0
- package/dist/wss.d.ts +16 -16
- package/dist/wss.d.ts.map +1 -0
- package/package.json +3 -2
- package/src/build.ts +337 -0
- package/src/chokidar.ts +401 -0
- package/src/cli.ts +638 -0
- package/src/config.ts +205 -0
- package/src/dom.ts +817 -0
- package/src/el.ts +164 -0
- package/src/fs.ts +727 -0
- package/src/hmr.ts +137 -0
- package/src/http.ts +775 -0
- package/src/https.ts +411 -0
- package/src/index.ts +14 -0
- package/src/mime-types.ts +222 -0
- package/src/path.ts +493 -0
- package/src/router.ts +237 -0
- package/src/runtime.ts +97 -0
- package/src/server.ts +1593 -0
- package/src/state.ts +468 -0
- package/src/style.ts +524 -0
- package/{dist/types-Du6kfwTm.d.ts → src/types.ts} +58 -141
- package/src/ws.ts +506 -0
- package/src/wss.ts +241 -0
- package/dist/build.d.mts +0 -20
- package/dist/chokidar.d.mts +0 -134
- package/dist/dom.d.mts +0 -87
- package/dist/el.d.mts +0 -207
- package/dist/fs.d.mts +0 -255
- package/dist/hmr.d.mts +0 -38
- package/dist/http.d.mts +0 -163
- package/dist/https.d.mts +0 -108
- package/dist/index.d.mts +0 -629
- package/dist/mime-types.d.mts +0 -48
- package/dist/path.d.mts +0 -163
- package/dist/router.d.mts +0 -47
- package/dist/runtime.d.mts +0 -97
- package/dist/server.d.mts +0 -7
- package/dist/state.d.mts +0 -111
- package/dist/style.d.mts +0 -159
- package/dist/types-C0nGi6MX.d.mts +0 -346
- package/dist/types.d.mts +0 -452
- package/dist/ws.d.mts +0 -195
- package/dist/wss.d.mts +0 -108
package/dist/server.js
CHANGED
|
@@ -638,6 +638,464 @@ var init_http = __esm({
|
|
|
638
638
|
}
|
|
639
639
|
});
|
|
640
640
|
|
|
641
|
+
// src/fs.ts
|
|
642
|
+
var fs_exports = {};
|
|
643
|
+
__export(fs_exports, {
|
|
644
|
+
appendFile: () => appendFile,
|
|
645
|
+
appendFileSync: () => appendFileSync,
|
|
646
|
+
copyFile: () => copyFile,
|
|
647
|
+
copyFileSync: () => copyFileSync,
|
|
648
|
+
default: () => fs_default,
|
|
649
|
+
exists: () => exists,
|
|
650
|
+
existsSync: () => existsSync,
|
|
651
|
+
getRuntime: () => getRuntime2,
|
|
652
|
+
mkdir: () => mkdir,
|
|
653
|
+
mkdirSync: () => mkdirSync,
|
|
654
|
+
promises: () => promises,
|
|
655
|
+
readFile: () => readFile,
|
|
656
|
+
readFileSync: () => readFileSync,
|
|
657
|
+
readdir: () => readdir,
|
|
658
|
+
readdirSync: () => readdirSync,
|
|
659
|
+
realpath: () => realpath,
|
|
660
|
+
realpathSync: () => realpathSync,
|
|
661
|
+
rename: () => rename,
|
|
662
|
+
renameSync: () => renameSync,
|
|
663
|
+
rmdir: () => rmdir,
|
|
664
|
+
rmdirSync: () => rmdirSync,
|
|
665
|
+
stat: () => stat,
|
|
666
|
+
statSync: () => statSync,
|
|
667
|
+
unlink: () => unlink,
|
|
668
|
+
unlinkSync: () => unlinkSync,
|
|
669
|
+
writeFile: () => writeFile,
|
|
670
|
+
writeFileSync: () => writeFileSync
|
|
671
|
+
});
|
|
672
|
+
function parseOptions(options, defaultValue) {
|
|
673
|
+
return typeof options === "string" ? { encoding: options } : options || defaultValue;
|
|
674
|
+
}
|
|
675
|
+
function decodeContent(content, encoding) {
|
|
676
|
+
if (encoding) {
|
|
677
|
+
return new TextDecoder(encoding).decode(content);
|
|
678
|
+
}
|
|
679
|
+
return Buffer.from(content instanceof ArrayBuffer ? new Uint8Array(content) : content);
|
|
680
|
+
}
|
|
681
|
+
function dataToUint8Array(data) {
|
|
682
|
+
if (typeof data === "string") {
|
|
683
|
+
return new TextEncoder().encode(data);
|
|
684
|
+
}
|
|
685
|
+
if (data instanceof Buffer) {
|
|
686
|
+
return new Uint8Array(data);
|
|
687
|
+
}
|
|
688
|
+
return data;
|
|
689
|
+
}
|
|
690
|
+
function processDenoEntries(iterator, withFileTypes) {
|
|
691
|
+
const entries = [];
|
|
692
|
+
for (const entry of iterator) {
|
|
693
|
+
if (withFileTypes) {
|
|
694
|
+
entries.push(createDirentFromDenoEntry(entry));
|
|
695
|
+
} else {
|
|
696
|
+
entries.push(entry.name);
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
return entries;
|
|
700
|
+
}
|
|
701
|
+
async function processDenoEntriesAsync(iterator, withFileTypes) {
|
|
702
|
+
const entries = [];
|
|
703
|
+
for await (const entry of iterator) {
|
|
704
|
+
if (withFileTypes) {
|
|
705
|
+
entries.push(createDirentFromDenoEntry(entry));
|
|
706
|
+
} else {
|
|
707
|
+
entries.push(entry.name);
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
return entries;
|
|
711
|
+
}
|
|
712
|
+
async function readFile(path, options) {
|
|
713
|
+
const opts = parseOptions(options, {});
|
|
714
|
+
if (isNode) {
|
|
715
|
+
return fsPromises.readFile(path, opts);
|
|
716
|
+
} else if (isBun) {
|
|
717
|
+
const file = Bun.file(path);
|
|
718
|
+
const content = await file.arrayBuffer();
|
|
719
|
+
return decodeContent(content, opts.encoding);
|
|
720
|
+
} else if (isDeno) {
|
|
721
|
+
const content = await Deno.readFile(path);
|
|
722
|
+
return decodeContent(content, opts.encoding);
|
|
723
|
+
}
|
|
724
|
+
throw new Error("Unsupported runtime");
|
|
725
|
+
}
|
|
726
|
+
function readFileSync(path, options) {
|
|
727
|
+
const opts = parseOptions(options, {});
|
|
728
|
+
if (isNode) {
|
|
729
|
+
return fs.readFileSync(path, opts);
|
|
730
|
+
} else if (isBun) {
|
|
731
|
+
const file = Bun.file(path);
|
|
732
|
+
const content = file.arrayBuffer();
|
|
733
|
+
return decodeContent(content, opts.encoding);
|
|
734
|
+
} else if (isDeno) {
|
|
735
|
+
const content = Deno.readFileSync(path);
|
|
736
|
+
return decodeContent(content, opts.encoding);
|
|
737
|
+
}
|
|
738
|
+
throw new Error("Unsupported runtime");
|
|
739
|
+
}
|
|
740
|
+
async function writeFile(path, data, options) {
|
|
741
|
+
const opts = parseOptions(options, {});
|
|
742
|
+
if (isNode) {
|
|
743
|
+
return fsPromises.writeFile(path, data, opts);
|
|
744
|
+
} else if (isBun) {
|
|
745
|
+
await Bun.write(path, data);
|
|
746
|
+
} else if (isDeno) {
|
|
747
|
+
await Deno.writeFile(path, dataToUint8Array(data));
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
function writeFileSync(path, data, options) {
|
|
751
|
+
const opts = parseOptions(options, {});
|
|
752
|
+
if (isNode) {
|
|
753
|
+
fs.writeFileSync(path, data, opts);
|
|
754
|
+
} else if (isBun) {
|
|
755
|
+
Bun.write(path, data);
|
|
756
|
+
} else if (isDeno) {
|
|
757
|
+
Deno.writeFileSync(path, dataToUint8Array(data));
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
async function appendFile(path, data, options) {
|
|
761
|
+
const opts = parseOptions(options, {});
|
|
762
|
+
if (isNode) {
|
|
763
|
+
return fsPromises.appendFile(path, data, opts);
|
|
764
|
+
} else {
|
|
765
|
+
if (await exists(path)) {
|
|
766
|
+
const existing = await readFile(path);
|
|
767
|
+
const combined = Buffer.isBuffer(existing) ? Buffer.concat([existing, Buffer.isBuffer(data) ? data : Buffer.from(data)]) : existing + (Buffer.isBuffer(data) ? data.toString() : data);
|
|
768
|
+
await writeFile(path, combined, opts);
|
|
769
|
+
} else {
|
|
770
|
+
await writeFile(path, data, opts);
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
function appendFileSync(path, data, options) {
|
|
775
|
+
const opts = parseOptions(options, {});
|
|
776
|
+
if (isNode) {
|
|
777
|
+
fs.appendFileSync(path, data, opts);
|
|
778
|
+
} else {
|
|
779
|
+
if (existsSync(path)) {
|
|
780
|
+
const existing = readFileSync(path);
|
|
781
|
+
const combined = Buffer.isBuffer(existing) ? Buffer.concat([existing, Buffer.isBuffer(data) ? data : Buffer.from(data)]) : existing + (Buffer.isBuffer(data) ? data.toString() : data);
|
|
782
|
+
writeFileSync(path, combined, opts);
|
|
783
|
+
} else {
|
|
784
|
+
writeFileSync(path, data, opts);
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
async function exists(path) {
|
|
789
|
+
try {
|
|
790
|
+
await stat(path);
|
|
791
|
+
return true;
|
|
792
|
+
} catch {
|
|
793
|
+
return false;
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
function existsSync(path) {
|
|
797
|
+
try {
|
|
798
|
+
statSync(path);
|
|
799
|
+
return true;
|
|
800
|
+
} catch {
|
|
801
|
+
return false;
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
async function stat(path) {
|
|
805
|
+
if (isNode) {
|
|
806
|
+
return fsPromises.stat(path);
|
|
807
|
+
} else if (isBun) {
|
|
808
|
+
const file = Bun.file(path);
|
|
809
|
+
const size = file.size;
|
|
810
|
+
const exists2 = await file.exists();
|
|
811
|
+
if (!exists2) {
|
|
812
|
+
throw new Error(`ENOENT: no such file or directory, stat '${path}'`);
|
|
813
|
+
}
|
|
814
|
+
return createStatsObject(path, size, false);
|
|
815
|
+
} else if (isDeno) {
|
|
816
|
+
const info = await Deno.stat(path);
|
|
817
|
+
return createStatsFromDenoFileInfo(info);
|
|
818
|
+
}
|
|
819
|
+
throw new Error("Unsupported runtime");
|
|
820
|
+
}
|
|
821
|
+
function statSync(path) {
|
|
822
|
+
if (isNode) {
|
|
823
|
+
return fs.statSync(path);
|
|
824
|
+
} else if (isBun) {
|
|
825
|
+
const file = Bun.file(path);
|
|
826
|
+
const size = file.size;
|
|
827
|
+
try {
|
|
828
|
+
file.arrayBuffer();
|
|
829
|
+
} catch {
|
|
830
|
+
throw new Error(`ENOENT: no such file or directory, stat '${path}'`);
|
|
831
|
+
}
|
|
832
|
+
return createStatsObject(path, size, false);
|
|
833
|
+
} else if (isDeno) {
|
|
834
|
+
const info = Deno.statSync(path);
|
|
835
|
+
return createStatsFromDenoFileInfo(info);
|
|
836
|
+
}
|
|
837
|
+
throw new Error("Unsupported runtime");
|
|
838
|
+
}
|
|
839
|
+
async function mkdir(path, options) {
|
|
840
|
+
const opts = typeof options === "number" ? { mode: options } : options || {};
|
|
841
|
+
if (isNode) {
|
|
842
|
+
await fsPromises.mkdir(path, opts);
|
|
843
|
+
} else if (isBun) {
|
|
844
|
+
await Deno.mkdir(path, { recursive: opts.recursive });
|
|
845
|
+
} else if (isDeno) {
|
|
846
|
+
await Deno.mkdir(path, { recursive: opts.recursive });
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
function mkdirSync(path, options) {
|
|
850
|
+
const opts = typeof options === "number" ? { mode: options } : options || {};
|
|
851
|
+
if (isNode) {
|
|
852
|
+
fs.mkdirSync(path, opts);
|
|
853
|
+
} else if (isBun) {
|
|
854
|
+
Deno.mkdirSync(path, { recursive: opts.recursive });
|
|
855
|
+
} else if (isDeno) {
|
|
856
|
+
Deno.mkdirSync(path, { recursive: opts.recursive });
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
async function readdir(path, options) {
|
|
860
|
+
const opts = parseOptions(options, {});
|
|
861
|
+
if (isNode) {
|
|
862
|
+
return fsPromises.readdir(path, opts);
|
|
863
|
+
} else if (isBunOrDeno) {
|
|
864
|
+
return processDenoEntriesAsync(Deno.readDir(path), opts.withFileTypes);
|
|
865
|
+
}
|
|
866
|
+
throw new Error("Unsupported runtime");
|
|
867
|
+
}
|
|
868
|
+
function readdirSync(path, options) {
|
|
869
|
+
const opts = parseOptions(options, {});
|
|
870
|
+
if (isNode) {
|
|
871
|
+
return fs.readdirSync(path, opts);
|
|
872
|
+
} else if (isBunOrDeno) {
|
|
873
|
+
return processDenoEntries(Deno.readDirSync(path), opts.withFileTypes);
|
|
874
|
+
}
|
|
875
|
+
throw new Error("Unsupported runtime");
|
|
876
|
+
}
|
|
877
|
+
async function unlink(path) {
|
|
878
|
+
if (isNode) {
|
|
879
|
+
return fsPromises.unlink(path);
|
|
880
|
+
} else if (isBun) {
|
|
881
|
+
await Deno.remove(path);
|
|
882
|
+
} else if (isDeno) {
|
|
883
|
+
await Deno.remove(path);
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
function unlinkSync(path) {
|
|
887
|
+
if (isNode) {
|
|
888
|
+
fs.unlinkSync(path);
|
|
889
|
+
} else if (isBun) {
|
|
890
|
+
Deno.removeSync(path);
|
|
891
|
+
} else if (isDeno) {
|
|
892
|
+
Deno.removeSync(path);
|
|
893
|
+
}
|
|
894
|
+
}
|
|
895
|
+
async function rmdir(path, options) {
|
|
896
|
+
if (isNode) {
|
|
897
|
+
return fsPromises.rmdir(path, options);
|
|
898
|
+
} else if (isBun) {
|
|
899
|
+
await Deno.remove(path, { recursive: options?.recursive });
|
|
900
|
+
} else if (isDeno) {
|
|
901
|
+
await Deno.remove(path, { recursive: options?.recursive });
|
|
902
|
+
}
|
|
903
|
+
}
|
|
904
|
+
function rmdirSync(path, options) {
|
|
905
|
+
if (isNode) {
|
|
906
|
+
fs.rmdirSync(path, options);
|
|
907
|
+
} else if (isBun) {
|
|
908
|
+
Deno.removeSync(path, { recursive: options?.recursive });
|
|
909
|
+
} else if (isDeno) {
|
|
910
|
+
Deno.removeSync(path, { recursive: options?.recursive });
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
async function rename(oldPath, newPath) {
|
|
914
|
+
if (isNode) {
|
|
915
|
+
return fsPromises.rename(oldPath, newPath);
|
|
916
|
+
} else if (isBun) {
|
|
917
|
+
await Deno.rename(oldPath, newPath);
|
|
918
|
+
} else if (isDeno) {
|
|
919
|
+
await Deno.rename(oldPath, newPath);
|
|
920
|
+
}
|
|
921
|
+
}
|
|
922
|
+
function renameSync(oldPath, newPath) {
|
|
923
|
+
if (isNode) {
|
|
924
|
+
fs.renameSync(oldPath, newPath);
|
|
925
|
+
} else if (isBun) {
|
|
926
|
+
Deno.renameSync(oldPath, newPath);
|
|
927
|
+
} else if (isDeno) {
|
|
928
|
+
Deno.renameSync(oldPath, newPath);
|
|
929
|
+
}
|
|
930
|
+
}
|
|
931
|
+
async function copyFile(src, dest, flags) {
|
|
932
|
+
if (isNode) {
|
|
933
|
+
return fsPromises.copyFile(src, dest, flags);
|
|
934
|
+
} else if (isBun) {
|
|
935
|
+
await Deno.copyFile(src, dest);
|
|
936
|
+
} else if (isDeno) {
|
|
937
|
+
await Deno.copyFile(src, dest);
|
|
938
|
+
}
|
|
939
|
+
}
|
|
940
|
+
function copyFileSync(src, dest, flags) {
|
|
941
|
+
if (isNode) {
|
|
942
|
+
fs.copyFileSync(src, dest, flags);
|
|
943
|
+
} else if (isBun) {
|
|
944
|
+
Deno.copyFileSync(src, dest);
|
|
945
|
+
} else if (isDeno) {
|
|
946
|
+
Deno.copyFileSync(src, dest);
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
async function realpath(path, options) {
|
|
950
|
+
if (isNode) {
|
|
951
|
+
return fsPromises.realpath(path, options);
|
|
952
|
+
} else if (isBun) {
|
|
953
|
+
const fs2 = require("fs/promises");
|
|
954
|
+
return fs2.realpath(path, options);
|
|
955
|
+
} else if (isDeno) {
|
|
956
|
+
return await Deno.realPath(path);
|
|
957
|
+
}
|
|
958
|
+
return path;
|
|
959
|
+
}
|
|
960
|
+
function realpathSync(path, options) {
|
|
961
|
+
if (isNode) {
|
|
962
|
+
return fs.realpathSync(path, options);
|
|
963
|
+
} else if (isBun) {
|
|
964
|
+
const fs2 = require("fs");
|
|
965
|
+
return fs2.realpathSync(path, options);
|
|
966
|
+
} else if (isDeno) {
|
|
967
|
+
return Deno.realPathSync(path);
|
|
968
|
+
}
|
|
969
|
+
return path;
|
|
970
|
+
}
|
|
971
|
+
function createStatsObject(_path, size, isDir) {
|
|
972
|
+
const now = Date.now();
|
|
973
|
+
return {
|
|
974
|
+
isFile: () => !isDir,
|
|
975
|
+
isDirectory: () => isDir,
|
|
976
|
+
isBlockDevice: () => false,
|
|
977
|
+
isCharacterDevice: () => false,
|
|
978
|
+
isSymbolicLink: () => false,
|
|
979
|
+
isFIFO: () => false,
|
|
980
|
+
isSocket: () => false,
|
|
981
|
+
dev: 0,
|
|
982
|
+
ino: 0,
|
|
983
|
+
mode: isDir ? 16877 : 33188,
|
|
984
|
+
nlink: 1,
|
|
985
|
+
uid: 0,
|
|
986
|
+
gid: 0,
|
|
987
|
+
rdev: 0,
|
|
988
|
+
size,
|
|
989
|
+
blksize: 4096,
|
|
990
|
+
blocks: Math.ceil(size / 512),
|
|
991
|
+
atimeMs: now,
|
|
992
|
+
mtimeMs: now,
|
|
993
|
+
ctimeMs: now,
|
|
994
|
+
birthtimeMs: now,
|
|
995
|
+
atime: new Date(now),
|
|
996
|
+
mtime: new Date(now),
|
|
997
|
+
ctime: new Date(now),
|
|
998
|
+
birthtime: new Date(now)
|
|
999
|
+
};
|
|
1000
|
+
}
|
|
1001
|
+
function createStatsFromDenoFileInfo(info) {
|
|
1002
|
+
return {
|
|
1003
|
+
isFile: () => info.isFile,
|
|
1004
|
+
isDirectory: () => info.isDirectory,
|
|
1005
|
+
isBlockDevice: () => false,
|
|
1006
|
+
isCharacterDevice: () => false,
|
|
1007
|
+
isSymbolicLink: () => info.isSymlink || false,
|
|
1008
|
+
isFIFO: () => false,
|
|
1009
|
+
isSocket: () => false,
|
|
1010
|
+
dev: info.dev || 0,
|
|
1011
|
+
ino: info.ino || 0,
|
|
1012
|
+
mode: info.mode || 0,
|
|
1013
|
+
nlink: info.nlink || 1,
|
|
1014
|
+
uid: info.uid || 0,
|
|
1015
|
+
gid: info.gid || 0,
|
|
1016
|
+
rdev: 0,
|
|
1017
|
+
size: info.size,
|
|
1018
|
+
blksize: info.blksize || 4096,
|
|
1019
|
+
blocks: info.blocks || Math.ceil(info.size / 512),
|
|
1020
|
+
atimeMs: info.atime?.getTime() || Date.now(),
|
|
1021
|
+
mtimeMs: info.mtime?.getTime() || Date.now(),
|
|
1022
|
+
ctimeMs: info.birthtime?.getTime() || Date.now(),
|
|
1023
|
+
birthtimeMs: info.birthtime?.getTime() || Date.now(),
|
|
1024
|
+
atime: info.atime || /* @__PURE__ */ new Date(),
|
|
1025
|
+
mtime: info.mtime || /* @__PURE__ */ new Date(),
|
|
1026
|
+
ctime: info.birthtime || /* @__PURE__ */ new Date(),
|
|
1027
|
+
birthtime: info.birthtime || /* @__PURE__ */ new Date()
|
|
1028
|
+
};
|
|
1029
|
+
}
|
|
1030
|
+
function createDirentFromDenoEntry(entry) {
|
|
1031
|
+
return {
|
|
1032
|
+
name: entry.name,
|
|
1033
|
+
isFile: () => entry.isFile,
|
|
1034
|
+
isDirectory: () => entry.isDirectory,
|
|
1035
|
+
isBlockDevice: () => false,
|
|
1036
|
+
isCharacterDevice: () => false,
|
|
1037
|
+
isSymbolicLink: () => entry.isSymlink || false,
|
|
1038
|
+
isFIFO: () => false,
|
|
1039
|
+
isSocket: () => false
|
|
1040
|
+
};
|
|
1041
|
+
}
|
|
1042
|
+
function getRuntime2() {
|
|
1043
|
+
return runtime;
|
|
1044
|
+
}
|
|
1045
|
+
var isBunOrDeno, fs, fsPromises, promises, fs_default;
|
|
1046
|
+
var init_fs = __esm({
|
|
1047
|
+
"src/fs.ts"() {
|
|
1048
|
+
"use strict";
|
|
1049
|
+
init_runtime();
|
|
1050
|
+
isBunOrDeno = isBun || isDeno;
|
|
1051
|
+
if (isNode) {
|
|
1052
|
+
fs = require("fs");
|
|
1053
|
+
fsPromises = require("fs/promises");
|
|
1054
|
+
}
|
|
1055
|
+
promises = {
|
|
1056
|
+
readFile,
|
|
1057
|
+
writeFile,
|
|
1058
|
+
appendFile,
|
|
1059
|
+
stat,
|
|
1060
|
+
mkdir,
|
|
1061
|
+
readdir,
|
|
1062
|
+
unlink,
|
|
1063
|
+
rmdir,
|
|
1064
|
+
rename,
|
|
1065
|
+
copyFile,
|
|
1066
|
+
realpath
|
|
1067
|
+
};
|
|
1068
|
+
fs_default = {
|
|
1069
|
+
readFile,
|
|
1070
|
+
readFileSync,
|
|
1071
|
+
writeFile,
|
|
1072
|
+
writeFileSync,
|
|
1073
|
+
appendFile,
|
|
1074
|
+
appendFileSync,
|
|
1075
|
+
exists,
|
|
1076
|
+
existsSync,
|
|
1077
|
+
stat,
|
|
1078
|
+
statSync,
|
|
1079
|
+
mkdir,
|
|
1080
|
+
mkdirSync,
|
|
1081
|
+
readdir,
|
|
1082
|
+
readdirSync,
|
|
1083
|
+
unlink,
|
|
1084
|
+
unlinkSync,
|
|
1085
|
+
rmdir,
|
|
1086
|
+
rmdirSync,
|
|
1087
|
+
rename,
|
|
1088
|
+
renameSync,
|
|
1089
|
+
copyFile,
|
|
1090
|
+
copyFileSync,
|
|
1091
|
+
realpath,
|
|
1092
|
+
realpathSync,
|
|
1093
|
+
promises,
|
|
1094
|
+
getRuntime: getRuntime2
|
|
1095
|
+
};
|
|
1096
|
+
}
|
|
1097
|
+
});
|
|
1098
|
+
|
|
641
1099
|
// src/server.ts
|
|
642
1100
|
var server_exports = {};
|
|
643
1101
|
__export(server_exports, {
|
|
@@ -646,6 +1104,7 @@ __export(server_exports, {
|
|
|
646
1104
|
StateManager: () => StateManager,
|
|
647
1105
|
bodyLimit: () => bodyLimit,
|
|
648
1106
|
cacheControl: () => cacheControl,
|
|
1107
|
+
clearImportMapCache: () => clearImportMapCache,
|
|
649
1108
|
compress: () => compress,
|
|
650
1109
|
cors: () => cors,
|
|
651
1110
|
createDevServer: () => createDevServer,
|
|
@@ -1233,124 +1692,8 @@ function watch(paths, options) {
|
|
|
1233
1692
|
return watcher;
|
|
1234
1693
|
}
|
|
1235
1694
|
|
|
1236
|
-
// src/
|
|
1237
|
-
|
|
1238
|
-
function parseOptions(options, defaultValue) {
|
|
1239
|
-
return typeof options === "string" ? { encoding: options } : options || defaultValue;
|
|
1240
|
-
}
|
|
1241
|
-
function decodeContent(content, encoding) {
|
|
1242
|
-
if (encoding) {
|
|
1243
|
-
return new TextDecoder(encoding).decode(content);
|
|
1244
|
-
}
|
|
1245
|
-
return Buffer.from(content instanceof ArrayBuffer ? new Uint8Array(content) : content);
|
|
1246
|
-
}
|
|
1247
|
-
var fs;
|
|
1248
|
-
var fsPromises;
|
|
1249
|
-
if (isNode) {
|
|
1250
|
-
fs = require("fs");
|
|
1251
|
-
fsPromises = require("fs/promises");
|
|
1252
|
-
}
|
|
1253
|
-
async function readFile(path, options) {
|
|
1254
|
-
const opts = parseOptions(options, {});
|
|
1255
|
-
if (isNode) {
|
|
1256
|
-
return fsPromises.readFile(path, opts);
|
|
1257
|
-
} else if (isBun) {
|
|
1258
|
-
const file = Bun.file(path);
|
|
1259
|
-
const content = await file.arrayBuffer();
|
|
1260
|
-
return decodeContent(content, opts.encoding);
|
|
1261
|
-
} else if (isDeno) {
|
|
1262
|
-
const content = await Deno.readFile(path);
|
|
1263
|
-
return decodeContent(content, opts.encoding);
|
|
1264
|
-
}
|
|
1265
|
-
throw new Error("Unsupported runtime");
|
|
1266
|
-
}
|
|
1267
|
-
async function stat(path) {
|
|
1268
|
-
if (isNode) {
|
|
1269
|
-
return fsPromises.stat(path);
|
|
1270
|
-
} else if (isBun) {
|
|
1271
|
-
const file = Bun.file(path);
|
|
1272
|
-
const size = file.size;
|
|
1273
|
-
const exists = await file.exists();
|
|
1274
|
-
if (!exists) {
|
|
1275
|
-
throw new Error(`ENOENT: no such file or directory, stat '${path}'`);
|
|
1276
|
-
}
|
|
1277
|
-
return createStatsObject(path, size, false);
|
|
1278
|
-
} else if (isDeno) {
|
|
1279
|
-
const info = await Deno.stat(path);
|
|
1280
|
-
return createStatsFromDenoFileInfo(info);
|
|
1281
|
-
}
|
|
1282
|
-
throw new Error("Unsupported runtime");
|
|
1283
|
-
}
|
|
1284
|
-
async function realpath(path, options) {
|
|
1285
|
-
if (isNode) {
|
|
1286
|
-
return fsPromises.realpath(path, options);
|
|
1287
|
-
} else if (isBun) {
|
|
1288
|
-
const fs2 = require("fs/promises");
|
|
1289
|
-
return fs2.realpath(path, options);
|
|
1290
|
-
} else if (isDeno) {
|
|
1291
|
-
return await Deno.realPath(path);
|
|
1292
|
-
}
|
|
1293
|
-
return path;
|
|
1294
|
-
}
|
|
1295
|
-
function createStatsObject(_path, size, isDir) {
|
|
1296
|
-
const now = Date.now();
|
|
1297
|
-
return {
|
|
1298
|
-
isFile: () => !isDir,
|
|
1299
|
-
isDirectory: () => isDir,
|
|
1300
|
-
isBlockDevice: () => false,
|
|
1301
|
-
isCharacterDevice: () => false,
|
|
1302
|
-
isSymbolicLink: () => false,
|
|
1303
|
-
isFIFO: () => false,
|
|
1304
|
-
isSocket: () => false,
|
|
1305
|
-
dev: 0,
|
|
1306
|
-
ino: 0,
|
|
1307
|
-
mode: isDir ? 16877 : 33188,
|
|
1308
|
-
nlink: 1,
|
|
1309
|
-
uid: 0,
|
|
1310
|
-
gid: 0,
|
|
1311
|
-
rdev: 0,
|
|
1312
|
-
size,
|
|
1313
|
-
blksize: 4096,
|
|
1314
|
-
blocks: Math.ceil(size / 512),
|
|
1315
|
-
atimeMs: now,
|
|
1316
|
-
mtimeMs: now,
|
|
1317
|
-
ctimeMs: now,
|
|
1318
|
-
birthtimeMs: now,
|
|
1319
|
-
atime: new Date(now),
|
|
1320
|
-
mtime: new Date(now),
|
|
1321
|
-
ctime: new Date(now),
|
|
1322
|
-
birthtime: new Date(now)
|
|
1323
|
-
};
|
|
1324
|
-
}
|
|
1325
|
-
function createStatsFromDenoFileInfo(info) {
|
|
1326
|
-
return {
|
|
1327
|
-
isFile: () => info.isFile,
|
|
1328
|
-
isDirectory: () => info.isDirectory,
|
|
1329
|
-
isBlockDevice: () => false,
|
|
1330
|
-
isCharacterDevice: () => false,
|
|
1331
|
-
isSymbolicLink: () => info.isSymlink || false,
|
|
1332
|
-
isFIFO: () => false,
|
|
1333
|
-
isSocket: () => false,
|
|
1334
|
-
dev: info.dev || 0,
|
|
1335
|
-
ino: info.ino || 0,
|
|
1336
|
-
mode: info.mode || 0,
|
|
1337
|
-
nlink: info.nlink || 1,
|
|
1338
|
-
uid: info.uid || 0,
|
|
1339
|
-
gid: info.gid || 0,
|
|
1340
|
-
rdev: 0,
|
|
1341
|
-
size: info.size,
|
|
1342
|
-
blksize: info.blksize || 4096,
|
|
1343
|
-
blocks: info.blocks || Math.ceil(info.size / 512),
|
|
1344
|
-
atimeMs: info.atime?.getTime() || Date.now(),
|
|
1345
|
-
mtimeMs: info.mtime?.getTime() || Date.now(),
|
|
1346
|
-
ctimeMs: info.birthtime?.getTime() || Date.now(),
|
|
1347
|
-
birthtimeMs: info.birthtime?.getTime() || Date.now(),
|
|
1348
|
-
atime: info.atime || /* @__PURE__ */ new Date(),
|
|
1349
|
-
mtime: info.mtime || /* @__PURE__ */ new Date(),
|
|
1350
|
-
ctime: info.birthtime || /* @__PURE__ */ new Date(),
|
|
1351
|
-
birthtime: info.birthtime || /* @__PURE__ */ new Date()
|
|
1352
|
-
};
|
|
1353
|
-
}
|
|
1695
|
+
// src/server.ts
|
|
1696
|
+
init_fs();
|
|
1354
1697
|
|
|
1355
1698
|
// src/path.ts
|
|
1356
1699
|
init_runtime();
|
|
@@ -2405,10 +2748,23 @@ var sendError = (res, code, msg) => {
|
|
|
2405
2748
|
var send404 = (res, msg = "Not Found") => sendError(res, 404, msg);
|
|
2406
2749
|
var send403 = (res, msg = "Forbidden") => sendError(res, 403, msg);
|
|
2407
2750
|
var send500 = (res, msg = "Internal Server Error") => sendError(res, 500, msg);
|
|
2408
|
-
var createElitImportMap = (basePath = "", mode = "dev") => {
|
|
2409
|
-
const srcPath = mode === "dev" ? basePath ? `${basePath}/node_modules/elit/src` : "/node_modules/elit/src" : basePath ? `${basePath}/dist` : "/dist";
|
|
2751
|
+
var createElitImportMap = async (rootDir, basePath = "", mode = "dev") => {
|
|
2752
|
+
const srcPath = mode === "dev" ? basePath ? `${basePath}/node_modules/elit/src` : "/node_modules/elit/src" : basePath ? `${basePath}/node_modules/elit/dist` : "/node_modules/elit/dist";
|
|
2410
2753
|
const fileExt = mode === "dev" ? ".ts" : ".mjs";
|
|
2411
|
-
|
|
2754
|
+
const elitImports = {
|
|
2755
|
+
"elit": `${srcPath}/index${fileExt}`,
|
|
2756
|
+
"elit/": `${srcPath}/`,
|
|
2757
|
+
"elit/dom": `${srcPath}/dom${fileExt}`,
|
|
2758
|
+
"elit/state": `${srcPath}/state${fileExt}`,
|
|
2759
|
+
"elit/style": `${srcPath}/style${fileExt}`,
|
|
2760
|
+
"elit/el": `${srcPath}/el${fileExt}`,
|
|
2761
|
+
"elit/router": `${srcPath}/router${fileExt}`,
|
|
2762
|
+
"elit/hmr": `${srcPath}/hmr${fileExt}`,
|
|
2763
|
+
"elit/types": `${srcPath}/types${fileExt}`
|
|
2764
|
+
};
|
|
2765
|
+
const externalImports = await generateExternalImportMaps(rootDir, basePath);
|
|
2766
|
+
const allImports = { ...externalImports, ...elitImports };
|
|
2767
|
+
return `<script type="importmap">${JSON.stringify({ imports: allImports }, null, 2)}</script>`;
|
|
2412
2768
|
};
|
|
2413
2769
|
var createHMRScript = (port, wsPath) => `<script>(function(){let ws;let retries=0;let maxRetries=5;function connect(){ws=new WebSocket('ws://'+window.location.hostname+':${port}${wsPath}');ws.onopen=()=>{console.log('[Elit HMR] Connected');retries=0};ws.onmessage=(e)=>{const d=JSON.parse(e.data);if(d.type==='update'){console.log('[Elit HMR] File updated:',d.path);window.location.reload()}else if(d.type==='reload'){console.log('[Elit HMR] Reloading...');window.location.reload()}else if(d.type==='error')console.error('[Elit HMR] Error:',d.error)};ws.onclose=()=>{if(retries<maxRetries){retries++;setTimeout(connect,1000*retries)}else if(retries===maxRetries){console.log('[Elit HMR] Connection closed. Start dev server to reconnect.')}};ws.onerror=()=>{ws.close()}}connect()})();</script>`;
|
|
2414
2770
|
var rewriteRelativePaths = (html2, basePath) => {
|
|
@@ -2436,6 +2792,223 @@ async function findSpecialDir(startDir, targetDir) {
|
|
|
2436
2792
|
}
|
|
2437
2793
|
return null;
|
|
2438
2794
|
}
|
|
2795
|
+
var importMapCache = /* @__PURE__ */ new Map();
|
|
2796
|
+
function clearImportMapCache() {
|
|
2797
|
+
importMapCache.clear();
|
|
2798
|
+
}
|
|
2799
|
+
async function generateExternalImportMaps(rootDir, basePath = "") {
|
|
2800
|
+
const cacheKey = `${rootDir}:${basePath}`;
|
|
2801
|
+
if (importMapCache.has(cacheKey)) {
|
|
2802
|
+
return importMapCache.get(cacheKey);
|
|
2803
|
+
}
|
|
2804
|
+
const importMap = {};
|
|
2805
|
+
const nodeModulesPath = await findNodeModules(rootDir);
|
|
2806
|
+
if (!nodeModulesPath) {
|
|
2807
|
+
importMapCache.set(cacheKey, importMap);
|
|
2808
|
+
return importMap;
|
|
2809
|
+
}
|
|
2810
|
+
try {
|
|
2811
|
+
const { readdir: readdir2 } = await Promise.resolve().then(() => (init_fs(), fs_exports));
|
|
2812
|
+
const packages = await readdir2(nodeModulesPath);
|
|
2813
|
+
for (const pkgEntry of packages) {
|
|
2814
|
+
const pkg = typeof pkgEntry === "string" ? pkgEntry : pkgEntry.name;
|
|
2815
|
+
if (pkg.startsWith(".")) continue;
|
|
2816
|
+
if (pkg.startsWith("@")) {
|
|
2817
|
+
try {
|
|
2818
|
+
const scopedPackages = await readdir2(join(nodeModulesPath, pkg));
|
|
2819
|
+
for (const scopedEntry of scopedPackages) {
|
|
2820
|
+
const scopedPkg = typeof scopedEntry === "string" ? scopedEntry : scopedEntry.name;
|
|
2821
|
+
const fullPkgName = `${pkg}/${scopedPkg}`;
|
|
2822
|
+
await processPackage(nodeModulesPath, fullPkgName, importMap, basePath);
|
|
2823
|
+
}
|
|
2824
|
+
} catch {
|
|
2825
|
+
}
|
|
2826
|
+
} else {
|
|
2827
|
+
await processPackage(nodeModulesPath, pkg, importMap, basePath);
|
|
2828
|
+
}
|
|
2829
|
+
}
|
|
2830
|
+
} catch (error) {
|
|
2831
|
+
console.error("[Import Maps] Error scanning node_modules:", error);
|
|
2832
|
+
}
|
|
2833
|
+
importMapCache.set(cacheKey, importMap);
|
|
2834
|
+
return importMap;
|
|
2835
|
+
}
|
|
2836
|
+
async function findNodeModules(startDir) {
|
|
2837
|
+
const foundDir = await findSpecialDir(startDir, "node_modules");
|
|
2838
|
+
return foundDir ? join(foundDir, "node_modules") : null;
|
|
2839
|
+
}
|
|
2840
|
+
function isBrowserCompatible(pkgName, pkgJson) {
|
|
2841
|
+
const buildTools = [
|
|
2842
|
+
"typescript",
|
|
2843
|
+
"esbuild",
|
|
2844
|
+
"@esbuild/",
|
|
2845
|
+
"tsx",
|
|
2846
|
+
"tsup",
|
|
2847
|
+
"rollup",
|
|
2848
|
+
"vite",
|
|
2849
|
+
"webpack",
|
|
2850
|
+
"parcel",
|
|
2851
|
+
"terser",
|
|
2852
|
+
"uglify",
|
|
2853
|
+
"babel",
|
|
2854
|
+
"@babel/",
|
|
2855
|
+
"postcss",
|
|
2856
|
+
"autoprefixer",
|
|
2857
|
+
"cssnano",
|
|
2858
|
+
"sass",
|
|
2859
|
+
"less",
|
|
2860
|
+
"stylus"
|
|
2861
|
+
];
|
|
2862
|
+
const nodeOnly = [
|
|
2863
|
+
"node-",
|
|
2864
|
+
"@node-",
|
|
2865
|
+
"fsevents",
|
|
2866
|
+
"chokidar",
|
|
2867
|
+
"express",
|
|
2868
|
+
"koa",
|
|
2869
|
+
"fastify",
|
|
2870
|
+
"nest",
|
|
2871
|
+
"commander",
|
|
2872
|
+
"yargs",
|
|
2873
|
+
"inquirer",
|
|
2874
|
+
"chalk",
|
|
2875
|
+
"ora",
|
|
2876
|
+
"nodemon",
|
|
2877
|
+
"pm2",
|
|
2878
|
+
"dotenv"
|
|
2879
|
+
];
|
|
2880
|
+
const testingTools = [
|
|
2881
|
+
"jest",
|
|
2882
|
+
"vitest",
|
|
2883
|
+
"mocha",
|
|
2884
|
+
"chai",
|
|
2885
|
+
"jasmine",
|
|
2886
|
+
"@jest/",
|
|
2887
|
+
"@testing-library/",
|
|
2888
|
+
"@vitest/",
|
|
2889
|
+
"playwright",
|
|
2890
|
+
"puppeteer",
|
|
2891
|
+
"cypress"
|
|
2892
|
+
];
|
|
2893
|
+
const linters = [
|
|
2894
|
+
"eslint",
|
|
2895
|
+
"@eslint/",
|
|
2896
|
+
"prettier",
|
|
2897
|
+
"tslint",
|
|
2898
|
+
"stylelint",
|
|
2899
|
+
"commitlint"
|
|
2900
|
+
];
|
|
2901
|
+
const typeDefinitions = [
|
|
2902
|
+
"@types/",
|
|
2903
|
+
"@typescript-eslint/"
|
|
2904
|
+
];
|
|
2905
|
+
const utilities = [
|
|
2906
|
+
"get-tsconfig",
|
|
2907
|
+
"resolve-pkg-maps",
|
|
2908
|
+
"pkg-types",
|
|
2909
|
+
"fast-glob",
|
|
2910
|
+
"globby",
|
|
2911
|
+
"micromatch",
|
|
2912
|
+
"execa",
|
|
2913
|
+
"cross-spawn",
|
|
2914
|
+
"shelljs"
|
|
2915
|
+
];
|
|
2916
|
+
const skipPatterns = [
|
|
2917
|
+
...buildTools,
|
|
2918
|
+
...nodeOnly,
|
|
2919
|
+
...testingTools,
|
|
2920
|
+
...linters,
|
|
2921
|
+
...typeDefinitions,
|
|
2922
|
+
...utilities
|
|
2923
|
+
];
|
|
2924
|
+
if (skipPatterns.some((pattern) => pkgName.startsWith(pattern))) {
|
|
2925
|
+
return false;
|
|
2926
|
+
}
|
|
2927
|
+
if (pkgName === "lodash") {
|
|
2928
|
+
return false;
|
|
2929
|
+
}
|
|
2930
|
+
if (pkgJson.browser || pkgJson.module) {
|
|
2931
|
+
return true;
|
|
2932
|
+
}
|
|
2933
|
+
if (pkgJson.exports) {
|
|
2934
|
+
const exportsStr = JSON.stringify(pkgJson.exports);
|
|
2935
|
+
if (exportsStr.includes('"import"') || exportsStr.includes('"browser"')) {
|
|
2936
|
+
return true;
|
|
2937
|
+
}
|
|
2938
|
+
}
|
|
2939
|
+
if (pkgJson.type === "commonjs" && !pkgJson.module && !pkgJson.browser) {
|
|
2940
|
+
return false;
|
|
2941
|
+
}
|
|
2942
|
+
return !!(pkgJson.exports || pkgJson.type === "module" || pkgJson.module);
|
|
2943
|
+
}
|
|
2944
|
+
async function processPackage(nodeModulesPath, pkgName, importMap, basePath) {
|
|
2945
|
+
const pkgPath = join(nodeModulesPath, pkgName);
|
|
2946
|
+
const pkgJsonPath = join(pkgPath, "package.json");
|
|
2947
|
+
try {
|
|
2948
|
+
const pkgJsonContent = await readFile(pkgJsonPath);
|
|
2949
|
+
const pkgJson = JSON.parse(pkgJsonContent.toString());
|
|
2950
|
+
if (!isBrowserCompatible(pkgName, pkgJson)) {
|
|
2951
|
+
return;
|
|
2952
|
+
}
|
|
2953
|
+
const baseUrl = basePath ? `${basePath}/node_modules/${pkgName}` : `/node_modules/${pkgName}`;
|
|
2954
|
+
if (pkgJson.exports) {
|
|
2955
|
+
processExportsField(pkgName, pkgJson.exports, baseUrl, importMap);
|
|
2956
|
+
} else {
|
|
2957
|
+
const entryPoint = pkgJson.browser || pkgJson.module || pkgJson.main || "index.js";
|
|
2958
|
+
importMap[pkgName] = `${baseUrl}/${entryPoint}`;
|
|
2959
|
+
importMap[`${pkgName}/`] = `${baseUrl}/`;
|
|
2960
|
+
}
|
|
2961
|
+
} catch {
|
|
2962
|
+
}
|
|
2963
|
+
}
|
|
2964
|
+
function processExportsField(pkgName, exports2, baseUrl, importMap) {
|
|
2965
|
+
if (typeof exports2 === "string") {
|
|
2966
|
+
importMap[pkgName] = `${baseUrl}/${exports2}`;
|
|
2967
|
+
importMap[`${pkgName}/`] = `${baseUrl}/`;
|
|
2968
|
+
return;
|
|
2969
|
+
}
|
|
2970
|
+
if (typeof exports2 === "object" && exports2 !== null) {
|
|
2971
|
+
if ("." in exports2) {
|
|
2972
|
+
const dotExport = exports2["."];
|
|
2973
|
+
const resolved = resolveExport(dotExport);
|
|
2974
|
+
if (resolved) {
|
|
2975
|
+
importMap[pkgName] = `${baseUrl}/${resolved}`;
|
|
2976
|
+
}
|
|
2977
|
+
} else if ("import" in exports2) {
|
|
2978
|
+
const resolved = resolveExport(exports2);
|
|
2979
|
+
if (resolved) {
|
|
2980
|
+
importMap[pkgName] = `${baseUrl}/${resolved}`;
|
|
2981
|
+
}
|
|
2982
|
+
}
|
|
2983
|
+
for (const [key, value] of Object.entries(exports2)) {
|
|
2984
|
+
if (key === "." || key === "import" || key === "require" || key === "types" || key === "default") {
|
|
2985
|
+
continue;
|
|
2986
|
+
}
|
|
2987
|
+
const resolved = resolveExport(value);
|
|
2988
|
+
if (resolved) {
|
|
2989
|
+
const cleanKey = key.startsWith("./") ? key.slice(2) : key;
|
|
2990
|
+
const importName = cleanKey ? `${pkgName}/${cleanKey}` : pkgName;
|
|
2991
|
+
importMap[importName] = `${baseUrl}/${resolved}`;
|
|
2992
|
+
}
|
|
2993
|
+
}
|
|
2994
|
+
importMap[`${pkgName}/`] = `${baseUrl}/`;
|
|
2995
|
+
}
|
|
2996
|
+
}
|
|
2997
|
+
function resolveExport(exportValue) {
|
|
2998
|
+
if (typeof exportValue === "string") {
|
|
2999
|
+
return exportValue.startsWith("./") ? exportValue.slice(2) : exportValue;
|
|
3000
|
+
}
|
|
3001
|
+
if (typeof exportValue === "object" && exportValue !== null) {
|
|
3002
|
+
const resolved = exportValue.import || exportValue.browser || exportValue.default || exportValue.require;
|
|
3003
|
+
if (typeof resolved === "object" && resolved !== null) {
|
|
3004
|
+
return resolveExport(resolved);
|
|
3005
|
+
}
|
|
3006
|
+
if (typeof resolved === "string") {
|
|
3007
|
+
return resolved.startsWith("./") ? resolved.slice(2) : resolved;
|
|
3008
|
+
}
|
|
3009
|
+
}
|
|
3010
|
+
return null;
|
|
3011
|
+
}
|
|
2439
3012
|
function cors(options = {}) {
|
|
2440
3013
|
const { origin = "*", methods = ["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"], credentials = true, maxAge = 86400 } = options;
|
|
2441
3014
|
return async (ctx, next) => {
|
|
@@ -2801,7 +3374,7 @@ function createDevServer(options) {
|
|
|
2801
3374
|
}
|
|
2802
3375
|
let filePath;
|
|
2803
3376
|
if (url === "/" && matchedClient.ssr && !matchedClient.index) {
|
|
2804
|
-
return serveSSR(res, matchedClient);
|
|
3377
|
+
return await serveSSR(res, matchedClient);
|
|
2805
3378
|
} else {
|
|
2806
3379
|
filePath = url === "/" ? matchedClient.index || "/index.html" : url;
|
|
2807
3380
|
}
|
|
@@ -2883,7 +3456,7 @@ function createDevServer(options) {
|
|
|
2883
3456
|
if (!resolvedPath) {
|
|
2884
3457
|
if (!res.headersSent) {
|
|
2885
3458
|
if (filePath === "/index.html" && matchedClient.ssr) {
|
|
2886
|
-
return serveSSR(res, matchedClient);
|
|
3459
|
+
return await serveSSR(res, matchedClient);
|
|
2887
3460
|
}
|
|
2888
3461
|
if (config.logging) console.log(`[404] ${filePath}`);
|
|
2889
3462
|
return send404(res, "404 Not Found");
|
|
@@ -2907,7 +3480,7 @@ function createDevServer(options) {
|
|
|
2907
3480
|
} catch {
|
|
2908
3481
|
if (config.logging) console.log(`[DEBUG] No index file found in directory`);
|
|
2909
3482
|
if (matchedClient.ssr) {
|
|
2910
|
-
return serveSSR(res, matchedClient);
|
|
3483
|
+
return await serveSSR(res, matchedClient);
|
|
2911
3484
|
}
|
|
2912
3485
|
return send404(res, "404 Not Found");
|
|
2913
3486
|
}
|
|
@@ -2927,12 +3500,12 @@ function createDevServer(options) {
|
|
|
2927
3500
|
return send403(res, "403 Forbidden");
|
|
2928
3501
|
}
|
|
2929
3502
|
await stat(indexPath);
|
|
2930
|
-
return serveFile(indexPath, res, matchedClient);
|
|
3503
|
+
return serveFile(indexPath, res, matchedClient, isDistRequest || isNodeModulesRequest);
|
|
2931
3504
|
} catch {
|
|
2932
3505
|
return send404(res, "404 Not Found");
|
|
2933
3506
|
}
|
|
2934
3507
|
}
|
|
2935
|
-
await serveFile(fullPath, res, matchedClient);
|
|
3508
|
+
await serveFile(fullPath, res, matchedClient, isDistRequest || isNodeModulesRequest);
|
|
2936
3509
|
} catch (error) {
|
|
2937
3510
|
if (!res.headersSent) {
|
|
2938
3511
|
if (config.logging) console.log(`[404] ${filePath}`);
|
|
@@ -2940,16 +3513,12 @@ function createDevServer(options) {
|
|
|
2940
3513
|
}
|
|
2941
3514
|
}
|
|
2942
3515
|
});
|
|
2943
|
-
async function serveFile(filePath, res, client) {
|
|
3516
|
+
async function serveFile(filePath, res, client, isNodeModulesOrDist = false) {
|
|
2944
3517
|
try {
|
|
2945
3518
|
const rootDir = await realpath(resolve(client.root));
|
|
2946
3519
|
const unresolvedPath = resolve(filePath);
|
|
2947
|
-
|
|
2948
|
-
|
|
2949
|
-
const projectRoot = await realpath(resolve(client.root, ".."));
|
|
2950
|
-
const isInProjectRoot = unresolvedPath.startsWith(projectRoot + sep) || unresolvedPath === projectRoot;
|
|
2951
|
-
if (!unresolvedPath.startsWith(rootDir + sep) && unresolvedPath !== rootDir && !isInProjectRoot) {
|
|
2952
|
-
if (!isNodeModules && !isDist) {
|
|
3520
|
+
if (!isNodeModulesOrDist) {
|
|
3521
|
+
if (!unresolvedPath.startsWith(rootDir + sep) && unresolvedPath !== rootDir) {
|
|
2953
3522
|
if (config.logging) console.log(`[403] Attempted to serve file outside allowed directories: ${filePath}`);
|
|
2954
3523
|
return send403(res, "403 Forbidden");
|
|
2955
3524
|
}
|
|
@@ -2957,9 +3526,14 @@ function createDevServer(options) {
|
|
|
2957
3526
|
let resolvedPath;
|
|
2958
3527
|
try {
|
|
2959
3528
|
resolvedPath = await realpath(unresolvedPath);
|
|
3529
|
+
if (isNodeModulesOrDist && resolvedPath) {
|
|
3530
|
+
if (config.logging && !resolvedPath.startsWith(rootDir + sep)) {
|
|
3531
|
+
console.log(`[DEBUG] Serving symlinked file: ${resolvedPath}`);
|
|
3532
|
+
}
|
|
3533
|
+
}
|
|
2960
3534
|
} catch {
|
|
2961
3535
|
if (filePath.endsWith("index.html") && client.ssr) {
|
|
2962
|
-
return serveSSR(res, client);
|
|
3536
|
+
return await serveSSR(res, client);
|
|
2963
3537
|
}
|
|
2964
3538
|
return send404(res, "404 Not Found");
|
|
2965
3539
|
}
|
|
@@ -3063,7 +3637,7 @@ ${error}`);
|
|
|
3063
3637
|
}
|
|
3064
3638
|
}
|
|
3065
3639
|
}
|
|
3066
|
-
const elitImportMap = createElitImportMap(basePath, client.mode);
|
|
3640
|
+
const elitImportMap = await createElitImportMap(client.root, basePath, client.mode);
|
|
3067
3641
|
const headInjection = ssrStyles ? `${ssrStyles}
|
|
3068
3642
|
${elitImportMap}` : elitImportMap;
|
|
3069
3643
|
html2 = html2.includes("</head>") ? html2.replace("</head>", `${headInjection}</head>`) : html2;
|
|
@@ -3093,7 +3667,7 @@ ${elitImportMap}` : elitImportMap;
|
|
|
3093
3667
|
send500(res, "500 Internal Server Error");
|
|
3094
3668
|
}
|
|
3095
3669
|
}
|
|
3096
|
-
function serveSSR(res, client) {
|
|
3670
|
+
async function serveSSR(res, client) {
|
|
3097
3671
|
try {
|
|
3098
3672
|
if (!client.ssr) {
|
|
3099
3673
|
return send500(res, "SSR function not configured");
|
|
@@ -3115,7 +3689,7 @@ ${elitImportMap}` : elitImportMap;
|
|
|
3115
3689
|
const basePath = normalizeBasePath(client.basePath);
|
|
3116
3690
|
html2 = rewriteRelativePaths(html2, basePath);
|
|
3117
3691
|
const hmrScript = createHMRScript(config.port, basePath);
|
|
3118
|
-
const elitImportMap = createElitImportMap(basePath, client.mode);
|
|
3692
|
+
const elitImportMap = await createElitImportMap(client.root, basePath, client.mode);
|
|
3119
3693
|
html2 = html2.includes("</head>") ? html2.replace("</head>", `${elitImportMap}</head>`) : html2;
|
|
3120
3694
|
html2 = html2.includes("</body>") ? html2.replace("</body>", `${hmrScript}</body>`) : html2 + hmrScript;
|
|
3121
3695
|
res.writeHead(200, { "Content-Type": "text/html", "Cache-Control": "no-cache, no-store, must-revalidate" });
|
|
@@ -3252,6 +3826,7 @@ ${elitImportMap}` : elitImportMap;
|
|
|
3252
3826
|
StateManager,
|
|
3253
3827
|
bodyLimit,
|
|
3254
3828
|
cacheControl,
|
|
3829
|
+
clearImportMapCache,
|
|
3255
3830
|
compress,
|
|
3256
3831
|
cors,
|
|
3257
3832
|
createDevServer,
|