@v5x/cli 0.0.21 → 0.0.23
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/LICENSE +21 -0
- package/README.md +20 -0
- package/dist/index.js +6586 -5216
- package/dist/index.js.map +56 -0
- package/package.json +36 -8
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../node_modules/.bun/unzipit@2.0.3/node_modules/unzipit/dist/unzipit.module.js", "../../../node_modules/.bun/bun-serialport@0.1.1/node_modules/bun-serialport/src/bindings/constants.js", "../../../node_modules/.bun/bun-serialport@0.1.1/node_modules/bun-serialport/src/bindings/posix.js", "../../../node_modules/.bun/bun-serialport@0.1.1/node_modules/bun-serialport/src/serialport.js", "../../../node_modules/.bun/bun-serialport@0.1.1/node_modules/bun-serialport/src/list.js", "../../../node_modules/.bun/bun-serialport@0.1.1/node_modules/bun-serialport/src/parsers/delimiter.js", "../../../node_modules/.bun/bun-serialport@0.1.1/node_modules/bun-serialport/src/parsers/byte-length.js", "../../../node_modules/.bun/bun-serialport@0.1.1/node_modules/bun-serialport/src/parsers/readline.js", "../../../node_modules/.bun/bun-serialport@0.1.1/node_modules/bun-serialport/src/parsers/index.js", "../../../node_modules/.bun/bun-serialport@0.1.1/node_modules/bun-serialport/src/index.js", "../../../node_modules/.bun/mri@1.2.0/node_modules/mri/lib/index.mjs", "../../../node_modules/.bun/sade@1.8.1/node_modules/sade/lib/index.mjs", "../../../node_modules/.bun/chalk@5.6.2/node_modules/chalk/source/vendor/ansi-styles/index.js", "../../../node_modules/.bun/chalk@5.6.2/node_modules/chalk/source/vendor/supports-color/index.js", "../../../node_modules/.bun/chalk@5.6.2/node_modules/chalk/source/utilities.js", "../../../node_modules/.bun/chalk@5.6.2/node_modules/chalk/source/index.js", "../src/utils/project.ts", "../../serial/dist/index.js", "../src/utils/detect.ts", "../src/utils/guards.ts", "../src/utils/process.ts", "../../../node_modules/.bun/cmd-table@1.6.0/node_modules/cmd-table/dist/chunk-G76XL7PC.mjs", "../../../node_modules/.bun/cmd-table@1.6.0/node_modules/cmd-table/dist/index.mjs", "../src/utils/output.ts", "../src/utils/workflow-json.ts", "../src/commands/build.ts", "../src/device.ts", "../src/adapter.ts", "../src/utils/brainPath.ts", "../src/commands/cat.ts", "../src/commands/clean.ts", "../src/commands/devices.ts", "../src/commands/dir.ts", "../src/commands/doctor.ts", "../src/commands/init.ts", "../src/utils/scaffold.ts", "../../../node_modules/.bun/fflate@0.8.3/node_modules/fflate/esm/index.mjs", "../src/commands/install.ts", "../src/commands/kv.ts", "../src/commands/new.ts", "../src/commands/programs.ts", "../src/commands/rm.ts", "../src/utils/upload.ts", "../src/commands/run.ts", "../src/commands/screenshot.ts", "../src/commands/upload.ts", "../src/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/* unzipit@2.0.3, license MIT */\nvar _a, _b;\nfunction readBlobAsArrayBuffer(blob) {\n if (blob.arrayBuffer) {\n return blob.arrayBuffer();\n }\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', () => {\n resolve(reader.result);\n });\n reader.addEventListener('error', reject);\n reader.readAsArrayBuffer(blob);\n });\n}\nasync function readBlobAsUint8Array(blob) {\n const arrayBuffer = await readBlobAsArrayBuffer(blob);\n return new Uint8Array(arrayBuffer);\n}\nfunction isBlob(v) {\n return typeof Blob !== 'undefined' && v instanceof Blob;\n}\nfunction isSharedArrayBuffer(b) {\n return typeof SharedArrayBuffer !== 'undefined' && b instanceof SharedArrayBuffer;\n}\nconst isNode = (typeof process !== 'undefined') &&\n !!(process === null || process === void 0 ? void 0 : process.versions) &&\n (typeof ((_a = process === null || process === void 0 ? void 0 : process.versions) === null || _a === void 0 ? void 0 : _a.node) !== 'undefined') &&\n (typeof ((_b = process === null || process === void 0 ? void 0 : process.versions) === null || _b === void 0 ? void 0 : _b.electron) === 'undefined');\nfunction isTypedArraySameAsArrayBuffer(typedArray) {\n return typedArray.byteOffset === 0 && typedArray.byteLength === typedArray.buffer.byteLength;\n}\n\nclass ArrayBufferReader {\n constructor(arrayBufferOrView) {\n this.typedArray = (arrayBufferOrView instanceof ArrayBuffer || isSharedArrayBuffer(arrayBufferOrView))\n ? new Uint8Array(arrayBufferOrView)\n : new Uint8Array(arrayBufferOrView.buffer, arrayBufferOrView.byteOffset, arrayBufferOrView.byteLength);\n }\n async getLength() {\n return this.typedArray.byteLength;\n }\n async read(offset, length) {\n // Cast is necessary: backing buffer may be SharedArrayBuffer (ArrayBufferLike),\n // but callers need Uint8Array<ArrayBuffer>. The data is read-only view so this is safe.\n return new Uint8Array(this.typedArray.buffer, this.typedArray.byteOffset + offset, length);\n }\n}\n\nclass BlobReader {\n constructor(blob) {\n this.blob = blob;\n }\n async getLength() {\n return this.blob.size;\n }\n async read(offset, length) {\n const blob = this.blob.slice(offset, offset + length);\n const arrayBuffer = await readBlobAsArrayBuffer(blob);\n return new Uint8Array(arrayBuffer);\n }\n async sliceAsBlob(offset, length, type = '') {\n return this.blob.slice(offset, offset + length, type);\n }\n}\n\nclass HTTPRangeReader {\n constructor(url) {\n this.url = url;\n }\n async getLength() {\n if (this.length === undefined) {\n const req = await fetch(this.url, { method: 'HEAD' });\n if (!req.ok) {\n throw new Error(`failed http request ${this.url}, status: ${req.status}: ${req.statusText}`);\n }\n this.length = parseInt(req.headers.get('content-length'));\n if (Number.isNaN(this.length)) {\n throw Error('could not get length');\n }\n }\n return this.length;\n }\n async read(offset, size) {\n if (size === 0) {\n return new Uint8Array(0);\n }\n const req = await fetch(this.url, {\n headers: {\n Range: `bytes=${offset}-${offset + size - 1}`,\n },\n });\n if (!req.ok) {\n throw new Error(`failed http request ${this.url}, status: ${req.status} offset: ${offset} size: ${size}: ${req.statusText}`);\n }\n const buffer = await req.arrayBuffer();\n return new Uint8Array(buffer);\n }\n}\n\n/* global DecompressionStream */\nconst config = {\n numWorkers: 1,\n workerURL: '',\n useWorkers: false,\n};\nlet nextId = 0;\n// Requests are put on a queue.\n// We don't send the request to the worker until the worker\n// is finished. This probably adds a small amount of latency\n// but the issue is imagine you have 2 workers. You give worker\n// A x seconds of work to do and worker B y seconds of work to\n// do. You don't know which will finish first. If you give\n// the worker with more work to do the request then you'll\n// waste time.\n// note: we can't check `workers.length` for deciding if\n// we've reached `config.numWorkers` because creation the worker\n// is async which means other requests to make workers might\n// come in before a worker gets added to `workers`\nlet numWorkers = 0;\nlet canUseWorkers = true; // gets set to false if we can't start a worker\nconst workers = [];\nconst availableWorkers = [];\nconst waitingForWorkerQueue = [];\nconst currentlyProcessingIdToRequestMap = new Map();\nfunction handleResult(e) {\n makeWorkerAvailable(e.target);\n const { id, error, data } = e.data;\n const request = currentlyProcessingIdToRequestMap.get(id);\n currentlyProcessingIdToRequestMap.delete(id);\n if (error) {\n // The worker can only structured-clone the error as a string, so wrap it\n // back into an Error to match the rejection type of the non-worker path.\n request.reject(new Error(error));\n return;\n }\n // Verify that the decompressed size matches the declared uncompressedSize\n // Treat declared size as authoritative metadata that must be verified.\n const expected = request.uncompressedSize;\n const actual = data instanceof ArrayBuffer ? data.byteLength : data === null || data === void 0 ? void 0 : data.size;\n if (typeof expected === 'number' && typeof actual === 'number' && expected !== actual) {\n request.reject(new Error(`decompressed size mismatch. declared: ${expected}, actual: ${actual}`));\n return;\n }\n request.resolve(data);\n}\n// Because Firefox uses non-standard onerror to signal an error.\nfunction startWorker(url) {\n return new Promise((resolve, reject) => {\n const worker = new Worker(url);\n worker.onmessage = (e) => {\n if (e.data === 'start') {\n worker.onerror = null;\n worker.onmessage = null;\n resolve(worker);\n }\n else {\n reject(new Error(`unexpected message: ${e.data}`));\n }\n };\n worker.onerror = reject;\n });\n}\nconst workerHelper = (function () {\n if (isNode) {\n return {\n async createWorker(url) {\n const moduleId = 'node:worker_threads';\n const { Worker } = await import(moduleId);\n return new Worker(url);\n },\n addEventListener(worker, fn) {\n var _a;\n (_a = worker.on) === null || _a === void 0 ? void 0 : _a.call(worker, 'message', (data) => {\n fn({ target: worker, data });\n });\n },\n async terminate(worker) {\n var _a;\n await ((_a = worker.terminate) === null || _a === void 0 ? void 0 : _a.call(worker));\n },\n };\n }\n else {\n return {\n async createWorker(url) {\n // I don't understand this security issue\n // Apparently there is some iframe setting or http header\n // that prevents cross domain workers. But, I can manually\n // download the text and do it. I reported this to Chrome\n // and they said it was fine so ¯\\_(ツ)_/¯\n try {\n const worker = await startWorker(url);\n return worker;\n }\n catch (_e) {\n console.warn('could not load worker:', url);\n }\n let text;\n try {\n const req = await fetch(url, { mode: 'cors' });\n if (!req.ok) {\n throw new Error(`could not load: ${url}`);\n }\n text = await req.text();\n url = URL.createObjectURL(new Blob([text], { type: 'application/javascript' }));\n const worker = await startWorker(url);\n config.workerURL = url; // this is a hack. What's a better way to structure this code?\n return worker;\n }\n catch (_e) {\n console.warn('could not load worker via fetch:', url);\n }\n if (text !== undefined) {\n try {\n url = `data:application/javascript;base64,${btoa(text)}`;\n const worker = await startWorker(url);\n config.workerURL = url;\n return worker;\n }\n catch (_e) {\n console.warn('could not load worker via dataURI');\n }\n }\n console.warn('workers will not be used');\n throw new Error('can not start workers');\n },\n addEventListener(worker, fn) {\n var _a;\n // The browser delivers a MessageEvent whose `target` is the worker\n // and whose `data` is the InflateResultMessage, matching WorkerResultEvent.\n (_a = worker.addEventListener) === null || _a === void 0 ? void 0 : _a.call(worker, 'message', fn);\n },\n async terminate(worker) {\n var _a;\n await ((_a = worker.terminate) === null || _a === void 0 ? void 0 : _a.call(worker));\n },\n };\n }\n}());\nfunction makeWorkerAvailable(worker) {\n availableWorkers.push(worker);\n processWaitingForWorkerQueue();\n}\nasync function getAvailableWorker() {\n if (availableWorkers.length === 0 && numWorkers < config.numWorkers) {\n ++numWorkers; // see comment at numWorkers declaration\n try {\n const worker = await workerHelper.createWorker(config.workerURL);\n workers.push(worker);\n availableWorkers.push(worker);\n workerHelper.addEventListener(worker, handleResult);\n }\n catch (_e) {\n // set this global out-of-band (needs refactor)\n canUseWorkers = false;\n }\n }\n return availableWorkers.pop();\n}\nasync function decompressRaw(src, limit) {\n const ds = new DecompressionStream('deflate-raw');\n const writer = ds.writable.getWriter();\n // Do not await the write — doing so before reading causes a deadlock when\n // the internal buffer fills due to backpressure.\n writer.write(src).then(() => writer.close()).catch(() => { });\n const chunks = [];\n const reader = ds.readable.getReader();\n let seen = 0;\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n // If this chunk would push us past the configured/declared limit, abort\n const newSeen = seen + value.byteLength;\n if (typeof limit === 'number' && newSeen > limit) {\n throw new Error(`decompressed size exceeds limit: ${newSeen} > ${limit}`);\n }\n chunks.push(value);\n seen = newSeen;\n }\n const size = chunks.reduce((s, c) => s + c.byteLength, 0);\n const result = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return result;\n}\n// @param {Uint8Array} src\n// @param {string} [type] mime-type\n// @returns {ArrayBuffer|Blob} ArrayBuffer if type is falsy or Blob otherwise.\nasync function inflateRawLocal(src, uncompressedSize, type, resolve, reject) {\n try {\n const limit = uncompressedSize;\n const dst = await decompressRaw(src, limit);\n const actual = dst.byteLength;\n if (typeof uncompressedSize === 'number' && actual !== uncompressedSize) {\n reject(new Error(`decompressed size mismatch. declared: ${uncompressedSize}, actual: ${actual}`));\n return;\n }\n resolve(type ? new Blob([dst], { type }) : dst.buffer);\n }\n catch (e) {\n reject(e);\n }\n}\nasync function processWaitingForWorkerQueue() {\n var _a;\n if (waitingForWorkerQueue.length === 0) {\n return;\n }\n if (config.useWorkers && canUseWorkers) {\n const worker = await getAvailableWorker();\n // canUseWorkers might have been set out-of-band (need refactor)\n if (canUseWorkers) {\n if (worker) {\n if (waitingForWorkerQueue.length === 0) {\n // the queue might be empty while we awaited for a worker.\n makeWorkerAvailable(worker);\n return;\n }\n const { id, src, uncompressedSize, type, resolve, reject } = waitingForWorkerQueue.shift();\n currentlyProcessingIdToRequestMap.set(id, { id, src, uncompressedSize, type, resolve, reject });\n const transferables = [];\n // NOTE: Originally I thought you could transfer an ArrayBuffer.\n // The code on this side is often using views into the entire file\n // which means if we transferred we'd lose the entire file. That sucks\n // because it means there's an expensive copy to send the uncompressed\n // data to the worker.\n //\n // Also originally I thought we could send a Blob but we'd need to refactor\n // the code in unzipit/readEntryData as currently it reads the uncompressed\n // bytes.\n //\n //if (!isBlob(src) && !isSharedArrayBuffer(src)) {\n // transferables.push(src);\n //}\n (_a = worker.postMessage) === null || _a === void 0 ? void 0 : _a.call(worker, {\n type: 'inflate',\n data: {\n id,\n type,\n src,\n uncompressedSize,\n },\n }, transferables);\n }\n return;\n }\n }\n // inflate locally\n // We loop here because what happens if many requests happen at once\n // the first N requests will try to async make a worker. Other requests\n // will then be on the queue. But if we fail to make workers then there\n // are pending requests.\n while (waitingForWorkerQueue.length) {\n const { src, uncompressedSize, type, resolve, reject } = waitingForWorkerQueue.shift();\n const data = isBlob(src) ? await readBlobAsUint8Array(src) : src;\n try {\n await inflateRawLocal(data, uncompressedSize, type, resolve, reject);\n }\n catch (e) {\n reject(e);\n }\n }\n}\nfunction setOptions$1(options) {\n config.workerURL = options.workerURL || config.workerURL;\n // there's no reason to set the workerURL if you're not going to use workers\n if (options.workerURL) {\n config.useWorkers = true;\n }\n config.useWorkers = options.useWorkers !== undefined ? options.useWorkers : config.useWorkers;\n config.numWorkers = options.numWorkers || config.numWorkers;\n}\n// It has to take non-zero time to put a large typed array in a Blob since the very\n// next instruction you could change the contents of the array. So, if you're reading\n// the zip file for images/video/audio then all you want is a Blob on which to get a URL.\n// so that operation of putting the data in a Blob should happen in the worker.\n//\n// Conversely if you want the data itself then you want an ArrayBuffer immediately\n// since the worker can transfer its ArrayBuffer zero copy.\n//\n// @param {Uint8Array|Blob} src\n// @param {number} uncompressedSize\n// @param {string} [type] falsy or mimeType string (eg: 'image/png')\n// @returns {ArrayBuffer|Blob} ArrayBuffer if type is falsy or Blob otherwise.\nfunction inflateRawAsync(src, uncompressedSize, type) {\n return new Promise((resolve, reject) => {\n // note: there is potential an expensive copy here. In order for the data\n // to make it into the worker we need to copy the data to the worker unless\n // it's a Blob or a SharedArrayBuffer.\n //\n // Solutions:\n //\n // 1. A minor enhancement, if `uncompressedSize` is small don't call the worker.\n //\n // might be a win period as their is overhead calling the worker\n //\n // 2. Move the entire library to the worker\n //\n // Good, Maybe faster if you pass a URL, Blob, or SharedArrayBuffer? Not sure about that\n // as those are also easy to transfer. Still slow if you pass an ArrayBuffer\n // as the ArrayBuffer has to be copied to the worker.\n //\n // I guess benchmarking is really the only thing to try.\n waitingForWorkerQueue.push({ src, uncompressedSize, type, resolve, reject, id: nextId++ });\n processWaitingForWorkerQueue();\n });\n}\nfunction clearArray(arr) {\n arr.splice(0, arr.length);\n}\nasync function cleanup$1() {\n for (const worker of workers) {\n await workerHelper.terminate(worker);\n }\n clearArray(workers);\n clearArray(availableWorkers);\n clearArray(waitingForWorkerQueue);\n currentlyProcessingIdToRequestMap.clear();\n numWorkers = 0;\n canUseWorkers = true;\n}\n\nfunction dosDateTimeToDate(date, time) {\n const day = date & 0x1f; // 1-31\n const month = (date >> 5 & 0xf) - 1; // 1-12, 0-11\n const year = (date >> 9 & 0x7f) + 1980; // 0-128, 1980-2108\n const millisecond = 0;\n const second = (time & 0x1f) * 2; // 0-29, 0-58 (even numbers)\n const minute = time >> 5 & 0x3f; // 0-59\n const hour = time >> 11 & 0x1f; // 0-23\n return new Date(year, month, day, hour, minute, second, millisecond);\n}\nclass ZipEntry {\n constructor(reader, rawEntry) {\n this._reader = reader;\n this._rawEntry = rawEntry;\n this.name = rawEntry.name;\n this.nameBytes = rawEntry.nameBytes;\n this.size = rawEntry.uncompressedSize;\n this.compressedSize = rawEntry.compressedSize;\n this.comment = rawEntry.comment;\n this.commentBytes = rawEntry.commentBytes;\n this.compressionMethod = rawEntry.compressionMethod;\n this.lastModDate = dosDateTimeToDate(rawEntry.lastModFileDate, rawEntry.lastModFileTime);\n this.isDirectory = rawEntry.uncompressedSize === 0 && rawEntry.name.endsWith('/');\n this.encrypted = !!(rawEntry.generalPurposeBitFlag & 0x1);\n this.externalFileAttributes = rawEntry.externalFileAttributes;\n this.versionMadeBy = rawEntry.versionMadeBy;\n }\n // returns a promise that returns a Blob for this entry\n async blob(type = 'application/octet-stream') {\n return await readEntryDataAsBlob(this._reader, this._rawEntry, type);\n }\n // returns a promise that returns an ArrayBuffer for this entry\n async arrayBuffer() {\n return await readEntryDataAsArrayBuffer(this._reader, this._rawEntry);\n }\n // returns text, assumes the text is valid utf8. If you want more options decode arrayBuffer yourself\n async text() {\n const buffer = await this.arrayBuffer();\n return decodeBuffer(new Uint8Array(buffer));\n }\n // returns text with JSON.parse called on it. If you want more options decode arrayBuffer yourself\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async json() {\n const text = await this.text();\n return JSON.parse(text);\n }\n}\nconst EOCDR_WITHOUT_COMMENT_SIZE = 22;\nconst MAX_COMMENT_SIZE = 0xffff; // 2-byte size\nconst EOCDR_SIGNATURE = 0x06054b50;\nconst ZIP64_EOCDR_SIGNATURE = 0x06064b50;\nasync function readAs(reader, offset, length) {\n return await reader.read(offset, length);\n}\n// The point of this function is we want to be able to pass the data\n// to a worker as fast as possible so when decompressing if the data\n// is already a blob and we can get a blob then get a blob.\n//\n// I'm not sure what a better way to refactor this is. We've got examples\n// of multiple readers. Ideally, for every type of reader we could ask\n// it, \"give me a type that is zero copy both locally and when sent to a worker\".\n//\n// The problem is the worker would also have to know the how to handle this\n// opaque type. I suppose the correct solution is to register different\n// reader handlers in the worker so BlobReader would register some\n// `handleZeroCopyType<BlobReader>`. At the moment I don't feel like\n// refactoring. As it is you just pass in an instance of the reader\n// but instead you'd have to register the reader and some how get the\n// source for the `handleZeroCopyType` handler function into the worker.\n// That sounds like a huge PITA, requiring you to put the implementation\n// in a separate file so the worker can load it or some other workaround\n// hack.\n//\n// For now this hack works even if it's not generic.\nasync function readAsBlobOrTypedArray(reader, offset, length, type) {\n if (reader.sliceAsBlob) {\n return await reader.sliceAsBlob(offset, length, type);\n }\n return await reader.read(offset, length);\n}\nconst crc = {\n unsigned() {\n return 0;\n },\n};\nfunction getUint16LE(uint8View, offset) {\n return uint8View[offset] +\n uint8View[offset + 1] * 0x100;\n}\nfunction getUint32LE(uint8View, offset) {\n return uint8View[offset] +\n uint8View[offset + 1] * 0x100 +\n uint8View[offset + 2] * 0x10000 +\n uint8View[offset + 3] * 0x1000000;\n}\nfunction getUint64LE(uint8View, offset) {\n return getUint32LE(uint8View, offset) +\n getUint32LE(uint8View, offset + 4) * 0x100000000;\n}\n// const decodeCP437 = (function() {\n// const cp437 = '\\u0000☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&\\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ';\n//\n// return function(uint8view) {\n// return Array.from(uint8view).map(v => cp437[v]).join('');\n// };\n// }());\nconst utf8Decoder = new TextDecoder();\nfunction decodeBuffer(uint8View, _isUTF8) {\n if (isSharedArrayBuffer(uint8View.buffer)) {\n uint8View = new Uint8Array(uint8View);\n }\n return utf8Decoder.decode(uint8View);\n /*\n AFAICT the UTF8 flat is not set so it's 100% up to the user\n to self decode if their file is not utf8 filenames\n return isUTF8\n ? utf8Decoder.decode(uint8View)\n : decodeCP437(uint8View);\n */\n}\nasync function findEndOfCentralDirector(reader, totalLength) {\n const size = Math.min(EOCDR_WITHOUT_COMMENT_SIZE + MAX_COMMENT_SIZE, totalLength);\n const readStart = totalLength - size;\n const data = await readAs(reader, readStart, size);\n for (let i = size - EOCDR_WITHOUT_COMMENT_SIZE; i >= 0; --i) {\n if (getUint32LE(data, i) !== EOCDR_SIGNATURE) {\n continue;\n }\n // 0 - End of central directory signature\n const eocdr = new Uint8Array(data.buffer, data.byteOffset + i, data.byteLength - i);\n // 4 - Number of this disk\n const diskNumber = getUint16LE(eocdr, 4);\n if (diskNumber !== 0) {\n throw new Error(`multi-volume zip files are not supported. This is volume: ${diskNumber}`);\n }\n // 6 - Disk where central directory starts\n // 8 - Number of central directory records on this disk\n // 10 - Total number of central directory records\n const entryCount = getUint16LE(eocdr, 10);\n // 12 - Size of central directory (bytes)\n const centralDirectorySize = getUint32LE(eocdr, 12);\n // 16 - Offset of start of central directory, relative to start of archive\n const centralDirectoryOffset = getUint32LE(eocdr, 16);\n // 20 - Comment length\n const commentLength = getUint16LE(eocdr, 20);\n const expectedCommentLength = eocdr.length - EOCDR_WITHOUT_COMMENT_SIZE;\n if (commentLength !== expectedCommentLength) {\n throw new Error(`invalid comment length. expected: ${expectedCommentLength}, actual: ${commentLength}`);\n }\n // 22 - Comment\n // the encoding is always cp437.\n const commentBytes = new Uint8Array(eocdr.buffer, eocdr.byteOffset + 22, commentLength);\n const comment = decodeBuffer(commentBytes);\n if (entryCount === 0xffff || centralDirectoryOffset === 0xffffffff) {\n return await readZip64CentralDirectory(reader, readStart + i, comment, commentBytes);\n }\n else {\n return await readEntries(reader, centralDirectoryOffset, centralDirectorySize, entryCount, comment, commentBytes);\n }\n }\n throw new Error('could not find end of central directory. maybe not zip file');\n}\nconst END_OF_CENTRAL_DIRECTORY_LOCATOR_SIGNATURE = 0x07064b50;\nasync function readZip64CentralDirectory(reader, offset, comment, commentBytes) {\n // ZIP64 Zip64 end of central directory locator\n const zip64EocdlOffset = offset - 20;\n const eocdl = await readAs(reader, zip64EocdlOffset, 20);\n // 0 - zip64 end of central dir locator signature\n if (getUint32LE(eocdl, 0) !== END_OF_CENTRAL_DIRECTORY_LOCATOR_SIGNATURE) {\n throw new Error('invalid zip64 end of central directory locator signature');\n }\n // 4 - number of the disk with the start of the zip64 end of central directory\n // 8 - relative offset of the zip64 end of central directory record\n const zip64EocdrOffset = getUint64LE(eocdl, 8);\n // 16 - total number of disks\n // ZIP64 end of central directory record\n const zip64Eocdr = await readAs(reader, zip64EocdrOffset, 56);\n // 0 - zip64 end of central dir signature 4 bytes (0x06064b50)\n if (getUint32LE(zip64Eocdr, 0) !== ZIP64_EOCDR_SIGNATURE) {\n throw new Error('invalid zip64 end of central directory record signature');\n }\n // 4 - size of zip64 end of central directory record 8 bytes\n // 12 - version made by 2 bytes\n // 14 - version needed to extract 2 bytes\n // 16 - number of this disk 4 bytes\n // 20 - number of the disk with the start of the central directory 4 bytes\n // 24 - total number of entries in the central directory on this disk 8 bytes\n // 32 - total number of entries in the central directory 8 bytes\n const entryCount = getUint64LE(zip64Eocdr, 32);\n // 40 - size of the central directory 8 bytes\n const centralDirectorySize = getUint64LE(zip64Eocdr, 40);\n // 48 - offset of start of central directory with respect to the starting disk number 8 bytes\n const centralDirectoryOffset = getUint64LE(zip64Eocdr, 48);\n // 56 - zip64 extensible data sector (variable size)\n return readEntries(reader, centralDirectoryOffset, centralDirectorySize, entryCount, comment, commentBytes);\n}\nconst CENTRAL_DIRECTORY_FILE_HEADER_SIGNATURE = 0x02014b50;\nasync function readEntries(reader, centralDirectoryOffset, centralDirectorySize, rawEntryCount, comment, commentBytes) {\n let readEntryCursor = 0;\n const allEntriesBuffer = await readAs(reader, centralDirectoryOffset, centralDirectorySize);\n const rawEntries = [];\n for (let e = 0; e < rawEntryCount; ++e) {\n const buffer = allEntriesBuffer.subarray(readEntryCursor, readEntryCursor + 46);\n // 0 - Central directory file header signature\n const signature = getUint32LE(buffer, 0);\n if (signature !== CENTRAL_DIRECTORY_FILE_HEADER_SIGNATURE) {\n throw new Error(`invalid central directory file header signature: 0x${signature.toString(16)}`);\n }\n const rawEntry = {\n // 4 - Version made by\n versionMadeBy: getUint16LE(buffer, 4),\n // 6 - Version needed to extract (minimum)\n versionNeededToExtract: getUint16LE(buffer, 6),\n // 8 - General purpose bit flag\n generalPurposeBitFlag: getUint16LE(buffer, 8),\n // 10 - Compression method\n compressionMethod: getUint16LE(buffer, 10),\n // 12 - File last modification time\n lastModFileTime: getUint16LE(buffer, 12),\n // 14 - File last modification date\n lastModFileDate: getUint16LE(buffer, 14),\n // 16 - CRC-32\n crc32: getUint32LE(buffer, 16),\n // 20 - Compressed size\n compressedSize: getUint32LE(buffer, 20),\n // 24 - Uncompressed size\n uncompressedSize: getUint32LE(buffer, 24),\n // 28 - File name length (n)\n fileNameLength: getUint16LE(buffer, 28),\n // 30 - Extra field length (m)\n extraFieldLength: getUint16LE(buffer, 30),\n // 32 - File comment length (k)\n fileCommentLength: getUint16LE(buffer, 32),\n // 34 - Disk number where file starts\n // 36 - Internal file attributes\n internalFileAttributes: getUint16LE(buffer, 36),\n // 38 - External file attributes\n externalFileAttributes: getUint32LE(buffer, 38),\n // 42 - Relative offset of local file header\n relativeOffsetOfLocalHeader: getUint32LE(buffer, 42),\n };\n if (rawEntry.generalPurposeBitFlag & 0x40) {\n throw new Error('strong encryption is not supported');\n }\n readEntryCursor += 46;\n const data = allEntriesBuffer.subarray(readEntryCursor, readEntryCursor + rawEntry.fileNameLength + rawEntry.extraFieldLength + rawEntry.fileCommentLength);\n // 46 - File name\n (rawEntry.generalPurposeBitFlag & 0x800) !== 0;\n rawEntry.nameBytes = data.slice(0, rawEntry.fileNameLength);\n rawEntry.name = decodeBuffer(rawEntry.nameBytes);\n // 46+n - Extra field\n const fileCommentStart = rawEntry.fileNameLength + rawEntry.extraFieldLength;\n const extraFieldBuffer = data.slice(rawEntry.fileNameLength, fileCommentStart);\n rawEntry.extraFields = [];\n let i = 0;\n while (i < extraFieldBuffer.length - 3) {\n const headerId = getUint16LE(extraFieldBuffer, i + 0);\n const dataSize = getUint16LE(extraFieldBuffer, i + 2);\n const dataStart = i + 4;\n const dataEnd = dataStart + dataSize;\n if (dataEnd > extraFieldBuffer.length) {\n throw new Error('extra field length exceeds extra field buffer size');\n }\n rawEntry.extraFields.push({\n id: headerId,\n data: extraFieldBuffer.slice(dataStart, dataEnd),\n });\n i = dataEnd;\n }\n // 46+n+m - File comment\n rawEntry.commentBytes = data.slice(fileCommentStart, fileCommentStart + rawEntry.fileCommentLength);\n rawEntry.comment = decodeBuffer(rawEntry.commentBytes);\n readEntryCursor += data.length;\n if (rawEntry.uncompressedSize === 0xffffffff ||\n rawEntry.compressedSize === 0xffffffff ||\n rawEntry.relativeOffsetOfLocalHeader === 0xffffffff) {\n // ZIP64 format\n // find the Zip64 Extended Information Extra Field\n const zip64ExtraField = rawEntry.extraFields.find(e => e.id === 0x0001);\n if (!zip64ExtraField) {\n throw new Error('expected zip64 extended information extra field');\n }\n const zip64EiefBuffer = zip64ExtraField.data;\n let index = 0;\n // 0 - Original Size 8 bytes\n if (rawEntry.uncompressedSize === 0xffffffff) {\n if (index + 8 > zip64EiefBuffer.length) {\n throw new Error('zip64 extended information extra field does not include uncompressed size');\n }\n rawEntry.uncompressedSize = getUint64LE(zip64EiefBuffer, index);\n index += 8;\n }\n // 8 - Compressed Size 8 bytes\n if (rawEntry.compressedSize === 0xffffffff) {\n if (index + 8 > zip64EiefBuffer.length) {\n throw new Error('zip64 extended information extra field does not include compressed size');\n }\n rawEntry.compressedSize = getUint64LE(zip64EiefBuffer, index);\n index += 8;\n }\n // 16 - Relative Header Offset 8 bytes\n if (rawEntry.relativeOffsetOfLocalHeader === 0xffffffff) {\n if (index + 8 > zip64EiefBuffer.length) {\n throw new Error('zip64 extended information extra field does not include relative header offset');\n }\n rawEntry.relativeOffsetOfLocalHeader = getUint64LE(zip64EiefBuffer, index);\n index += 8;\n }\n // 24 - Disk Start Number 4 bytes\n }\n // check for Info-ZIP Unicode Path Extra Field (0x7075)\n // see https://github.com/thejoshwolfe/yauzl/issues/33\n const nameField = rawEntry.extraFields.find(e => e.id === 0x7075 &&\n e.data.length >= 6 && // too short to be meaningful\n e.data[0] === 1 && // Version 1 byte version of this extra field, currently 1\n getUint32LE(e.data, 1), crc.unsigned()); // NameCRC32 4 bytes File Name Field CRC32 Checksum\n // > If the CRC check fails, this UTF-8 Path Extra Field should be\n // > ignored and the File Name field in the header should be used instead.\n if (nameField) {\n // UnicodeName Variable UTF-8 version of the entry File Name\n rawEntry.fileName = decodeBuffer(nameField.data.slice(5));\n }\n // validate file size\n if (rawEntry.compressionMethod === 0) {\n let expectedCompressedSize = rawEntry.uncompressedSize;\n if ((rawEntry.generalPurposeBitFlag & 0x1) !== 0) {\n // traditional encryption prefixes the file data with a header\n expectedCompressedSize += 12;\n }\n if (rawEntry.compressedSize !== expectedCompressedSize) {\n throw new Error(`compressed size mismatch for stored file: ${rawEntry.compressedSize} != ${expectedCompressedSize}`);\n }\n }\n rawEntries.push(rawEntry);\n }\n const zip = {\n comment,\n commentBytes,\n };\n return {\n zip,\n entries: rawEntries.map(e => new ZipEntry(reader, e)),\n };\n}\nasync function readEntryDataHeader(reader, rawEntry) {\n if (rawEntry.generalPurposeBitFlag & 0x1) {\n throw new Error('encrypted entries not supported');\n }\n const buffer = await readAs(reader, rawEntry.relativeOffsetOfLocalHeader, 30);\n // note: maybe this should be passed in or cached on entry\n // as it's async so there will be at least one tick (not sure about that)\n const totalLength = await reader.getLength();\n // 0 - Local file header signature = 0x04034b50\n const signature = getUint32LE(buffer, 0);\n if (signature !== 0x04034b50) {\n throw new Error(`invalid local file header signature: 0x${signature.toString(16)}`);\n }\n // all this should be redundant\n // 4 - Version needed to extract (minimum)\n // 6 - General purpose bit flag\n // 8 - Compression method\n // 10 - File last modification time\n // 12 - File last modification date\n // 14 - CRC-32\n // 18 - Compressed size\n // 22 - Uncompressed size\n // 26 - File name length (n)\n const fileNameLength = getUint16LE(buffer, 26);\n // 28 - Extra field length (m)\n const extraFieldLength = getUint16LE(buffer, 28);\n // 30 - File name\n // 30+n - Extra field\n const localFileHeaderEnd = rawEntry.relativeOffsetOfLocalHeader + buffer.length + fileNameLength + extraFieldLength;\n let decompress;\n if (rawEntry.compressionMethod === 0) {\n // 0 - The file is stored (no compression)\n decompress = false;\n }\n else if (rawEntry.compressionMethod === 8) {\n // 8 - The file is Deflated\n decompress = true;\n }\n else {\n throw new Error(`unsupported compression method: ${rawEntry.compressionMethod}`);\n }\n const fileDataStart = localFileHeaderEnd;\n const fileDataEnd = fileDataStart + rawEntry.compressedSize;\n if (rawEntry.compressedSize !== 0) {\n // bounds check now, because the read streams will probably not complain loud enough.\n // since we're dealing with an unsigned offset plus an unsigned size,\n // we only have 1 thing to check for.\n if (fileDataEnd > totalLength) {\n throw new Error(`file data overflows file bounds: ${fileDataStart} + ${rawEntry.compressedSize} > ${totalLength}`);\n }\n }\n return {\n decompress,\n fileDataStart,\n };\n}\nasync function readEntryDataAsArrayBuffer(reader, rawEntry) {\n const { decompress, fileDataStart } = await readEntryDataHeader(reader, rawEntry);\n if (!decompress) {\n const dataView = await readAs(reader, fileDataStart, rawEntry.compressedSize);\n // make copy?\n //\n // 1. The source is a Blob/file. In this case we'll get back TypedArray we can just hand to the user\n // 2. The source is a TypedArray. In this case we'll get back TypedArray that is a view into a larger buffer\n // but because ultimately this is used to return an ArrayBuffer to `someEntry.arrayBuffer()`\n // we need to return copy since we need the `ArrayBuffer`, not the TypedArray to exactly match the data.\n // Note: We could add another API function `bytes()` or something that returned a `Uint8Array`\n // instead of an `ArrayBuffer`. This would let us skip a copy here. But this case only happens for uncompressed\n // data. That seems like a rare enough case that adding a new API is not worth it? Or is it? A zip of jpegs or mp3s\n // might not be compressed. For now that's a TBD.\n return isTypedArraySameAsArrayBuffer(dataView) ? dataView.buffer : dataView.slice().buffer;\n }\n // see comment in readEntryDateAsBlob\n const typedArrayOrBlob = await readAsBlobOrTypedArray(reader, fileDataStart, rawEntry.compressedSize);\n const result = await inflateRawAsync(typedArrayOrBlob instanceof Uint8Array ? typedArrayOrBlob : typedArrayOrBlob, rawEntry.uncompressedSize);\n return result;\n}\nasync function readEntryDataAsBlob(reader, rawEntry, type) {\n const { decompress, fileDataStart } = await readEntryDataHeader(reader, rawEntry);\n if (!decompress) {\n const typedArrayOrBlob = await readAsBlobOrTypedArray(reader, fileDataStart, rawEntry.compressedSize, type);\n if (isBlob(typedArrayOrBlob)) {\n return typedArrayOrBlob;\n }\n return new Blob([typedArrayOrBlob], { type });\n }\n // Here's the issue with this mess (should refactor?)\n // if the source is a blob then we really want to pass a blob to inflateRawAsync to avoid a large\n // copy if we're going to a worker.\n const typedArrayOrBlob = await readAsBlobOrTypedArray(reader, fileDataStart, rawEntry.compressedSize);\n const result = await inflateRawAsync(typedArrayOrBlob instanceof Uint8Array ? typedArrayOrBlob : typedArrayOrBlob, rawEntry.uncompressedSize, type);\n return result;\n}\nfunction setOptions(options) {\n setOptions$1(options);\n}\nasync function unzipRaw(source) {\n let reader;\n if (typeof Blob !== 'undefined' && source instanceof Blob) {\n reader = new BlobReader(source);\n }\n else if (source instanceof ArrayBuffer || (source && source.buffer && source.buffer instanceof ArrayBuffer)) {\n reader = new ArrayBufferReader(source);\n }\n else if (isSharedArrayBuffer(source) || isSharedArrayBuffer(source.buffer)) {\n reader = new ArrayBufferReader(source);\n }\n else if (typeof source === 'string') {\n const req = await fetch(source);\n if (!req.ok) {\n throw new Error(`failed http request ${source}, status: ${req.status}: ${req.statusText}`);\n }\n const blob = await req.blob();\n reader = new BlobReader(blob);\n }\n else if (typeof source.getLength === 'function' && typeof source.read === 'function') {\n reader = source;\n }\n else {\n throw new Error('unsupported source type');\n }\n const totalLength = await reader.getLength();\n if (totalLength > Number.MAX_SAFE_INTEGER) {\n throw new Error(`file too large. size: ${totalLength}. Only file sizes up 4503599627370496 bytes are supported`);\n }\n return await findEndOfCentralDirector(reader, totalLength);\n}\n// If the names are not utf8 you should use unzipitRaw\nasync function unzip(source) {\n const { zip, entries } = await unzipRaw(source);\n return {\n zip,\n entries: Object.fromEntries(entries.map(v => [v.name, v])),\n };\n}\nfunction cleanup() {\n cleanup$1();\n}\n\nexport { ArrayBufferReader, BlobReader, HTTPRangeReader, ZipEntry, cleanup, setOptions, unzip, unzipRaw };\n",
|
|
6
|
+
"// Platform-specific termios constants for bun:ffi serial port access.\n// Values differ between Linux and macOS — we detect at import time.\n\nimport { platform } from 'node:os'\n\nconst IS_LINUX = platform() === 'linux'\nconst IS_DARWIN = platform() === 'darwin'\n\nif (!IS_LINUX && !IS_DARWIN) {\n throw new Error(`bun-serialport: unsupported platform \"${platform()}\"`)\n}\n\n// --- Open flags ---\nexport const O_RDWR = 2\nexport const O_NOCTTY = IS_LINUX ? 256 : 0x20000\nexport const O_NONBLOCK = IS_LINUX ? 2048 : 4\n\n// --- fcntl ---\nexport const F_GETFL = IS_LINUX ? 3 : 3\nexport const F_SETFL = IS_LINUX ? 4 : 4\n\n// --- tcsetattr actions ---\nexport const TCSANOW = 0\nexport const TCSADRAIN = 1\nexport const TCSAFLUSH = 2\n\n// --- tcflush queue selectors ---\nexport const TCIFLUSH = IS_LINUX ? 0 : 1\nexport const TCOFLUSH = IS_LINUX ? 1 : 2\nexport const TCIOFLUSH = IS_LINUX ? 2 : 3\n\n// --- Control flags (c_cflag) ---\nexport const CSIZE = IS_LINUX ? 0x30 : 0x300\nexport const CS5 = IS_LINUX ? 0x00 : 0x000\nexport const CS6 = IS_LINUX ? 0x10 : 0x100\nexport const CS7 = IS_LINUX ? 0x20 : 0x200\nexport const CS8 = IS_LINUX ? 0x30 : 0x300\nexport const CSTOPB = IS_LINUX ? 0x40 : 0x400\nexport const CREAD = IS_LINUX ? 0x80 : 0x800\nexport const PARENB = IS_LINUX ? 0x100 : 0x1000\nexport const PARODD = IS_LINUX ? 0x200 : 0x2000\nexport const CLOCAL = IS_LINUX ? 0x800 : 0x8000\nexport const CRTSCTS = IS_LINUX ? 0x80000000 : 0x30000\n\n// --- Input flags (c_iflag) ---\nexport const IGNBRK = 1\nexport const BRKINT = 2\nexport const IGNPAR = 4\nexport const PARMRK = 8\nexport const INPCK = IS_LINUX ? 0x10 : 0x10\nexport const ISTRIP = IS_LINUX ? 0x20 : 0x20\nexport const INLCR = IS_LINUX ? 0x40 : 0x40\nexport const IGNCR = IS_LINUX ? 0x80 : 0x80\nexport const ICRNL = IS_LINUX ? 0x100 : 0x100\nexport const IXON = IS_LINUX ? 0x400 : 0x200\nexport const IXOFF = IS_LINUX ? 0x1000 : 0x400\nexport const IXANY = IS_LINUX ? 0x800 : 0x800\n\n// --- Output flags (c_oflag) ---\nexport const OPOST = 1\n\n// --- Local flags (c_lflag) ---\nexport const ISIG = IS_LINUX ? 1 : 0x80\nexport const ICANON = IS_LINUX ? 2 : 0x100\nexport const ECHO = IS_LINUX ? 8 : 0x8\nexport const ECHOE = IS_LINUX ? 0x10 : 0x2\nexport const ECHOK = IS_LINUX ? 0x20 : 0x4\nexport const ECHONL = IS_LINUX ? 0x40 : 0x10\nexport const NOFLSH = IS_LINUX ? 0x80 : 0x80000000\nexport const TOSTOP = IS_LINUX ? 0x100 : 0x400000\nexport const IEXTEN = IS_LINUX ? 0x8000 : 0x400\n\n// --- Special character indices ---\nexport const VMIN = IS_LINUX ? 6 : 16\nexport const VTIME = IS_LINUX ? 5 : 17\nexport const NCCS = IS_LINUX ? 32 : 20\n\n// --- ioctl modem control ---\nexport const TIOCMGET = IS_LINUX ? 0x5415 : 0x4004746a\nexport const TIOCMSET = IS_LINUX ? 0x5418 : 0x8004746d\nexport const TIOCMBIS = IS_LINUX ? 0x5416 : 0x8004746c\nexport const TIOCMBIC = IS_LINUX ? 0x5417 : 0x8004746b\n\n// --- Modem line bits ---\nexport const TIOCM_DTR = 0x002\nexport const TIOCM_RTS = 0x004\nexport const TIOCM_CTS = 0x020\nexport const TIOCM_DSR = 0x100\nexport const TIOCM_CD = 0x040\nexport const TIOCM_RI = 0x080\n\n// --- termios struct layout ---\n// Linux: tcflag_t = uint32, cc_t = uint8, speed_t = uint32, NCCS = 32\n// struct: c_iflag(4) + c_oflag(4) + c_cflag(4) + c_lflag(4) + c_line(1) + c_cc[32](32) + pad(3) + c_ispeed(4) + c_ospeed(4) = 60\n// macOS: tcflag_t = unsigned long (8 on 64-bit), cc_t = uint8, speed_t = unsigned long (8), NCCS = 20\n// struct: c_iflag(8) + c_oflag(8) + c_cflag(8) + c_lflag(8) + c_cc[20](20) + pad(4) + c_ispeed(8) + c_ospeed(8) = 72\n\nexport const TERMIOS_SIZE = IS_LINUX ? 60 : 72\nexport const TCFLAG_SIZE = IS_LINUX ? 4 : 8\nexport const SPEED_SIZE = IS_LINUX ? 4 : 8\n\n// Offsets into the termios struct\nexport const TERMIOS_OFFSETS = IS_LINUX\n ? { c_iflag: 0, c_oflag: 4, c_cflag: 8, c_lflag: 12, c_line: 16, c_cc: 17, c_ispeed: 52, c_ospeed: 56 }\n : { c_iflag: 0, c_oflag: 8, c_cflag: 16, c_lflag: 24, c_cc: 32, c_ispeed: 56, c_ospeed: 64 }\n\n// --- Baud rate mapping ---\n// Linux uses encoded constants; macOS uses the literal baud rate value.\nconst LINUX_BAUD_MAP = {\n 0: 0, 110: 3, 300: 7, 600: 8, 1200: 9, 2400: 11, 4800: 12,\n 9600: 13, 19200: 14, 38400: 15, 57600: 0x1001, 115200: 0x1002,\n 230400: 0x1003, 460800: 0x1004, 500000: 0x1005, 576000: 0x1006,\n 921600: 0x1007, 1000000: 0x1008, 1152000: 0x1009, 1500000: 0x100a,\n 2000000: 0x100b, 2500000: 0x100c, 3000000: 0x100d, 3500000: 0x100e,\n 4000000: 0x100f\n}\n\nexport function encodeBaudRate(rate) {\n if (IS_DARWIN) return rate // macOS uses literal values\n const encoded = LINUX_BAUD_MAP[rate]\n if (encoded === undefined) throw new Error(`Unsupported baud rate: ${rate}`)\n return encoded\n}\n\nexport function dataBitsFlag(bits) {\n switch (bits) {\n case 5: return CS5\n case 6: return CS6\n case 7: return CS7\n case 8: return CS8\n default: throw new Error(`Invalid data bits: ${bits}`)\n }\n}\n",
|
|
7
|
+
"// POSIX serial port bindings via bun:ffi.\n// Calls libc directly — no native addon, no compilation step.\n\nimport { dlopen, FFIType, ptr, toArrayBuffer, CString } from 'bun:ffi'\nimport {\n O_RDWR, O_NOCTTY, O_NONBLOCK,\n TCSADRAIN, TCSAFLUSH, TCIOFLUSH,\n CSIZE, CREAD, CLOCAL, CSTOPB, PARENB, PARODD, CRTSCTS,\n INPCK, IXON, IXOFF,\n VMIN, VTIME, NCCS,\n TIOCMGET, TIOCMBIS, TIOCMBIC,\n TIOCM_DTR, TIOCM_RTS, TIOCM_CTS, TIOCM_DSR, TIOCM_CD, TIOCM_RI,\n TERMIOS_SIZE, TCFLAG_SIZE, TERMIOS_OFFSETS,\n encodeBaudRate, dataBitsFlag\n} from './constants.js'\nimport { platform } from 'node:os'\n\nconst IS_LINUX = platform() === 'linux'\nconst IS_DARWIN = platform() === 'darwin'\n\n// Load libc\nconst LIBC_PATH = IS_LINUX ? 'libc.so.6' : 'libSystem.B.dylib'\n\nconst libc = dlopen(LIBC_PATH, {\n open: { args: [FFIType.cstring, FFIType.i32], returns: FFIType.i32 },\n close: { args: [FFIType.i32], returns: FFIType.i32 },\n read: { args: [FFIType.i32, FFIType.ptr, FFIType.u64], returns: FFIType.i64 },\n write: { args: [FFIType.i32, FFIType.ptr, FFIType.u64], returns: FFIType.i64 },\n tcgetattr: { args: [FFIType.i32, FFIType.ptr], returns: FFIType.i32 },\n tcsetattr: { args: [FFIType.i32, FFIType.i32, FFIType.ptr], returns: FFIType.i32 },\n tcflush: { args: [FFIType.i32, FFIType.i32], returns: FFIType.i32 },\n tcdrain: { args: [FFIType.i32], returns: FFIType.i32 },\n cfsetispeed: { args: [FFIType.ptr, FFIType.u64], returns: FFIType.i32 },\n cfsetospeed: { args: [FFIType.ptr, FFIType.u64], returns: FFIType.i32 },\n fcntl: { args: [FFIType.i32, FFIType.i32, FFIType.i32], returns: FFIType.i32 },\n ioctl: { args: [FFIType.i32, FFIType.u64, FFIType.ptr], returns: FFIType.i32 },\n strerror: { args: [FFIType.i32], returns: FFIType.ptr },\n})\n\n// Bun FFI doesn't expose errno directly. We read it from the thread-local.\n// For now, we use __errno_location (Linux) or __error (macOS) to get errno pointer.\nconst errnoLib = dlopen(LIBC_PATH, IS_LINUX\n ? { __errno_location: { args: [], returns: FFIType.ptr } }\n : { __error: { args: [], returns: FFIType.ptr } }\n)\n\nfunction getErrno() {\n const errPtr = IS_LINUX\n ? errnoLib.symbols.__errno_location()\n : errnoLib.symbols.__error()\n const view = new DataView(toArrayBuffer(errPtr, 0, 4))\n return view.getInt32(0, true)\n}\n\nfunction errnoError(syscall) {\n const code = getErrno()\n const msgPtr = libc.symbols.strerror(code)\n const msg = msgPtr ? new CString(msgPtr) : `errno ${code}`\n const err = new Error(`${syscall}: ${msg}`)\n err.code = code\n err.syscall = syscall\n return err\n}\n\n// --- termios struct helpers ---\n\nfunction readFlag(buf, offset) {\n if (TCFLAG_SIZE === 4) {\n return buf.getUint32(offset, true)\n }\n // macOS: 8-byte unsigned long, read lower 32 bits (baud/flag values fit in 32 bits)\n return Number(buf.getBigUint64(offset, true))\n}\n\nfunction writeFlag(buf, offset, value) {\n if (TCFLAG_SIZE === 4) {\n buf.setUint32(offset, value >>> 0, true)\n } else {\n buf.setBigUint64(offset, BigInt(value >>> 0), true)\n }\n}\n\nfunction writeSpeed(buf, offset, value) {\n if (TCFLAG_SIZE === 4) {\n buf.setUint32(offset, value >>> 0, true)\n } else {\n buf.setBigUint64(offset, BigInt(value), true)\n }\n}\n\n// --- Public API ---\n\nexport function openPort(path, options) {\n const {\n baudRate = 9600,\n dataBits = 8,\n stopBits = 1,\n parity = 'none',\n rtscts = false,\n xon = false,\n xoff = false,\n } = options\n\n // Open the device file\n const pathBuf = Buffer.from(path + '\\0', 'utf-8')\n const fd = libc.symbols.open(ptr(pathBuf), O_RDWR | O_NOCTTY | O_NONBLOCK)\n if (fd < 0) throw errnoError('open')\n\n // Get current termios — keep one Uint8Array alive so ptr() stays valid\n const termiosBuf = new ArrayBuffer(TERMIOS_SIZE)\n const termiosBytes = new Uint8Array(termiosBuf)\n const termiosView = new DataView(termiosBuf)\n const termiosPtr = ptr(termiosBytes)\n\n if (libc.symbols.tcgetattr(fd, termiosPtr) < 0) {\n libc.symbols.close(fd)\n throw errnoError('tcgetattr')\n }\n\n const off = TERMIOS_OFFSETS\n\n // Build c_cflag: clear CSIZE, set data bits, enable receiver + local\n let cflag = readFlag(termiosView, off.c_cflag)\n cflag &= ~CSIZE\n cflag |= dataBitsFlag(dataBits)\n cflag |= CREAD | CLOCAL\n\n // Stop bits\n if (stopBits === 2) cflag |= CSTOPB\n else cflag &= ~CSTOPB\n\n // Parity\n if (parity === 'none') {\n cflag &= ~(PARENB | PARODD)\n } else if (parity === 'even') {\n cflag |= PARENB\n cflag &= ~PARODD\n } else if (parity === 'odd') {\n cflag |= PARENB | PARODD\n }\n\n // Hardware flow control\n if (rtscts) cflag |= CRTSCTS\n else cflag &= ~CRTSCTS\n\n writeFlag(termiosView, off.c_cflag, cflag)\n\n // Input flags: raw mode — clear everything\n let iflag = 0\n if (parity !== 'none') iflag |= INPCK\n if (xon) iflag |= IXON\n if (xoff) iflag |= IXOFF\n writeFlag(termiosView, off.c_iflag, iflag)\n\n // Output flags: raw\n writeFlag(termiosView, off.c_oflag, 0)\n\n // Local flags: raw\n writeFlag(termiosView, off.c_lflag, 0)\n\n // Special characters: VMIN=1, VTIME=0 (blocking read until at least 1 byte)\n const ccOffset = off.c_cc\n // Clear all cc\n for (let i = 0; i < NCCS; i++) termiosBytes[ccOffset + i] = 0\n termiosBytes[ccOffset + VMIN] = 1\n termiosBytes[ccOffset + VTIME] = 0\n\n // Set baud rate\n const baudCode = encodeBaudRate(baudRate)\n if (IS_LINUX) {\n // Linux: write speed into c_ispeed and c_ospeed fields, and also\n // use cfsetispeed/cfsetospeed for the flag bits\n writeSpeed(termiosView, off.c_ispeed, baudCode)\n writeSpeed(termiosView, off.c_ospeed, baudCode)\n }\n // Use cfsetispeed/cfsetospeed which handles platform differences\n if (libc.symbols.cfsetispeed(termiosPtr, baudCode) < 0) {\n libc.symbols.close(fd)\n throw errnoError('cfsetispeed')\n }\n if (libc.symbols.cfsetospeed(termiosPtr, baudCode) < 0) {\n libc.symbols.close(fd)\n throw errnoError('cfsetospeed')\n }\n\n // Apply\n if (libc.symbols.tcsetattr(fd, TCSAFLUSH, termiosPtr) < 0) {\n libc.symbols.close(fd)\n throw errnoError('tcsetattr')\n }\n\n // Flush any stale data\n libc.symbols.tcflush(fd, TCIOFLUSH)\n\n return fd\n}\n\nexport function closePort(fd) {\n if (libc.symbols.close(fd) < 0) throw errnoError('close')\n}\n\nconst MAX_EAGAIN_RETRIES = 1000\n\nexport function writePort(fd, data) {\n // data should be Uint8Array or Buffer\n const buf = data instanceof Uint8Array ? data : Buffer.from(data, 'utf-8')\n let offset = 0\n let eagainCount = 0\n while (offset < buf.length) {\n const slice = buf.subarray(offset)\n const written = Number(libc.symbols.write(fd, ptr(slice), BigInt(slice.length)))\n if (written < 0) {\n const code = getErrno()\n if (code === 11 || code === 35) {\n // EAGAIN / EWOULDBLOCK — kernel buffer full\n if (++eagainCount > MAX_EAGAIN_RETRIES) {\n throw new Error('write: device not accepting data (EAGAIN limit exceeded)')\n }\n continue\n }\n throw errnoError('write')\n }\n eagainCount = 0\n offset += written\n }\n return offset\n}\n\nexport function readPort(fd, buffer) {\n // Non-blocking read into the provided buffer\n const n = Number(libc.symbols.read(fd, ptr(buffer), BigInt(buffer.length)))\n if (n < 0) {\n const code = getErrno()\n if (code === 11 || code === 35) return 0 // EAGAIN — no data available\n throw errnoError('read')\n }\n return n\n}\n\nexport function updateBaudRate(fd, baudRate) {\n const termiosBuf = new ArrayBuffer(TERMIOS_SIZE)\n const termiosPtr = ptr(new Uint8Array(termiosBuf))\n\n if (libc.symbols.tcgetattr(fd, termiosPtr) < 0) throw errnoError('tcgetattr')\n\n const baudCode = encodeBaudRate(baudRate)\n if (libc.symbols.cfsetispeed(termiosPtr, baudCode) < 0) throw errnoError('cfsetispeed')\n if (libc.symbols.cfsetospeed(termiosPtr, baudCode) < 0) throw errnoError('cfsetospeed')\n\n if (IS_LINUX) {\n const view = new DataView(termiosBuf)\n writeSpeed(view, TERMIOS_OFFSETS.c_ispeed, baudCode)\n writeSpeed(view, TERMIOS_OFFSETS.c_ospeed, baudCode)\n }\n\n if (libc.symbols.tcsetattr(fd, TCSADRAIN, termiosPtr) < 0) throw errnoError('tcsetattr')\n}\n\nexport function setModemLines(fd, flags) {\n const { dtr, rts, brk } = flags\n const intBuf = new ArrayBuffer(4)\n const intView = new DataView(intBuf)\n const intPtr = ptr(new Uint8Array(intBuf))\n\n // Set lines that are explicitly true\n let bitsToSet = 0\n let bitsToClear = 0\n\n if (dtr === true) bitsToSet |= TIOCM_DTR\n if (dtr === false) bitsToClear |= TIOCM_DTR\n if (rts === true) bitsToSet |= TIOCM_RTS\n if (rts === false) bitsToClear |= TIOCM_RTS\n\n if (bitsToSet) {\n intView.setInt32(0, bitsToSet, true)\n if (libc.symbols.ioctl(fd, TIOCMBIS, intPtr) < 0) throw errnoError('ioctl TIOCMBIS')\n }\n if (bitsToClear) {\n intView.setInt32(0, bitsToClear, true)\n if (libc.symbols.ioctl(fd, TIOCMBIC, intPtr) < 0) throw errnoError('ioctl TIOCMBIC')\n }\n}\n\nexport function getModemLines(fd) {\n const intBuf = new ArrayBuffer(4)\n const intView = new DataView(intBuf)\n const intPtr = ptr(new Uint8Array(intBuf))\n\n if (libc.symbols.ioctl(fd, TIOCMGET, intPtr) < 0) throw errnoError('ioctl TIOCMGET')\n\n const bits = intView.getInt32(0, true)\n return {\n cts: !!(bits & TIOCM_CTS),\n dsr: !!(bits & TIOCM_DSR),\n dcd: !!(bits & TIOCM_CD),\n ri: !!(bits & TIOCM_RI),\n }\n}\n\nexport function flushPort(fd) {\n if (libc.symbols.tcflush(fd, TCIOFLUSH) < 0) throw errnoError('tcflush')\n}\n\nexport function drainPort(fd) {\n if (libc.symbols.tcdrain(fd) < 0) throw errnoError('tcdrain')\n}\n",
|
|
8
|
+
"// SerialPort — EventEmitter-based serial port for Bun.\n// Opens a serial device via POSIX termios FFI, reads in a non-blocking loop,\n// and emits data as Uint8Array chunks.\n\nimport { EventEmitter } from 'node:events'\nimport {\n openPort, closePort, writePort, readPort,\n updateBaudRate, setModemLines, getModemLines,\n flushPort, drainPort\n} from './bindings/posix.js'\n\nconst DEFAULT_READ_BUFFER_SIZE = 65536\nconst DEFAULT_READ_INTERVAL_MS = 1\n\nexport class SerialPort extends EventEmitter {\n #fd = -1\n #path\n #baudRate\n #options\n #isOpen = false\n #isClosing = false\n #readBuf\n #readInterval\n #readTimer = null\n\n constructor(options) {\n super()\n if (!options || !options.path) throw new Error('options.path is required')\n if (!options.baudRate) throw new Error('options.baudRate is required')\n\n this.#path = options.path\n this.#baudRate = options.baudRate\n this.#options = { ...options }\n this.#readBuf = new Uint8Array(options.readBufferSize || DEFAULT_READ_BUFFER_SIZE)\n this.#readInterval = options.readInterval || DEFAULT_READ_INTERVAL_MS\n\n if (options.autoOpen !== false) {\n // Defer to next tick so caller can attach event listeners\n queueMicrotask(() => this.open().catch(err => this.emit('error', err)))\n }\n }\n\n get path() { return this.#path }\n get baudRate() { return this.#baudRate }\n get isOpen() { return this.#isOpen && !this.#isClosing }\n\n async open() {\n if (this.#isOpen) throw new Error('Port is already open')\n\n try {\n this.#fd = openPort(this.#path, this.#options)\n this.#isOpen = true\n this.#isClosing = false\n this.#startReading()\n this.emit('open')\n } catch (err) {\n this.#isOpen = false\n throw err\n }\n }\n\n async close() {\n if (!this.#isOpen) throw new Error('Port is not open')\n if (this.#isClosing) return\n\n this.#isClosing = true\n this.#stopReading()\n\n try {\n closePort(this.#fd)\n } catch (err) {\n this.#isClosing = false\n throw err\n }\n\n this.#fd = -1\n this.#isOpen = false\n this.#isClosing = false\n this.emit('close')\n }\n\n async write(data) {\n if (!this.#isOpen || this.#isClosing) {\n throw new Error('Port is not open')\n }\n\n const buf = typeof data === 'string'\n ? Buffer.from(data, 'utf-8')\n : data\n\n return writePort(this.#fd, buf)\n }\n\n async update(options) {\n if (!this.#isOpen) throw new Error('Port is not open')\n\n if (options.baudRate !== undefined) {\n updateBaudRate(this.#fd, options.baudRate)\n this.#baudRate = options.baudRate\n }\n }\n\n async set(flags) {\n if (!this.#isOpen) throw new Error('Port is not open')\n setModemLines(this.#fd, flags)\n }\n\n async get() {\n if (!this.#isOpen) throw new Error('Port is not open')\n return getModemLines(this.#fd)\n }\n\n async flush() {\n if (!this.#isOpen) throw new Error('Port is not open')\n flushPort(this.#fd)\n }\n\n async drain() {\n if (!this.#isOpen) throw new Error('Port is not open')\n drainPort(this.#fd)\n }\n\n // Wire a parser to receive data events\n pipe(parser) {\n const handler = (chunk) => parser.push(chunk)\n this.on('data', handler)\n parser._unpipe = () => this.off('data', handler)\n return parser\n }\n\n // Detach a previously piped parser\n unpipe(parser) {\n if (parser && typeof parser._unpipe === 'function') {\n parser._unpipe()\n parser._unpipe = undefined\n }\n }\n\n // --- Private ---\n\n #startReading() {\n // Non-blocking read loop using setInterval.\n // Bun doesn't currently expose epoll/kqueue for arbitrary fds,\n // so we poll with a tight interval. 1ms is a good balance for\n // robotics — low latency without busy-spinning.\n this.#readTimer = setInterval(() => {\n if (!this.#isOpen || this.#isClosing) return\n\n try {\n const n = readPort(this.#fd, this.#readBuf)\n if (n > 0) {\n // Emit a copy so the read buffer can be reused\n const data = this.#readBuf.slice(0, n)\n this.emit('data', data)\n }\n } catch (err) {\n err.disconnected = true\n this.emit('error', err)\n this.close().catch(() => {})\n }\n }, this.#readInterval)\n }\n\n #stopReading() {\n if (this.#readTimer !== null) {\n clearInterval(this.#readTimer)\n this.#readTimer = null\n }\n }\n}\n",
|
|
9
|
+
"// Enumerate available serial ports.\n// Linux: scan /sys/class/tty and /dev/\n// macOS: scan /dev/ for cu.* and tty.* devices\n\nimport { platform } from 'node:os'\nimport { readdir, readlink, access } from 'node:fs/promises'\nimport { join } from 'node:path'\n\nconst IS_LINUX = platform() === 'linux'\n\nasync function exists(path) {\n try { await access(path); return true } catch { return false }\n}\n\nasync function readFileQuiet(path) {\n try { return (await Bun.file(path).text()).trim() } catch { return '' }\n}\n\nasync function listLinux() {\n const ttys = await readdir('/sys/class/tty').catch(() => [])\n\n // Filter to real serial devices in parallel\n const checks = ttys.map(async (name) => {\n const sysPath = `/sys/class/tty/${name}`\n const devicePath = join(sysPath, 'device')\n if (!await exists(devicePath)) return null\n\n const devPath = `/dev/${name}`\n if (!await exists(devPath)) return null\n\n return { name, devPath, devicePath }\n })\n\n const valid = (await Promise.all(checks)).filter(Boolean)\n\n // Read USB metadata in parallel for each valid port\n const ports = await Promise.all(valid.map(async ({ devPath, devicePath }) => {\n const info = { path: devPath }\n\n const subsystem = await readlink(join(devicePath, 'subsystem')).catch(() => '')\n if (subsystem.includes('usb-serial') || subsystem.includes('usb')) {\n const usbDevice = await findUsbParent(devicePath)\n if (usbDevice) {\n const [manufacturer, serialNumber, vendorId, productId, product] = await Promise.all([\n readFileQuiet(join(usbDevice, 'manufacturer')),\n readFileQuiet(join(usbDevice, 'serial')),\n readFileQuiet(join(usbDevice, 'idVendor')),\n readFileQuiet(join(usbDevice, 'idProduct')),\n readFileQuiet(join(usbDevice, 'product')),\n ])\n info.manufacturer = manufacturer\n info.serialNumber = serialNumber\n info.vendorId = vendorId\n info.productId = productId\n info.product = product\n }\n }\n\n return info\n }))\n\n return ports\n}\n\nasync function findUsbParent(devicePath) {\n let current = devicePath\n for (let i = 0; i < 10; i++) {\n current = join(current, '..')\n if (await exists(join(current, 'idVendor'))) return current\n }\n return null\n}\n\nasync function listDarwin() {\n const devFiles = await readdir('/dev').catch(() => [])\n const seen = new Map() // device suffix -> port info\n\n for (const name of devFiles) {\n if (!name.startsWith('cu.') && !name.startsWith('tty.')) continue\n if (name === 'tty') continue\n\n const isCu = name.startsWith('cu.')\n const suffix = name.slice(isCu ? 3 : 4)\n\n // Prefer cu.* over tty.* (cu.* doesn't wait for carrier detect)\n if (seen.has(suffix) && !isCu) continue\n\n seen.set(suffix, { path: `/dev/${name}` })\n }\n\n return [...seen.values()]\n}\n\nexport async function list() {\n return IS_LINUX ? listLinux() : listDarwin()\n}\n",
|
|
10
|
+
"// Delimiter parser — splits incoming data on a delimiter byte or byte sequence.\n// Emits complete messages (without the delimiter) via EventEmitter 'data' event.\n\nimport { EventEmitter } from 'node:events'\n\nexport function delimiterParser(options = {}) {\n const { delimiter = 0x0a, includeDelimiter = false } = options\n\n // Normalize delimiter to Uint8Array\n const delim = typeof delimiter === 'number'\n ? new Uint8Array([delimiter])\n : typeof delimiter === 'string'\n ? new TextEncoder().encode(delimiter)\n : new Uint8Array(delimiter)\n\n const emitter = new EventEmitter()\n let buf = new Uint8Array(256)\n let len = 0\n\n function ensureCapacity(needed) {\n if (needed <= buf.length) return\n let cap = buf.length\n while (cap < needed) cap *= 2\n const next = new Uint8Array(cap)\n next.set(buf.subarray(0, len))\n buf = next\n }\n\n function push(chunk) {\n ensureCapacity(len + chunk.length)\n buf.set(chunk, len)\n len += chunk.length\n\n // Scan for delimiter\n let start = 0\n while (start <= len - delim.length) {\n const idx = findDelimiter(buf, delim, start, len)\n if (idx === -1) break\n\n const end = includeDelimiter ? idx + delim.length : idx\n if (end > start) {\n emitter.emit('data', buf.slice(start, end))\n }\n start = idx + delim.length\n }\n\n // Compact remainder\n if (start > 0) {\n const remaining = len - start\n if (remaining > 0) buf.copyWithin(0, start, len)\n len = remaining\n }\n }\n\n emitter.push = push\n return emitter\n}\n\nfunction findDelimiter(haystack, needle, start, haystackLen) {\n if (needle.length === 1) {\n const byte = needle[0]\n for (let i = start; i < haystackLen; i++) {\n if (haystack[i] === byte) return i\n }\n return -1\n }\n const limit = haystackLen - needle.length\n outer: for (let i = start; i <= limit; i++) {\n for (let j = 0; j < needle.length; j++) {\n if (haystack[i + j] !== needle[j]) continue outer\n }\n return i\n }\n return -1\n}\n",
|
|
11
|
+
"// Byte-length parser — emits chunks of exactly N bytes.\n\nimport { EventEmitter } from 'node:events'\n\nexport function byteLengthParser(options = {}) {\n const { length = 1 } = options\n if (length < 1) throw new Error('length must be >= 1')\n\n const emitter = new EventEmitter()\n let buf = new Uint8Array(Math.max(length * 2, 256))\n let len = 0\n\n function ensureCapacity(needed) {\n if (needed <= buf.length) return\n let cap = buf.length\n while (cap < needed) cap *= 2\n const next = new Uint8Array(cap)\n next.set(buf.subarray(0, len))\n buf = next\n }\n\n function push(chunk) {\n ensureCapacity(len + chunk.length)\n buf.set(chunk, len)\n len += chunk.length\n\n while (len >= length) {\n emitter.emit('data', buf.slice(0, length))\n const remaining = len - length\n if (remaining > 0) buf.copyWithin(0, length, len)\n len = remaining\n }\n }\n\n emitter.push = push\n return emitter\n}\n",
|
|
12
|
+
"// Readline parser — convenience wrapper around delimiter parser.\n// Splits on newline, returns strings.\n\nimport { delimiterParser } from './delimiter.js'\n\nexport function readlineParser(options = {}) {\n const { delimiter = '\\n', encoding = 'utf-8' } = options\n const inner = delimiterParser({ delimiter })\n const decoder = new TextDecoder(encoding)\n\n // Wrap the inner emitter to decode data to string\n const origOn = inner.on.bind(inner)\n const origOnce = inner.once.bind(inner)\n const origOff = inner.off.bind(inner)\n const listeners = new Map()\n\n function wrapFn(fn) {\n const wrapped = (buf) => fn(decoder.decode(buf))\n listeners.set(fn, wrapped)\n return wrapped\n }\n\n inner.on = function (event, fn) {\n if (event === 'data') return origOn('data', wrapFn(fn))\n return origOn(event, fn)\n }\n\n inner.once = function (event, fn) {\n if (event === 'data') return origOnce('data', wrapFn(fn))\n return origOnce(event, fn)\n }\n\n inner.off = function (event, fn) {\n if (event === 'data' && listeners.has(fn)) {\n const wrapped = listeners.get(fn)\n listeners.delete(fn)\n return origOff('data', wrapped)\n }\n return origOff(event, fn)\n }\n\n // Alias removeListener to off for full EventEmitter compat\n inner.removeListener = inner.off\n\n return inner\n}\n",
|
|
13
|
+
"export { delimiterParser } from './delimiter.js'\nexport { byteLengthParser } from './byte-length.js'\nexport { readlineParser } from './readline.js'\n",
|
|
14
|
+
"export { SerialPort } from './serialport.js'\nexport { list } from './list.js'\nexport { delimiterParser, byteLengthParser, readlineParser } from './parsers/index.js'\n",
|
|
15
|
+
"function toArr(any) {\n\treturn any == null ? [] : Array.isArray(any) ? any : [any];\n}\n\nfunction toVal(out, key, val, opts) {\n\tvar x, old=out[key], nxt=(\n\t\t!!~opts.string.indexOf(key) ? (val == null || val === true ? '' : String(val))\n\t\t: typeof val === 'boolean' ? val\n\t\t: !!~opts.boolean.indexOf(key) ? (val === 'false' ? false : val === 'true' || (out._.push((x = +val,x * 0 === 0) ? x : val),!!val))\n\t\t: (x = +val,x * 0 === 0) ? x : val\n\t);\n\tout[key] = old == null ? nxt : (Array.isArray(old) ? old.concat(nxt) : [old, nxt]);\n}\n\nexport default function (args, opts) {\n\targs = args || [];\n\topts = opts || {};\n\n\tvar k, arr, arg, name, val, out={ _:[] };\n\tvar i=0, j=0, idx=0, len=args.length;\n\n\tconst alibi = opts.alias !== void 0;\n\tconst strict = opts.unknown !== void 0;\n\tconst defaults = opts.default !== void 0;\n\n\topts.alias = opts.alias || {};\n\topts.string = toArr(opts.string);\n\topts.boolean = toArr(opts.boolean);\n\n\tif (alibi) {\n\t\tfor (k in opts.alias) {\n\t\t\tarr = opts.alias[k] = toArr(opts.alias[k]);\n\t\t\tfor (i=0; i < arr.length; i++) {\n\t\t\t\t(opts.alias[arr[i]] = arr.concat(k)).splice(i, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (i=opts.boolean.length; i-- > 0;) {\n\t\tarr = opts.alias[opts.boolean[i]] || [];\n\t\tfor (j=arr.length; j-- > 0;) opts.boolean.push(arr[j]);\n\t}\n\n\tfor (i=opts.string.length; i-- > 0;) {\n\t\tarr = opts.alias[opts.string[i]] || [];\n\t\tfor (j=arr.length; j-- > 0;) opts.string.push(arr[j]);\n\t}\n\n\tif (defaults) {\n\t\tfor (k in opts.default) {\n\t\t\tname = typeof opts.default[k];\n\t\t\tarr = opts.alias[k] = opts.alias[k] || [];\n\t\t\tif (opts[name] !== void 0) {\n\t\t\t\topts[name].push(k);\n\t\t\t\tfor (i=0; i < arr.length; i++) {\n\t\t\t\t\topts[name].push(arr[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst keys = strict ? Object.keys(opts.alias) : [];\n\n\tfor (i=0; i < len; i++) {\n\t\targ = args[i];\n\n\t\tif (arg === '--') {\n\t\t\tout._ = out._.concat(args.slice(++i));\n\t\t\tbreak;\n\t\t}\n\n\t\tfor (j=0; j < arg.length; j++) {\n\t\t\tif (arg.charCodeAt(j) !== 45) break; // \"-\"\n\t\t}\n\n\t\tif (j === 0) {\n\t\t\tout._.push(arg);\n\t\t} else if (arg.substring(j, j + 3) === 'no-') {\n\t\t\tname = arg.substring(j + 3);\n\t\t\tif (strict && !~keys.indexOf(name)) {\n\t\t\t\treturn opts.unknown(arg);\n\t\t\t}\n\t\t\tout[name] = false;\n\t\t} else {\n\t\t\tfor (idx=j+1; idx < arg.length; idx++) {\n\t\t\t\tif (arg.charCodeAt(idx) === 61) break; // \"=\"\n\t\t\t}\n\n\t\t\tname = arg.substring(j, idx);\n\t\t\tval = arg.substring(++idx) || (i+1 === len || (''+args[i+1]).charCodeAt(0) === 45 || args[++i]);\n\t\t\tarr = (j === 2 ? [name] : name);\n\n\t\t\tfor (idx=0; idx < arr.length; idx++) {\n\t\t\t\tname = arr[idx];\n\t\t\t\tif (strict && !~keys.indexOf(name)) return opts.unknown('-'.repeat(j) + name);\n\t\t\t\ttoVal(out, name, (idx + 1 < arr.length) || val, opts);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (defaults) {\n\t\tfor (k in opts.default) {\n\t\t\tif (out[k] === void 0) {\n\t\t\t\tout[k] = opts.default[k];\n\t\t\t}\n\t\t}\n\t}\n\n\tif (alibi) {\n\t\tfor (k in out) {\n\t\t\tarr = opts.alias[k] || [];\n\t\t\twhile (arr.length > 0) {\n\t\t\t\tout[arr.shift()] = out[k];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn out;\n}\n",
|
|
16
|
+
"import e from\"mri\";const t=\"__all__\",i=\"__default__\",s=\"\\n\";function r(e){if(!e.length)return\"\";let t=function(e){let t=0,i=0,s=0,r=e.length;if(r)for(;r--;)i=e[r].length,i>t&&(s=r,t=i);return e[s].length}(e.map(e=>e[0]))+4;return e.map(e=>e[0]+\" \".repeat(t-e[0].length)+e[1]+(null==e[2]?\"\":` (default ${e[2]})`))}function n(e){return e}function l(e,t,i){if(!t||!t.length)return\"\";let r=0,n=\"\";for(n+=\"\\n \"+e;r<t.length;r++)n+=\"\\n \"+i(t[r]);return n+s}function a(e,t,i=1){let s=l(\"ERROR\",[t],n);s+=`\\n Run \\`$ ${e} --help\\` for more info.\\n`,console.error(s),process.exit(i)}class o{constructor(e,s){let[r,...n]=e.split(/\\s+/);s=s||n.length>0,this.bin=r,this.ver=\"0.0.0\",this.default=\"\",this.tree={},this.command(t),this.command([i].concat(s?n:\"<command>\").join(\" \")),this.single=s,this.curr=\"\"}command(e,t,i={}){if(this.single)throw new Error('Disable \"single\" mode to add commands');let s=[],r=[],n=/(\\[|<)/;if(e.split(/\\s+/).forEach(e=>{(n.test(e.charAt(0))?r:s).push(e)}),s=s.join(\" \"),s in this.tree)throw new Error(\"Command already exists: \"+s);return s.includes(\"__\")||r.unshift(s),r=r.join(\" \"),this.curr=s,i.default&&(this.default=s),this.tree[s]={usage:r,alibi:[],options:[],alias:{},default:{},examples:[]},i.alias&&this.alias(i.alias),t&&this.describe(t),this}describe(e){return this.tree[this.curr||i].describe=Array.isArray(e)?e:function(e){return(e||\"\").replace(/([.?!])\\s*(?=[A-Z])/g,\"$1|\").split(\"|\")}(e),this}alias(...e){if(this.single)throw new Error('Cannot call `alias()` in \"single\" mode');if(!this.curr)throw new Error(\"Cannot call `alias()` before defining a command\");return(this.tree[this.curr].alibi=this.tree[this.curr].alibi.concat(...e)).forEach(e=>this.tree[e]=this.curr),this}option(e,i,s){let r=this.tree[this.curr||t],[n,l]=function(e){return(e||\"\").split(/^-{1,2}|,|\\s+-{1,2}|\\s+/).filter(Boolean)}(e);if(l&&l.length>1&&([n,l]=[l,n]),e=\"--\"+n,l&&l.length>0){e=`-${l}, ${e}`;let t=r.alias[l];r.alias[l]=(t||[]).concat(n)}let a=[e,i||\"\"];return void 0!==s?(a.push(s),r.default[n]=s):l||(r.default[n]=void 0),r.options.push(a),this}action(e){return this.tree[this.curr||i].handler=e,this}example(e){return this.tree[this.curr||i].examples.push(e),this}version(e){return this.ver=e,this}parse(s,r={}){s=s.slice();let n,l,o,h,u=2,f=e(s.slice(u),{alias:{h:\"help\",v:\"version\"}}),c=this.single,p=this.bin,d=\"\";if(c)h=this.tree[i];else{let e,t=1,i=f._.length+1;for(;t<i;t++)if(n=f._.slice(0,t).join(\" \"),e=this.tree[n],\"string\"==typeof e)l=(d=e).split(\" \"),s.splice(s.indexOf(f._[0]),t,...l),t+=l.length-t;else if(e)d=n;else if(d)break;if(h=this.tree[d],o=void 0===h,o)if(this.default)d=this.default,h=this.tree[d],s.unshift(d),u++;else if(n)return a(p,\"Invalid command: \"+n)}if(f.help)return this.help(!c&&!o&&d);if(f.version)return this._version();if(!c&&void 0===h)return a(p,\"No command specified.\");let g=this.tree[t];r.alias=Object.assign(g.alias,h.alias,r.alias),r.default=Object.assign(g.default,h.default,r.default),n=d.split(\" \"),l=s.indexOf(n[0],2),~l&&s.splice(l,n.length);let m=e(s.slice(u),r);if(!m||\"string\"==typeof m)return a(p,m||\"Parsed unknown option flag(s)!\");let b=h.usage.split(/\\s+/),_=b.filter(e=>\"<\"===e.charAt(0)),v=m._.splice(0,_.length);if(v.length<_.length)return d&&(p+=\" \"+d),a(p,\"Insufficient arguments!\");b.filter(e=>\"[\"===e.charAt(0)).forEach(e=>{v.push(m._.shift())}),v.push(m);let $=h.handler;return r.lazy?{args:v,name:d,handler:$}:$.apply(null,v)}help(e){console.log(function(e,a,o,h){let u=\"\",f=a[o],c=\"$ \"+e,p=a[t],d=e=>`${c} ${e}`.replace(/\\s+/g,\" \"),g=[[\"-h, --help\",\"Displays this message\"]];if(o===i&&g.unshift([\"-v, --version\",\"Displays current version\"]),f.options=(f.options||[]).concat(p.options,g),f.options.length>0&&(f.usage+=\" [options]\"),u+=l(\"Description\",f.describe,n),u+=l(\"Usage\",[f.usage],d),h||o!==i)h||o===i||(u+=l(\"Aliases\",f.alibi,d));else{let e,t=/^__/,i=\"\",o=[];for(e in a)\"string\"==typeof a[e]||t.test(e)||o.push([e,(a[e].describe||[\"\"])[0]])<3&&(i+=`\\n ${c} ${e} --help`);u+=l(\"Available Commands\",r(o),n),u+=\"\\n For more info, run any command with the `--help` flag\"+i+s}return u+=l(\"Options\",r(f.options),n),u+=l(\"Examples\",f.examples.map(d),n),u}(this.bin,this.tree,e||i,this.single))}_version(){console.log(`${this.bin}, ${this.ver}`)}}export default(e,t)=>new o(e,t);\n",
|
|
17
|
+
"const ANSI_BACKGROUND_OFFSET = 10;\n\nconst wrapAnsi16 = (offset = 0) => code => `\\u001B[${code + offset}m`;\n\nconst wrapAnsi256 = (offset = 0) => code => `\\u001B[${38 + offset};5;${code}m`;\n\nconst wrapAnsi16m = (offset = 0) => (red, green, blue) => `\\u001B[${38 + offset};2;${red};${green};${blue}m`;\n\nconst styles = {\n\tmodifier: {\n\t\treset: [0, 0],\n\t\t// 21 isn't widely supported and 22 does the same thing\n\t\tbold: [1, 22],\n\t\tdim: [2, 22],\n\t\titalic: [3, 23],\n\t\tunderline: [4, 24],\n\t\toverline: [53, 55],\n\t\tinverse: [7, 27],\n\t\thidden: [8, 28],\n\t\tstrikethrough: [9, 29],\n\t},\n\tcolor: {\n\t\tblack: [30, 39],\n\t\tred: [31, 39],\n\t\tgreen: [32, 39],\n\t\tyellow: [33, 39],\n\t\tblue: [34, 39],\n\t\tmagenta: [35, 39],\n\t\tcyan: [36, 39],\n\t\twhite: [37, 39],\n\n\t\t// Bright color\n\t\tblackBright: [90, 39],\n\t\tgray: [90, 39], // Alias of `blackBright`\n\t\tgrey: [90, 39], // Alias of `blackBright`\n\t\tredBright: [91, 39],\n\t\tgreenBright: [92, 39],\n\t\tyellowBright: [93, 39],\n\t\tblueBright: [94, 39],\n\t\tmagentaBright: [95, 39],\n\t\tcyanBright: [96, 39],\n\t\twhiteBright: [97, 39],\n\t},\n\tbgColor: {\n\t\tbgBlack: [40, 49],\n\t\tbgRed: [41, 49],\n\t\tbgGreen: [42, 49],\n\t\tbgYellow: [43, 49],\n\t\tbgBlue: [44, 49],\n\t\tbgMagenta: [45, 49],\n\t\tbgCyan: [46, 49],\n\t\tbgWhite: [47, 49],\n\n\t\t// Bright color\n\t\tbgBlackBright: [100, 49],\n\t\tbgGray: [100, 49], // Alias of `bgBlackBright`\n\t\tbgGrey: [100, 49], // Alias of `bgBlackBright`\n\t\tbgRedBright: [101, 49],\n\t\tbgGreenBright: [102, 49],\n\t\tbgYellowBright: [103, 49],\n\t\tbgBlueBright: [104, 49],\n\t\tbgMagentaBright: [105, 49],\n\t\tbgCyanBright: [106, 49],\n\t\tbgWhiteBright: [107, 49],\n\t},\n};\n\nexport const modifierNames = Object.keys(styles.modifier);\nexport const foregroundColorNames = Object.keys(styles.color);\nexport const backgroundColorNames = Object.keys(styles.bgColor);\nexport const colorNames = [...foregroundColorNames, ...backgroundColorNames];\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\n\tfor (const [groupName, group] of Object.entries(styles)) {\n\t\tfor (const [styleName, style] of Object.entries(group)) {\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`,\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false,\n\t\t});\n\t}\n\n\tObject.defineProperty(styles, 'codes', {\n\t\tvalue: codes,\n\t\tenumerable: false,\n\t});\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tstyles.color.ansi = wrapAnsi16();\n\tstyles.color.ansi256 = wrapAnsi256();\n\tstyles.color.ansi16m = wrapAnsi16m();\n\tstyles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);\n\n\t// From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js\n\tObject.defineProperties(styles, {\n\t\trgbToAnsi256: {\n\t\t\tvalue(red, green, blue) {\n\t\t\t\t// We use the extended greyscale palette here, with the exception of\n\t\t\t\t// black and white. normal palette only has 4 greyscale shades.\n\t\t\t\tif (red === green && green === blue) {\n\t\t\t\t\tif (red < 8) {\n\t\t\t\t\t\treturn 16;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (red > 248) {\n\t\t\t\t\t\treturn 231;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Math.round(((red - 8) / 247) * 24) + 232;\n\t\t\t\t}\n\n\t\t\t\treturn 16\n\t\t\t\t\t+ (36 * Math.round(red / 255 * 5))\n\t\t\t\t\t+ (6 * Math.round(green / 255 * 5))\n\t\t\t\t\t+ Math.round(blue / 255 * 5);\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToRgb: {\n\t\t\tvalue(hex) {\n\t\t\t\tconst matches = /[a-f\\d]{6}|[a-f\\d]{3}/i.exec(hex.toString(16));\n\t\t\t\tif (!matches) {\n\t\t\t\t\treturn [0, 0, 0];\n\t\t\t\t}\n\n\t\t\t\tlet [colorString] = matches;\n\n\t\t\t\tif (colorString.length === 3) {\n\t\t\t\t\tcolorString = [...colorString].map(character => character + character).join('');\n\t\t\t\t}\n\n\t\t\t\tconst integer = Number.parseInt(colorString, 16);\n\n\t\t\t\treturn [\n\t\t\t\t\t/* eslint-disable no-bitwise */\n\t\t\t\t\t(integer >> 16) & 0xFF,\n\t\t\t\t\t(integer >> 8) & 0xFF,\n\t\t\t\t\tinteger & 0xFF,\n\t\t\t\t\t/* eslint-enable no-bitwise */\n\t\t\t\t];\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi256: {\n\t\t\tvalue: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t\tansi256ToAnsi: {\n\t\t\tvalue(code) {\n\t\t\t\tif (code < 8) {\n\t\t\t\t\treturn 30 + code;\n\t\t\t\t}\n\n\t\t\t\tif (code < 16) {\n\t\t\t\t\treturn 90 + (code - 8);\n\t\t\t\t}\n\n\t\t\t\tlet red;\n\t\t\t\tlet green;\n\t\t\t\tlet blue;\n\n\t\t\t\tif (code >= 232) {\n\t\t\t\t\tred = (((code - 232) * 10) + 8) / 255;\n\t\t\t\t\tgreen = red;\n\t\t\t\t\tblue = red;\n\t\t\t\t} else {\n\t\t\t\t\tcode -= 16;\n\n\t\t\t\t\tconst remainder = code % 36;\n\n\t\t\t\t\tred = Math.floor(code / 36) / 5;\n\t\t\t\t\tgreen = Math.floor(remainder / 6) / 5;\n\t\t\t\t\tblue = (remainder % 6) / 5;\n\t\t\t\t}\n\n\t\t\t\tconst value = Math.max(red, green, blue) * 2;\n\n\t\t\t\tif (value === 0) {\n\t\t\t\t\treturn 30;\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\tlet result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red));\n\n\t\t\t\tif (value === 2) {\n\t\t\t\t\tresult += 60;\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\trgbToAnsi: {\n\t\t\tvalue: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi: {\n\t\t\tvalue: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t});\n\n\treturn styles;\n}\n\nconst ansiStyles = assembleStyles();\n\nexport default ansiStyles;\n",
|
|
18
|
+
"import process from 'node:process';\nimport os from 'node:os';\nimport tty from 'node:tty';\n\n// From: https://github.com/sindresorhus/has-flag/blob/main/index.js\n/// function hasFlag(flag, argv = globalThis.Deno?.args ?? process.argv) {\nfunction hasFlag(flag, argv = globalThis.Deno ? globalThis.Deno.args : process.argv) {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n}\n\nconst {env} = process;\n\nlet flagForceColor;\nif (\n\thasFlag('no-color')\n\t|| hasFlag('no-colors')\n\t|| hasFlag('color=false')\n\t|| hasFlag('color=never')\n) {\n\tflagForceColor = 0;\n} else if (\n\thasFlag('color')\n\t|| hasFlag('colors')\n\t|| hasFlag('color=true')\n\t|| hasFlag('color=always')\n) {\n\tflagForceColor = 1;\n}\n\nfunction envForceColor() {\n\tif ('FORCE_COLOR' in env) {\n\t\tif (env.FORCE_COLOR === 'true') {\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (env.FORCE_COLOR === 'false') {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn env.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3,\n\t};\n}\n\nfunction _supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) {\n\tconst noFlagForceColor = envForceColor();\n\tif (noFlagForceColor !== undefined) {\n\t\tflagForceColor = noFlagForceColor;\n\t}\n\n\tconst forceColor = sniffFlags ? flagForceColor : noFlagForceColor;\n\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (sniffFlags) {\n\t\tif (hasFlag('color=16m')\n\t\t\t|| hasFlag('color=full')\n\t\t\t|| hasFlag('color=truecolor')) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (hasFlag('color=256')) {\n\t\t\treturn 2;\n\t\t}\n\t}\n\n\t// Check for Azure DevOps pipelines.\n\t// Has to be above the `!streamIsTTY` check.\n\tif ('TF_BUILD' in env && 'AGENT_NAME' in env) {\n\t\treturn 1;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10\n\t\t\t&& Number(osRelease[2]) >= 10_586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14_931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['GITHUB_ACTIONS', 'GITEA_ACTIONS', 'CIRCLECI'].some(key => key in env)) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (['TRAVIS', 'APPVEYOR', 'GITLAB_CI', 'BUILDKITE', 'DRONE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-kitty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-ghostty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'wezterm') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = Number.parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app': {\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\t}\n\n\t\t\tcase 'Apple_Terminal': {\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nexport function createSupportsColor(stream, options = {}) {\n\tconst level = _supportsColor(stream, {\n\t\tstreamIsTTY: stream && stream.isTTY,\n\t\t...options,\n\t});\n\n\treturn translateLevel(level);\n}\n\nconst supportsColor = {\n\tstdout: createSupportsColor({isTTY: tty.isatty(1)}),\n\tstderr: createSupportsColor({isTTY: tty.isatty(2)}),\n};\n\nexport default supportsColor;\n",
|
|
19
|
+
"// TODO: When targeting Node.js 16, use `String.prototype.replaceAll`.\nexport function stringReplaceAll(string, substring, replacer) {\n\tlet index = string.indexOf(substring);\n\tif (index === -1) {\n\t\treturn string;\n\t}\n\n\tconst substringLength = substring.length;\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\treturnValue += string.slice(endIndex, index) + substring + replacer;\n\t\tendIndex = index + substringLength;\n\t\tindex = string.indexOf(substring, endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n\nexport function stringEncaseCRLFWithFirstIndex(string, prefix, postfix, index) {\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\tconst gotCR = string[index - 1] === '\\r';\n\t\treturnValue += string.slice(endIndex, (gotCR ? index - 1 : index)) + prefix + (gotCR ? '\\r\\n' : '\\n') + postfix;\n\t\tendIndex = index + 1;\n\t\tindex = string.indexOf('\\n', endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n",
|
|
20
|
+
"import ansiStyles from '#ansi-styles';\nimport supportsColor from '#supports-color';\nimport { // eslint-disable-line import/order\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex,\n} from './utilities.js';\n\nconst {stdout: stdoutColor, stderr: stderrColor} = supportsColor;\n\nconst GENERATOR = Symbol('GENERATOR');\nconst STYLER = Symbol('STYLER');\nconst IS_EMPTY = Symbol('IS_EMPTY');\n\n// `supportsColor.level` → `ansiStyles.color[name]` mapping\nconst levelMapping = [\n\t'ansi',\n\t'ansi',\n\t'ansi256',\n\t'ansi16m',\n];\n\nconst styles = Object.create(null);\n\nconst applyOptions = (object, options = {}) => {\n\tif (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {\n\t\tthrow new Error('The `level` option should be an integer from 0 to 3');\n\t}\n\n\t// Detect level if not set manually\n\tconst colorLevel = stdoutColor ? stdoutColor.level : 0;\n\tobject.level = options.level === undefined ? colorLevel : options.level;\n};\n\nexport class Chalk {\n\tconstructor(options) {\n\t\t// eslint-disable-next-line no-constructor-return\n\t\treturn chalkFactory(options);\n\t}\n}\n\nconst chalkFactory = options => {\n\tconst chalk = (...strings) => strings.join(' ');\n\tapplyOptions(chalk, options);\n\n\tObject.setPrototypeOf(chalk, createChalk.prototype);\n\n\treturn chalk;\n};\n\nfunction createChalk(options) {\n\treturn chalkFactory(options);\n}\n\nObject.setPrototypeOf(createChalk.prototype, Function.prototype);\n\nfor (const [styleName, style] of Object.entries(ansiStyles)) {\n\tstyles[styleName] = {\n\t\tget() {\n\t\t\tconst builder = createBuilder(this, createStyler(style.open, style.close, this[STYLER]), this[IS_EMPTY]);\n\t\t\tObject.defineProperty(this, styleName, {value: builder});\n\t\t\treturn builder;\n\t\t},\n\t};\n}\n\nstyles.visible = {\n\tget() {\n\t\tconst builder = createBuilder(this, this[STYLER], true);\n\t\tObject.defineProperty(this, 'visible', {value: builder});\n\t\treturn builder;\n\t},\n};\n\nconst getModelAnsi = (model, level, type, ...arguments_) => {\n\tif (model === 'rgb') {\n\t\tif (level === 'ansi16m') {\n\t\t\treturn ansiStyles[type].ansi16m(...arguments_);\n\t\t}\n\n\t\tif (level === 'ansi256') {\n\t\t\treturn ansiStyles[type].ansi256(ansiStyles.rgbToAnsi256(...arguments_));\n\t\t}\n\n\t\treturn ansiStyles[type].ansi(ansiStyles.rgbToAnsi(...arguments_));\n\t}\n\n\tif (model === 'hex') {\n\t\treturn getModelAnsi('rgb', level, type, ...ansiStyles.hexToRgb(...arguments_));\n\t}\n\n\treturn ansiStyles[type][model](...arguments_);\n};\n\nconst usedModels = ['rgb', 'hex', 'ansi256'];\n\nfor (const model of usedModels) {\n\tstyles[model] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'color', ...arguments_), ansiStyles.color.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n\n\tconst bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);\n\tstyles[bgModel] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'bgColor', ...arguments_), ansiStyles.bgColor.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n}\n\nconst proto = Object.defineProperties(() => {}, {\n\t...styles,\n\tlevel: {\n\t\tenumerable: true,\n\t\tget() {\n\t\t\treturn this[GENERATOR].level;\n\t\t},\n\t\tset(level) {\n\t\t\tthis[GENERATOR].level = level;\n\t\t},\n\t},\n});\n\nconst createStyler = (open, close, parent) => {\n\tlet openAll;\n\tlet closeAll;\n\tif (parent === undefined) {\n\t\topenAll = open;\n\t\tcloseAll = close;\n\t} else {\n\t\topenAll = parent.openAll + open;\n\t\tcloseAll = close + parent.closeAll;\n\t}\n\n\treturn {\n\t\topen,\n\t\tclose,\n\t\topenAll,\n\t\tcloseAll,\n\t\tparent,\n\t};\n};\n\nconst createBuilder = (self, _styler, _isEmpty) => {\n\t// Single argument is hot path, implicit coercion is faster than anything\n\t// eslint-disable-next-line no-implicit-coercion\n\tconst builder = (...arguments_) => applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' '));\n\n\t// We alter the prototype because we must return a function, but there is\n\t// no way to create a function with a different prototype\n\tObject.setPrototypeOf(builder, proto);\n\n\tbuilder[GENERATOR] = self;\n\tbuilder[STYLER] = _styler;\n\tbuilder[IS_EMPTY] = _isEmpty;\n\n\treturn builder;\n};\n\nconst applyStyle = (self, string) => {\n\tif (self.level <= 0 || !string) {\n\t\treturn self[IS_EMPTY] ? '' : string;\n\t}\n\n\tlet styler = self[STYLER];\n\n\tif (styler === undefined) {\n\t\treturn string;\n\t}\n\n\tconst {openAll, closeAll} = styler;\n\tif (string.includes('\\u001B')) {\n\t\twhile (styler !== undefined) {\n\t\t\t// Replace any instances already present with a re-opening code\n\t\t\t// otherwise only the part of the string until said closing code\n\t\t\t// will be colored, and the rest will simply be 'plain'.\n\t\t\tstring = stringReplaceAll(string, styler.close, styler.open);\n\n\t\t\tstyler = styler.parent;\n\t\t}\n\t}\n\n\t// We can move both next actions out of loop, because remaining actions in loop won't have\n\t// any/visible effect on parts we add here. Close the styling before a linebreak and reopen\n\t// after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92\n\tconst lfIndex = string.indexOf('\\n');\n\tif (lfIndex !== -1) {\n\t\tstring = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);\n\t}\n\n\treturn openAll + string + closeAll;\n};\n\nObject.defineProperties(createChalk.prototype, styles);\n\nconst chalk = createChalk();\nexport const chalkStderr = createChalk({level: stderrColor ? stderrColor.level : 0});\n\nexport {\n\tmodifierNames,\n\tforegroundColorNames,\n\tbackgroundColorNames,\n\tcolorNames,\n\n\t// TODO: Remove these aliases in the next major version\n\tmodifierNames as modifiers,\n\tforegroundColorNames as foregroundColors,\n\tbackgroundColorNames as backgroundColors,\n\tcolorNames as colors,\n} from './vendor/ansi-styles/index.js';\n\nexport {\n\tstdoutColor as supportsColor,\n\tstderrColor as supportsColorStderr,\n};\n\nexport default chalk;\n",
|
|
21
|
+
"import { basename, dirname, join, resolve } from \"node:path\";\nimport { stat } from \"node:fs/promises\";\nimport {\n ProgramIniConfig,\n USER_FLASH_MAX_FILE_SIZE,\n type ZerobaseSlotNumber,\n} from \"@v5x/serial\";\nimport { detectProgramType, type ProgramType } from \"./detect\";\nimport { isRecord } from \"./guards\";\nimport { runProcess } from \"./process\";\n\nexport interface ProjectInfo {\n path: string;\n type: ProgramType;\n name: string;\n description: string;\n artifact?: string;\n}\n\nfunction stringAt(value: unknown, keys: string[]): string | undefined {\n let current = value;\n for (const key of keys) {\n if (!isRecord(current)) return undefined;\n current = current[key];\n }\n return typeof current === \"string\" ? current : undefined;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nasync function readProsInfo(path: string) {\n const filePath = join(path, \"project.pros\");\n let metadata: unknown;\n try {\n metadata = JSON.parse(await Bun.file(filePath).text());\n } catch (error) {\n throw new Error(\n `invalid project.pros at ${filePath}: ${errorMessage(error)}`,\n );\n }\n return {\n name: stringAt(metadata, [\"py/state\", \"project_name\"]),\n description: stringAt(metadata, [\n \"py/state\",\n \"upload_options\",\n \"description\",\n ]),\n output: stringAt(metadata, [\n \"py/state\",\n \"templates\",\n \"kernel\",\n \"metadata\",\n \"output\",\n ]),\n };\n}\n\nasync function readVexideInfo(path: string) {\n const filePath = join(path, \"Cargo.toml\");\n let manifest: unknown;\n try {\n manifest = Bun.TOML.parse(await Bun.file(filePath).text());\n } catch (error) {\n throw new Error(\n `invalid Cargo.toml at ${filePath}: ${errorMessage(error)}`,\n );\n }\n return {\n name: stringAt(manifest, [\"package\", \"name\"]),\n description: stringAt(manifest, [\"package\", \"description\"]),\n };\n}\n\nexport async function inspectProject(inputPath: string): Promise<ProjectInfo> {\n const path = resolve(inputPath);\n const type = await detectProgramType(path);\n const fallbackName = basename(path);\n\n switch (type) {\n case \"pros\": {\n const metadata = await readProsInfo(path);\n return {\n path,\n type,\n name: metadata.name ?? fallbackName,\n description: metadata.description ?? \"\",\n artifact: metadata.output ? resolve(path, metadata.output) : undefined,\n };\n }\n case \"vexide\": {\n const metadata = await readVexideInfo(path);\n return {\n path,\n type,\n name: metadata.name ?? fallbackName,\n description: metadata.description ?? \"\",\n };\n }\n case \"vexcode-cpp\":\n case \"vexcode-py\":\n return { path, type, name: fallbackName, description: \"\" };\n case \"unknown\":\n throw new Error(`no supported V5 project found at ${path}`);\n }\n}\n\ninterface ProjectProcessOptions {\n stdout?: \"inherit\" | \"ignore\";\n}\n\nexport async function buildProject(\n project: ProjectInfo,\n options: ProjectProcessOptions = {},\n): Promise<void> {\n switch (project.type) {\n case \"pros\":\n case \"vexcode-cpp\":\n return runProcess([\"make\"], project.path, options);\n case \"vexide\":\n return runProcess(\n [\"cargo\", \"v5\", \"build\", \"--release\"],\n project.path,\n options,\n );\n case \"vexcode-py\":\n throw new Error(\"building VEXcode Python projects is not supported\");\n case \"unknown\":\n throw new Error(\"cannot build an unknown project type\");\n }\n}\n\nexport async function cleanProject(\n project: ProjectInfo,\n options: ProjectProcessOptions = {},\n): Promise<void> {\n switch (project.type) {\n case \"pros\":\n case \"vexcode-cpp\":\n return runProcess([\"make\", \"clean\"], project.path, options);\n case \"vexide\":\n return runProcess([\"cargo\", \"clean\"], project.path, options);\n case \"vexcode-py\":\n throw new Error(\"cleaning VEXcode Python projects is not supported\");\n case \"unknown\":\n throw new Error(\"cannot clean an unknown project type\");\n }\n}\n\nasync function existingFile(\n path: string | undefined,\n): Promise<string | undefined> {\n if (path === undefined) return undefined;\n return (await stat(path).catch(() => undefined))?.isFile() ? path : undefined;\n}\n\nasync function newestNamedBinary(\n root: string,\n name: string,\n): Promise<string | undefined> {\n if (!(await stat(root).catch(() => undefined))?.isDirectory())\n return undefined;\n\n let newest: { path: string; modified: number } | undefined;\n const glob = new Bun.Glob(`**/${name}.bin`);\n for await (const relativePath of glob.scan({ cwd: root, onlyFiles: true })) {\n const path = resolve(root, relativePath);\n const { mtimeMs } = await stat(path);\n if (newest === undefined || mtimeMs > newest.modified) {\n newest = { path, modified: mtimeMs };\n }\n }\n return newest?.path;\n}\n\nexport async function findProgramArtifact(\n project: ProjectInfo,\n explicitPath?: string,\n): Promise<string> {\n if (explicitPath !== undefined) {\n const explicit = await existingFile(resolve(explicitPath));\n if (explicit === undefined) {\n throw new Error(\n `program artifact does not exist: ${resolve(explicitPath)}`,\n );\n }\n return explicit;\n }\n\n const configured = await existingFile(project.artifact);\n if (configured !== undefined) return configured;\n\n const conventionalPaths =\n project.type === \"pros\"\n ? [\"bin/monolith.bin\", \"bin/hot.package.bin\"]\n : project.type === \"vexcode-cpp\"\n ? [`build/${project.name}.bin`]\n : [];\n for (const relativePath of conventionalPaths) {\n const candidate = await existingFile(join(project.path, relativePath));\n if (candidate !== undefined) return candidate;\n }\n\n const artifact =\n project.type === \"vexide\"\n ? await newestNamedBinary(join(project.path, \"target\"), project.name)\n : undefined;\n if (artifact === undefined) {\n throw new Error(\n `no program artifact found for ${project.name}; build the project or pass --file`,\n );\n }\n return artifact;\n}\n\nexport interface ProgramArtifacts {\n hot: string;\n cold?: string;\n}\n\nexport const PROGRAM_ARTIFACT_SIZE_LIMIT = USER_FLASH_MAX_FILE_SIZE;\n\nexport interface ValidatedProgramArtifact {\n path: string;\n size: number;\n}\n\nexport interface ValidatedProgramArtifacts {\n hot: ValidatedProgramArtifact;\n cold?: ValidatedProgramArtifact;\n}\n\nasync function validateProgramArtifact(\n path: string,\n role: \"hot\" | \"cold\",\n): Promise<ValidatedProgramArtifact> {\n const info = await stat(path).catch(() => undefined);\n if (info === undefined || !info.isFile()) {\n throw new Error(`program ${role} artifact does not exist: ${path}`);\n }\n if (info.size === 0) {\n throw new Error(`program ${role} artifact is empty: ${path}`);\n }\n if (info.size > PROGRAM_ARTIFACT_SIZE_LIMIT) {\n throw new Error(\n `program ${role} artifact ${path} is ${info.size} bytes; supported limit is ${PROGRAM_ARTIFACT_SIZE_LIMIT} bytes`,\n );\n }\n return { path, size: info.size };\n}\n\nexport async function validateProgramArtifacts(\n artifacts: ProgramArtifacts,\n): Promise<ValidatedProgramArtifacts> {\n return {\n hot: await validateProgramArtifact(artifacts.hot, \"hot\"),\n cold:\n artifacts.cold === undefined\n ? undefined\n : await validateProgramArtifact(artifacts.cold, \"cold\"),\n };\n}\n\nexport async function findProgramArtifacts(\n project: ProjectInfo,\n explicitPath?: string,\n): Promise<ProgramArtifacts> {\n const hot = await findProgramArtifact(project, explicitPath);\n if (project.type !== \"pros\" || basename(hot) !== \"hot.package.bin\") {\n return { hot };\n }\n\n const cold = await existingFile(join(dirname(hot), \"cold.package.bin\"));\n if (cold === undefined) {\n throw new Error(`PROS hot package is missing its cold package: ${hot}`);\n }\n return { hot, cold };\n}\n\nexport function createProgramConfig(options: {\n slot: number;\n name: string;\n description: string;\n icon: string;\n type: ProgramType;\n run: boolean;\n}): ProgramIniConfig {\n if (!Number.isInteger(options.slot) || options.slot < 1 || options.slot > 8) {\n throw new Error(\"slot must be an integer from 1 through 8\");\n }\n\n const config = new ProgramIniConfig();\n config.baseName = `slot_${options.slot}`;\n config.autorun = options.run;\n config.project.ide = options.type;\n config.program.name = options.name;\n config.program.description = options.description;\n config.program.icon = options.icon;\n config.program.slot = (options.slot - 1) as ZerobaseSlotNumber;\n return config;\n}\n",
|
|
22
|
+
"var __defProp = Object.defineProperty;\nvar __returnValue = (v) => v;\nfunction __exportSetter(name, newValue) {\n this[name] = __returnValue.bind(null, newValue);\n}\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, {\n get: all[name],\n enumerable: true,\n configurable: true,\n set: __exportSetter.bind(all, name)\n });\n};\nvar __require = /* @__PURE__ */ ((x) => typeof require !== \"undefined\" ? require : typeof Proxy !== \"undefined\" ? new Proxy(x, {\n get: (a, b) => (typeof require !== \"undefined\" ? require : a)[b]\n}) : x)(function(x) {\n if (typeof require !== \"undefined\")\n return require.apply(this, arguments);\n throw Error('Dynamic require of \"' + x + '\" is not supported');\n});\n\n// src/Vex.ts\nvar USER_PROG_CHUNK_SIZE = 4096;\nvar USER_FLASH_START = 50331648;\nvar USER_FLASH_SYS_CODE_START = 54525952;\nvar USER_FLASH_USR_CODE_START = 58720256;\nvar USER_FLASH_END = 134217728;\nvar USER_FLASH_MAX_FILE_SIZE = 2097152;\nvar USER_FLASH_START_B = 270532608;\nvar USER_FLASH_END_B = 272629760;\nvar USER_FLASH_START_C = 807403520;\nvar USER_FLASH_END_C = 822083584;\nvar FileVendor;\n((FileVendor2) => {\n FileVendor2[FileVendor2[\"USER\"] = 1] = \"USER\";\n FileVendor2[FileVendor2[\"SYS\"] = 15] = \"SYS\";\n FileVendor2[FileVendor2[\"DEV1\"] = 16] = \"DEV1\";\n FileVendor2[FileVendor2[\"DEV2\"] = 24] = \"DEV2\";\n FileVendor2[FileVendor2[\"DEV3\"] = 32] = \"DEV3\";\n FileVendor2[FileVendor2[\"DEV4\"] = 40] = \"DEV4\";\n FileVendor2[FileVendor2[\"DEV5\"] = 48] = \"DEV5\";\n FileVendor2[FileVendor2[\"DEV6\"] = 56] = \"DEV6\";\n FileVendor2[FileVendor2[\"VEXVM\"] = 64] = \"VEXVM\";\n FileVendor2[FileVendor2[\"VEX\"] = 240] = \"VEX\";\n FileVendor2[FileVendor2[\"UNDEFINED\"] = 241] = \"UNDEFINED\";\n})(FileVendor ||= {});\nvar FileDownloadTarget;\n((FileDownloadTarget2) => {\n FileDownloadTarget2[FileDownloadTarget2[\"FILE_TARGET_DDR\"] = 0] = \"FILE_TARGET_DDR\";\n FileDownloadTarget2[FileDownloadTarget2[\"FILE_TARGET_QSPI\"] = 1] = \"FILE_TARGET_QSPI\";\n FileDownloadTarget2[FileDownloadTarget2[\"FILE_TARGET_CBUF\"] = 2] = \"FILE_TARGET_CBUF\";\n FileDownloadTarget2[FileDownloadTarget2[\"FILE_TARGET_VBUF\"] = 3] = \"FILE_TARGET_VBUF\";\n FileDownloadTarget2[FileDownloadTarget2[\"FILE_TARGET_DDRC\"] = 4] = \"FILE_TARGET_DDRC\";\n FileDownloadTarget2[FileDownloadTarget2[\"FILE_TARGET_DDRE\"] = 5] = \"FILE_TARGET_DDRE\";\n FileDownloadTarget2[FileDownloadTarget2[\"FILE_TARGET_FLASH\"] = 6] = \"FILE_TARGET_FLASH\";\n FileDownloadTarget2[FileDownloadTarget2[\"FILE_TARGET_RADIO\"] = 7] = \"FILE_TARGET_RADIO\";\n FileDownloadTarget2[FileDownloadTarget2[\"FILE_TARGET_A1\"] = 13] = \"FILE_TARGET_A1\";\n FileDownloadTarget2[FileDownloadTarget2[\"FILE_TARGET_B1\"] = 14] = \"FILE_TARGET_B1\";\n FileDownloadTarget2[FileDownloadTarget2[\"FILE_TARGET_B2\"] = 15] = \"FILE_TARGET_B2\";\n})(FileDownloadTarget ||= {});\nvar FileInitAction;\n((FileInitAction2) => {\n FileInitAction2[FileInitAction2[\"WRITE\"] = 1] = \"WRITE\";\n FileInitAction2[FileInitAction2[\"READ\"] = 2] = \"READ\";\n})(FileInitAction ||= {});\nvar FileInitOption;\n((FileInitOption2) => {\n FileInitOption2[FileInitOption2[\"NONE\"] = 0] = \"NONE\";\n FileInitOption2[FileInitOption2[\"OVERWRITE\"] = 1] = \"OVERWRITE\";\n})(FileInitOption ||= {});\nvar FileLoadAction;\n((FileLoadAction2) => {\n FileLoadAction2[FileLoadAction2[\"RUN\"] = 0] = \"RUN\";\n FileLoadAction2[FileLoadAction2[\"STOP\"] = 128] = \"STOP\";\n})(FileLoadAction ||= {});\nvar FileExitAction;\n((FileExitAction2) => {\n FileExitAction2[FileExitAction2[\"EXIT_NONE\"] = 0] = \"EXIT_NONE\";\n FileExitAction2[FileExitAction2[\"EXIT_RUN\"] = 1] = \"EXIT_RUN\";\n FileExitAction2[FileExitAction2[\"EXIT_HALT\"] = 3] = \"EXIT_HALT\";\n})(FileExitAction ||= {});\nvar RadioChannelType;\n((RadioChannelType2) => {\n RadioChannelType2[RadioChannelType2[\"PIT\"] = 0] = \"PIT\";\n RadioChannelType2[RadioChannelType2[\"DOWNLOAD\"] = 1] = \"DOWNLOAD\";\n})(RadioChannelType ||= {});\nvar AckType;\n((AckType2) => {\n AckType2[AckType2[\"CDC2_ACK\"] = 118] = \"CDC2_ACK\";\n AckType2[AckType2[\"CDC2_NACK\"] = 255] = \"CDC2_NACK\";\n AckType2[AckType2[\"CDC2_NACK_PACKET_CRC\"] = 206] = \"CDC2_NACK_PACKET_CRC\";\n AckType2[AckType2[\"CDC2_NACK_CMD_LENGTH\"] = 208] = \"CDC2_NACK_CMD_LENGTH\";\n AckType2[AckType2[\"CDC2_NACK_SIZE\"] = 209] = \"CDC2_NACK_SIZE\";\n AckType2[AckType2[\"CDC2_NACK_CRC\"] = 210] = \"CDC2_NACK_CRC\";\n AckType2[AckType2[\"CDC2_NACK_FILE\"] = 211] = \"CDC2_NACK_FILE\";\n AckType2[AckType2[\"CDC2_NACK_INIT\"] = 212] = \"CDC2_NACK_INIT\";\n AckType2[AckType2[\"CDC2_NACK_FUNC\"] = 213] = \"CDC2_NACK_FUNC\";\n AckType2[AckType2[\"CDC2_NACK_ALIGN\"] = 214] = \"CDC2_NACK_ALIGN\";\n AckType2[AckType2[\"CDC2_NACK_ADDR\"] = 215] = \"CDC2_NACK_ADDR\";\n AckType2[AckType2[\"CDC2_NACK_INCOMPLETE\"] = 216] = \"CDC2_NACK_INCOMPLETE\";\n AckType2[AckType2[\"CDC2_NACK_DIR_INDEX\"] = 217] = \"CDC2_NACK_DIR_INDEX\";\n AckType2[AckType2[\"CDC2_NACK_MAX_USER_FILES\"] = 218] = \"CDC2_NACK_MAX_USER_FILES\";\n AckType2[AckType2[\"CDC2_NACK_FILE_EXISTS\"] = 219] = \"CDC2_NACK_FILE_EXISTS\";\n AckType2[AckType2[\"CDC2_NACK_FILE_SYS_FULL\"] = 220] = \"CDC2_NACK_FILE_SYS_FULL\";\n AckType2[AckType2[\"TIMEOUT\"] = 256] = \"TIMEOUT\";\n AckType2[AckType2[\"WRITE_ERROR\"] = 257] = \"WRITE_ERROR\";\n})(AckType ||= {});\nvar SmartDeviceType;\n((SmartDeviceType2) => {\n SmartDeviceType2[SmartDeviceType2[\"EMPTY\"] = 0] = \"EMPTY\";\n SmartDeviceType2[SmartDeviceType2[\"V5_POWER\"] = 1] = \"V5_POWER\";\n SmartDeviceType2[SmartDeviceType2[\"MOTOR\"] = 2] = \"MOTOR\";\n SmartDeviceType2[SmartDeviceType2[\"LED\"] = 3] = \"LED\";\n SmartDeviceType2[SmartDeviceType2[\"ABS_ENCODER_SENSOR\"] = 4] = \"ABS_ENCODER_SENSOR\";\n SmartDeviceType2[SmartDeviceType2[\"CR_MOTOR\"] = 5] = \"CR_MOTOR\";\n SmartDeviceType2[SmartDeviceType2[\"IMU_SENSOR\"] = 6] = \"IMU_SENSOR\";\n SmartDeviceType2[SmartDeviceType2[\"DISTANCE_SENSOR\"] = 7] = \"DISTANCE_SENSOR\";\n SmartDeviceType2[SmartDeviceType2[\"RADIO_SENSOR\"] = 8] = \"RADIO_SENSOR\";\n SmartDeviceType2[SmartDeviceType2[\"CONTROLLER\"] = 9] = \"CONTROLLER\";\n SmartDeviceType2[SmartDeviceType2[\"BRAIN\"] = 10] = \"BRAIN\";\n SmartDeviceType2[SmartDeviceType2[\"VISION_SENSOR\"] = 11] = \"VISION_SENSOR\";\n SmartDeviceType2[SmartDeviceType2[\"ADI\"] = 12] = \"ADI\";\n SmartDeviceType2[SmartDeviceType2[\"PARTNER_CONTROLLER\"] = 13] = \"PARTNER_CONTROLLER\";\n SmartDeviceType2[SmartDeviceType2[\"BATTERY\"] = 14] = \"BATTERY\";\n SmartDeviceType2[SmartDeviceType2[\"SOL\"] = 15] = \"SOL\";\n SmartDeviceType2[SmartDeviceType2[\"OPTICAL_SENSOR\"] = 16] = \"OPTICAL_SENSOR\";\n SmartDeviceType2[SmartDeviceType2[\"MAGNET\"] = 17] = \"MAGNET\";\n SmartDeviceType2[SmartDeviceType2[\"GPS_SENSOR\"] = 20] = \"GPS_SENSOR\";\n SmartDeviceType2[SmartDeviceType2[\"UNDEFINED_SENSOR\"] = 255] = \"UNDEFINED_SENSOR\";\n})(SmartDeviceType ||= {});\nvar SerialDeviceType;\n((SerialDeviceType2) => {\n SerialDeviceType2[SerialDeviceType2[\"V5_BRAIN\"] = 1281] = \"V5_BRAIN\";\n SerialDeviceType2[SerialDeviceType2[\"V5_BRAIN_DFU\"] = 1282] = \"V5_BRAIN_DFU\";\n SerialDeviceType2[SerialDeviceType2[\"V5_CONTROLLER\"] = 1283] = \"V5_CONTROLLER\";\n SerialDeviceType2[SerialDeviceType2[\"XILINX\"] = 256] = \"XILINX\";\n SerialDeviceType2[SerialDeviceType2[\"IQ_BRAIN\"] = 2] = \"IQ_BRAIN\";\n SerialDeviceType2[SerialDeviceType2[\"IQ_BRAIN2\"] = 3] = \"IQ_BRAIN2\";\n SerialDeviceType2[SerialDeviceType2[\"IQ_BRAIN_DFU\"] = 255] = \"IQ_BRAIN_DFU\";\n SerialDeviceType2[SerialDeviceType2[\"IQ2_BRAIN\"] = 512] = \"IQ2_BRAIN\";\n SerialDeviceType2[SerialDeviceType2[\"IQ2_BRAIN_DFU\"] = 527] = \"IQ2_BRAIN_DFU\";\n SerialDeviceType2[SerialDeviceType2[\"IQ2_CONTROLLER\"] = 528] = \"IQ2_CONTROLLER\";\n SerialDeviceType2[SerialDeviceType2[\"IQ2_CONTROLLER_DFU\"] = 543] = \"IQ2_CONTROLLER_DFU\";\n SerialDeviceType2[SerialDeviceType2[\"EXP_BRAIN\"] = 1536] = \"EXP_BRAIN\";\n SerialDeviceType2[SerialDeviceType2[\"EXP_BRAIN_DFU\"] = 1551] = \"EXP_BRAIN_DFU\";\n SerialDeviceType2[SerialDeviceType2[\"EXP_CONTROLLER\"] = 1552] = \"EXP_CONTROLLER\";\n SerialDeviceType2[SerialDeviceType2[\"EXP_CONTROLLER_DFU\"] = 1567] = \"EXP_CONTROLLER_DFU\";\n SerialDeviceType2[SerialDeviceType2[\"PIXY\"] = 61440] = \"PIXY\";\n SerialDeviceType2[SerialDeviceType2[\"PIXY_DFU\"] = 12] = \"PIXY_DFU\";\n SerialDeviceType2[SerialDeviceType2[\"VEXCAM\"] = 1287] = \"VEXCAM\";\n SerialDeviceType2[SerialDeviceType2[\"VEXCAM_DFU\"] = 1288] = \"VEXCAM_DFU\";\n SerialDeviceType2[SerialDeviceType2[\"SENSOR_TEST\"] = 1535] = \"SENSOR_TEST\";\n SerialDeviceType2[SerialDeviceType2[\"CORTEX_PROGCBL\"] = 10] = \"CORTEX_PROGCBL\";\n SerialDeviceType2[SerialDeviceType2[\"CORTEX_BRAIN\"] = 11] = \"CORTEX_BRAIN\";\n SerialDeviceType2[SerialDeviceType2[\"CORTEX_JOYSTK\"] = 12] = \"CORTEX_JOYSTK\";\n SerialDeviceType2[SerialDeviceType2[\"VEXNET_KEY_20\"] = 7] = \"VEXNET_KEY_20\";\n SerialDeviceType2[SerialDeviceType2[\"VEXNET_KEY_10\"] = 9587] = \"VEXNET_KEY_10\";\n SerialDeviceType2[SerialDeviceType2[\"PROLIFIC\"] = 8963] = \"PROLIFIC\";\n})(SerialDeviceType ||= {});\nvar SelectDashScreen;\n((SelectDashScreen2) => {\n SelectDashScreen2[SelectDashScreen2[\"HOME\"] = 0] = \"HOME\";\n SelectDashScreen2[SelectDashScreen2[\"BATTERY\"] = 1] = \"BATTERY\";\n SelectDashScreen2[SelectDashScreen2[\"LED\"] = 3] = \"LED\";\n SelectDashScreen2[SelectDashScreen2[\"MATCH_CONFIG\"] = 4] = \"MATCH_CONFIG\";\n SelectDashScreen2[SelectDashScreen2[\"MATCH_CONFIG_MORE\"] = 5] = \"MATCH_CONFIG_MORE\";\n SelectDashScreen2[SelectDashScreen2[\"WIRING\"] = 6] = \"WIRING\";\n SelectDashScreen2[SelectDashScreen2[\"RADIO\"] = 8] = \"RADIO\";\n SelectDashScreen2[SelectDashScreen2[\"BRAIN\"] = 10] = \"BRAIN\";\n SelectDashScreen2[SelectDashScreen2[\"RUN_PROGRAM\"] = 13] = \"RUN_PROGRAM\";\n SelectDashScreen2[SelectDashScreen2[\"DRIVE_PROGRAM_CONTROL_LEFT_MAPPING\"] = 14] = \"DRIVE_PROGRAM_CONTROL_LEFT_MAPPING\";\n SelectDashScreen2[SelectDashScreen2[\"DRIVE_PROGRAM_MENU\"] = 15] = \"DRIVE_PROGRAM_MENU\";\n SelectDashScreen2[SelectDashScreen2[\"DEVICES\"] = 16] = \"DEVICES\";\n SelectDashScreen2[SelectDashScreen2[\"USER_PROGRAM_FOLDER\"] = 17] = \"USER_PROGRAM_FOLDER\";\n SelectDashScreen2[SelectDashScreen2[\"VEX_PROGRAM_FOLDER\"] = 18] = \"VEX_PROGRAM_FOLDER\";\n SelectDashScreen2[SelectDashScreen2[\"SETTINGS\"] = 19] = \"SETTINGS\";\n SelectDashScreen2[SelectDashScreen2[\"SCARY_CONFIGURATION\"] = 20] = \"SCARY_CONFIGURATION\";\n SelectDashScreen2[SelectDashScreen2[\"LANGUAGE\"] = 21] = \"LANGUAGE\";\n SelectDashScreen2[SelectDashScreen2[\"DRIVE_MOTOR_CONFIG\"] = 22] = \"DRIVE_MOTOR_CONFIG\";\n SelectDashScreen2[SelectDashScreen2[\"PROGRAM_MENU\"] = 24] = \"PROGRAM_MENU\";\n SelectDashScreen2[SelectDashScreen2[\"SHUTDOWN\"] = 25] = \"SHUTDOWN\";\n SelectDashScreen2[SelectDashScreen2[\"CONTROLLER_2_MAPPING\"] = 26] = \"CONTROLLER_2_MAPPING\";\n SelectDashScreen2[SelectDashScreen2[\"SCARY_CONFIGURATION_MORE\"] = 27] = \"SCARY_CONFIGURATION_MORE\";\n SelectDashScreen2[SelectDashScreen2[\"CONFIRM_XX\"] = 28] = \"CONFIRM_XX\";\n SelectDashScreen2[SelectDashScreen2[\"CONTROLLER_1_MAPPING\"] = 29] = \"CONTROLLER_1_MAPPING\";\n SelectDashScreen2[SelectDashScreen2[\"DRIVE_PROGRAM_CONTROL_DUAL_MAPPING\"] = 30] = \"DRIVE_PROGRAM_CONTROL_DUAL_MAPPING\";\n SelectDashScreen2[SelectDashScreen2[\"DRIVE_PROGRAM_CONTROL_SPLIT_MAPPING\"] = 31] = \"DRIVE_PROGRAM_CONTROL_SPLIT_MAPPING\";\n SelectDashScreen2[SelectDashScreen2[\"DRIVE_PROGRAM_CONTROL_RIGHT_MAPPING\"] = 32] = \"DRIVE_PROGRAM_CONTROL_RIGHT_MAPPING\";\n SelectDashScreen2[SelectDashScreen2[\"MATCH_2_4_PLAYERS\"] = 33] = \"MATCH_2_4_PLAYERS\";\n SelectDashScreen2[SelectDashScreen2[\"EVENT_LOG\"] = 34] = \"EVENT_LOG\";\n SelectDashScreen2[SelectDashScreen2[\"USER_PROGRAM_WIRING\"] = 40] = \"USER_PROGRAM_WIRING\";\n SelectDashScreen2[SelectDashScreen2[\"CLAWBOT_PROGRAM_MENU\"] = 41] = \"CLAWBOT_PROGRAM_MENU\";\n SelectDashScreen2[SelectDashScreen2[\"ABOUT\"] = 42] = \"ABOUT\";\n SelectDashScreen2[SelectDashScreen2[\"LANGUAGE_MORE\"] = 43] = \"LANGUAGE_MORE\";\n SelectDashScreen2[SelectDashScreen2[\"OBJECT_COLOR\"] = 45] = \"OBJECT_COLOR\";\n SelectDashScreen2[SelectDashScreen2[\"SIGNATURE_ID\"] = 46] = \"SIGNATURE_ID\";\n SelectDashScreen2[SelectDashScreen2[\"LOG_DATA\"] = 47] = \"LOG_DATA\";\n})(SelectDashScreen ||= {});\n// src/VexError.ts\nclass VexSerialError extends Error {\n kind;\n ackType = undefined;\n constructor(kind, message) {\n super(message);\n this.name = \"VexSerialError\";\n this.kind = kind;\n }\n}\n\nclass VexNotConnectedError extends VexSerialError {\n constructor(message = \"no connection to a V5 device\") {\n super(\"not-connected\", message);\n this.name = \"VexNotConnectedError\";\n }\n}\n\nclass VexInvalidArgumentError extends VexSerialError {\n constructor(message) {\n super(\"invalid-argument\", message);\n this.name = \"VexInvalidArgumentError\";\n }\n}\n\nclass VexProtocolError extends VexSerialError {\n ackType;\n constructor(message, ackType) {\n super(\"protocol\", message);\n this.name = \"VexProtocolError\";\n this.ackType = ackType;\n }\n}\n\nclass VexTransferError extends VexSerialError {\n constructor(message) {\n super(\"transfer\", message);\n this.name = \"VexTransferError\";\n }\n}\n\nclass VexDownloadError extends VexSerialError {\n constructor(message) {\n super(\"download\", message);\n this.name = \"VexDownloadError\";\n }\n}\n\nclass VexFirmwareError extends VexSerialError {\n constructor(message) {\n super(\"firmware\", message);\n this.name = \"VexFirmwareError\";\n }\n}\n\nclass VexIoError extends VexSerialError {\n constructor(message) {\n super(\"io\", message);\n this.name = \"VexIoError\";\n }\n}\nfunction toVexSerialError(error, fallback = \"io\") {\n if (error instanceof VexSerialError)\n return error;\n const message = error instanceof Error ? error.message : String(error);\n return new VexSerialError(fallback, message);\n}\n\n// src/VexEvent.ts\nclass VexEventEmitter {\n handlerMap;\n constructor() {\n this.handlerMap = new Map;\n }\n on(eventName, listener) {\n let listeners = this.handlerMap.get(eventName);\n listeners ??= [];\n listeners.push(listener);\n this.handlerMap.set(eventName, listeners);\n }\n remove(eventName, listener) {\n let listeners = this.handlerMap.get(eventName);\n listeners ??= [];\n const index = listeners.indexOf(listener);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n this.handlerMap.set(eventName, listeners);\n }\n emit(eventName, data) {\n const errors = [];\n for (const callback of [...this.handlerMap.get(eventName) ?? []]) {\n try {\n callback(data);\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length === 1)\n throw errors[0];\n if (errors.length > 1) {\n throw new AggregateError(errors, `listeners for ${String(eventName)} failed`);\n }\n }\n clearListeners() {\n this.handlerMap.clear();\n }\n}\n\nclass VexEventTarget {\n emitter;\n constructor() {\n this.emitter = new VexEventEmitter;\n }\n emit(eventName, data) {\n this.emitter.emit(this.normalizeEventName(eventName), data);\n }\n on(eventName, listener) {\n this.emitter.on(this.normalizeEventName(eventName), listener);\n }\n remove(eventName, listener) {\n this.emitter.remove(this.normalizeEventName(eventName), listener);\n }\n clearListeners() {\n this.emitter.clearListeners();\n }\n normalizeEventName(eventName) {\n return String(eventName);\n }\n}\n\n// ../../node_modules/.bun/neverthrow@8.2.0/node_modules/neverthrow/dist/index.es.js\nvar defaultErrorConfig = {\n withStackTrace: false\n};\nvar createNeverThrowError = (message, result, config = defaultErrorConfig) => {\n const data = result.isOk() ? { type: \"Ok\", value: result.value } : { type: \"Err\", value: result.error };\n const maybeStack = config.withStackTrace ? new Error().stack : undefined;\n return {\n data,\n message,\n stack: maybeStack\n };\n};\nfunction __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function(resolve) {\n resolve(value);\n });\n }\n return new (P || (P = Promise))(function(resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\nfunction __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m)\n return m.call(o);\n if (o && typeof o.length === \"number\")\n return {\n next: function() {\n if (o && i >= o.length)\n o = undefined;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\nfunction __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\nfunction __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator)\n throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function() {\n return this;\n }, i;\n function awaitReturn(f) {\n return function(v) {\n return Promise.resolve(v).then(f, reject);\n };\n }\n function verb(n, f) {\n if (g[n]) {\n i[n] = function(v) {\n return new Promise(function(a, b) {\n q.push([n, v, a, b]) > 1 || resume(n, v);\n });\n };\n if (f)\n i[n] = f(i[n]);\n }\n }\n function resume(n, v) {\n try {\n step(g[n](v));\n } catch (e) {\n settle(q[0][3], e);\n }\n }\n function step(r) {\n r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r);\n }\n function fulfill(value) {\n resume(\"next\", value);\n }\n function reject(value) {\n resume(\"throw\", value);\n }\n function settle(f, v) {\n if (f(v), q.shift(), q.length)\n resume(q[0][0], q[0][1]);\n }\n}\nfunction __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function(e) {\n throw e;\n }), verb(\"return\"), i[Symbol.iterator] = function() {\n return this;\n }, i;\n function verb(n, f) {\n i[n] = o[n] ? function(v) {\n return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v;\n } : f;\n }\n}\nfunction __asyncValues(o) {\n if (!Symbol.asyncIterator)\n throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function() {\n return this;\n }, i);\n function verb(n) {\n i[n] = o[n] && function(v) {\n return new Promise(function(resolve, reject) {\n v = o[n](v), settle(resolve, reject, v.done, v.value);\n });\n };\n }\n function settle(resolve, reject, d, v) {\n Promise.resolve(v).then(function(v2) {\n resolve({ value: v2, done: d });\n }, reject);\n }\n}\nclass ResultAsync {\n constructor(res) {\n this._promise = res;\n }\n static fromSafePromise(promise) {\n const newPromise = promise.then((value) => new Ok(value));\n return new ResultAsync(newPromise);\n }\n static fromPromise(promise, errorFn) {\n const newPromise = promise.then((value) => new Ok(value)).catch((e) => new Err(errorFn(e)));\n return new ResultAsync(newPromise);\n }\n static fromThrowable(fn, errorFn) {\n return (...args) => {\n return new ResultAsync((() => __awaiter(this, undefined, undefined, function* () {\n try {\n return new Ok(yield fn(...args));\n } catch (error) {\n return new Err(errorFn ? errorFn(error) : error);\n }\n }))());\n };\n }\n static combine(asyncResultList) {\n return combineResultAsyncList(asyncResultList);\n }\n static combineWithAllErrors(asyncResultList) {\n return combineResultAsyncListWithAllErrors(asyncResultList);\n }\n map(f) {\n return new ResultAsync(this._promise.then((res) => __awaiter(this, undefined, undefined, function* () {\n if (res.isErr()) {\n return new Err(res.error);\n }\n return new Ok(yield f(res.value));\n })));\n }\n andThrough(f) {\n return new ResultAsync(this._promise.then((res) => __awaiter(this, undefined, undefined, function* () {\n if (res.isErr()) {\n return new Err(res.error);\n }\n const newRes = yield f(res.value);\n if (newRes.isErr()) {\n return new Err(newRes.error);\n }\n return new Ok(res.value);\n })));\n }\n andTee(f) {\n return new ResultAsync(this._promise.then((res) => __awaiter(this, undefined, undefined, function* () {\n if (res.isErr()) {\n return new Err(res.error);\n }\n try {\n yield f(res.value);\n } catch (e) {}\n return new Ok(res.value);\n })));\n }\n orTee(f) {\n return new ResultAsync(this._promise.then((res) => __awaiter(this, undefined, undefined, function* () {\n if (res.isOk()) {\n return new Ok(res.value);\n }\n try {\n yield f(res.error);\n } catch (e) {}\n return new Err(res.error);\n })));\n }\n mapErr(f) {\n return new ResultAsync(this._promise.then((res) => __awaiter(this, undefined, undefined, function* () {\n if (res.isOk()) {\n return new Ok(res.value);\n }\n return new Err(yield f(res.error));\n })));\n }\n andThen(f) {\n return new ResultAsync(this._promise.then((res) => {\n if (res.isErr()) {\n return new Err(res.error);\n }\n const newValue = f(res.value);\n return newValue instanceof ResultAsync ? newValue._promise : newValue;\n }));\n }\n orElse(f) {\n return new ResultAsync(this._promise.then((res) => __awaiter(this, undefined, undefined, function* () {\n if (res.isErr()) {\n return f(res.error);\n }\n return new Ok(res.value);\n })));\n }\n match(ok, _err) {\n return this._promise.then((res) => res.match(ok, _err));\n }\n unwrapOr(t) {\n return this._promise.then((res) => res.unwrapOr(t));\n }\n safeUnwrap() {\n return __asyncGenerator(this, arguments, function* safeUnwrap_1() {\n return yield __await(yield __await(yield* __asyncDelegator(__asyncValues(yield __await(this._promise.then((res) => res.safeUnwrap()))))));\n });\n }\n then(successCallback, failureCallback) {\n return this._promise.then(successCallback, failureCallback);\n }\n [Symbol.asyncIterator]() {\n return __asyncGenerator(this, arguments, function* _a() {\n const result = yield __await(this._promise);\n if (result.isErr()) {\n yield yield __await(errAsync(result.error));\n }\n return yield __await(result.value);\n });\n }\n}\nfunction errAsync(err) {\n return new ResultAsync(Promise.resolve(new Err(err)));\n}\nvar fromPromise = ResultAsync.fromPromise;\nvar fromSafePromise = ResultAsync.fromSafePromise;\nvar fromAsyncThrowable = ResultAsync.fromThrowable;\nvar combineResultList = (resultList) => {\n let acc = ok([]);\n for (const result of resultList) {\n if (result.isErr()) {\n acc = err(result.error);\n break;\n } else {\n acc.map((list) => list.push(result.value));\n }\n }\n return acc;\n};\nvar combineResultAsyncList = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultList);\nvar combineResultListWithAllErrors = (resultList) => {\n let acc = ok([]);\n for (const result of resultList) {\n if (result.isErr() && acc.isErr()) {\n acc.error.push(result.error);\n } else if (result.isErr() && acc.isOk()) {\n acc = err([result.error]);\n } else if (result.isOk() && acc.isOk()) {\n acc.value.push(result.value);\n }\n }\n return acc;\n};\nvar combineResultAsyncListWithAllErrors = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultListWithAllErrors);\nvar Result;\n(function(Result2) {\n function fromThrowable(fn, errorFn) {\n return (...args) => {\n try {\n const result = fn(...args);\n return ok(result);\n } catch (e) {\n return err(errorFn ? errorFn(e) : e);\n }\n };\n }\n Result2.fromThrowable = fromThrowable;\n function combine(resultList) {\n return combineResultList(resultList);\n }\n Result2.combine = combine;\n function combineWithAllErrors(resultList) {\n return combineResultListWithAllErrors(resultList);\n }\n Result2.combineWithAllErrors = combineWithAllErrors;\n})(Result || (Result = {}));\nfunction ok(value) {\n return new Ok(value);\n}\nfunction err(err2) {\n return new Err(err2);\n}\nclass Ok {\n constructor(value) {\n this.value = value;\n }\n isOk() {\n return true;\n }\n isErr() {\n return !this.isOk();\n }\n map(f) {\n return ok(f(this.value));\n }\n mapErr(_f) {\n return ok(this.value);\n }\n andThen(f) {\n return f(this.value);\n }\n andThrough(f) {\n return f(this.value).map((_value) => this.value);\n }\n andTee(f) {\n try {\n f(this.value);\n } catch (e) {}\n return ok(this.value);\n }\n orTee(_f) {\n return ok(this.value);\n }\n orElse(_f) {\n return ok(this.value);\n }\n asyncAndThen(f) {\n return f(this.value);\n }\n asyncAndThrough(f) {\n return f(this.value).map(() => this.value);\n }\n asyncMap(f) {\n return ResultAsync.fromSafePromise(f(this.value));\n }\n unwrapOr(_v) {\n return this.value;\n }\n match(ok2, _err) {\n return ok2(this.value);\n }\n safeUnwrap() {\n const value = this.value;\n return function* () {\n return value;\n }();\n }\n _unsafeUnwrap(_) {\n return this.value;\n }\n _unsafeUnwrapErr(config) {\n throw createNeverThrowError(\"Called `_unsafeUnwrapErr` on an Ok\", this, config);\n }\n *[Symbol.iterator]() {\n return this.value;\n }\n}\n\nclass Err {\n constructor(error) {\n this.error = error;\n }\n isOk() {\n return false;\n }\n isErr() {\n return !this.isOk();\n }\n map(_f) {\n return err(this.error);\n }\n mapErr(f) {\n return err(f(this.error));\n }\n andThrough(_f) {\n return err(this.error);\n }\n andTee(_f) {\n return err(this.error);\n }\n orTee(f) {\n try {\n f(this.error);\n } catch (e) {}\n return err(this.error);\n }\n andThen(_f) {\n return err(this.error);\n }\n orElse(f) {\n return f(this.error);\n }\n asyncAndThen(_f) {\n return errAsync(this.error);\n }\n asyncAndThrough(_f) {\n return errAsync(this.error);\n }\n asyncMap(_f) {\n return errAsync(this.error);\n }\n unwrapOr(v) {\n return v;\n }\n match(_ok, err2) {\n return err2(this.error);\n }\n safeUnwrap() {\n const error = this.error;\n return function* () {\n yield err(error);\n throw new Error(\"Do not use this generator out of `safeTry`\");\n }();\n }\n _unsafeUnwrap(config) {\n throw createNeverThrowError(\"Called `_unsafeUnwrap` on an Err\", this, config);\n }\n _unsafeUnwrapErr(_) {\n return this.error;\n }\n *[Symbol.iterator]() {\n const self = this;\n yield self;\n return self;\n }\n}\nvar fromThrowable = Result.fromThrowable;\n\n// src/VexPacketBase.ts\nvar MATCH_STATUS_ALT_ACK = 167;\n\nclass Packet {\n data;\n static ENCODER;\n constructor(rawData) {\n this.data = rawData instanceof ArrayBuffer ? new Uint8Array(rawData) : rawData;\n }\n}\n\nclass DeviceBoundPacket extends Packet {\n static COMMAND_ID;\n static COMMAND_EXTENDED_ID;\n get commandId() {\n return this.constructor.COMMAND_ID;\n }\n get commandExtendedId() {\n return this.constructor.COMMAND_EXTENDED_ID;\n }\n constructor(payload) {\n const { COMMAND_ID: cmd, COMMAND_EXTENDED_ID: ext } = new.target;\n const encoder = Packet.ENCODER;\n super(ext === undefined ? payload === undefined ? encoder.cdcCommand(cmd) : encoder.cdcCommandWithData(cmd, payload) : payload === undefined ? encoder.cdc2Command(cmd, ext) : encoder.cdc2CommandWithData(cmd, ext, payload));\n }\n}\n\nclass HostBoundPacket extends Packet {\n static COMMAND_ID;\n static COMMAND_EXTENDED_ID;\n ack;\n payloadSize;\n ackIndex;\n constructor(data) {\n super(data);\n this.payloadSize = Packet.ENCODER.getPayloadSize(this.data);\n this.ackIndex = Packet.ENCODER.getHostHeaderLength(this.data) + 1;\n this.ack = this.data[this.ackIndex];\n }\n static isValidPacket(data, n) {\n const ack = data[n + 1];\n return ack === 118 /* CDC2_ACK */ || ack === MATCH_STATUS_ALT_ACK;\n }\n}\n\n// src/VexCRC.ts\nvar POLYNOMIAL_CRC32 = 79764919;\nvar POLYNOMIAL_CRC16 = 4129;\nfunction genTable16() {\n const table = new Uint16Array(256);\n for (let i = 0;i < 256; i++) {\n let acc = i << 8;\n for (let j = 0;j < 8; j++) {\n acc = (acc & 32768) !== 0 ? acc << 1 ^ POLYNOMIAL_CRC16 : acc << 1;\n }\n table[i] = acc & 65535;\n }\n return table;\n}\nfunction genTable32() {\n const table = new Uint32Array(256);\n for (let i = 0;i < 256; i++) {\n let acc = i << 24;\n for (let j = 0;j < 8; j++) {\n acc = (acc & 2147483648) !== 0 ? acc << 1 ^ POLYNOMIAL_CRC32 : acc << 1;\n }\n table[i] = acc;\n }\n return table;\n}\nvar CRC16_TABLE = genTable16();\nvar CRC32_TABLE = genTable32();\n\nclass CrcGenerator {\n crc32Table = CRC32_TABLE;\n static POLYNOMIAL_CRC32 = POLYNOMIAL_CRC32;\n static POLYNOMIAL_CRC16 = POLYNOMIAL_CRC16;\n crc16(buf, initValue) {\n let acc = initValue;\n for (let j = 0;j < buf.length; j++) {\n acc = (acc << 8 ^ CRC16_TABLE[(acc >>> 8 ^ buf[j]) & 255]) >>> 0;\n }\n return acc & 65535;\n }\n crc32(buf, initValue) {\n let acc = initValue;\n for (let j = 0;j < buf.length; j++) {\n acc = (acc << 8 ^ CRC32_TABLE[(acc >>> 24 ^ buf[j]) & 255]) >>> 0;\n }\n return acc >>> 0;\n }\n}\n\n// src/VexPacketModels.ts\nvar exports_VexPacketModels = {};\n__export(exports_VexPacketModels, {\n WriteKeyValueReplyD2HPacket: () => WriteKeyValueReplyD2HPacket,\n WriteKeyValueH2DPacket: () => WriteKeyValueH2DPacket,\n WriteFileReplyD2HPacket: () => WriteFileReplyD2HPacket,\n WriteFileH2DPacket: () => WriteFileH2DPacket,\n UpdateMatchModeH2DPacket: () => UpdateMatchModeH2DPacket,\n SystemVersionReplyD2HPacket: () => SystemVersionReplyD2HPacket,\n SystemVersionH2DPacket: () => SystemVersionH2DPacket,\n SendDashTouchReplyD2HPacket: () => SendDashTouchReplyD2HPacket,\n SendDashTouchH2DPacket: () => SendDashTouchH2DPacket,\n SelectDashReplyD2HPacket: () => SelectDashReplyD2HPacket,\n SelectDashH2DPacket: () => SelectDashH2DPacket,\n ScreenCaptureReplyD2HPacket: () => ScreenCaptureReplyD2HPacket,\n ScreenCaptureH2DPacket: () => ScreenCaptureH2DPacket,\n ReadLogPageReplyD2HPacket: () => ReadLogPageReplyD2HPacket,\n ReadLogPageH2DPacket: () => ReadLogPageH2DPacket,\n ReadKeyValueReplyD2HPacket: () => ReadKeyValueReplyD2HPacket,\n ReadKeyValueH2DPacket: () => ReadKeyValueH2DPacket,\n ReadFileReplyD2HPacket: () => ReadFileReplyD2HPacket,\n ReadFileH2DPacket: () => ReadFileH2DPacket,\n Query1ReplyD2HPacket: () => Query1ReplyD2HPacket,\n Query1H2DPacket: () => Query1H2DPacket,\n MatchStatusReplyD2HPacket: () => MatchStatusReplyD2HPacket,\n MatchModeReplyD2HPacket: () => MatchModeReplyD2HPacket,\n LoadFileActionReplyD2HPacket: () => LoadFileActionReplyD2HPacket,\n LoadFileActionH2DPacket: () => LoadFileActionH2DPacket,\n LinkFileReplyD2HPacket: () => LinkFileReplyD2HPacket,\n LinkFileH2DPacket: () => LinkFileH2DPacket,\n InitFileTransferReplyD2HPacket: () => InitFileTransferReplyD2HPacket,\n InitFileTransferH2DPacket: () => InitFileTransferH2DPacket,\n GetSystemStatusReplyD2HPacket: () => GetSystemStatusReplyD2HPacket,\n GetSystemStatusH2DPacket: () => GetSystemStatusH2DPacket,\n GetSystemFlagsReplyD2HPacket: () => GetSystemFlagsReplyD2HPacket,\n GetSystemFlagsH2DPacket: () => GetSystemFlagsH2DPacket,\n GetSlot5to8InfoReplyD2HPacket: () => GetSlot5to8InfoReplyD2HPacket,\n GetSlot5to8InfoH2DPacket: () => GetSlot5to8InfoH2DPacket,\n GetSlot1to4InfoReplyD2HPacket: () => GetSlot1to4InfoReplyD2HPacket,\n GetSlot1to4InfoH2DPacket: () => GetSlot1to4InfoH2DPacket,\n GetRadioStatusReplyD2HPacket: () => GetRadioStatusReplyD2HPacket,\n GetRadioStatusH2DPacket: () => GetRadioStatusH2DPacket,\n GetRadioModeH2DPacket: () => GetRadioModeH2DPacket,\n GetProgramSlotInfoReplyD2HPacket: () => GetProgramSlotInfoReplyD2HPacket,\n GetProgramSlotInfoH2DPacket: () => GetProgramSlotInfoH2DPacket,\n GetMatchStatusH2DPacket: () => GetMatchStatusH2DPacket,\n GetLogCountReplyD2HPacket: () => GetLogCountReplyD2HPacket,\n GetLogCountH2DPacket: () => GetLogCountH2DPacket,\n GetFileMetadataReplyD2HPacket: () => GetFileMetadataReplyD2HPacket,\n GetFileMetadataH2DPacket: () => GetFileMetadataH2DPacket,\n GetFdtStatusReplyD2HPacket: () => GetFdtStatusReplyD2HPacket,\n GetFdtStatusH2DPacket: () => GetFdtStatusH2DPacket,\n GetDirectoryFileCountReplyD2HPacket: () => GetDirectoryFileCountReplyD2HPacket,\n GetDirectoryFileCountH2DPacket: () => GetDirectoryFileCountH2DPacket,\n GetDirectoryEntryReplyD2HPacket: () => GetDirectoryEntryReplyD2HPacket,\n GetDirectoryEntryH2DPacket: () => GetDirectoryEntryH2DPacket,\n GetDeviceStatusReplyD2HPacket: () => GetDeviceStatusReplyD2HPacket,\n GetDeviceStatusH2DPacket: () => GetDeviceStatusH2DPacket,\n FileFormatReplyD2HPacket: () => FileFormatReplyD2HPacket,\n FileFormatH2DPacket: () => FileFormatH2DPacket,\n FileControlReplyD2HPacket: () => FileControlReplyD2HPacket,\n FileControlH2DPacket: () => FileControlH2DPacket,\n FileClearUpReplyD2HPacket: () => FileClearUpReplyD2HPacket,\n FileClearUpH2DPacket: () => FileClearUpH2DPacket,\n FactoryStatusReplyD2HPacket: () => FactoryStatusReplyD2HPacket,\n FactoryStatusH2DPacket: () => FactoryStatusH2DPacket,\n FactoryEnableReplyD2HPacket: () => FactoryEnableReplyD2HPacket,\n FactoryEnableH2DPacket: () => FactoryEnableH2DPacket,\n ExitFileTransferReplyD2HPacket: () => ExitFileTransferReplyD2HPacket,\n ExitFileTransferH2DPacket: () => ExitFileTransferH2DPacket,\n EraseFileReplyD2HPacket: () => EraseFileReplyD2HPacket,\n EraseFileH2DPacket: () => EraseFileH2DPacket\n});\n\n// src/VexFirmwareVersion.ts\nclass VexFirmwareVersion {\n major;\n minor;\n build;\n beta;\n constructor(major, minor, build, beta) {\n this.major = major;\n this.minor = minor;\n this.build = build;\n this.beta = beta;\n }\n static fromString(version) {\n const parts = version.toLowerCase().replace(/b/g, \"\").split(\".\").map((x) => parseInt(x, 10));\n while (parts.length < 4)\n parts.push(0);\n return new VexFirmwareVersion(parts[0], parts[1], parts[2], parts[3]);\n }\n static fromUint8Array(data, offset = 0, reverse = false) {\n return new VexFirmwareVersion(data[offset + (reverse ? 3 : 0)], data[offset + (reverse ? 2 : 1)], data[offset + (reverse ? 1 : 2)], data[offset + (reverse ? 0 : 3)]);\n }\n static allZero() {\n return new VexFirmwareVersion(0, 0, 0, 0);\n }\n static fromCatalogString(version) {\n return VexFirmwareVersion.fromString(version.replace(/_/g, \".\"));\n }\n isBeta() {\n return this.beta !== 0;\n }\n toUint8Array(reverse = false) {\n const data = new Uint8Array(4);\n data[reverse ? 3 : 0] = this.major;\n data[reverse ? 2 : 1] = this.minor;\n data[reverse ? 1 : 2] = this.build;\n data[reverse ? 0 : 3] = this.beta;\n return data;\n }\n toUserString() {\n return `${this.major}.${this.minor}.${this.build}`;\n }\n toInternalString() {\n return `${this.toUserString()}.b${this.beta}`;\n }\n compare(that) {\n for (const [a, b] of [\n [this.major, that.major],\n [this.minor, that.minor],\n [this.build, that.build],\n [this.beta, that.beta]\n ]) {\n const delta = a - b;\n if (delta !== 0)\n return delta;\n }\n return 0;\n }\n}\n\n// src/VexPacketView.ts\nvar textDecoder = new TextDecoder(\"UTF-8\");\n\nclass PacketView extends DataView {\n position = 0;\n littleEndianDefault = true;\n constructor(buffer, offset = 0, length = buffer.byteLength - offset) {\n super(buffer, offset, length);\n }\n static fromPacket(packet) {\n const view = new PacketView(packet.data.buffer, packet.data.byteOffset);\n view.position = packet.ackIndex + 1;\n return view;\n }\n nextInt8() {\n return this.getInt8(this.position++);\n }\n nextUint8() {\n return this.getUint8(this.position++);\n }\n nextInt16(littleEndian = this.littleEndianDefault) {\n const result = this.getInt16(this.position, littleEndian);\n this.position += 2;\n return result;\n }\n nextUint16(littleEndian = this.littleEndianDefault) {\n const result = this.getUint16(this.position, littleEndian);\n this.position += 2;\n return result;\n }\n nextInt32(littleEndian = this.littleEndianDefault) {\n const result = this.getInt32(this.position, littleEndian);\n this.position += 4;\n return result;\n }\n nextUint32(littleEndian = this.littleEndianDefault) {\n const result = this.getUint32(this.position, littleEndian);\n this.position += 4;\n return result;\n }\n nextString(length) {\n const result = textDecoder.decode(new Uint8Array(this.buffer, this.byteOffset + this.position, length));\n this.position += length;\n return result;\n }\n nextNTBS(length) {\n const start = this.position;\n const result = this.nextVarNTBS(length);\n this.position = start + length;\n return result;\n }\n nextVarNTBS(length) {\n const start = this.position;\n let byteLength = 0;\n for (let i = 0;i < length; i++) {\n if (this.byteLength <= this.position)\n break;\n const g = this.nextUint8();\n if (g === 0)\n break;\n byteLength++;\n }\n return textDecoder.decode(new Uint8Array(this.buffer, this.byteOffset + start, byteLength));\n }\n nextVersion(reverse = false) {\n const result = VexFirmwareVersion.fromUint8Array(new Uint8Array(this.buffer, this.byteOffset, this.byteLength), this.position, reverse);\n this.position += 4;\n return result;\n }\n}\n\n// src/VexPacketModels.ts\nvar textEncoder = new TextEncoder;\nfunction filePayload(a, b, fileName) {\n const payload = new Uint8Array(26);\n payload[0] = a;\n payload[1] = b;\n payload.set(encodeFixedText(fileName, \"Filename\", 23), 2);\n return payload;\n}\nvar clamp100 = (value) => value !== undefined && value > 100 ? 100 : value;\n\nclass Query1H2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 33;\n static COMMAND_EXTENDED_ID = undefined;\n}\n\nclass SystemVersionH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 164;\n static COMMAND_EXTENDED_ID = undefined;\n}\n\nclass UpdateMatchModeH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 88;\n static COMMAND_EXTENDED_ID = 193;\n constructor(mode, matchClock) {\n const bit1 = mode === \"autonomous\" ? 10 : mode === \"driver\" ? 8 : 11;\n const payload = new Uint8Array(5);\n payload[0] = bit1 & 15;\n new DataView(payload.buffer).setUint32(1, matchClock, true);\n super(payload);\n }\n}\n\nclass GetMatchStatusH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 88;\n static COMMAND_EXTENDED_ID = 194;\n}\n\nclass GetRadioModeH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 88;\n static COMMAND_EXTENDED_ID = 65;\n constructor(mode) {\n super(Uint8Array.of(mode));\n }\n}\n\nclass FileControlH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 16;\n constructor(a, b) {\n super(Uint8Array.of(a, b));\n }\n}\n\nclass InitFileTransferH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 17;\n constructor(operation, target, vendor, options, binary, addr, name, type, version = new VexFirmwareVersion(1, 0, 0, 0)) {\n const payload = new Uint8Array(52);\n const view = new DataView(payload.buffer);\n payload[0] = operation;\n payload[1] = target;\n payload[2] = vendor;\n payload[3] = options;\n view.setUint32(4, binary.length, true);\n view.setUint32(8, addr, true);\n view.setUint32(12, operation === 1 /* WRITE */ ? Packet.ENCODER.crcgen.crc32(binary, 0) : 0, true);\n let ext = /(?:\\.([^.]+))?$/.exec(name)?.[1] ?? \"\";\n if (ext === \"gz\")\n ext = \"bin\";\n payload.set(encodeFixedText(type ?? ext, \"File type\", 4), 16);\n const timestamp = (Date.now() / 1000 >>> 0) - PacketEncoder.J2000_EPOCH;\n view.setUint32(20, timestamp, true);\n payload.set(version.toUint8Array(), 24);\n payload.set(encodeFixedText(name, \"Filename\", 23), 28);\n super(payload);\n }\n}\n\nclass ExitFileTransferH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 18;\n constructor(action) {\n super(Uint8Array.of(action));\n }\n}\n\nclass WriteFileH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 19;\n constructor(addr, buf) {\n const payload = new Uint8Array(4 + buf.length);\n new DataView(payload.buffer).setUint32(0, addr, true);\n payload.set(buf, 4);\n super(payload);\n }\n}\n\nclass ReadFileH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 20;\n constructor(addr, size) {\n const payload = new Uint8Array(6);\n const view = new DataView(payload.buffer);\n view.setUint32(0, addr, true);\n view.setUint16(4, size, true);\n super(payload);\n }\n}\n\nclass LinkFileH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 21;\n constructor(vendor, fileName, options) {\n super(filePayload(vendor, options, fileName));\n }\n}\n\nclass GetDirectoryFileCountH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 22;\n constructor(vendor) {\n super(Uint8Array.of(vendor, 0));\n }\n}\n\nclass GetDirectoryEntryH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 23;\n constructor(index) {\n super(Uint8Array.of(index, 0));\n }\n}\n\nclass LoadFileActionH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 24;\n constructor(vendor, actionId, fileNameOrSlotNumber) {\n const fileName = typeof fileNameOrSlotNumber === \"string\" ? fileNameOrSlotNumber : `___s_${fileNameOrSlotNumber - 1}.bin`;\n super(filePayload(vendor, actionId, fileName));\n }\n}\n\nclass GetFileMetadataH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 25;\n constructor(vendor, fileName, options) {\n super(filePayload(vendor, options, fileName));\n }\n}\n\nclass EraseFileH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 27;\n constructor(vendor, fileName) {\n super(filePayload(vendor, 128, fileName));\n }\n}\n\nclass GetProgramSlotInfoH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 28;\n constructor(vendor, fileName) {\n super(filePayload(vendor, 0, fileName));\n }\n}\n\nclass FileClearUpH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 30;\n constructor(vendor) {\n super(Uint8Array.of(vendor, 0));\n }\n}\n\nclass FileFormatH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 31;\n constructor() {\n super(Uint8Array.of(68, 67, 66, 65));\n }\n}\n\nclass GetSystemFlagsH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 32;\n}\n\nclass GetDeviceStatusH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 33;\n}\n\nclass GetSystemStatusH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 34;\n}\n\nclass GetFdtStatusH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 35;\n}\n\nclass GetLogCountH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 36;\n}\n\nclass ReadLogPageH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 37;\n constructor(offset, count) {\n const payload = new Uint8Array(8);\n const view = new DataView(payload.buffer);\n view.setUint32(0, offset, true);\n view.setUint32(4, count, true);\n super(payload);\n }\n}\n\nclass GetRadioStatusH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 38;\n}\n\nclass ScreenCaptureH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 40;\n constructor(e) {\n super(Uint8Array.of(e));\n }\n}\n\nclass SendDashTouchH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 42;\n constructor(x, y, press) {\n const payload = new Uint8Array(6);\n const view = new DataView(payload.buffer);\n view.setUint16(0, x, true);\n view.setUint16(2, y, true);\n view.setUint16(4, press ? 1 : 0, true);\n super(payload);\n }\n}\n\nclass SelectDashH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 43;\n constructor(screen, port) {\n super(Uint8Array.of(screen, port));\n }\n}\n\nclass ReadKeyValueH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 46;\n constructor(key) {\n const payload = new Uint8Array(32);\n payload.set(encodeFixedText(key, \"Key\", 31), 0);\n super(payload);\n }\n}\n\nclass WriteKeyValueH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 47;\n constructor(key, value) {\n const strk = encodeFixedText(key, \"Key\", 31);\n const strv = textEncoder.encode(value);\n if (strk.byteLength + strv.byteLength + 20 > 32767) {\n throw new RangeError(\"Key and value are too large for a protocol packet\");\n }\n const payload = new Uint8Array(strk.length + strv.length + 20);\n payload.set(strk, 0);\n payload.set(strv, strk.length + 1);\n super(payload);\n }\n}\n\nclass GetSlot1to4InfoH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 49;\n}\n\nclass GetSlot5to8InfoH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 50;\n}\n\nclass FactoryStatusH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 241;\n}\n\nclass FactoryEnableH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 255;\n constructor() {\n super(Uint8Array.of(77, 76, 75, 74));\n }\n}\n\nclass Query1ReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 33;\n static COMMAND_EXTENDED_ID = undefined;\n joystickFlag1;\n joystickFlag2;\n brainFlag1;\n brainFlag2;\n bootloadFlag1;\n bootloadFlag2;\n constructor(data) {\n super(data);\n this.joystickFlag1 = this.data[4];\n this.joystickFlag2 = this.data[5];\n this.brainFlag1 = this.data[6];\n this.brainFlag2 = this.data[7];\n this.bootloadFlag1 = this.data[10];\n this.bootloadFlag2 = this.data[11];\n }\n}\n\nclass SystemVersionReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 164;\n static COMMAND_EXTENDED_ID = undefined;\n version;\n hardware;\n constructor(data) {\n super(data);\n this.version = new VexFirmwareVersion(this.data[4], this.data[5], this.data[6], this.data[8]);\n this.hardware = this.data[7];\n }\n}\n\nclass MatchModeReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 88;\n static COMMAND_EXTENDED_ID = 193;\n modebit;\n constructor(data) {\n super(data);\n this.modebit = PacketView.fromPacket(this).nextUint8();\n }\n}\n\nclass MatchStatusReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 88;\n static COMMAND_EXTENDED_ID = 194;\n rssi;\n systemStatusBits;\n radioStatusBits;\n fieldStatusBits;\n matchClock;\n brainBatteryPercent;\n controllerBatteryPercent;\n partnerControllerBatteryPercent;\n pad;\n buttons;\n activeProgram;\n radioType;\n radioChannel;\n radioSlot;\n robotName;\n controllerFlags;\n rxSignalQuality;\n constructor(data) {\n super(data);\n const view = PacketView.fromPacket(this);\n const n = this.ackIndex;\n this.rssi = view.nextInt8();\n this.systemStatusBits = view.nextUint16();\n this.radioStatusBits = view.nextUint16();\n this.fieldStatusBits = view.nextUint8();\n this.matchClock = view.nextUint8();\n this.brainBatteryPercent = view.nextUint8();\n this.controllerBatteryPercent = view.nextUint8();\n this.partnerControllerBatteryPercent = view.nextUint8();\n this.pad = view.nextUint8();\n this.buttons = view.nextUint16();\n this.activeProgram = view.nextUint8();\n this.radioType = view.nextUint8();\n this.radioChannel = view.nextUint8();\n this.radioSlot = view.nextUint8();\n this.controllerFlags = view.getUint8(n + 28);\n this.rxSignalQuality = view.getUint8(n + 29);\n const raw = new TextDecoder(\"UTF-8\").decode(this.data.slice(n + 18, n + this.payloadSize + 28));\n const end = raw.indexOf(\"\\x00\");\n this.robotName = end > -1 ? raw.slice(0, end) : raw;\n }\n}\n\nclass FileControlReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 16;\n}\n\nclass InitFileTransferReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 17;\n windowSize;\n fileSize;\n crc32;\n constructor(data) {\n super(data);\n const view = PacketView.fromPacket(this);\n this.windowSize = view.nextUint16();\n this.fileSize = view.nextUint32();\n this.crc32 = view.nextUint32();\n }\n}\n\nclass ExitFileTransferReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 18;\n}\n\nclass WriteFileReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 19;\n}\n\nclass ReadFileReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 20;\n addr;\n length;\n buf;\n constructor(data) {\n super(data);\n const view = PacketView.fromPacket(this);\n this.addr = view.nextUint32();\n this.length = this.payloadSize - 8;\n this.buf = this.data.slice(view.position, view.position + this.length).buffer;\n }\n}\n\nclass LinkFileReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 21;\n}\n\nclass GetDirectoryFileCountReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 22;\n count;\n constructor(data) {\n super(data);\n this.count = PacketView.fromPacket(this).nextUint16();\n }\n}\n\nclass GetDirectoryEntryReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 23;\n file;\n constructor(data) {\n super(data);\n if (this.payloadSize <= 4)\n return;\n const view = PacketView.fromPacket(this);\n this.file = {\n index: view.nextUint8(),\n size: view.nextUint32(),\n loadAddress: view.nextUint32(),\n crc32: view.nextUint32(),\n type: view.nextString(4),\n timestamp: view.nextUint32() + PacketEncoder.J2000_EPOCH,\n version: view.nextVersion(),\n filename: view.nextNTBS(32)\n };\n }\n}\n\nclass LoadFileActionReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 24;\n}\n\nclass GetFileMetadataReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 25;\n file;\n constructor(data) {\n super(data);\n if (this.payloadSize <= 4)\n return;\n const view = PacketView.fromPacket(this);\n view.nextUint8();\n this.file = {\n size: view.nextUint32(),\n loadAddress: view.nextUint32(),\n crc32: view.nextUint32(),\n type: view.nextString(4),\n timestamp: view.nextUint32() + PacketEncoder.J2000_EPOCH,\n version: view.nextVersion()\n };\n }\n}\n\nclass EraseFileReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 27;\n}\n\nclass GetProgramSlotInfoReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 28;\n requestedSlot;\n slot;\n constructor(data) {\n super(data);\n const view = PacketView.fromPacket(this);\n this.slot = view.nextUint8();\n this.requestedSlot = view.nextUint8();\n }\n}\n\nclass FileClearUpReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 30;\n}\n\nclass FileFormatReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 31;\n}\n\nclass GetSystemFlagsReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 32;\n flags;\n radioSearching = false;\n radioQuality;\n controllerBatteryPercent;\n partnerControllerBatteryPercent;\n battery;\n currentProgram = 0;\n constructor(data) {\n super(data);\n const view = PacketView.fromPacket(this);\n this.flags = view.nextUint32();\n const hasPartner = (8192 & this.flags) !== 0;\n const hasRadio = (1536 & this.flags) === 1536;\n const byte1 = view.nextUint8();\n const byte2 = view.nextUint8();\n if (this.payloadSize === 11) {\n this.battery = clamp100(8 * (byte1 & 15));\n if ((this.flags & 256) !== 0 || hasRadio) {\n this.controllerBatteryPercent = clamp100(8 * (byte1 >> 4 & 15));\n }\n if (hasRadio)\n this.radioQuality = clamp100(8 * (byte2 & 15));\n this.radioSearching = (this.flags & 1536) === 512;\n if (hasPartner) {\n this.partnerControllerBatteryPercent = clamp100(8 * (byte2 >> 4 & 15));\n }\n this.currentProgram = view.nextUint8();\n }\n }\n}\n\nclass GetDeviceStatusReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 33;\n count;\n devices;\n constructor(data) {\n super(data);\n const view = PacketView.fromPacket(this);\n this.count = view.nextUint8();\n this.devices = [];\n for (let i = 0;i < this.count; i++) {\n this.devices.push({\n port: view.nextUint8(),\n type: view.nextUint8(),\n status: view.nextUint8(),\n betaversion: view.nextUint8(),\n version: view.nextUint16(),\n bootversion: view.nextUint16()\n });\n }\n }\n}\n\nclass GetSystemStatusReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 34;\n systemVersion;\n cpu0Version;\n cpu1Version;\n nxpVersion = VexFirmwareVersion.allZero();\n touchVersion;\n uniqueId = 1234;\n sysflags = [0, 0, 0, 0, 0, 0, 0];\n eventBrain = false;\n romBootloaderActive = false;\n ramBootloaderActive = false;\n goldenVersion = VexFirmwareVersion.allZero();\n constructor(data) {\n super(data);\n const view = PacketView.fromPacket(this);\n view.nextUint8();\n this.systemVersion = view.nextVersion();\n this.cpu0Version = view.nextVersion();\n this.cpu1Version = view.nextVersion();\n this.touchVersion = view.nextVersion(true);\n if (this.payloadSize > 25) {\n this.uniqueId = view.nextUint32();\n this.sysflags = [\n view.nextUint8(),\n view.nextUint8(),\n view.nextUint8(),\n view.nextUint8(),\n view.nextUint8(),\n 0,\n view.nextUint8()\n ];\n const flags6 = this.sysflags[6];\n this.eventBrain = (1 & flags6) !== 0;\n this.romBootloaderActive = (2 & flags6) !== 0;\n this.ramBootloaderActive = (4 & flags6) !== 0;\n view.nextUint16();\n this.goldenVersion = view.nextVersion();\n }\n if (this.payloadSize > 37) {\n this.nxpVersion = view.nextVersion();\n }\n }\n}\n\nclass GetFdtStatusReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 35;\n count;\n status;\n constructor(data) {\n super(data);\n const view = PacketView.fromPacket(this);\n this.count = view.nextUint8();\n this.status = [];\n for (let i = 0;i < this.count; i++) {\n this.status.push({\n index: view.nextUint8(),\n type: view.nextUint8(),\n status: view.nextUint8(),\n betaversion: view.nextUint8(),\n version: view.nextUint16(),\n bootversion: view.nextUint16()\n });\n }\n }\n}\n\nclass GetLogCountReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 36;\n count;\n constructor(data) {\n super(data);\n const view = PacketView.fromPacket(this);\n view.nextUint8();\n this.count = view.nextUint32();\n }\n}\n\nclass ReadLogPageReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 37;\n offset;\n count;\n entries;\n constructor(data) {\n super(data);\n const view = PacketView.fromPacket(this);\n const size = view.nextUint8();\n this.offset = view.nextUint32();\n this.count = view.nextUint16();\n this.entries = [];\n let j = this.ackIndex + 8;\n for (let i = 0;i < this.count; i++) {\n this.entries.push({\n code: view.getUint8(j),\n type: view.getUint8(j + 1),\n desc: view.getUint8(j + 2),\n spare: view.getUint8(j + 3),\n time: view.getUint32(j + 4, true)\n });\n j += size;\n }\n }\n}\n\nclass GetRadioStatusReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 38;\n device;\n quality;\n strength;\n channel;\n timeslot;\n constructor(data) {\n super(data);\n const view = PacketView.fromPacket(this);\n this.device = view.nextUint8();\n this.quality = view.nextUint16();\n this.strength = view.nextInt16();\n this.channel = this.data[this.ackIndex + 6];\n this.timeslot = this.data[this.ackIndex + 7];\n }\n}\n\nclass ScreenCaptureReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 40;\n}\n\nclass SendDashTouchReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 42;\n}\n\nclass SelectDashReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 43;\n}\n\nclass ReadKeyValueReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 46;\n value;\n constructor(data) {\n super(data);\n this.value = PacketView.fromPacket(this).nextVarNTBS(255);\n }\n}\n\nclass WriteKeyValueReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 47;\n}\n\nclass GetSlot1to4InfoReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 49;\n slotFlags;\n slots;\n constructor(data, start = 1) {\n super(data);\n const view = PacketView.fromPacket(this);\n this.slotFlags = view.nextUint8();\n this.slots = [];\n for (let i = 0;i < 4; i++) {\n if ((this.slotFlags & 1 << start - 1 + i) === 0)\n continue;\n const icon = view.nextUint16();\n const nameLen = view.nextUint8();\n this.slots.push({\n slot: start + i,\n icon,\n name: view.nextString(nameLen)\n });\n }\n }\n}\n\nclass GetSlot5to8InfoReplyD2HPacket extends GetSlot1to4InfoReplyD2HPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 50;\n slotStartIndex = 5;\n constructor(data) {\n super(data, 5);\n }\n}\n\nclass FactoryStatusReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 241;\n status;\n percent;\n constructor(data) {\n super(data);\n const view = PacketView.fromPacket(this);\n this.status = view.nextUint8();\n this.percent = view.nextUint8();\n }\n}\n\nclass FactoryEnableReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 255;\n}\n\n// src/VexPacketEncoder.ts\nvar textEncoder2 = new TextEncoder;\nvar HEADER_TO_DEVICE = Uint8Array.of(201, 54, 184, 71);\nfunction encodeFixedText(value, field, maxBytes) {\n const encoded = textEncoder2.encode(value);\n if (encoded.byteLength > maxBytes) {\n throw new RangeError(`${field} must be at most ${maxBytes} UTF-8 bytes`);\n }\n return encoded;\n}\n\nclass PacketEncoder {\n static HEADERS_LENGTH = 4;\n static HEADER_TO_DEVICE = [201, 54, 184, 71];\n static HEADER_TO_HOST = [170, 85];\n static J2000_EPOCH = 946684800;\n vexVersion = 0;\n crcgen = new CrcGenerator;\n allPacketsTable = new Map;\n static getInstance() {\n Packet.ENCODER ??= new PacketEncoder;\n return Packet.ENCODER;\n }\n constructor() {\n for (const packet of Object.values(exports_VexPacketModels)) {\n if (typeof packet === \"function\" && packet.prototype instanceof HostBoundPacket) {\n const type = packet;\n let byExtendedId = this.allPacketsTable.get(type.COMMAND_ID);\n if (byExtendedId === undefined) {\n byExtendedId = new Map;\n this.allPacketsTable.set(type.COMMAND_ID, byExtendedId);\n }\n byExtendedId.set(type.COMMAND_EXTENDED_ID, type);\n }\n }\n }\n getPacketType(commandId, commandExtendedId) {\n if (commandId === undefined)\n return;\n return this.allPacketsTable.get(commandId)?.get(commandExtendedId);\n }\n createHeader(buf) {\n if (buf === undefined || buf.byteLength < PacketEncoder.HEADERS_LENGTH) {\n buf = new ArrayBuffer(PacketEncoder.HEADERS_LENGTH);\n }\n const h = new Uint8Array(buf);\n h.set(HEADER_TO_DEVICE);\n return h;\n }\n cdcCommand(cmd) {\n const h = new Uint8Array(5);\n h.set(HEADER_TO_DEVICE);\n h[4] = cmd;\n return h;\n }\n cdcCommandWithData(cmd, data) {\n const h = new Uint8Array(6 + data.length);\n h.set(HEADER_TO_DEVICE);\n h[4] = cmd;\n h[5] = data.length;\n h.set(data, 6);\n return h;\n }\n cdc2Command(cmd, ext) {\n const h = new Uint8Array(9);\n h.set(HEADER_TO_DEVICE);\n h[4] = cmd;\n h[5] = ext;\n h[6] = 0;\n this.appendCrc16(h);\n return h;\n }\n cdc2CommandBufferLength(data) {\n return PacketEncoder.HEADERS_LENGTH + data.length + 5 + (data.length > 127 ? 1 : 0);\n }\n cdc2CommandWithData(cmd, ext, data) {\n const h = new Uint8Array(this.cdc2CommandBufferLength(data));\n h.set(HEADER_TO_DEVICE);\n h[4] = cmd;\n h[5] = ext;\n if (data.length < 128) {\n h[6] = data.length;\n h.set(data, 7);\n } else {\n h[6] = data.length >>> 8 | 128;\n h[7] = data.length & 255;\n h.set(data, 8);\n }\n this.appendCrc16(h);\n return h;\n }\n appendCrc16(h) {\n const crc = this.crcgen.crc16(h.subarray(0, h.length - 2), 0);\n h[h.length - 2] = crc >>> 8;\n h[h.length - 1] = crc & 255;\n }\n validateHeader(data) {\n return data[0] === PacketEncoder.HEADER_TO_HOST[0] && data[1] === PacketEncoder.HEADER_TO_HOST[1];\n }\n validateMessageCdc(data) {\n const crc = (data[data.byteLength - 2] << 8) + data[data.byteLength - 1];\n return this.crcgen.crc16(data.subarray(0, data.byteLength - 2), 0) === crc;\n }\n getPayloadSize(data) {\n const a = data[3];\n return (a & 128) === 0 ? a : ((a & 127) << 8) + data[4];\n }\n getHostHeaderLength(data) {\n return (data[3] & 128) === 0 ? 4 : 5;\n }\n}\n\n// src/VexConnection.ts\nvar thePacketEncoder = PacketEncoder.getInstance();\nvar SCREEN_CAPTURE_HEIGHT = 272;\nvar SCREEN_CAPTURE_WIDTH = 480;\nvar SCREEN_CAPTURE_CHANNELS = 3;\nvar SCREEN_CAPTURE_MESSAGE_WIDTH = 512;\nvar SCREEN_CAPTURE_MESSAGE_CHANNELS = 4;\n\nclass VexSerialConnection extends VexEventTarget {\n filters = [{ usbVendorId: 10376 }];\n writer;\n reader;\n port;\n serial;\n callbacksQueue = [];\n _onPortDisconnect = null;\n _closePromise = null;\n _wasConnected = false;\n fileTransferTail = Promise.resolve();\n fileTransferDepth = 0;\n get isConnected() {\n return this.port !== undefined && this.reader !== undefined && this.writer !== undefined;\n }\n get isFileTransferring() {\n return this.fileTransferDepth > 0;\n }\n constructor(serial) {\n super();\n this.serial = serial;\n }\n reportWarning(message, details) {\n this.emit(\"warning\", { message, details });\n }\n async close() {\n if (this._closePromise)\n return this._closePromise;\n if (!this._hasOpenResources())\n return;\n this._closePromise = this._doClose();\n try {\n await this._closePromise;\n } finally {\n this._closePromise = null;\n }\n }\n _hasOpenResources() {\n return this.port !== undefined || this.reader !== undefined || this.writer !== undefined || this._onPortDisconnect !== null || this.callbacksQueue.length > 0;\n }\n async _doClose() {\n for (const callback of this.callbacksQueue.splice(0)) {\n clearTimeout(callback.timeout);\n callback.callback(255 /* CDC2_NACK */);\n }\n const onDisconnect = this._onPortDisconnect;\n this._onPortDisconnect = null;\n if (onDisconnect !== null) {\n try {\n this.port?.removeEventListener(\"disconnect\", onDisconnect);\n } catch {}\n }\n const writer = this.writer;\n this.writer = undefined;\n if (writer !== undefined) {\n try {\n await writer.close();\n } catch {} finally {\n try {\n writer.releaseLock();\n } catch {}\n }\n }\n const reader = this.reader;\n this.reader = undefined;\n if (reader !== undefined) {\n try {\n await reader.cancel();\n } catch {}\n try {\n while (true) {\n const { done } = await reader.read();\n if (done)\n break;\n }\n } catch {} finally {\n try {\n reader.releaseLock();\n } catch {}\n }\n }\n const port = this.port;\n this.port = undefined;\n if (port !== undefined) {\n try {\n await port.close();\n } catch (e) {\n this.reportWarning(\"failed to close the serial port\", e);\n }\n }\n if (this._wasConnected) {\n this._wasConnected = false;\n this.emit(\"disconnected\", undefined);\n }\n }\n open(use = 0, askUser = true) {\n return new ResultAsync(this._open(use, askUser));\n }\n async _open(use, askUser) {\n if (this._closePromise !== null)\n await this._closePromise;\n if (this.port !== undefined) {\n return err(new VexIoError(\"Already connected.\"));\n }\n const ports = (await this.serial.getPorts()).filter((p) => {\n const info = p.getInfo();\n return this.filters.find((f) => (f.usbVendorId === undefined || f.usbVendorId === info.usbVendorId) && (f.usbProductId === undefined || f.usbProductId === info.usbProductId));\n }).filter((candidate) => candidate.readable === null);\n let port = ports[use];\n if (port == null && askUser) {\n try {\n port = await this.serial.requestPort({ filters: this.filters });\n } catch {}\n }\n if (port == null)\n return ok(\"no-port\");\n if (port.readable != null)\n return ok(\"busy\");\n try {\n this.port = port;\n await port.open({ baudRate: 115200 });\n this._onPortDisconnect = () => {\n this.close();\n };\n this.port.addEventListener(\"disconnect\", this._onPortDisconnect);\n this.writer = this.port.writable.getWriter();\n this.reader = this.port.readable.getReader();\n this.startReader();\n this._wasConnected = true;\n this.emit(\"connected\", undefined);\n return ok(\"opened\");\n } catch (e) {\n await this.close();\n return err(toVexSerialError(e, \"io\"));\n }\n }\n async writeDataAsync(rawData, timeout = 1000) {\n return new Promise((resolve) => {\n if (this.writer === undefined) {\n resolve(255 /* CDC2_NACK */);\n return;\n }\n const data = rawData instanceof DeviceBoundPacket ? rawData.data : rawData;\n const cb = {\n callback: resolve,\n timeout: setTimeout(() => {\n const index = this.callbacksQueue.indexOf(cb);\n if (index === -1)\n return;\n this.callbacksQueue.splice(index, 1);\n cb.callback(256 /* TIMEOUT */);\n }, timeout),\n wantedCommandId: rawData instanceof DeviceBoundPacket ? rawData.commandId : undefined,\n wantedCommandExId: rawData instanceof DeviceBoundPacket ? rawData.commandExtendedId : undefined\n };\n this.callbacksQueue.push(cb);\n this.writer.write(data).catch(() => {\n const index = this.callbacksQueue.indexOf(cb);\n if (index === -1)\n return;\n this.callbacksQueue.splice(index, 1);\n clearTimeout(cb.timeout);\n resolve(257 /* WRITE_ERROR */);\n });\n });\n }\n request(packet, ReplyType, timeout = 1000) {\n return new ResultAsync((async () => {\n const result = await this.writeDataAsync(packet, timeout);\n if (result instanceof ReplyType)\n return ok(result);\n return err(new VexProtocolError(expectedReplyMessage(packet, ReplyType, result), typeof result === \"number\" ? result : undefined));\n })());\n }\n async readData(cache, expectedSize) {\n if (this.reader == null)\n throw new Error(\"No reader\");\n while (cache.byteLength < expectedSize) {\n const { value: readData, done: isDone } = await this.reader.read();\n if (isDone)\n throw new Error(\"No data\");\n cache = binaryArrayJoin(cache, readData);\n }\n return cache;\n }\n async startReader() {\n let cache = new Uint8Array([]);\n let sliceIdx = 0;\n for (;; )\n try {\n cache = await this.readData(cache, 5);\n sliceIdx = 0;\n while (!thePacketEncoder.validateHeader(cache)) {\n const nextHeader = cache.findIndex((byte, index) => index > 0 && byte === PacketEncoder.HEADER_TO_HOST[0] && cache[index + 1] === PacketEncoder.HEADER_TO_HOST[1]);\n if (nextHeader >= 0) {\n cache = cache.slice(nextHeader);\n } else {\n cache = cache.slice(cache.at(-1) === PacketEncoder.HEADER_TO_HOST[0] ? -1 : cache.length);\n }\n cache = await this.readData(cache, 5);\n }\n const payloadExpectedSize = thePacketEncoder.getPayloadSize(cache);\n const n = thePacketEncoder.getHostHeaderLength(cache);\n const totalSize = n + payloadExpectedSize;\n cache = await this.readData(cache, totalSize);\n sliceIdx = totalSize;\n const cmdId = cache[2];\n const hasExtId = cmdId === 88 || cmdId === 86;\n const cmdExId = hasExtId ? cache[n] : undefined;\n const ack = cache[n + 1];\n if (hasExtId) {\n if (!thePacketEncoder.validateMessageCdc(cache))\n throw new Error(\"Invalid message CDC\");\n }\n let matchIdx = -1;\n let untypedIdx = -1;\n for (let i = 0;i < this.callbacksQueue.length; i++) {\n const candidate = this.callbacksQueue[i];\n if (candidate.wantedCommandId === undefined && candidate.wantedCommandExId === undefined) {\n if (untypedIdx === -1)\n untypedIdx = i;\n continue;\n }\n if ((candidate.wantedCommandId === undefined || candidate.wantedCommandId === cmdId) && (candidate.wantedCommandExId === undefined || candidate.wantedCommandExId === cmdExId)) {\n matchIdx = i;\n break;\n }\n }\n if (matchIdx === -1)\n matchIdx = untypedIdx;\n if (matchIdx === -1) {\n this.reportWarning(\"received a reply with no matching request\", {\n commandId: cmdId,\n commandExtendedId: cmdExId,\n ack\n });\n continue;\n }\n const callbackInfo = this.callbacksQueue[matchIdx];\n const wantedCmdId = callbackInfo.wantedCommandId;\n const wantedCmdExId = callbackInfo.wantedCommandExId;\n const data = cache.slice(0, sliceIdx);\n const PackageType = thePacketEncoder.getPacketType(wantedCmdId, wantedCmdExId);\n if (wantedCmdId === undefined || PackageType === undefined) {\n if (wantedCmdId !== undefined) {\n this.reportWarning(\"no packet class is registered for the wanted command\", { commandId: wantedCmdId, commandExtendedId: wantedCmdExId });\n }\n callbackInfo.callback(data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength));\n } else {\n if (!hasExtId || PackageType.isValidPacket(data, n)) {\n callbackInfo.callback(new PackageType(data));\n } else {\n this.reportWarning(\"reply failed packet validation; delivering its ack instead\", { commandId: cmdId, commandExtendedId: cmdExId, ack });\n callbackInfo.callback(ack);\n }\n }\n clearTimeout(callbackInfo.timeout);\n this.callbacksQueue.splice(matchIdx, 1);\n } catch (e) {\n if (!(e instanceof Error && e.message === \"No data\")) {\n this.reportWarning(\"reader loop stopped by a read error\", {\n error: e,\n pendingBytes: cache\n });\n }\n await this.close();\n break;\n } finally {\n cache = cache.slice(sliceIdx);\n }\n }\n query1() {\n return this.request(new Query1H2DPacket, Query1ReplyD2HPacket, 100);\n }\n getSystemVersion() {\n return this.request(new SystemVersionH2DPacket, SystemVersionReplyD2HPacket).map((result) => result.version);\n }\n}\n\nclass V5SerialConnection extends VexSerialConnection {\n filters = [\n { usbVendorId: 10376, usbProductId: 1281 /* V5_BRAIN */ },\n { usbVendorId: 10376, usbProductId: 1282 /* V5_BRAIN_DFU */ },\n { usbVendorId: 10376, usbProductId: 1283 /* V5_CONTROLLER */ }\n ];\n async withFileTransfer(operation) {\n const previous = this.fileTransferTail;\n let release = () => {};\n const current = new Promise((resolve) => {\n release = resolve;\n });\n this.fileTransferTail = previous.then(() => current);\n this.fileTransferDepth++;\n try {\n await previous;\n return await operation();\n } finally {\n this.fileTransferDepth--;\n release();\n }\n }\n getDeviceStatus() {\n return this.request(new GetDeviceStatusH2DPacket, GetDeviceStatusReplyD2HPacket);\n }\n getRadioStatus() {\n return this.request(new GetRadioStatusH2DPacket, GetRadioStatusReplyD2HPacket);\n }\n getSystemFlags() {\n return this.request(new GetSystemFlagsH2DPacket, GetSystemFlagsReplyD2HPacket);\n }\n getSystemStatus(timeout = 1000) {\n return this.request(new GetSystemStatusH2DPacket, GetSystemStatusReplyD2HPacket, timeout);\n }\n getMatchStatus() {\n return this.request(new GetMatchStatusH2DPacket, MatchStatusReplyD2HPacket);\n }\n uploadProgramToDevice(iniConfig, binFileBuf, coldFileBuf, progressCallback) {\n return wrapTransfer(this, () => this._uploadProgramToDevice(iniConfig, binFileBuf, coldFileBuf, progressCallback));\n }\n async _uploadProgramToDevice(iniConfig, binFileBuf, coldFileBuf, progressCallback) {\n const iniFileBuffer = new TextEncoder().encode(iniConfig.createIni());\n const basename = iniConfig.baseName;\n const iniRequest = {\n filename: basename + \".ini\",\n buf: iniFileBuffer,\n downloadTarget: 1 /* FILE_TARGET_QSPI */,\n vendor: 1 /* USER */,\n autoRun: false\n };\n const r1 = await this.uploadFileToDeviceUnlocked(iniRequest, (current, total) => {\n progressCallback(\"INI\", current, total);\n });\n if (r1.isErr())\n return err(r1.error);\n if (!r1.value)\n return ok(false);\n const coldRequest = coldFileBuf !== undefined ? {\n filename: basename + \"_lib.bin\",\n buf: coldFileBuf,\n downloadTarget: 1 /* FILE_TARGET_QSPI */,\n vendor: 24 /* DEV2 */,\n autoRun: false\n } : undefined;\n if (coldRequest != null) {\n const r2 = await this.uploadFileToDeviceUnlocked(coldRequest, (current, total) => {\n progressCallback(\"COLD\", current, total);\n });\n if (r2.isErr())\n return err(r2.error);\n if (!r2.value)\n return ok(false);\n }\n const binRequest = {\n filename: basename + \".bin\",\n buf: binFileBuf,\n downloadTarget: 1 /* FILE_TARGET_QSPI */,\n vendor: 1 /* USER */,\n loadAddress: coldFileBuf != null ? 125829120 : undefined,\n autoRun: iniConfig.autorun,\n linkedFile: coldRequest\n };\n const r3 = await this.uploadFileToDeviceUnlocked(binRequest, (current, total) => {\n progressCallback(\"BIN\", current, total);\n });\n return r3;\n }\n downloadFileToHost(request, downloadTarget = 1 /* FILE_TARGET_QSPI */, progressCallback) {\n return wrapTransfer(this, () => this.downloadFileToHostUnlocked(request, downloadTarget, progressCallback));\n }\n downloadFileToHostUnlocked(request, downloadTarget = 1 /* FILE_TARGET_QSPI */, progressCallback) {\n return new ResultAsync(this._downloadFileToHostUnlocked(request, downloadTarget, progressCallback));\n }\n async _downloadFileToHostUnlocked(request, downloadTarget, progressCallback) {\n const { filename, vendor, loadAddress, size } = request;\n let nextAddress = loadAddress ?? USER_FLASH_USR_CODE_START;\n const p1Result = await this.request(new InitFileTransferH2DPacket(2 /* READ */, downloadTarget, vendor, 0 /* NONE */, new Uint8Array, nextAddress, filename, \"\"), InitFileTransferReplyD2HPacket);\n if (p1Result.isErr())\n return err(p1Result.error);\n let transferFailed = true;\n let result = ok(new Uint8Array);\n try {\n const p1 = p1Result.value;\n const fileSize = size ?? p1.fileSize;\n const bufferChunkSize = getTransferChunkSize(p1.windowSize);\n let bufferOffset = 0;\n const fileBuf = new Uint8Array(fileSize);\n while (bufferOffset < fileSize) {\n const requestedSize = Math.min(bufferChunkSize, fileSize - bufferOffset);\n const p2Result = await this.request(new ReadFileH2DPacket(nextAddress, requestedSize), ReadFileReplyD2HPacket, 3000);\n if (p2Result.isErr())\n throw p2Result.error;\n const p2 = p2Result.value;\n if (p2.addr !== nextAddress) {\n throw new VexTransferError(`ReadFileReplyD2HPacket returned address ${p2.addr}, expected ${nextAddress}`);\n }\n if (p2.length <= 0 || p2.length > requestedSize || p2.buf.byteLength !== p2.length) {\n throw new VexTransferError(`ReadFileReplyD2HPacket returned invalid length ${p2.length}`);\n }\n fileBuf.set(new Uint8Array(p2.buf), bufferOffset);\n bufferOffset += p2.length;\n nextAddress += p2.length;\n progressCallback?.(bufferOffset, fileSize);\n }\n transferFailed = false;\n result = ok(fileBuf);\n } catch (e) {\n result = err(e instanceof VexSerialError ? e : toVexSerialError(e, \"transfer\"));\n } finally {\n try {\n const exitResult = await this.request(new ExitFileTransferH2DPacket(3 /* EXIT_HALT */), ExitFileTransferReplyD2HPacket, 30000);\n if (!transferFailed && exitResult.isErr())\n result = err(exitResult.error);\n } catch (e) {\n if (!transferFailed)\n result = err(toVexSerialError(e, \"io\"));\n }\n }\n return result;\n }\n uploadFileToDevice(request, progressCallback) {\n return wrapTransfer(this, () => this.uploadFileToDeviceUnlocked(request, progressCallback));\n }\n async uploadFileToDeviceUnlocked(request, progressCallback) {\n let {\n filename,\n buf,\n downloadTarget,\n vendor,\n loadAddress,\n exttype,\n autoRun,\n linkedFile\n } = request;\n if (buf === undefined) {\n return err(new VexTransferError(\"no buffer provided for upload\"));\n }\n downloadTarget = downloadTarget ?? 1 /* FILE_TARGET_QSPI */;\n vendor = vendor ?? 1 /* USER */;\n let nextAddress = loadAddress ?? USER_FLASH_USR_CODE_START;\n const p1Result = await this.request(new InitFileTransferH2DPacket(1 /* WRITE */, downloadTarget, vendor, 1 /* OVERWRITE */, buf, nextAddress, filename, exttype), InitFileTransferReplyD2HPacket);\n if (p1Result.isErr())\n return err(p1Result.error);\n const p1 = p1Result.value;\n const bufferChunkSize = getTransferChunkSize(p1.windowSize);\n let bufferOffset = 0;\n let lastBlock = false;\n let transferFailed = true;\n let result = ok(false);\n try {\n if (linkedFile !== undefined) {\n const p3Result = await this.request(new LinkFileH2DPacket(linkedFile.vendor ?? 1 /* USER */, linkedFile.filename, 0), LinkFileReplyD2HPacket, 1e4);\n if (p3Result.isErr())\n throw p3Result.error;\n }\n while (!lastBlock) {\n let tmpbuf;\n if (buf.byteLength - bufferOffset > bufferChunkSize) {\n tmpbuf = buf.subarray(bufferOffset, bufferOffset + bufferChunkSize);\n } else {\n const length = (buf.byteLength - bufferOffset + 3) / 4 >>> 0;\n tmpbuf = new Uint8Array(length * 4);\n tmpbuf.set(buf.subarray(bufferOffset, buf.byteLength));\n lastBlock = true;\n }\n const p2Result = await this.request(new WriteFileH2DPacket(nextAddress, tmpbuf), WriteFileReplyD2HPacket, 3000);\n if (p2Result.isErr())\n throw p2Result.error;\n bufferOffset += bufferChunkSize;\n nextAddress += bufferChunkSize;\n progressCallback?.(Math.min(bufferOffset, buf.byteLength), buf.byteLength);\n }\n transferFailed = false;\n } catch (e) {\n result = err(e instanceof VexSerialError ? e : toVexSerialError(e, \"transfer\"));\n } finally {\n try {\n const exitResult = await this.request(new ExitFileTransferH2DPacket(transferFailed ? 3 /* EXIT_HALT */ : autoRun ? 1 /* EXIT_RUN */ : 3 /* EXIT_HALT */), ExitFileTransferReplyD2HPacket, 30000);\n if (!transferFailed) {\n result = exitResult.map(() => true);\n }\n } catch (cleanupError) {\n if (!transferFailed) {\n result = err(toVexSerialError(cleanupError, \"io\"));\n }\n }\n }\n return result;\n }\n removeFile(request) {\n return new ResultAsync(this.withFileTransfer(async () => {\n let vendor, filename;\n if (typeof request === \"string\") {\n vendor = 1 /* USER */;\n filename = request;\n } else {\n vendor = request.vendor;\n filename = request.filename;\n }\n let result;\n try {\n const eraseResult = await this.request(new EraseFileH2DPacket(vendor, filename), EraseFileReplyD2HPacket);\n result = eraseResult.map(() => {\n return;\n });\n } catch (e) {\n result = err(toVexSerialError(e, \"io\"));\n }\n try {\n const exitResult = await this.request(new ExitFileTransferH2DPacket(3 /* EXIT_HALT */), ExitFileTransferReplyD2HPacket, 30000);\n if (result.isOk() && exitResult.isErr())\n result = err(exitResult.error);\n } catch (e) {\n if (result.isOk())\n result = err(toVexSerialError(e, \"io\"));\n }\n return result;\n }));\n }\n removeAllFiles() {\n return new ResultAsync(this.withFileTransfer(async () => {\n let result;\n try {\n const clearResult = await this.request(new FileClearUpH2DPacket(1 /* USER */), FileClearUpReplyD2HPacket, 30000);\n result = clearResult.map(() => {\n return;\n });\n } catch (e) {\n result = err(toVexSerialError(e, \"io\"));\n }\n try {\n const exitResult = await this.request(new ExitFileTransferH2DPacket(3 /* EXIT_HALT */), ExitFileTransferReplyD2HPacket, 30000);\n if (result.isOk() && exitResult.isErr())\n result = err(exitResult.error);\n } catch (e) {\n if (result.isOk())\n result = err(toVexSerialError(e, \"io\"));\n }\n return result;\n }));\n }\n captureScreenSetup() {\n return this.request(new ScreenCaptureH2DPacket(0), ScreenCaptureReplyD2HPacket);\n }\n captureScreen(progressCallback) {\n return wrapTransfer(this, () => this._captureScreen(progressCallback));\n }\n async _captureScreen(progressCallback) {\n const response = await this.captureScreenSetup();\n if (response.isErr()) {\n return err(response.error);\n }\n const framebuffer = await this.downloadFileToHostUnlocked({\n filename: \"screen\",\n vendor: 15 /* SYS */,\n loadAddress: 0,\n size: SCREEN_CAPTURE_MESSAGE_WIDTH * SCREEN_CAPTURE_HEIGHT * SCREEN_CAPTURE_MESSAGE_CHANNELS\n }, 2 /* FILE_TARGET_CBUF */, progressCallback);\n if (framebuffer.isErr())\n return err(framebuffer.error);\n return ok(convertScreenCapture(framebuffer.value));\n }\n setMatchMode(mode) {\n return this.request(new UpdateMatchModeH2DPacket(mode, 0), MatchModeReplyD2HPacket);\n }\n runProgram(value) {\n return this.loadProgram(value);\n }\n loadProgram(value) {\n return this.request(new LoadFileActionH2DPacket(1 /* USER */, 0 /* RUN */, value), LoadFileActionReplyD2HPacket);\n }\n stopProgram() {\n return this.request(new LoadFileActionH2DPacket(1 /* USER */, 128 /* STOP */, \"\"), LoadFileActionReplyD2HPacket);\n }\n mockTouch(x, y, press) {\n return this.request(new SendDashTouchH2DPacket(x, y, press), SendDashTouchReplyD2HPacket);\n }\n openScreen(screen, port) {\n return this.request(new SelectDashH2DPacket(screen, port), SelectDashReplyD2HPacket);\n }\n}\nfunction binaryArrayJoin(left, right) {\n const leftSize = left != null ? left.byteLength : 0;\n const rightSize = right != null ? right.byteLength : 0;\n const all = new Uint8Array(leftSize + rightSize);\n if (all.length === 0)\n return new Uint8Array;\n if (left != null)\n all.set(new Uint8Array(left), 0);\n if (right != null)\n all.set(new Uint8Array(right), leftSize);\n return all;\n}\nfunction getTransferChunkSize(windowSize) {\n return windowSize > 0 && windowSize <= USER_PROG_CHUNK_SIZE ? windowSize : USER_PROG_CHUNK_SIZE;\n}\nfunction convertScreenCapture(framebuffer) {\n const pixels = new Uint8Array(SCREEN_CAPTURE_WIDTH * SCREEN_CAPTURE_HEIGHT * SCREEN_CAPTURE_CHANNELS);\n for (let row = 0;row < SCREEN_CAPTURE_HEIGHT; row++) {\n for (let column = 0;column < SCREEN_CAPTURE_WIDTH; column++) {\n const source = (row * SCREEN_CAPTURE_MESSAGE_WIDTH + column) * SCREEN_CAPTURE_MESSAGE_CHANNELS;\n const target = (row * SCREEN_CAPTURE_WIDTH + column) * SCREEN_CAPTURE_CHANNELS;\n pixels[target] = framebuffer[source + 2] ?? 0;\n pixels[target + 1] = framebuffer[source + 1] ?? 0;\n pixels[target + 2] = framebuffer[source] ?? 0;\n }\n }\n return pixels;\n}\nfunction wrapTransfer(conn, operation) {\n return new ResultAsync(conn.withFileTransfer(async () => {\n try {\n return await operation();\n } catch (e) {\n if (e instanceof VexSerialError)\n return err(e);\n return err(toVexSerialError(e, \"io\"));\n }\n }));\n}\nfunction expectedReplyMessage(packet, ReplyType, reply) {\n const expected = `expected ${ReplyType.name} for ${packet.constructor.name}`;\n if (typeof reply === \"number\")\n return `${expected}; received ${ackTypeName(reply)}`;\n if (reply instanceof ArrayBuffer)\n return `${expected}; received raw ArrayBuffer`;\n return `${expected}; received ${reply.constructor.name}`;\n}\nfunction ackTypeName(ackType) {\n return `AckType.${AckType[ackType] ?? \"UNKNOWN\"} (${ackType})`;\n}\n// src/VexFirmware.ts\nvar MAX_CATALOG_BYTES = 4 * 1024;\nvar MAX_VEXOS_BYTES = 64 * 1024 * 1024;\nvar MAX_FIRMWARE_IMAGE_BYTES = 32 * 1024 * 1024;\nvar MAX_AGGREGATE_IMAGE_BYTES = 48 * 1024 * 1024;\nfunction downloadFileFromInternet(link, options = {}) {\n const { maxBytes = Number.POSITIVE_INFINITY, timeout = 30000 } = options;\n if (maxBytes <= 0) {\n return errAsync(new VexInvalidArgumentError(\"maxBytes must be positive\"));\n }\n if (timeout < 0) {\n return errAsync(new VexInvalidArgumentError(\"timeout must be non-negative\"));\n }\n return new ResultAsync(runDownload(link, maxBytes, timeout));\n}\nasync function runDownload(link, maxBytes, timeout) {\n const controller = new AbortController;\n const timer = setTimeout(() => controller.abort(), timeout);\n try {\n let response;\n try {\n response = await fetch(link, { signal: controller.signal });\n } catch (e) {\n return err(new VexDownloadError(`failed to download ${link} (${e instanceof Error ? e.message : String(e)})`));\n }\n if (!response.ok) {\n return err(new VexDownloadError(`failed to download ${link} (${response.status})`));\n }\n const declaredLength = response.headers.get(\"content-length\");\n if (declaredLength !== null) {\n const declared = Number.parseInt(declaredLength, 10);\n if (!Number.isNaN(declared) && declared > 0 && declared > maxBytes) {\n return err(new VexDownloadError(`declared content length ${declared} exceeds limit ${maxBytes} for ${link}`));\n }\n }\n if (response.body == null) {\n return err(new VexDownloadError(`no response body for ${link}`));\n }\n const reader = response.body.getReader();\n const chunks = [];\n let total = 0;\n try {\n for (;; ) {\n const { value, done } = await reader.read();\n if (done)\n break;\n if (value === undefined)\n continue;\n total += value.byteLength;\n if (total > maxBytes) {\n try {\n await reader.cancel();\n } catch {}\n return err(new VexDownloadError(`downloaded body exceeds limit ${maxBytes} for ${link}`));\n }\n chunks.push(value);\n }\n } finally {\n try {\n reader.releaseLock();\n } catch {}\n }\n const result = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return ok(result.buffer);\n } finally {\n clearTimeout(timer);\n }\n}\nfunction sleepUntilAsync(f, timeout, interval = 20) {\n if (timeout < 0) {\n return errAsync(new VexInvalidArgumentError(\"timeout must be non-negative\"));\n }\n if (interval <= 0) {\n return errAsync(new VexInvalidArgumentError(\"interval must be positive\"));\n }\n return new ResultAsync(runSleepUntilAsync(f, timeout, interval));\n}\nasync function runSleepUntilAsync(f, timeout, interval) {\n const deadline = Date.now() + timeout;\n while (Date.now() <= deadline) {\n try {\n if (await f())\n return ok(true);\n } catch (e) {\n return err(toVexSerialError(e, \"io\"));\n }\n const remaining = deadline - Date.now();\n if (remaining <= 0)\n break;\n await sleepInner(Math.min(interval, remaining));\n }\n return ok(false);\n}\nfunction sleepUntil(f, timeout, interval = 20) {\n if (timeout < 0) {\n return errAsync(new VexInvalidArgumentError(\"timeout must be non-negative\"));\n }\n if (interval <= 0) {\n return errAsync(new VexInvalidArgumentError(\"interval must be positive\"));\n }\n return new ResultAsync(runSleepUntil(f, timeout, interval));\n}\nasync function runSleepUntil(f, timeout, interval) {\n const deadline = Date.now() + timeout;\n while (Date.now() <= deadline) {\n try {\n if (f())\n return ok(true);\n } catch (e) {\n return err(toVexSerialError(e, \"io\"));\n }\n const remaining = deadline - Date.now();\n if (remaining <= 0)\n break;\n await sleepInner(Math.min(interval, remaining));\n }\n return ok(false);\n}\nfunction sleep(ms) {\n if (ms < 0) {\n return errAsync(new VexInvalidArgumentError(\"ms must be non-negative\"));\n }\n return ResultAsync.fromSafePromise(sleepInner(ms));\n}\nasync function sleepInner(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\nasync function flashFactoryImage(conn, options, pcb) {\n const { image, label, downloadTarget } = options;\n pcb(`FACTORY ENB ${label}`, 0, 0);\n const enableReply = await conn.request(new FactoryEnableH2DPacket, FactoryEnableReplyD2HPacket);\n if (enableReply.isErr())\n return err(enableReply.error);\n const writeRequest = {\n filename: \"null.bin\",\n vendor: 1 /* USER */,\n loadAddress: USER_FLASH_USR_CODE_START,\n buf: image.buf,\n downloadTarget,\n exttype: \"bin\",\n autoRun: true,\n linkedFile: undefined\n };\n const upload = await conn.uploadFileToDevice(writeRequest, (c, t) => {\n pcb(`UPLOAD ${label}`, c, t);\n });\n if (upload.isErr())\n return err(upload.error);\n if (!upload.value) {\n return err(new VexFirmwareError(`${label} upload was rejected by device`));\n }\n const deadline = Date.now() + 120000;\n while (Date.now() < deadline) {\n const statusReply = await conn.request(new FactoryStatusH2DPacket, FactoryStatusReplyD2HPacket, 1e4);\n if (statusReply.isErr())\n return err(statusReply.error);\n reportFactoryStatus(label, statusReply.value, pcb);\n if (statusReply.value.status === 0 && statusReply.value.percent === 100) {\n return ok(undefined);\n }\n await sleepInner(500);\n }\n return err(new VexFirmwareError(`${label} factory status timed out`));\n}\nfunction reportFactoryStatus(label, reply, pcb) {\n switch (reply.status) {\n case 2:\n pcb(`ERASE ${label}`, reply.percent, 100);\n break;\n case 3:\n pcb(`WRITE ${label}`, reply.percent, 100);\n break;\n case 4:\n pcb(`VERIFY ${label}`, reply.percent, 100);\n break;\n case 8:\n pcb(`FINISHING ${label}`, reply.percent, 100);\n break;\n }\n}\nasync function extractFirmwareImages(usingVersion, vexos) {\n const { unzip } = await import(\"unzipit\");\n const { entries } = await unzip(vexos);\n const expectedPaths = new Set([\n `${usingVersion}/BOOT.bin`,\n `${usingVersion}/assets.bin`\n ]);\n const unexpected = [];\n for (const name of Object.keys(entries)) {\n if (!expectedPaths.has(name))\n unexpected.push(name);\n }\n if (unexpected.length > 0) {\n throw new VexFirmwareError(`VEXos archive contains unexpected entries: ${unexpected.join(\", \")}`);\n }\n const ordered = [];\n let aggregate = 0;\n for (const name of expectedPaths) {\n const entry = entries[name];\n if (entry === undefined) {\n throw new VexFirmwareError(`VEXos archive is missing ${name}`);\n }\n if (entry.encrypted) {\n throw new VexFirmwareError(`VEXos entry ${name} is encrypted`);\n }\n if (entry.size <= 0) {\n throw new VexFirmwareError(`VEXos entry ${name} is empty`);\n }\n if (entry.size > MAX_FIRMWARE_IMAGE_BYTES) {\n throw new VexFirmwareError(`VEXos entry ${name} (${entry.size} bytes) exceeds per-entry limit ${MAX_FIRMWARE_IMAGE_BYTES}`);\n }\n aggregate += entry.size;\n if (aggregate > MAX_AGGREGATE_IMAGE_BYTES) {\n throw new VexFirmwareError(`VEXos aggregate extracted size exceeds limit ${MAX_AGGREGATE_IMAGE_BYTES}`);\n }\n const buf = new Uint8Array(await entry.arrayBuffer());\n if (buf.byteLength === 0) {\n throw new VexFirmwareError(`VEXos entry ${name} is empty`);\n }\n if (buf.byteLength !== entry.size) {\n throw new VexFirmwareError(`VEXos entry ${name} size does not match its metadata (${buf.byteLength} vs ${entry.size})`);\n }\n ordered.push({ name, buf });\n }\n return ordered;\n}\nfunction uploadFirmware(state, publicUrl = \"https://content.vexrobotics.com/vexos/public/V5/\", usingVersion, progressCallback) {\n return new ResultAsync(runUploadFirmware(state, publicUrl, usingVersion, progressCallback));\n}\nasync function runUploadFirmware(state, publicUrl, usingVersion, progressCallback) {\n const device = state._instance;\n const conn = device.connection;\n if (conn == null || !conn.isConnected) {\n return err(new VexNotConnectedError);\n }\n const pcb = progressCallback ?? (() => {});\n let version = usingVersion;\n if (version === undefined) {\n pcb(\"FETCH CATALOG\", 0, 1);\n const catalog = await downloadFileFromInternet(publicUrl + \"catalog.txt\", {\n maxBytes: MAX_CATALOG_BYTES\n });\n if (catalog.isErr())\n return err(catalog.error);\n version = new TextDecoder().decode(catalog.value).trim();\n pcb(\"FETCH CATALOG\", 1, 1);\n }\n if (!/^[A-Za-z0-9._-]+$/.test(version)) {\n return err(new VexFirmwareError(`invalid VEXos version: ${version}`));\n }\n pcb(\"FETCH VEXOS\", 0, 1);\n const vexosResult = await downloadFileFromInternet(publicUrl + version + \".vexos\", { maxBytes: MAX_VEXOS_BYTES });\n if (vexosResult.isErr())\n return err(vexosResult.error);\n const vexos = vexosResult.value;\n if (vexos.byteLength === 0) {\n return err(new VexFirmwareError(\"VEXos archive is empty\"));\n }\n pcb(\"FETCH VEXOS\", 1, 1);\n pcb(\"UNZIP VEXOS\", 0, 1);\n let images;\n try {\n images = await extractFirmwareImages(version, vexos);\n } catch (e) {\n if (e instanceof VexSerialError)\n return err(e);\n return err(toVexSerialError(e, \"firmware\"));\n }\n pcb(\"UNZIP VEXOS\", 1, 1);\n return state.withRefreshPaused(async () => {\n const boot = images.find((image) => image.name.endsWith(\"BOOT.bin\"));\n if (boot === undefined) {\n return err(new VexFirmwareError(\"VEXos archive is missing BOOT.bin\"));\n }\n const assertImage = images.find((image) => image.name.endsWith(\"assets.bin\"));\n if (assertImage === undefined) {\n return err(new VexFirmwareError(\"VEXos archive is missing assets.bin\"));\n }\n const bootFlash = await flashFactoryImage(conn, {\n image: boot,\n label: \"BOOT\",\n downloadTarget: 14 /* FILE_TARGET_B1 */\n }, pcb);\n if (bootFlash.isErr())\n return err(bootFlash.error);\n const assetsFlash = await flashFactoryImage(conn, {\n image: assertImage,\n label: \"ASSETS\",\n downloadTarget: 13 /* FILE_TARGET_A1 */\n }, pcb);\n if (assetsFlash.isErr())\n return err(assetsFlash.error);\n return ok(true);\n });\n}\n\n// src/VexTransfers.ts\nfunction getValue(state, key) {\n return new ResultAsync((async () => {\n const conn = state._instance.connection;\n if (conn == null || !conn.isConnected) {\n return err(new VexNotConnectedError);\n }\n return conn.request(new ReadKeyValueH2DPacket(key), ReadKeyValueReplyD2HPacket).map((result) => result.value);\n })());\n}\nfunction setValue(state, key, value) {\n return new ResultAsync((async () => {\n const conn = state._instance.connection;\n if (conn == null || !conn.isConnected) {\n return err(new VexNotConnectedError);\n }\n return conn.request(new WriteKeyValueH2DPacket(key, value), WriteKeyValueReplyD2HPacket).map(() => {\n return;\n });\n })());\n}\nfunction listFiles(state, vendor = 1 /* USER */) {\n return new ResultAsync((async () => {\n const conn = state._instance.connection;\n if (conn == null || !conn.isConnected) {\n return err(new VexNotConnectedError);\n }\n const countResult = await conn.request(new GetDirectoryFileCountH2DPacket(vendor), GetDirectoryFileCountReplyD2HPacket);\n if (countResult.isErr())\n return err(countResult.error);\n const files = [];\n for (let i = 0;i < countResult.value.count; i++) {\n const entryResult = await conn.request(new GetDirectoryEntryH2DPacket(i), GetDirectoryEntryReplyD2HPacket);\n if (entryResult.isErr())\n return err(entryResult.error);\n if (entryResult.value.file != null) {\n files.push({\n filename: entryResult.value.file.filename,\n vendor,\n loadAddress: entryResult.value.file.loadAddress,\n size: entryResult.value.file.size,\n crc32: entryResult.value.file.crc32,\n type: entryResult.value.file.type,\n timestamp: entryResult.value.file.timestamp,\n version: entryResult.value.file.version\n });\n }\n }\n return ok(files);\n })());\n}\nfunction listProgram(state) {\n return new ResultAsync((async () => {\n const conn = state._instance.connection;\n if (conn == null || !conn.isConnected) {\n return err(new VexNotConnectedError);\n }\n const files = await listFiles(state, 1 /* USER */);\n if (files.isErr())\n return err(files.error);\n const programList = [];\n const iniFiles = files.value.filter((file) => file.filename.endsWith(\".ini\"));\n for (let i = 0;i < iniFiles.length; i++) {\n const ini = iniFiles[i];\n if (ini.size === 0)\n continue;\n const programName = /(.+?)(\\.[^.]*$|$)/.exec(ini.filename)?.[1] ?? \"\";\n const bin = files.value.find((file) => file.filename === programName + \".bin\");\n if (bin == null || bin.timestamp === 0 || bin.size === 0)\n continue;\n const n = new Date;\n n.setTime(1000 * bin.timestamp);\n const program = {\n name: programName,\n binfile: bin.filename,\n size: ini.size + bin.size,\n slot: -1,\n time: n,\n requestedSlot: -1\n };\n const slotInfo = await conn.request(new GetProgramSlotInfoH2DPacket(1 /* USER */, program.binfile), GetProgramSlotInfoReplyD2HPacket);\n if (slotInfo.isOk()) {\n program.slot = slotInfo.value.slot;\n program.requestedSlot = slotInfo.value.requestedSlot;\n }\n programList.push(program);\n }\n return ok(programList);\n })());\n}\nfunction readFile(state, request, downloadTarget = 1 /* FILE_TARGET_QSPI */, progressCallback) {\n return new ResultAsync((async () => {\n const conn = state._instance.connection;\n if (conn == null || !conn.isConnected) {\n return err(new VexNotConnectedError);\n }\n let handle;\n if (typeof request === \"string\") {\n handle = { filename: request, vendor: 1 /* USER */ };\n } else {\n handle = request;\n }\n return state.withRefreshPaused(() => conn.downloadFileToHost(handle, downloadTarget, progressCallback));\n })());\n}\nfunction removeFile(state, request) {\n return new ResultAsync((async () => {\n const conn = state._instance.connection;\n if (conn == null || !conn.isConnected) {\n return err(new VexNotConnectedError);\n }\n return state.withRefreshPaused(() => conn.removeFile(request));\n })());\n}\nfunction removeAllFiles(state) {\n return new ResultAsync((async () => {\n const conn = state._instance.connection;\n if (conn == null || !conn.isConnected) {\n return err(new VexNotConnectedError);\n }\n return state.withRefreshPaused(() => conn.removeAllFiles());\n })());\n}\nfunction uploadProgram(state, iniConfig, binFileBuf, coldFileBuf, progressCallback) {\n return new ResultAsync(runUploadProgram(state, iniConfig, binFileBuf, coldFileBuf, progressCallback));\n}\nasync function runUploadProgram(state, iniConfig, binFileBuf, coldFileBuf, progressCallback) {\n const device = state._instance;\n const conn = device.connection;\n if (conn == null || !conn.isConnected) {\n return err(new VexNotConnectedError);\n }\n let switchedToDownload = false;\n return state.withRefreshPaused(async () => {\n try {\n if (device.isV5Controller) {\n await sleep(250);\n const refreshed = await device.refresh();\n if (refreshed.isErr() || !refreshed.value) {\n return err(new VexProtocolError(\"device is unavailable\"));\n }\n progressCallback(\"CHANNEL\", 0, 1);\n const p1 = await device.radio.changeChannel(1 /* DOWNLOAD */);\n if (p1.isErr())\n return err(p1.error);\n switchedToDownload = true;\n await sleep(250);\n const transferred = await sleepUntilAsync(async () => (await conn?.getSystemStatus(150))?.isOk() ?? false, 1e4, 200);\n if (transferred.isErr())\n return err(transferred.error);\n if (!transferred.value) {\n return err(new VexProtocolError(\"channel switch timed out\"));\n }\n progressCallback(\"CHANNEL\", 1, 1);\n }\n const p2 = await conn.uploadProgramToDevice(iniConfig, binFileBuf, coldFileBuf, progressCallback);\n if (p2.isErr())\n return err(p2.error);\n if (!p2.value)\n return err(new VexProtocolError(\"program upload rejected\"));\n if (device.isV5Controller) {\n if (!device.brain.isAvailable) {\n return err(new VexProtocolError(\"brain unavailable after upload\"));\n }\n progressCallback(\"CHANNEL\", 0, 1);\n const p3 = await device.radio.changeChannel(0 /* PIT */);\n if (p3.isErr())\n return err(p3.error);\n switchedToDownload = false;\n await sleep(250);\n const transferred = await sleepUntilAsync(async () => (await conn?.getSystemStatus(150))?.isOk() ?? false, 1e4, 200);\n if (transferred.isErr())\n return err(transferred.error);\n if (!transferred.value) {\n return err(new VexProtocolError(\"channel switch timed out\"));\n }\n progressCallback(\"CHANNEL\", 1, 1);\n }\n return ok(true);\n } finally {\n if (switchedToDownload) {\n await device.radio.changeChannel(0 /* PIT */);\n }\n }\n });\n}\nfunction writeFile(state, request, progressCallback) {\n return new ResultAsync((async () => {\n const conn = state._instance.connection;\n if (conn == null || !conn.isConnected) {\n return err(new VexNotConnectedError);\n }\n return state.withRefreshPaused(() => conn.uploadFileToDevice(request, progressCallback));\n })());\n}\nfunction captureScreen(state, progressCallback) {\n return new ResultAsync((async () => {\n const conn = state._instance.connection;\n if (conn == null || !conn.isConnected) {\n return err(new VexNotConnectedError);\n }\n return state.withRefreshPaused(() => conn.captureScreen(progressCallback));\n })());\n}\n\n// src/VexDeviceState.ts\nclass VexSerialDevice extends VexEventTarget {\n connection;\n defaultSerial;\n get isConnected() {\n return this.connection != null ? this.connection.isConnected : false;\n }\n get deviceType() {\n return this.isConnected ? this.connection?.port?.getInfo().usbProductId : undefined;\n }\n constructor(defaultSerial) {\n super();\n this.defaultSerial = defaultSerial;\n }\n}\n\nclass V5SerialDeviceState {\n _instance;\n refreshPauseDepth = 0;\n get isRefreshPaused() {\n return this.refreshPauseDepth > 0;\n }\n get isFileTransferring() {\n return this.isRefreshPaused;\n }\n async withRefreshPaused(operation) {\n this.refreshPauseDepth++;\n try {\n return await operation();\n } finally {\n this.refreshPauseDepth--;\n }\n }\n async withFileTransfer(operation) {\n return this.withRefreshPaused(operation);\n }\n brain = {\n activeProgram: 0,\n battery: {\n batteryPercent: 0,\n isCharging: false\n },\n button: {\n isPressed: false,\n isDoublePressed: false\n },\n cpu0Version: VexFirmwareVersion.allZero(),\n cpu1Version: VexFirmwareVersion.allZero(),\n isAvailable: false,\n settings: {\n isScreenReversed: false,\n isWhiteTheme: false,\n usingLanguage: 0\n },\n systemVersion: VexFirmwareVersion.allZero(),\n uniqueId: 0\n };\n controllers = [\n {\n battery: 0,\n isAvailable: false,\n isCharging: false\n },\n {\n battery: 0,\n isAvailable: false,\n isCharging: false\n }\n ];\n devices = [];\n isFieldControllerConnected = false;\n matchMode = \"disabled\";\n radio = {\n channel: 0,\n isAvailable: false,\n isConnected: false,\n isVexNet: false,\n isRadioData: false,\n latency: 0,\n signalQuality: 0,\n signalStrength: 0\n };\n constructor(instance) {\n this._instance = instance;\n }\n}\n\nclass V5Brain {\n state;\n batteryFacade;\n buttonFacade;\n settingsFacade;\n constructor(state) {\n this.state = state;\n this.batteryFacade = new V5Battery(state);\n this.buttonFacade = new V5BrainButton(state);\n this.settingsFacade = new V5BrainSettings(state);\n }\n get isRunningProgram() {\n return this.activeProgram !== 0;\n }\n get activeProgram() {\n return this.state.brain.activeProgram;\n }\n set activeProgram(value) {\n this.setActiveProgram(value).mapErr(() => {});\n }\n setActiveProgram(value) {\n return new ResultAsync((async () => {\n if (this.state.brain.activeProgram === value)\n return ok(undefined);\n const conn = this.state._instance.connection;\n if (conn == null)\n return err(new VexNotConnectedError);\n const result = value === 0 ? await conn.stopProgram() : await conn.loadProgram(value);\n if (result.isErr())\n return err(result.error);\n this.state.brain.activeProgram = value;\n return ok(undefined);\n })());\n }\n runProgram(slot) {\n return new ResultAsync((async () => {\n const conn = this.state._instance.connection;\n if (conn == null)\n return err(new VexNotConnectedError);\n const reply = await conn.runProgram(slot);\n if (reply.isErr())\n return err(reply.error);\n if (typeof slot === \"number\")\n this.state.brain.activeProgram = slot;\n return ok(undefined);\n })());\n }\n stopProgram() {\n return new ResultAsync((async () => {\n const conn = this.state._instance.connection;\n if (conn == null)\n return err(new VexNotConnectedError);\n const reply = await conn.stopProgram();\n if (reply.isErr())\n return err(reply.error);\n this.state.brain.activeProgram = 0;\n return ok(undefined);\n })());\n }\n get battery() {\n return this.batteryFacade;\n }\n get button() {\n return this.buttonFacade;\n }\n get cpu0Version() {\n return this.state.brain.cpu0Version;\n }\n get cpu1Version() {\n return this.state.brain.cpu1Version;\n }\n get isAvailable() {\n return this.state.brain.isAvailable;\n }\n get settings() {\n return this.settingsFacade;\n }\n get systemVersion() {\n return this.state.brain.systemVersion;\n }\n get uniqueId() {\n return this.state.brain.uniqueId;\n }\n getValue(key) {\n return getValue(this.state, key);\n }\n setValue(key, value) {\n return setValue(this.state, key, value);\n }\n listFiles(vendor = 1 /* USER */) {\n return listFiles(this.state, vendor);\n }\n listProgram() {\n return listProgram(this.state);\n }\n readFile(request, downloadTarget = 1 /* FILE_TARGET_QSPI */, progressCallback) {\n return readFile(this.state, request, downloadTarget, progressCallback);\n }\n removeFile(request) {\n return removeFile(this.state, request);\n }\n removeAllFiles() {\n return removeAllFiles(this.state);\n }\n uploadFirmware(publicUrl = \"https://content.vexrobotics.com/vexos/public/V5/\", usingVersion, progressCallback) {\n return uploadFirmware(this.state, publicUrl, usingVersion, progressCallback);\n }\n uploadProgram(iniConfig, binFileBuf, coldFileBuf, progressCallback) {\n return uploadProgram(this.state, iniConfig, binFileBuf, coldFileBuf, progressCallback);\n }\n writeFile(request, progressCallback) {\n return writeFile(this.state, request, progressCallback);\n }\n captureScreen(progressCallback) {\n return captureScreen(this.state, progressCallback);\n }\n}\n\nclass V5Battery {\n state;\n constructor(state) {\n this.state = state;\n }\n get batteryPercent() {\n return this.state.brain.battery.batteryPercent;\n }\n get isCharging() {\n return this.state.brain.battery.isCharging;\n }\n}\n\nclass V5BrainButton {\n state;\n constructor(state) {\n this.state = state;\n }\n get isPressed() {\n return this.state.brain.button.isPressed;\n }\n get isDoublePressed() {\n return this.state.brain.button.isDoublePressed;\n }\n}\n\nclass V5BrainSettings {\n state;\n constructor(state) {\n this.state = state;\n }\n get isScreenReversed() {\n return this.state.brain.settings.isScreenReversed;\n }\n get isWhiteTheme() {\n return this.state.brain.settings.isWhiteTheme;\n }\n get usingLanguage() {\n return this.state.brain.settings.usingLanguage;\n }\n}\n\nclass V5Controller {\n state;\n controllerIndex;\n constructor(state, controllerIndex) {\n this.state = state;\n this.controllerIndex = controllerIndex;\n }\n get batteryPercent() {\n return this.state.controllers[this.controllerIndex].battery;\n }\n get isMasterController() {\n return this.controllerIndex === 0;\n }\n get isAvailable() {\n return this.state.controllers[this.controllerIndex].isAvailable;\n }\n get isCharging() {\n return this.state.controllers[this.controllerIndex].isCharging;\n }\n}\n\nclass V5SmartDevice {\n state;\n deviceIndex;\n constructor(state, index) {\n this.state = state;\n this.deviceIndex = index;\n }\n getDeviceInfo() {\n return this.state.devices[this.deviceIndex];\n }\n get isAvailable() {\n return this.getDeviceInfo() !== undefined;\n }\n get port() {\n return this.deviceIndex;\n }\n get type() {\n return this.getDeviceInfo()?.type ?? 0 /* EMPTY */;\n }\n get version() {\n return this.getDeviceInfo()?.version ?? 0;\n }\n}\n\nclass V5Radio {\n state;\n constructor(state) {\n this.state = state;\n }\n get channel() {\n return this.state.radio.channel;\n }\n get isAvailable() {\n return this.state.radio.isAvailable;\n }\n get isConnected() {\n return this.state.radio.isConnected;\n }\n get isVexNet() {\n return this.state.radio.isVexNet;\n }\n get isRadioData() {\n return this.state.radio.isRadioData;\n }\n get latency() {\n return this.state.radio.latency;\n }\n changeChannel(channel) {\n return new ResultAsync((async () => {\n const conn = this.state._instance.connection;\n if (conn == null || !conn.isConnected) {\n return err(new VexNotConnectedError);\n }\n return conn.request(new FileControlH2DPacket(1, channel), FileControlReplyD2HPacket).map(() => {\n return;\n });\n })());\n }\n}\n\n// src/VexDevice.ts\nfunction unrefTimerIfPossible(timer) {\n if (typeof timer !== \"object\" || timer === null || !(\"unref\" in timer))\n return;\n const unref = timer.unref;\n if (typeof unref === \"function\")\n unref.call(timer);\n}\n\nclass V5SerialDevice extends VexSerialDevice {\n autoReconnect = true;\n pauseRefreshOnFileTransfer = true;\n _isReconnecting = false;\n _isDisconnecting = false;\n _refreshInterval;\n state = new V5SerialDeviceState(this);\n _disposed = false;\n _refreshGeneration = 0;\n _autoRefresh = false;\n _isLastRefreshComplete = true;\n _brain = new V5Brain(this.state);\n _controllers = [\n new V5Controller(this.state, 0),\n new V5Controller(this.state, 1)\n ];\n _radio = new V5Radio(this.state);\n _deviceFacades = [];\n constructor(defaultSerial, autoRefresh = false) {\n super(defaultSerial);\n this.autoRefresh = autoRefresh;\n }\n get autoRefresh() {\n return this._autoRefresh;\n }\n set autoRefresh(value) {\n if (this._autoRefresh === value)\n return;\n this._autoRefresh = value;\n if (value) {\n this._startRefreshInterval();\n } else {\n this._stopRefreshInterval();\n }\n }\n _startRefreshInterval() {\n if (this._refreshInterval !== undefined || this._disposed)\n return;\n this._refreshInterval = setInterval(() => {\n if (this._disposed)\n return;\n if (this._autoRefresh && this._isLastRefreshComplete) {\n if (!this.isConnected) {\n this.state.brain.isAvailable = false;\n return;\n }\n if (!this.pauseRefreshOnFileTransfer || !this.state.isRefreshPaused) {\n this._isLastRefreshComplete = false;\n (async () => {\n try {\n const r = await this.refresh();\n if (r.isErr())\n this.emit(\"error\", r.error);\n } catch (error) {\n this.emit(\"error\", error);\n } finally {\n this._isLastRefreshComplete = true;\n }\n })();\n }\n }\n }, 200);\n unrefTimerIfPossible(this._refreshInterval);\n }\n _stopRefreshInterval() {\n if (this._refreshInterval === undefined)\n return;\n clearInterval(this._refreshInterval);\n this._refreshInterval = undefined;\n }\n get isV5Controller() {\n return this.deviceType === 1283 /* V5_CONTROLLER */;\n }\n get brain() {\n return this._brain;\n }\n get controllers() {\n return this._controllers;\n }\n get devices() {\n const rtn = [];\n for (let i = 1;i < this.state.devices.length; i++) {\n if (this.state.devices[i] != null) {\n const facade = this._deviceFacades[i] ?? new V5SmartDevice(this.state, i);\n this._deviceFacades[i] = facade;\n rtn.push(facade);\n }\n }\n return rtn;\n }\n get isFieldControllerConnected() {\n return this.state.isFieldControllerConnected;\n }\n get matchMode() {\n return this.state.matchMode;\n }\n set matchMode(value) {\n this.setMatchMode(value).mapErr(() => {});\n }\n setMatchMode(mode) {\n return new ResultAsync((async () => {\n const reply = await this.connection?.setMatchMode(mode);\n if (reply === undefined)\n return err(new VexNotConnectedError);\n if (reply.isErr())\n return err(reply.error);\n this.state.matchMode = mode;\n return ok(undefined);\n })());\n }\n get radio() {\n return this._radio;\n }\n mockTouch(x, y, press) {\n return new ResultAsync((async () => {\n const reply = await this.connection?.mockTouch(x, y, press);\n if (reply === undefined)\n return err(new VexNotConnectedError);\n if (reply.isErr())\n return err(reply.error);\n return ok(undefined);\n })());\n }\n connect(conn) {\n return new ResultAsync(this._connect(conn));\n }\n async _connect(conn) {\n if (this.isConnected)\n return ok(undefined);\n if (conn != null) {\n if (!conn.isConnected) {\n const opened = await conn.open();\n if (opened.isErr() || opened.value !== \"opened\") {\n return err(new VexIoError(\"failed to open the supplied connection\"));\n }\n }\n const q = await conn.query1();\n if (q.isErr()) {\n await conn.close();\n return err(q.error);\n }\n this.connection = conn;\n } else {\n let tryIdx = 0;\n while (true) {\n const c = new V5SerialConnection(this.defaultSerial);\n const result = await c.open(tryIdx++, true);\n if (result.isErr()) {\n await c.close();\n return err(result.error);\n }\n if (result.value === \"no-port\") {\n return err(new VexNotConnectedError(\"no V5 device was found\"));\n }\n if (result.value === \"busy\") {\n await c.close();\n continue;\n }\n const q = await c.query1();\n if (q.isErr()) {\n await c.close();\n continue;\n }\n this.connection = c;\n break;\n }\n }\n if (!this.isConnected)\n return err(new VexNotConnectedError);\n await this.doAfterConnect();\n return ok(undefined);\n }\n async disconnect() {\n this._isDisconnecting = true;\n const connection = this.connection;\n this.connection = undefined;\n try {\n await connection?.close();\n } finally {\n this._isDisconnecting = false;\n }\n }\n async dispose() {\n this.autoReconnect = false;\n this.autoRefresh = false;\n this._disposed = true;\n await this.disconnect();\n }\n reconnect(timeout = 0) {\n return new ResultAsync(this._reconnect(timeout));\n }\n async _reconnect(timeout) {\n if (this.isConnected)\n return ok(undefined);\n if (timeout < 0) {\n return err(new VexInvalidArgumentError(\"timeout must be non-negative\"));\n }\n const endTime = Date.now() + timeout;\n if (this._isReconnecting) {\n if (timeout === 0) {\n await this.waitForReconnectToFinish();\n } else {\n const waited = await sleepUntil(() => !this._isReconnecting, timeout);\n if (waited.isErr() || !waited.value) {\n return err(new VexNotConnectedError);\n }\n }\n if (this.isConnected)\n return ok(undefined);\n }\n this._isReconnecting = true;\n try {\n while (timeout === 0 || Date.now() < endTime) {\n let tryIdx = 0;\n while (true) {\n const c = new V5SerialConnection(this.defaultSerial);\n const result = await c.open(tryIdx++, false);\n if (result.isErr()) {\n await c.close();\n return err(result.error);\n }\n if (result.value === \"no-port\")\n break;\n if (result.value === \"busy\") {\n await c.close();\n continue;\n }\n const status = await c.getSystemStatus(200);\n if (status.isErr()) {\n await c.close();\n continue;\n }\n if (this.brain.uniqueId !== 0 && status.value.uniqueId !== this.brain.uniqueId) {\n await c.close();\n continue;\n }\n this.connection = c;\n break;\n }\n if (this.isConnected)\n break;\n const getPortCount = async () => (await this.defaultSerial.getPorts()).length;\n const portsCount = await getPortCount();\n await sleepUntilAsync(async () => await getPortCount() !== portsCount, 1000);\n }\n } catch (e) {\n return err(toVexSerialError(e));\n } finally {\n this._isReconnecting = false;\n }\n if (!this.isConnected)\n return err(new VexNotConnectedError);\n await this.doAfterConnect();\n return ok(undefined);\n }\n async waitForReconnectToFinish() {\n while (this._isReconnecting) {\n const r = await sleepUntil(() => !this._isReconnecting, 1000);\n if (r.isOk() && r.value)\n return;\n }\n }\n async doAfterConnect() {\n if (this.connection == null)\n return;\n this.connection.on(\"disconnected\", (_data) => {\n if (this._isDisconnecting)\n return;\n this.emit(\"disconnected\", undefined);\n if (this.autoReconnect) {\n this.reconnect().mapErr((e) => this.emit(\"error\", e));\n }\n });\n await this.refresh();\n }\n refresh() {\n return new ResultAsync(this._refresh());\n }\n async _refresh() {\n if (this._disposed)\n return ok(false);\n const generation = ++this._refreshGeneration;\n const conn = this.connection;\n if (conn == null || !conn.isConnected) {\n this._applySnapshotIfCurrent(generation, { isAvailable: false });\n return ok(false);\n }\n const ssPacket = await conn.getSystemStatus();\n if (generation !== this._refreshGeneration || this._disposed)\n return ok(false);\n if (ssPacket.isErr()) {\n this._applySnapshotIfCurrent(generation, { isAvailable: false });\n return ok(false);\n }\n const sfPacket = await conn.getSystemFlags();\n if (generation !== this._refreshGeneration || this._disposed)\n return ok(false);\n if (sfPacket.isErr()) {\n this._applySnapshotIfCurrent(generation, { isAvailable: false });\n return ok(false);\n }\n const rdPacket = await conn.getRadioStatus();\n if (generation !== this._refreshGeneration || this._disposed)\n return ok(false);\n if (rdPacket.isErr()) {\n this._applySnapshotIfCurrent(generation, { isAvailable: false });\n return ok(false);\n }\n const dsPacket = await conn.getDeviceStatus();\n if (generation !== this._refreshGeneration || this._disposed)\n return ok(false);\n if (dsPacket.isErr()) {\n this._applySnapshotIfCurrent(generation, { isAvailable: false });\n return ok(false);\n }\n const snapshot = this._buildSnapshot(ssPacket.value, sfPacket.value, rdPacket.value, dsPacket.value);\n return ok(this._applySnapshotIfCurrent(generation, snapshot));\n }\n _buildSnapshot(ssPacket, sfPacket, rdPacket, dsPacket) {\n const flags2 = ssPacket.sysflags[2];\n const matchMode = (flags2 & 32) !== 0 ? \"disabled\" : (flags2 & 64) !== 0 ? \"autonomous\" : \"driver\";\n const isFieldControllerConnected = (flags2 & 16) !== 0;\n const flags4 = ssPacket.sysflags[4];\n const usingLanguage = (flags4 & 240) >> 4;\n const isWhiteTheme = (flags4 & 4) !== 0;\n const isScreenReversed = (flags4 & 1) === 0;\n const flags5 = sfPacket.flags;\n const hasFlag = (bit) => (flags5 & 2 ** (32 - bit)) !== 0;\n const isRadioData = hasFlag(12);\n const isDoublePressed = hasFlag(14);\n const isCharging = hasFlag(15);\n const isPressed = hasFlag(17);\n const isVexNet = hasFlag(18);\n const controller1Available = hasFlag(19);\n const radioConnected = hasFlag(22);\n const radioAvailable = hasFlag(23);\n const batteryPercent = sfPacket.battery ?? 0;\n const controller0Available = radioConnected || sfPacket.controllerBatteryPercent !== undefined;\n const controller0Battery = sfPacket.controllerBatteryPercent ?? 0;\n const controller1Battery = sfPacket.partnerControllerBatteryPercent ?? 0;\n const activeProgram = sfPacket.currentProgram;\n const isAvailable = !this.isV5Controller || radioConnected;\n const devices = dsPacket.devices.map((d) => ({ ...d }));\n return {\n isAvailable: true,\n matchMode,\n isFieldControllerConnected,\n brain: {\n ...this.state.brain,\n activeProgram,\n battery: { batteryPercent, isCharging },\n button: { isPressed, isDoublePressed },\n cpu0Version: ssPacket.cpu0Version,\n cpu1Version: ssPacket.cpu1Version,\n isAvailable,\n settings: { isScreenReversed, isWhiteTheme, usingLanguage },\n systemVersion: ssPacket.systemVersion,\n uniqueId: ssPacket.uniqueId\n },\n controllers: [\n {\n battery: controller0Battery,\n isAvailable: controller0Available,\n isCharging: (flags2 & 128) !== 0\n },\n {\n battery: controller1Battery,\n isAvailable: controller1Available,\n isCharging: (flags2 & 128) !== 0\n }\n ],\n radio: {\n channel: rdPacket.channel,\n latency: rdPacket.timeslot,\n signalQuality: rdPacket.quality,\n signalStrength: rdPacket.strength,\n isRadioData,\n isVexNet,\n isConnected: radioConnected,\n isAvailable: radioAvailable\n },\n devices\n };\n }\n _applySnapshotIfCurrent(generation, snapshot) {\n if (this._disposed)\n return false;\n if (generation !== this._refreshGeneration)\n return false;\n if (snapshot.isAvailable === false) {\n this.state.brain.isAvailable = false;\n return false;\n }\n this.state.matchMode = snapshot.matchMode;\n this.state.isFieldControllerConnected = snapshot.isFieldControllerConnected;\n Object.assign(this.state.brain, snapshot.brain);\n Object.assign(this.state.controllers[0], snapshot.controllers[0]);\n Object.assign(this.state.controllers[1], snapshot.controllers[1]);\n Object.assign(this.state.radio, snapshot.radio);\n const next = [];\n for (const device of snapshot.devices) {\n if (device != null)\n next[device.port] = device;\n }\n this.state.devices = next;\n return true;\n }\n}\n// src/VexIniConfig.ts\nclass BaseIniBuilder {\n str = \"\";\n addLine(line) {\n this.str += line + `\n`;\n }\n addComment(comment) {\n this.addLine(\"; \" + comment);\n return this;\n }\n getContent() {\n return this.str;\n }\n}\n\nclass IniSectionBuilder extends BaseIniBuilder {\n name;\n object;\n keyTransform;\n constructor(name, object, keyTransform = (k) => k.toString()) {\n super();\n this.name = name;\n this.object = object;\n this.keyTransform = keyTransform;\n }\n addSingleObjProperty(key, maxValueLength) {\n const value = this.object[key];\n if (value == null || value.toString().length === 0)\n return;\n const formattedKey = this.keyTransform(key).padEnd(12).slice(0, 12);\n const trimmedVal = value.toString().slice(0, maxValueLength);\n const escapedVal = trimmedVal.replace(/[\"\\\\\\u0000-\\u001f\\u007f]/g, (character) => `\\\\x${character.charCodeAt(0).toString(16).padStart(2, \"0\")}`);\n this.addLine(`${formattedKey} = \"${escapedVal}\"`);\n }\n addObjProperty(key, maxValueLength) {\n for (const k of Array.isArray(key) ? key : [key]) {\n this.addSingleObjProperty(k, maxValueLength);\n }\n return this;\n }\n addAllObjProps(maxValueLength) {\n for (const k of Object.keys(this.object)) {\n this.addSingleObjProperty(k, maxValueLength);\n }\n return this;\n }\n}\n\nclass IniFileBuilder extends BaseIniBuilder {\n addSection(section) {\n this.addLine(`[${section.name}]`);\n this.str += section.getContent();\n return this;\n }\n}\n\nclass ProgramIniConfig {\n baseName = \"slot_1\";\n autorun = false;\n project = { version: \"1\", ide: \"Unknown\", file: \"none\" };\n program = {\n version: \"1\",\n name: \"program\",\n slot: 0,\n icon: \"default.bmp\",\n iconalt: \"\",\n description: \"\",\n date: \"\",\n timezone: \"0\"\n };\n config = { 22: \"adi\" };\n controller1 = {};\n controller2 = {};\n setProgramDate(date) {\n this.program.date = date.toISOString();\n const offset = Math.abs(date.getTimezoneOffset());\n const hours = offset / 60 >>> 0;\n const minutes = offset - hours * 60;\n this.program.timezone = (date.getTimezoneOffset() > 0 ? \"-\" : \"+\") + this.dec2(hours) + \":\" + this.dec2(minutes);\n }\n createIni() {\n if (this.program.date.length === 0) {\n this.setProgramDate(new Date);\n }\n return new IniFileBuilder().addComment(\"\").addComment(\"VEX program ini file\").addComment(\"Generated by Vex V5 Serial Protocol Library\").addComment(\"\").addSection(new IniSectionBuilder(\"project\", this.project).addObjProperty(\"ide\", 16)).addComment(\"\").addSection(new IniSectionBuilder(\"program\", this.program).addObjProperty(\"name\", 32).addObjProperty(\"description\", 256).addObjProperty(\"icon\", 16).addObjProperty(\"iconalt\", 16).addObjProperty(\"slot\", 16)).addComment(\"\").addSection(new IniSectionBuilder(\"config\", this.config, (k) => \"port_\" + this.dec2(k)).addAllObjProps()).addComment(\"\").addSection(new IniSectionBuilder(\"controller_1\", this.controller1).addAllObjProps()).addComment(\"\").addSection(new IniSectionBuilder(\"controller_2\", this.controller2).addAllObjProps()).getContent();\n }\n dec2(value) {\n return (value % 100).toString(10).padStart(2, \"0\").toUpperCase();\n }\n}\nexport {\n uploadFirmware,\n toVexSerialError,\n sleepUntilAsync,\n sleepUntil,\n sleep,\n encodeFixedText,\n downloadFileFromInternet,\n WriteKeyValueReplyD2HPacket,\n WriteKeyValueH2DPacket,\n WriteFileReplyD2HPacket,\n WriteFileH2DPacket,\n VexTransferError,\n VexSerialError,\n VexSerialDevice,\n VexSerialConnection,\n VexProtocolError,\n VexNotConnectedError,\n VexIoError,\n VexInvalidArgumentError,\n VexFirmwareVersion,\n VexFirmwareError,\n VexEventTarget,\n VexEventEmitter,\n VexDownloadError,\n V5SmartDevice,\n V5SerialDeviceState,\n V5SerialDevice,\n V5SerialConnection,\n V5Radio,\n V5Controller,\n V5BrainSettings,\n V5BrainButton,\n V5Brain,\n V5Battery,\n UpdateMatchModeH2DPacket,\n USER_PROG_CHUNK_SIZE,\n USER_FLASH_USR_CODE_START,\n USER_FLASH_SYS_CODE_START,\n USER_FLASH_START_C,\n USER_FLASH_START_B,\n USER_FLASH_START,\n USER_FLASH_MAX_FILE_SIZE,\n USER_FLASH_END_C,\n USER_FLASH_END_B,\n USER_FLASH_END,\n SystemVersionReplyD2HPacket,\n SystemVersionH2DPacket,\n SmartDeviceType,\n SerialDeviceType,\n SendDashTouchReplyD2HPacket,\n SendDashTouchH2DPacket,\n SelectDashScreen,\n SelectDashReplyD2HPacket,\n SelectDashH2DPacket,\n ScreenCaptureReplyD2HPacket,\n ScreenCaptureH2DPacket,\n ReadLogPageReplyD2HPacket,\n ReadLogPageH2DPacket,\n ReadKeyValueReplyD2HPacket,\n ReadKeyValueH2DPacket,\n ReadFileReplyD2HPacket,\n ReadFileH2DPacket,\n RadioChannelType,\n Query1ReplyD2HPacket,\n Query1H2DPacket,\n ProgramIniConfig,\n PacketView,\n PacketEncoder,\n Packet,\n MatchStatusReplyD2HPacket,\n MatchModeReplyD2HPacket,\n LoadFileActionReplyD2HPacket,\n LoadFileActionH2DPacket,\n LinkFileReplyD2HPacket,\n LinkFileH2DPacket,\n InitFileTransferReplyD2HPacket,\n InitFileTransferH2DPacket,\n HostBoundPacket,\n GetSystemStatusReplyD2HPacket,\n GetSystemStatusH2DPacket,\n GetSystemFlagsReplyD2HPacket,\n GetSystemFlagsH2DPacket,\n GetSlot5to8InfoReplyD2HPacket,\n GetSlot5to8InfoH2DPacket,\n GetSlot1to4InfoReplyD2HPacket,\n GetSlot1to4InfoH2DPacket,\n GetRadioStatusReplyD2HPacket,\n GetRadioStatusH2DPacket,\n GetRadioModeH2DPacket,\n GetProgramSlotInfoReplyD2HPacket,\n GetProgramSlotInfoH2DPacket,\n GetMatchStatusH2DPacket,\n GetLogCountReplyD2HPacket,\n GetLogCountH2DPacket,\n GetFileMetadataReplyD2HPacket,\n GetFileMetadataH2DPacket,\n GetFdtStatusReplyD2HPacket,\n GetFdtStatusH2DPacket,\n GetDirectoryFileCountReplyD2HPacket,\n GetDirectoryFileCountH2DPacket,\n GetDirectoryEntryReplyD2HPacket,\n GetDirectoryEntryH2DPacket,\n GetDeviceStatusReplyD2HPacket,\n GetDeviceStatusH2DPacket,\n FileVendor,\n FileLoadAction,\n FileInitOption,\n FileInitAction,\n FileFormatReplyD2HPacket,\n FileFormatH2DPacket,\n FileExitAction,\n FileDownloadTarget,\n FileControlReplyD2HPacket,\n FileControlH2DPacket,\n FileClearUpReplyD2HPacket,\n FileClearUpH2DPacket,\n FactoryStatusReplyD2HPacket,\n FactoryStatusH2DPacket,\n FactoryEnableReplyD2HPacket,\n FactoryEnableH2DPacket,\n ExitFileTransferReplyD2HPacket,\n ExitFileTransferH2DPacket,\n EraseFileReplyD2HPacket,\n EraseFileH2DPacket,\n DeviceBoundPacket,\n AckType\n};\n\n//# debugId=658BAE3B57868EE064756E2164756E21\n//# sourceMappingURL=index.js.map\n",
|
|
23
|
+
"import { join } from \"node:path\";\nimport { isRecord } from \"./guards\";\n\nexport type ProgramType =\n | \"pros\"\n | \"vexide\"\n | \"vexcode-cpp\"\n | \"vexcode-py\"\n | \"unknown\";\n\nfunction hasVexideDependency(manifest: unknown): boolean {\n return (\n isRecord(manifest) &&\n isRecord(manifest.dependencies) &&\n \"vexide\" in manifest.dependencies\n );\n}\n\nexport async function detectProgramType(path: string): Promise<ProgramType> {\n if (await Bun.file(join(path, \"project.pros\")).exists()) return \"pros\";\n\n const cargoFile = Bun.file(join(path, \"Cargo.toml\"));\n if (await cargoFile.exists()) {\n let manifest: unknown;\n try {\n manifest = Bun.TOML.parse(await cargoFile.text());\n } catch {\n manifest = undefined;\n }\n if (hasVexideDependency(manifest)) return \"vexide\";\n }\n\n const makeFiles = await Promise.all(\n [\"mkenv.mk\", \"mkrules.mk\"].map((name) =>\n Bun.file(join(path, \"vex\", name)).exists(),\n ),\n );\n if (makeFiles.some(Boolean)) return \"vexcode-cpp\";\n\n if (await Bun.file(join(path, \"src\", \"main.py\")).exists())\n return \"vexcode-py\";\n\n return \"unknown\";\n}\n",
|
|
24
|
+
"export function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport function hasErrorCode(error: unknown, code: string): boolean {\n return isRecord(error) && error.code === code;\n}\n",
|
|
25
|
+
"export class ProcessExitError extends Error {\n constructor(\n message: string,\n public readonly stderr: string,\n ) {\n super(message);\n }\n}\n\nexport async function runProcess(\n command: string[],\n cwd: string,\n options: {\n stdout?: \"inherit\" | \"ignore\";\n stderr?: \"inherit\" | \"pipe\";\n } = {},\n): Promise<void> {\n const [program, ...args] = command;\n if (program === undefined) throw new Error(\"cannot run an empty command\");\n const executable = Bun.which(program);\n if (executable === null) {\n throw new Error(`${program} is not installed or is not available on PATH`);\n }\n\n const process = Bun.spawn({\n cmd: [executable, ...args],\n cwd,\n stdin: \"inherit\",\n stdout: options.stdout ?? \"inherit\",\n stderr: options.stderr ?? \"inherit\",\n });\n const [exitCode, stderr] = await Promise.all([\n process.exited,\n options.stderr === \"pipe\"\n ? (process.stderr?.text() ?? Promise.resolve(\"\"))\n : Promise.resolve(\"\"),\n ]);\n if (exitCode !== 0) {\n const message = `${command.join(\" \")} exited with code ${exitCode}`;\n throw new ProcessExitError(\n stderr.length > 0 ? `${message}\\n${stderr}` : message,\n stderr,\n );\n }\n}\n",
|
|
26
|
+
"// src/Column.ts\nvar Column = class {\n constructor(options = {}) {\n this.minWidth = 1;\n this.align = \"left\";\n this.vAlign = \"top\";\n this.paddingLeft = 1;\n this.paddingRight = 1;\n this.truncate = \"...\";\n this.wrapWord = true;\n this.priority = 100;\n this.hidden = false;\n this.name = options.name || \"\";\n this.key = options.key || this.name;\n this.width = options.width;\n if (options.minWidth !== void 0) this.minWidth = options.minWidth;\n if (options.maxWidth !== void 0) this.maxWidth = options.maxWidth;\n if (options.align) this.align = options.align;\n if (options.vAlign) this.vAlign = options.vAlign;\n if (options.paddingLeft !== void 0) this.paddingLeft = options.paddingLeft;\n if (options.paddingRight !== void 0) this.paddingRight = options.paddingRight;\n if (options.truncate !== void 0) this.truncate = options.truncate;\n if (options.wrapWord !== void 0) this.wrapWord = options.wrapWord;\n if (options.priority !== void 0) this.priority = options.priority;\n if (options.hidden !== void 0) this.hidden = options.hidden;\n if (options.color !== void 0) this.color = options.color;\n if (options.formatter !== void 0) this.formatter = options.formatter;\n }\n};\n\n// src/Cell.ts\nvar Cell = class {\n constructor(content) {\n this.colSpan = 1;\n this.rowSpan = 1;\n this.merged = false;\n if (typeof content === \"object\" && content !== null && \"content\" in content) {\n this.content = content.content;\n this.colSpan = content.colSpan || 1;\n this.rowSpan = content.rowSpan || 1;\n this.align = content.align;\n this.vAlign = content.vAlign;\n this.color = content.color;\n } else {\n this.content = content;\n }\n }\n getString() {\n return this.content === void 0 || this.content === null ? \"\" : String(this.content);\n }\n};\n\n// src/Row.ts\nvar Row = class {\n constructor(data, table) {\n this.cells = [];\n this.table = table;\n this.originalData = data;\n this.parseData(data);\n }\n getData() {\n return this.originalData;\n }\n parseData(data) {\n if (Array.isArray(data)) {\n data.forEach((val) => this.cells.push(new Cell(val)));\n return;\n }\n if (this.table.columns.length === 0) {\n Object.keys(data).forEach((key) => this.table.addColumn({ name: key, key }));\n }\n this.table.columns.forEach((column) => {\n this.cells.push(new Cell(data[column.key]));\n });\n }\n};\n\n// src/LayoutManager.ts\nvar LayoutManager = class {\n static layout(table) {\n const grid = [];\n const occupied = {};\n const isOccupied = (x, y) => occupied[`${x},${y}`];\n const markOccupied = (x, y) => occupied[`${x},${y}`] = true;\n let maxColumns = table.columns.length || 0;\n table.rows.forEach((row, rowIndex) => {\n if (!grid[rowIndex]) grid[rowIndex] = [];\n let colIndex = 0;\n row.cells.forEach((cell) => {\n while (isOccupied(colIndex, rowIndex)) {\n colIndex++;\n }\n if (cell.merged) return;\n if (table.columns.length && colIndex + cell.colSpan > table.columns.length) {\n throw new Error(\n `Row ${rowIndex} exceeds defined column count (${table.columns.length}).`\n );\n }\n for (let r = 0; r < cell.rowSpan; r++) {\n for (let c = 0; c < cell.colSpan; c++) {\n if (isOccupied(colIndex + c, rowIndex + r)) {\n throw new Error(`Cell span conflict at row ${rowIndex}, col ${colIndex}.`);\n }\n }\n }\n const gridCell = {\n cell,\n x: colIndex,\n y: rowIndex,\n realColSpan: cell.colSpan,\n realRowSpan: cell.rowSpan\n };\n grid[rowIndex][colIndex] = gridCell;\n for (let r = 0; r < cell.rowSpan; r++) {\n for (let c = 0; c < cell.colSpan; c++) {\n markOccupied(colIndex + c, rowIndex + r);\n if (r === 0 && c === 0) continue;\n if (!grid[rowIndex + r]) grid[rowIndex + r] = [];\n grid[rowIndex + r][colIndex + c] = {\n cell: gridCell.cell,\n x: colIndex + c,\n y: rowIndex + r,\n realColSpan: gridCell.realColSpan,\n realRowSpan: gridCell.realRowSpan,\n hidden: true\n };\n }\n }\n colIndex += cell.colSpan;\n maxColumns = Math.max(maxColumns, colIndex);\n });\n });\n const columnCount = table.columns.length || maxColumns;\n for (let r = 0; r < grid.length; r++) {\n if (!grid[r]) grid[r] = [];\n for (let c = 0; c < columnCount; c++) {\n if (grid[r][c]) continue;\n if (isOccupied(c, r)) {\n grid[r][c] = {\n cell: new Cell(\"\"),\n x: c,\n y: r,\n realColSpan: 1,\n realRowSpan: 1,\n hidden: true\n };\n continue;\n }\n grid[r][c] = {\n cell: new Cell(\"\"),\n x: c,\n y: r,\n realColSpan: 1,\n realRowSpan: 1\n };\n }\n }\n return grid;\n }\n};\n\n// src/utils/textUtils.ts\nvar ANSI_REGEX = new RegExp(\n [\n \"[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*)?\\\\u0007)\",\n \"(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TZcf-ntqry=><~]))\"\n ].join(\"|\"),\n \"g\"\n);\nfunction stripAnsi(str) {\n return str.replace(ANSI_REGEX, \"\");\n}\nfunction isEmoji(cp) {\n return 128512 <= cp && cp <= 128591 || // Emoticons\n 127744 <= cp && cp <= 128511 || // Misc Symbols & Pictographs\n 128640 <= cp && cp <= 128767 || // Transport & Map\n 129280 <= cp && cp <= 129535 || // Supplemental Symbols & Pictographs\n 129536 <= cp && cp <= 129647 || // Chess Symbols\n 129648 <= cp && cp <= 129791 || // Symbols & Pictographs Extended-A\n 126980 === cp || // Mahjong Red Dragon\n 127183 === cp || // Playing Card Black Joker\n 127344 <= cp && cp <= 127345 || // Neg Squared A/B\n 127358 <= cp && cp <= 127359 || // Neg Squared O/P\n 127374 === cp || // Neg Squared AB\n 127377 <= cp && cp <= 127386 || // Squared CL..VS\n 127456 <= cp && cp <= 127487 || // Regional Indicators (flags)\n 8986 <= cp && cp <= 8987 || // Watch, Hourglass\n 9193 <= cp && cp <= 9203 || // Media symbols\n 9208 <= cp && cp <= 9210 || // Pause, Record\n 9642 <= cp && cp <= 9643 || // Small squares\n cp === 9654 || // Play button\n cp === 9664 || // Reverse play\n 9723 <= cp && cp <= 9726 || // Medium squares\n 9728 <= cp && cp <= 9983 || // Misc Symbols\n 9984 <= cp && cp <= 10175 || // Dingbats\n 10548 <= cp && cp <= 10549 || // Arrows\n 11013 <= cp && cp <= 11015 || // Arrows\n 11035 <= cp && cp <= 11036 || // Large squares\n cp === 11088 || // Star\n cp === 11093 || // Circle\n cp === 12336 || // Wavy dash\n cp === 12349 || // Part alternation mark\n cp === 12951 || // Circled Ideograph Congratulation\n cp === 12953;\n}\nfunction isZeroWidth(cp) {\n return cp === 8203 || // Zero-width space\n cp === 8204 || // Zero-width non-joiner\n cp === 8205 || // Zero-width joiner (ZWJ)\n cp === 8206 || // Left-to-right mark\n cp === 8207 || // Right-to-left mark\n cp === 65279 || // Zero-width no-break space (BOM)\n 65024 <= cp && cp <= 65039 || // Variation Selectors\n 917760 <= cp && cp <= 917999 || // Variation Selectors Supplement\n 127995 <= cp && cp <= 127999 || // Skin tone modifiers\n 8400 <= cp && cp <= 8447 || // Combining Diacritical Marks for Symbols\n 917536 <= cp && cp <= 917631;\n}\nfunction isFullWidth(codePoint) {\n if (codePoint >= 4352 && (codePoint <= 4447 || // Hangul Jamo\n codePoint === 9001 || // LEFT-POINTING ANGLE BRACKET\n codePoint === 9002 || // RIGHT-POINTING ANGLE BRACKET\n // CJK Radicals Supplement .. Enclosed CJK Letters and Months\n 11904 <= codePoint && codePoint <= 12871 && codePoint !== 12351 || // Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A\n 12880 <= codePoint && codePoint <= 19903 || // CJK Unified Ideographs .. Yi Radicals\n 19968 <= codePoint && codePoint <= 42182 || // Hangul Jamo Extended-A\n 43360 <= codePoint && codePoint <= 43388 || // Hangul Syllables\n 44032 <= codePoint && codePoint <= 55203 || // CJK Compatibility Ideographs\n 63744 <= codePoint && codePoint <= 64255 || // Vertical Forms\n 65040 <= codePoint && codePoint <= 65049 || // CJK Compatibility Forms .. Small Form Variants\n 65072 <= codePoint && codePoint <= 65131 || // Halfwidth and Fullwidth Forms\n 65281 <= codePoint && codePoint <= 65376 || 65504 <= codePoint && codePoint <= 65510 || // Kana Supplement\n 110592 <= codePoint && codePoint <= 110593 || // Enclosed Ideographic Supplement\n 127488 <= codePoint && codePoint <= 127569 || // CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane\n 131072 <= codePoint && codePoint <= 262141)) {\n return true;\n }\n return false;\n}\nfunction stringWidth(str) {\n const stripped = stripAnsi(str);\n let width = 0;\n let inEmojiZwjSequence = false;\n for (let i = 0; i < stripped.length; i++) {\n const code = stripped.codePointAt(i);\n if (!code) continue;\n if (code > 65535) {\n i++;\n }\n if (code <= 31 || 127 <= code && code <= 159) {\n continue;\n }\n if (code === 8205) {\n inEmojiZwjSequence = true;\n continue;\n }\n if (isZeroWidth(code)) {\n continue;\n }\n if (isEmoji(code)) {\n if (inEmojiZwjSequence) {\n inEmojiZwjSequence = false;\n continue;\n }\n width += 2;\n continue;\n }\n if (isFullWidth(code)) {\n width += 2;\n } else {\n width += 1;\n }\n inEmojiZwjSequence = false;\n }\n return width;\n}\n\n// src/utils/colors.ts\nvar CODES = {\n reset: [0, 0],\n bold: [1, 22],\n dim: [2, 22],\n italic: [3, 23],\n underline: [4, 24],\n inverse: [7, 27],\n hidden: [8, 28],\n strikethrough: [9, 29],\n black: [30, 39],\n red: [31, 39],\n green: [32, 39],\n yellow: [33, 39],\n blue: [34, 39],\n magenta: [35, 39],\n cyan: [36, 39],\n white: [37, 39],\n gray: [90, 39],\n bgBlack: [40, 49],\n bgRed: [41, 49],\n bgGreen: [42, 49],\n bgYellow: [43, 49],\n bgBlue: [44, 49],\n bgMagenta: [45, 49],\n bgCyan: [46, 49],\n bgWhite: [47, 49]\n};\nfunction colorize(text, color) {\n if (!color || !CODES[color]) return text;\n const [start, end] = CODES[color];\n return `\\x1B[${start}m${text}\\x1B[${end}m`;\n}\n\n// src/renderers/CsvRenderer.ts\nvar CsvRenderer = class {\n constructor(options = {}) {\n this.delimiter = options.delimiter || \",\";\n this.quote = options.quote || '\"';\n this.includeHeader = options.includeHeader !== false;\n }\n render(table) {\n const visibleIndices = table.columns.map((column, index) => ({ column, index })).filter((item) => !item.column.hidden);\n const rows = [];\n if (this.includeHeader) {\n rows.push(this.drawRow(visibleIndices.map((item) => item.column.name)));\n }\n rows.push(\n ...table.rows.map(\n (row) => this.drawRow(visibleIndices.map((item) => row.cells[item.index]?.getString() ?? \"\"))\n )\n );\n return rows.join(\"\\n\");\n }\n drawRow(values) {\n return values.map((value) => this.escape(value)).join(this.delimiter);\n }\n escape(value) {\n if (value.includes(this.delimiter) || value.includes(this.quote) || value.includes(\"\\n\")) {\n return this.quote + value.replace(new RegExp(this.quote, \"g\"), this.quote + this.quote) + this.quote;\n }\n return value;\n }\n};\n\n// src/renderers/JsonRenderer.ts\nvar JsonRenderer = class {\n render(table) {\n const visibleColumns = table.columns.map((column, index) => ({ column, index })).filter((item) => !item.column.hidden);\n const data = table.rows.map((row) => {\n const obj = {};\n visibleColumns.forEach(({ column, index }) => {\n obj[column.key || column.name] = row.cells[index]?.content;\n });\n return obj;\n });\n return JSON.stringify(data, null, 2);\n }\n};\n\n// src/renderers/HtmlRenderer.ts\nvar escapeHtml = (value) => value.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\").replace(/\"/g, \""\").replace(/'/g, \"'\");\nvar HtmlRenderer = class {\n render(table) {\n const visible = table.columns.map((column, index) => ({ column, index })).filter((item) => !item.column.hidden);\n const head = `<thead><tr>${visible.map((item) => `<th>${escapeHtml(item.column.name)}</th>`).join(\"\")}</tr></thead>`;\n const bodyRows = table.rows.map(\n (row) => `<tr>${visible.map((item) => `<td>${escapeHtml(row.cells[item.index]?.getString() ?? \"\")}</td>`).join(\"\")}</tr>`\n ).join(\"\");\n return `<table>${head}<tbody>${bodyRows}</tbody></table>`;\n }\n};\n\n// src/renderers/MarkdownRenderer.ts\nvar MarkdownRenderer = class {\n render(table) {\n const cols = table.columns.filter((column) => !column.hidden);\n const header = this.drawRow(cols.map((column) => new Cell(column.name)));\n const separator = \"| \" + cols.map((column) => this.alignRule(column.align)).join(\" | \") + \" |\";\n const body = table.rows.map((row) => this.drawRow(row.cells.filter((_, idx) => !table.columns[idx]?.hidden))).join(\"\\n\");\n return [header, separator, body].filter(Boolean).join(\"\\n\");\n }\n drawRow(cells) {\n return \"| \" + cells.map((cell) => cell.getString().replace(/\\|/g, \"\\\\|\")).join(\" | \") + \" |\";\n }\n alignRule(align = \"left\") {\n if (align === \"center\") return \":---:\";\n if (align === \"right\") return \"---:\";\n return \":---\";\n }\n};\n\n// src/themes/Theme.ts\nvar THEME_DEFAULT = {\n topBody: \"-\",\n topJoin: \"+\",\n topLeft: \"+\",\n topRight: \"+\",\n bottomBody: \"-\",\n bottomJoin: \"+\",\n bottomLeft: \"+\",\n bottomRight: \"+\",\n bodyLeft: \"|\",\n bodyRight: \"|\",\n bodyJoin: \"|\",\n joinBody: \"-\",\n joinLeft: \"+\",\n joinRight: \"+\",\n joinJoin: \"+\"\n};\nvar THEME_Honeywell = {\n topBody: \"\\u2550\",\n topJoin: \"\\u2564\",\n topLeft: \"\\u2554\",\n topRight: \"\\u2557\",\n bottomBody: \"\\u2550\",\n bottomJoin: \"\\u2567\",\n bottomLeft: \"\\u255A\",\n bottomRight: \"\\u255D\",\n bodyLeft: \"\\u2551\",\n bodyRight: \"\\u2551\",\n bodyJoin: \"\\u2502\",\n joinBody: \"\\u2500\",\n joinLeft: \"\\u255F\",\n joinRight: \"\\u2562\",\n joinJoin: \"\\u253C\"\n};\nvar THEME_Norc = {\n topBody: \"\\u2500\",\n topJoin: \"\\u252C\",\n topLeft: \"\\u250C\",\n topRight: \"\\u2510\",\n bottomBody: \"\\u2500\",\n bottomJoin: \"\\u2534\",\n bottomLeft: \"\\u2514\",\n bottomRight: \"\\u2518\",\n bodyLeft: \"\\u2502\",\n bodyRight: \"\\u2502\",\n bodyJoin: \"\\u2502\",\n joinBody: \"\\u2500\",\n joinLeft: \"\\u251C\",\n joinRight: \"\\u2524\",\n joinJoin: \"\\u253C\"\n};\nvar THEME_Ramac = {\n topBody: \"\\u2501\",\n topJoin: \"\\u2533\",\n topLeft: \"\\u250F\",\n topRight: \"\\u2513\",\n bottomBody: \"\\u2501\",\n bottomJoin: \"\\u253B\",\n bottomLeft: \"\\u2517\",\n bottomRight: \"\\u251B\",\n bodyLeft: \"\\u2503\",\n bodyRight: \"\\u2503\",\n bodyJoin: \"\\u2502\",\n joinBody: \"\\u2500\",\n joinLeft: \"\\u2523\",\n joinRight: \"\\u252B\",\n joinJoin: \"\\u254B\"\n};\nvar THEME_Void = {\n topBody: \"\",\n topJoin: \"\",\n topLeft: \"\",\n topRight: \"\",\n bottomBody: \"\",\n bottomJoin: \"\",\n bottomLeft: \"\",\n bottomRight: \"\",\n bodyLeft: \"\",\n bodyRight: \"\",\n bodyJoin: \" \",\n joinBody: \"\",\n joinLeft: \"\",\n joinRight: \"\",\n joinJoin: \"\"\n};\nvar THEME_Rounded = {\n topBody: \"\\u2500\",\n topJoin: \"\\u252C\",\n topLeft: \"\\u256D\",\n topRight: \"\\u256E\",\n bottomBody: \"\\u2500\",\n bottomJoin: \"\\u2534\",\n bottomLeft: \"\\u2570\",\n bottomRight: \"\\u256F\",\n bodyLeft: \"\\u2502\",\n bodyRight: \"\\u2502\",\n bodyJoin: \"\\u2502\",\n joinBody: \"\\u2500\",\n joinLeft: \"\\u251C\",\n joinRight: \"\\u2524\",\n joinJoin: \"\\u253C\"\n};\nvar THEME_DoubleLine = {\n topBody: \"\\u2550\",\n topJoin: \"\\u2566\",\n topLeft: \"\\u2554\",\n topRight: \"\\u2557\",\n bottomBody: \"\\u2550\",\n bottomJoin: \"\\u2569\",\n bottomLeft: \"\\u255A\",\n bottomRight: \"\\u255D\",\n bodyLeft: \"\\u2551\",\n bodyRight: \"\\u2551\",\n bodyJoin: \"\\u2551\",\n joinBody: \"\\u2550\",\n joinLeft: \"\\u2560\",\n joinRight: \"\\u2563\",\n joinJoin: \"\\u256C\"\n};\nvar THEME_BoldBox = {\n topBody: \"\\u2501\",\n topJoin: \"\\u2533\",\n topLeft: \"\\u250F\",\n topRight: \"\\u2513\",\n bottomBody: \"\\u2501\",\n bottomJoin: \"\\u253B\",\n bottomLeft: \"\\u2517\",\n bottomRight: \"\\u251B\",\n bodyLeft: \"\\u2503\",\n bodyRight: \"\\u2503\",\n bodyJoin: \"\\u2503\",\n joinBody: \"\\u2501\",\n joinLeft: \"\\u2523\",\n joinRight: \"\\u252B\",\n joinJoin: \"\\u254B\"\n};\nvar THEME_Dots = {\n topBody: \"\\xB7\",\n topJoin: \"\\xB7\",\n topLeft: \"\\xB7\",\n topRight: \"\\xB7\",\n bottomBody: \"\\xB7\",\n bottomJoin: \"\\xB7\",\n bottomLeft: \"\\xB7\",\n bottomRight: \"\\xB7\",\n bodyLeft: \":\",\n bodyRight: \":\",\n bodyJoin: \":\",\n joinBody: \"\\xB7\",\n joinLeft: \":\",\n joinRight: \":\",\n joinJoin: \":\"\n};\nvar BUILTIN_THEMES = {\n default: THEME_DEFAULT,\n honeywell: THEME_Honeywell,\n norc: THEME_Norc,\n ramac: THEME_Ramac,\n void: THEME_Void,\n rounded: THEME_Rounded,\n doubleLine: THEME_DoubleLine,\n boldBox: THEME_BoldBox,\n dots: THEME_Dots,\n doubleHeader: {\n ...THEME_DEFAULT,\n topBody: \"\\u2550\",\n topJoin: \"\\u2564\",\n topLeft: \"\\u2552\",\n topRight: \"\\u2555\",\n joinBody: \"\\u2550\",\n joinLeft: \"\\u255E\",\n joinRight: \"\\u2561\",\n joinJoin: \"\\u256A\"\n },\n thinRounded: THEME_Rounded\n};\nfunction getTheme(name) {\n return BUILTIN_THEMES[name];\n}\n\n// src/Table.ts\nvar Table = class _Table {\n constructor(options = {}) {\n this.columns = [];\n this.rows = [];\n this.compact = false;\n this.responsiveMode = \"none\";\n this.zebra = false;\n this.headerGroups = [];\n this.theme = options.theme || THEME_Rounded;\n this.compact = Boolean(options.compact);\n this.terminalWidth = options.terminalWidth;\n this.responsiveMode = options.responsiveMode || \"none\";\n this.zebra = Boolean(options.zebra);\n this.headerGroups = options.headerGroups || [];\n this.headerColor = options.headerColor || \"magenta\";\n this.rowColor = options.rowColor;\n this.drawHorizontalLine = options.drawHorizontalLine;\n if (options.columns) {\n options.columns.forEach((col) => this.addColumn(col));\n }\n }\n addColumn(options) {\n const colOptions = typeof options === \"string\" ? { name: options, key: options } : options;\n if (this.columns.length === 0 && colOptions.color === void 0) {\n colOptions.color = \"cyan\";\n }\n const col = new Column(colOptions);\n this.columns.push(col);\n return col;\n }\n setColumns(columns) {\n this.columns = [];\n columns.forEach((column) => this.addColumn(column));\n return this;\n }\n addRow(data) {\n const row = new Row(data, this);\n this.rows.push(row);\n return row;\n }\n addRows(rows) {\n rows.forEach((row) => this.addRow(row));\n return this;\n }\n setFooter(footer) {\n this.footer = footer;\n return this;\n }\n summarize(columns, op = \"sum\") {\n const footer = this.footer && !Array.isArray(this.footer) ? { ...this.footer } : {};\n columns.forEach((name) => {\n const colIndex = this.columns.findIndex((c) => c.name === name || c.key === name);\n if (colIndex < 0) return;\n const values = this.rows.map((row) => Number(row.cells[colIndex]?.content)).filter((value) => Number.isFinite(value));\n if (op === \"count\") footer[name] = values.length;\n else if (op === \"avg\")\n footer[name] = values.length ? Number((values.reduce((a, b) => a + b, 0) / values.length).toFixed(2)) : 0;\n else footer[name] = values.reduce((a, b) => a + b, 0);\n });\n this.footer = footer;\n return this;\n }\n paginate(page, pageSize) {\n const start = Math.max(0, (page - 1) * pageSize);\n const end = start + pageSize;\n const next = new _Table({\n theme: this.theme,\n compact: this.compact,\n terminalWidth: this.terminalWidth,\n responsiveMode: this.responsiveMode,\n zebra: this.zebra,\n headerGroups: this.headerGroups,\n columns: this.columns.map((column) => ({ ...column }))\n });\n next.rows = this.rows.slice(start, end);\n next.footer = this.footer;\n return next;\n }\n render() {\n const renderer = new StringRenderer();\n return renderer.render(this);\n }\n getPages(pageSize) {\n const pages = [];\n const totalPages = Math.ceil(this.rows.length / pageSize);\n for (let i = 1; i <= totalPages; i++) {\n pages.push(this.paginate(i, pageSize));\n }\n return pages;\n }\n export(format, options = {}) {\n switch (format) {\n case \"csv\":\n return new CsvRenderer(options).render(this);\n case \"json\":\n return new JsonRenderer().render(this);\n case \"html\":\n return new HtmlRenderer().render(this);\n case \"md\":\n case \"markdown\":\n return new MarkdownRenderer().render(this);\n default:\n throw new Error(`Unknown export format: ${format}`);\n }\n }\n static fromVertical(record, options = {}) {\n const table = new _Table({\n ...options,\n columns: [\n { name: \"Key\", key: \"key\" },\n { name: \"Value\", key: \"value\" }\n ]\n });\n Object.entries(record).forEach(([key, value]) => table.addRow({ key, value }));\n return table;\n }\n sort(columnName, direction = \"asc\") {\n const colIndex = this.columns.findIndex((c) => c.name === columnName || c.key === columnName);\n if (colIndex === -1) return this;\n this.rows.sort((a, b) => {\n const cellA = a.cells[colIndex];\n const cellB = b.cells[colIndex];\n const valA = cellA ? cellA.content : \"\";\n const valB = cellB ? cellB.content : \"\";\n if (valA === valB) return 0;\n if (valA === null || valA === void 0) return 1;\n if (valB === null || valB === void 0) return -1;\n const numA = Number(valA);\n const numB = Number(valB);\n if (!isNaN(numA) && !isNaN(numB)) {\n return direction === \"asc\" ? numA - numB : numB - numA;\n }\n const strA = String(valA).toLowerCase();\n const strB = String(valB).toLowerCase();\n if (strA < strB) return direction === \"asc\" ? -1 : 1;\n if (strA > strB) return direction === \"asc\" ? 1 : -1;\n return 0;\n });\n return this;\n }\n static fromCross(rowHeader, columnHeaders, rows, options = {}) {\n const table = new _Table({\n ...options,\n columns: [\n { name: rowHeader, key: rowHeader },\n ...columnHeaders.map((header) => ({ name: String(header), key: String(header) }))\n ]\n });\n rows.forEach((row) => {\n table.addRow({\n [rowHeader]: row.label,\n ...row.values\n });\n });\n return table;\n }\n /**\n * Compare two data sets and return a table highlighting the differences.\n * @param oldData The original dataset\n * @param newData The new dataset\n * @param options Configures how the diff is matched and rendered\n */\n static compare(oldData, newData, options = {}) {\n const { primaryKey, showUnchanged = true, ...tableOpts } = options;\n const diffTable = new _Table(tableOpts);\n const allKeys = /* @__PURE__ */ new Set();\n [...oldData, ...newData].forEach((row) => Object.keys(row).forEach((k) => allKeys.add(k)));\n if (allKeys.size === 0) return diffTable;\n allKeys.forEach((key) => diffTable.addColumn(key));\n const processedOldIndices = /* @__PURE__ */ new Set();\n const processedNewIndices = /* @__PURE__ */ new Set();\n const compareAndAdd = (oldObj, newObj) => {\n const hasChanges = Array.from(allKeys).some((k) => oldObj[k] !== newObj[k]);\n if (!hasChanges && !showUnchanged) return;\n if (!hasChanges) {\n diffTable.addRow(newObj);\n return;\n }\n const diffRow = {};\n allKeys.forEach((key) => {\n const oldVal = oldObj[key] ?? \"\";\n const newVal = newObj[key] ?? \"\";\n if (oldVal !== newVal) {\n diffRow[key] = { content: String(`${oldVal} \\u2192 ${newVal}`), color: \"yellow\" };\n } else {\n diffRow[key] = newVal;\n }\n });\n diffTable.addRow(diffRow);\n };\n if (primaryKey) {\n oldData.forEach((oldObj, oldIdx) => {\n const pkValue = oldObj[primaryKey];\n const newIdx = newData.findIndex((n) => n[primaryKey] === pkValue);\n if (newIdx !== -1) {\n compareAndAdd(oldObj, newData[newIdx]);\n processedOldIndices.add(oldIdx);\n processedNewIndices.add(newIdx);\n } else {\n const row = {};\n allKeys.forEach((k) => row[k] = { content: String(oldObj[k] ?? \"\"), color: \"red\" });\n diffTable.addRow(row);\n processedOldIndices.add(oldIdx);\n }\n });\n newData.forEach((newObj, newIdx) => {\n if (!processedNewIndices.has(newIdx)) {\n const row = {};\n allKeys.forEach((k) => row[k] = { content: String(newObj[k] ?? \"\"), color: \"green\" });\n diffTable.addRow(row);\n }\n });\n } else {\n const maxLength = Math.max(oldData.length, newData.length);\n for (let i = 0; i < maxLength; i++) {\n const oldObj = oldData[i];\n const newObj = newData[i];\n if (oldObj && newObj) {\n compareAndAdd(oldObj, newObj);\n } else if (oldObj && !newObj) {\n const row = {};\n allKeys.forEach((k) => row[k] = { content: String(oldObj[k] ?? \"\"), color: \"red\" });\n diffTable.addRow(row);\n } else if (!oldObj && newObj) {\n const row = {};\n allKeys.forEach((k) => row[k] = { content: String(newObj[k] ?? \"\"), color: \"green\" });\n diffTable.addRow(row);\n }\n }\n }\n return diffTable;\n }\n addTree(labelColumn, nodes, indentSize = 2) {\n const processNode = (node, depth) => {\n const rowData = { ...node };\n delete rowData.children;\n if (rowData[labelColumn]) {\n const prefix = depth > 0 ? \" \".repeat((depth - 1) * indentSize) + \"\\u251C\\u2500 \" : \"\";\n rowData[labelColumn] = prefix + rowData[labelColumn];\n }\n this.addRow(rowData);\n if (node.children) {\n node.children.forEach((child) => {\n processNode(child, depth + 1);\n });\n }\n };\n nodes.forEach((node) => processNode(node, 0));\n }\n mergeAdjacent(columns) {\n const colIndices = columns ? columns.map((name) => this.columns.findIndex((c) => c.name === name || c.key === name)).filter((i) => i >= 0) : this.columns.map((_, i) => i);\n if (colIndices.length === 0) return;\n colIndices.forEach((colIndex) => {\n let lastCell = this.rows[0]?.cells[colIndex];\n for (let i = 1; i < this.rows.length; i++) {\n const currentCell = this.rows[i].cells[colIndex];\n if (lastCell && currentCell && lastCell.content === currentCell.content) {\n lastCell.rowSpan = (lastCell.rowSpan || 1) + 1;\n currentCell.merged = true;\n } else {\n lastCell = currentCell;\n }\n }\n });\n }\n /**\n * Transpose the table — flip rows ↔ columns.\n *\n * Each original column becomes a data row (first cell = column name).\n * Each original row becomes a new column (header = \"Row 1\", \"Row 2\", …).\n * Returns a **new** Table; the original is not mutated.\n *\n * @example\n * const t = new Table();\n * t.addColumn('Name'); t.addColumn('Age');\n * t.addRow({ Name: 'Alice', Age: 30 });\n * t.addRow({ Name: 'Bob', Age: 25 });\n *\n * console.log(t.transpose().render());\n * // ╭───────┬───────┬─────╮\n * // │ Field │ Row 1 │ Row 2 │\n * // ├───────┼───────┼─────┤\n * // │ Name │ Alice │ Bob │\n * // │ Age │ 30 │ 25 │\n * // ╰───────┴───────┴─────╯\n */\n transpose() {\n const newColumns = [\n { name: \"Field\", key: \"field\" },\n ...this.rows.map((_, i) => ({ name: `Row ${i + 1}`, key: `_row_${i}` }))\n ];\n const transposed = new _Table({\n theme: this.theme,\n compact: this.compact,\n columns: newColumns\n });\n this.columns.forEach((col, colIndex) => {\n const rowData = { field: col.name };\n this.rows.forEach((row, rowIndex) => {\n rowData[`_row_${rowIndex}`] = row.cells[colIndex]?.content ?? \"\";\n });\n transposed.addRow(rowData);\n });\n return transposed;\n }\n};\n\n// src/renderers/StringRenderer.ts\nvar StringRenderer = class {\n render(table) {\n if (table.columns.length === 0 && table.rows.length === 0) return \"\";\n const workingTable = this.getResponsiveTable(table);\n const visibleColumns = this.getVisibleColumns(workingTable);\n const theme = workingTable.theme;\n const grid = LayoutManager.layout(workingTable);\n const colWidths = this.calculateColumnWidths(workingTable, grid);\n const parts = [];\n const rowsToRender = [];\n if (workingTable.headerGroups.length) {\n rowsToRender.push({\n cells: this.createGroupHeaderCells(workingTable.headerGroups),\n zebra: false,\n rowIndex: 0,\n defaultBorderAfter: !workingTable.compact && !!theme.joinBody\n });\n }\n const headerCells = workingTable.columns.filter((c) => !c.hidden).map(\n (column, index) => ({\n cell: new Cell(column.name),\n x: index,\n y: -1,\n realColSpan: 1,\n realRowSpan: 1\n })\n );\n rowsToRender.push({\n cells: headerCells,\n zebra: false,\n rowIndex: 0,\n colorOverride: workingTable.headerColor,\n defaultBorderAfter: workingTable.rows.length > 0 ? !!theme.joinBody : !!workingTable.footer && !!theme.joinBody\n });\n grid.forEach((row, rowIndex) => {\n let rowColorOverride;\n if (workingTable.rowColor) {\n const rawRow = workingTable.rows[rowIndex];\n if (rawRow) {\n const rowObj = {};\n workingTable.columns.forEach((col, ci) => {\n rowObj[col.key || col.name] = rawRow.cells[ci]?.content ?? \"\";\n });\n const result = workingTable.rowColor(rowObj, rowIndex);\n if (result) rowColorOverride = result;\n }\n }\n rowsToRender.push({\n cells: row,\n zebra: workingTable.zebra,\n rowIndex,\n colorOverride: rowColorOverride,\n defaultBorderAfter: rowIndex < grid.length - 1 ? !workingTable.compact && !!theme.joinBody : !!workingTable.footer && !!theme.joinBody\n });\n });\n if (workingTable.footer) {\n rowsToRender.push({\n cells: this.createFooterRow(workingTable),\n zebra: false,\n rowIndex: 0,\n defaultBorderAfter: false\n });\n }\n const size = rowsToRender.length;\n const checkBorder = (index, defaultDraw) => {\n if (workingTable.drawHorizontalLine) {\n return workingTable.drawHorizontalLine(index, size);\n }\n return defaultDraw;\n };\n const pushBorder = (draw, left, body, join, right) => {\n left = left || theme.joinLeft;\n body = body || theme.joinBody;\n join = join || theme.joinJoin;\n right = right || theme.joinRight;\n if (draw && body) {\n parts.push(this.drawBorder(colWidths, visibleColumns, left, body, join, right));\n }\n };\n pushBorder(\n checkBorder(0, !!theme.topBody),\n theme.topLeft,\n theme.topBody,\n theme.topJoin,\n theme.topRight\n );\n rowsToRender.forEach((renderRow, index) => {\n parts.push(\n ...this.drawGridRowLines(\n renderRow.cells,\n colWidths,\n visibleColumns,\n theme,\n renderRow.rowIndex,\n renderRow.zebra,\n renderRow.colorOverride\n )\n );\n if (index < size - 1) {\n pushBorder(\n checkBorder(index + 1, renderRow.defaultBorderAfter),\n theme.joinLeft,\n theme.joinBody,\n theme.joinJoin,\n theme.joinRight\n );\n }\n });\n pushBorder(\n checkBorder(size, !!theme.bottomBody),\n theme.bottomLeft,\n theme.bottomBody,\n theme.bottomJoin,\n theme.bottomRight\n );\n return parts.join(\"\\n\");\n }\n getResponsiveTable(table) {\n const terminalWidth = table.terminalWidth || process.stdout.columns || 80;\n if (table.responsiveMode === \"none\") {\n if (table.columns.some((column) => column.hidden)) {\n return this.buildVisibleTable(table);\n }\n return table;\n }\n const next = new Table({\n ...table,\n columns: table.columns.map((column) => ({ ...column })),\n responsiveMode: \"none\"\n });\n next.rows = table.rows;\n next.footer = table.footer;\n const grid = LayoutManager.layout(next);\n const widths = this.calculateColumnWidths(next, grid);\n const total = this.calculateTableWidth(widths, this.getVisibleColumns(next), next.theme);\n if (total <= terminalWidth) return this.buildVisibleTable(next);\n const sorted = next.columns.map((column, index) => ({ index, priority: column.priority })).sort((a, b) => b.priority - a.priority);\n for (const col of sorted) {\n next.columns[col.index].hidden = true;\n if (this.getVisibleColumns(next).length === 0) break;\n const fake = this.buildVisibleTable(next);\n const g = LayoutManager.layout(fake);\n const w = this.calculateColumnWidths(fake, g);\n const size = this.calculateTableWidth(w, this.getVisibleColumns(fake), fake.theme);\n if (size <= terminalWidth) {\n if (table.responsiveMode === \"stack\") {\n return this.toStacked(fake);\n }\n return fake;\n }\n }\n return this.buildVisibleTable(next);\n }\n toStacked(table) {\n const stacked = new Table({\n theme: table.theme,\n compact: table.compact,\n columns: [\n { name: \"Field\", key: \"field\" },\n { name: \"Value\", key: \"value\" }\n ]\n });\n table.rows.forEach((row, idx) => {\n stacked.addRow([{ content: `Row ${idx + 1}`, colSpan: 2, align: \"center\" }]);\n table.columns.forEach((column, colIndex) => {\n if (column.hidden) return;\n stacked.addRow({ field: column.name, value: row.cells[colIndex]?.content ?? \"\" });\n });\n });\n return stacked;\n }\n createGroupHeaderCells(groups) {\n const cells = [];\n let cursor = 0;\n groups.forEach((group) => {\n cells[cursor] = {\n cell: new Cell({ content: group.title, colSpan: group.colSpan, align: \"center\" }),\n x: cursor,\n y: -2,\n realColSpan: group.colSpan,\n realRowSpan: 1\n };\n cursor += group.colSpan;\n });\n return cells;\n }\n createFooterRow(table) {\n const values = Array.isArray(table.footer) ? table.footer : table.columns.map(\n (column) => table.footer && !Array.isArray(table.footer) ? table.footer[column.key] ?? table.footer[column.name] ?? \"\" : \"\"\n );\n return values.map((value, index) => ({\n cell: new Cell(value),\n x: index,\n y: table.rows.length,\n realColSpan: 1,\n realRowSpan: 1\n }));\n }\n getVisibleColumns(table) {\n return table.columns.filter((column) => !column.hidden);\n }\n buildVisibleTable(table) {\n const visible = table.columns.map((column, index) => ({ column, index })).filter((item) => !item.column.hidden);\n const next = new Table({\n theme: table.theme,\n compact: table.compact,\n terminalWidth: table.terminalWidth,\n responsiveMode: \"none\",\n zebra: table.zebra,\n headerGroups: table.headerGroups,\n columns: visible.map((item) => ({ ...item.column }))\n });\n table.rows.forEach((row) => {\n const data = visible.map(({ index }) => {\n const cell = row.cells[index];\n if (!cell) return \"\";\n return {\n content: cell.content,\n colSpan: cell.colSpan,\n rowSpan: cell.rowSpan,\n align: cell.align,\n vAlign: cell.vAlign\n };\n });\n next.addRow(data);\n });\n if (table.footer) {\n const footer = table.footer;\n if (Array.isArray(footer)) {\n next.footer = visible.map(({ index }) => footer[index]);\n } else {\n next.footer = footer;\n }\n }\n return next;\n }\n calculateTableWidth(widths, columns, theme) {\n if (columns.length === 0) return 0;\n const joinWidth = this.strWidth(theme.bodyJoin);\n const leftWidth = this.strWidth(theme.bodyLeft);\n const rightWidth = this.strWidth(theme.bodyRight);\n const content = widths.reduce((sum, width) => sum + width, 0);\n const padding = columns.reduce(\n (sum, column) => sum + (column.paddingLeft ?? 1) + (column.paddingRight ?? 1),\n 0\n );\n return content + padding + joinWidth * Math.max(0, columns.length - 1) + leftWidth + rightWidth;\n }\n calculateColumnWidths(table, grid) {\n const visibleColumns = this.getVisibleColumns(table);\n const widths = visibleColumns.map((column) => {\n const base = Math.max(column.minWidth, column.width || this.strWidth(column.name));\n return column.maxWidth !== void 0 ? Math.min(base, column.maxWidth) : base;\n });\n const joinWidth = this.strWidth(table.theme.bodyJoin);\n grid.forEach((row) => {\n row.forEach((gridCell) => {\n if (!gridCell || gridCell.hidden || gridCell.realColSpan !== 1) return;\n const index = gridCell.x;\n const column = visibleColumns[index];\n if (!column || column.width) return;\n const rawLines = stripAnsi(gridCell.cell.getString()).split(\"\\n\");\n rawLines.forEach((line) => {\n widths[index] = Math.max(widths[index], this.strWidth(line), column.minWidth);\n if (column.maxWidth) widths[index] = Math.min(widths[index], column.maxWidth);\n });\n });\n });\n this.expandSpannedWidths(grid, widths, visibleColumns, joinWidth);\n return widths;\n }\n expandSpannedWidths(grid, widths, columns, joinWidth) {\n grid.forEach((row) => {\n row.forEach((gridCell) => {\n if (!gridCell || gridCell.hidden || gridCell.realColSpan <= 1) return;\n const start = gridCell.x;\n const span = gridCell.realColSpan;\n if (start + span > columns.length) return;\n const rawLines = stripAnsi(gridCell.cell.getString()).split(\"\\n\");\n const desired = Math.max(1, ...rawLines.map((line) => this.strWidth(line)));\n const current = this.sumWidths(widths, start, span, joinWidth);\n if (desired <= current) return;\n let remaining = desired - current;\n let candidates = [];\n for (let i = 0; i < span; i++) {\n const column = columns[start + i];\n if (!column || column.width !== void 0) continue;\n candidates.push(start + i);\n }\n if (candidates.length === 0) return;\n while (remaining > 0 && candidates.length > 0) {\n const per = Math.ceil(remaining / candidates.length);\n const next = [];\n for (const idx of candidates) {\n const column = columns[idx];\n const maxAdd = column.maxWidth !== void 0 ? Math.max(0, column.maxWidth - widths[idx]) : per;\n if (maxAdd > 0) {\n const applied = Math.min(per, maxAdd);\n widths[idx] += applied;\n remaining -= applied;\n }\n if (column.maxWidth === void 0 || widths[idx] < column.maxWidth) {\n next.push(idx);\n }\n }\n candidates = next;\n }\n });\n });\n }\n drawBorder(widths, columns, left, body, join, right) {\n const segments = widths.map((w, index) => {\n const column = columns[index];\n const padLeft = column?.paddingLeft ?? 1;\n const padRight = column?.paddingRight ?? 1;\n return body.repeat(Math.max(1, w + padLeft + padRight));\n });\n return left + segments.join(join) + right;\n }\n getSpanMetrics(columns, widths, start, span, joinWidth) {\n let contentWidth = 0;\n let padLeft = 1;\n let padRight = 1;\n let internalPadding = 0;\n for (let i = 0; i < span; i++) {\n const column = columns[start + i];\n const left = column?.paddingLeft ?? 1;\n const right = column?.paddingRight ?? 1;\n if (i === 0) padLeft = left;\n else internalPadding += left;\n if (i === span - 1) padRight = right;\n else internalPadding += right;\n contentWidth += widths[start + i] || 0;\n }\n return {\n contentWidth: contentWidth + internalPadding + joinWidth * Math.max(0, span - 1),\n padLeft,\n padRight\n };\n }\n drawGridRowLines(row, widths, columns, theme, rowIndex, zebra, overrideColor) {\n const visibleCols = widths.length;\n const joinWidth = this.strWidth(theme.bodyJoin);\n const cellLines = [];\n for (let i = 0; i < visibleCols; i++) {\n const gridCell = row[i];\n if (!gridCell || gridCell.hidden) continue;\n const col = gridCell.x;\n const column = columns[col];\n const metrics = this.getSpanMetrics(columns, widths, col, gridCell.realColSpan, joinWidth);\n const wrapWord = column?.wrapWord ?? true;\n const truncate = column?.truncate ?? \"...\";\n let rawContent = gridCell.cell.getString();\n if (column?.formatter && gridCell.y >= 0) {\n rawContent = String(column.formatter(rawContent, gridCell.y));\n }\n const lines2 = this.wrapCell(rawContent, metrics.contentWidth, wrapWord, truncate);\n cellLines.push({\n x: col,\n span: gridCell.realColSpan,\n lines: lines2,\n align: gridCell.cell.align || column?.align || \"left\",\n vAlign: gridCell.cell.vAlign || column?.vAlign || \"top\",\n padLeft: metrics.padLeft,\n padRight: metrics.padRight,\n contentWidth: metrics.contentWidth,\n color: gridCell.cell.color\n });\n i += gridCell.realColSpan - 1;\n }\n const rowHeight = Math.max(1, ...cellLines.map((entry) => entry.lines.length));\n const lines = [];\n for (let lineIndex = 0; lineIndex < rowHeight; lineIndex++) {\n let line = theme.bodyLeft;\n for (let col = 0; col < visibleCols; col++) {\n const current = cellLines.find((entry) => entry.x === col);\n if (!current) {\n const metrics = this.getSpanMetrics(columns, widths, col, 1, joinWidth);\n const blank = \" \".repeat(widths[col]);\n line += \" \".repeat(metrics.padLeft) + blank + \" \".repeat(metrics.padRight);\n if (col < visibleCols - 1) line += theme.bodyJoin;\n continue;\n }\n const maxHeight = current.lines.length;\n const offset = this.verticalOffset(current.vAlign, rowHeight, maxHeight);\n const text = lineIndex < offset || lineIndex >= offset + maxHeight ? \"\" : current.lines[lineIndex - offset];\n let aligned = this.alignText(text, current.contentWidth, current.align);\n const colIndex = current.x;\n const column = columns[colIndex];\n if (overrideColor) {\n aligned = colorize(aligned, overrideColor);\n } else if (current.color) {\n aligned = colorize(aligned, current.color);\n } else if (column?.color) {\n aligned = colorize(aligned, column.color);\n }\n line += \" \".repeat(current.padLeft) + aligned + \" \".repeat(current.padRight);\n col += current.span - 1;\n if (col < visibleCols - 1) line += theme.bodyJoin;\n }\n line += theme.bodyRight;\n if (zebra && rowIndex % 2 === 1) line = `\\x1B[2m${line}\\x1B[0m`;\n lines.push(line);\n }\n return lines;\n }\n wrapCell(text, width, wrapWord, truncate) {\n if (width <= 0) return [\"\"];\n const clean = stripAnsi(text);\n if (!wrapWord && this.strWidth(clean) > width) {\n return [this.truncateText(clean, width, truncate)];\n }\n const result = [];\n clean.split(\"\\n\").forEach((rawLine) => {\n if (this.strWidth(rawLine) <= width) {\n result.push(rawLine);\n return;\n }\n if (!wrapWord) {\n result.push(this.truncateText(rawLine, width, truncate));\n return;\n }\n let chunk = \"\";\n rawLine.split(/(\\s+)/).forEach((part) => {\n if (this.strWidth(chunk + part) <= width) {\n chunk += part;\n return;\n }\n if (chunk.trim()) result.push(chunk.trimEnd());\n if (this.strWidth(part) > width) {\n let remainder = part;\n while (this.strWidth(remainder) > width) {\n result.push(this.truncateText(remainder, width, \"\"));\n remainder = remainder.slice(Math.max(1, Math.floor(width / 2)));\n }\n chunk = remainder;\n } else {\n chunk = part;\n }\n });\n if (chunk.trim()) result.push(chunk.trimEnd());\n });\n return result.length ? result : [\"\"];\n }\n truncateText(text, width, suffix) {\n if (this.strWidth(text) <= width) return text;\n if (width <= this.strWidth(suffix)) return suffix.slice(0, Math.max(0, width));\n let out = \"\";\n for (const ch of text) {\n if (this.strWidth(out + ch + suffix) > width) break;\n out += ch;\n }\n return out + suffix;\n }\n alignText(text, width, align) {\n const textWidth = this.strWidth(text);\n if (textWidth >= width) return text;\n const gap = width - textWidth;\n if (align === \"right\") return \" \".repeat(gap) + text;\n if (align === \"center\") {\n const left = Math.floor(gap / 2);\n return \" \".repeat(left) + text + \" \".repeat(gap - left);\n }\n return text + \" \".repeat(gap);\n }\n verticalOffset(vAlign, rowHeight, contentHeight) {\n if (vAlign === \"bottom\") return rowHeight - contentHeight;\n if (vAlign === \"center\") return Math.floor((rowHeight - contentHeight) / 2);\n return 0;\n }\n sumWidths(widths, start, span, joinWidth) {\n let sum = 0;\n for (let i = 0; i < span; i++) sum += widths[start + i] || 0;\n return sum + Math.max(0, span - 1) * joinWidth;\n }\n strWidth(value) {\n return stringWidth(stripAnsi(value));\n }\n};\n\n// src/integrations/csv.ts\nvar CsvTable = class {\n /**\n * Parse a CSV string into a Table.\n * @param csvString Raw CSV content.\n * @param options Parsing options.\n */\n static from(csvString, options = {}) {\n const { hasHeader = true, delimiter = \",\" } = options;\n const lines = csvString.trim().split(/\\r?\\n/).filter((l) => l.trim() !== \"\");\n if (lines.length === 0) {\n return new Table();\n }\n const parseLine = (line) => {\n const result = [];\n let current = \"\";\n let inQuotes = false;\n for (let i = 0; i < line.length; i++) {\n const ch = line[i];\n if (ch === '\"') {\n if (inQuotes && line[i + 1] === '\"') {\n current += '\"';\n i++;\n } else {\n inQuotes = !inQuotes;\n }\n } else if (ch === delimiter && !inQuotes) {\n result.push(current.trim());\n current = \"\";\n } else {\n current += ch;\n }\n }\n result.push(current.trim());\n return result;\n };\n const table = new Table();\n let headers;\n let dataStartIndex;\n if (hasHeader) {\n headers = parseLine(lines[0]);\n dataStartIndex = 1;\n } else {\n const firstRow = parseLine(lines[0]);\n headers = firstRow.map((_, i) => `Col${i + 1}`);\n dataStartIndex = 0;\n }\n headers.forEach((h) => table.addColumn(h));\n for (let i = dataStartIndex; i < lines.length; i++) {\n const values = parseLine(lines[i]);\n const row = {};\n headers.forEach((h, j) => {\n row[h] = values[j] !== void 0 ? values[j] : \"\";\n });\n table.addRow(row);\n }\n return table;\n }\n /**\n * Convert a Table to a CSV string.\n * @param table The table instance to export.\n * @param options CSV formatting options (delimiter, quote).\n */\n static toCsv(table, options) {\n return table.export(\"csv\", options);\n }\n};\n\n// src/InteractiveTable.ts\nimport * as readline from \"readline\";\nvar InteractiveTable = class {\n constructor(table, options = {}) {\n this.currentPage = 1;\n this.sortColumnIndex = 0;\n this.sortDirection = \"asc\";\n // TUI State\n this.mode = \"nav\";\n this.searchQuery = \"\";\n this.selectedRows = /* @__PURE__ */ new Set();\n this.displayedRows = [];\n this.hiddenColumns = /* @__PURE__ */ new Set();\n // Store column keys or names\n this.columnSelectionIndex = 0;\n this.cursorIndex = 0;\n this.table = table;\n this.pageSize = options.pageSize || 10;\n this.onSelect = options.onSelect;\n this.onExit = options.onExit;\n this.displayedRows = [...this.table.rows];\n this.rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n });\n }\n start() {\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n }\n readline.emitKeypressEvents(process.stdin);\n process.stdin.on(\"keypress\", this.handleKey.bind(this));\n this.applyFilterAndSort();\n this.render();\n process.stdout.on(\"resize\", () => this.render());\n }\n clearScreen() {\n const blank = \"\\n\".repeat(process.stdout.rows);\n console.log(blank);\n readline.cursorTo(process.stdout, 0, 0);\n readline.clearScreenDown(process.stdout);\n }\n handleKey(str, key) {\n if (key.name === \"c\" && key.ctrl) {\n this.stop();\n return;\n }\n if (this.mode === \"nav\" && key.name === \"q\") {\n this.stop();\n return;\n }\n if (this.mode === \"search\") {\n this.handleSearchInput(str, key);\n return;\n }\n if (this.mode === \"columns\") {\n this.handleColumnSelection(str, key);\n return;\n }\n if ((key.name === \"slash\" || str === \"/\") && this.mode === \"nav\") {\n this.mode = \"search\";\n this.searchQuery = \"\";\n this.render();\n return;\n }\n switch (key.name) {\n case \"up\": {\n this.cursorIndex = Math.max(0, this.cursorIndex - 1);\n this.render();\n break;\n }\n case \"down\": {\n const pageRowsLength = Math.min(\n this.pageSize,\n this.displayedRows.length - (this.currentPage - 1) * this.pageSize\n );\n this.cursorIndex = Math.min(pageRowsLength - 1, this.cursorIndex + 1);\n this.render();\n break;\n }\n case \"c\":\n this.mode = \"columns\";\n this.columnSelectionIndex = 0;\n this.render();\n break;\n case \"n\":\n case \"right\":\n this.nextPage();\n break;\n case \"p\":\n case \"left\":\n this.prevPage();\n break;\n case \"s\":\n this.toggleSort();\n break;\n case \"space\": {\n const start = (this.currentPage - 1) * this.pageSize;\n const target = this.displayedRows[start + this.cursorIndex];\n if (target) {\n if (this.selectedRows.has(target)) this.selectedRows.delete(target);\n else this.selectedRows.add(target);\n }\n this.render();\n break;\n }\n case \"a\": {\n const allSelected = this.displayedRows.every((r) => this.selectedRows.has(r));\n if (allSelected) this.displayedRows.forEach((r) => this.selectedRows.delete(r));\n else this.displayedRows.forEach((r) => this.selectedRows.add(r));\n this.render();\n break;\n }\n case \"return\":\n // Enter -> Action\n case \"enter\":\n if (this.onSelect) {\n const selected = Array.from(this.selectedRows);\n const result = selected.length > 0 ? selected : this.displayedRows;\n this.stop();\n this.onSelect(result.map((r) => r.getData()));\n }\n break;\n case \"escape\":\n if (this.searchQuery) {\n this.searchQuery = \"\";\n this.applyFilterAndSort();\n this.render();\n } else if (this.selectedRows.size > 0) {\n this.selectedRows.clear();\n this.render();\n }\n break;\n }\n }\n handleSearchInput(str, key) {\n if (key.name === \"return\" || key.name === \"enter\") {\n this.mode = \"nav\";\n this.render();\n return;\n }\n if (key.name === \"escape\") {\n this.mode = \"nav\";\n this.searchQuery = \"\";\n this.applyFilterAndSort();\n this.render();\n return;\n }\n if (key.name === \"backspace\") {\n this.searchQuery = this.searchQuery.slice(0, -1);\n } else if (str && str.length === 1 && !key.ctrl && !key.meta) {\n this.searchQuery += str;\n }\n this.applyFilterAndSort();\n this.render();\n }\n handleColumnSelection(str, key) {\n if (key.name === \"escape\" || key.name === \"return\" || key.name === \"enter\") {\n this.mode = \"nav\";\n this.render();\n return;\n }\n const maxIdx = this.table.columns.length - 1;\n if (key.name === \"up\") {\n this.columnSelectionIndex = Math.max(0, this.columnSelectionIndex - 1);\n this.render();\n } else if (key.name === \"down\") {\n this.columnSelectionIndex = Math.min(maxIdx, this.columnSelectionIndex + 1);\n this.render();\n } else if (key.name === \"space\") {\n const col = this.table.columns[this.columnSelectionIndex];\n const colKey = col.key || col.name;\n if (this.hiddenColumns.has(colKey)) {\n this.hiddenColumns.delete(colKey);\n } else {\n this.hiddenColumns.add(colKey);\n }\n this.render();\n }\n }\n applyFilterAndSort() {\n let rows = [...this.table.rows];\n if (this.searchQuery) {\n const lower = this.searchQuery.toLowerCase();\n rows = rows.filter((row) => {\n return row.cells.some((cell) => String(cell.content).toLowerCase().includes(lower));\n });\n }\n if (this.sortColumnIndex >= 0) {\n const col = this.table.columns[this.sortColumnIndex];\n if (col) {\n rows.sort((a, b) => {\n const valA = a.cells[this.sortColumnIndex]?.content ?? \"\";\n const valB = b.cells[this.sortColumnIndex]?.content ?? \"\";\n const numA = Number(valA);\n const numB = Number(valB);\n if (!isNaN(numA) && !isNaN(numB)) {\n return this.sortDirection === \"asc\" ? numA - numB : numB - numA;\n }\n if (valA < valB) return this.sortDirection === \"asc\" ? -1 : 1;\n if (valA > valB) return this.sortDirection === \"asc\" ? 1 : -1;\n return 0;\n });\n }\n }\n this.displayedRows = rows;\n this.currentPage = 1;\n this.cursorIndex = 0;\n }\n nextPage() {\n const totalPages = Math.ceil(this.displayedRows.length / this.pageSize);\n if (this.currentPage < totalPages) {\n this.currentPage++;\n this.cursorIndex = 0;\n this.render();\n }\n }\n prevPage() {\n if (this.currentPage > 1) {\n this.currentPage--;\n this.cursorIndex = 0;\n this.render();\n }\n }\n toggleSort() {\n if (this.sortDirection === \"asc\") {\n this.sortDirection = \"desc\";\n } else {\n this.sortDirection = \"asc\";\n }\n this.applyFilterAndSort();\n this.render();\n }\n render() {\n this.clearScreen();\n if (this.mode === \"columns\") {\n this.renderColumnSelection();\n return;\n }\n console.log(\"--- Interactive Table (Advanced) ---\");\n console.log(\n `keys: [\\u2191\\u2193] Cursor | [Space] Toggle | [a] All | [Right] Next | [Left] Prev | [s] Sort | [/] Search | [c] Columns | [Enter] Confirm\n`\n );\n const visibleColumns = this.table.columns.filter(\n (c) => !this.hiddenColumns.has(c.key || c.name)\n );\n if (visibleColumns.length === 0) {\n console.log(\"No columns visible. Press [c] to toggle columns.\");\n return;\n }\n const start = (this.currentPage - 1) * this.pageSize;\n const end = start + this.pageSize;\n const pageRows = this.displayedRows.slice(start, end);\n const viewTable = new Table({\n columns: visibleColumns.map((c) => ({ ...c })),\n theme: this.table.theme,\n compact: this.table.compact,\n terminalWidth: this.table.terminalWidth || process.stdout.columns || 80,\n responsiveMode: this.table.responsiveMode\n });\n const validIndices = this.table.columns.map((c, i) => !this.hiddenColumns.has(c.key || c.name) ? i : -1).filter((i) => i !== -1);\n viewTable.rows = pageRows.map((row, pageIdx) => {\n const isSelected = this.selectedRows.has(row);\n const isCursor = pageIdx === this.cursorIndex;\n const newCells = validIndices.map((i) => {\n const cell = row.cells[i];\n if (!isSelected && !isCursor) return cell;\n let content;\n if (isSelected && isCursor) {\n content = `\\x1B[1;32m${cell.content}\\x1B[0m`;\n } else if (isSelected) {\n content = `\\x1B[32m${cell.content}\\x1B[0m`;\n } else {\n content = `\\x1B[36m${cell.content}\\x1B[0m`;\n }\n const highlighted = new Cell({\n content,\n colSpan: cell.colSpan,\n rowSpan: cell.rowSpan,\n align: cell.align,\n vAlign: cell.vAlign,\n color: cell.color\n });\n highlighted.merged = cell.merged;\n return highlighted;\n });\n const nextRow = new Row(row.getData(), viewTable);\n nextRow.cells = newCells;\n return nextRow;\n });\n viewTable.footer = this.table.footer;\n console.log(viewTable.render());\n const total = this.displayedRows.length;\n const selectedCount = this.selectedRows.size;\n const maxPage = Math.ceil(total / this.pageSize) || 1;\n let status = `\nPage ${this.currentPage}/${maxPage} | Items: ${total}`;\n if (selectedCount > 0) status += ` | \\x1B[32mSelected: ${selectedCount}\\x1B[0m`;\n if (this.searchQuery) status += ` | Filter: \"${this.searchQuery}\"`;\n if (this.sortColumnIndex >= 0)\n status += ` | Sort: ${this.table.columns[this.sortColumnIndex]?.name} (${this.sortDirection})`;\n status += ` | Cursor: ${this.cursorIndex + 1}/${pageRows.length}`;\n console.log(status);\n if (this.mode === \"search\") {\n process.stdout.write(`\nSearch > ${this.searchQuery}`);\n }\n }\n renderColumnSelection() {\n console.log(\"--- Toggle Columns ---\\n\");\n console.log(\"keys: [Up/Down] Navigate | [Space] Toggle | [Enter] Done\\n\");\n this.table.columns.forEach((col, idx) => {\n const isHidden = this.hiddenColumns.has(col.key || col.name);\n const isSelected = this.columnSelectionIndex === idx;\n const checkbox = isHidden ? \"[ ]\" : \"[x]\";\n const cursor = isSelected ? \">\" : \" \";\n const name = col.name;\n const line = `${cursor} ${checkbox} ${name}`;\n if (isSelected) {\n console.log(`\\x1B[36m${line}\\x1B[0m`);\n } else {\n console.log(line);\n }\n });\n }\n stop() {\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false);\n }\n this.rl.close();\n if (this.onExit) this.onExit();\n else process.exit(0);\n }\n};\n\nexport {\n Column,\n Cell,\n Row,\n LayoutManager,\n stripAnsi,\n isEmoji,\n isZeroWidth,\n isFullWidth,\n stringWidth,\n colorize,\n StringRenderer,\n CsvRenderer,\n JsonRenderer,\n HtmlRenderer,\n MarkdownRenderer,\n THEME_DEFAULT,\n THEME_Honeywell,\n THEME_Norc,\n THEME_Ramac,\n THEME_Void,\n THEME_Rounded,\n THEME_DoubleLine,\n THEME_BoldBox,\n THEME_Dots,\n BUILTIN_THEMES,\n getTheme,\n Table,\n CsvTable,\n InteractiveTable\n};\n//# sourceMappingURL=chunk-G76XL7PC.mjs.map",
|
|
27
|
+
"import {\n BUILTIN_THEMES,\n Cell,\n Column,\n CsvRenderer,\n CsvTable,\n HtmlRenderer,\n InteractiveTable,\n JsonRenderer,\n LayoutManager,\n MarkdownRenderer,\n Row,\n StringRenderer,\n THEME_BoldBox,\n THEME_DEFAULT,\n THEME_Dots,\n THEME_DoubleLine,\n THEME_Honeywell,\n THEME_Norc,\n THEME_Ramac,\n THEME_Rounded,\n THEME_Void,\n Table,\n colorize,\n getTheme,\n isEmoji,\n isFullWidth,\n isZeroWidth,\n stringWidth,\n stripAnsi\n} from \"./chunk-G76XL7PC.mjs\";\n\n// src/visuals/Sparkline.ts\nvar _Sparkline = class _Sparkline {\n /**\n * Generate a sparkline string from an array of numbers.\n * @param values Array of numbers to chart\n * @param options Configuration options\n */\n static generate(values, options) {\n if (!values || values.length === 0) return \"\";\n const min = options?.min ?? Math.min(...values);\n let max = options?.max ?? Math.max(...values);\n if (min === max) {\n max = min + 1;\n }\n const range = max - min;\n return values.map((v) => {\n const val = Math.max(min, Math.min(max, v));\n const normalized = (val - min) / range;\n const index = Math.floor(normalized * (_Sparkline.BARS.length - 1));\n return _Sparkline.BARS[index];\n }).join(\"\");\n }\n};\n_Sparkline.BARS = [\" \", \"\\u2582\", \"\\u2583\", \"\\u2584\", \"\\u2585\", \"\\u2586\", \"\\u2587\", \"\\u2588\"];\nvar Sparkline = _Sparkline;\n\n// src/visuals/Heatmap.ts\nvar _Heatmap = class _Heatmap {\n /**\n * Apply color to a value based on a range.\n * @param value The value to color\n * @param min Minimum expected value\n * @param max Maximum expected value\n * @param type 'text' or 'bg' (background)\n */\n static color(value, min, max, type = \"text\") {\n const range = max - min;\n const normalized = range === 0 ? 0.5 : (value - min) / range;\n let color = \"\";\n if (type === \"text\") {\n if (normalized < 0.33) color = _Heatmap.RED;\n else if (normalized < 0.66) color = _Heatmap.YELLOW;\n else color = _Heatmap.GREEN;\n } else {\n if (normalized < 0.5) color = _Heatmap.BG_RED;\n else color = _Heatmap.BG_GREEN;\n }\n return `${color}${value}${_Heatmap.RESET}`;\n }\n /**\n * Auto-color an array of numbers.\n */\n static autoColor(values) {\n const min = Math.min(...values);\n const max = Math.max(...values);\n return values.map((v) => _Heatmap.color(v, min, max));\n }\n};\n// ANSI Colors\n_Heatmap.RED = \"\\x1B[31m\";\n_Heatmap.GREEN = \"\\x1B[32m\";\n_Heatmap.YELLOW = \"\\x1B[33m\";\n_Heatmap.BLUE = \"\\x1B[34m\";\n_Heatmap.RESET = \"\\x1B[0m\";\n_Heatmap.BG_RED = \"\\x1B[41m\";\n_Heatmap.BG_GREEN = \"\\x1B[42m\";\nvar Heatmap = _Heatmap;\n\n// src/visuals/ProgressBar.ts\nvar ProgressBar = class {\n /**\n * Generate a progress bar string.\n *\n * @param value - Current value (numerator).\n * @param max - Maximum value (denominator). Defaults to 100.\n * @param options - Display options.\n * @returns A string like `\"███████▒▒▒ 65%\"` ready to place in a cell.\n */\n static generate(value, max = 100, options = {}) {\n const width = options.width ?? 10;\n const filled = options.filled ?? \"\\u2588\";\n const empty = options.empty ?? \"\\u2592\";\n const showPercent = options.showPercent ?? true;\n const safeMax = max === 0 ? 1 : max;\n const clamped = Math.max(0, Math.min(safeMax, value));\n const ratio = clamped / safeMax;\n const filledCount = Math.round(ratio * width);\n const emptyCount = width - filledCount;\n const bar = filled.repeat(filledCount) + empty.repeat(emptyCount);\n if (!showPercent) return bar;\n const label = options.label ?? `${Math.round(ratio * 100)}%`;\n return `${bar} ${label}`;\n }\n};\n\n// src/integrations/html.ts\nvar HtmlTable = class _HtmlTable {\n /**\n * Create a Table from an HTML string\n * @param html String containing a <table>...</table>\n * @param options Configuration\n */\n static from(html, options = {}) {\n const tableMatch = html.match(/<table[^>]*>([\\s\\S]*?)<\\/table>/i);\n if (!tableMatch) {\n throw new Error(\"No <table> tag found in HTML\");\n }\n const content = tableMatch[1];\n const headerMatch = content.match(/<thead[^>]*>([\\s\\S]*?)<\\/thead>/i);\n const headerContent = headerMatch ? headerMatch[1] : content;\n const headers = [];\n const thRegex = /<th[^>]*>([\\s\\S]*?)<\\/th>/gi;\n let thMatch;\n while ((thMatch = thRegex.exec(headerContent)) !== null) {\n headers.push(_HtmlTable.stripTags(thMatch[1]));\n }\n if (headers.length === 0) {\n const trMatch = content.match(/<tr[^>]*>([\\s\\S]*?)<\\/tr>/i);\n if (trMatch) {\n const tdRegex = /<td[^>]*>([\\s\\S]*?)<\\/td>/gi;\n while ((thMatch = tdRegex.exec(trMatch[1])) !== null) {\n headers.push(_HtmlTable.stripTags(thMatch[1]));\n }\n }\n }\n const table = new Table({\n columns: headers.map((h2) => ({ name: h2 })),\n compact: options.compact\n });\n const bodyMatch = content.match(/<tbody[^>]*>([\\s\\S]*?)<\\/tbody>/i);\n const bodyContent = bodyMatch ? bodyMatch[1] : content;\n const trRegex = /<tr[^>]*>([\\s\\S]*?)<\\/tr>/gi;\n let tr;\n while ((tr = trRegex.exec(bodyContent)) !== null) {\n const rowContent = tr[1];\n if (bodyContent === content && headerMatch && headerMatch.index !== void 0 && tr.index < headerMatch.index + headerMatch[0].length)\n continue;\n const cells = {};\n const tdRegex = /<td[^>]*>([\\s\\S]*?)<\\/td>/gi;\n let td;\n let i = 0;\n let hasData = false;\n while ((td = tdRegex.exec(rowContent)) !== null) {\n if (i < headers.length) {\n cells[headers[i]] = _HtmlTable.stripTags(td[1]);\n hasData = true;\n }\n i++;\n }\n if (hasData) {\n table.addRow(cells);\n }\n }\n return table;\n }\n /**\n * Helper to remove HTML tags\n */\n static stripTags(html) {\n return html.replace(/<\\/?[^>]+(>|$)/g, \"\").trim();\n }\n /**\n * Convert a Table to an HTML string\n */\n static toHtml(table) {\n return table.export(\"html\");\n }\n};\n\n// src/integrations/json.ts\nvar JsonTable = class {\n /**\n * Convert a Table to a JSON string.\n * @param table The table instance to export.\n */\n static toJson(table) {\n return table.export(\"json\");\n }\n};\n\n// src/integrations/jsx.ts\nfunction createElement(tag, props, ...children) {\n if (typeof tag === \"function\") {\n return tag({ ...props, children });\n }\n return { tag, props, children: children.flat() };\n}\nfunction render(element) {\n if (element.tag !== \"cmd-table\") {\n throw new Error(\"Root element must be <cmd-table>\");\n }\n const table = new Table({\n theme: element.props.theme ? BUILTIN_THEMES[element.props.theme] || element.props.theme : void 0,\n compact: element.props.compact\n });\n element.children.forEach((child) => {\n if (!child) return;\n if (child.tag === \"cmd-column\") {\n table.addColumn({\n name: child.props.name,\n key: child.props.key,\n width: child.props.width\n });\n } else if (child.tag === \"cmd-row\") {\n const { children, ...rowData } = child.props;\n table.addRow(rowData);\n }\n });\n return table;\n}\n\n// src/integrations/react.ts\nvar h = createElement;\nvar React = { createElement };\nvar render2 = render;\n\n// src/renderers/StreamRenderer.ts\nvar StreamRenderer = class extends StringRenderer {\n constructor(table) {\n super();\n this.headerRendered = false;\n this.widths = [];\n this.table = table;\n this.widths = this.calculateInitialWidths();\n }\n calculateInitialWidths() {\n return this.getStreamColumns().map((column) => {\n const base = Math.max(column.minWidth, column.width || stringWidth(column.name));\n return column.maxWidth !== void 0 ? Math.min(base, column.maxWidth) : base;\n });\n }\n renderHeader() {\n if (this.headerRendered) return \"\";\n const theme = this.table.theme;\n const visibleColumns = this.getStreamColumns();\n const parts = [];\n if (theme.topBody) {\n parts.push(\n this.drawBorder(\n this.widths,\n visibleColumns,\n theme.topLeft,\n theme.topBody,\n theme.topJoin,\n theme.topRight\n )\n );\n }\n const headerCells = visibleColumns.map(\n (column, i) => ({ cell: new Cell(column.name), x: i, y: -1, realColSpan: 1, realRowSpan: 1 })\n );\n parts.push(...this.drawGridRowLines(headerCells, this.widths, visibleColumns, theme, 0, false));\n if (theme.joinBody) {\n parts.push(\n this.drawBorder(\n this.widths,\n visibleColumns,\n theme.joinLeft,\n theme.joinBody,\n theme.joinJoin,\n theme.joinRight\n )\n );\n }\n this.headerRendered = true;\n return parts.join(\"\\n\");\n }\n renderRows(rows) {\n let output = \"\";\n if (!this.headerRendered) output += this.renderHeader() + \"\\n\";\n const visibleIndices = this.table.columns.map((column, index) => ({ column, index })).filter((item) => !item.column.hidden);\n const visibleColumns = visibleIndices.map((item) => item.column);\n const tempTable = new Table({\n theme: this.table.theme,\n columns: visibleColumns.map((column) => ({ ...column }))\n });\n tempTable.rows = rows.map((row) => {\n const filtered = visibleIndices.map(({ index }) => row.cells[index] ?? new Cell(\"\"));\n return { cells: filtered };\n });\n const grid = LayoutManager.layout(tempTable);\n const theme = this.table.theme;\n output += grid.map(\n (row) => this.drawGridRowLines(row, this.widths, visibleColumns, theme, 0, false).join(\"\\n\")\n ).join(\"\\n\");\n return output;\n }\n renderFooter() {\n const theme = this.table.theme;\n const visibleColumns = this.getStreamColumns();\n if (theme.bottomBody)\n return this.drawBorder(\n this.widths,\n visibleColumns,\n theme.bottomLeft,\n theme.bottomBody,\n theme.bottomJoin,\n theme.bottomRight\n );\n return \"\";\n }\n getStreamColumns() {\n return this.table.columns.filter((column) => !column.hidden);\n }\n};\n\n// src/utils/mergeUtils.ts\nfunction mergeAdjacent(table, columns) {\n const colIndices = columns ? columns.map((name) => table.columns.findIndex((c) => c.name === name || c.key === name)).filter((i) => i >= 0) : table.columns.map((_, i) => i);\n if (colIndices.length === 0) return;\n colIndices.forEach((colIndex) => {\n let lastRowIndex = 0;\n let lastCell = table.rows[0]?.cells[colIndex];\n for (let i = 1; i < table.rows.length; i++) {\n const currentCell = table.rows[i].cells[colIndex];\n if (lastCell && currentCell && lastCell.content === currentCell.content) {\n lastCell.rowSpan = (lastCell.rowSpan || 1) + 1;\n currentCell.merged = true;\n } else {\n lastCell = currentCell;\n lastRowIndex = i;\n }\n }\n });\n}\n\n// src/utils/treeUtils.ts\nfunction addTree(table, labelColumn, nodes, indentSize = 2) {\n const processNode = (node, depth) => {\n const rowData = { ...node };\n delete rowData.children;\n if (rowData[labelColumn]) {\n const prefix = depth > 0 ? \" \".repeat((depth - 1) * indentSize) + \"\\u251C\\u2500 \" : \"\";\n rowData[labelColumn] = prefix + rowData[labelColumn];\n }\n table.addRow(rowData);\n if (node.children) {\n node.children.forEach((child, index) => {\n processNode(child, depth + 1);\n });\n }\n };\n nodes.forEach((node) => processNode(node, 0));\n}\n\n// src/AsyncInteractiveTable.ts\nimport * as readline from \"readline\";\nvar AsyncInteractiveTable = class {\n constructor(dataSource, tableTemplate, options = {}) {\n this.currentPage = 1;\n this.totalRows = 0;\n this.sortColumn = null;\n this.sortDirection = \"asc\";\n this.mode = \"nav\";\n this.filterQuery = \"\";\n // Cache current page data\n this.currentRows = [];\n this.isLoading = false;\n this.dataSource = dataSource;\n this.table = tableTemplate;\n this.pageSize = options.pageSize || 10;\n this.onSelect = options.onSelect;\n this.onExit = options.onExit;\n this.rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n });\n }\n async start() {\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n }\n readline.emitKeypressEvents(process.stdin);\n process.stdin.on(\"keypress\", this.handleKey.bind(this));\n await this.refreshData();\n this.render();\n process.stdout.on(\"resize\", () => this.render());\n }\n async refreshData() {\n this.isLoading = true;\n this.render();\n try {\n await this.dataSource.count().then((c) => this.totalRows = c);\n const offset = (this.currentPage - 1) * this.pageSize;\n this.currentRows = await this.dataSource.getRows(offset, this.pageSize);\n } catch (e) {\n console.error(\"Error fetching data:\", e);\n } finally {\n this.isLoading = false;\n this.render();\n }\n }\n clearScreen() {\n const blank = \"\\n\".repeat(process.stdout.rows);\n console.log(blank);\n readline.cursorTo(process.stdout, 0, 0);\n readline.clearScreenDown(process.stdout);\n }\n handleKey(str, key) {\n if (this.isLoading) return;\n if (key.name === \"c\" && key.ctrl) {\n this.stop();\n return;\n }\n if (this.mode === \"nav\" && key.name === \"q\") {\n this.stop();\n return;\n }\n if (this.mode === \"filter\") {\n this.handleFilterInput(str, key);\n return;\n }\n if ((key.name === \"slash\" || str === \"/\") && this.mode === \"nav\") {\n this.mode = \"filter\";\n this.filterQuery = \"\";\n this.render();\n return;\n }\n switch (key.name) {\n case \"n\":\n case \"right\":\n this.nextPage();\n break;\n case \"p\":\n case \"left\":\n this.prevPage();\n break;\n case \"enter\":\n case \"return\":\n this.stop();\n break;\n }\n }\n handleFilterInput(str, key) {\n if (key.name === \"return\" || key.name === \"enter\") {\n this.mode = \"nav\";\n if (this.dataSource.filter) {\n this.dataSource.filter(this.filterQuery);\n this.currentPage = 1;\n this.refreshData();\n } else {\n this.render();\n }\n return;\n }\n if (key.name === \"escape\") {\n this.mode = \"nav\";\n this.filterQuery = \"\";\n if (this.dataSource.filter) {\n this.dataSource.filter(\"\");\n this.currentPage = 1;\n this.refreshData();\n }\n return;\n }\n if (key.name === \"backspace\") {\n this.filterQuery = this.filterQuery.slice(0, -1);\n } else if (str && str.length === 1 && !key.ctrl && !key.meta) {\n this.filterQuery += str;\n }\n this.render();\n }\n nextPage() {\n const maxPage = Math.ceil(this.totalRows / this.pageSize);\n if (this.currentPage < maxPage) {\n this.currentPage++;\n this.refreshData();\n }\n }\n prevPage() {\n if (this.currentPage > 1) {\n this.currentPage--;\n this.refreshData();\n }\n }\n render() {\n this.clearScreen();\n console.log(\"--- Async Interactive Table ---\");\n console.log(`keys: [Right] Next | [Left] Prev | [/] Filter | [q] Quit\n`);\n if (this.isLoading) {\n console.log(\"\\n Loading data...\\n\");\n return;\n }\n const viewTable = new Table({\n columns: this.table.columns.map((c) => ({ ...c })),\n theme: this.table.theme,\n compact: this.table.compact,\n terminalWidth: this.table.terminalWidth || process.stdout.columns || 80\n });\n this.currentRows.forEach((row) => viewTable.addRow(row));\n console.log(viewTable.render());\n const maxPage = Math.ceil(this.totalRows / this.pageSize) || 1;\n let status = `\nPage ${this.currentPage}/${maxPage} | Total: ${this.totalRows}`;\n if (this.filterQuery) status += ` | Filter: \"${this.filterQuery}\"`;\n console.log(status);\n if (this.mode === \"filter\") {\n process.stdout.write(`\nFilter > ${this.filterQuery}`);\n }\n }\n stop() {\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false);\n }\n this.rl.close();\n if (this.onExit) this.onExit();\n else process.exit(0);\n }\n};\n\n// src/integrations/sql.ts\nvar SqlDataSource = class {\n constructor(db, tableName) {\n this.orderBy = \"\";\n this.whereClause = \"\";\n this.db = db;\n this.tableName = tableName;\n }\n async count() {\n const sql = `SELECT COUNT(*) as c FROM ${this.tableName}${this.whereClause}`;\n const row = this.db.prepare(sql).get();\n return row.c;\n }\n async getRows(offset, limit) {\n const sql = `SELECT * FROM ${this.tableName}${this.whereClause}${this.orderBy} LIMIT ? OFFSET ?`;\n return this.db.prepare(sql).all(limit, offset);\n }\n sort(column, direction) {\n this.orderBy = ` ORDER BY ${column} ${direction.toUpperCase()}`;\n }\n filter(query) {\n if (!query) {\n this.whereClause = \"\";\n return;\n }\n const columns = this.db.pragma(`table_info(${this.tableName})`);\n const conditions = columns.map((col) => `${col.name} LIKE '%${query}%'`);\n this.whereClause = ` WHERE ${conditions.join(\" OR \")}`;\n }\n};\n\n// src/analysis/Aggregations.ts\nvar Aggregations = class {\n static sum(values) {\n return values.reduce((a, b) => a + b, 0);\n }\n static avg(values) {\n if (values.length === 0) return 0;\n return Number((this.sum(values) / values.length).toFixed(2));\n }\n static min(values) {\n if (values.length === 0) return 0;\n return Math.min(...values);\n }\n static max(values) {\n if (values.length === 0) return 0;\n return Math.max(...values);\n }\n static count(values) {\n return values.length;\n }\n static stdDev(values) {\n if (values.length === 0) return 0;\n const mean = this.avg(values);\n const squareDiffs = values.map((value) => Math.pow(value - mean, 2));\n const avgSquareDiff = this.avg(squareDiffs);\n return Number(Math.sqrt(avgSquareDiff).toFixed(2));\n }\n static variance(values) {\n if (values.length === 0) return 0;\n const mean = this.avg(values);\n const squareDiffs = values.map((value) => Math.pow(value - mean, 2));\n return Number(this.avg(squareDiffs).toFixed(2));\n }\n static percentile(values, p) {\n if (values.length === 0) return 0;\n const sorted = [...values].sort((a, b) => a - b);\n const pos = (sorted.length - 1) * p;\n const base = Math.floor(pos);\n const rest = pos - base;\n if (sorted[base + 1] !== void 0) {\n return Number((sorted[base] + rest * (sorted[base + 1] - sorted[base])).toFixed(2));\n } else {\n return Number(sorted[base].toFixed(2));\n }\n }\n};\n\n// src/analysis/PivotTable.ts\nvar PivotTable = class {\n static create(data, options) {\n const { groupBy, pivot, algorithm = \"count\", targetColumn, onError } = options;\n const table = new Table();\n try {\n const groups = {};\n data.forEach((row) => {\n const key = String(row[groupBy]);\n if (!groups[key]) groups[key] = [];\n groups[key].push(row);\n });\n let pivotKeys = [\"Value\"];\n if (pivot) {\n const allPivotValues = /* @__PURE__ */ new Set();\n data.forEach((row) => allPivotValues.add(String(row[pivot])));\n pivotKeys = Array.from(allPivotValues).sort();\n }\n table.addColumn(groupBy);\n pivotKeys.forEach((key) => table.addColumn(key));\n Object.entries(groups).forEach(([groupKey, rows]) => {\n const rowData = { [groupBy]: groupKey };\n pivotKeys.forEach((pivotKey) => {\n const cellRows = pivot ? rows.filter((r) => String(r[pivot]) === pivotKey) : rows;\n const values = targetColumn ? cellRows.map((r) => r[targetColumn]) : cellRows;\n let result;\n if (typeof algorithm === \"function\") {\n result = algorithm(values);\n } else if (algorithm === \"count\") {\n result = values.length;\n } else {\n const nums = values.map((v) => Number(v)).filter((n) => !isNaN(n));\n result = Aggregations[algorithm](nums);\n }\n rowData[pivotKey] = result;\n });\n table.addRow(rowData);\n });\n } catch (error) {\n if (onError) onError(error);\n else throw error;\n }\n return table;\n }\n};\n\n// src/analysis/CrossTab.ts\nvar CrossTab = class {\n static create(data, options) {\n const { rowKey, colKey, valueKey, aggregator = \"sum\", missingValue = \"-\" } = options;\n const table = new Table();\n const rows = /* @__PURE__ */ new Set();\n const cols = /* @__PURE__ */ new Set();\n data.forEach((item) => {\n rows.add(String(item[rowKey]));\n cols.add(String(item[colKey]));\n });\n const sortedRows = Array.from(rows).sort();\n const sortedCols = Array.from(cols).sort();\n table.addColumn(rowKey);\n sortedCols.forEach((col) => table.addColumn(col));\n sortedRows.forEach((r) => {\n const rowData = { [rowKey]: r };\n sortedCols.forEach((c) => {\n const matches = data.filter(\n (item) => String(item[rowKey]) === r && String(item[colKey]) === c\n );\n if (matches.length === 0) {\n rowData[c] = missingValue;\n } else {\n const values = matches.map((m) => m[valueKey]);\n let result;\n if (typeof aggregator === \"function\") {\n result = aggregator(values);\n } else if (aggregator === \"count\") {\n result = values.length;\n } else if (aggregator === \"first\") {\n result = values[0];\n } else if (aggregator === \"last\") {\n result = values[values.length - 1];\n } else {\n result = values.reduce((sum, v) => sum + (Number(v) || 0), 0);\n }\n rowData[c] = result;\n }\n });\n table.addRow(rowData);\n });\n return table;\n }\n};\nexport {\n Aggregations,\n AsyncInteractiveTable,\n BUILTIN_THEMES,\n Cell,\n Column,\n CrossTab,\n CsvRenderer,\n CsvTable,\n Heatmap,\n HtmlRenderer,\n HtmlTable,\n InteractiveTable,\n JsonRenderer,\n JsonTable,\n LayoutManager,\n MarkdownRenderer,\n PivotTable,\n ProgressBar,\n React,\n Row,\n Sparkline,\n SqlDataSource,\n StreamRenderer,\n StringRenderer,\n THEME_BoldBox,\n THEME_DEFAULT,\n THEME_Dots,\n THEME_DoubleLine,\n THEME_Honeywell,\n THEME_Norc,\n THEME_Ramac,\n THEME_Rounded,\n THEME_Void,\n Table,\n addTree,\n colorize,\n getTheme,\n h,\n isEmoji,\n isFullWidth,\n isZeroWidth,\n mergeAdjacent,\n render2 as render,\n stringWidth,\n stripAnsi\n};\n//# sourceMappingURL=index.mjs.map",
|
|
28
|
+
"import { Table } from \"cmd-table\";\nimport type { Result } from \"neverthrow\";\nimport type { VexSerialError } from \"@v5x/serial\";\n\nexport const utcTimestamp = new Intl.DateTimeFormat(\"en-US\", {\n timeZone: \"UTC\",\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false,\n});\n\nexport function renderTable(columns: string[], rows: string[][]): string {\n const table = new Table({ compact: true });\n for (const column of columns) table.addColumn(column);\n for (const row of rows) table.addRow(row);\n return table.render();\n}\n\nexport function printJson(value: unknown): void {\n console.log(JSON.stringify(value, null, 2));\n}\n\nexport function unwrap<T, E>(result: Result<T, E>, message: string): T {\n if (result.isErr()) throw new Error(message);\n return result.value;\n}\n\nexport function formatSerialFailure(\n message: string,\n error: VexSerialError,\n): string {\n const detail = error.message.trim();\n return detail === \"\"\n ? `${message}: ${error.kind}`\n : `${message}: ${error.kind}: ${detail}`;\n}\n\nexport function unwrapSerial<T>(\n result: Result<T, VexSerialError>,\n message: string,\n): T {\n if (result.isErr())\n throw new Error(formatSerialFailure(message, result.error));\n return result.value;\n}\n",
|
|
29
|
+
"import type { ProjectInfo, ValidatedProgramArtifacts } from \"./project\";\nimport type { ProjectToolchain } from \"./scaffold\";\n\nexport interface WorkflowProjectJson {\n path: string;\n type: ProjectInfo[\"type\"];\n name: string;\n description: string;\n artifactPath: string | null;\n}\n\nexport interface WorkflowArtifactJson {\n role: \"hot\" | \"cold\";\n path: string;\n size: number;\n}\n\nexport interface WorkflowBuildJson {\n command: \"build\";\n project: WorkflowProjectJson;\n outputFiles: string[];\n}\n\nexport interface WorkflowCleanJson {\n command: \"clean\";\n project: WorkflowProjectJson;\n outputFiles: string[];\n}\n\nexport interface WorkflowUploadJson {\n command: \"upload\" | \"run\";\n project: WorkflowProjectJson;\n slot: number;\n name: string;\n description: string;\n icon: string;\n artifactPath: string;\n artifacts: WorkflowArtifactJson[];\n built: boolean;\n started: boolean;\n}\n\nexport interface WorkflowCreateJson {\n command: \"new\" | \"init\";\n projectPath: string;\n projectType: ProjectToolchain;\n created: true;\n}\n\nexport interface WorkflowInstallJson {\n command: \"install\";\n toolchain: ProjectToolchain;\n installed: true;\n}\n\nexport function toWorkflowCreateJson(\n command: WorkflowCreateJson[\"command\"],\n projectPath: string,\n projectType: ProjectToolchain,\n): WorkflowCreateJson {\n return {\n command,\n projectPath,\n projectType,\n created: true,\n };\n}\n\nexport function toWorkflowInstallJson(\n toolchain: ProjectToolchain,\n): WorkflowInstallJson {\n return {\n command: \"install\",\n toolchain,\n installed: true,\n };\n}\n\nexport function toWorkflowProjectJson(\n project: ProjectInfo,\n): WorkflowProjectJson {\n return {\n path: project.path,\n type: project.type,\n name: project.name,\n description: project.description,\n artifactPath: project.artifact ?? null,\n };\n}\n\nexport function projectOutputFiles(project: ProjectInfo): string[] {\n return project.artifact === undefined ? [] : [project.artifact];\n}\n\nexport function toWorkflowArtifactJson(\n artifacts: ValidatedProgramArtifacts,\n): WorkflowArtifactJson[] {\n const rows: WorkflowArtifactJson[] = [\n { role: \"hot\", path: artifacts.hot.path, size: artifacts.hot.size },\n ];\n if (artifacts.cold !== undefined) {\n rows.push({\n role: \"cold\",\n path: artifacts.cold.path,\n size: artifacts.cold.size,\n });\n }\n return rows;\n}\n",
|
|
30
|
+
"import type { Sade } from \"sade\";\nimport chalk from \"chalk\";\nimport { buildProject, inspectProject } from \"../utils/project\";\nimport { printJson } from \"../utils/output\";\nimport {\n projectOutputFiles,\n toWorkflowProjectJson,\n} from \"../utils/workflow-json\";\n\nexport default function registerBuildCommand(program: Sade) {\n program\n .command(\"build [path]\", \"build a program for the V5 brain\", { alias: \"b\" })\n .option(\"--json\", \"print machine-readable JSON\")\n .action(\n async (path: string = process.cwd(), options: { json?: boolean }) => {\n const project = await inspectProject(path);\n if (options.json !== true)\n console.log(chalk.yellow(`building ${project.type} program...`));\n await buildProject(project, {\n stdout: options.json === true ? \"ignore\" : \"inherit\",\n });\n if (options.json === true) {\n printJson({\n command: \"build\",\n project: toWorkflowProjectJson(project),\n outputFiles: projectOutputFiles(project),\n });\n }\n },\n );\n}\n",
|
|
31
|
+
"import { V5SerialDevice } from \"@v5x/serial\";\nimport { basename } from \"node:path\";\nimport { serial, type Serial, type SerialPort } from \"./adapter\";\n\nexport const V5X_PORT_ENV = \"V5X_PORT\";\n\nexport interface PortSelectionOptions {\n port?: string;\n}\n\ntype Environment = Record<string, string | undefined>;\n\nfunction normalizePortSelector(\n selector: string | undefined,\n): string | undefined {\n const trimmed = selector?.trim();\n return trimmed === \"\" ? undefined : trimmed;\n}\n\nexport function resolvePortSelector(\n options: PortSelectionOptions = {},\n environment: Environment = process.env,\n): string | undefined {\n return (\n normalizePortSelector(options.port) ??\n normalizePortSelector(environment[V5X_PORT_ENV])\n );\n}\n\nfunction portIdentifiers(port: SerialPort): string[] {\n const info = port.getInfo();\n return [\n info.path,\n info.id,\n info.serialNumber,\n info.path === undefined ? undefined : basename(info.path),\n ].filter((value): value is string => value !== undefined && value !== \"\");\n}\n\nexport function matchesPortSelector(\n port: SerialPort,\n selector: string,\n): boolean {\n return portIdentifiers(port).includes(selector);\n}\n\nclass SelectedSerialAdapter extends EventTarget implements Serial {\n onconnect: (event: Event) => void = () => {};\n ondisconnect: (event: Event) => void = () => {};\n\n constructor(\n private readonly delegate: Serial,\n private readonly selector: string,\n ) {\n super();\n }\n\n async getPorts(): Promise<SerialPort[]> {\n return (await this.delegate.getPorts()).filter((port) =>\n matchesPortSelector(port, this.selector),\n );\n }\n\n async requestPort(\n options?: Parameters<Serial[\"requestPort\"]>[0],\n ): Promise<SerialPort> {\n const filters = options?.filters;\n const ports = await this.getPorts();\n const port = ports.find((candidate) => {\n if (candidate.readable !== null) return false;\n if (!filters?.length) return true;\n const info = candidate.getInfo();\n return filters.some(\n (filter) =>\n (filter.usbVendorId === undefined ||\n filter.usbVendorId === info.usbVendorId) &&\n (filter.usbProductId === undefined ||\n filter.usbProductId === info.usbProductId),\n );\n });\n if (port) return port;\n throw new Error(`No port found matching ${this.selector}`);\n }\n}\n\nexport function selectSerialPort(\n baseSerial: Serial,\n selector: string | undefined,\n): Serial {\n return selector === undefined\n ? baseSerial\n : new SelectedSerialAdapter(baseSerial, selector);\n}\n\nexport function createV5Device(\n options: PortSelectionOptions = {},\n): V5SerialDevice {\n return new V5SerialDevice(\n selectSerialPort(serial, resolvePortSelector(options)),\n );\n}\n\nexport async function connectV5Device(\n device = createV5Device(),\n): Promise<V5SerialDevice> {\n device.autoRefresh = false;\n try {\n const result = await device.connect();\n if (result.isErr()) {\n throw new Error(\n `v5 device not connected: ${result.error.message ?? result.error.kind}`,\n );\n }\n return device;\n } catch (error) {\n await device.dispose();\n throw error;\n }\n}\n\nexport async function withV5Device<Result>(\n operation: (device: V5SerialDevice) => Promise<Result>,\n device = createV5Device(),\n): Promise<Result> {\n const connectedDevice = await connectV5Device(device);\n try {\n return await operation(connectedDevice);\n } finally {\n await connectedDevice.dispose();\n }\n}\n\nexport async function withSelectedV5Device<Result>(\n options: PortSelectionOptions,\n operation: (device: V5SerialDevice) => Promise<Result>,\n): Promise<Result> {\n return await withV5Device(operation, createV5Device(options));\n}\n",
|
|
32
|
+
"import type { SerialPort as BunSerialPortRaw } from \"bun-serialport\";\nimport { readdir, realpath, readlink } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { platform } from \"node:os\";\n\nexport interface SerialPortFilter {\n usbVendorId?: number;\n usbProductId?: number;\n}\n\nexport interface SerialPortInfo {\n usbVendorId?: number;\n usbProductId?: number;\n path?: string;\n id?: string;\n serialNumber?: string;\n}\n\nexport interface SerialPort extends EventTarget {\n onconnect: (event: Event) => void;\n ondisconnect: (event: Event) => void;\n readonly readable: ReadableStream<Uint8Array> | null;\n readonly writable: WritableStream<Uint8Array> | null;\n getInfo(): SerialPortInfo;\n open(options: { baudRate: number }): Promise<void>;\n close(): Promise<void>;\n forget(): Promise<void>;\n}\n\nexport interface Serial extends EventTarget {\n onconnect: (event: Event) => void;\n ondisconnect: (event: Event) => void;\n getPorts(): Promise<SerialPort[]>;\n requestPort(options?: { filters?: SerialPortFilter[] }): Promise<SerialPort>;\n}\n\nexport interface AdapterPortInfo {\n path: string;\n vendorId?: string;\n productId?: string;\n serialNumber?: string;\n}\n\nasync function listPorts(): Promise<AdapterPortInfo[]> {\n return (await import(\"bun-serialport\")).list();\n}\n\ntype ReadTextFile = (path: string) => Promise<string>;\n\nconst readTextFile: ReadTextFile = (path) => Bun.file(path).text();\n\nexport async function readLinuxUsbDeviceAttributes(\n device: string,\n readText: ReadTextFile = readTextFile,\n): Promise<Pick<AdapterPortInfo, \"vendorId\" | \"productId\" | \"serialNumber\">> {\n let current = device;\n for (let i = 0; i < 5; i++, current = join(current, \"..\")) {\n try {\n const [vendorId, productId] = await Promise.all([\n readText(join(current, \"idVendor\")),\n readText(join(current, \"idProduct\")),\n ]);\n const serialNumber = await readText(join(current, \"serial\"))\n .then((value) => value.trim())\n .catch(() => undefined);\n return {\n vendorId: vendorId.trim(),\n productId: productId.trim(),\n serialNumber: serialNumber === \"\" ? undefined : serialNumber,\n };\n } catch {\n // Keep walking up toward the USB device node.\n }\n }\n return {};\n}\n\nexport class WebSerialPortAdapter extends EventTarget implements SerialPort {\n onconnect: (event: Event) => void = () => {};\n ondisconnect: (event: Event) => void = () => {};\n\n private port: BunSerialPortRaw | null = null;\n private controller: ReadableStreamDefaultController<Uint8Array> | null = null;\n private _readable: ReadableStream<Uint8Array> | null = null;\n private _writable: WritableStream<Uint8Array> | null = null;\n\n constructor(\n private readonly path: string,\n private readonly info: SerialPortInfo,\n ) {\n super();\n }\n\n get readable(): ReadableStream<Uint8Array> | null {\n return this._readable;\n }\n get writable(): WritableStream<Uint8Array> | null {\n return this._writable;\n }\n\n getInfo(): SerialPortInfo {\n return this.info;\n }\n\n async open(options: { baudRate: number }): Promise<void> {\n if (this.port) throw new Error(\"Port already open\");\n\n const { SerialPort } = await import(\"bun-serialport\");\n const port = new SerialPort({\n path: this.path,\n baudRate: options.baudRate,\n autoOpen: false,\n });\n await port.open();\n this.port = port;\n\n this._readable = new ReadableStream({\n start: (controller) => {\n this.controller = controller;\n port.on(\"data\", (data: Uint8Array) => controller.enqueue(data));\n port.on(\"error\", (error) => {\n controller.error(error);\n this.close().catch(() => {});\n });\n },\n cancel: () => void this.close(),\n });\n\n this._writable = new WritableStream({\n write: async (chunk) => {\n if (!this.port) throw new Error(\"Port closed\");\n await this.port.write(chunk);\n },\n close: () => this.close(),\n });\n }\n\n async close(): Promise<void> {\n const port = this.port;\n if (!port) return;\n this.port = null;\n\n try {\n this.controller?.close();\n } catch {\n // The controller may already have been closed by the native port.\n }\n this.controller = null;\n\n try {\n await port.close();\n } finally {\n try {\n port.removeAllListeners?.();\n } catch {\n // Some native serial implementations do not expose listener cleanup.\n }\n this._readable = null;\n this._writable = null;\n this.dispatchEvent(new Event(\"disconnect\"));\n }\n }\n\n async forget(): Promise<void> {\n await this.close();\n }\n}\n\nexport class WebSerialAdapter extends EventTarget implements Serial {\n onconnect: (event: Event) => void = () => {};\n ondisconnect: (event: Event) => void = () => {};\n\n private readonly ports = new Map<string, WebSerialPortAdapter>();\n\n constructor(\n private readonly os: NodeJS.Platform = platform(),\n private readonly list: () => Promise<AdapterPortInfo[]> = listPorts,\n ) {\n super();\n }\n\n private async listLinuxPorts(): Promise<AdapterPortInfo[]> {\n const ttys = await readdir(\"/sys/class/tty\").catch(() => []);\n const ports: AdapterPortInfo[] = [];\n\n for (const name of ttys) {\n try {\n const device = await realpath(`/sys/class/tty/${name}/device`);\n const subsystem = await readlink(join(device, \"subsystem\")).catch(\n () => \"\",\n );\n const info: AdapterPortInfo = { path: `/dev/${name}` };\n\n if (subsystem.includes(\"usb\")) {\n Object.assign(info, await readLinuxUsbDeviceAttributes(device));\n }\n ports.push(info);\n } catch {\n // Not a real device or no permission.\n }\n }\n return ports;\n }\n\n async getPorts(): Promise<SerialPort[]> {\n if (this.os === \"win32\") {\n throw new Error(\n \"Windows serial access needs a Windows-capable serial backend; bun-serialport only supports Linux and macOS\",\n );\n }\n\n const ports =\n this.os === \"linux\" ? await this.listLinuxPorts() : await this.list();\n\n const activePaths = new Set(ports.map((port) => port.path));\n for (const [path, port] of this.ports) {\n if (!activePaths.has(path) && port.readable === null)\n this.ports.delete(path);\n }\n\n return ports.map(({ path, vendorId, productId, serialNumber }) => {\n let adapter = this.ports.get(path);\n if (!adapter) {\n adapter = new WebSerialPortAdapter(path, {\n path,\n id: serialNumber ?? path,\n serialNumber,\n usbVendorId: vendorId ? parseInt(vendorId, 16) : undefined,\n usbProductId: productId ? parseInt(productId, 16) : undefined,\n });\n this.ports.set(path, adapter);\n }\n return adapter;\n });\n }\n\n async requestPort(options?: {\n filters?: SerialPortFilter[];\n }): Promise<SerialPort> {\n const ports = await this.getPorts();\n const filters = options?.filters;\n if (!filters?.length) {\n const port = ports[0];\n if (port) return port;\n throw new Error(\"No port found\");\n }\n\n const port = ports.find((candidate) => {\n const info = candidate.getInfo();\n return filters.some(\n (filter) =>\n (filter.usbVendorId === undefined ||\n filter.usbVendorId === info.usbVendorId) &&\n (filter.usbProductId === undefined ||\n filter.usbProductId === info.usbProductId),\n );\n });\n if (port) return port;\n throw new Error(\"No port found matching filters\");\n }\n}\n\nexport const serial = new WebSerialAdapter();\n",
|
|
33
|
+
"import { FileVendor, type IFileBasicInfo } from \"@v5x/serial\";\n\nexport const VENDOR_PREFIXES: Record<FileVendor, string> = {\n [FileVendor.USER]: \"user/\",\n [FileVendor.SYS]: \"sys_/\",\n [FileVendor.DEV1]: \"rmsh/\",\n [FileVendor.DEV2]: \"pros/\",\n [FileVendor.DEV3]: \"mwrk/\",\n [FileVendor.DEV4]: \"deva/\",\n [FileVendor.DEV5]: \"devb/\",\n [FileVendor.DEV6]: \"devc/\",\n [FileVendor.VEXVM]: \"vxvm/\",\n [FileVendor.VEX]: \"vex_/\",\n [FileVendor.UNDEFINED]: \"test/\",\n};\n\nexport const VENDORS = [\n FileVendor.USER,\n FileVendor.SYS,\n FileVendor.DEV1,\n FileVendor.DEV2,\n FileVendor.DEV3,\n FileVendor.DEV4,\n FileVendor.DEV5,\n FileVendor.DEV6,\n FileVendor.VEXVM,\n FileVendor.VEX,\n FileVendor.UNDEFINED,\n] as const;\n\nconst PREFIX_VENDORS = new Map<string, FileVendor>(\n VENDORS.map((vendor) => [VENDOR_PREFIXES[vendor], vendor]),\n);\n\n/**\n * Parse a file path as displayed by `v5x dir`. A `user/`-style vendor\n * prefix selects the vendor; a bare filename keeps the default vendor\n * (USER) for compatibility.\n */\nexport function parseBrainFilePath(path: string): IFileBasicInfo {\n const separator = path.indexOf(\"/\");\n if (separator === -1) return { filename: path, vendor: FileVendor.USER };\n\n const prefix = path.slice(0, separator + 1);\n const filename = path.slice(separator + 1);\n const vendor = PREFIX_VENDORS.get(prefix);\n if (vendor === undefined)\n throw new Error(\n `unknown vendor prefix \"${prefix}\" in \"${path}\"; expected one of ${[\n ...PREFIX_VENDORS.keys(),\n ].join(\", \")}`,\n );\n if (filename === \"\")\n throw new Error(`missing filename after vendor prefix in \"${path}\"`);\n return { filename, vendor };\n}\n",
|
|
34
|
+
"import type { Sade } from \"sade\";\nimport { type PortSelectionOptions, withSelectedV5Device } from \"../device\";\nimport { parseBrainFilePath } from \"../utils/brainPath\";\nimport { unwrapSerial } from \"../utils/output\";\n\nexport function decodeCatText(bytes: Uint8Array): string {\n return new TextDecoder().decode(bytes);\n}\n\nexport function formatCatText(bytes: Uint8Array): string {\n const text = decodeCatText(bytes);\n return text.endsWith(\"\\n\") ? text : `${text}\\n`;\n}\n\nexport default function registerCatCommand(program: Sade) {\n program\n .command(\"cat <file>\", \"read a file from flash\")\n .option(\"-o, --output\", \"write the file bytes to a local path\")\n .option(\"--port\", \"serial port path or id, defaults to V5X_PORT\")\n .action(\n async (file, options: { output?: string } & PortSelectionOptions) => {\n const handle = parseBrainFilePath(file);\n await withSelectedV5Device(options, async (device) => {\n const bytes = unwrapSerial(\n await device.brain.readFile(handle),\n `failed to read ${file}`,\n );\n if (options.output !== undefined) {\n await Bun.write(options.output, bytes);\n return;\n }\n\n if (process.stdout.isTTY === true)\n process.stdout.write(formatCatText(bytes));\n else process.stdout.write(bytes);\n });\n },\n );\n}\n",
|
|
35
|
+
"import type { Sade } from \"sade\";\nimport chalk from \"chalk\";\nimport { cleanProject, inspectProject } from \"../utils/project\";\nimport { printJson } from \"../utils/output\";\nimport {\n projectOutputFiles,\n toWorkflowProjectJson,\n} from \"../utils/workflow-json\";\n\nexport default function registerCleanCommand(program: Sade) {\n program\n .command(\"clean [path]\", \"clean build outputs\", { alias: \"cl\" })\n .option(\"--json\", \"print machine-readable JSON\")\n .action(\n async (path: string = process.cwd(), options: { json?: boolean }) => {\n const project = await inspectProject(path);\n if (options.json !== true)\n console.log(chalk.yellow(`cleaning ${project.type} program...`));\n await cleanProject(project, {\n stdout: options.json === true ? \"ignore\" : \"inherit\",\n });\n if (options.json === true) {\n printJson({\n command: \"clean\",\n project: toWorkflowProjectJson(project),\n outputFiles: projectOutputFiles(project),\n });\n }\n },\n );\n}\n",
|
|
36
|
+
"import type { Sade } from \"sade\";\nimport { SmartDeviceType, VexFirmwareVersion } from \"@v5x/serial\";\nimport { type PortSelectionOptions, withSelectedV5Device } from \"../device\";\nimport { printJson, renderTable } from \"../utils/output\";\n\ntype SmartDevice = { port: number; type: number; version: number };\n\nexport const SMART_DEVICE_LABELS: Record<number, string> = {\n [SmartDeviceType.EMPTY]: \"empty\",\n [SmartDeviceType.V5_POWER]: \"v5 power\",\n [SmartDeviceType.MOTOR]: \"motor\",\n [SmartDeviceType.LED]: \"led\",\n [SmartDeviceType.ABS_ENCODER_SENSOR]: \"abs encoder sensor\",\n [SmartDeviceType.CR_MOTOR]: \"cr motor\",\n [SmartDeviceType.IMU_SENSOR]: \"imu sensor\",\n [SmartDeviceType.DISTANCE_SENSOR]: \"distance sensor\",\n [SmartDeviceType.RADIO_SENSOR]: \"radio sensor\",\n [SmartDeviceType.CONTROLLER]: \"controller\",\n [SmartDeviceType.BRAIN]: \"brain\",\n [SmartDeviceType.VISION_SENSOR]: \"vision sensor\",\n [SmartDeviceType.ADI]: \"adi\",\n [SmartDeviceType.PARTNER_CONTROLLER]: \"partner controller\",\n [SmartDeviceType.BATTERY]: \"battery\",\n [SmartDeviceType.SOL]: \"solenoid\",\n [SmartDeviceType.OPTICAL_SENSOR]: \"optical sensor\",\n [SmartDeviceType.MAGNET]: \"magnet\",\n [SmartDeviceType.GPS_SENSOR]: \"gps sensor\",\n [SmartDeviceType.UNDEFINED_SENSOR]: \"undefined sensor\",\n};\n\nexport function formatSmartDeviceType(type: number): string {\n return SMART_DEVICE_LABELS[type] ?? `unknown (${type})`;\n}\n\nexport function formatSmartDeviceVersion(version: number): string {\n return new VexFirmwareVersion(\n (version >>> 14) & 0xff,\n (version >>> 8) & 0x3f,\n version & 0xff,\n 0,\n ).toUserString();\n}\n\nexport function formatDeviceRows(devices: SmartDevice[]): string[][] {\n return devices.map(({ port, type, version }) => [\n port.toString(),\n formatSmartDeviceType(type),\n formatSmartDeviceVersion(version),\n ]);\n}\n\nexport function toDeviceJson(devices: SmartDevice[]) {\n return devices.map(({ port, type, version }) => ({\n port,\n type,\n typeLabel: formatSmartDeviceType(type),\n version,\n versionString: formatSmartDeviceVersion(version),\n }));\n}\n\nexport default function registerDevicesCommand(program: Sade) {\n program\n .command(\"devices\", \"list devices connected to brain\", { alias: \"lsdev\" })\n .option(\"--json\", \"print machine-readable JSON\")\n .option(\"--port\", \"serial port path or id, defaults to V5X_PORT\")\n .action(async (options: { json?: boolean } & PortSelectionOptions) => {\n await withSelectedV5Device(options, async (device) => {\n const devices = device.devices;\n if (options.json === true) printJson(toDeviceJson(devices));\n else\n console.log(\n renderTable([\"port\", \"type\", \"version\"], formatDeviceRows(devices)),\n );\n });\n });\n}\n",
|
|
37
|
+
"import type { Sade } from \"sade\";\nimport type { FileVendor, IFileHandle, VexSerialError } from \"@v5x/serial\";\nimport { type PortSelectionOptions, withSelectedV5Device } from \"../device\";\nimport { VENDOR_PREFIXES, VENDORS } from \"../utils/brainPath\";\nimport {\n formatSerialFailure,\n printJson,\n renderTable,\n utcTimestamp,\n} from \"../utils/output\";\n\ntype FileRow = {\n vendor: FileVendor;\n filename: string;\n size: number;\n loadAddress: number;\n timestamp: number;\n crc32: number;\n};\n\ntype VendorListFailure = {\n vendor: FileVendor;\n vendorPrefix: string;\n message: string;\n};\n\nfunction vendorPrefix(vendor: FileVendor): string {\n return VENDOR_PREFIXES[vendor] ?? \"\";\n}\n\nexport function formatFileTimestamp(timestamp: number): string {\n return utcTimestamp.format(new Date(timestamp * 1000));\n}\n\nexport function formatFileSize(bytes: number): string {\n const units = [\"B\", \"KB\", \"MB\", \"GB\"];\n let size = bytes;\n let unit = 0;\n while (size >= 1024 && unit < units.length - 1) {\n size /= 1024;\n unit++;\n }\n return `${size.toFixed(size < 10 && unit > 0 ? 1 : 0)} ${units[unit]}`;\n}\n\nexport function formatFileRows(files: FileRow[]): string[][] {\n return files.map(\n ({ vendor, filename, size, loadAddress, timestamp, crc32 }) => [\n vendorPrefix(vendor) + filename,\n formatFileSize(size),\n `0x${loadAddress.toString(16)}`,\n formatFileTimestamp(timestamp),\n `0x${crc32.toString(16)}`,\n ],\n );\n}\n\nexport function toFileJson(files: FileRow[]) {\n return files.map(\n ({ vendor, filename, size, loadAddress, timestamp, crc32 }) => ({\n vendor,\n vendorPrefix: vendorPrefix(vendor).replace(\"/\", \"\"),\n filename,\n path: vendorPrefix(vendor) + filename,\n size,\n loadAddress,\n timestamp,\n timestampIso: new Date(timestamp * 1000).toISOString(),\n crc32,\n }),\n );\n}\n\nexport function formatVendorListFailure(\n vendor: FileVendor,\n error: VexSerialError,\n): VendorListFailure {\n return {\n vendor,\n vendorPrefix: vendorPrefix(vendor).replace(\"/\", \"\"),\n message: formatSerialFailure(\n `failed to list ${vendorPrefix(vendor)} files`,\n error,\n ),\n };\n}\n\nexport function toDirectoryJson(files: FileRow[], errors: VendorListFailure[]) {\n return {\n files: toFileJson(files),\n errors,\n };\n}\n\nexport default function registerDirCommand(program: Sade) {\n program\n .command(\"dir\", \"list files on flash\", { alias: \"ls\" })\n .option(\"--json\", \"print machine-readable JSON\")\n .option(\"--port\", \"serial port path or id, defaults to V5X_PORT\")\n .action(async (options: { json?: boolean } & PortSelectionOptions) => {\n await withSelectedV5Device(options, async (device) => {\n const files: (FileRow & IFileHandle)[] = [];\n const errors: VendorListFailure[] = [];\n for (const vendor of VENDORS) {\n const result = await device.brain.listFiles(vendor);\n if (result.isOk())\n files.push(...result.value.map((file) => ({ ...file, vendor })));\n else errors.push(formatVendorListFailure(vendor, result.error));\n }\n if (options.json === true) printJson(toDirectoryJson(files, errors));\n else {\n for (const error of errors)\n process.stderr.write(`warning: ${error.message}\\n`);\n console.log(\n renderTable(\n [\"name\", \"size\", \"load address\", \"timestamp\", \"crc32\"],\n formatFileRows(files),\n ),\n );\n }\n });\n });\n}\n",
|
|
38
|
+
"import type { Sade } from \"sade\";\nimport { platform } from \"node:os\";\nimport pkg from \"../../package.json\" with { type: \"json\" };\nimport { serial, type Serial } from \"../adapter\";\nimport { printJson, renderTable } from \"../utils/output\";\n\nexport type DoctorStatus = \"ok\" | \"warn\" | \"error\";\n\nexport interface DoctorCheck {\n name: string;\n status: DoctorStatus;\n value: string;\n action: string;\n}\n\nexport interface DoctorReport {\n status: DoctorStatus;\n checks: DoctorCheck[];\n}\n\nexport interface DoctorOptions {\n bunVersion?: string;\n os?: NodeJS.Platform;\n serial?: Serial;\n which?: (command: string) => string | null;\n}\n\ninterface ParsedVersion {\n parts: number[];\n prerelease: boolean;\n valid: boolean;\n}\n\nconst SUPPORTED_PLATFORMS = new Set<NodeJS.Platform>([\"darwin\", \"linux\"]);\nconst TOOLCHAINS = [\n {\n name: \"git\",\n commands: [\"git\"],\n action: \"Install Git and make sure it is on PATH.\",\n },\n {\n name: \"Cargo\",\n commands: [\"cargo\"],\n action: \"Install Rust and Cargo for vexide projects.\",\n },\n {\n name: \"Python\",\n commands: [\"python3\", \"python\"],\n action: \"Install Python 3 for PROS projects.\",\n },\n {\n name: \"PROS CLI\",\n commands: [\"pros\"],\n action: \"Run `v5x install pros` or install pros-cli with pipx.\",\n },\n {\n name: \"Make\",\n commands: [\"make\"],\n action: \"Install Make for VEXcode C++ projects.\",\n },\n] as const;\n\nfunction minimumBunVersion(): string {\n const engine = pkg.engines.bun;\n return engine.replace(/^[^\\d]*/, \"\");\n}\n\nexport function compareVersions(left: string, right: string): number {\n const leftVersion = parseVersion(left);\n const rightVersion = parseVersion(right);\n if (!leftVersion.valid && !rightVersion.valid) return 0;\n if (!leftVersion.valid) return -1;\n if (!rightVersion.valid) return 1;\n\n const leftParts = leftVersion.parts;\n const rightParts = rightVersion.parts;\n const length = Math.max(leftParts.length, rightParts.length);\n\n for (let index = 0; index < length; index++) {\n const leftValue = leftParts[index] ?? 0;\n const rightValue = rightParts[index] ?? 0;\n if (leftValue > rightValue) return 1;\n if (leftValue < rightValue) return -1;\n }\n\n if (leftVersion.prerelease !== rightVersion.prerelease) {\n return leftVersion.prerelease ? -1 : 1;\n }\n\n return 0;\n}\n\nfunction parseVersion(version: string): ParsedVersion {\n const match = /^(\\d+(?:\\.\\d+)*)(?:[-+].*)?$/.exec(version);\n if (match === null) return { parts: [], prerelease: false, valid: false };\n const numericVersion = match[1];\n if (numericVersion === undefined) {\n return { parts: [], prerelease: false, valid: false };\n }\n\n return {\n parts: numericVersion.split(\".\").map((part) => Number(part)),\n prerelease: version.includes(\"-\"),\n valid: true,\n };\n}\n\nfunction worstStatus(statuses: DoctorStatus[]): DoctorStatus {\n if (statuses.includes(\"error\")) return \"error\";\n if (statuses.includes(\"warn\")) return \"warn\";\n return \"ok\";\n}\n\nfunction formatSerialPortSummary(\n ports: Awaited<ReturnType<Serial[\"getPorts\"]>>,\n): string {\n if (ports.length === 0) return \"none visible\";\n\n const usbIds = ports\n .map((port) => {\n const info = port.getInfo();\n const vendor = info.usbVendorId?.toString(16).padStart(4, \"0\");\n const product = info.usbProductId?.toString(16).padStart(4, \"0\");\n return vendor && product ? `${vendor}:${product}` : null;\n })\n .filter((id) => id !== null);\n\n if (usbIds.length === 0) return `${ports.length} visible`;\n\n const shown = usbIds.slice(0, 5).join(\", \");\n const extra = usbIds.length > 5 ? `, +${usbIds.length - 5} more` : \"\";\n return `${ports.length} visible (${shown}${extra})`;\n}\n\nfunction formatFoundCommands(\n commands: readonly string[],\n which: (command: string) => string | null,\n): string {\n return commands.filter((command) => which(command) !== null).join(\", \");\n}\n\nasync function checkSerialPorts(serialAdapter: Serial): Promise<DoctorCheck> {\n try {\n const ports = await serialAdapter.getPorts();\n\n return {\n name: \"Serial ports\",\n status: \"ok\",\n value: formatSerialPortSummary(ports),\n action:\n ports.length === 0\n ? \"Connect a powered V5 brain only when running hardware commands.\"\n : \"Close competing serial applications before using hardware commands.\",\n };\n } catch (error) {\n return {\n name: \"Serial ports\",\n status: \"warn\",\n value: error instanceof Error ? error.message : String(error),\n action:\n \"Check serial permissions and close applications that may own the port.\",\n };\n }\n}\n\nexport async function createDoctorReport(\n options: DoctorOptions = {},\n): Promise<DoctorReport> {\n const bunVersion =\n options.bunVersion ??\n process.versions.bun ??\n globalThis.Bun?.version ??\n \"unknown\";\n const os = options.os ?? platform();\n const which = options.which ?? Bun.which;\n const minimumBun = minimumBunVersion();\n const checks: DoctorCheck[] = [];\n\n checks.push({\n name: \"Bun\",\n status:\n bunVersion !== \"unknown\" && compareVersions(bunVersion, minimumBun) >= 0\n ? \"ok\"\n : \"error\",\n value: bunVersion,\n action:\n bunVersion !== \"unknown\" && compareVersions(bunVersion, minimumBun) >= 0\n ? \"No action needed.\"\n : bunVersion === \"unknown\"\n ? `Run v5x with Bun ${minimumBun} or newer.`\n : `Install Bun ${minimumBun} or newer.`,\n });\n\n checks.push({\n name: \"Platform\",\n status: SUPPORTED_PLATFORMS.has(os) ? \"ok\" : \"error\",\n value: os,\n action: SUPPORTED_PLATFORMS.has(os)\n ? \"No action needed.\"\n : \"Use Linux or macOS for CLI serial access.\",\n });\n\n for (const toolchain of TOOLCHAINS) {\n const found = formatFoundCommands(toolchain.commands, which);\n checks.push({\n name: toolchain.name,\n status: found.length > 0 ? \"ok\" : \"warn\",\n value: found.length > 0 ? found : \"not found\",\n action: found.length > 0 ? \"No action needed.\" : toolchain.action,\n });\n }\n\n checks.push(await checkSerialPorts(options.serial ?? serial));\n\n return {\n status: worstStatus(checks.map((check) => check.status)),\n checks,\n };\n}\n\nexport function formatDoctorRows(report: DoctorReport): string[][] {\n return report.checks.map((check) => [\n check.status,\n check.name,\n check.value,\n check.action,\n ]);\n}\n\nexport function doctorExitCode(report: DoctorReport): 0 | 1 {\n return report.status === \"error\" ? 1 : 0;\n}\n\nexport default function registerDoctorCommand(program: Sade) {\n program\n .command(\"doctor\", \"check local v5x environment\")\n .option(\"--json\", \"print machine-readable JSON\")\n .action(async (options: { json?: boolean }) => {\n const report = await createDoctorReport();\n process.exitCode = doctorExitCode(report);\n if (options.json === true) printJson(report);\n else {\n console.log(\n renderTable(\n [\"status\", \"check\", \"value\", \"next action\"],\n formatDoctorRows(report),\n ),\n );\n }\n });\n}\n",
|
|
39
|
+
"import type { Sade } from \"sade\";\nimport { basename, resolve } from \"node:path\";\nimport { createProject, parseToolchain } from \"../utils/scaffold\";\nimport { printJson } from \"../utils/output\";\nimport { toWorkflowCreateJson } from \"../utils/workflow-json\";\n\nexport default function registerInitCommand(program: Sade) {\n program\n .command(\"init [path]\", \"create a new V5 program in an empty directory\")\n .option(\"-t, --type\", \"project toolchain (required: pros or vexide)\")\n .option(\"--json\", \"print machine-readable JSON\")\n .action(\n async (\n inputPath: string = process.cwd(),\n options: { type?: string; json?: boolean },\n ) => {\n const toolchain = parseToolchain(options.type);\n const path = resolve(inputPath);\n await createProject(path, toolchain, basename(path));\n if (options.json === true) {\n printJson(toWorkflowCreateJson(\"init\", path, toolchain));\n } else {\n console.log(`created ${toolchain} project at ${path}`);\n }\n },\n );\n}\n",
|
|
40
|
+
"import {\n mkdir,\n mkdtemp,\n readdir,\n rename,\n rm,\n rmdir,\n stat,\n} from \"node:fs/promises\";\nimport { basename, dirname, isAbsolute, join, resolve } from \"node:path\";\nimport { unzipSync } from \"fflate\";\nimport { hasErrorCode, isRecord } from \"./guards\";\n\nexport type ProjectToolchain = \"pros\" | \"vexide\";\n\nexport interface ProsTemplateSource {\n tag: string;\n archiveUrl: string;\n sha256: string;\n}\n\ninterface DestinationReservation {\n created: boolean;\n device: bigint;\n inode: bigint;\n}\n\ninterface ProjectNames {\n displayName: string;\n cargoPackageName: string;\n prosRemoteName: string;\n}\n\nexport interface CreateProjectOptions {\n displayName?: string;\n cargoPackageName?: string;\n prosRemoteName?: string;\n}\n\nconst FETCH_TIMEOUT_MS = 30_000;\nconst PROS_ARCHIVE_LIMIT = 64 * 1024 * 1024;\nconst PROS_EXTRACTED_LIMIT = 256 * 1024 * 1024;\nconst DEFAULT_PROS_TEMPLATE: ProsTemplateSource = {\n tag: \"4.2.2\",\n archiveUrl:\n \"https://github.com/purduesigbots/pros/releases/download/4.2.2/kernel%404.2.2.zip\",\n sha256: \"f019642af93dc3d164d1c3e67a2a7dc75c795ac6a4d550c9221c480e2e7f4899\",\n};\n\nexport function parseToolchain(type: unknown): ProjectToolchain {\n if (type === \"pros\" || type === \"vexide\") return type;\n if (type === undefined) {\n throw new Error(\n \"--type is required; use --type pros or --type vexide (for example: v5x new robot --type vexide)\",\n );\n }\n throw new Error(\n `unsupported --type ${String(type)}; expected pros or vexide`,\n );\n}\n\nfunction validateDisplayName(name: string): void {\n if (name.length === 0 || /[\\u0000-\\u001f]/.test(name)) {\n throw new Error(\n \"project name cannot be empty or contain control characters\",\n );\n }\n}\n\nfunction validateCargoPackageName(name: string): void {\n if (!/^[A-Za-z0-9][A-Za-z0-9_-]*$/.test(name)) {\n throw new Error(\n \"Cargo package name must start with a letter or number and contain only letters, numbers, hyphens, or underscores\",\n );\n }\n}\n\nfunction validateProsRemoteName(name: string): void {\n validateDisplayName(name);\n if (/[\\\\/]/.test(name)) {\n throw new Error(\"PROS remote name cannot contain path separators\");\n }\n}\n\nfunction createProjectNames(\n toolchain: ProjectToolchain,\n fallbackName: string,\n options: CreateProjectOptions = {},\n): ProjectNames {\n const displayName = options.displayName ?? fallbackName;\n const cargoPackageName = options.cargoPackageName ?? displayName;\n const prosRemoteName = options.prosRemoteName ?? displayName;\n\n validateDisplayName(displayName);\n if (toolchain === \"vexide\") validateCargoPackageName(cargoPackageName);\n else validateProsRemoteName(prosRemoteName);\n\n return { displayName, cargoPackageName, prosRemoteName };\n}\n\nasync function reserveDestination(\n path: string,\n): Promise<DestinationReservation> {\n let created = false;\n try {\n await mkdir(path);\n created = true;\n } catch (error) {\n if (!hasErrorCode(error, \"EEXIST\")) throw error;\n }\n\n const destination = await stat(path, { bigint: true }).catch(() => undefined);\n if (\n destination === undefined ||\n !destination.isDirectory() ||\n (await readdir(path)).length !== 0\n ) {\n throw new Error(`project directory is not empty: ${path}`);\n }\n return { created, device: destination.dev, inode: destination.ino };\n}\n\nasync function removeOwnedReservation(\n path: string,\n reservation: DestinationReservation,\n): Promise<void> {\n if (!reservation.created) return;\n const destination = await stat(path, { bigint: true }).catch(() => undefined);\n if (\n destination?.isDirectory() &&\n destination.dev === reservation.device &&\n destination.ino === reservation.inode\n ) {\n await rmdir(path).catch(() => undefined);\n }\n}\n\nasync function fetchBytes(\n url: string,\n description: string,\n limit: number,\n): Promise<Uint8Array> {\n const response = await fetch(url, {\n signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),\n });\n if (!response.ok) {\n throw new Error(`failed to ${description} (${response.status})`);\n }\n\n const declaredLength = Number(response.headers.get(\"content-length\"));\n if (Number.isFinite(declaredLength) && declaredLength > limit) {\n throw new Error(`${description} exceeds the ${limit}-byte size limit`);\n }\n\n if (response.body === null) return new Uint8Array();\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let length = 0;\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n length += value.byteLength;\n if (length > limit) {\n await reader.cancel();\n throw new Error(`${description} exceeds the ${limit}-byte size limit`);\n }\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n return Buffer.concat(chunks, length);\n}\n\nasync function writeFiles(\n root: string,\n files: Record<string, string | Uint8Array>,\n): Promise<void> {\n for (const [relativePath, content] of Object.entries(files)) {\n if (\n isAbsolute(relativePath) ||\n relativePath.split(/[\\\\/]/).includes(\"..\")\n ) {\n throw new Error(`template contains an unsafe path: ${relativePath}`);\n }\n const path = join(root, relativePath);\n await mkdir(dirname(path), { recursive: true });\n await Bun.write(path, content);\n }\n}\n\nasync function createProsProject(\n path: string,\n names: ProjectNames,\n source: ProsTemplateSource,\n): Promise<void> {\n const bytes = await fetchBytes(\n source.archiveUrl,\n `download PROS kernel ${source.tag}`,\n PROS_ARCHIVE_LIMIT,\n );\n const digest = new Bun.CryptoHasher(\"sha256\").update(bytes).digest(\"hex\");\n if (digest !== source.sha256) {\n throw new Error(`PROS kernel ${source.tag} failed SHA-256 verification`);\n }\n\n let extractedLength = 0;\n const archive = unzipSync(bytes, {\n filter(file) {\n extractedLength += file.originalSize;\n if (extractedLength > PROS_EXTRACTED_LIMIT) {\n throw new Error(\n `PROS kernel archive exceeds the ${PROS_EXTRACTED_LIMIT}-byte extracted size limit`,\n );\n }\n return true;\n },\n });\n const templateBytes = archive[\"template.pros\"];\n if (templateBytes === undefined) {\n throw new Error(\"the PROS kernel archive does not contain template.pros\");\n }\n const template: unknown = JSON.parse(new TextDecoder().decode(templateBytes));\n if (!isRecord(template)) throw new Error(\"invalid PROS project template\");\n\n const files: Record<string, string | Uint8Array> = {};\n for (const [relativePath, content] of Object.entries(archive)) {\n if (relativePath !== \"template.pros\" && !relativePath.endsWith(\"/\")) {\n files[relativePath] = content;\n }\n }\n files[\"project.pros\"] = `${JSON.stringify(\n {\n \"py/object\": \"pros.conductor.project.Project\",\n \"py/state\": {\n project_name: names.displayName,\n target: \"v5\",\n templates: { kernel: template },\n upload_options: {\n compress_bin: true,\n description: \"\",\n remote_name: names.prosRemoteName,\n slot: 1,\n },\n use_early_access: false,\n },\n },\n null,\n 2,\n )}\\n`;\n await writeFiles(path, files);\n}\n\nasync function createVexideProject(\n path: string,\n names: ProjectNames,\n): Promise<void> {\n const cargoName = JSON.stringify(names.cargoPackageName);\n await writeFiles(path, {\n \".gitignore\": \"/target\\n\",\n \".cargo/config.toml\": `[target.'cfg(target_os = \"vexos\")']\nrustflags = [\"-Clink-arg=-Tvexide.ld\"]\n\n[unstable]\nbuild-std = [\"std\", \"panic_abort\"]\nbuild-std-features = [\"compiler-builtins-mem\"]\n`,\n \"rust-toolchain.toml\": `[toolchain]\nchannel = \"nightly-2025-11-26\"\ncomponents = [\"rust-src\"]\n`,\n \"Cargo.toml\": `[package]\nname = ${cargoName}\nversion = \"0.1.0\"\nedition = \"2024\"\n\n[profile.release]\nopt-level = \"z\"\nlto = \"fat\"\n\n[package.metadata.v5]\nupload-strategy = \"differential\"\nslot = 1\nicon = \"cool-x\"\ncompress = true\n\n[dependencies]\nvexide = { version = \"0.8.0\", features = [\"full\", \"default-sdk\"] }\n`,\n \"src/main.rs\": `use vexide::prelude::*;\n\nstruct Robot {}\n\nimpl Compete for Robot {\n async fn autonomous(&mut self) {\n println!(\"Autonomous!\");\n }\n\n async fn driver(&mut self) {\n println!(\"Driver!\");\n }\n}\n\n#[vexide::main]\nasync fn main(_peripherals: Peripherals) {\n Robot {}.compete().await;\n}\n`,\n \"README.md\": `# ${names.displayName}\\n\\nA vexide project created with @v5x/cli.\\n`,\n });\n}\n\nexport async function createProject(\n inputPath: string,\n toolchain: ProjectToolchain,\n nameOrOptions: string | CreateProjectOptions = basename(resolve(inputPath)),\n prosTemplate = DEFAULT_PROS_TEMPLATE,\n): Promise<string> {\n const path = resolve(inputPath);\n const nameOptions =\n typeof nameOrOptions === \"string\"\n ? { displayName: nameOrOptions }\n : nameOrOptions;\n const names = createProjectNames(toolchain, basename(path), nameOptions);\n const parent = dirname(path);\n await mkdir(parent, { recursive: true });\n const stagingPath = await mkdtemp(join(parent, `.${basename(path)}.v5x-`));\n let reservation: DestinationReservation | undefined;\n\n try {\n reservation = await reserveDestination(path);\n if (toolchain === \"pros\")\n await createProsProject(stagingPath, names, prosTemplate);\n else await createVexideProject(stagingPath, names);\n\n try {\n await rename(stagingPath, path);\n } catch (error) {\n const destination = await stat(path).catch(() => undefined);\n if (destination?.isDirectory() && (await readdir(path)).length === 0) {\n // Windows cannot replace an existing empty directory with rename().\n // rmdir() is atomic and fails if another process populated the directory.\n await rmdir(path);\n try {\n await rename(stagingPath, path);\n } catch (publishError) {\n await mkdir(path).catch(() => undefined);\n throw publishError;\n }\n } else if (destination !== undefined) {\n throw new Error(`project directory is not empty: ${path}`, {\n cause: error,\n });\n } else {\n throw error;\n }\n }\n } catch (error) {\n await rm(stagingPath, { recursive: true, force: true });\n if (reservation !== undefined) {\n await removeOwnedReservation(path, reservation);\n }\n throw error;\n }\n\n return path;\n}\n",
|
|
41
|
+
"import { createRequire } from 'module';\nvar require = createRequire('/');\n// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar _a;\n// Mediocre shim\nvar Worker;\nvar isMarkedAsUntransferable;\nvar workerAdd = \";var __w=require('worker_threads');__w.parentPort.on('message',function(m){onmessage({data:m})}),postMessage=function(m,t){__w.parentPort.postMessage(m,t)},close=process.exit;self=global\";\ntry {\n (_a = require('worker_threads'), Worker = _a.Worker, isMarkedAsUntransferable = _a.isMarkedAsUntransferable);\n}\ncatch (e) {\n}\nvar wk = Worker ? function (c, _, msg, transfer, cb) {\n var done = false;\n var w = new Worker(c + workerAdd, { eval: true })\n .on('error', function (e) { return cb(e, null); })\n .on('message', function (m) { return cb(null, m); })\n .on('exit', function (c) {\n if (c && !done)\n cb(new Error('exited with code ' + c), null);\n });\n if (isMarkedAsUntransferable)\n transfer = transfer.filter(function (t) { return !isMarkedAsUntransferable(t); });\n w.postMessage(msg, transfer);\n w.terminate = function () {\n done = true;\n return Worker.prototype.terminate.call(w);\n };\n return w;\n} : function (_, __, ___, ____, cb) {\n setImmediate(function () { return cb(new Error('async operations unsupported - update to Node 12+ (or Node 10-11 with the --experimental-worker CLI flag)'), null); });\n var NOP = function () { };\n return {\n terminate: NOP,\n postMessage: NOP\n };\n};\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array;\n// fixed length extra bits\nvar fleb = new u8([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, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\nvar fdeb = new u8([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, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n var b = new u16(31);\n for (var i = 0; i < 31; ++i) {\n b[i] = start += 1 << eb[i - 1];\n }\n // numbers here are at max 18 bits\n var r = new i32(b[30]);\n for (var i = 1; i < 30; ++i) {\n for (var j = b[i]; j < b[i + 1]; ++j) {\n r[j] = ((j - b[i]) << 5) | i;\n }\n }\n return { b: b, r: r };\n};\nvar _a = freb(fleb, 2), fl = _a.b, revfl = _a.r;\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b.b, revfd = _b.r;\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n // reverse table algorithm from SO\n var x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1);\n x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2);\n x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4);\n rev[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n var s = cd.length;\n // index\n var i = 0;\n // u16 \"map\": index -> # of codes with bit length = index\n var l = new u16(mb);\n // length of cd must be 288 (total # of codes)\n for (; i < s; ++i) {\n if (cd[i])\n ++l[cd[i] - 1];\n }\n // u16 \"map\": index -> minimum code for bit length = index\n var le = new u16(mb);\n for (i = 1; i < mb; ++i) {\n le[i] = (le[i - 1] + l[i - 1]) << 1;\n }\n var co;\n if (r) {\n // u16 \"map\": index -> number of actual bits, symbol for code\n co = new u16(1 << mb);\n // bits to remove for reverser\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n // ignore 0 lengths\n if (cd[i]) {\n // num encoding both symbol and bits read\n var sv = (i << 4) | cd[i];\n // free bits\n var r_1 = mb - cd[i];\n // start value\n var v = le[cd[i] - 1]++ << r_1;\n // m is end value\n for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n // every 16 bit value starting with the code yields the same result\n co[rev[v] >> rvb] = sv;\n }\n }\n }\n }\n else {\n co = new u16(s);\n for (i = 0; i < s; ++i) {\n if (cd[i]) {\n co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]);\n }\n }\n }\n return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n var m = a[0];\n for (var i = 1; i < a.length; ++i) {\n if (a[i] > m)\n m = a[i];\n }\n return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p + 7) / 8) | 0; };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n // can't use .constructor in case user-supplied\n return new u8(v.subarray(s, e));\n};\n/**\n * Codes for errors generated within this library\n */\nexport var FlateErrorCode = {\n UnexpectedEOF: 0,\n InvalidBlockType: 1,\n InvalidLengthLiteral: 2,\n InvalidDistance: 3,\n StreamFinished: 4,\n NoStreamHandler: 5,\n InvalidHeader: 6,\n NoCallback: 7,\n InvalidUTF8: 8,\n ExtraFieldTooLong: 9,\n InvalidDate: 10,\n FilenameTooLong: 11,\n StreamFinishing: 12,\n InvalidZipData: 13,\n UnknownCompressionMethod: 14\n};\n// error codes\nvar ec = [\n 'unexpected EOF',\n 'invalid block type',\n 'invalid length/literal',\n 'invalid distance',\n 'stream finished',\n 'no stream handler',\n , // determined by compression function\n 'no callback',\n 'invalid UTF-8 data',\n 'extra field too long',\n 'date not in range 1980-2099',\n 'filename too long',\n 'stream finishing',\n 'invalid zip data'\n // determined by unknown compression method\n];\n;\nvar err = function (ind, msg, nt) {\n var e = new Error(msg || ec[ind]);\n e.code = ind;\n if (Error.captureStackTrace)\n Error.captureStackTrace(e, err);\n if (!nt)\n throw e;\n return e;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, st, buf, dict) {\n // source length dict length\n var sl = dat.length, dl = dict ? dict.length : 0;\n if (!sl || st.f && !st.l)\n return buf || new u8(0);\n var noBuf = !buf;\n // have to estimate size\n var resize = noBuf || st.i != 2;\n // no state\n var noSt = st.i;\n // Assumes roughly 33% compression ratio average\n if (noBuf)\n buf = new u8(sl * 3);\n // ensure buffer can fit at least l elements\n var cbuf = function (l) {\n var bl = buf.length;\n // need to increase size to fit\n if (l > bl) {\n // Double or set to necessary, whichever is greater\n var nbuf = new u8(Math.max(bl * 2, l));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n // last chunk bitpos bytes\n var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n // total bits\n var tbts = sl * 8;\n do {\n if (!lm) {\n // BFINAL - this is only 1 when last chunk is next\n final = bits(dat, pos, 1);\n // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n // go to end of byte boundary\n var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n if (t > sl) {\n if (noSt)\n err(0);\n break;\n }\n // ensure size\n if (resize)\n cbuf(bt + l);\n // Copy over uncompressed data\n buf.set(dat.subarray(s, t), bt);\n // Get new bitpos, update byte count\n st.b = bt += l, st.p = pos = t * 8, st.f = final;\n continue;\n }\n else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n // literal lengths\n var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n var tl = hLit + bits(dat, pos + 5, 31) + 1;\n pos += 14;\n // length+distance tree\n var ldt = new u8(tl);\n // code length tree\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n // use index map to get real code\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n // code lengths bits\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n // code lengths map\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl;) {\n var r = clm[bits(dat, pos, clbmsk)];\n // bits read\n pos += r & 15;\n // symbol\n var s = r >> 4;\n // code length to copy\n if (s < 16) {\n ldt[i++] = s;\n }\n else {\n // copy count\n var c = 0, n = 0;\n if (s == 16)\n n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n else if (s == 17)\n n = 3 + bits(dat, pos, 7), pos += 3;\n else if (s == 18)\n n = 11 + bits(dat, pos, 127), pos += 7;\n while (n--)\n ldt[i++] = c;\n }\n }\n // length tree distance tree\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n // max length bits\n lbt = max(lt);\n // max dist bits\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n }\n else\n err(1);\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n }\n // Make sure the buffer can hold this + the largest possible addition\n // Maximum chunk size (practically, theoretically infinite) is 2^17\n if (resize)\n cbuf(bt + 131072);\n var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n var lpos = pos;\n for (;; lpos = pos) {\n // bits read, code\n var c = lm[bits16(dat, pos) & lms], sym = c >> 4;\n pos += c & 15;\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (!c)\n err(2);\n if (sym < 256)\n buf[bt++] = sym;\n else if (sym == 256) {\n lpos = pos, lm = null;\n break;\n }\n else {\n var add = sym - 254;\n // no extra bits needed if less\n if (sym > 264) {\n // index\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n // dist\n var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;\n if (!d)\n err(3);\n pos += d & 15;\n var dt = fd[dsym];\n if (dsym > 3) {\n var b = fdeb[dsym];\n dt += bits16(dat, pos) & (1 << b) - 1, pos += b;\n }\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (resize)\n cbuf(bt + 131072);\n var end = bt + add;\n if (bt < dt) {\n var shift = dl - dt, dend = Math.min(dt, end);\n if (shift + bt < 0)\n err(3);\n for (; bt < dend; ++bt)\n buf[bt] = dict[shift + bt];\n }\n for (; bt < end; ++bt)\n buf[bt] = buf[bt - dt];\n }\n }\n st.l = lm, st.p = lpos, st.b = bt, st.f = final;\n if (lm)\n final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n } while (!final);\n // don't reallocate for streams or user buffers\n return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n d[o + 2] |= v >> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n // Need extra info to make a tree\n var t = [];\n for (var i = 0; i < d.length; ++i) {\n if (d[i])\n t.push({ s: i, f: d[i] });\n }\n var s = t.length;\n var t2 = t.slice();\n if (!s)\n return { t: et, l: 0 };\n if (s == 1) {\n var v = new u8(t[0].s + 1);\n v[t[0].s] = 1;\n return { t: v, l: 1 };\n }\n t.sort(function (a, b) { return a.f - b.f; });\n // after i2 reaches last ind, will be stopped\n // freq must be greater than largest possible number of symbols\n t.push({ s: -1, f: 25001 });\n var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n // efficient algorithm from UZIP.js\n // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n // symbols that combined have high freq, will start processing i2 (high-freq,\n // non-composite) symbols instead\n // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n while (i1 != s - 1) {\n l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n }\n var maxSym = t2[0].s;\n for (var i = 1; i < s; ++i) {\n if (t2[i].s > maxSym)\n maxSym = t2[i].s;\n }\n // code lengths\n var tr = new u16(maxSym + 1);\n // max bits in tree\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n // more algorithms from UZIP.js\n // TODO: find out how this code works (debt)\n // ind debt\n var i = 0, dt = 0;\n // left cost\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n for (; i < s; ++i) {\n var i2_1 = t2[i].s;\n if (tr[i2_1] > mb) {\n dt += cst - (1 << (mbt - tr[i2_1]));\n tr[i2_1] = mb;\n }\n else\n break;\n }\n dt >>= lft;\n while (dt > 0) {\n var i2_2 = t2[i].s;\n if (tr[i2_2] < mb)\n dt -= 1 << (mb - tr[i2_2]++ - 1);\n else\n ++i;\n }\n for (; i >= 0 && dt; --i) {\n var i2_3 = t2[i].s;\n if (tr[i2_3] == mb) {\n --tr[i2_3];\n ++dt;\n }\n }\n mbt = mb;\n }\n return { t: new u8(tr), l: mbt };\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n return n.s == -1\n ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n var s = c.length;\n // Note that the semicolon was intentional\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n // ind num streak\n var cli = 0, cln = c[0], cls = 1;\n var w = function (v) { cl[cli++] = v; };\n for (var i = 1; i <= s; ++i) {\n if (c[i] == cln && i != s)\n ++cls;\n else {\n if (!cln && cls > 2) {\n for (; cls > 138; cls -= 138)\n w(32754);\n if (cls > 2) {\n w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n cls = 0;\n }\n }\n else if (cls > 3) {\n w(cln), --cls;\n for (; cls > 6; cls -= 6)\n w(8304);\n if (cls > 2)\n w(((cls - 3) << 5) | 8208), cls = 0;\n }\n while (cls--)\n w(cln);\n cls = 1;\n cln = c[i];\n }\n }\n return { c: cl.subarray(0, cli), n: s };\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n var l = 0;\n for (var i = 0; i < cl.length; ++i)\n l += cf[i] * cl[i];\n return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n // no need to write 00 as type: TypedArray defaults to 0\n var s = dat.length;\n var o = shft(pos + 2);\n out[o] = s & 255;\n out[o + 1] = s >> 8;\n out[o + 2] = out[o] ^ 255;\n out[o + 3] = out[o + 1] ^ 255;\n for (var i = 0; i < s; ++i)\n out[o + i + 4] = dat[i];\n return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a = hTree(lf, 15), dlt = _a.t, mlb = _a.l;\n var _b = hTree(df, 15), ddt = _b.t, mdb = _b.l;\n var _c = lc(dlt), lclt = _c.c, nlc = _c.n;\n var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;\n var lcfreq = new u16(19);\n for (var i = 0; i < lclt.length; ++i)\n ++lcfreq[lclt[i] & 31];\n for (var i = 0; i < lcdt.length; ++i)\n ++lcfreq[lcdt[i] & 31];\n var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;\n var nlcc = 19;\n for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n ;\n var flen = (bl + 5) << 3;\n var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];\n if (bs >= 0 && flen <= ftlen && flen <= dtlen)\n return wfblk(out, p, dat.subarray(bs, bs + bl));\n var lm, ll, dm, dl;\n wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n if (dtlen < ftlen) {\n lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n var llm = hMap(lct, mlcb, 0);\n wbits(out, p, nlc - 257);\n wbits(out, p + 5, ndc - 1);\n wbits(out, p + 10, nlcc - 4);\n p += 14;\n for (var i = 0; i < nlcc; ++i)\n wbits(out, p + 3 * i, lct[clim[i]]);\n p += 3 * nlcc;\n var lcts = [lclt, lcdt];\n for (var it = 0; it < 2; ++it) {\n var clct = lcts[it];\n for (var i = 0; i < clct.length; ++i) {\n var len = clct[i] & 31;\n wbits(out, p, llm[len]), p += lct[len];\n if (len > 15)\n wbits(out, p, (clct[i] >> 5) & 127), p += clct[i] >> 12;\n }\n }\n }\n else {\n lm = flm, ll = flt, dm = fdm, dl = fdt;\n }\n for (var i = 0; i < li; ++i) {\n var sym = syms[i];\n if (sym > 255) {\n var len = (sym >> 18) & 31;\n wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n if (len > 7)\n wbits(out, p, (sym >> 23) & 31), p += fleb[len];\n var dst = sym & 31;\n wbits16(out, p, dm[dst]), p += dl[dst];\n if (dst > 3)\n wbits16(out, p, (sym >> 5) & 8191), p += fdeb[dst];\n }\n else {\n wbits16(out, p, lm[sym]), p += ll[sym];\n }\n }\n wbits16(out, p, lm[256]);\n return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, st) {\n var s = st.z || dat.length;\n var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n // writing to this writes to the output buffer\n var w = o.subarray(pre, o.length - post);\n var lst = st.l;\n var pos = (st.r || 0) & 7;\n if (lvl) {\n if (pos)\n w[0] = st.r >> 3;\n var opt = deo[lvl - 1];\n var n = opt >> 13, c = opt & 8191;\n var msk_1 = (1 << plvl) - 1;\n // prev 2-byte val map curr 2-byte val map\n var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);\n var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n // 24576 is an arbitrary number of maximum symbols per block\n // 424 buffer for last block\n var syms = new i32(25000);\n // length/literal freq distance freq\n var lf = new u16(288), df = new u16(32);\n // l/lcnt exbits index l/lind waitdx blkpos\n var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;\n for (; i + 2 < s; ++i) {\n // hash value\n var hv = hsh(i);\n // index mod 32768 previous index mod\n var imod = i & 32767, pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n // We always should modify head and prev, but only add symbols if\n // this data is not yet processed (\"wait\" for wait index)\n if (wi <= i) {\n // bytes remaining\n var rem = s - i;\n if ((lc_1 > 7000 || li > 24576) && (rem > 423 || !lst)) {\n pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n li = lc_1 = eb = 0, bs = i;\n for (var j = 0; j < 286; ++j)\n lf[j] = 0;\n for (var j = 0; j < 30; ++j)\n df[j] = 0;\n }\n // len dist chain\n var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;\n if (rem > 2 && hv == hsh(i - dif)) {\n var maxn = Math.min(n, rem) - 1;\n var maxd = Math.min(32767, i);\n // max possible length\n // not capped at dif because decompressors implement \"rolling\" index population\n var ml = Math.min(258, rem);\n while (dif <= maxd && --ch_1 && imod != pimod) {\n if (dat[i + l] == dat[i + l - dif]) {\n var nl = 0;\n for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n ;\n if (nl > l) {\n l = nl, d = dif;\n // break out early when we reach \"nice\" (we are satisfied enough)\n if (nl > maxn)\n break;\n // now, find the rarest 2-byte sequence within this\n // length of literals and search for that instead.\n // Much faster than just using the start\n var mmd = Math.min(dif, nl - 2);\n var md = 0;\n for (var j = 0; j < mmd; ++j) {\n var ti = i - dif + j & 32767;\n var pti = prev[ti];\n var cd = ti - pti & 32767;\n if (cd > md)\n md = cd, pimod = ti;\n }\n }\n }\n // check the previous match\n imod = pimod, pimod = prev[imod];\n dif += imod - pimod & 32767;\n }\n }\n // d will be nonzero only when a match was found\n if (d) {\n // store both dist and len data in one int32\n // Make sure this is recognized as a len/dist with 28th bit (2^28)\n syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n var lin = revfl[l] & 31, din = revfd[d] & 31;\n eb += fleb[lin] + fdeb[din];\n ++lf[257 + lin];\n ++df[din];\n wi = i + l;\n ++lc_1;\n }\n else {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n }\n }\n for (i = Math.max(i, wi); i < s; ++i) {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n if (!lst) {\n st.r = (pos & 7) | w[(pos / 8) | 0] << 3;\n // shft(pos) now 1 less if pos & 7 != 0\n pos -= 7;\n st.h = head, st.p = prev, st.i = i, st.w = wi;\n }\n }\n else {\n for (var i = st.w || 0; i < s + lst; i += 65535) {\n // end\n var e = i + 65535;\n if (e >= s) {\n // write final block\n w[(pos / 8) | 0] = lst;\n e = s;\n }\n pos = wfblk(w, pos + 1, dat.subarray(i, e));\n }\n st.i = s;\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n var t = new Int32Array(256);\n for (var i = 0; i < 256; ++i) {\n var c = i, k = 9;\n while (--k)\n c = ((c & 1) && -306674912) ^ (c >>> 1);\n t[i] = c;\n }\n return t;\n})();\n// CRC32\nvar crc = function () {\n var c = -1;\n return {\n p: function (d) {\n // closures have awful performance\n var cr = c;\n for (var i = 0; i < d.length; ++i)\n cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n c = cr;\n },\n d: function () { return ~c; }\n };\n};\n// Adler32\nvar adler = function () {\n var a = 1, b = 0;\n return {\n p: function (d) {\n // closures have awful performance\n var n = a, m = b;\n var l = d.length | 0;\n for (var i = 0; i != l;) {\n var e = Math.min(i + 2655, l);\n for (; i < e; ++i)\n m += n += d[i];\n n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n }\n a = n, b = m;\n },\n d: function () {\n a %= 65521, b %= 65521;\n return (a & 255) << 24 | (a & 0xFF00) << 8 | (b & 255) << 8 | (b >> 8);\n }\n };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n if (!st) {\n st = { l: 1 };\n if (opt.dictionary) {\n var dict = opt.dictionary.subarray(-32768);\n var newDat = new u8(dict.length + dat.length);\n newDat.set(dict);\n newDat.set(dat, dict.length);\n dat = newDat;\n st.w = dict.length;\n }\n }\n return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? (st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20) : (12 + opt.mem), pre, post, st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n var o = {};\n for (var k in a)\n o[k] = a[k];\n for (var k in b)\n o[k] = b[k];\n return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n var dt = fn();\n var st = fn.toString();\n var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/\\s+/g, '').split(',');\n for (var i = 0; i < dt.length; ++i) {\n var v = dt[i], k = ks[i];\n if (typeof v == 'function') {\n fnStr += ';' + k + '=';\n var st_1 = v.toString();\n if (v.prototype) {\n // for global objects\n if (st_1.indexOf('[native code]') != -1) {\n var spInd = st_1.indexOf(' ', 8) + 1;\n fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n }\n else {\n fnStr += st_1;\n for (var t in v.prototype)\n fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n }\n }\n else\n fnStr += st_1;\n }\n else\n td[k] = v;\n }\n return fnStr;\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n var tl = [];\n for (var k in v) {\n if (v[k].buffer) {\n tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n }\n }\n return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n if (!ch[id]) {\n var fnStr = '', td_1 = {}, m = fns.length - 1;\n for (var i = 0; i < m; ++i)\n fnStr = wcln(fns[i], fnStr, td_1);\n ch[id] = { c: wcln(fns[m], fnStr, td_1), e: td_1 };\n }\n var td = mrg({}, ch[id].e);\n return wk(ch[id].c + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, i32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, ec, hMap, max, bits, bits16, shft, slc, err, inflt, inflateSync, pbf, gopt]; };\nvar bDflt = function () { return [u8, u16, i32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zls]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get opts\nvar gopt = function (o) { return o && {\n out: o.size && new u8(o.size),\n dictionary: o.dictionary\n}; };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n var w = wrkr(fns, init, id, function (err, dat) {\n w.terminate();\n cb(err, dat);\n });\n w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n return function (ev) {\n if (ev.data[0]) {\n strm.push(ev.data[0], ev.data[1]);\n postMessage([ev.data[0].length]);\n }\n else\n strm.flush(ev.data[1]);\n };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id, flush, ext) {\n var t;\n var w = wrkr(fns, init, id, function (err, dat) {\n if (err)\n w.terminate(), strm.ondata.call(strm, err);\n else if (!Array.isArray(dat))\n ext(dat);\n else if (dat.length == 1) {\n strm.queuedSize -= dat[0];\n if (strm.ondrain)\n strm.ondrain(dat[0]);\n }\n else {\n if (dat[1])\n w.terminate();\n strm.ondata.call(strm, err, dat[0], dat[1]);\n }\n });\n w.postMessage(opts);\n strm.queuedSize = 0;\n strm.push = function (d, f) {\n if (!strm.ondata)\n err(5);\n if (t)\n strm.ondata(err(4, 0, 1), null, !!f);\n strm.queuedSize += d.length;\n // can fail for cross-realm Uint8Array, but ok - only a small performance penalty\n w.postMessage([d, t = f], d.buffer instanceof ArrayBuffer ? [d.buffer] : []);\n };\n strm.terminate = function () { w.terminate(); };\n if (flush) {\n strm.flush = function (sync) { w.postMessage([0, sync]); };\n }\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\n// read 8 bytes\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n var fn = o.filename;\n c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n if (o.mtime != 0)\n wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n if (fn) {\n c[3] = 8;\n for (var i = 0; i <= fn.length; ++i)\n c[i + 10] = fn.charCodeAt(i);\n }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n err(6, 'invalid gzip data');\n var flg = d[3];\n var st = 10;\n if (flg & 4)\n st += (d[10] | d[11] << 8) + 2;\n for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n ;\n return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n var l = d.length;\n return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16 | d[l - 1] << 24) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + (o.filename ? o.filename.length + 1 : 0); };\n// zlib header\nvar zlh = function (c, o) {\n var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = (fl << 6) | (o.dictionary && 32);\n c[1] |= 31 - ((c[0] << 8) | c[1]) % 31;\n if (o.dictionary) {\n var h = adler();\n h.p(o.dictionary);\n wbytes(c, 2, h.d());\n }\n};\n// zlib start\nvar zls = function (d, dict) {\n if ((d[0] & 15) != 8 || (d[0] >> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n err(6, 'invalid zlib data');\n if ((d[1] >> 5 & 1) == +!dict)\n err(6, 'invalid zlib data: ' + (d[1] & 32 ? 'need' : 'unexpected') + ' dictionary');\n return (d[1] >> 3 & 4) + 2;\n};\nfunction StrmOpt(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n return opts;\n}\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n function Deflate(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n this.o = opts || {};\n this.s = { l: 0, i: 32768, w: 32768, z: 32768 };\n // Buffer length must always be 0 mod 32768 for index calculations to be correct when modifying head and prev\n // 98304 = 32768 (lookback) + 65536 (common chunk size)\n this.b = new u8(98304);\n if (this.o.dictionary) {\n var dict = this.o.dictionary.subarray(-32768);\n this.b.set(dict, 32768 - dict.length);\n this.s.i = 32768 - dict.length;\n }\n }\n Deflate.prototype.p = function (c, f) {\n this.ondata(dopt(c, this.o, 0, 0, this.s), f);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Deflate.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n var endLen = chunk.length + this.s.z;\n if (endLen > this.b.length) {\n if (endLen > 2 * this.b.length - 32768) {\n var newBuf = new u8(endLen & -32768);\n newBuf.set(this.b.subarray(0, this.s.z));\n this.b = newBuf;\n }\n var split = this.b.length - this.s.z;\n this.b.set(chunk.subarray(0, split), this.s.z);\n this.s.z = this.b.length;\n this.p(this.b, false);\n this.b.set(this.b.subarray(-32768));\n this.b.set(chunk.subarray(split), 32768);\n this.s.z = chunk.length - split + 32768;\n this.s.i = 32766, this.s.w = 32768;\n }\n else {\n this.b.set(chunk, this.s.z);\n this.s.z += chunk.length;\n }\n this.s.l = final & 1;\n if (this.s.z > this.s.w + 8191 || final) {\n this.p(this.b, final || false);\n this.s.w = this.s.i, this.s.i -= 2;\n }\n if (final) {\n // cleanup unneeded buffers/state to reduce memory usage\n this.s = this.o = {};\n this.b = et;\n }\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * deflated output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible. A separate DEFLATE stream may be concatenated\n * with the current output after a sync flush.\n */\n Deflate.prototype.flush = function (sync) {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n this.p(this.b, false);\n this.s.w = this.s.i, this.s.i -= 2;\n // could technically skip writing the type-0 block for (this.s.r & 7) == 0,\n // but the deterministic trailer (00 00 FF FF) is useful in some situations\n if (sync) {\n var c = new u8(6);\n c[0] = this.s.r >> 3;\n // write empty, non-final type-0 block\n var ep = wfblk(c, this.s.r, et);\n this.s.r = 0;\n this.ondata(c.subarray(0, ep >> 3), false);\n }\n };\n return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n function AsyncDeflate(opts, cb) {\n astrmify([\n bDflt,\n function () { return [astrm, Deflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Deflate(ev.data);\n onmessage = astrm(strm);\n }, 6, 1);\n }\n return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n function Inflate(opts, cb) {\n // no StrmOpt here to avoid adding to workerizer\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768);\n this.s = { i: 0, b: dict ? dict.length : 0 };\n this.o = new u8(32768);\n this.p = new u8(0);\n if (dict)\n this.o.set(dict);\n }\n Inflate.prototype.e = function (c) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n if (!this.p.length)\n this.p = c;\n else if (c.length) {\n var n = new u8(this.p.length + c.length);\n n.set(this.p), n.set(c, this.p.length), this.p = n;\n }\n };\n Inflate.prototype.c = function (final) {\n this.s.i = +(this.d = final || false);\n var bts = this.s.b;\n var dt = inflt(this.p, this.s, this.o);\n this.ondata(slc(dt, bts, this.s.b), this.d);\n this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n };\n /**\n * Pushes a chunk to be inflated\n * @param chunk The chunk to push\n * @param final Whether this is the final chunk\n */\n Inflate.prototype.push = function (chunk, final) {\n this.e(chunk), this.c(final);\n };\n return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n function AsyncInflate(opts, cb) {\n astrmify([\n bInflt,\n function () { return [astrm, Inflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Inflate(ev.data);\n onmessage = astrm(strm);\n }, 7, 0);\n }\n return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt\n ], function (ev) { return pbf(inflateSync(ev.data[0], gopt(ev.data[1]))); }, 1, cb);\n}\nexport function inflateSync(data, opts) {\n return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n function Gzip(opts, cb) {\n this.c = crc();\n this.l = 0;\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gzip.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n this.l += chunk.length;\n Deflate.prototype.push.call(this, chunk, final);\n };\n Gzip.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, this.s);\n if (this.v)\n gzh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * GZIPped output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible.\n */\n Gzip.prototype.flush = function (sync) {\n Deflate.prototype.flush.call(this, sync);\n };\n return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n function AsyncGzip(opts, cb) {\n astrmify([\n bDflt,\n gze,\n function () { return [astrm, Deflate, Gzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gzip(ev.data);\n onmessage = astrm(strm);\n }, 8, 1);\n }\n return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n gze,\n function () { return [gzipSync]; }\n ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n if (!opts)\n opts = {};\n var c = crc(), l = data.length;\n c.p(data);\n var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming single or multi-member GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n function Gunzip(opts, cb) {\n this.v = 1;\n this.r = 0;\n Inflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GUNZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gunzip.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n this.r += chunk.length;\n if (this.v) {\n var p = this.p.subarray(this.v - 1);\n var s = p.length > 3 ? gzs(p) : 4;\n if (s > p.length) {\n if (!final)\n return;\n }\n else if (this.v > 1 && this.onmember) {\n this.onmember(this.r - p.length);\n }\n this.p = p.subarray(s), this.v = 0;\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, 0);\n // process concatenated GZIP\n if (this.s.f && !this.s.l) {\n this.v = shft(this.s.p) + 9;\n this.s = { i: 0 };\n this.o = new u8(0);\n this.push(new u8(0), final);\n }\n else if (final) {\n Inflate.prototype.c.call(this, final);\n }\n };\n return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming single or multi-member GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n function AsyncGunzip(opts, cb) {\n var _this = this;\n astrmify([\n bInflt,\n guze,\n function () { return [astrm, Inflate, Gunzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gunzip(ev.data);\n strm.onmember = function (offset) { return postMessage(offset); };\n onmessage = astrm(strm);\n }, 9, 0, function (offset) { return _this.onmember && _this.onmember(offset); });\n }\n return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n guze,\n function () { return [gunzipSync]; }\n ], function (ev) { return pbf(gunzipSync(ev.data[0], ev.data[1])); }, 3, cb);\n}\nexport function gunzipSync(data, opts) {\n var st = gzs(data);\n if (st + 8 > data.length)\n err(6, 'invalid gzip data');\n return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary);\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n function Zlib(opts, cb) {\n this.c = adler();\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be zlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Zlib.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n Deflate.prototype.push.call(this, chunk, final);\n };\n Zlib.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && (this.o.dictionary ? 6 : 2), f && 4, this.s);\n if (this.v)\n zlh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 4, this.c.d());\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * zlibbed output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible.\n */\n Zlib.prototype.flush = function (sync) {\n Deflate.prototype.flush.call(this, sync);\n };\n return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n function AsyncZlib(opts, cb) {\n astrmify([\n bDflt,\n zle,\n function () { return [astrm, Deflate, Zlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Zlib(ev.data);\n onmessage = astrm(strm);\n }, 10, 1);\n }\n return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n zle,\n function () { return [zlibSync]; }\n ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n if (!opts)\n opts = {};\n var a = adler();\n a.p(data);\n var d = dopt(data, opts, opts.dictionary ? 6 : 2, 4);\n return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n function Unzlib(opts, cb) {\n Inflate.call(this, opts, cb);\n this.v = opts && opts.dictionary ? 2 : 1;\n }\n /**\n * Pushes a chunk to be unzlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzlib.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n if (this.p.length < 6 && !final)\n return;\n this.p = this.p.subarray(zls(this.p, this.v - 1)), this.v = 0;\n }\n if (final) {\n if (this.p.length < 4)\n err(6, 'invalid zlib data');\n this.p = this.p.subarray(0, -4);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n function AsyncUnzlib(opts, cb) {\n astrmify([\n bInflt,\n zule,\n function () { return [astrm, Inflate, Unzlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Unzlib(ev.data);\n onmessage = astrm(strm);\n }, 11, 0);\n }\n return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n zule,\n function () { return [unzlibSync]; }\n ], function (ev) { return pbf(unzlibSync(ev.data[0], gopt(ev.data[1]))); }, 5, cb);\n}\nexport function unzlibSync(data, opts) {\n return inflt(data.subarray(zls(data, opts && opts.dictionary), -4), { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n function Decompress(opts, cb) {\n this.o = StrmOpt.call(this, opts, cb) || {};\n this.G = Gunzip;\n this.I = Inflate;\n this.Z = Unzlib;\n }\n // init substream\n // overriden by AsyncDecompress\n Decompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (dat, final) {\n _this.ondata(dat, final);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Decompress.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (!this.s) {\n if (this.p && this.p.length) {\n var n = new u8(this.p.length + chunk.length);\n n.set(this.p), n.set(chunk, this.p.length);\n }\n else\n this.p = chunk;\n if (this.p.length > 2) {\n this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n ? new this.G(this.o)\n : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n ? new this.I(this.o)\n : new this.Z(this.o);\n this.i();\n this.s.push(this.p, final);\n this.p = null;\n }\n }\n else\n this.s.push(chunk, final);\n };\n return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n function AsyncDecompress(opts, cb) {\n Decompress.call(this, opts, cb);\n this.queuedSize = 0;\n this.G = AsyncGunzip;\n this.I = AsyncInflate;\n this.Z = AsyncUnzlib;\n }\n AsyncDecompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (err, dat, final) {\n _this.ondata(err, dat, final);\n };\n this.s.ondrain = function (size) {\n _this.queuedSize -= size;\n if (_this.ondrain)\n _this.ondrain(size);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncDecompress.prototype.push = function (chunk, final) {\n this.queuedSize += chunk.length;\n Decompress.prototype.push.call(this, chunk, final);\n };\n return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzip(data, opts, cb)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflate(data, opts, cb)\n : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, opts) {\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzipSync(data, opts)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflateSync(data, opts)\n : unzlibSync(data, opts);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n for (var k in d) {\n var val = d[k], n = p + k, op = o;\n if (Array.isArray(val))\n op = mrg(o, val[1]), val = val[0];\n if (ArrayBuffer.isView(val))\n t[n] = [val, op];\n else {\n t[n += '/'] = [new u8(0), op];\n fltn(val, n, t, o);\n }\n }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n td.decode(et, { stream: true });\n tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n for (var r = '', i = 0;;) {\n var c = d[i++];\n var eb = (c > 127) + (c > 223) + (c > 239);\n if (i + eb > d.length)\n return { s: r, r: slc(d, i - 1) };\n if (!eb)\n r += String.fromCharCode(c);\n else if (eb == 3) {\n c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n }\n else if (eb & 1)\n r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n else\n r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is decoded\n */\n function DecodeUTF8(cb) {\n this.ondata = cb;\n if (tds)\n this.t = new TextDecoder();\n else\n this.p = et;\n }\n /**\n * Pushes a chunk to be decoded from UTF-8 binary\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n DecodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n final = !!final;\n if (this.t) {\n this.ondata(this.t.decode(chunk, { stream: true }), final);\n if (final) {\n if (this.t.decode().length)\n err(8);\n this.t = null;\n }\n return;\n }\n if (!this.p)\n err(4);\n var dat = new u8(this.p.length + chunk.length);\n dat.set(this.p);\n dat.set(chunk, this.p.length);\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (final) {\n if (r.length)\n err(8);\n this.p = null;\n }\n else\n this.p = r;\n this.ondata(s, final);\n };\n return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is encoded\n */\n function EncodeUTF8(cb) {\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be encoded to UTF-8\n * @param chunk The string data to push\n * @param final Whether this is the last chunk\n */\n EncodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n this.ondata(strToU8(chunk), this.d = final || false);\n };\n return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n if (latin1) {\n var ar_1 = new u8(str.length);\n for (var i = 0; i < str.length; ++i)\n ar_1[i] = str.charCodeAt(i);\n return ar_1;\n }\n if (te)\n return te.encode(str);\n var l = str.length;\n var ar = new u8(str.length + (str.length >> 1));\n var ai = 0;\n var w = function (v) { ar[ai++] = v; };\n for (var i = 0; i < l; ++i) {\n if (ai + 5 > ar.length) {\n var n = new u8(ai + 8 + ((l - i) << 1));\n n.set(ar);\n ar = n;\n }\n var c = str.charCodeAt(i);\n if (c < 128 || latin1)\n w(c);\n else if (c < 2048)\n w(192 | (c >> 6)), w(128 | (c & 63));\n else if (c > 55295 && c < 57344)\n c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n else\n w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n }\n return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n if (latin1) {\n var r = '';\n for (var i = 0; i < dat.length; i += 16384)\n r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n return r;\n }\n else if (td) {\n return td.decode(dat);\n }\n else {\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (r.length)\n err(8);\n return s;\n }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n var fnl = b2(d, b + 28), efl = b2(d, b + 30), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl;\n var _a = z64hs(d, es, efl, z, b4(d, b + 20), b4(d, b + 24), b4(d, b + 42)), sc = _a[0], su = _a[1], off = _a[2];\n return [b2(d, b + 10), sc, su, fn, es + efl + b2(d, b + 32), off];\n};\n// read zip64 header sizes\nvar z64hs = function (d, b, l, z, sc, su, off) {\n var nsc = sc == 4294967295, nsu = su == 4294967295, noff = off == 4294967295, e = b + l;\n var nf = nsc + nsu + noff;\n if (z && nf) {\n for (; b + 4 < e; b += 4 + b2(d, b + 2)) {\n if (b2(d, b) == 1) {\n return [\n nsc ? b8(d, b + 4 + 8 * nsu) : sc,\n nsu ? b8(d, b + 4) : su,\n noff ? b8(d, b + 4 + 8 * (nsu + nsc)) : off,\n 1\n ];\n }\n }\n // z == 2 for unknown whether or not zip64\n if (z < 2)\n err(13);\n }\n return [sc, su, off, 0];\n};\n// extra field length\nvar exfl = function (ex) {\n var le = 0;\n if (ex) {\n for (var k in ex) {\n var l = ex[k].length;\n if (l > 65535)\n err(9);\n le += l + 4;\n }\n }\n return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n var fl = fn.length, ex = f.extra, col = co && co.length;\n var exl = exfl(ex);\n wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n if (ce != null)\n d[b++] = 20, d[b++] = f.os;\n d[b] = 20, b += 2; // spec compliance? what's that?\n d[b++] = (f.flag << 1) | (c < 0 && 8), d[b++] = u && 8;\n d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n if (y < 0 || y > 119)\n err(10);\n wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >> 1)), b += 4;\n if (c != -1) {\n wbytes(d, b, f.crc);\n wbytes(d, b + 4, c < 0 ? -c - 2 : c);\n wbytes(d, b + 8, f.size);\n }\n wbytes(d, b + 12, fl);\n wbytes(d, b + 14, exl), b += 16;\n if (ce != null) {\n wbytes(d, b, col);\n wbytes(d, b + 6, f.attrs);\n wbytes(d, b + 10, ce), b += 14;\n }\n d.set(fn, b);\n b += fl;\n if (exl) {\n for (var k in ex) {\n var exf = ex[k], l = exf.length;\n wbytes(d, b, +k);\n wbytes(d, b + 2, l);\n d.set(exf, b + 4), b += 4 + l;\n }\n }\n if (col)\n d.set(co, b), b += col;\n return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n wbytes(o, b, 0x6054B50); // skip disk\n wbytes(o, b + 8, c);\n wbytes(o, b + 10, c);\n wbytes(o, b + 12, d);\n wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n /**\n * Creates a pass-through stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n */\n function ZipPassThrough(filename) {\n this.filename = filename;\n this.c = crc();\n this.size = 0;\n this.compression = 0;\n }\n /**\n * Processes a chunk and pushes to the output stream. You can override this\n * method in a subclass for custom behavior, but by default this passes\n * the data through. You must call this.ondata(err, chunk, final) at some\n * point in this method.\n * @param chunk The chunk to process\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.process = function (chunk, final) {\n this.ondata(null, chunk, final);\n };\n /**\n * Pushes a chunk to be added. If you are subclassing this with a custom\n * compression algorithm, note that you must push data from the source\n * file only, pre-compression.\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n this.c.p(chunk);\n this.size += chunk.length;\n if (final)\n this.crc = this.c.d();\n // we shouldn't really do this cast, but properly handling ArrayBufferLike\n // makes the API unergonomic with Buffer\n this.process(chunk, final || false);\n };\n return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function ZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new Deflate(opts, function (dat, final) {\n _this.ondata(null, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n }\n ZipDeflate.prototype.process = function (chunk, final) {\n try {\n this.d.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function AsyncZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new AsyncDeflate(opts, function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n this.terminate = this.d.terminate;\n }\n AsyncZipDeflate.prototype.process = function (chunk, final) {\n this.d.push(chunk, final);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n /**\n * Creates an empty ZIP archive to which files can be added\n * @param cb The callback to call whenever data for the generated ZIP archive\n * is available\n */\n function Zip(cb) {\n this.ondata = cb;\n this.u = [];\n this.d = 1;\n }\n /**\n * Adds a file to the ZIP archive\n * @param file The file stream to add\n */\n Zip.prototype.add = function (file) {\n var _this = this;\n if (!this.ondata)\n err(5);\n // finishing or finished\n if (this.d & 2)\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false);\n else {\n var f = strToU8(file.filename), fl_1 = f.length;\n var com = file.comment, o = com && strToU8(com);\n var u = fl_1 != file.filename.length || (o && (com.length != o.length));\n var hl_1 = fl_1 + exfl(file.extra) + 30;\n if (fl_1 > 65535)\n this.ondata(err(11, 0, 1), null, false);\n var header = new u8(hl_1);\n wzh(header, 0, file, f, u, -1);\n var chks_1 = [header];\n var pAll_1 = function () {\n for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) {\n var chk = chks_2[_i];\n _this.ondata(null, chk, false);\n }\n chks_1 = [];\n };\n var tr_1 = this.d;\n this.d = 0;\n var ind_1 = this.u.length;\n var uf_1 = mrg(file, {\n f: f,\n u: u,\n o: o,\n t: function () {\n if (file.terminate)\n file.terminate();\n },\n r: function () {\n pAll_1();\n if (tr_1) {\n var nxt = _this.u[ind_1 + 1];\n if (nxt)\n nxt.r();\n else\n _this.d = 1;\n }\n tr_1 = 1;\n }\n });\n var cl_1 = 0;\n file.ondata = function (err, dat, final) {\n if (err) {\n _this.ondata(err, dat, final);\n _this.terminate();\n }\n else {\n cl_1 += dat.length;\n chks_1.push(dat);\n if (final) {\n var dd = new u8(16);\n wbytes(dd, 0, 0x8074B50);\n wbytes(dd, 4, file.crc);\n wbytes(dd, 8, cl_1);\n wbytes(dd, 12, file.size);\n chks_1.push(dd);\n uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file.crc, uf_1.size = file.size;\n if (tr_1)\n uf_1.r();\n tr_1 = 1;\n }\n else if (tr_1)\n pAll_1();\n }\n };\n this.u.push(uf_1);\n }\n };\n /**\n * Ends the process of adding files and prepares to emit the final chunks.\n * This *must* be called after adding all desired files for the resulting\n * ZIP file to work properly.\n */\n Zip.prototype.end = function () {\n var _this = this;\n if (this.d & 2) {\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true);\n return;\n }\n if (this.d)\n this.e();\n else\n this.u.push({\n r: function () {\n if (!(_this.d & 1))\n return;\n _this.u.splice(-1, 1);\n _this.e();\n },\n t: function () { }\n });\n this.d = 3;\n };\n Zip.prototype.e = function () {\n var bt = 0, l = 0, tl = 0;\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n }\n var out = new u8(tl + 22);\n for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n var f = _c[_b];\n wzh(out, bt, f, f.f, f.u, -f.c - 2, l, f.o);\n bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n }\n wzf(out, bt, this.u.length, tl, l);\n this.ondata(null, out, true);\n this.d = 2;\n };\n /**\n * A method to terminate any internal workers used by the stream. Subsequent\n * calls to add() will fail.\n */\n Zip.prototype.terminate = function () {\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n f.t();\n }\n this.d = 2;\n };\n return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var r = {};\n fltn(data, '', r, opts);\n var k = Object.keys(r);\n var lft = k.length, o = 0, tot = 0;\n var slft = lft, files = new Array(lft);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var cbf = function () {\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n tot = 0;\n for (var i = 0; i < slft; ++i) {\n var f = files[i];\n try {\n var l = f.c.length;\n wzh(out, tot, f, f.f, f.u, l);\n var badd = 30 + f.f.length + exfl(f.extra);\n var loc = tot + badd;\n out.set(f.c, loc);\n wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n }\n catch (e) {\n return cbd(e, null);\n }\n }\n wzf(out, o, files.length, cdl, oe);\n cbd(null, out);\n };\n if (!lft)\n cbf();\n var _loop_1 = function (i) {\n var fn = k[i];\n var _a = r[fn], file = _a[0], p = _a[1];\n var c = crc(), size = file.length;\n c.p(file);\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n var compression = p.level == 0 ? 0 : 8;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n var l = d.length;\n files[i] = mrg(p, {\n size: size,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n compression: compression\n });\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n if (!--lft)\n cbf();\n }\n };\n if (s > 65535)\n cbl(err(11, 0, 1), null);\n if (!compression)\n cbl(null, file);\n else if (size < 160000) {\n try {\n cbl(null, deflateSync(file, p));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(deflate(file, p, cbl));\n };\n // Cannot use lft because it can decrease\n for (var i = 0; i < slft; ++i) {\n _loop_1(i);\n }\n return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n if (!opts)\n opts = {};\n var r = {};\n var files = [];\n fltn(data, '', r, opts);\n var o = 0;\n var tot = 0;\n for (var fn in r) {\n var _a = r[fn], file = _a[0], p = _a[1];\n var compression = p.level == 0 ? 0 : 8;\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n if (s > 65535)\n err(11);\n var d = compression ? deflateSync(file, p) : file, l = d.length;\n var c = crc();\n c.p(file);\n files.push(mrg(p, {\n size: file.length,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n o: o,\n compression: compression\n }));\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n }\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n for (var i = 0; i < files.length; ++i) {\n var f = files[i];\n wzh(out, f.o, f, f.f, f.u, f.c.length);\n var badd = 30 + f.f.length + exfl(f.extra);\n out.set(f.c, f.o + badd);\n wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n }\n wzf(out, o, files.length, cdl, oe);\n return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n function UnzipPassThrough() {\n }\n UnzipPassThrough.prototype.push = function (chunk, final) {\n // same as ZipPassThrough: cast to retain Buffer ergonomics\n this.ondata(null, chunk, final);\n };\n UnzipPassThrough.compression = 0;\n return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function UnzipInflate() {\n var _this = this;\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n UnzipInflate.prototype.push = function (chunk, final) {\n try {\n this.i.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n UnzipInflate.compression = 8;\n return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function AsyncUnzipInflate(_, sz) {\n var _this = this;\n if (sz < 320000) {\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n else {\n this.i = new AsyncInflate(function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.terminate = this.i.terminate;\n }\n }\n AsyncUnzipInflate.prototype.push = function (chunk, final) {\n if (this.i.terminate)\n chunk = slc(chunk, 0);\n this.i.push(chunk, final);\n };\n AsyncUnzipInflate.compression = 8;\n return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n /**\n * Creates a ZIP decompression stream\n * @param cb The callback to call whenever a file in the ZIP archive is found\n */\n function Unzip(cb) {\n this.onfile = cb;\n this.k = [];\n this.o = {\n 0: UnzipPassThrough\n };\n this.p = et;\n }\n /**\n * Pushes a chunk to be unzipped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzip.prototype.push = function (chunk, final) {\n var _this = this;\n if (!this.onfile)\n err(5);\n if (!this.p)\n err(4);\n if (this.c > 0) {\n var len = Math.min(this.c, chunk.length);\n var toAdd = chunk.subarray(0, len);\n this.c -= len;\n if (this.d)\n this.d.push(toAdd, !this.c);\n else\n this.k[0].push(toAdd);\n chunk = chunk.subarray(len);\n if (chunk.length)\n return this.push(chunk, final);\n }\n else {\n var f = 0, i = 0, is = void 0, buf = void 0;\n if (!this.p.length)\n buf = chunk;\n else if (!chunk.length)\n buf = this.p;\n else {\n buf = new u8(this.p.length + chunk.length);\n buf.set(this.p), buf.set(chunk, this.p.length);\n }\n var l = buf.length, oc = this.c, add = oc && this.d;\n var _loop_2 = function () {\n var sig = b4(buf, i);\n if (sig == 0x4034B50) {\n f = 1, is = i;\n this_1.d = null;\n this_1.c = 0;\n var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n if (l > i + 30 + fnl + es) {\n var chks_3 = [];\n this_1.k.unshift(chks_3);\n f = 2;\n var lsc = b4(buf, i + 18), lsu = b4(buf, i + 22);\n var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n var _a = z64hs(buf, i, es, 2, lsc, lsu, 0), sc_1 = _a[0], su_1 = _a[1], z64 = _a[3];\n if (dd)\n sc_1 = -1 - z64;\n i += es;\n this_1.c = sc_1;\n var d_1;\n var file_1 = {\n name: fn_1,\n compression: cmp_1,\n start: function () {\n if (!file_1.ondata)\n err(5);\n if (!sc_1)\n file_1.ondata(null, et, true);\n else {\n var ctr = _this.o[cmp_1];\n if (!ctr)\n file_1.ondata(err(14, 'unknown compression type ' + cmp_1, 1), null, false);\n d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) {\n var dat = chks_4[_i];\n d_1.push(dat, false);\n }\n if (_this.k[0] == chks_3 && _this.c)\n _this.d = d_1;\n else\n d_1.push(et, true);\n }\n },\n terminate: function () {\n if (d_1 && d_1.terminate)\n d_1.terminate();\n }\n };\n if (sc_1 >= 0)\n file_1.size = sc_1, file_1.originalSize = su_1;\n this_1.onfile(file_1);\n }\n return \"break\";\n }\n else if (oc) {\n if (sig == 0x8074B50) {\n is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n return \"break\";\n }\n else if (sig == 0x2014B50) {\n is = i -= 4, f = 3, this_1.c = 0;\n return \"break\";\n }\n }\n };\n var this_1 = this;\n for (; i < l - 4; ++i) {\n var state_1 = _loop_2();\n if (state_1 === \"break\")\n break;\n }\n this.p = et;\n if (oc < 0) {\n var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n if (add)\n add.push(dat, !!f);\n else\n this.k[+(f == 2)].push(dat);\n }\n if (f & 2)\n return this.push(buf.subarray(i), final);\n this.p = buf.subarray(i);\n }\n if (final) {\n if (this.c)\n err(13);\n this.p = null;\n }\n };\n /**\n * Registers a decoder with the stream, allowing for files compressed with\n * the compression type provided to be expanded correctly\n * @param decoder The decoder constructor\n */\n Unzip.prototype.register = function (decoder) {\n this.o[decoder.compression] = decoder;\n };\n return Unzip;\n}());\nexport { Unzip };\nvar mt = typeof queueMicrotask == 'function' ? queueMicrotask : typeof setTimeout == 'function' ? setTimeout : function (fn) { fn(); };\nexport function unzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var files = {};\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558) {\n cbd(err(13, 0, 1), null);\n return tAll;\n }\n }\n ;\n var lft = b2(data, e + 8);\n if (lft) {\n var c = lft;\n var o = b4(data, e + 16);\n var z = b4(data, e - 20) == 0x7064B50;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = lft = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n var _loop_3 = function (i) {\n var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n if (d)\n files[fn] = d;\n if (!--lft)\n cbd(null, files);\n }\n };\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_1\n })) {\n if (!c_1)\n cbl(null, slc(data, b, b + sc));\n else if (c_1 == 8) {\n var infl = data.subarray(b, b + sc);\n // Synchronously decompress under 512KB, or barely-compressed data\n if (su < 524288 || sc > 0.8 * su) {\n try {\n cbl(null, inflateSync(infl, { out: new u8(su) }));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(inflate(infl, { size: su }, cbl));\n }\n else\n cbl(err(14, 'unknown compression type ' + c_1, 1), null);\n }\n else\n cbl(null, null);\n };\n for (var i = 0; i < c; ++i) {\n _loop_3(i);\n }\n }\n else\n cbd(null, {});\n return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @param opts The ZIP extraction options\n * @returns The decompressed files\n */\nexport function unzipSync(data, opts) {\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558)\n err(13);\n }\n ;\n var c = b2(data, e + 8);\n if (!c)\n return {};\n var o = b4(data, e + 16);\n var z = b4(data, e - 20) == 0x7064B50;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n for (var i = 0; i < c; ++i) {\n var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_2\n })) {\n if (!c_2)\n files[fn] = slc(data, b, b + sc);\n else if (c_2 == 8)\n files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) });\n else\n err(14, 'unknown compression type ' + c_2);\n }\n }\n return files;\n}\n",
|
|
42
|
+
"import type { Sade } from \"sade\";\nimport { printJson } from \"../utils/output\";\nimport { ProcessExitError, runProcess } from \"../utils/process\";\nimport type { ProjectToolchain } from \"../utils/scaffold\";\nimport { toWorkflowInstallJson } from \"../utils/workflow-json\";\n\ninterface InstallProsOptions {\n cwd?: string;\n json?: boolean;\n run?: typeof runProcess;\n which?: (command: string) => string | null;\n}\n\nfunction isExternallyManagedPythonError(error: unknown): boolean {\n return (\n error instanceof ProcessExitError &&\n error.stderr.includes(\"externally-managed-environment\")\n );\n}\n\nexport async function installPros(options: InstallProsOptions = {}) {\n const cwd = options.cwd ?? process.cwd();\n const run = options.run ?? runProcess;\n const which = options.which ?? Bun.which;\n const stdout = options.json === true ? \"ignore\" : \"inherit\";\n\n if (which(\"pipx\") !== null) {\n await run([\"pipx\", \"install\", \"pros-cli\"], cwd, { stdout });\n return;\n }\n\n const python = which(\"python3\") ?? which(\"python\");\n if (python === null) throw new Error(\"Python is required to install PROS\");\n\n try {\n await run([python, \"-m\", \"pip\", \"install\", \"--user\", \"pros-cli\"], cwd, {\n stdout,\n stderr: \"pipe\",\n });\n } catch (error) {\n if (isExternallyManagedPythonError(error)) {\n throw new Error(\n \"Python refused to install pros-cli because this is an externally-managed environment. Install pipx and run `v5x install pros` again, or install pros-cli in a virtual environment.\",\n );\n }\n throw error;\n }\n}\n\nexport default function registerInstallCommand(program: Sade) {\n program\n .command(\"install <toolchain>\", \"install a V5 development toolchain\")\n .option(\"--json\", \"print machine-readable JSON\")\n .action(async (toolchain: string, options: { json?: boolean }) => {\n if (toolchain !== \"pros\" && toolchain !== \"vexide\") {\n throw new Error(\"toolchain must be either pros or vexide\");\n }\n const selectedToolchain: ProjectToolchain = toolchain;\n if (toolchain === \"vexide\") {\n await runProcess([\"cargo\", \"install\", \"cargo-v5\"], process.cwd(), {\n stdout: options.json === true ? \"ignore\" : \"inherit\",\n });\n if (options.json === true) {\n printJson(toWorkflowInstallJson(selectedToolchain));\n }\n return;\n }\n\n await installPros({ json: options.json });\n if (options.json === true) {\n printJson(toWorkflowInstallJson(selectedToolchain));\n }\n });\n}\n",
|
|
43
|
+
"import type { Sade } from \"sade\";\nimport chalk from \"chalk\";\nimport { type PortSelectionOptions, withSelectedV5Device } from \"../device\";\nimport {\n formatSerialFailure,\n printJson,\n renderTable,\n unwrapSerial,\n} from \"../utils/output\";\n\nconst WELL_KNOWN_KEYS = [\"teamnumber\", \"robotname\"] as const;\n\ntype KvRow = { key: string; value: string | undefined; error?: string };\n\nexport function toKvJson(values: KvRow[]) {\n return values.map(({ key, value, error }) => ({\n key,\n value: value ?? null,\n ...(error === undefined ? {} : { error }),\n }));\n}\n\nexport function formatKvRows(rows: KvRow[]): string[][] {\n return rows.map(({ key, value, error }) => [\n key,\n error ?? (value ? value : chalk.dim(\"(unset)\")),\n ]);\n}\n\nexport default function registerKvCommand(program: Sade) {\n program\n .command(\"kv\", \"list well-known system variables on a brain\")\n .option(\"--json\", \"print machine-readable JSON\")\n .option(\"--port\", \"serial port path or id, defaults to V5X_PORT\")\n .action(async (options: { json?: boolean } & PortSelectionOptions) => {\n await withSelectedV5Device(options, async (device) => {\n const rows: KvRow[] = [];\n for (const key of WELL_KNOWN_KEYS) {\n const result = await device.brain.getValue(key);\n rows.push(\n result.isOk()\n ? { key, value: result.value }\n : {\n key,\n value: undefined,\n error: formatSerialFailure(\n `failed to get ${key}`,\n result.error,\n ),\n },\n );\n }\n\n if (options.json === true) printJson(toKvJson(rows));\n else console.log(renderTable([\"key\", \"value\"], formatKvRows(rows)));\n });\n });\n\n program\n .command(\"kv get <key>\", \"get the value of a system variable on a brain\")\n .option(\"--json\", \"print machine-readable JSON\")\n .option(\"--port\", \"serial port path or id, defaults to V5X_PORT\")\n .action(\n async (\n key: string,\n options: { json?: boolean } & PortSelectionOptions,\n ) => {\n await withSelectedV5Device(options, async (device) => {\n const value = unwrapSerial(\n await device.brain.getValue(key),\n `failed to get ${key}`,\n );\n if (options.json === true) printJson({ key, value: value ?? null });\n else console.log(value);\n });\n },\n );\n\n program\n .command(\"kv set <key> <value>\", \"set a system variable on a brain\")\n .option(\"--port\", \"serial port path or id, defaults to V5X_PORT\")\n .action(async (key, value, options: PortSelectionOptions) => {\n await withSelectedV5Device(options, async (device) => {\n unwrapSerial(\n await device.brain.setValue(key, value),\n `failed to set ${key} to ${value}`,\n );\n console.log(`set ${key} to ${value}`);\n });\n });\n}\n",
|
|
44
|
+
"import type { Sade } from \"sade\";\nimport { basename, join, resolve } from \"node:path\";\nimport { createProject, parseToolchain } from \"../utils/scaffold\";\nimport { printJson } from \"../utils/output\";\nimport { toWorkflowCreateJson } from \"../utils/workflow-json\";\n\nexport function assertProjectNameArgument(name: string): void {\n if (/[\\\\/]/.test(name)) {\n throw new Error(\n \"project name cannot contain path separators; use --path for nested destinations\",\n );\n }\n}\n\nexport default function registerNewCommand(program: Sade) {\n program\n .command(\"new <name>\", \"create a new V5 program\", { alias: \"n\" })\n .option(\"-t, --type\", \"project toolchain (required: pros or vexide)\")\n .option(\"-p, --path\", \"destination path\")\n .option(\"--json\", \"print machine-readable JSON\")\n .action(\n async (\n name: string,\n options: { type?: string; path?: string; json?: boolean },\n ) => {\n const toolchain = parseToolchain(options.type);\n assertProjectNameArgument(name);\n const destination =\n options.path === undefined\n ? join(process.cwd(), name)\n : resolve(options.path);\n const path = await createProject(destination, toolchain, {\n displayName: name,\n cargoPackageName:\n toolchain === \"vexide\" ? name : basename(destination),\n prosRemoteName: name,\n });\n if (options.json === true) {\n printJson(toWorkflowCreateJson(\"new\", path, toolchain));\n } else {\n console.log(`created ${toolchain} project at ${path}`);\n }\n },\n );\n}\n",
|
|
45
|
+
"import type { IProgramInfo, SlotNumber } from \"@v5x/serial\";\nimport type { Sade } from \"sade\";\nimport { type PortSelectionOptions, withSelectedV5Device } from \"../device\";\nimport {\n printJson,\n renderTable,\n unwrapSerial,\n utcTimestamp,\n} from \"../utils/output\";\nimport { formatFileSize } from \"./dir\";\n\nexport function parseSlotArgument(slot: string): SlotNumber {\n if (!/^[1-8]$/.test(slot))\n throw new Error(\"slot must be a number from 1 to 8\");\n return Number(slot) as SlotNumber;\n}\n\nfunction formatSlot(slot: number): string {\n return slot >= 1 && slot <= 8 ? slot.toString() : \"unknown\";\n}\n\nexport function formatProgramRows(programs: IProgramInfo[]): string[][] {\n return programs.map((info) => [\n formatSlot(info.slot),\n formatSlot(info.requestedSlot),\n info.name,\n formatFileSize(info.size),\n utcTimestamp.format(info.time),\n info.binfile,\n ]);\n}\n\nexport function toProgramJson(programs: IProgramInfo[]) {\n return programs.map(({ slot, requestedSlot, name, size, time, binfile }) => ({\n slot,\n requestedSlot,\n name,\n size,\n time: time.toISOString(),\n binfile,\n }));\n}\n\nexport default function registerProgramsCommand(program: Sade) {\n program\n .command(\"programs\", \"list programs on the V5 brain\")\n .option(\"--json\", \"print machine-readable JSON\")\n .option(\"--port\", \"serial port path or id, defaults to V5X_PORT\")\n .action(async (options: { json?: boolean } & PortSelectionOptions) => {\n await withSelectedV5Device(options, async (device) => {\n const programs = unwrapSerial(\n await device.brain.listProgram(),\n \"failed to list programs\",\n );\n if (options.json === true) printJson(toProgramJson(programs));\n else\n console.log(\n renderTable(\n [\"slot\", \"requested\", \"name\", \"size\", \"timestamp\", \"file\"],\n formatProgramRows(programs),\n ),\n );\n });\n });\n\n program\n .command(\"start <slot>\", \"start a program slot on the V5 brain\")\n .option(\"--port\", \"serial port path or id, defaults to V5X_PORT\")\n .action(async (slot: string, options: PortSelectionOptions) => {\n const slotNumber = parseSlotArgument(slot);\n await withSelectedV5Device(options, async (device) => {\n unwrapSerial(\n await device.brain.runProgram(slotNumber),\n `failed to start slot ${slot}`,\n );\n console.log(`started slot ${slot}`);\n });\n });\n\n program\n .command(\"stop\", \"stop the running program on the V5 brain\")\n .option(\"--port\", \"serial port path or id, defaults to V5X_PORT\")\n .action(async (options: PortSelectionOptions) => {\n await withSelectedV5Device(options, async (device) => {\n unwrapSerial(\n await device.brain.stopProgram(),\n \"failed to stop program\",\n );\n console.log(\"stopped program\");\n });\n });\n}\n",
|
|
46
|
+
"import type { Sade } from \"sade\";\nimport { type PortSelectionOptions, withSelectedV5Device } from \"../device\";\nimport { parseBrainFilePath } from \"../utils/brainPath\";\nimport { unwrapSerial } from \"../utils/output\";\n\nexport default function registerRmCommand(program: Sade) {\n program\n .command(\"rm <file>\", \"erase a file from flash\")\n .option(\"--port\", \"serial port path or id, defaults to V5X_PORT\")\n .action(async (file, options: PortSelectionOptions) => {\n const handle = parseBrainFilePath(file);\n await withSelectedV5Device(options, async (device) => {\n unwrapSerial(\n await device.brain.removeFile(handle),\n `failed to erase ${file}`,\n );\n console.log(`erased ${file}`);\n });\n });\n}\n",
|
|
47
|
+
"import { type PortSelectionOptions, withSelectedV5Device } from \"../device\";\nimport { formatSerialFailure, printJson } from \"./output\";\nimport {\n buildProject,\n createProgramConfig,\n findProgramArtifacts,\n inspectProject,\n validateProgramArtifacts,\n} from \"./project\";\nimport {\n toWorkflowArtifactJson,\n toWorkflowProjectJson,\n type WorkflowUploadJson,\n} from \"./workflow-json\";\n\nexport interface UploadOptions extends PortSelectionOptions {\n path: string;\n slot: number;\n name?: string;\n description?: string;\n icon: string;\n artifact?: string;\n build: boolean;\n run: boolean;\n command: WorkflowUploadJson[\"command\"];\n json?: boolean;\n}\n\nexport interface UploadCommandOptions extends PortSelectionOptions {\n // sade/mri parse a flag given without a value (e.g. a bare `--slot`) as the\n // boolean `true` rather than the declared default, so this must accept both.\n slot: string | boolean;\n name?: string;\n description?: string;\n icon: string;\n file?: string;\n build?: boolean;\n run?: boolean;\n json?: boolean;\n}\n\n/**\n * Resolves the raw `--slot` CLI option into a slot number.\n *\n * A bare `--slot` flag (no value) is parsed by sade/mri as the boolean\n * `true`, which would silently become slot 1 via `Number(true)`. Reject that\n * case explicitly instead of uploading to the wrong slot.\n */\nexport function resolveSlotOption(slot: string | boolean): number {\n if (typeof slot === \"boolean\") {\n throw new Error(\n \"--slot requires a value (e.g. --slot 1); it cannot be passed as a bare flag\",\n );\n }\n return Number(slot);\n}\n\n/**\n * Resolves whether the project should be built before uploading.\n *\n * When `--file` is given the caller is uploading a pre-built artifact, so\n * the build step is skipped by default. Passing `--build` (or omitting\n * `--file`) explicitly opts back into building; `--no-build` always skips it.\n */\nexport function resolveBuildOption(\n build: boolean | undefined,\n file: string | undefined,\n): boolean {\n if (build !== undefined) return build;\n return file === undefined;\n}\n\nexport async function uploadProgramFromCommand(\n path: string | undefined,\n options: UploadCommandOptions,\n runDefault: boolean,\n): Promise<void> {\n await uploadProgram({\n path: path ?? process.cwd(),\n slot: resolveSlotOption(options.slot),\n name: options.name,\n description: options.description,\n icon: options.icon,\n artifact: options.file,\n build: resolveBuildOption(options.build, options.file),\n run: options.run ?? runDefault,\n port: options.port,\n command: runDefault ? \"run\" : \"upload\",\n json: options.json,\n });\n}\n\nexport function reportProgress() {\n let previousState = \"\";\n // Track the longest state label seen so far so short state names (e.g.\n // \"bin\") are padded wide enough to fully overwrite a longer previous one\n // (e.g. \"channel\") when redrawing the same TTY line.\n let maxStateWidth = 0;\n const report = (state: string, current: number, total: number) => {\n if (state !== previousState) {\n if (previousState !== \"\") process.stderr.write(\"\\n\");\n previousState = state;\n }\n maxStateWidth = Math.max(maxStateWidth, state.length);\n const percent = total === 0 ? 0 : Math.floor((current / total) * 100);\n const message = `${state.toLowerCase().padEnd(maxStateWidth)} ${percent}%`;\n process.stderr.write(\n // \"\\x1b[K\" clears from the cursor to the end of the line, so residue\n // from a longer previous message on the same line never lingers.\n process.stderr.isTTY ? `\\r\\x1b[K${message}` : `${message}\\n`,\n );\n };\n report.finish = () => {\n if (previousState !== \"\") process.stderr.write(\"\\n\");\n };\n return report;\n}\n\nexport async function uploadProgram(\n options: UploadOptions,\n): Promise<WorkflowUploadJson> {\n const project = await inspectProject(options.path);\n if (options.build)\n await buildProject(project, {\n stdout: options.json === true ? \"ignore\" : \"inherit\",\n });\n const artifacts = await findProgramArtifacts(project, options.artifact);\n const config = createProgramConfig({\n slot: options.slot,\n name: options.name ?? project.name,\n description: options.description ?? project.description,\n icon: options.icon,\n type: project.type,\n run: options.run,\n });\n const validated = await validateProgramArtifacts(artifacts);\n const bytes = await Bun.file(validated.hot.path).bytes();\n const coldBytes = validated.cold\n ? await Bun.file(validated.cold.path).bytes()\n : undefined;\n\n await withSelectedV5Device(options, async (device) => {\n const progress = reportProgress();\n const uploaded = await device.brain.uploadProgram(\n config,\n bytes,\n coldBytes,\n progress,\n );\n progress.finish();\n if (uploaded.isErr()) {\n throw new Error(\n formatSerialFailure(\n \"the brain rejected the program upload\",\n uploaded.error,\n ),\n );\n }\n if (!uploaded.value)\n throw new Error(\"the brain rejected the program upload\");\n if (options.json !== true) {\n console.log(\n `${options.run ? \"uploaded and started\" : \"uploaded\"} ${config.program.name} in slot ${options.slot}`,\n );\n }\n });\n const result: WorkflowUploadJson = {\n command: options.command,\n project: toWorkflowProjectJson(project),\n slot: options.slot,\n name: config.program.name,\n description: config.program.description,\n icon: config.program.icon,\n artifactPath: validated.hot.path,\n artifacts: toWorkflowArtifactJson(validated),\n built: options.build,\n started: options.run,\n };\n if (options.json === true) printJson(result);\n return result;\n}\n",
|
|
48
|
+
"import type { Sade } from \"sade\";\nimport {\n uploadProgramFromCommand,\n type UploadCommandOptions,\n} from \"../utils/upload\";\n\nexport default function registerRunCommand(program: Sade) {\n program\n .command(\"run [path]\", \"build, upload, and run a program on a V5 brain\", {\n alias: \"r\",\n })\n .option(\"-s, --slot\", \"program slot\", \"1\")\n .option(\"-n, --name\", \"program name shown on the brain\")\n .option(\"-d, --description\", \"program description\")\n .option(\"-i, --icon\", \"program icon file\", \"default.bmp\")\n .option(\"-f, --file\", \"upload an existing .bin artifact\")\n .option(\"--no-build\", \"skip building the project\")\n .option(\"--port\", \"serial port path or id, defaults to V5X_PORT\")\n .option(\"--json\", \"print machine-readable JSON\")\n .action((path: string | undefined, options: UploadCommandOptions) =>\n uploadProgramFromCommand(path, options, true),\n );\n}\n",
|
|
49
|
+
"import type { Sade } from \"sade\";\nimport { deflateSync } from \"node:zlib\";\nimport { type PortSelectionOptions, withSelectedV5Device } from \"../device\";\nimport { printJson, unwrapSerial } from \"../utils/output\";\n\nconst WIDTH = 480;\nconst HEIGHT = 272;\nconst ROW_BYTES = WIDTH * 3;\ntype ScreenshotFormat = \"png\" | \"ppm\";\n\nfunction assertScreenshotSize(bytes: Uint8Array): void {\n if (bytes.length !== ROW_BYTES * HEIGHT) {\n throw new Error(`bad screenshot size: ${bytes.length}`);\n }\n}\n\nfunction crc32(bytes: Uint8Array): number {\n let crc = 0xffffffff;\n for (const byte of bytes) {\n crc ^= byte;\n for (let bit = 0; bit < 8; bit++) {\n crc = (crc >>> 1) ^ (crc & 1 ? 0xedb88320 : 0);\n }\n }\n return (crc ^ 0xffffffff) >>> 0;\n}\n\nfunction pngChunk(type: string, data: Uint8Array): Buffer {\n const chunk = Buffer.alloc(12 + data.length);\n chunk.writeUInt32BE(data.length, 0);\n chunk.write(type, 4, \"ascii\");\n chunk.set(data, 8);\n chunk.writeUInt32BE(\n crc32(chunk.subarray(4, 8 + data.length)),\n 8 + data.length,\n );\n return chunk;\n}\n\nexport function encodeScreenshotPng(bytes: Uint8Array): Buffer {\n assertScreenshotSize(bytes);\n\n // Each PNG scanline is prefixed with a zeroed filter byte.\n const raw = Buffer.alloc((1 + ROW_BYTES) * HEIGHT);\n for (let y = 0; y < HEIGHT; y++) {\n raw.set(\n bytes.subarray(y * ROW_BYTES, (y + 1) * ROW_BYTES),\n y * (1 + ROW_BYTES) + 1,\n );\n }\n\n const ihdr = Buffer.alloc(13);\n ihdr.writeUInt32BE(WIDTH, 0);\n ihdr.writeUInt32BE(HEIGHT, 4);\n ihdr[8] = 8; // bit depth\n ihdr[9] = 2; // truecolor\n\n return Buffer.concat([\n Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]),\n pngChunk(\"IHDR\", ihdr),\n pngChunk(\"IDAT\", deflateSync(raw)),\n pngChunk(\"IEND\", new Uint8Array()),\n ]);\n}\n\nexport function encodeScreenshotPpm(bytes: Uint8Array): Buffer {\n assertScreenshotSize(bytes);\n return Buffer.concat([\n Buffer.from(`P6\\n${WIDTH} ${HEIGHT}\\n255\\n`, \"ascii\"),\n bytes,\n ]);\n}\n\nexport function parseScreenshotFormat(\n format: string | undefined,\n): ScreenshotFormat {\n if (format === undefined || format === \"png\" || format === \"ppm\") {\n return format ?? \"png\";\n }\n throw new Error(\"--format must be png or ppm\");\n}\n\nexport function toScreenshotJson(\n output: string,\n format: ScreenshotFormat,\n bytes: number,\n) {\n return {\n output,\n format,\n width: WIDTH,\n height: HEIGHT,\n bytes,\n };\n}\n\nexport function assertScreenshotOptions(options: {\n output?: string;\n json?: boolean;\n}): void {\n if (options.json === true && options.output === undefined)\n throw new Error(\"--json requires --output\");\n}\n\nexport function shouldPrintKittyRgb(): boolean {\n return process.stdout.isTTY === true;\n}\n\nfunction printKittyRgb(bytes: Uint8Array): void {\n assertScreenshotSize(bytes);\n const base64 = Buffer.from(bytes).toString(\"base64\");\n process.stdout.write(\n `\\x1b_Ga=T,f=24,s=${WIDTH},v=${HEIGHT},c=40;${base64}\\x1b\\\\\\n`,\n );\n}\n\nexport default function registerScreenshotCommand(program: Sade) {\n program\n .command(\"screenshot\", \"take a screen capture of the brain\", {\n alias: \"sc\",\n })\n .option(\"-o, --output\", \"write the screenshot to a file\")\n .option(\"--format\", \"file format for --output: png or ppm\", \"png\")\n .option(\"--port\", \"serial port path or id, defaults to V5X_PORT\")\n .option(\"--json\", \"print machine-readable JSON\")\n .action(\n async (\n options: {\n output?: string;\n format?: string;\n json?: boolean;\n } & PortSelectionOptions,\n ) => {\n const format = parseScreenshotFormat(options.format);\n assertScreenshotOptions(options);\n await withSelectedV5Device(options, async (device) => {\n const frame = unwrapSerial(\n await device.brain.captureScreen(),\n \"failed to capture screenshot\",\n );\n if (options.output === undefined) {\n if (shouldPrintKittyRgb()) printKittyRgb(frame);\n else\n console.error(\"use --output to write the screenshot to a file\");\n return;\n }\n\n const data =\n format === \"png\"\n ? encodeScreenshotPng(frame)\n : encodeScreenshotPpm(frame);\n await Bun.write(options.output, data);\n if (options.json === true)\n printJson(toScreenshotJson(options.output, format, data.length));\n else console.log(`wrote ${options.output}`);\n });\n },\n );\n}\n",
|
|
50
|
+
"import type { Sade } from \"sade\";\nimport {\n uploadProgramFromCommand,\n type UploadCommandOptions,\n} from \"../utils/upload\";\n\nexport default function registerUploadCommand(program: Sade) {\n program\n .command(\"upload [path]\", \"build and upload a program to the V5 brain\", {\n alias: \"u\",\n })\n .option(\"-s, --slot\", \"program slot\", \"1\")\n .option(\"-n, --name\", \"program name shown on the brain\")\n .option(\"-d, --description\", \"program description\")\n .option(\"-i, --icon\", \"program icon file\", \"default.bmp\")\n .option(\"-f, --file\", \"upload an existing .bin artifact\")\n .option(\"--no-build\", \"skip building the project\")\n .option(\"--run\", \"start the program after uploading\")\n .option(\"--port\", \"serial port path or id, defaults to V5X_PORT\")\n .option(\"--json\", \"print machine-readable JSON\")\n .action((path: string | undefined, options: UploadCommandOptions) =>\n uploadProgramFromCommand(path, options, false),\n );\n}\n",
|
|
51
|
+
"#!/usr/bin/env bun\n\nimport sade from \"sade\";\nimport pkg from \"../package.json\" with { type: \"json\" };\nimport build from \"./commands/build\";\nimport cat from \"./commands/cat\";\nimport clean from \"./commands/clean\";\nimport devices from \"./commands/devices\";\nimport dir from \"./commands/dir\";\nimport doctor from \"./commands/doctor\";\nimport init from \"./commands/init\";\nimport install from \"./commands/install\";\nimport kv from \"./commands/kv\";\nimport newProject from \"./commands/new\";\nimport programs from \"./commands/programs\";\nimport rm from \"./commands/rm\";\nimport run from \"./commands/run\";\nimport screenshot from \"./commands/screenshot\";\nimport upload from \"./commands/upload\";\n\nconst program = sade(\"v5x\").version(pkg.version).describe(pkg.description);\n\nconst commands = [\n build,\n clean,\n upload,\n run,\n programs,\n newProject,\n init,\n dir,\n doctor,\n cat,\n rm,\n devices,\n screenshot,\n install,\n kv,\n];\nfor (const register of commands) register(program);\n\ntry {\n await program.parse(process.argv);\n} catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n}\n"
|
|
52
|
+
],
|
|
53
|
+
"mappings": "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",
|
|
54
|
+
"debugId": "06B01D0AC71C1A8C64756E2164756E21",
|
|
55
|
+
"names": []
|
|
56
|
+
}
|