Implement packwiz serve
This commit is contained in:
parent
68b849df0c
commit
6345c7e151
4 changed files with 155 additions and 8 deletions
|
@ -23,6 +23,7 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@root/walk": "^1.1.0",
|
"@root/walk": "^1.1.0",
|
||||||
|
"address": "^1.2.0",
|
||||||
"commander": "^9.4.0",
|
"commander": "^9.4.0",
|
||||||
"dedent": "^0.7.0",
|
"dedent": "^0.7.0",
|
||||||
"env-paths": "^3.0.0",
|
"env-paths": "^3.0.0",
|
||||||
|
@ -41,6 +42,7 @@
|
||||||
"p-limit": "^4.0.0",
|
"p-limit": "^4.0.0",
|
||||||
"s-ago": "^2.2.0",
|
"s-ago": "^2.2.0",
|
||||||
"semver": "^7.3.7",
|
"semver": "^7.3.7",
|
||||||
|
"serve-handler": "^6.1.3",
|
||||||
"wrap-ansi": "^8.0.1",
|
"wrap-ansi": "^8.0.1",
|
||||||
"yazl": "^2.5.1",
|
"yazl": "^2.5.1",
|
||||||
"zod": "^3.18.0"
|
"zod": "^3.18.0"
|
||||||
|
@ -51,6 +53,7 @@
|
||||||
"@types/lodash-es": "^4.17.6",
|
"@types/lodash-es": "^4.17.6",
|
||||||
"@types/node": "^18.7.3",
|
"@types/node": "^18.7.3",
|
||||||
"@types/semver": "^7.3.12",
|
"@types/semver": "^7.3.12",
|
||||||
|
"@types/serve-handler": "^6.1.1",
|
||||||
"@types/wrap-ansi": "^8.0.1",
|
"@types/wrap-ansi": "^8.0.1",
|
||||||
"@types/yazl": "^2.4.2",
|
"@types/yazl": "^2.4.2",
|
||||||
"tsx": "^3.8.2",
|
"tsx": "^3.8.2",
|
||||||
|
|
96
pnpm-lock.yaml
generated
96
pnpm-lock.yaml
generated
|
@ -7,8 +7,10 @@ specifiers:
|
||||||
'@types/lodash-es': ^4.17.6
|
'@types/lodash-es': ^4.17.6
|
||||||
'@types/node': ^18.7.3
|
'@types/node': ^18.7.3
|
||||||
'@types/semver': ^7.3.12
|
'@types/semver': ^7.3.12
|
||||||
|
'@types/serve-handler': ^6.1.1
|
||||||
'@types/wrap-ansi': ^8.0.1
|
'@types/wrap-ansi': ^8.0.1
|
||||||
'@types/yazl': ^2.4.2
|
'@types/yazl': ^2.4.2
|
||||||
|
address: ^1.2.0
|
||||||
commander: ^9.4.0
|
commander: ^9.4.0
|
||||||
dedent: ^0.7.0
|
dedent: ^0.7.0
|
||||||
env-paths: ^3.0.0
|
env-paths: ^3.0.0
|
||||||
|
@ -27,6 +29,7 @@ specifiers:
|
||||||
p-limit: ^4.0.0
|
p-limit: ^4.0.0
|
||||||
s-ago: ^2.2.0
|
s-ago: ^2.2.0
|
||||||
semver: ^7.3.7
|
semver: ^7.3.7
|
||||||
|
serve-handler: ^6.1.3
|
||||||
tsx: ^3.8.2
|
tsx: ^3.8.2
|
||||||
type-fest: ^2.18.0
|
type-fest: ^2.18.0
|
||||||
typescript: ^4.7.4
|
typescript: ^4.7.4
|
||||||
|
@ -36,6 +39,7 @@ specifiers:
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
'@root/walk': 1.1.0
|
'@root/walk': 1.1.0
|
||||||
|
address: 1.2.0
|
||||||
commander: 9.4.0
|
commander: 9.4.0
|
||||||
dedent: 0.7.0
|
dedent: 0.7.0
|
||||||
env-paths: 3.0.0
|
env-paths: 3.0.0
|
||||||
|
@ -54,6 +58,7 @@ dependencies:
|
||||||
p-limit: 4.0.0
|
p-limit: 4.0.0
|
||||||
s-ago: 2.2.0
|
s-ago: 2.2.0
|
||||||
semver: 7.3.7
|
semver: 7.3.7
|
||||||
|
serve-handler: 6.1.3
|
||||||
wrap-ansi: 8.0.1
|
wrap-ansi: 8.0.1
|
||||||
yazl: 2.5.1
|
yazl: 2.5.1
|
||||||
zod: 3.18.0
|
zod: 3.18.0
|
||||||
|
@ -64,6 +69,7 @@ devDependencies:
|
||||||
'@types/lodash-es': 4.17.6
|
'@types/lodash-es': 4.17.6
|
||||||
'@types/node': 18.7.3
|
'@types/node': 18.7.3
|
||||||
'@types/semver': 7.3.12
|
'@types/semver': 7.3.12
|
||||||
|
'@types/serve-handler': 6.1.1
|
||||||
'@types/wrap-ansi': 8.0.1
|
'@types/wrap-ansi': 8.0.1
|
||||||
'@types/yazl': 2.4.2
|
'@types/yazl': 2.4.2
|
||||||
tsx: 3.8.2
|
tsx: 3.8.2
|
||||||
|
@ -174,6 +180,12 @@ packages:
|
||||||
resolution: {integrity: sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==}
|
resolution: {integrity: sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/@types/serve-handler/6.1.1:
|
||||||
|
resolution: {integrity: sha512-bIwSmD+OV8w0t2e7EWsuQYlGoS1o5aEdVktgkXaa43Zm0qVWi21xaSRb3DQA1UXD+DJ5bRq1Rgu14ZczB+CjIQ==}
|
||||||
|
dependencies:
|
||||||
|
'@types/node': 18.7.3
|
||||||
|
dev: true
|
||||||
|
|
||||||
/@types/wrap-ansi/8.0.1:
|
/@types/wrap-ansi/8.0.1:
|
||||||
resolution: {integrity: sha512-cjwgM6WWy9YakrQ36Pq0vg5XoNblVEaNq+/pHngKl4GyyDIxTeskPoG+tp4LsRk0lHrA4LaLJqlvYridi7mzlw==}
|
resolution: {integrity: sha512-cjwgM6WWy9YakrQ36Pq0vg5XoNblVEaNq+/pHngKl4GyyDIxTeskPoG+tp4LsRk0lHrA4LaLJqlvYridi7mzlw==}
|
||||||
dev: true
|
dev: true
|
||||||
|
@ -184,6 +196,11 @@ packages:
|
||||||
'@types/node': 18.7.3
|
'@types/node': 18.7.3
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/address/1.2.0:
|
||||||
|
resolution: {integrity: sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig==}
|
||||||
|
engines: {node: '>= 10.0.0'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/ansi-regex/6.0.1:
|
/ansi-regex/6.0.1:
|
||||||
resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
|
resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
|
@ -199,6 +216,10 @@ packages:
|
||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/balanced-match/1.0.2:
|
||||||
|
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/base64-js/1.5.1:
|
/base64-js/1.5.1:
|
||||||
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
|
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
|
||||||
dev: false
|
dev: false
|
||||||
|
@ -211,6 +232,13 @@ packages:
|
||||||
readable-stream: 3.6.0
|
readable-stream: 3.6.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/brace-expansion/1.1.11:
|
||||||
|
resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
|
||||||
|
dependencies:
|
||||||
|
balanced-match: 1.0.2
|
||||||
|
concat-map: 0.0.1
|
||||||
|
dev: false
|
||||||
|
|
||||||
/buffer-crc32/0.2.13:
|
/buffer-crc32/0.2.13:
|
||||||
resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
|
resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
|
||||||
dev: false
|
dev: false
|
||||||
|
@ -226,6 +254,11 @@ packages:
|
||||||
ieee754: 1.2.1
|
ieee754: 1.2.1
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/bytes/3.0.0:
|
||||||
|
resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==}
|
||||||
|
engines: {node: '>= 0.8'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/cacheable-lookup/6.1.0:
|
/cacheable-lookup/6.1.0:
|
||||||
resolution: {integrity: sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==}
|
resolution: {integrity: sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==}
|
||||||
engines: {node: '>=10.6.0'}
|
engines: {node: '>=10.6.0'}
|
||||||
|
@ -285,6 +318,15 @@ packages:
|
||||||
json-buffer: 3.0.1
|
json-buffer: 3.0.1
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/concat-map/0.0.1:
|
||||||
|
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/content-disposition/0.5.2:
|
||||||
|
resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==}
|
||||||
|
engines: {node: '>= 0.6'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/currently-unhandled/0.4.1:
|
/currently-unhandled/0.4.1:
|
||||||
resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==}
|
resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==}
|
||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
|
@ -559,6 +601,12 @@ packages:
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/fast-url-parser/1.1.3:
|
||||||
|
resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==}
|
||||||
|
dependencies:
|
||||||
|
punycode: 1.4.1
|
||||||
|
dev: false
|
||||||
|
|
||||||
/figures/5.0.0:
|
/figures/5.0.0:
|
||||||
resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==}
|
resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
|
@ -771,6 +819,18 @@ packages:
|
||||||
yallist: 4.0.0
|
yallist: 4.0.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/mime-db/1.33.0:
|
||||||
|
resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==}
|
||||||
|
engines: {node: '>= 0.6'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/mime-types/2.1.18:
|
||||||
|
resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==}
|
||||||
|
engines: {node: '>= 0.6'}
|
||||||
|
dependencies:
|
||||||
|
mime-db: 1.33.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
/mimic-fn/2.1.0:
|
/mimic-fn/2.1.0:
|
||||||
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
|
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
|
@ -786,6 +846,12 @@ packages:
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/minimatch/3.0.4:
|
||||||
|
resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==}
|
||||||
|
dependencies:
|
||||||
|
brace-expansion: 1.1.11
|
||||||
|
dev: false
|
||||||
|
|
||||||
/ms/2.1.2:
|
/ms/2.1.2:
|
||||||
resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
|
resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
|
||||||
dev: false
|
dev: false
|
||||||
|
@ -865,6 +931,14 @@ packages:
|
||||||
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/path-is-inside/1.0.2:
|
||||||
|
resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/path-to-regexp/2.2.1:
|
||||||
|
resolution: {integrity: sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/pump/3.0.0:
|
/pump/3.0.0:
|
||||||
resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
|
resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -872,11 +946,20 @@ packages:
|
||||||
once: 1.4.0
|
once: 1.4.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/punycode/1.4.1:
|
||||||
|
resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/quick-lru/5.1.1:
|
/quick-lru/5.1.1:
|
||||||
resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
|
resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/range-parser/1.2.0:
|
||||||
|
resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==}
|
||||||
|
engines: {node: '>= 0.6'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/readable-stream/3.6.0:
|
/readable-stream/3.6.0:
|
||||||
resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==}
|
resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==}
|
||||||
engines: {node: '>= 6'}
|
engines: {node: '>= 6'}
|
||||||
|
@ -920,6 +1003,19 @@ packages:
|
||||||
lru-cache: 6.0.0
|
lru-cache: 6.0.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/serve-handler/6.1.3:
|
||||||
|
resolution: {integrity: sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w==}
|
||||||
|
dependencies:
|
||||||
|
bytes: 3.0.0
|
||||||
|
content-disposition: 0.5.2
|
||||||
|
fast-url-parser: 1.1.3
|
||||||
|
mime-types: 2.1.18
|
||||||
|
minimatch: 3.0.4
|
||||||
|
path-is-inside: 1.0.2
|
||||||
|
path-to-regexp: 2.2.1
|
||||||
|
range-parser: 1.2.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
/signal-exit/3.0.7:
|
/signal-exit/3.0.7:
|
||||||
resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
|
resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
|
@ -3,7 +3,7 @@ import { usePack } from "../pack.js"
|
||||||
import fs from "fs-extra"
|
import fs from "fs-extra"
|
||||||
import dedent from "dedent"
|
import dedent from "dedent"
|
||||||
import kleur from "kleur"
|
import kleur from "kleur"
|
||||||
import { getSha512HexHash } from "../utils.js"
|
import { getLANAddress, getSha512HexHash, httpServeDirectory, optionParsePositiveInteger } from "../utils.js"
|
||||||
import { output } from "../output.js"
|
import { output } from "../output.js"
|
||||||
import { Visitor, walk } from "@root/walk"
|
import { Visitor, walk } from "@root/walk"
|
||||||
import { Path } from "../path.js"
|
import { Path } from "../path.js"
|
||||||
|
@ -25,9 +25,28 @@ packwizCommand.command("import")
|
||||||
|
|
||||||
packwizCommand.command("serve")
|
packwizCommand.command("serve")
|
||||||
.description("Start an HTTP server in the packwiz directory.")
|
.description("Start an HTTP server in the packwiz directory.")
|
||||||
.action(async () => {
|
.option("-p, --port <port>", "The port of the HTTP server.", optionParsePositiveInteger, 8000)
|
||||||
output.failAndExit("Not implemented.")
|
.option("-e, --expose", "Expose the HTTP server on all interfaces.")
|
||||||
// TODO: serve
|
.action(async options => {
|
||||||
|
const pack = await usePack()
|
||||||
|
const directoryPath = pack.paths.generated.resolve("packwiz")
|
||||||
|
if (!(await fs.pathExists(directoryPath.toString())))
|
||||||
|
output.failAndExit(`The ${kleur.yellow("packwiz")} directory does not exist. Generate it by running ${kleur.yellow("horizr packwiz export")}.`)
|
||||||
|
|
||||||
|
const lanAddress = await getLANAddress()
|
||||||
|
|
||||||
|
httpServeDirectory(directoryPath, options.port, options.expose, () => {
|
||||||
|
const localAddress = `http://localhost:${options.port}/pack.toml`
|
||||||
|
|
||||||
|
if (options.expose) {
|
||||||
|
output.println(dedent`
|
||||||
|
${kleur.green("Serving at")}
|
||||||
|
Local: ${kleur.yellow(localAddress)}
|
||||||
|
Network: ${kleur.yellow(`http://${lanAddress}:${options.port}/pack.toml`)}
|
||||||
|
`)
|
||||||
|
}
|
||||||
|
else output.println(`${kleur.green("Serving at")} ${kleur.yellow(localAddress)}`)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
packwizCommand.command("dev")
|
packwizCommand.command("dev")
|
||||||
|
@ -62,7 +81,7 @@ packwizCommand.command("export")
|
||||||
name = ${JSON.stringify(mod.modFile.name)}
|
name = ${JSON.stringify(mod.modFile.name)}
|
||||||
filename = ${JSON.stringify(mod.modFile.file.name)}
|
filename = ${JSON.stringify(mod.modFile.file.name)}
|
||||||
side = "${mod.modFile.side.replace("client+server", "both")}"
|
side = "${mod.modFile.side.replace("client+server", "both")}"
|
||||||
|
|
||||||
[download]
|
[download]
|
||||||
hash-format = "sha512"
|
hash-format = "sha512"
|
||||||
hash = ${JSON.stringify(mod.modFile.file.hashes.sha512)}
|
hash = ${JSON.stringify(mod.modFile.file.hashes.sha512)}
|
||||||
|
@ -92,8 +111,6 @@ packwizCommand.command("export")
|
||||||
if (dirent.isFile()) {
|
if (dirent.isFile()) {
|
||||||
const outputPath = outputDirectoryPath.resolve(relativePath)
|
const outputPath = outputDirectoryPath.resolve(relativePath)
|
||||||
await fs.mkdirp(outputPath.getParent().toString())
|
await fs.mkdirp(outputPath.getParent().toString())
|
||||||
console.log(path)
|
|
||||||
console.log(outputPath.toString())
|
|
||||||
await fs.copy(path, outputPath.toString())
|
await fs.copy(path, outputPath.toString())
|
||||||
|
|
||||||
indexedFiles.push({
|
indexedFiles.push({
|
||||||
|
@ -115,7 +132,7 @@ packwizCommand.command("export")
|
||||||
|
|
||||||
const index = dedent`
|
const index = dedent`
|
||||||
hash-format = "sha512"
|
hash-format = "sha512"
|
||||||
|
|
||||||
${indexedFiles.map(file => dedent`
|
${indexedFiles.map(file => dedent`
|
||||||
[[files]]
|
[[files]]
|
||||||
file = ${JSON.stringify(file.path)}
|
file = ${JSON.stringify(file.path)}
|
||||||
|
|
31
src/utils.ts
31
src/utils.ts
|
@ -5,6 +5,37 @@ import { ZipFile } from "yazl"
|
||||||
import { walk } from "@root/walk"
|
import { walk } from "@root/walk"
|
||||||
import fs from "fs-extra"
|
import fs from "fs-extra"
|
||||||
import { pEvent } from "p-event"
|
import { pEvent } from "p-event"
|
||||||
|
import serveHandler from "serve-handler"
|
||||||
|
import * as http from "http"
|
||||||
|
import addressWithCallback from "address"
|
||||||
|
import { promisify } from "util"
|
||||||
|
|
||||||
|
const address = promisify(addressWithCallback)
|
||||||
|
|
||||||
|
export const getLANAddress = () => address().then(r => r.ip)
|
||||||
|
|
||||||
|
export function httpServeDirectory(path: Path, port: number, expose: boolean, onListen: () => void) {
|
||||||
|
const server = http.createServer((request, response) => {
|
||||||
|
return serveHandler(request, response, {
|
||||||
|
directoryListing: false,
|
||||||
|
public: path.toString(),
|
||||||
|
cleanUrls: false,
|
||||||
|
headers: [
|
||||||
|
{
|
||||||
|
source: "**/*.toml",
|
||||||
|
headers: [{
|
||||||
|
key: "Content-Type",
|
||||||
|
value: "application/toml"
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
server.listen(port, expose ? "0.0.0.0" : "127.0.0.1", () => {
|
||||||
|
onListen()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export async function zipDirectory(directoryPath: Path, outputFilePath: Path) {
|
export async function zipDirectory(directoryPath: Path, outputFilePath: Path) {
|
||||||
const zipFile = new ZipFile()
|
const zipFile = new ZipFile()
|
||||||
|
|
Loading…
Add table
Reference in a new issue