@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.
Files changed (65) hide show
  1. package/dist/__tests__/discovery.test.js +141 -68
  2. package/dist/__tests__/discovery.test.js.map +1 -1
  3. package/dist/__tests__/integration/print.test.d.ts +2 -0
  4. package/dist/__tests__/integration/print.test.d.ts.map +1 -0
  5. package/dist/__tests__/integration/print.test.js +71 -0
  6. package/dist/__tests__/integration/print.test.js.map +1 -0
  7. package/dist/__tests__/printer.test.js +214 -208
  8. package/dist/__tests__/printer.test.js.map +1 -1
  9. package/dist/discovery.d.ts +39 -4
  10. package/dist/discovery.d.ts.map +1 -1
  11. package/dist/discovery.js +87 -14
  12. package/dist/discovery.js.map +1 -1
  13. package/dist/index.d.ts +3 -8
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +2 -6
  16. package/dist/index.js.map +1 -1
  17. package/dist/printer.d.ts +38 -15
  18. package/dist/printer.d.ts.map +1 -1
  19. package/dist/printer.js +108 -149
  20. package/dist/printer.js.map +1 -1
  21. package/package.json +7 -5
  22. package/dist/__tests__/errors.test.d.ts +0 -2
  23. package/dist/__tests__/errors.test.d.ts.map +0 -1
  24. package/dist/__tests__/errors.test.js +0 -20
  25. package/dist/__tests__/errors.test.js.map +0 -1
  26. package/dist/__tests__/integration/print-image.test.d.ts +0 -2
  27. package/dist/__tests__/integration/print-image.test.d.ts.map +0 -1
  28. package/dist/__tests__/integration/print-image.test.js +0 -22
  29. package/dist/__tests__/integration/print-image.test.js.map +0 -1
  30. package/dist/__tests__/integration/print-text.test.d.ts +0 -2
  31. package/dist/__tests__/integration/print-text.test.d.ts.map +0 -1
  32. package/dist/__tests__/integration/print-text.test.js +0 -25
  33. package/dist/__tests__/integration/print-text.test.js.map +0 -1
  34. package/dist/__tests__/integration/print-two-color.test.d.ts +0 -2
  35. package/dist/__tests__/integration/print-two-color.test.d.ts.map +0 -1
  36. package/dist/__tests__/integration/print-two-color.test.js +0 -28
  37. package/dist/__tests__/integration/print-two-color.test.js.map +0 -1
  38. package/dist/__tests__/integration/tcp.test.d.ts +0 -2
  39. package/dist/__tests__/integration/tcp.test.d.ts.map +0 -1
  40. package/dist/__tests__/integration/tcp.test.js +0 -20
  41. package/dist/__tests__/integration/tcp.test.js.map +0 -1
  42. package/dist/__tests__/tcp-transport.test.d.ts +0 -2
  43. package/dist/__tests__/tcp-transport.test.d.ts.map +0 -1
  44. package/dist/__tests__/tcp-transport.test.js +0 -115
  45. package/dist/__tests__/tcp-transport.test.js.map +0 -1
  46. package/dist/__tests__/usb-transport.test.d.ts +0 -2
  47. package/dist/__tests__/usb-transport.test.d.ts.map +0 -1
  48. package/dist/__tests__/usb-transport.test.js +0 -99
  49. package/dist/__tests__/usb-transport.test.js.map +0 -1
  50. package/dist/errors.d.ts +0 -8
  51. package/dist/errors.d.ts.map +0 -1
  52. package/dist/errors.js +0 -15
  53. package/dist/errors.js.map +0 -1
  54. package/dist/status.d.ts +0 -2
  55. package/dist/status.d.ts.map +0 -1
  56. package/dist/status.js +0 -2
  57. package/dist/status.js.map +0 -1
  58. package/dist/transport.d.ts +0 -32
  59. package/dist/transport.d.ts.map +0 -1
  60. package/dist/transport.js +0 -120
  61. package/dist/transport.js.map +0 -1
  62. package/dist/types.d.ts +0 -13
  63. package/dist/types.d.ts.map +0 -1
  64. package/dist/types.js +0 -2
  65. package/dist/types.js.map +0 -1
@@ -1,77 +1,150 @@
1
- import { describe, it, expect, vi, beforeEach } from 'vitest';
2
- const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {
3
- /* suppress */
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
- default: {
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
- consoleSpy.mockClear();
45
+ usbOpen.mockReset();
46
+ tcpConnect.mockReset();
47
+ serialOpen.mockReset();
48
+ warnSpy.mockClear();
49
+ vi.mocked(usb.getDeviceList).mockReset().mockReturnValue([]);
12
50
  });
13
- describe('listPrinters', () => {
14
- it('returns known Brother QL devices from USB enumeration', async () => {
15
- const usb = await import('usb');
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
- it('returns empty array when no printers connected', async () => {
58
- const { listPrinters } = await import('../discovery.js');
59
- const printers = listPrinters();
60
- expect(printers).toHaveLength(0);
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
- it('excludes Brother devices with unrecognized non-mass-storage PID', async () => {
63
- const usb = await import('usb');
64
- vi.mocked(usb.default.getDeviceList).mockReturnValueOnce([
65
- {
66
- deviceDescriptor: { idVendor: 0x04f9, idProduct: 0x9999 },
67
- busNumber: 1,
68
- deviceAddress: 4,
69
- },
70
- ]);
71
- const { listPrinters } = await import('../discovery.js');
72
- const printers = listPrinters();
73
- expect(printers).toHaveLength(0);
74
- expect(consoleSpy).not.toHaveBeenCalled();
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":"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"}
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=print.test.d.ts.map
@@ -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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"}