@v5x/cli 0.0.6 → 0.0.7
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/index.js +14 -863
- package/package.json +4 -3
package/dist/index.js
CHANGED
|
@@ -44,6 +44,7 @@ var __export = (target, all) => {
|
|
|
44
44
|
set: __exportSetter.bind(all, name)
|
|
45
45
|
});
|
|
46
46
|
};
|
|
47
|
+
var __require = import.meta.require;
|
|
47
48
|
|
|
48
49
|
// ../../node_modules/.bun/picocolors@1.1.1/node_modules/picocolors/picocolors.js
|
|
49
50
|
var require_picocolors = __commonJS((exports, module) => {
|
|
@@ -117,7 +118,7 @@ var require_picocolors = __commonJS((exports, module) => {
|
|
|
117
118
|
// package.json
|
|
118
119
|
var package_default = {
|
|
119
120
|
name: "@v5x/cli",
|
|
120
|
-
version: "0.0.
|
|
121
|
+
version: "0.0.7",
|
|
121
122
|
description: "Command line interface for v5x.",
|
|
122
123
|
license: "MIT",
|
|
123
124
|
type: "module",
|
|
@@ -141,7 +142,7 @@ var package_default = {
|
|
|
141
142
|
access: "public"
|
|
142
143
|
},
|
|
143
144
|
scripts: {
|
|
144
|
-
build: "bun build ./src/index.ts --target bun --outfile ./dist/index.js && chmod +x ./dist/index.js",
|
|
145
|
+
build: "bun build ./src/index.ts --target bun --external unzipit --outfile ./dist/index.js && chmod +x ./dist/index.js",
|
|
145
146
|
dev: "bun run ./src/index.ts",
|
|
146
147
|
lint: "bunx tsc --noEmit",
|
|
147
148
|
prepublishOnly: "bun run typecheck && bun run build",
|
|
@@ -155,7 +156,8 @@ var package_default = {
|
|
|
155
156
|
},
|
|
156
157
|
dependencies: {
|
|
157
158
|
"bun-serialport": "^0.1.1",
|
|
158
|
-
picocolors: "^1.1.1"
|
|
159
|
+
picocolors: "^1.1.1",
|
|
160
|
+
unzipit: "^1.4.0"
|
|
159
161
|
}
|
|
160
162
|
};
|
|
161
163
|
|
|
@@ -2957,858 +2959,6 @@ function binaryArrayJoin(left, right) {
|
|
|
2957
2959
|
const all = new Uint8Array(leftSize + rightSize);
|
|
2958
2960
|
return all.length === 0 ? new Uint8Array : (left != null && all.set(new Uint8Array(left), 0), right != null && all.set(new Uint8Array(right), leftSize), all);
|
|
2959
2961
|
}
|
|
2960
|
-
// ../../node_modules/.bun/unzipit@1.4.3/node_modules/unzipit/dist/unzipit.module.js
|
|
2961
|
-
function readBlobAsArrayBuffer(blob) {
|
|
2962
|
-
if (blob.arrayBuffer) {
|
|
2963
|
-
return blob.arrayBuffer();
|
|
2964
|
-
}
|
|
2965
|
-
return new Promise((resolve, reject) => {
|
|
2966
|
-
const reader = new FileReader;
|
|
2967
|
-
reader.addEventListener("loadend", () => {
|
|
2968
|
-
resolve(reader.result);
|
|
2969
|
-
});
|
|
2970
|
-
reader.addEventListener("error", reject);
|
|
2971
|
-
reader.readAsArrayBuffer(blob);
|
|
2972
|
-
});
|
|
2973
|
-
}
|
|
2974
|
-
async function readBlobAsUint8Array(blob) {
|
|
2975
|
-
const arrayBuffer = await readBlobAsArrayBuffer(blob);
|
|
2976
|
-
return new Uint8Array(arrayBuffer);
|
|
2977
|
-
}
|
|
2978
|
-
function isBlob(v) {
|
|
2979
|
-
return typeof Blob !== "undefined" && v instanceof Blob;
|
|
2980
|
-
}
|
|
2981
|
-
function isSharedArrayBuffer(b) {
|
|
2982
|
-
return typeof SharedArrayBuffer !== "undefined" && b instanceof SharedArrayBuffer;
|
|
2983
|
-
}
|
|
2984
|
-
var isNode = typeof process !== "undefined" && process.versions && typeof process.versions.node !== "undefined" && typeof process.versions.electron === "undefined";
|
|
2985
|
-
function isTypedArraySameAsArrayBuffer(typedArray) {
|
|
2986
|
-
return typedArray.byteOffset === 0 && typedArray.byteLength === typedArray.buffer.byteLength;
|
|
2987
|
-
}
|
|
2988
|
-
|
|
2989
|
-
class ArrayBufferReader {
|
|
2990
|
-
constructor(arrayBufferOrView) {
|
|
2991
|
-
this.typedArray = arrayBufferOrView instanceof ArrayBuffer || isSharedArrayBuffer(arrayBufferOrView) ? new Uint8Array(arrayBufferOrView) : new Uint8Array(arrayBufferOrView.buffer, arrayBufferOrView.byteOffset, arrayBufferOrView.byteLength);
|
|
2992
|
-
}
|
|
2993
|
-
async getLength() {
|
|
2994
|
-
return this.typedArray.byteLength;
|
|
2995
|
-
}
|
|
2996
|
-
async read(offset, length) {
|
|
2997
|
-
return new Uint8Array(this.typedArray.buffer, this.typedArray.byteOffset + offset, length);
|
|
2998
|
-
}
|
|
2999
|
-
}
|
|
3000
|
-
|
|
3001
|
-
class BlobReader {
|
|
3002
|
-
constructor(blob) {
|
|
3003
|
-
this.blob = blob;
|
|
3004
|
-
}
|
|
3005
|
-
async getLength() {
|
|
3006
|
-
return this.blob.size;
|
|
3007
|
-
}
|
|
3008
|
-
async read(offset, length) {
|
|
3009
|
-
const blob = this.blob.slice(offset, offset + length);
|
|
3010
|
-
const arrayBuffer = await readBlobAsArrayBuffer(blob);
|
|
3011
|
-
return new Uint8Array(arrayBuffer);
|
|
3012
|
-
}
|
|
3013
|
-
async sliceAsBlob(offset, length, type = "") {
|
|
3014
|
-
return this.blob.slice(offset, offset + length, type);
|
|
3015
|
-
}
|
|
3016
|
-
}
|
|
3017
|
-
function inflate(data, buf) {
|
|
3018
|
-
var u8 = Uint8Array;
|
|
3019
|
-
if (data[0] == 3 && data[1] == 0)
|
|
3020
|
-
return buf ? buf : new u8(0);
|
|
3021
|
-
var bitsF = _bitsF, bitsE = _bitsE, decodeTiny = _decodeTiny, get17 = _get17;
|
|
3022
|
-
var noBuf = buf == null;
|
|
3023
|
-
if (noBuf)
|
|
3024
|
-
buf = new u8(data.length >>> 2 << 3);
|
|
3025
|
-
var BFINAL = 0, BTYPE = 0, HLIT = 0, HDIST = 0, HCLEN = 0, ML = 0, MD = 0;
|
|
3026
|
-
var off = 0, pos = 0;
|
|
3027
|
-
var lmap, dmap;
|
|
3028
|
-
while (BFINAL == 0) {
|
|
3029
|
-
BFINAL = bitsF(data, pos, 1);
|
|
3030
|
-
BTYPE = bitsF(data, pos + 1, 2);
|
|
3031
|
-
pos += 3;
|
|
3032
|
-
if (BTYPE == 0) {
|
|
3033
|
-
if ((pos & 7) != 0)
|
|
3034
|
-
pos += 8 - (pos & 7);
|
|
3035
|
-
var p8 = (pos >>> 3) + 4, len = data[p8 - 4] | data[p8 - 3] << 8;
|
|
3036
|
-
if (noBuf)
|
|
3037
|
-
buf = _check(buf, off + len);
|
|
3038
|
-
buf.set(new u8(data.buffer, data.byteOffset + p8, len), off);
|
|
3039
|
-
pos = p8 + len << 3;
|
|
3040
|
-
off += len;
|
|
3041
|
-
continue;
|
|
3042
|
-
}
|
|
3043
|
-
if (noBuf)
|
|
3044
|
-
buf = _check(buf, off + (1 << 17));
|
|
3045
|
-
if (BTYPE == 1) {
|
|
3046
|
-
lmap = U.flmap;
|
|
3047
|
-
dmap = U.fdmap;
|
|
3048
|
-
ML = (1 << 9) - 1;
|
|
3049
|
-
MD = (1 << 5) - 1;
|
|
3050
|
-
}
|
|
3051
|
-
if (BTYPE == 2) {
|
|
3052
|
-
HLIT = bitsE(data, pos, 5) + 257;
|
|
3053
|
-
HDIST = bitsE(data, pos + 5, 5) + 1;
|
|
3054
|
-
HCLEN = bitsE(data, pos + 10, 4) + 4;
|
|
3055
|
-
pos += 14;
|
|
3056
|
-
for (var i = 0;i < 38; i += 2) {
|
|
3057
|
-
U.itree[i] = 0;
|
|
3058
|
-
U.itree[i + 1] = 0;
|
|
3059
|
-
}
|
|
3060
|
-
var tl = 1;
|
|
3061
|
-
for (var i = 0;i < HCLEN; i++) {
|
|
3062
|
-
var l = bitsE(data, pos + i * 3, 3);
|
|
3063
|
-
U.itree[(U.ordr[i] << 1) + 1] = l;
|
|
3064
|
-
if (l > tl)
|
|
3065
|
-
tl = l;
|
|
3066
|
-
}
|
|
3067
|
-
pos += 3 * HCLEN;
|
|
3068
|
-
makeCodes(U.itree, tl);
|
|
3069
|
-
codes2map(U.itree, tl, U.imap);
|
|
3070
|
-
lmap = U.lmap;
|
|
3071
|
-
dmap = U.dmap;
|
|
3072
|
-
pos = decodeTiny(U.imap, (1 << tl) - 1, HLIT + HDIST, data, pos, U.ttree);
|
|
3073
|
-
var mx0 = _copyOut(U.ttree, 0, HLIT, U.ltree);
|
|
3074
|
-
ML = (1 << mx0) - 1;
|
|
3075
|
-
var mx1 = _copyOut(U.ttree, HLIT, HDIST, U.dtree);
|
|
3076
|
-
MD = (1 << mx1) - 1;
|
|
3077
|
-
makeCodes(U.ltree, mx0);
|
|
3078
|
-
codes2map(U.ltree, mx0, lmap);
|
|
3079
|
-
makeCodes(U.dtree, mx1);
|
|
3080
|
-
codes2map(U.dtree, mx1, dmap);
|
|
3081
|
-
}
|
|
3082
|
-
while (true) {
|
|
3083
|
-
var code = lmap[get17(data, pos) & ML];
|
|
3084
|
-
pos += code & 15;
|
|
3085
|
-
var lit = code >>> 4;
|
|
3086
|
-
if (lit >>> 8 == 0) {
|
|
3087
|
-
buf[off++] = lit;
|
|
3088
|
-
} else if (lit == 256) {
|
|
3089
|
-
break;
|
|
3090
|
-
} else {
|
|
3091
|
-
var end = off + lit - 254;
|
|
3092
|
-
if (lit > 264) {
|
|
3093
|
-
var ebs = U.ldef[lit - 257];
|
|
3094
|
-
end = off + (ebs >>> 3) + bitsE(data, pos, ebs & 7);
|
|
3095
|
-
pos += ebs & 7;
|
|
3096
|
-
}
|
|
3097
|
-
var dcode = dmap[get17(data, pos) & MD];
|
|
3098
|
-
pos += dcode & 15;
|
|
3099
|
-
var dlit = dcode >>> 4;
|
|
3100
|
-
var dbs = U.ddef[dlit], dst = (dbs >>> 4) + bitsF(data, pos, dbs & 15);
|
|
3101
|
-
pos += dbs & 15;
|
|
3102
|
-
if (noBuf)
|
|
3103
|
-
buf = _check(buf, off + (1 << 17));
|
|
3104
|
-
while (off < end) {
|
|
3105
|
-
buf[off] = buf[off++ - dst];
|
|
3106
|
-
buf[off] = buf[off++ - dst];
|
|
3107
|
-
buf[off] = buf[off++ - dst];
|
|
3108
|
-
buf[off] = buf[off++ - dst];
|
|
3109
|
-
}
|
|
3110
|
-
off = end;
|
|
3111
|
-
}
|
|
3112
|
-
}
|
|
3113
|
-
}
|
|
3114
|
-
return buf.length == off ? buf : buf.slice(0, off);
|
|
3115
|
-
}
|
|
3116
|
-
function _check(buf, len) {
|
|
3117
|
-
var bl = buf.length;
|
|
3118
|
-
if (len <= bl)
|
|
3119
|
-
return buf;
|
|
3120
|
-
var nbuf = new Uint8Array(Math.max(bl << 1, len));
|
|
3121
|
-
nbuf.set(buf, 0);
|
|
3122
|
-
return nbuf;
|
|
3123
|
-
}
|
|
3124
|
-
function _decodeTiny(lmap, LL, len, data, pos, tree) {
|
|
3125
|
-
var bitsE = _bitsE, get17 = _get17;
|
|
3126
|
-
var i = 0;
|
|
3127
|
-
while (i < len) {
|
|
3128
|
-
var code = lmap[get17(data, pos) & LL];
|
|
3129
|
-
pos += code & 15;
|
|
3130
|
-
var lit = code >>> 4;
|
|
3131
|
-
if (lit <= 15) {
|
|
3132
|
-
tree[i] = lit;
|
|
3133
|
-
i++;
|
|
3134
|
-
} else {
|
|
3135
|
-
var ll = 0, n = 0;
|
|
3136
|
-
if (lit == 16) {
|
|
3137
|
-
n = 3 + bitsE(data, pos, 2);
|
|
3138
|
-
pos += 2;
|
|
3139
|
-
ll = tree[i - 1];
|
|
3140
|
-
} else if (lit == 17) {
|
|
3141
|
-
n = 3 + bitsE(data, pos, 3);
|
|
3142
|
-
pos += 3;
|
|
3143
|
-
} else if (lit == 18) {
|
|
3144
|
-
n = 11 + bitsE(data, pos, 7);
|
|
3145
|
-
pos += 7;
|
|
3146
|
-
}
|
|
3147
|
-
var ni = i + n;
|
|
3148
|
-
while (i < ni) {
|
|
3149
|
-
tree[i] = ll;
|
|
3150
|
-
i++;
|
|
3151
|
-
}
|
|
3152
|
-
}
|
|
3153
|
-
}
|
|
3154
|
-
return pos;
|
|
3155
|
-
}
|
|
3156
|
-
function _copyOut(src, off, len, tree) {
|
|
3157
|
-
var mx = 0, i = 0, tl = tree.length >>> 1;
|
|
3158
|
-
while (i < len) {
|
|
3159
|
-
var v = src[i + off];
|
|
3160
|
-
tree[i << 1] = 0;
|
|
3161
|
-
tree[(i << 1) + 1] = v;
|
|
3162
|
-
if (v > mx)
|
|
3163
|
-
mx = v;
|
|
3164
|
-
i++;
|
|
3165
|
-
}
|
|
3166
|
-
while (i < tl) {
|
|
3167
|
-
tree[i << 1] = 0;
|
|
3168
|
-
tree[(i << 1) + 1] = 0;
|
|
3169
|
-
i++;
|
|
3170
|
-
}
|
|
3171
|
-
return mx;
|
|
3172
|
-
}
|
|
3173
|
-
function makeCodes(tree, MAX_BITS) {
|
|
3174
|
-
var max_code = tree.length;
|
|
3175
|
-
var code, bits, n, i, len;
|
|
3176
|
-
var bl_count = U.bl_count;
|
|
3177
|
-
for (var i = 0;i <= MAX_BITS; i++)
|
|
3178
|
-
bl_count[i] = 0;
|
|
3179
|
-
for (i = 1;i < max_code; i += 2)
|
|
3180
|
-
bl_count[tree[i]]++;
|
|
3181
|
-
var next_code = U.next_code;
|
|
3182
|
-
code = 0;
|
|
3183
|
-
bl_count[0] = 0;
|
|
3184
|
-
for (bits = 1;bits <= MAX_BITS; bits++) {
|
|
3185
|
-
code = code + bl_count[bits - 1] << 1;
|
|
3186
|
-
next_code[bits] = code;
|
|
3187
|
-
}
|
|
3188
|
-
for (n = 0;n < max_code; n += 2) {
|
|
3189
|
-
len = tree[n + 1];
|
|
3190
|
-
if (len != 0) {
|
|
3191
|
-
tree[n] = next_code[len];
|
|
3192
|
-
next_code[len]++;
|
|
3193
|
-
}
|
|
3194
|
-
}
|
|
3195
|
-
}
|
|
3196
|
-
function codes2map(tree, MAX_BITS, map) {
|
|
3197
|
-
var max_code = tree.length;
|
|
3198
|
-
var r15 = U.rev15;
|
|
3199
|
-
for (var i = 0;i < max_code; i += 2)
|
|
3200
|
-
if (tree[i + 1] != 0) {
|
|
3201
|
-
var lit = i >> 1;
|
|
3202
|
-
var cl = tree[i + 1], val = lit << 4 | cl;
|
|
3203
|
-
var rest = MAX_BITS - cl, i0 = tree[i] << rest, i1 = i0 + (1 << rest);
|
|
3204
|
-
while (i0 != i1) {
|
|
3205
|
-
var p0 = r15[i0] >>> 15 - MAX_BITS;
|
|
3206
|
-
map[p0] = val;
|
|
3207
|
-
i0++;
|
|
3208
|
-
}
|
|
3209
|
-
}
|
|
3210
|
-
}
|
|
3211
|
-
function revCodes(tree, MAX_BITS) {
|
|
3212
|
-
var r15 = U.rev15, imb = 15 - MAX_BITS;
|
|
3213
|
-
for (var i = 0;i < tree.length; i += 2) {
|
|
3214
|
-
var i0 = tree[i] << MAX_BITS - tree[i + 1];
|
|
3215
|
-
tree[i] = r15[i0] >>> imb;
|
|
3216
|
-
}
|
|
3217
|
-
}
|
|
3218
|
-
function _bitsE(dt, pos, length) {
|
|
3219
|
-
return (dt[pos >>> 3] | dt[(pos >>> 3) + 1] << 8) >>> (pos & 7) & (1 << length) - 1;
|
|
3220
|
-
}
|
|
3221
|
-
function _bitsF(dt, pos, length) {
|
|
3222
|
-
return (dt[pos >>> 3] | dt[(pos >>> 3) + 1] << 8 | dt[(pos >>> 3) + 2] << 16) >>> (pos & 7) & (1 << length) - 1;
|
|
3223
|
-
}
|
|
3224
|
-
function _get17(dt, pos) {
|
|
3225
|
-
return (dt[pos >>> 3] | dt[(pos >>> 3) + 1] << 8 | dt[(pos >>> 3) + 2] << 16) >>> (pos & 7);
|
|
3226
|
-
}
|
|
3227
|
-
var U = function() {
|
|
3228
|
-
var u16 = Uint16Array, u32 = Uint32Array;
|
|
3229
|
-
return {
|
|
3230
|
-
next_code: new u16(16),
|
|
3231
|
-
bl_count: new u16(16),
|
|
3232
|
-
ordr: [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15],
|
|
3233
|
-
of0: [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 999, 999, 999],
|
|
3234
|
-
exb: [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0, 0],
|
|
3235
|
-
ldef: new u16(32),
|
|
3236
|
-
df0: [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 65535, 65535],
|
|
3237
|
-
dxb: [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 0, 0],
|
|
3238
|
-
ddef: new u32(32),
|
|
3239
|
-
flmap: new u16(512),
|
|
3240
|
-
fltree: [],
|
|
3241
|
-
fdmap: new u16(32),
|
|
3242
|
-
fdtree: [],
|
|
3243
|
-
lmap: new u16(32768),
|
|
3244
|
-
ltree: [],
|
|
3245
|
-
ttree: [],
|
|
3246
|
-
dmap: new u16(32768),
|
|
3247
|
-
dtree: [],
|
|
3248
|
-
imap: new u16(512),
|
|
3249
|
-
itree: [],
|
|
3250
|
-
rev15: new u16(1 << 15),
|
|
3251
|
-
lhst: new u32(286),
|
|
3252
|
-
dhst: new u32(30),
|
|
3253
|
-
ihst: new u32(19),
|
|
3254
|
-
lits: new u32(15000),
|
|
3255
|
-
strt: new u16(1 << 16),
|
|
3256
|
-
prev: new u16(1 << 15)
|
|
3257
|
-
};
|
|
3258
|
-
}();
|
|
3259
|
-
(function() {
|
|
3260
|
-
var len = 1 << 15;
|
|
3261
|
-
for (var i = 0;i < len; i++) {
|
|
3262
|
-
var x = i;
|
|
3263
|
-
x = (x & 2863311530) >>> 1 | (x & 1431655765) << 1;
|
|
3264
|
-
x = (x & 3435973836) >>> 2 | (x & 858993459) << 2;
|
|
3265
|
-
x = (x & 4042322160) >>> 4 | (x & 252645135) << 4;
|
|
3266
|
-
x = (x & 4278255360) >>> 8 | (x & 16711935) << 8;
|
|
3267
|
-
U.rev15[i] = (x >>> 16 | x << 16) >>> 17;
|
|
3268
|
-
}
|
|
3269
|
-
function pushV(tgt, n, sv) {
|
|
3270
|
-
while (n-- != 0)
|
|
3271
|
-
tgt.push(0, sv);
|
|
3272
|
-
}
|
|
3273
|
-
for (var i = 0;i < 32; i++) {
|
|
3274
|
-
U.ldef[i] = U.of0[i] << 3 | U.exb[i];
|
|
3275
|
-
U.ddef[i] = U.df0[i] << 4 | U.dxb[i];
|
|
3276
|
-
}
|
|
3277
|
-
pushV(U.fltree, 144, 8);
|
|
3278
|
-
pushV(U.fltree, 255 - 143, 9);
|
|
3279
|
-
pushV(U.fltree, 279 - 255, 7);
|
|
3280
|
-
pushV(U.fltree, 287 - 279, 8);
|
|
3281
|
-
makeCodes(U.fltree, 9);
|
|
3282
|
-
codes2map(U.fltree, 9, U.flmap);
|
|
3283
|
-
revCodes(U.fltree, 9);
|
|
3284
|
-
pushV(U.fdtree, 32, 5);
|
|
3285
|
-
makeCodes(U.fdtree, 5);
|
|
3286
|
-
codes2map(U.fdtree, 5, U.fdmap);
|
|
3287
|
-
revCodes(U.fdtree, 5);
|
|
3288
|
-
pushV(U.itree, 19, 0);
|
|
3289
|
-
pushV(U.ltree, 286, 0);
|
|
3290
|
-
pushV(U.dtree, 30, 0);
|
|
3291
|
-
pushV(U.ttree, 320, 0);
|
|
3292
|
-
})();
|
|
3293
|
-
var crc = {
|
|
3294
|
-
table: function() {
|
|
3295
|
-
var tab = new Uint32Array(256);
|
|
3296
|
-
for (var n = 0;n < 256; n++) {
|
|
3297
|
-
var c = n;
|
|
3298
|
-
for (var k = 0;k < 8; k++) {
|
|
3299
|
-
if (c & 1)
|
|
3300
|
-
c = 3988292384 ^ c >>> 1;
|
|
3301
|
-
else
|
|
3302
|
-
c = c >>> 1;
|
|
3303
|
-
}
|
|
3304
|
-
tab[n] = c;
|
|
3305
|
-
}
|
|
3306
|
-
return tab;
|
|
3307
|
-
}(),
|
|
3308
|
-
update: function(c, buf, off, len) {
|
|
3309
|
-
for (var i = 0;i < len; i++)
|
|
3310
|
-
c = crc.table[(c ^ buf[off + i]) & 255] ^ c >>> 8;
|
|
3311
|
-
return c;
|
|
3312
|
-
},
|
|
3313
|
-
crc: function(b, o, l) {
|
|
3314
|
-
return crc.update(4294967295, b, o, l) ^ 4294967295;
|
|
3315
|
-
}
|
|
3316
|
-
};
|
|
3317
|
-
function inflateRaw(file, buf) {
|
|
3318
|
-
return inflate(file, buf);
|
|
3319
|
-
}
|
|
3320
|
-
var config = {
|
|
3321
|
-
numWorkers: 1,
|
|
3322
|
-
workerURL: "",
|
|
3323
|
-
useWorkers: false
|
|
3324
|
-
};
|
|
3325
|
-
var nextId = 0;
|
|
3326
|
-
var numWorkers = 0;
|
|
3327
|
-
var canUseWorkers = true;
|
|
3328
|
-
var workers = [];
|
|
3329
|
-
var availableWorkers = [];
|
|
3330
|
-
var waitingForWorkerQueue = [];
|
|
3331
|
-
var currentlyProcessingIdToRequestMap = new Map;
|
|
3332
|
-
function handleResult(e) {
|
|
3333
|
-
makeWorkerAvailable(e.target);
|
|
3334
|
-
const { id, error, data } = e.data;
|
|
3335
|
-
const request = currentlyProcessingIdToRequestMap.get(id);
|
|
3336
|
-
currentlyProcessingIdToRequestMap.delete(id);
|
|
3337
|
-
if (error) {
|
|
3338
|
-
request.reject(error);
|
|
3339
|
-
} else {
|
|
3340
|
-
request.resolve(data);
|
|
3341
|
-
}
|
|
3342
|
-
}
|
|
3343
|
-
function startWorker(url) {
|
|
3344
|
-
return new Promise((resolve, reject) => {
|
|
3345
|
-
const worker = new Worker(url);
|
|
3346
|
-
worker.onmessage = (e) => {
|
|
3347
|
-
if (e.data === "start") {
|
|
3348
|
-
worker.onerror = undefined;
|
|
3349
|
-
worker.onmessage = undefined;
|
|
3350
|
-
resolve(worker);
|
|
3351
|
-
} else {
|
|
3352
|
-
reject(new Error(`unexpected message: ${e.data}`));
|
|
3353
|
-
}
|
|
3354
|
-
};
|
|
3355
|
-
worker.onerror = reject;
|
|
3356
|
-
});
|
|
3357
|
-
}
|
|
3358
|
-
function dynamicRequire(mod, request) {
|
|
3359
|
-
return mod.require ? mod.require(request) : {};
|
|
3360
|
-
}
|
|
3361
|
-
var workerHelper = function() {
|
|
3362
|
-
if (isNode) {
|
|
3363
|
-
const { Worker: Worker2 } = dynamicRequire(module_unzipit_module, "worker_threads");
|
|
3364
|
-
return {
|
|
3365
|
-
async createWorker(url) {
|
|
3366
|
-
return new Worker2(url);
|
|
3367
|
-
},
|
|
3368
|
-
addEventListener(worker, fn) {
|
|
3369
|
-
worker.on("message", (data) => {
|
|
3370
|
-
fn({ target: worker, data });
|
|
3371
|
-
});
|
|
3372
|
-
},
|
|
3373
|
-
async terminate(worker) {
|
|
3374
|
-
await worker.terminate();
|
|
3375
|
-
}
|
|
3376
|
-
};
|
|
3377
|
-
} else {
|
|
3378
|
-
return {
|
|
3379
|
-
async createWorker(url) {
|
|
3380
|
-
try {
|
|
3381
|
-
const worker = await startWorker(url);
|
|
3382
|
-
return worker;
|
|
3383
|
-
} catch (e) {
|
|
3384
|
-
console.warn("could not load worker:", url);
|
|
3385
|
-
}
|
|
3386
|
-
let text;
|
|
3387
|
-
try {
|
|
3388
|
-
const req = await fetch(url, { mode: "cors" });
|
|
3389
|
-
if (!req.ok) {
|
|
3390
|
-
throw new Error(`could not load: ${url}`);
|
|
3391
|
-
}
|
|
3392
|
-
text = await req.text();
|
|
3393
|
-
url = URL.createObjectURL(new Blob([text], { type: "application/javascript" }));
|
|
3394
|
-
const worker = await startWorker(url);
|
|
3395
|
-
config.workerURL = url;
|
|
3396
|
-
return worker;
|
|
3397
|
-
} catch (e) {
|
|
3398
|
-
console.warn("could not load worker via fetch:", url);
|
|
3399
|
-
}
|
|
3400
|
-
if (text !== undefined) {
|
|
3401
|
-
try {
|
|
3402
|
-
url = `data:application/javascript;base64,${btoa(text)}`;
|
|
3403
|
-
const worker = await startWorker(url);
|
|
3404
|
-
config.workerURL = url;
|
|
3405
|
-
return worker;
|
|
3406
|
-
} catch (e) {
|
|
3407
|
-
console.warn("could not load worker via dataURI");
|
|
3408
|
-
}
|
|
3409
|
-
}
|
|
3410
|
-
console.warn("workers will not be used");
|
|
3411
|
-
throw new Error("can not start workers");
|
|
3412
|
-
},
|
|
3413
|
-
addEventListener(worker, fn) {
|
|
3414
|
-
worker.addEventListener("message", fn);
|
|
3415
|
-
},
|
|
3416
|
-
async terminate(worker) {
|
|
3417
|
-
worker.terminate();
|
|
3418
|
-
}
|
|
3419
|
-
};
|
|
3420
|
-
}
|
|
3421
|
-
}();
|
|
3422
|
-
function makeWorkerAvailable(worker) {
|
|
3423
|
-
availableWorkers.push(worker);
|
|
3424
|
-
processWaitingForWorkerQueue();
|
|
3425
|
-
}
|
|
3426
|
-
async function getAvailableWorker() {
|
|
3427
|
-
if (availableWorkers.length === 0 && numWorkers < config.numWorkers) {
|
|
3428
|
-
++numWorkers;
|
|
3429
|
-
try {
|
|
3430
|
-
const worker = await workerHelper.createWorker(config.workerURL);
|
|
3431
|
-
workers.push(worker);
|
|
3432
|
-
availableWorkers.push(worker);
|
|
3433
|
-
workerHelper.addEventListener(worker, handleResult);
|
|
3434
|
-
} catch (e) {
|
|
3435
|
-
canUseWorkers = false;
|
|
3436
|
-
}
|
|
3437
|
-
}
|
|
3438
|
-
return availableWorkers.pop();
|
|
3439
|
-
}
|
|
3440
|
-
function inflateRawLocal(src, uncompressedSize, type, resolve) {
|
|
3441
|
-
const dst = new Uint8Array(uncompressedSize);
|
|
3442
|
-
inflateRaw(src, dst);
|
|
3443
|
-
resolve(type ? new Blob([dst], { type }) : dst.buffer);
|
|
3444
|
-
}
|
|
3445
|
-
async function processWaitingForWorkerQueue() {
|
|
3446
|
-
if (waitingForWorkerQueue.length === 0) {
|
|
3447
|
-
return;
|
|
3448
|
-
}
|
|
3449
|
-
if (config.useWorkers && canUseWorkers) {
|
|
3450
|
-
const worker = await getAvailableWorker();
|
|
3451
|
-
if (canUseWorkers) {
|
|
3452
|
-
if (worker) {
|
|
3453
|
-
if (waitingForWorkerQueue.length === 0) {
|
|
3454
|
-
makeWorkerAvailable(worker);
|
|
3455
|
-
return;
|
|
3456
|
-
}
|
|
3457
|
-
const { id, src, uncompressedSize, type, resolve, reject } = waitingForWorkerQueue.shift();
|
|
3458
|
-
currentlyProcessingIdToRequestMap.set(id, { id, resolve, reject });
|
|
3459
|
-
const transferables = [];
|
|
3460
|
-
worker.postMessage({
|
|
3461
|
-
type: "inflate",
|
|
3462
|
-
data: {
|
|
3463
|
-
id,
|
|
3464
|
-
type,
|
|
3465
|
-
src,
|
|
3466
|
-
uncompressedSize
|
|
3467
|
-
}
|
|
3468
|
-
}, transferables);
|
|
3469
|
-
}
|
|
3470
|
-
return;
|
|
3471
|
-
}
|
|
3472
|
-
}
|
|
3473
|
-
while (waitingForWorkerQueue.length) {
|
|
3474
|
-
const { src, uncompressedSize, type, resolve } = waitingForWorkerQueue.shift();
|
|
3475
|
-
let data = src;
|
|
3476
|
-
if (isBlob(src)) {
|
|
3477
|
-
data = await readBlobAsUint8Array(src);
|
|
3478
|
-
}
|
|
3479
|
-
inflateRawLocal(data, uncompressedSize, type, resolve);
|
|
3480
|
-
}
|
|
3481
|
-
}
|
|
3482
|
-
function inflateRawAsync(src, uncompressedSize, type) {
|
|
3483
|
-
return new Promise((resolve, reject) => {
|
|
3484
|
-
waitingForWorkerQueue.push({ src, uncompressedSize, type, resolve, reject, id: nextId++ });
|
|
3485
|
-
processWaitingForWorkerQueue();
|
|
3486
|
-
});
|
|
3487
|
-
}
|
|
3488
|
-
function dosDateTimeToDate(date, time) {
|
|
3489
|
-
const day = date & 31;
|
|
3490
|
-
const month = (date >> 5 & 15) - 1;
|
|
3491
|
-
const year = (date >> 9 & 127) + 1980;
|
|
3492
|
-
const millisecond = 0;
|
|
3493
|
-
const second = (time & 31) * 2;
|
|
3494
|
-
const minute = time >> 5 & 63;
|
|
3495
|
-
const hour = time >> 11 & 31;
|
|
3496
|
-
return new Date(year, month, day, hour, minute, second, millisecond);
|
|
3497
|
-
}
|
|
3498
|
-
|
|
3499
|
-
class ZipEntry {
|
|
3500
|
-
constructor(reader, rawEntry) {
|
|
3501
|
-
this._reader = reader;
|
|
3502
|
-
this._rawEntry = rawEntry;
|
|
3503
|
-
this.name = rawEntry.name;
|
|
3504
|
-
this.nameBytes = rawEntry.nameBytes;
|
|
3505
|
-
this.size = rawEntry.uncompressedSize;
|
|
3506
|
-
this.compressedSize = rawEntry.compressedSize;
|
|
3507
|
-
this.comment = rawEntry.comment;
|
|
3508
|
-
this.commentBytes = rawEntry.commentBytes;
|
|
3509
|
-
this.compressionMethod = rawEntry.compressionMethod;
|
|
3510
|
-
this.lastModDate = dosDateTimeToDate(rawEntry.lastModFileDate, rawEntry.lastModFileTime);
|
|
3511
|
-
this.isDirectory = rawEntry.uncompressedSize === 0 && rawEntry.name.endsWith("/");
|
|
3512
|
-
this.encrypted = !!(rawEntry.generalPurposeBitFlag & 1);
|
|
3513
|
-
this.externalFileAttributes = rawEntry.externalFileAttributes;
|
|
3514
|
-
this.versionMadeBy = rawEntry.versionMadeBy;
|
|
3515
|
-
}
|
|
3516
|
-
async blob(type = "application/octet-stream") {
|
|
3517
|
-
return await readEntryDataAsBlob(this._reader, this._rawEntry, type);
|
|
3518
|
-
}
|
|
3519
|
-
async arrayBuffer() {
|
|
3520
|
-
return await readEntryDataAsArrayBuffer(this._reader, this._rawEntry);
|
|
3521
|
-
}
|
|
3522
|
-
async text() {
|
|
3523
|
-
const buffer = await this.arrayBuffer();
|
|
3524
|
-
return decodeBuffer(new Uint8Array(buffer));
|
|
3525
|
-
}
|
|
3526
|
-
async json() {
|
|
3527
|
-
const text = await this.text();
|
|
3528
|
-
return JSON.parse(text);
|
|
3529
|
-
}
|
|
3530
|
-
}
|
|
3531
|
-
var EOCDR_WITHOUT_COMMENT_SIZE = 22;
|
|
3532
|
-
var MAX_COMMENT_SIZE = 65535;
|
|
3533
|
-
var EOCDR_SIGNATURE = 101010256;
|
|
3534
|
-
var ZIP64_EOCDR_SIGNATURE = 101075792;
|
|
3535
|
-
async function readAs(reader, offset, length) {
|
|
3536
|
-
return await reader.read(offset, length);
|
|
3537
|
-
}
|
|
3538
|
-
async function readAsBlobOrTypedArray(reader, offset, length, type) {
|
|
3539
|
-
if (reader.sliceAsBlob) {
|
|
3540
|
-
return await reader.sliceAsBlob(offset, length, type);
|
|
3541
|
-
}
|
|
3542
|
-
return await reader.read(offset, length);
|
|
3543
|
-
}
|
|
3544
|
-
var crc$1 = {
|
|
3545
|
-
unsigned() {
|
|
3546
|
-
return 0;
|
|
3547
|
-
}
|
|
3548
|
-
};
|
|
3549
|
-
function getUint16LE(uint8View, offset) {
|
|
3550
|
-
return uint8View[offset] + uint8View[offset + 1] * 256;
|
|
3551
|
-
}
|
|
3552
|
-
function getUint32LE(uint8View, offset) {
|
|
3553
|
-
return uint8View[offset] + uint8View[offset + 1] * 256 + uint8View[offset + 2] * 65536 + uint8View[offset + 3] * 16777216;
|
|
3554
|
-
}
|
|
3555
|
-
function getUint64LE(uint8View, offset) {
|
|
3556
|
-
return getUint32LE(uint8View, offset) + getUint32LE(uint8View, offset + 4) * 4294967296;
|
|
3557
|
-
}
|
|
3558
|
-
var utf8Decoder = new TextDecoder;
|
|
3559
|
-
function decodeBuffer(uint8View, isUTF8) {
|
|
3560
|
-
if (isSharedArrayBuffer(uint8View.buffer)) {
|
|
3561
|
-
uint8View = new Uint8Array(uint8View);
|
|
3562
|
-
}
|
|
3563
|
-
return utf8Decoder.decode(uint8View);
|
|
3564
|
-
}
|
|
3565
|
-
async function findEndOfCentralDirector(reader, totalLength) {
|
|
3566
|
-
const size = Math.min(EOCDR_WITHOUT_COMMENT_SIZE + MAX_COMMENT_SIZE, totalLength);
|
|
3567
|
-
const readStart = totalLength - size;
|
|
3568
|
-
const data = await readAs(reader, readStart, size);
|
|
3569
|
-
for (let i = size - EOCDR_WITHOUT_COMMENT_SIZE;i >= 0; --i) {
|
|
3570
|
-
if (getUint32LE(data, i) !== EOCDR_SIGNATURE) {
|
|
3571
|
-
continue;
|
|
3572
|
-
}
|
|
3573
|
-
const eocdr = new Uint8Array(data.buffer, data.byteOffset + i, data.byteLength - i);
|
|
3574
|
-
const diskNumber = getUint16LE(eocdr, 4);
|
|
3575
|
-
if (diskNumber !== 0) {
|
|
3576
|
-
throw new Error(`multi-volume zip files are not supported. This is volume: ${diskNumber}`);
|
|
3577
|
-
}
|
|
3578
|
-
const entryCount = getUint16LE(eocdr, 10);
|
|
3579
|
-
const centralDirectorySize = getUint32LE(eocdr, 12);
|
|
3580
|
-
const centralDirectoryOffset = getUint32LE(eocdr, 16);
|
|
3581
|
-
const commentLength = getUint16LE(eocdr, 20);
|
|
3582
|
-
const expectedCommentLength = eocdr.length - EOCDR_WITHOUT_COMMENT_SIZE;
|
|
3583
|
-
if (commentLength !== expectedCommentLength) {
|
|
3584
|
-
throw new Error(`invalid comment length. expected: ${expectedCommentLength}, actual: ${commentLength}`);
|
|
3585
|
-
}
|
|
3586
|
-
const commentBytes = new Uint8Array(eocdr.buffer, eocdr.byteOffset + 22, commentLength);
|
|
3587
|
-
const comment = decodeBuffer(commentBytes);
|
|
3588
|
-
if (entryCount === 65535 || centralDirectoryOffset === 4294967295) {
|
|
3589
|
-
return await readZip64CentralDirectory(reader, readStart + i, comment, commentBytes);
|
|
3590
|
-
} else {
|
|
3591
|
-
return await readEntries(reader, centralDirectoryOffset, centralDirectorySize, entryCount, comment, commentBytes);
|
|
3592
|
-
}
|
|
3593
|
-
}
|
|
3594
|
-
throw new Error("could not find end of central directory. maybe not zip file");
|
|
3595
|
-
}
|
|
3596
|
-
var END_OF_CENTRAL_DIRECTORY_LOCATOR_SIGNATURE = 117853008;
|
|
3597
|
-
async function readZip64CentralDirectory(reader, offset, comment, commentBytes) {
|
|
3598
|
-
const zip64EocdlOffset = offset - 20;
|
|
3599
|
-
const eocdl = await readAs(reader, zip64EocdlOffset, 20);
|
|
3600
|
-
if (getUint32LE(eocdl, 0) !== END_OF_CENTRAL_DIRECTORY_LOCATOR_SIGNATURE) {
|
|
3601
|
-
throw new Error("invalid zip64 end of central directory locator signature");
|
|
3602
|
-
}
|
|
3603
|
-
const zip64EocdrOffset = getUint64LE(eocdl, 8);
|
|
3604
|
-
const zip64Eocdr = await readAs(reader, zip64EocdrOffset, 56);
|
|
3605
|
-
if (getUint32LE(zip64Eocdr, 0) !== ZIP64_EOCDR_SIGNATURE) {
|
|
3606
|
-
throw new Error("invalid zip64 end of central directory record signature");
|
|
3607
|
-
}
|
|
3608
|
-
const entryCount = getUint64LE(zip64Eocdr, 32);
|
|
3609
|
-
const centralDirectorySize = getUint64LE(zip64Eocdr, 40);
|
|
3610
|
-
const centralDirectoryOffset = getUint64LE(zip64Eocdr, 48);
|
|
3611
|
-
return readEntries(reader, centralDirectoryOffset, centralDirectorySize, entryCount, comment, commentBytes);
|
|
3612
|
-
}
|
|
3613
|
-
var CENTRAL_DIRECTORY_FILE_HEADER_SIGNATURE = 33639248;
|
|
3614
|
-
async function readEntries(reader, centralDirectoryOffset, centralDirectorySize, rawEntryCount, comment, commentBytes) {
|
|
3615
|
-
let readEntryCursor = 0;
|
|
3616
|
-
const allEntriesBuffer = await readAs(reader, centralDirectoryOffset, centralDirectorySize);
|
|
3617
|
-
const rawEntries = [];
|
|
3618
|
-
for (let e = 0;e < rawEntryCount; ++e) {
|
|
3619
|
-
const buffer = allEntriesBuffer.subarray(readEntryCursor, readEntryCursor + 46);
|
|
3620
|
-
const signature = getUint32LE(buffer, 0);
|
|
3621
|
-
if (signature !== CENTRAL_DIRECTORY_FILE_HEADER_SIGNATURE) {
|
|
3622
|
-
throw new Error(`invalid central directory file header signature: 0x${signature.toString(16)}`);
|
|
3623
|
-
}
|
|
3624
|
-
const rawEntry = {
|
|
3625
|
-
versionMadeBy: getUint16LE(buffer, 4),
|
|
3626
|
-
versionNeededToExtract: getUint16LE(buffer, 6),
|
|
3627
|
-
generalPurposeBitFlag: getUint16LE(buffer, 8),
|
|
3628
|
-
compressionMethod: getUint16LE(buffer, 10),
|
|
3629
|
-
lastModFileTime: getUint16LE(buffer, 12),
|
|
3630
|
-
lastModFileDate: getUint16LE(buffer, 14),
|
|
3631
|
-
crc32: getUint32LE(buffer, 16),
|
|
3632
|
-
compressedSize: getUint32LE(buffer, 20),
|
|
3633
|
-
uncompressedSize: getUint32LE(buffer, 24),
|
|
3634
|
-
fileNameLength: getUint16LE(buffer, 28),
|
|
3635
|
-
extraFieldLength: getUint16LE(buffer, 30),
|
|
3636
|
-
fileCommentLength: getUint16LE(buffer, 32),
|
|
3637
|
-
internalFileAttributes: getUint16LE(buffer, 36),
|
|
3638
|
-
externalFileAttributes: getUint32LE(buffer, 38),
|
|
3639
|
-
relativeOffsetOfLocalHeader: getUint32LE(buffer, 42)
|
|
3640
|
-
};
|
|
3641
|
-
if (rawEntry.generalPurposeBitFlag & 64) {
|
|
3642
|
-
throw new Error("strong encryption is not supported");
|
|
3643
|
-
}
|
|
3644
|
-
readEntryCursor += 46;
|
|
3645
|
-
const data = allEntriesBuffer.subarray(readEntryCursor, readEntryCursor + rawEntry.fileNameLength + rawEntry.extraFieldLength + rawEntry.fileCommentLength);
|
|
3646
|
-
rawEntry.nameBytes = data.slice(0, rawEntry.fileNameLength);
|
|
3647
|
-
rawEntry.name = decodeBuffer(rawEntry.nameBytes);
|
|
3648
|
-
const fileCommentStart = rawEntry.fileNameLength + rawEntry.extraFieldLength;
|
|
3649
|
-
const extraFieldBuffer = data.slice(rawEntry.fileNameLength, fileCommentStart);
|
|
3650
|
-
rawEntry.extraFields = [];
|
|
3651
|
-
let i = 0;
|
|
3652
|
-
while (i < extraFieldBuffer.length - 3) {
|
|
3653
|
-
const headerId = getUint16LE(extraFieldBuffer, i + 0);
|
|
3654
|
-
const dataSize = getUint16LE(extraFieldBuffer, i + 2);
|
|
3655
|
-
const dataStart = i + 4;
|
|
3656
|
-
const dataEnd = dataStart + dataSize;
|
|
3657
|
-
if (dataEnd > extraFieldBuffer.length) {
|
|
3658
|
-
throw new Error("extra field length exceeds extra field buffer size");
|
|
3659
|
-
}
|
|
3660
|
-
rawEntry.extraFields.push({
|
|
3661
|
-
id: headerId,
|
|
3662
|
-
data: extraFieldBuffer.slice(dataStart, dataEnd)
|
|
3663
|
-
});
|
|
3664
|
-
i = dataEnd;
|
|
3665
|
-
}
|
|
3666
|
-
rawEntry.commentBytes = data.slice(fileCommentStart, fileCommentStart + rawEntry.fileCommentLength);
|
|
3667
|
-
rawEntry.comment = decodeBuffer(rawEntry.commentBytes);
|
|
3668
|
-
readEntryCursor += data.length;
|
|
3669
|
-
if (rawEntry.uncompressedSize === 4294967295 || rawEntry.compressedSize === 4294967295 || rawEntry.relativeOffsetOfLocalHeader === 4294967295) {
|
|
3670
|
-
const zip64ExtraField = rawEntry.extraFields.find((e2) => e2.id === 1);
|
|
3671
|
-
if (!zip64ExtraField) {
|
|
3672
|
-
throw new Error("expected zip64 extended information extra field");
|
|
3673
|
-
}
|
|
3674
|
-
const zip64EiefBuffer = zip64ExtraField.data;
|
|
3675
|
-
let index = 0;
|
|
3676
|
-
if (rawEntry.uncompressedSize === 4294967295) {
|
|
3677
|
-
if (index + 8 > zip64EiefBuffer.length) {
|
|
3678
|
-
throw new Error("zip64 extended information extra field does not include uncompressed size");
|
|
3679
|
-
}
|
|
3680
|
-
rawEntry.uncompressedSize = getUint64LE(zip64EiefBuffer, index);
|
|
3681
|
-
index += 8;
|
|
3682
|
-
}
|
|
3683
|
-
if (rawEntry.compressedSize === 4294967295) {
|
|
3684
|
-
if (index + 8 > zip64EiefBuffer.length) {
|
|
3685
|
-
throw new Error("zip64 extended information extra field does not include compressed size");
|
|
3686
|
-
}
|
|
3687
|
-
rawEntry.compressedSize = getUint64LE(zip64EiefBuffer, index);
|
|
3688
|
-
index += 8;
|
|
3689
|
-
}
|
|
3690
|
-
if (rawEntry.relativeOffsetOfLocalHeader === 4294967295) {
|
|
3691
|
-
if (index + 8 > zip64EiefBuffer.length) {
|
|
3692
|
-
throw new Error("zip64 extended information extra field does not include relative header offset");
|
|
3693
|
-
}
|
|
3694
|
-
rawEntry.relativeOffsetOfLocalHeader = getUint64LE(zip64EiefBuffer, index);
|
|
3695
|
-
index += 8;
|
|
3696
|
-
}
|
|
3697
|
-
}
|
|
3698
|
-
const nameField = rawEntry.extraFields.find((e2) => e2.id === 28789 && e2.data.length >= 6 && e2.data[0] === 1 && getUint32LE(e2.data, 1), crc$1.unsigned(rawEntry.nameBytes));
|
|
3699
|
-
if (nameField) {
|
|
3700
|
-
rawEntry.fileName = decodeBuffer(nameField.data.slice(5));
|
|
3701
|
-
}
|
|
3702
|
-
if (rawEntry.compressionMethod === 0) {
|
|
3703
|
-
let expectedCompressedSize = rawEntry.uncompressedSize;
|
|
3704
|
-
if ((rawEntry.generalPurposeBitFlag & 1) !== 0) {
|
|
3705
|
-
expectedCompressedSize += 12;
|
|
3706
|
-
}
|
|
3707
|
-
if (rawEntry.compressedSize !== expectedCompressedSize) {
|
|
3708
|
-
throw new Error(`compressed size mismatch for stored file: ${rawEntry.compressedSize} != ${expectedCompressedSize}`);
|
|
3709
|
-
}
|
|
3710
|
-
}
|
|
3711
|
-
rawEntries.push(rawEntry);
|
|
3712
|
-
}
|
|
3713
|
-
const zip = {
|
|
3714
|
-
comment,
|
|
3715
|
-
commentBytes
|
|
3716
|
-
};
|
|
3717
|
-
return {
|
|
3718
|
-
zip,
|
|
3719
|
-
entries: rawEntries.map((e) => new ZipEntry(reader, e))
|
|
3720
|
-
};
|
|
3721
|
-
}
|
|
3722
|
-
async function readEntryDataHeader(reader, rawEntry) {
|
|
3723
|
-
if (rawEntry.generalPurposeBitFlag & 1) {
|
|
3724
|
-
throw new Error("encrypted entries not supported");
|
|
3725
|
-
}
|
|
3726
|
-
const buffer = await readAs(reader, rawEntry.relativeOffsetOfLocalHeader, 30);
|
|
3727
|
-
const totalLength = await reader.getLength();
|
|
3728
|
-
const signature = getUint32LE(buffer, 0);
|
|
3729
|
-
if (signature !== 67324752) {
|
|
3730
|
-
throw new Error(`invalid local file header signature: 0x${signature.toString(16)}`);
|
|
3731
|
-
}
|
|
3732
|
-
const fileNameLength = getUint16LE(buffer, 26);
|
|
3733
|
-
const extraFieldLength = getUint16LE(buffer, 28);
|
|
3734
|
-
const localFileHeaderEnd = rawEntry.relativeOffsetOfLocalHeader + buffer.length + fileNameLength + extraFieldLength;
|
|
3735
|
-
let decompress;
|
|
3736
|
-
if (rawEntry.compressionMethod === 0) {
|
|
3737
|
-
decompress = false;
|
|
3738
|
-
} else if (rawEntry.compressionMethod === 8) {
|
|
3739
|
-
decompress = true;
|
|
3740
|
-
} else {
|
|
3741
|
-
throw new Error(`unsupported compression method: ${rawEntry.compressionMethod}`);
|
|
3742
|
-
}
|
|
3743
|
-
const fileDataStart = localFileHeaderEnd;
|
|
3744
|
-
const fileDataEnd = fileDataStart + rawEntry.compressedSize;
|
|
3745
|
-
if (rawEntry.compressedSize !== 0) {
|
|
3746
|
-
if (fileDataEnd > totalLength) {
|
|
3747
|
-
throw new Error(`file data overflows file bounds: ${fileDataStart} + ${rawEntry.compressedSize} > ${totalLength}`);
|
|
3748
|
-
}
|
|
3749
|
-
}
|
|
3750
|
-
return {
|
|
3751
|
-
decompress,
|
|
3752
|
-
fileDataStart
|
|
3753
|
-
};
|
|
3754
|
-
}
|
|
3755
|
-
async function readEntryDataAsArrayBuffer(reader, rawEntry) {
|
|
3756
|
-
const { decompress, fileDataStart } = await readEntryDataHeader(reader, rawEntry);
|
|
3757
|
-
if (!decompress) {
|
|
3758
|
-
const dataView = await readAs(reader, fileDataStart, rawEntry.compressedSize);
|
|
3759
|
-
return isTypedArraySameAsArrayBuffer(dataView) ? dataView.buffer : dataView.slice().buffer;
|
|
3760
|
-
}
|
|
3761
|
-
const typedArrayOrBlob = await readAsBlobOrTypedArray(reader, fileDataStart, rawEntry.compressedSize);
|
|
3762
|
-
const result = await inflateRawAsync(typedArrayOrBlob, rawEntry.uncompressedSize);
|
|
3763
|
-
return result;
|
|
3764
|
-
}
|
|
3765
|
-
async function readEntryDataAsBlob(reader, rawEntry, type) {
|
|
3766
|
-
const { decompress, fileDataStart } = await readEntryDataHeader(reader, rawEntry);
|
|
3767
|
-
if (!decompress) {
|
|
3768
|
-
const typedArrayOrBlob2 = await readAsBlobOrTypedArray(reader, fileDataStart, rawEntry.compressedSize, type);
|
|
3769
|
-
if (isBlob(typedArrayOrBlob2)) {
|
|
3770
|
-
return typedArrayOrBlob2;
|
|
3771
|
-
}
|
|
3772
|
-
return new Blob([isSharedArrayBuffer(typedArrayOrBlob2.buffer) ? new Uint8Array(typedArrayOrBlob2) : typedArrayOrBlob2], { type });
|
|
3773
|
-
}
|
|
3774
|
-
const typedArrayOrBlob = await readAsBlobOrTypedArray(reader, fileDataStart, rawEntry.compressedSize);
|
|
3775
|
-
const result = await inflateRawAsync(typedArrayOrBlob, rawEntry.uncompressedSize, type);
|
|
3776
|
-
return result;
|
|
3777
|
-
}
|
|
3778
|
-
async function unzipRaw(source) {
|
|
3779
|
-
let reader;
|
|
3780
|
-
if (typeof Blob !== "undefined" && source instanceof Blob) {
|
|
3781
|
-
reader = new BlobReader(source);
|
|
3782
|
-
} else if (source instanceof ArrayBuffer || source && source.buffer && source.buffer instanceof ArrayBuffer) {
|
|
3783
|
-
reader = new ArrayBufferReader(source);
|
|
3784
|
-
} else if (isSharedArrayBuffer(source) || isSharedArrayBuffer(source.buffer)) {
|
|
3785
|
-
reader = new ArrayBufferReader(source);
|
|
3786
|
-
} else if (typeof source === "string") {
|
|
3787
|
-
const req = await fetch(source);
|
|
3788
|
-
if (!req.ok) {
|
|
3789
|
-
throw new Error(`failed http request ${source}, status: ${req.status}: ${req.statusText}`);
|
|
3790
|
-
}
|
|
3791
|
-
const blob = await req.blob();
|
|
3792
|
-
reader = new BlobReader(blob);
|
|
3793
|
-
} else if (typeof source.getLength === "function" && typeof source.read === "function") {
|
|
3794
|
-
reader = source;
|
|
3795
|
-
} else {
|
|
3796
|
-
throw new Error("unsupported source type");
|
|
3797
|
-
}
|
|
3798
|
-
const totalLength = await reader.getLength();
|
|
3799
|
-
if (totalLength > Number.MAX_SAFE_INTEGER) {
|
|
3800
|
-
throw new Error(`file too large. size: ${totalLength}. Only file sizes up 4503599627370496 bytes are supported`);
|
|
3801
|
-
}
|
|
3802
|
-
return await findEndOfCentralDirector(reader, totalLength);
|
|
3803
|
-
}
|
|
3804
|
-
async function unzip(source) {
|
|
3805
|
-
const { zip, entries } = await unzipRaw(source);
|
|
3806
|
-
return {
|
|
3807
|
-
zip,
|
|
3808
|
-
entries: Object.fromEntries(entries.map((v) => [v.name, v]))
|
|
3809
|
-
};
|
|
3810
|
-
}
|
|
3811
|
-
|
|
3812
2962
|
// ../serial/src/VexDevice.ts
|
|
3813
2963
|
async function downloadFileFromInternet(link) {
|
|
3814
2964
|
return await new Promise((resolve, reject) => {
|
|
@@ -4120,6 +3270,7 @@ class V5Brain {
|
|
|
4120
3270
|
vexos = await downloadFileFromInternet(publicUrl + usingVersion + ".vexos");
|
|
4121
3271
|
pcb("FETCH VEXOS", 1, 1);
|
|
4122
3272
|
pcb("UNZIP VEXOS", 0, 1);
|
|
3273
|
+
const { unzip } = await import("unzipit");
|
|
4123
3274
|
const { entries } = await unzip(vexos);
|
|
4124
3275
|
bootBin = await entries[usingVersion + "/BOOT.bin"].arrayBuffer();
|
|
4125
3276
|
assertBin = await entries[usingVersion + "/assets.bin"].arrayBuffer();
|
|
@@ -4595,14 +3746,14 @@ class V5SerialDevice extends VexSerialDevice {
|
|
|
4595
3746
|
if (sfPacket == null)
|
|
4596
3747
|
return false;
|
|
4597
3748
|
const flags5 = sfPacket.flags;
|
|
4598
|
-
this.state.radio.isRadioData = (flags5 & Math.pow(2,
|
|
4599
|
-
this.state.brain.button.isDoublePressed = (flags5 & Math.pow(2,
|
|
4600
|
-
this.state.brain.battery.isCharging = (flags5 & Math.pow(2,
|
|
4601
|
-
this.state.brain.button.isPressed = (flags5 & Math.pow(2,
|
|
4602
|
-
this.state.radio.isVexNet = (flags5 & Math.pow(2,
|
|
4603
|
-
this.state.controllers[1].isAvailable = (flags5 & Math.pow(2,
|
|
4604
|
-
this.state.radio.isConnected = (flags5 & Math.pow(2,
|
|
4605
|
-
this.state.radio.isAvailable = (flags5 & Math.pow(2,
|
|
3749
|
+
this.state.radio.isRadioData = (flags5 & Math.pow(2, 20)) !== 0;
|
|
3750
|
+
this.state.brain.button.isDoublePressed = (flags5 & Math.pow(2, 18)) !== 0;
|
|
3751
|
+
this.state.brain.battery.isCharging = (flags5 & Math.pow(2, 17)) !== 0;
|
|
3752
|
+
this.state.brain.button.isPressed = (flags5 & Math.pow(2, 15)) !== 0;
|
|
3753
|
+
this.state.radio.isVexNet = (flags5 & Math.pow(2, 14)) !== 0;
|
|
3754
|
+
this.state.controllers[1].isAvailable = (flags5 & Math.pow(2, 13)) !== 0;
|
|
3755
|
+
this.state.radio.isConnected = (flags5 & Math.pow(2, 10)) !== 0;
|
|
3756
|
+
this.state.radio.isAvailable = (flags5 & Math.pow(2, 9)) !== 0;
|
|
4606
3757
|
this.state.brain.battery.batteryPercent = sfPacket.battery ?? 0;
|
|
4607
3758
|
this.state.controllers[0].isAvailable = this.state.radio.isConnected || this.state.controllers[0].isCharging;
|
|
4608
3759
|
this.state.controllers[0].battery = sfPacket.controllerBatteryPercent ?? 0;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@v5x/cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.7",
|
|
4
4
|
"description": "Command line interface for v5x.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"access": "public"
|
|
25
25
|
},
|
|
26
26
|
"scripts": {
|
|
27
|
-
"build": "bun build ./src/index.ts --target bun --outfile ./dist/index.js && chmod +x ./dist/index.js",
|
|
27
|
+
"build": "bun build ./src/index.ts --target bun --external unzipit --outfile ./dist/index.js && chmod +x ./dist/index.js",
|
|
28
28
|
"dev": "bun run ./src/index.ts",
|
|
29
29
|
"lint": "bunx tsc --noEmit",
|
|
30
30
|
"prepublishOnly": "bun run typecheck && bun run build",
|
|
@@ -38,6 +38,7 @@
|
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
40
|
"bun-serialport": "^0.1.1",
|
|
41
|
-
"picocolors": "^1.1.1"
|
|
41
|
+
"picocolors": "^1.1.1",
|
|
42
|
+
"unzipit": "^1.4.0"
|
|
42
43
|
}
|
|
43
44
|
}
|