@thermal-label/brother-ql-node 0.0.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/discovery.test.js +141 -68
- package/dist/__tests__/discovery.test.js.map +1 -1
- package/dist/__tests__/integration/print.test.d.ts +2 -0
- package/dist/__tests__/integration/print.test.d.ts.map +1 -0
- package/dist/__tests__/integration/print.test.js +71 -0
- package/dist/__tests__/integration/print.test.js.map +1 -0
- package/dist/__tests__/printer.test.js +214 -208
- package/dist/__tests__/printer.test.js.map +1 -1
- package/dist/discovery.d.ts +39 -4
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +87 -14
- package/dist/discovery.js.map +1 -1
- package/dist/index.d.ts +3 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -6
- package/dist/index.js.map +1 -1
- package/dist/printer.d.ts +38 -15
- package/dist/printer.d.ts.map +1 -1
- package/dist/printer.js +108 -149
- package/dist/printer.js.map +1 -1
- package/package.json +7 -5
- package/dist/__tests__/errors.test.d.ts +0 -2
- package/dist/__tests__/errors.test.d.ts.map +0 -1
- package/dist/__tests__/errors.test.js +0 -20
- package/dist/__tests__/errors.test.js.map +0 -1
- package/dist/__tests__/integration/print-image.test.d.ts +0 -2
- package/dist/__tests__/integration/print-image.test.d.ts.map +0 -1
- package/dist/__tests__/integration/print-image.test.js +0 -22
- package/dist/__tests__/integration/print-image.test.js.map +0 -1
- package/dist/__tests__/integration/print-text.test.d.ts +0 -2
- package/dist/__tests__/integration/print-text.test.d.ts.map +0 -1
- package/dist/__tests__/integration/print-text.test.js +0 -25
- package/dist/__tests__/integration/print-text.test.js.map +0 -1
- package/dist/__tests__/integration/print-two-color.test.d.ts +0 -2
- package/dist/__tests__/integration/print-two-color.test.d.ts.map +0 -1
- package/dist/__tests__/integration/print-two-color.test.js +0 -28
- package/dist/__tests__/integration/print-two-color.test.js.map +0 -1
- package/dist/__tests__/integration/tcp.test.d.ts +0 -2
- package/dist/__tests__/integration/tcp.test.d.ts.map +0 -1
- package/dist/__tests__/integration/tcp.test.js +0 -20
- package/dist/__tests__/integration/tcp.test.js.map +0 -1
- package/dist/__tests__/tcp-transport.test.d.ts +0 -2
- package/dist/__tests__/tcp-transport.test.d.ts.map +0 -1
- package/dist/__tests__/tcp-transport.test.js +0 -115
- package/dist/__tests__/tcp-transport.test.js.map +0 -1
- package/dist/__tests__/usb-transport.test.d.ts +0 -2
- package/dist/__tests__/usb-transport.test.d.ts.map +0 -1
- package/dist/__tests__/usb-transport.test.js +0 -99
- package/dist/__tests__/usb-transport.test.js.map +0 -1
- package/dist/errors.d.ts +0 -8
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js +0 -15
- package/dist/errors.js.map +0 -1
- package/dist/status.d.ts +0 -2
- package/dist/status.d.ts.map +0 -1
- package/dist/status.js +0 -2
- package/dist/status.js.map +0 -1
- package/dist/transport.d.ts +0 -32
- package/dist/transport.d.ts.map +0 -1
- package/dist/transport.js +0 -120
- package/dist/transport.js.map +0 -1
- package/dist/types.d.ts +0 -13
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
|
@@ -1,77 +1,150 @@
|
|
|
1
|
-
import {
|
|
2
|
-
const
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
const { usbOpen, tcpConnect, serialOpen } = vi.hoisted(() => ({
|
|
3
|
+
usbOpen: vi.fn(),
|
|
4
|
+
tcpConnect: vi.fn(),
|
|
5
|
+
serialOpen: vi.fn(),
|
|
6
|
+
}));
|
|
7
|
+
vi.mock('@thermal-label/transport/node', () => ({
|
|
8
|
+
UsbTransport: { open: usbOpen },
|
|
9
|
+
TcpTransport: { connect: tcpConnect },
|
|
10
|
+
SerialTransport: { open: serialOpen },
|
|
11
|
+
}));
|
|
5
12
|
vi.mock('usb', () => ({
|
|
6
|
-
|
|
7
|
-
getDeviceList: vi.fn(() => []),
|
|
8
|
-
},
|
|
13
|
+
getDeviceList: vi.fn(() => []),
|
|
9
14
|
}));
|
|
15
|
+
import * as usb from 'usb';
|
|
16
|
+
import { discovery } from '../discovery.js';
|
|
17
|
+
function fakeTransport() {
|
|
18
|
+
return {
|
|
19
|
+
connected: true,
|
|
20
|
+
write: vi.fn(),
|
|
21
|
+
read: vi.fn(),
|
|
22
|
+
close: vi.fn(),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function makeUsbDevice(idVendor, idProduct, serialNumber) {
|
|
26
|
+
return {
|
|
27
|
+
deviceDescriptor: {
|
|
28
|
+
idVendor,
|
|
29
|
+
idProduct,
|
|
30
|
+
iSerialNumber: serialNumber ? 3 : 0,
|
|
31
|
+
},
|
|
32
|
+
busNumber: 1,
|
|
33
|
+
deviceAddress: 2,
|
|
34
|
+
open: vi.fn(),
|
|
35
|
+
close: vi.fn(),
|
|
36
|
+
getStringDescriptor: vi.fn((_idx, cb) => {
|
|
37
|
+
cb(null, serialNumber);
|
|
38
|
+
}),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {
|
|
42
|
+
/* suppress */
|
|
43
|
+
});
|
|
10
44
|
beforeEach(() => {
|
|
11
|
-
|
|
45
|
+
usbOpen.mockReset();
|
|
46
|
+
tcpConnect.mockReset();
|
|
47
|
+
serialOpen.mockReset();
|
|
48
|
+
warnSpy.mockClear();
|
|
49
|
+
vi.mocked(usb.getDeviceList).mockReset().mockReturnValue([]);
|
|
12
50
|
});
|
|
13
|
-
describe('
|
|
14
|
-
it('
|
|
15
|
-
|
|
16
|
-
vi.mocked(usb.default.getDeviceList).mockReturnValueOnce([
|
|
17
|
-
{
|
|
18
|
-
deviceDescriptor: { idVendor: 0x04f9, idProduct: 0x20a7 },
|
|
19
|
-
busNumber: 1,
|
|
20
|
-
deviceAddress: 3,
|
|
21
|
-
},
|
|
22
|
-
]);
|
|
23
|
-
const { listPrinters } = await import('../discovery.js');
|
|
24
|
-
const printers = listPrinters();
|
|
25
|
-
expect(printers).toHaveLength(1);
|
|
26
|
-
expect(printers[0].device.name).toBe('QL-820NWB');
|
|
27
|
-
expect(printers[0].transport).toBe('usb');
|
|
28
|
-
});
|
|
29
|
-
it('excludes unknown (non-Brother) USB devices', async () => {
|
|
30
|
-
const usb = await import('usb');
|
|
31
|
-
vi.mocked(usb.default.getDeviceList).mockReturnValueOnce([
|
|
32
|
-
{
|
|
33
|
-
deviceDescriptor: { idVendor: 0x1234, idProduct: 0x5678 },
|
|
34
|
-
busNumber: 1,
|
|
35
|
-
deviceAddress: 1,
|
|
36
|
-
},
|
|
37
|
-
]);
|
|
38
|
-
const { listPrinters } = await import('../discovery.js');
|
|
39
|
-
const printers = listPrinters();
|
|
40
|
-
expect(printers).toHaveLength(0);
|
|
41
|
-
});
|
|
42
|
-
it('excludes mass storage mode PIDs and logs a warning', async () => {
|
|
43
|
-
const usb = await import('usb');
|
|
44
|
-
vi.mocked(usb.default.getDeviceList).mockReturnValueOnce([
|
|
45
|
-
{
|
|
46
|
-
deviceDescriptor: { idVendor: 0x04f9, idProduct: 0x20aa },
|
|
47
|
-
busNumber: 1,
|
|
48
|
-
deviceAddress: 2,
|
|
49
|
-
},
|
|
50
|
-
]);
|
|
51
|
-
const { listPrinters } = await import('../discovery.js');
|
|
52
|
-
const printers = listPrinters();
|
|
53
|
-
expect(printers).toHaveLength(0);
|
|
54
|
-
expect(consoleSpy).toHaveBeenCalledOnce();
|
|
55
|
-
expect(consoleSpy.mock.calls[0][0]).toContain('Editor Lite');
|
|
51
|
+
describe('BrotherQLDiscovery', () => {
|
|
52
|
+
it('exposes the brother-ql family', () => {
|
|
53
|
+
expect(discovery.family).toBe('brother-ql');
|
|
56
54
|
});
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
55
|
+
describe('listPrinters', () => {
|
|
56
|
+
it('returns known Brother QL devices from USB enumeration', async () => {
|
|
57
|
+
vi.mocked(usb.getDeviceList).mockReturnValueOnce([makeUsbDevice(0x04f9, 0x20a7)]);
|
|
58
|
+
const printers = await discovery.listPrinters();
|
|
59
|
+
expect(printers).toHaveLength(1);
|
|
60
|
+
expect(printers[0].device.name).toBe('QL-820NWB');
|
|
61
|
+
expect(printers[0].transport).toBe('usb');
|
|
62
|
+
expect(printers[0].connectionId).toBe('1.2');
|
|
63
|
+
});
|
|
64
|
+
it('excludes unknown (non-Brother) USB devices', async () => {
|
|
65
|
+
vi.mocked(usb.getDeviceList).mockReturnValueOnce([makeUsbDevice(0x1234, 0x5678)]);
|
|
66
|
+
expect(await discovery.listPrinters()).toHaveLength(0);
|
|
67
|
+
});
|
|
68
|
+
it('excludes Brother-VID devices with unknown PIDs', async () => {
|
|
69
|
+
// Brother VID but not in the DEVICES registry and not a mass-storage PID
|
|
70
|
+
vi.mocked(usb.getDeviceList).mockReturnValueOnce([makeUsbDevice(0x04f9, 0x9999)]);
|
|
71
|
+
expect(await discovery.listPrinters()).toHaveLength(0);
|
|
72
|
+
expect(warnSpy).not.toHaveBeenCalled();
|
|
73
|
+
});
|
|
74
|
+
it('excludes mass-storage PIDs and warns', async () => {
|
|
75
|
+
vi.mocked(usb.getDeviceList).mockReturnValueOnce([makeUsbDevice(0x04f9, 0x20aa)]);
|
|
76
|
+
expect(await discovery.listPrinters()).toHaveLength(0);
|
|
77
|
+
expect(warnSpy).toHaveBeenCalledOnce();
|
|
78
|
+
});
|
|
79
|
+
it('reads the serial number when iSerialNumber is set', async () => {
|
|
80
|
+
vi.mocked(usb.getDeviceList).mockReturnValueOnce([
|
|
81
|
+
makeUsbDevice(0x04f9, 0x20a7, 'SN123'),
|
|
82
|
+
]);
|
|
83
|
+
const [printer] = await discovery.listPrinters();
|
|
84
|
+
expect(printer?.serialNumber).toBe('SN123');
|
|
85
|
+
});
|
|
86
|
+
it('swallows serial-read errors and leaves serialNumber undefined', async () => {
|
|
87
|
+
const device = makeUsbDevice(0x04f9, 0x20a7, 'ignored');
|
|
88
|
+
device.getStringDescriptor.mockImplementation((_idx, cb) => {
|
|
89
|
+
cb(new Error('descriptor read failed'));
|
|
90
|
+
});
|
|
91
|
+
vi.mocked(usb.getDeviceList).mockReturnValueOnce([device]);
|
|
92
|
+
const [printer] = await discovery.listPrinters();
|
|
93
|
+
expect(printer?.serialNumber).toBeUndefined();
|
|
94
|
+
});
|
|
61
95
|
});
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
96
|
+
describe('openPrinter', () => {
|
|
97
|
+
it('opens a USB printer via UsbTransport', async () => {
|
|
98
|
+
vi.mocked(usb.getDeviceList).mockReturnValueOnce([makeUsbDevice(0x04f9, 0x20a7)]);
|
|
99
|
+
usbOpen.mockResolvedValue(fakeTransport());
|
|
100
|
+
const printer = await discovery.openPrinter();
|
|
101
|
+
expect(printer.device.pid).toBe(0x20a7);
|
|
102
|
+
expect(usbOpen).toHaveBeenCalledWith(0x04f9, 0x20a7);
|
|
103
|
+
});
|
|
104
|
+
it('filters by VID/PID when multiple devices are attached', async () => {
|
|
105
|
+
vi.mocked(usb.getDeviceList).mockReturnValueOnce([
|
|
106
|
+
makeUsbDevice(0x04f9, 0x20a7),
|
|
107
|
+
makeUsbDevice(0x04f9, 0x209b),
|
|
108
|
+
]);
|
|
109
|
+
usbOpen.mockResolvedValue(fakeTransport());
|
|
110
|
+
const printer = await discovery.openPrinter({ vid: 0x04f9, pid: 0x209b });
|
|
111
|
+
expect(printer.device.pid).toBe(0x209b);
|
|
112
|
+
expect(usbOpen).toHaveBeenCalledWith(0x04f9, 0x209b);
|
|
113
|
+
});
|
|
114
|
+
it('filters by serialNumber when multiple devices share a PID', async () => {
|
|
115
|
+
vi.mocked(usb.getDeviceList).mockReturnValueOnce([
|
|
116
|
+
makeUsbDevice(0x04f9, 0x20a7, 'SN-A'),
|
|
117
|
+
makeUsbDevice(0x04f9, 0x20a7, 'SN-TARGET'),
|
|
118
|
+
]);
|
|
119
|
+
usbOpen.mockResolvedValue(fakeTransport());
|
|
120
|
+
const printer = await discovery.openPrinter({ serialNumber: 'SN-TARGET' });
|
|
121
|
+
expect(printer.device.pid).toBe(0x20a7);
|
|
122
|
+
});
|
|
123
|
+
it('throws when no matching device is attached', async () => {
|
|
124
|
+
await expect(discovery.openPrinter()).rejects.toThrow('No compatible Brother QL printer found.');
|
|
125
|
+
});
|
|
126
|
+
it('opens a TCP printer when host is provided', async () => {
|
|
127
|
+
tcpConnect.mockResolvedValue(fakeTransport());
|
|
128
|
+
const printer = await discovery.openPrinter({ host: '192.168.1.100' });
|
|
129
|
+
expect(printer.transportType).toBe('tcp');
|
|
130
|
+
expect(tcpConnect).toHaveBeenCalledWith('192.168.1.100', undefined);
|
|
131
|
+
});
|
|
132
|
+
it('passes port override to TcpTransport', async () => {
|
|
133
|
+
tcpConnect.mockResolvedValue(fakeTransport());
|
|
134
|
+
await discovery.openPrinter({ host: '10.0.0.5', port: 9101 });
|
|
135
|
+
expect(tcpConnect).toHaveBeenCalledWith('10.0.0.5', 9101);
|
|
136
|
+
});
|
|
137
|
+
it('opens a serial printer when path is provided', async () => {
|
|
138
|
+
serialOpen.mockResolvedValue(fakeTransport());
|
|
139
|
+
const printer = await discovery.openPrinter({ path: '/dev/rfcomm0' });
|
|
140
|
+
expect(printer.transportType).toBe('serial');
|
|
141
|
+
expect(serialOpen).toHaveBeenCalledWith('/dev/rfcomm0', undefined);
|
|
142
|
+
});
|
|
143
|
+
it('forwards baudRate to SerialTransport', async () => {
|
|
144
|
+
serialOpen.mockResolvedValue(fakeTransport());
|
|
145
|
+
await discovery.openPrinter({ path: 'COM3', baudRate: 115200 });
|
|
146
|
+
expect(serialOpen).toHaveBeenCalledWith('COM3', 115200);
|
|
147
|
+
});
|
|
75
148
|
});
|
|
76
149
|
});
|
|
77
150
|
//# sourceMappingURL=discovery.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.test.js","sourceRoot":"","sources":["../../src/__tests__/discovery.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"discovery.test.js","sourceRoot":"","sources":["../../src/__tests__/discovery.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9D,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC5D,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;IAChB,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;IACnB,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;CACpB,CAAC,CAAC,CAAC;AACJ,EAAE,CAAC,IAAI,CAAC,+BAA+B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9C,YAAY,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;IAC/B,YAAY,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE;IACrC,eAAe,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;CACtC,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IACpB,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;CAC/B,CAAC,CAAC,CAAC;AAEJ,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,SAAS,aAAa;IAMpB,OAAO;QACL,SAAS,EAAE,IAAI;QACf,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;QACd,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;QACb,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;KACf,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,QAAgB,EAChB,SAAiB,EACjB,YAAqB;IASrB,OAAO;QACL,gBAAgB,EAAE;YAChB,QAAQ;YACR,SAAS;YACT,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACpC;QACD,SAAS,EAAE,CAAC;QACZ,aAAa,EAAE,CAAC;QAChB,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;QACb,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;QACd,mBAAmB,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,EAAuC,EAAE,EAAE;YACnF,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACzB,CAAC,CAAC;KACH,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE;IAChE,cAAc;AAChB,CAAC,CAAC,CAAC;AAEH,UAAU,CAAC,GAAG,EAAE;IACd,OAAO,CAAC,SAAS,EAAE,CAAC;IACpB,UAAU,CAAC,SAAS,EAAE,CAAC;IACvB,UAAU,CAAC,SAAS,EAAE,CAAC;IACvB,OAAO,CAAC,SAAS,EAAE,CAAC;IACpB,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,SAAS,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;AAC/D,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACrE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,mBAAmB,CAAC,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAU,CAAC,CAAC,CAAC;YAC3F,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC;YAChD,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACjC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACnD,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3C,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,mBAAmB,CAAC,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAU,CAAC,CAAC,CAAC;YAC3F,MAAM,CAAC,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,yEAAyE;YACzE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,mBAAmB,CAAC,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAU,CAAC,CAAC,CAAC;YAC3F,MAAM,CAAC,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACvD,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,mBAAmB,CAAC,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAU,CAAC,CAAC,CAAC;YAC3F,MAAM,CAAC,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACvD,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,mBAAmB,CAAC;gBAC/C,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAU;aAChD,CAAC,CAAC;YACH,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC;YACjD,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;YAC7E,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;YACxD,MAAM,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC,IAAY,EAAE,EAAwB,EAAE,EAAE;gBACvF,EAAE,CAAC,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,mBAAmB,CAAC,CAAC,MAAe,CAAC,CAAC,CAAC;YACpE,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC;YACjD,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,aAAa,EAAE,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,mBAAmB,CAAC,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAU,CAAC,CAAC,CAAC;YAC3F,OAAO,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAC,CAAC;YAE3C,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,WAAW,EAAE,CAAC;YAC9C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxC,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACrE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,mBAAmB,CAAC;gBAC/C,aAAa,CAAC,MAAM,EAAE,MAAM,CAAU;gBACtC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAU;aACvC,CAAC,CAAC;YACH,OAAO,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAC,CAAC;YAE3C,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1E,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxC,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;YACzE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,mBAAmB,CAAC;gBAC/C,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAU;gBAC9C,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAU;aACpD,CAAC,CAAC;YACH,OAAO,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAC,CAAC;YAE3C,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;YAC3E,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CACnD,yCAAyC,CAC1C,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,UAAU,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAC,CAAC;YAE9C,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;YACvE,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,UAAU,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAC,CAAC;YAE9C,MAAM,SAAS,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9D,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,UAAU,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAC,CAAC;YAE9C,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;YACtE,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7C,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,UAAU,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAC,CAAC;YAE9C,MAAM,SAAS,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YAChE,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"print.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/print.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { describe, it } from 'vitest';
|
|
2
|
+
const INTEGRATION = process.env.BROTHER_INTEGRATION === '1';
|
|
3
|
+
/*
|
|
4
|
+
* Hardware verification — skipped unless BROTHER_INTEGRATION=1.
|
|
5
|
+
*
|
|
6
|
+
* Pre-reqs:
|
|
7
|
+
* - Printer connected via USB (or TCP — set BROTHER_TCP_HOST)
|
|
8
|
+
* - DK-22205 (62mm continuous) or DK-22251 (two-colour) loaded
|
|
9
|
+
* - Editor Lite mode disabled on QL-820NWB
|
|
10
|
+
*/
|
|
11
|
+
describe.skipIf(!INTEGRATION)('Integration: brother-ql', () => {
|
|
12
|
+
it('prints a single-colour label via USB', async () => {
|
|
13
|
+
const { discovery } = await import('../../index.js');
|
|
14
|
+
const { MEDIA } = await import('@thermal-label/brother-ql-core');
|
|
15
|
+
const printer = await discovery.openPrinter();
|
|
16
|
+
try {
|
|
17
|
+
const image = {
|
|
18
|
+
width: 696,
|
|
19
|
+
height: 300,
|
|
20
|
+
data: new Uint8Array(696 * 300 * 4).fill(0),
|
|
21
|
+
};
|
|
22
|
+
await printer.print(image, MEDIA[259]);
|
|
23
|
+
}
|
|
24
|
+
finally {
|
|
25
|
+
await printer.close();
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
it('prints a two-colour label when DK-22251 is loaded', async () => {
|
|
29
|
+
const { discovery } = await import('../../index.js');
|
|
30
|
+
const { MEDIA } = await import('@thermal-label/brother-ql-core');
|
|
31
|
+
const printer = await discovery.openPrinter();
|
|
32
|
+
try {
|
|
33
|
+
if (!printer.device.twoColor) {
|
|
34
|
+
console.warn(`Skipping two-colour test: ${printer.device.name} is single-colour.`);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
// Red-dominant test image
|
|
38
|
+
const width = 696;
|
|
39
|
+
const height = 200;
|
|
40
|
+
const data = new Uint8Array(width * height * 4);
|
|
41
|
+
for (let i = 0; i < data.length; i += 4) {
|
|
42
|
+
data[i] = 255;
|
|
43
|
+
data[i + 3] = 255;
|
|
44
|
+
}
|
|
45
|
+
await printer.print({ width, height, data }, MEDIA[251]);
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
await printer.close();
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
it('prints via TCP when BROTHER_TCP_HOST is set', async () => {
|
|
52
|
+
const host = process.env.BROTHER_TCP_HOST;
|
|
53
|
+
if (!host)
|
|
54
|
+
return;
|
|
55
|
+
const { discovery } = await import('../../index.js');
|
|
56
|
+
const { MEDIA } = await import('@thermal-label/brother-ql-core');
|
|
57
|
+
const printer = await discovery.openPrinter({ host });
|
|
58
|
+
try {
|
|
59
|
+
const image = {
|
|
60
|
+
width: 696,
|
|
61
|
+
height: 200,
|
|
62
|
+
data: new Uint8Array(696 * 200 * 4).fill(0),
|
|
63
|
+
};
|
|
64
|
+
await printer.print(image, MEDIA[259]);
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
await printer.close();
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
//# sourceMappingURL=print.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"print.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/print.test.ts"],"names":[],"mappings":"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"}
|