@thermal-label/brother-ql-node 0.0.1
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 +76 -0
- package/dist/__tests__/discovery.test.d.ts +2 -0
- package/dist/__tests__/discovery.test.d.ts.map +1 -0
- package/dist/__tests__/discovery.test.js +77 -0
- package/dist/__tests__/discovery.test.js.map +1 -0
- package/dist/__tests__/errors.test.d.ts +2 -0
- package/dist/__tests__/errors.test.d.ts.map +1 -0
- package/dist/__tests__/errors.test.js +20 -0
- package/dist/__tests__/errors.test.js.map +1 -0
- package/dist/__tests__/integration/print-image.test.d.ts +2 -0
- package/dist/__tests__/integration/print-image.test.d.ts.map +1 -0
- package/dist/__tests__/integration/print-image.test.js +22 -0
- package/dist/__tests__/integration/print-image.test.js.map +1 -0
- package/dist/__tests__/integration/print-text.test.d.ts +2 -0
- package/dist/__tests__/integration/print-text.test.d.ts.map +1 -0
- package/dist/__tests__/integration/print-text.test.js +25 -0
- package/dist/__tests__/integration/print-text.test.js.map +1 -0
- package/dist/__tests__/integration/print-two-color.test.d.ts +2 -0
- package/dist/__tests__/integration/print-two-color.test.d.ts.map +1 -0
- package/dist/__tests__/integration/print-two-color.test.js +28 -0
- package/dist/__tests__/integration/print-two-color.test.js.map +1 -0
- package/dist/__tests__/integration/tcp.test.d.ts +2 -0
- package/dist/__tests__/integration/tcp.test.d.ts.map +1 -0
- package/dist/__tests__/integration/tcp.test.js +20 -0
- package/dist/__tests__/integration/tcp.test.js.map +1 -0
- package/dist/__tests__/printer.test.d.ts +2 -0
- package/dist/__tests__/printer.test.d.ts.map +1 -0
- package/dist/__tests__/printer.test.js +216 -0
- package/dist/__tests__/printer.test.js.map +1 -0
- package/dist/__tests__/tcp-transport.test.d.ts +2 -0
- package/dist/__tests__/tcp-transport.test.d.ts.map +1 -0
- package/dist/__tests__/tcp-transport.test.js +115 -0
- package/dist/__tests__/tcp-transport.test.js.map +1 -0
- package/dist/__tests__/usb-transport.test.d.ts +2 -0
- package/dist/__tests__/usb-transport.test.d.ts.map +1 -0
- package/dist/__tests__/usb-transport.test.js +99 -0
- package/dist/__tests__/usb-transport.test.js.map +1 -0
- package/dist/discovery.d.ts +5 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +31 -0
- package/dist/discovery.js.map +1 -0
- package/dist/errors.d.ts +8 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +15 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/printer.d.ts +18 -0
- package/dist/printer.d.ts.map +1 -0
- package/dist/printer.js +167 -0
- package/dist/printer.js.map +1 -0
- package/dist/status.d.ts +2 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +2 -0
- package/dist/status.js.map +1 -0
- package/dist/transport.d.ts +32 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +120 -0
- package/dist/transport.js.map +1 -0
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +76 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Mannes Brak
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# @thermal-label/brother-ql-node
|
|
2
|
+
|
|
3
|
+
Node.js USB and TCP driver for Brother QL label printers.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @thermal-label/brother-ql-node
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
For image file support (PNG/JPEG), also install:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
pnpm add @napi-rs/canvas
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Quick Start
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
import { openPrinter, MEDIA } from '@thermal-label/brother-ql-node';
|
|
21
|
+
|
|
22
|
+
const printer = await openPrinter();
|
|
23
|
+
await printer.printText('Hello QL', MEDIA[259]!);
|
|
24
|
+
await printer.close();
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Discover Printers
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
import { listPrinters } from '@thermal-label/brother-ql-node';
|
|
31
|
+
const printers = listPrinters();
|
|
32
|
+
console.log(printers);
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Print an Image
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
await printer.printImage('/path/to/image.png', MEDIA[259]!);
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Two-Color Printing (QL-800 series)
|
|
42
|
+
|
|
43
|
+
```ts
|
|
44
|
+
import { openPrinter, MEDIA, renderText } from '@thermal-label/brother-ql-node';
|
|
45
|
+
import { createBitmap } from '@mbtech-nl/bitmap';
|
|
46
|
+
|
|
47
|
+
const printer = await openPrinter();
|
|
48
|
+
const media = MEDIA[259]!;
|
|
49
|
+
const black = renderText('Hello', { scaleX: 2, scaleY: 2 });
|
|
50
|
+
const red = renderText('World', { scaleX: 2, scaleY: 2 });
|
|
51
|
+
await printer.printTwoColor(black, red, media);
|
|
52
|
+
await printer.close();
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## TCP/Network Printing
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
import { openPrinterTcp, MEDIA } from '@thermal-label/brother-ql-node';
|
|
59
|
+
|
|
60
|
+
const printer = await openPrinterTcp('192.168.1.100');
|
|
61
|
+
await printer.printText('Hello Network', MEDIA[259]!);
|
|
62
|
+
await printer.close();
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Requirements
|
|
66
|
+
|
|
67
|
+
- Node.js `>=24.0.0`
|
|
68
|
+
- Linux: add a udev rule for raw USB access without `sudo`:
|
|
69
|
+
```
|
|
70
|
+
SUBSYSTEM=="usb", ATTRS{idVendor}=="04f9", MODE="0666"
|
|
71
|
+
```
|
|
72
|
+
- `@napi-rs/canvas` is optional — required only for image file decoding
|
|
73
|
+
|
|
74
|
+
## License
|
|
75
|
+
|
|
76
|
+
MIT © Mannes Brak
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/discovery.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {
|
|
3
|
+
/* suppress */
|
|
4
|
+
});
|
|
5
|
+
vi.mock('usb', () => ({
|
|
6
|
+
default: {
|
|
7
|
+
getDeviceList: vi.fn(() => []),
|
|
8
|
+
},
|
|
9
|
+
}));
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
consoleSpy.mockClear();
|
|
12
|
+
});
|
|
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');
|
|
56
|
+
});
|
|
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);
|
|
61
|
+
});
|
|
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();
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=discovery.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.test.js","sourceRoot":"","sources":["../../src/__tests__/discovery.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/errors.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { UnsupportedOperationError, PrinterError } from '../errors.js';
|
|
3
|
+
describe('UnsupportedOperationError', () => {
|
|
4
|
+
it('sets name and message', () => {
|
|
5
|
+
const err = new UnsupportedOperationError('not supported');
|
|
6
|
+
expect(err.name).toBe('UnsupportedOperationError');
|
|
7
|
+
expect(err.message).toBe('not supported');
|
|
8
|
+
expect(err).toBeInstanceOf(Error);
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
describe('PrinterError', () => {
|
|
12
|
+
it('sets name, message, and errors array', () => {
|
|
13
|
+
const err = new PrinterError('printer failed', ['Cover open', 'No media']);
|
|
14
|
+
expect(err.name).toBe('PrinterError');
|
|
15
|
+
expect(err.message).toBe('printer failed');
|
|
16
|
+
expect(err.errors).toEqual(['Cover open', 'No media']);
|
|
17
|
+
expect(err).toBeInstanceOf(Error);
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=errors.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../src/__tests__/errors.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEvE,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,GAAG,GAAG,IAAI,yBAAyB,CAAC,eAAe,CAAC,CAAC;QAC3D,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACnD,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,gBAAgB,EAAE,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;QAC3E,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC3C,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"print-image.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/print-image.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { describe, it } from 'vitest';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
/*
|
|
4
|
+
* Hardware verification checklist:
|
|
5
|
+
* - Printer is powered on and connected via USB
|
|
6
|
+
* - 62mm continuous label loaded
|
|
7
|
+
* - Set BROTHER_INTEGRATION_IMAGE to a PNG/JPEG file path (optional)
|
|
8
|
+
* - Run: BROTHER_INTEGRATION=1 pnpm test
|
|
9
|
+
*/
|
|
10
|
+
describe('Integration: print image', () => {
|
|
11
|
+
it.skipIf(!process.env.BROTHER_INTEGRATION)('prints an image label via USB', async () => {
|
|
12
|
+
const { openPrinter, MEDIA } = await import('../../index.js');
|
|
13
|
+
const imagePath = process.env.BROTHER_INTEGRATION_IMAGE ?? join(import.meta.dirname, 'test.png');
|
|
14
|
+
const printer = await openPrinter();
|
|
15
|
+
const media = MEDIA[259];
|
|
16
|
+
if (!media)
|
|
17
|
+
throw new Error('Media 259 not found');
|
|
18
|
+
await printer.printImage(imagePath, media);
|
|
19
|
+
await printer.close();
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
//# sourceMappingURL=print-image.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"print-image.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/print-image.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;;;;GAMG;AACH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QACtF,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC9D,MAAM,SAAS,GACb,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACjF,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACnD,MAAM,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC3C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"print-text.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/print-text.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { describe, it } from 'vitest';
|
|
2
|
+
/*
|
|
3
|
+
* Hardware verification checklist:
|
|
4
|
+
* - Printer is powered on and connected via USB
|
|
5
|
+
* - Label is loaded (any width)
|
|
6
|
+
* - Editor Lite mode is disabled
|
|
7
|
+
* - Run: BROTHER_INTEGRATION=1 pnpm test
|
|
8
|
+
*
|
|
9
|
+
* Expected result:
|
|
10
|
+
* - Label prints with text "Hello QL Integration Test"
|
|
11
|
+
* - Auto-cut fires after label
|
|
12
|
+
* - No error thrown
|
|
13
|
+
*/
|
|
14
|
+
describe('Integration: print text', () => {
|
|
15
|
+
it.skipIf(!process.env.BROTHER_INTEGRATION)('prints a text label via USB', async () => {
|
|
16
|
+
const { openPrinter, MEDIA } = await import('../../index.js');
|
|
17
|
+
const printer = await openPrinter();
|
|
18
|
+
const media = MEDIA[259];
|
|
19
|
+
if (!media)
|
|
20
|
+
throw new Error('Media 259 not found');
|
|
21
|
+
await printer.printText('Hello QL Integration Test', media);
|
|
22
|
+
await printer.close();
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=print-text.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"print-text.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/print-text.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEtC;;;;;;;;;;;GAWG;AACH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACnD,MAAM,OAAO,CAAC,SAAS,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;QAC5D,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"print-two-color.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/print-two-color.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { describe, it } from 'vitest';
|
|
2
|
+
import { createBitmap } from '@mbtech-nl/bitmap';
|
|
3
|
+
/*
|
|
4
|
+
* Hardware verification checklist (QL-820NWB only):
|
|
5
|
+
* - QL-820NWB powered on, connected via USB
|
|
6
|
+
* - DK-22251 (black + red on white, 62mm continuous) label loaded
|
|
7
|
+
* - Editor Lite mode disabled
|
|
8
|
+
* - Run: BROTHER_INTEGRATION=1 pnpm test
|
|
9
|
+
*/
|
|
10
|
+
describe('Integration: print two-color (QL-820NWB)', () => {
|
|
11
|
+
it.skipIf(!process.env.BROTHER_INTEGRATION)('prints a two-color label via USB', async () => {
|
|
12
|
+
const { openPrinter, MEDIA, renderText } = await import('../../index.js');
|
|
13
|
+
const printer = await openPrinter();
|
|
14
|
+
if (!printer.device.twoColor) {
|
|
15
|
+
console.warn(`Skipping two-color test: ${printer.device.name} does not support two-color.`);
|
|
16
|
+
await printer.close();
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const media = MEDIA[259];
|
|
20
|
+
if (!media)
|
|
21
|
+
throw new Error('Media 259 not found');
|
|
22
|
+
const black = renderText('Hello', { scaleX: 2, scaleY: 2 });
|
|
23
|
+
const red = createBitmap(black.widthPx, black.heightPx);
|
|
24
|
+
await printer.printTwoColor(black, red, media);
|
|
25
|
+
await printer.close();
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
//# sourceMappingURL=print-two-color.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"print-two-color.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/print-two-color.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD;;;;;;GAMG;AACH,QAAQ,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACxD,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QACzF,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC1E,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,CAAC;QAEpC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,4BAA4B,OAAO,CAAC,MAAM,CAAC,IAAI,8BAA8B,CAAC,CAAC;YAC5F,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAEnD,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAExD,MAAM,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tcp.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/tcp.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { describe, it } from 'vitest';
|
|
2
|
+
/*
|
|
3
|
+
* Hardware verification checklist:
|
|
4
|
+
* - Network-capable Brother QL printer on the same network
|
|
5
|
+
* - Set BROTHER_TCP_HOST to the printer's IP address
|
|
6
|
+
* - Run: BROTHER_INTEGRATION=1 BROTHER_TCP_HOST=192.168.1.x pnpm test
|
|
7
|
+
*/
|
|
8
|
+
describe('Integration: TCP transport', () => {
|
|
9
|
+
it.skipIf(!process.env.BROTHER_INTEGRATION || !process.env.BROTHER_TCP_HOST)('prints a text label via TCP', async () => {
|
|
10
|
+
const { openPrinterTcp, MEDIA } = await import('../../index.js');
|
|
11
|
+
const host = process.env.BROTHER_TCP_HOST;
|
|
12
|
+
const printer = await openPrinterTcp(host);
|
|
13
|
+
const media = MEDIA[259];
|
|
14
|
+
if (!media)
|
|
15
|
+
throw new Error('Media 259 not found');
|
|
16
|
+
await printer.printText('Hello TCP Integration Test', media);
|
|
17
|
+
await printer.close();
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=tcp.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tcp.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/tcp.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEtC;;;;;GAKG;AACH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAC1E,6BAA6B,EAC7B,KAAK,IAAI,EAAE;QACT,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAiB,CAAC;QAC3C,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACnD,MAAM,OAAO,CAAC,SAAS,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;QAC7D,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC,CACF,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"printer.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/printer.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { createBitmap } from '@mbtech-nl/bitmap';
|
|
3
|
+
import { MEDIA, DEVICES } from '@thermal-label/brother-ql-core';
|
|
4
|
+
const mockWrite = vi.fn().mockImplementation(() => Promise.resolve());
|
|
5
|
+
const mockRead = vi.fn().mockResolvedValue(new Uint8Array(32).fill(0));
|
|
6
|
+
const mockClose = vi.fn().mockImplementation(() => Promise.resolve());
|
|
7
|
+
const mockTransport = {
|
|
8
|
+
write: mockWrite,
|
|
9
|
+
read: mockRead,
|
|
10
|
+
close: mockClose,
|
|
11
|
+
};
|
|
12
|
+
vi.mock('../transport.js', () => ({
|
|
13
|
+
UsbTransport: {
|
|
14
|
+
open: vi.fn().mockImplementation(() => Promise.resolve(mockTransport)),
|
|
15
|
+
},
|
|
16
|
+
TcpTransport: {
|
|
17
|
+
connect: vi.fn().mockImplementation(() => Promise.resolve(mockTransport)),
|
|
18
|
+
},
|
|
19
|
+
}));
|
|
20
|
+
vi.mock('../discovery.js', () => ({
|
|
21
|
+
listPrinters: vi.fn(() => [
|
|
22
|
+
{
|
|
23
|
+
device: DEVICES.QL_820NWB,
|
|
24
|
+
serialNumber: undefined,
|
|
25
|
+
path: '1.5',
|
|
26
|
+
transport: 'usb',
|
|
27
|
+
},
|
|
28
|
+
]),
|
|
29
|
+
DEVICES,
|
|
30
|
+
}));
|
|
31
|
+
const { mockLoadImage, mockCreateCanvas } = vi.hoisted(() => ({
|
|
32
|
+
mockLoadImage: vi.fn(),
|
|
33
|
+
mockCreateCanvas: vi.fn(),
|
|
34
|
+
}));
|
|
35
|
+
vi.mock('@napi-rs/canvas', () => ({
|
|
36
|
+
loadImage: mockLoadImage,
|
|
37
|
+
createCanvas: mockCreateCanvas,
|
|
38
|
+
}));
|
|
39
|
+
beforeEach(() => {
|
|
40
|
+
mockWrite.mockClear().mockImplementation(() => Promise.resolve());
|
|
41
|
+
mockRead.mockClear().mockResolvedValue(new Uint8Array(32).fill(0));
|
|
42
|
+
mockClose.mockClear().mockImplementation(() => Promise.resolve());
|
|
43
|
+
const mockContext = {
|
|
44
|
+
drawImage: vi.fn(),
|
|
45
|
+
getImageData: vi.fn().mockReturnValue({ data: new Uint8Array(400) }),
|
|
46
|
+
};
|
|
47
|
+
mockCreateCanvas
|
|
48
|
+
.mockReset()
|
|
49
|
+
.mockReturnValue({ getContext: vi.fn().mockReturnValue(mockContext) });
|
|
50
|
+
mockLoadImage.mockReset().mockResolvedValue({ width: 10, height: 10 });
|
|
51
|
+
});
|
|
52
|
+
describe('BrotherQLPrinter', () => {
|
|
53
|
+
it('print() writes the encoded byte stream via transport', async () => {
|
|
54
|
+
const { BrotherQLPrinter } = await import('../printer.js');
|
|
55
|
+
const printer = new BrotherQLPrinter(mockTransport, DEVICES.QL_820NWB, 'usb');
|
|
56
|
+
const bitmap = createBitmap(720, 10);
|
|
57
|
+
const media = MEDIA[259];
|
|
58
|
+
await printer.print([{ bitmap, media }]);
|
|
59
|
+
expect(mockWrite).toHaveBeenCalledOnce();
|
|
60
|
+
const written = mockWrite.mock.calls[0][0];
|
|
61
|
+
// Starts with ESC i a 01 (raster mode), then 200-byte invalidate
|
|
62
|
+
expect(written[0]).toBe(0x1b);
|
|
63
|
+
expect(written[1]).toBe(0x69);
|
|
64
|
+
expect(written[2]).toBe(0x61);
|
|
65
|
+
expect(written.at(-1)).toBe(0x1a);
|
|
66
|
+
});
|
|
67
|
+
it('getStatus() sends status request and parses 32-byte response', async () => {
|
|
68
|
+
const statusBytes = new Uint8Array(32);
|
|
69
|
+
statusBytes[0] = 0x80;
|
|
70
|
+
statusBytes[10] = 62;
|
|
71
|
+
statusBytes[11] = 0x0a;
|
|
72
|
+
mockRead.mockResolvedValueOnce(statusBytes);
|
|
73
|
+
const { BrotherQLPrinter } = await import('../printer.js');
|
|
74
|
+
const printer = new BrotherQLPrinter(mockTransport, DEVICES.QL_820NWB, 'usb');
|
|
75
|
+
const status = await printer.getStatus();
|
|
76
|
+
expect(mockWrite).toHaveBeenCalledOnce();
|
|
77
|
+
const req = mockWrite.mock.calls[0][0];
|
|
78
|
+
expect(req[0]).toBe(0x1b);
|
|
79
|
+
expect(req[1]).toBe(0x69);
|
|
80
|
+
expect(req[2]).toBe(0x53);
|
|
81
|
+
expect(status.mediaWidthMm).toBe(62);
|
|
82
|
+
expect(status.mediaType).toBe('continuous');
|
|
83
|
+
});
|
|
84
|
+
it('printTwoColor() throws UnsupportedOperationError on non-two-color device', async () => {
|
|
85
|
+
const { BrotherQLPrinter } = await import('../printer.js');
|
|
86
|
+
const { UnsupportedOperationError } = await import('../errors.js');
|
|
87
|
+
const printer = new BrotherQLPrinter(mockTransport, DEVICES.QL_700, 'usb');
|
|
88
|
+
const bitmap = createBitmap(720, 10);
|
|
89
|
+
const media = MEDIA[259];
|
|
90
|
+
await expect(printer.printTwoColor(bitmap, bitmap, media)).rejects.toThrow(UnsupportedOperationError);
|
|
91
|
+
});
|
|
92
|
+
it('printTwoColor() succeeds on two-color capable device', async () => {
|
|
93
|
+
const { BrotherQLPrinter } = await import('../printer.js');
|
|
94
|
+
const printer = new BrotherQLPrinter(mockTransport, DEVICES.QL_820NWB, 'usb');
|
|
95
|
+
const bitmap = createBitmap(720, 10);
|
|
96
|
+
const media = MEDIA[259];
|
|
97
|
+
await printer.printTwoColor(bitmap, bitmap, media);
|
|
98
|
+
expect(mockWrite).toHaveBeenCalledOnce();
|
|
99
|
+
});
|
|
100
|
+
it('printTwoColor() passes options through to print', async () => {
|
|
101
|
+
const { BrotherQLPrinter } = await import('../printer.js');
|
|
102
|
+
const printer = new BrotherQLPrinter(mockTransport, DEVICES.QL_820NWB, 'usb');
|
|
103
|
+
const bitmap = createBitmap(720, 10);
|
|
104
|
+
await printer.printTwoColor(bitmap, bitmap, MEDIA[259], { autoCut: true });
|
|
105
|
+
expect(mockWrite).toHaveBeenCalledOnce();
|
|
106
|
+
});
|
|
107
|
+
it('printText() renders text and writes via transport', async () => {
|
|
108
|
+
const { BrotherQLPrinter } = await import('../printer.js');
|
|
109
|
+
const printer = new BrotherQLPrinter(mockTransport, DEVICES.QL_820NWB, 'usb');
|
|
110
|
+
const media = MEDIA[259];
|
|
111
|
+
await printer.printText('hello', media);
|
|
112
|
+
expect(mockWrite).toHaveBeenCalledOnce();
|
|
113
|
+
});
|
|
114
|
+
it('printText() forwards invert option', async () => {
|
|
115
|
+
const { BrotherQLPrinter } = await import('../printer.js');
|
|
116
|
+
const printer = new BrotherQLPrinter(mockTransport, DEVICES.QL_820NWB, 'usb');
|
|
117
|
+
await printer.printText('hi', MEDIA[259], { invert: true });
|
|
118
|
+
expect(mockWrite).toHaveBeenCalledOnce();
|
|
119
|
+
});
|
|
120
|
+
it('printText() passes PageOptions through to print', async () => {
|
|
121
|
+
const { BrotherQLPrinter } = await import('../printer.js');
|
|
122
|
+
const printer = new BrotherQLPrinter(mockTransport, DEVICES.QL_820NWB, 'usb');
|
|
123
|
+
await printer.printText('hi', MEDIA[259], { autoCut: true });
|
|
124
|
+
expect(mockWrite).toHaveBeenCalledOnce();
|
|
125
|
+
});
|
|
126
|
+
it('printImage() decodes a Buffer and prints', async () => {
|
|
127
|
+
const { BrotherQLPrinter } = await import('../printer.js');
|
|
128
|
+
const printer = new BrotherQLPrinter(mockTransport, DEVICES.QL_820NWB, 'usb');
|
|
129
|
+
await printer.printImage(Buffer.alloc(100), MEDIA[259]);
|
|
130
|
+
expect(mockLoadImage).toHaveBeenCalledOnce();
|
|
131
|
+
expect(mockWrite).toHaveBeenCalledOnce();
|
|
132
|
+
});
|
|
133
|
+
it('printImage() loads an image from a file path', async () => {
|
|
134
|
+
const { BrotherQLPrinter } = await import('../printer.js');
|
|
135
|
+
const printer = new BrotherQLPrinter(mockTransport, DEVICES.QL_820NWB, 'usb');
|
|
136
|
+
await printer.printImage('/tmp/test.png', MEDIA[259]);
|
|
137
|
+
expect(mockLoadImage).toHaveBeenCalledWith('/tmp/test.png');
|
|
138
|
+
expect(mockWrite).toHaveBeenCalledOnce();
|
|
139
|
+
});
|
|
140
|
+
it('printImage() passes through options to renderImage', async () => {
|
|
141
|
+
const { BrotherQLPrinter } = await import('../printer.js');
|
|
142
|
+
const printer = new BrotherQLPrinter(mockTransport, DEVICES.QL_820NWB, 'usb');
|
|
143
|
+
await printer.printImage(Buffer.alloc(100), MEDIA[259], {
|
|
144
|
+
threshold: 100,
|
|
145
|
+
dither: true,
|
|
146
|
+
invert: true,
|
|
147
|
+
rotate: 90,
|
|
148
|
+
});
|
|
149
|
+
expect(mockWrite).toHaveBeenCalledOnce();
|
|
150
|
+
});
|
|
151
|
+
it('printImage() passes PageOptions through to print', async () => {
|
|
152
|
+
const { BrotherQLPrinter } = await import('../printer.js');
|
|
153
|
+
const printer = new BrotherQLPrinter(mockTransport, DEVICES.QL_820NWB, 'usb');
|
|
154
|
+
await printer.printImage(Buffer.alloc(100), MEDIA[259], { autoCut: true });
|
|
155
|
+
expect(mockWrite).toHaveBeenCalledOnce();
|
|
156
|
+
});
|
|
157
|
+
it('printImage() throws when canvas is unavailable for a buffer', async () => {
|
|
158
|
+
mockLoadImage.mockRejectedValueOnce(new Error('module not found'));
|
|
159
|
+
const { BrotherQLPrinter } = await import('../printer.js');
|
|
160
|
+
const printer = new BrotherQLPrinter(mockTransport, DEVICES.QL_820NWB, 'usb');
|
|
161
|
+
await expect(printer.printImage(Buffer.alloc(10), MEDIA[259])).rejects.toThrow('Cannot decode image buffer');
|
|
162
|
+
});
|
|
163
|
+
it('printImage() throws when canvas is unavailable for a file path', async () => {
|
|
164
|
+
mockLoadImage.mockRejectedValueOnce(new Error('module not found'));
|
|
165
|
+
const { BrotherQLPrinter } = await import('../printer.js');
|
|
166
|
+
const printer = new BrotherQLPrinter(mockTransport, DEVICES.QL_820NWB, 'usb');
|
|
167
|
+
await expect(printer.printImage('/tmp/test.png', MEDIA[259])).rejects.toThrow('Cannot load image file');
|
|
168
|
+
});
|
|
169
|
+
it('close() delegates to transport close', async () => {
|
|
170
|
+
const { BrotherQLPrinter } = await import('../printer.js');
|
|
171
|
+
const printer = new BrotherQLPrinter(mockTransport, DEVICES.QL_820NWB, 'usb');
|
|
172
|
+
await printer.close();
|
|
173
|
+
expect(mockClose).toHaveBeenCalledOnce();
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
describe('openPrinter', () => {
|
|
177
|
+
it('opens the first discovered printer when no options given', async () => {
|
|
178
|
+
const { openPrinter } = await import('../printer.js');
|
|
179
|
+
const printer = await openPrinter();
|
|
180
|
+
expect(printer.device.name).toBe('QL-820NWB');
|
|
181
|
+
expect(printer.transport).toBe('usb');
|
|
182
|
+
});
|
|
183
|
+
it('opens printer by vid and pid when specified', async () => {
|
|
184
|
+
const { openPrinter } = await import('../printer.js');
|
|
185
|
+
const printer = await openPrinter({ pid: DEVICES.QL_820NWB.pid, vid: DEVICES.QL_820NWB.vid });
|
|
186
|
+
expect(printer.device.name).toBe('QL-820NWB');
|
|
187
|
+
expect(printer.transport).toBe('usb');
|
|
188
|
+
});
|
|
189
|
+
it('throws for an unknown pid', async () => {
|
|
190
|
+
const { openPrinter } = await import('../printer.js');
|
|
191
|
+
await expect(openPrinter({ pid: 0x9999 })).rejects.toThrow('Unknown device');
|
|
192
|
+
});
|
|
193
|
+
it('throws when no printers are found', async () => {
|
|
194
|
+
const { listPrinters } = await import('../discovery.js');
|
|
195
|
+
vi.mocked(listPrinters).mockReturnValueOnce([]);
|
|
196
|
+
const { openPrinter } = await import('../printer.js');
|
|
197
|
+
await expect(openPrinter()).rejects.toThrow('No Brother QL printers found');
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
describe('openPrinterTcp', () => {
|
|
201
|
+
it('connects via TCP and returns a printer', async () => {
|
|
202
|
+
const { openPrinterTcp } = await import('../printer.js');
|
|
203
|
+
const printer = await openPrinterTcp('192.168.1.100');
|
|
204
|
+
expect(printer.transport).toBe('tcp');
|
|
205
|
+
expect(mockWrite).toHaveBeenCalledOnce();
|
|
206
|
+
expect(mockRead).toHaveBeenCalledOnce();
|
|
207
|
+
});
|
|
208
|
+
it('uses custom port when specified', async () => {
|
|
209
|
+
const { TcpTransport } = await import('../transport.js');
|
|
210
|
+
const { openPrinterTcp } = await import('../printer.js');
|
|
211
|
+
await openPrinterTcp('192.168.1.100', 4444);
|
|
212
|
+
const connectMock = vi.mocked(TcpTransport).connect;
|
|
213
|
+
expect(connectMock).toHaveBeenCalledWith('192.168.1.100', 4444);
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
//# sourceMappingURL=printer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"printer.test.js","sourceRoot":"","sources":["../../src/__tests__/printer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tcp-transport.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/tcp-transport.test.ts"],"names":[],"mappings":""}
|