/** * Loads lib/edit-key-parse.js in an isolated function scope (same source as /bin/edit preamble). */ import assert from 'node:assert/strict' import { readFileSync } from 'node:fs' import { dirname, join } from 'node:path' import { fileURLToPath } from 'node:url' const __dirname = dirname(fileURLToPath(import.meta.url)) const parseSrc = readFileSync(join(__dirname, '../lib/edit-key-parse.js'), 'utf8') const hook = {} new Function( 'exports', `${parseSrc}\nexports.bareEditTryConsumeKey = bareEditTryConsumeKey;` )(hook) const { bareEditTryConsumeKey } = hook function consumeAll(bytes) { const q = [...bytes] const out = [] while (q.length) { const ev = bareEditTryConsumeKey(q) assert.ok(ev, 'expected complete key, queue=' + JSON.stringify(q)) out.push(ev) } return out } assert.equal(bareEditTryConsumeKey([97])?.type, 'key') assert.equal(bareEditTryConsumeKey([97])?.ch, 'a') const upCsi = consumeAll([27, 91, 65]) assert.deepEqual(upCsi, [{ type: 'nav', key: 'up' }]) const upCsiNum = consumeAll([27, 91, 49, 59, 53, 65]) assert.deepEqual(upCsiNum, [{ type: 'nav', key: 'up' }]) const leftCsi = consumeAll([27, 91, 68]) assert.deepEqual(leftCsi, [{ type: 'nav', key: 'left' }]) const stabCsi = consumeAll([27, 91, 90]) assert.deepEqual(stabCsi, [{ type: 'nav', key: 'stab' }]) const stabCsiMod = consumeAll([27, 91, 49, 59, 50, 90]) assert.deepEqual(stabCsiMod, [{ type: 'nav', key: 'stab' }]) const tabKey = consumeAll([9]) assert.deepEqual(tabKey, [{ type: 'key', ch: '\t' }]) const ss3Up = consumeAll([27, 79, 65]) assert.deepEqual(ss3Up, [{ type: 'nav', key: 'up' }]) const ss3Left = consumeAll([27, 79, 68]) assert.deepEqual(ss3Left, [{ type: 'nav', key: 'left' }]) const del = consumeAll([27, 91, 51, 126]) assert.deepEqual(del, [{ type: 'ctrl', code: 'delete' }]) /* ESC must not be consumed as generic ctrl before CSI: order test */ const q = [27, 91, 66] const ev1 = bareEditTryConsumeKey(q) assert.deepEqual(ev1, { type: 'nav', key: 'down' }) assert.equal(q.length, 0) /* Incomplete CSI waits for more bytes */ const q2 = [27, 91] assert.equal(bareEditTryConsumeKey(q2), null) assert.deepEqual(q2, [27, 91]) q2.push(67) const ev2 = bareEditTryConsumeKey(q2) assert.deepEqual(ev2, { type: 'nav', key: 'right' }) console.log('edit-key-parse tests ok')