@thermal-label/brother-ql-core 0.3.0 → 0.5.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 (54) hide show
  1. package/README.md +1 -1
  2. package/data/devices.json +823 -0
  3. package/data/media.json +823 -0
  4. package/dist/__tests__/devices.test.js +112 -31
  5. package/dist/__tests__/devices.test.js.map +1 -1
  6. package/dist/__tests__/media.test.js +251 -1
  7. package/dist/__tests__/media.test.js.map +1 -1
  8. package/dist/__tests__/protocol.test.js +168 -1
  9. package/dist/__tests__/protocol.test.js.map +1 -1
  10. package/dist/__tests__/status.test.js +71 -0
  11. package/dist/__tests__/status.test.js.map +1 -1
  12. package/dist/devices.d.ts +13 -270
  13. package/dist/devices.d.ts.map +1 -1
  14. package/dist/devices.generated.d.ts +696 -0
  15. package/dist/devices.generated.d.ts.map +1 -0
  16. package/dist/devices.generated.js +831 -0
  17. package/dist/devices.generated.js.map +1 -0
  18. package/dist/devices.js +28 -272
  19. package/dist/devices.js.map +1 -1
  20. package/dist/index.d.ts +13 -5
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +10 -3
  23. package/dist/index.js.map +1 -1
  24. package/dist/media.d.ts +37 -22
  25. package/dist/media.d.ts.map +1 -1
  26. package/dist/media.generated.d.ts +4 -0
  27. package/dist/media.generated.d.ts.map +1 -0
  28. package/dist/media.generated.js +1640 -0
  29. package/dist/media.generated.js.map +1 -0
  30. package/dist/media.js +74 -281
  31. package/dist/media.js.map +1 -1
  32. package/dist/protocol.d.ts +54 -3
  33. package/dist/protocol.d.ts.map +1 -1
  34. package/dist/protocol.js +117 -18
  35. package/dist/protocol.js.map +1 -1
  36. package/dist/status.d.ts +4 -1
  37. package/dist/status.d.ts.map +1 -1
  38. package/dist/status.js +6 -2
  39. package/dist/status.js.map +1 -1
  40. package/dist/types.d.ts +92 -27
  41. package/dist/types.d.ts.map +1 -1
  42. package/package.json +13 -9
  43. package/src/__tests__/devices.test.ts +122 -32
  44. package/src/__tests__/media.test.ts +287 -1
  45. package/src/__tests__/protocol.test.ts +209 -0
  46. package/src/__tests__/status.test.ts +87 -0
  47. package/src/devices.generated.ts +840 -0
  48. package/src/devices.ts +30 -272
  49. package/src/index.ts +28 -4
  50. package/src/media.generated.ts +1644 -0
  51. package/src/media.ts +86 -282
  52. package/src/protocol.ts +196 -18
  53. package/src/status.ts +10 -3
  54. package/src/types.ts +93 -27
@@ -0,0 +1,831 @@
1
+ export const DEVICE_REGISTRY = {
2
+ "schemaVersion": 1,
3
+ "driver": "brother-ql",
4
+ "devices": [
5
+ {
6
+ "key": "PT_E550W",
7
+ "name": "PT-E550W",
8
+ "family": "brother-ql",
9
+ "transports": {
10
+ "usb": {
11
+ "vid": "0x04f9",
12
+ "pid": "0x2060"
13
+ },
14
+ "tcp": {
15
+ "port": 9100
16
+ }
17
+ },
18
+ "engines": [
19
+ {
20
+ "role": "primary",
21
+ "protocol": "pt-raster",
22
+ "dpi": 180,
23
+ "headDots": 128,
24
+ "mediaCompatibility": [
25
+ "tze",
26
+ "hse-2to1",
27
+ "hse-3to1"
28
+ ],
29
+ "capabilities": {
30
+ "autocut": true,
31
+ "mediaDetection": true,
32
+ "highResDpi": 360
33
+ }
34
+ }
35
+ ],
36
+ "hardwareQuirks": "Cutter requires compression to be enabled — encoder enforces this when (autocut: true && compress: false). Source: nbuchwitz/ptouch:PTE550W (\"E550W requires compression ON for cutting to work\"). Pin configurations from Brother spec cv_pte550wp750wp710bt_eng_raster_102.pdf p.20 §2.3, transcribed into media.json5 via nbuchwitz/ptouch.",
37
+ "support": {
38
+ "status": "untested"
39
+ }
40
+ },
41
+ {
42
+ "key": "PT_P750W",
43
+ "name": "PT-P750W",
44
+ "family": "brother-ql",
45
+ "transports": {
46
+ "usb": {
47
+ "vid": "0x04f9",
48
+ "pid": "0x2062"
49
+ },
50
+ "tcp": {
51
+ "port": 9100
52
+ }
53
+ },
54
+ "engines": [
55
+ {
56
+ "role": "primary",
57
+ "protocol": "pt-raster",
58
+ "dpi": 180,
59
+ "headDots": 128,
60
+ "mediaCompatibility": [
61
+ "tze",
62
+ "hse-2to1",
63
+ "hse-3to1"
64
+ ],
65
+ "capabilities": {
66
+ "autocut": true,
67
+ "mediaDetection": true,
68
+ "highResDpi": 360
69
+ }
70
+ }
71
+ ],
72
+ "capabilities": {
73
+ "massStoragePid": "0x2065"
74
+ },
75
+ "hardwareQuirks": "PID disagreement between driver projects on which mode 0x2062 vs 0x2065 represents: libptouch.c says 0x2062 is the printer PID and 0x2065 is PLite mass-storage; nbuchwitz/ptouch says 0x2065 is the printer PID. We treat libptouch.c as authoritative; flip via a contributor report if discovery fails on real hardware. Pin configurations from Brother spec cv_pte550wp750wp710bt_eng_raster_102.pdf p.20 §2.3.",
76
+ "support": {
77
+ "status": "untested"
78
+ }
79
+ },
80
+ {
81
+ "key": "PT_P900",
82
+ "name": "PT-P900",
83
+ "family": "brother-ql",
84
+ "transports": {
85
+ "usb": {
86
+ "vid": "0x04f9",
87
+ "pid": "0x2083"
88
+ }
89
+ },
90
+ "engines": [
91
+ {
92
+ "role": "primary",
93
+ "protocol": "pt-raster",
94
+ "dpi": 360,
95
+ "headDots": 560,
96
+ "mediaCompatibility": [
97
+ "tze",
98
+ "hse-2to1",
99
+ "hse-3to1"
100
+ ],
101
+ "capabilities": {
102
+ "autocut": true,
103
+ "mediaDetection": true,
104
+ "highResDpi": 720
105
+ }
106
+ }
107
+ ],
108
+ "hardwareQuirks": "Pin configurations from Brother spec cv_ptp900_eng_raster_102.pdf pp.23-24 §2.3.5, transcribed into media.json5 via nbuchwitz/ptouch:PTP900Series. Note nbuchwitz/ptouch:PTP900Series.DEFAULT_USE_COMPRESSION = False — unlike PT-E550W, P900 does NOT require compression for the cutter.",
109
+ "support": {
110
+ "status": "untested"
111
+ }
112
+ },
113
+ {
114
+ "key": "PT_P900W",
115
+ "name": "PT-P900W",
116
+ "family": "brother-ql",
117
+ "transports": {
118
+ "usb": {
119
+ "vid": "0x04f9",
120
+ "pid": "0x2085"
121
+ },
122
+ "tcp": {
123
+ "port": 9100
124
+ }
125
+ },
126
+ "engines": [
127
+ {
128
+ "role": "primary",
129
+ "protocol": "pt-raster",
130
+ "dpi": 360,
131
+ "headDots": 560,
132
+ "mediaCompatibility": [
133
+ "tze",
134
+ "hse-2to1",
135
+ "hse-3to1"
136
+ ],
137
+ "capabilities": {
138
+ "autocut": true,
139
+ "mediaDetection": true,
140
+ "highResDpi": 720
141
+ }
142
+ }
143
+ ],
144
+ "hardwareQuirks": "PID 0x2085 sourced from nbuchwitz/ptouch:PTP900W; not in most public USB-ID databases — phase 4 hardware verification should confirm.",
145
+ "support": {
146
+ "status": "untested"
147
+ }
148
+ },
149
+ {
150
+ "key": "PT_P910BT",
151
+ "name": "PT-P910BT",
152
+ "family": "brother-ql",
153
+ "transports": {
154
+ "usb": {
155
+ "vid": "0x04f9",
156
+ "pid": "0x20c7"
157
+ },
158
+ "bluetooth-spp": {
159
+ "namePrefix": "PT-P910"
160
+ }
161
+ },
162
+ "engines": [
163
+ {
164
+ "role": "primary",
165
+ "protocol": "pt-raster",
166
+ "dpi": 360,
167
+ "headDots": 560,
168
+ "mediaCompatibility": [
169
+ "tze"
170
+ ],
171
+ "capabilities": {
172
+ "autocut": true,
173
+ "mediaDetection": true,
174
+ "highResDpi": 720
175
+ }
176
+ }
177
+ ],
178
+ "hardwareQuirks": "Bluetooth assumed classic SPP per nbuchwitz/ptouch — phase 4 hardware verification should confirm classic vs BLE GATT before users rely on it. HSe heat-shrink unsupported (TZe-only); engine.mediaCompatibility excludes hse-2to1 and hse-3to1 so the lookup never returns those entries.",
179
+ "support": {
180
+ "status": "untested"
181
+ }
182
+ },
183
+ {
184
+ "key": "PT_P950NW",
185
+ "name": "PT-P950NW",
186
+ "family": "brother-ql",
187
+ "transports": {
188
+ "usb": {
189
+ "vid": "0x04f9",
190
+ "pid": "0x2086"
191
+ },
192
+ "tcp": {
193
+ "port": 9100
194
+ }
195
+ },
196
+ "engines": [
197
+ {
198
+ "role": "primary",
199
+ "protocol": "pt-raster",
200
+ "dpi": 360,
201
+ "headDots": 560,
202
+ "mediaCompatibility": [
203
+ "tze",
204
+ "hse-2to1",
205
+ "hse-3to1"
206
+ ],
207
+ "capabilities": {
208
+ "autocut": true,
209
+ "mediaDetection": true,
210
+ "highResDpi": 720
211
+ }
212
+ }
213
+ ],
214
+ "hardwareQuirks": "PID 0x2086 sourced from nbuchwitz/ptouch:PTP950NW. Pin configurations from Brother spec cv_ptp900_eng_raster_102.pdf via nbuchwitz/ptouch.",
215
+ "support": {
216
+ "status": "untested"
217
+ }
218
+ },
219
+ {
220
+ "key": "QL_1050",
221
+ "name": "QL-1050",
222
+ "family": "brother-ql",
223
+ "transports": {
224
+ "usb": {
225
+ "vid": "0x04f9",
226
+ "pid": "0x2027"
227
+ }
228
+ },
229
+ "engines": [
230
+ {
231
+ "role": "primary",
232
+ "protocol": "ql-raster",
233
+ "dpi": 300,
234
+ "headDots": 1296,
235
+ "mediaCompatibility": [
236
+ "dk",
237
+ "dk-wide"
238
+ ],
239
+ "capabilities": {
240
+ "autocut": true,
241
+ "mediaDetection": true
242
+ }
243
+ }
244
+ ],
245
+ "support": {
246
+ "status": "untested"
247
+ }
248
+ },
249
+ {
250
+ "key": "QL_1060N",
251
+ "name": "QL-1060N",
252
+ "family": "brother-ql",
253
+ "transports": {
254
+ "usb": {
255
+ "vid": "0x04f9",
256
+ "pid": "0x2028"
257
+ },
258
+ "tcp": {
259
+ "port": 9100
260
+ }
261
+ },
262
+ "engines": [
263
+ {
264
+ "role": "primary",
265
+ "protocol": "ql-raster",
266
+ "dpi": 300,
267
+ "headDots": 1296,
268
+ "mediaCompatibility": [
269
+ "dk",
270
+ "dk-wide"
271
+ ],
272
+ "capabilities": {
273
+ "autocut": true,
274
+ "mediaDetection": true
275
+ }
276
+ }
277
+ ],
278
+ "support": {
279
+ "status": "untested"
280
+ }
281
+ },
282
+ {
283
+ "key": "QL_1100",
284
+ "name": "QL-1100",
285
+ "family": "brother-ql",
286
+ "transports": {
287
+ "usb": {
288
+ "vid": "0x04f9",
289
+ "pid": "0x20a7"
290
+ }
291
+ },
292
+ "engines": [
293
+ {
294
+ "role": "primary",
295
+ "protocol": "ql-raster",
296
+ "dpi": 300,
297
+ "headDots": 1296,
298
+ "mediaCompatibility": [
299
+ "dk",
300
+ "dk-wide"
301
+ ],
302
+ "capabilities": {
303
+ "autocut": true,
304
+ "mediaDetection": true
305
+ }
306
+ }
307
+ ],
308
+ "capabilities": {
309
+ "editorLite": true,
310
+ "massStoragePid": "0x20a9"
311
+ },
312
+ "support": {
313
+ "status": "untested"
314
+ }
315
+ },
316
+ {
317
+ "key": "QL_1110NWB",
318
+ "name": "QL-1110NWB",
319
+ "family": "brother-ql",
320
+ "transports": {
321
+ "usb": {
322
+ "vid": "0x04f9",
323
+ "pid": "0x20a8"
324
+ },
325
+ "tcp": {
326
+ "port": 9100
327
+ }
328
+ },
329
+ "engines": [
330
+ {
331
+ "role": "primary",
332
+ "protocol": "ql-raster",
333
+ "dpi": 300,
334
+ "headDots": 1296,
335
+ "mediaCompatibility": [
336
+ "dk",
337
+ "dk-wide"
338
+ ],
339
+ "capabilities": {
340
+ "autocut": true,
341
+ "mediaDetection": true
342
+ }
343
+ }
344
+ ],
345
+ "capabilities": {
346
+ "editorLite": true,
347
+ "massStoragePid": "0x20aa"
348
+ },
349
+ "support": {
350
+ "status": "untested"
351
+ }
352
+ },
353
+ {
354
+ "key": "QL_1115NWB",
355
+ "name": "QL-1115NWB",
356
+ "family": "brother-ql",
357
+ "transports": {
358
+ "usb": {
359
+ "vid": "0x04f9",
360
+ "pid": "0x20ab"
361
+ },
362
+ "tcp": {
363
+ "port": 9100
364
+ }
365
+ },
366
+ "engines": [
367
+ {
368
+ "role": "primary",
369
+ "protocol": "ql-raster",
370
+ "dpi": 300,
371
+ "headDots": 1296,
372
+ "mediaCompatibility": [
373
+ "dk",
374
+ "dk-wide"
375
+ ],
376
+ "capabilities": {
377
+ "autocut": true,
378
+ "mediaDetection": true
379
+ }
380
+ }
381
+ ],
382
+ "capabilities": {
383
+ "editorLite": true,
384
+ "massStoragePid": "0x20ac"
385
+ },
386
+ "support": {
387
+ "status": "untested"
388
+ }
389
+ },
390
+ {
391
+ "key": "QL_500",
392
+ "name": "QL-500",
393
+ "family": "brother-ql",
394
+ "transports": {
395
+ "usb": {
396
+ "vid": "0x04f9",
397
+ "pid": "0x2013"
398
+ }
399
+ },
400
+ "engines": [
401
+ {
402
+ "role": "primary",
403
+ "protocol": "ql-raster",
404
+ "dpi": 300,
405
+ "headDots": 720,
406
+ "mediaCompatibility": [
407
+ "dk"
408
+ ],
409
+ "capabilities": {
410
+ "mediaDetection": true
411
+ }
412
+ }
413
+ ],
414
+ "support": {
415
+ "status": "untested"
416
+ }
417
+ },
418
+ {
419
+ "key": "QL_550",
420
+ "name": "QL-550",
421
+ "family": "brother-ql",
422
+ "transports": {
423
+ "usb": {
424
+ "vid": "0x04f9",
425
+ "pid": "0x2016"
426
+ }
427
+ },
428
+ "engines": [
429
+ {
430
+ "role": "primary",
431
+ "protocol": "ql-raster",
432
+ "dpi": 300,
433
+ "headDots": 720,
434
+ "mediaCompatibility": [
435
+ "dk"
436
+ ],
437
+ "capabilities": {
438
+ "mediaDetection": true
439
+ }
440
+ }
441
+ ],
442
+ "support": {
443
+ "status": "untested"
444
+ }
445
+ },
446
+ {
447
+ "key": "QL_560",
448
+ "name": "QL-560",
449
+ "family": "brother-ql",
450
+ "transports": {
451
+ "usb": {
452
+ "vid": "0x04f9",
453
+ "pid": "0x2018"
454
+ }
455
+ },
456
+ "engines": [
457
+ {
458
+ "role": "primary",
459
+ "protocol": "ql-raster",
460
+ "dpi": 300,
461
+ "headDots": 720,
462
+ "mediaCompatibility": [
463
+ "dk"
464
+ ],
465
+ "capabilities": {
466
+ "autocut": true,
467
+ "mediaDetection": true
468
+ }
469
+ }
470
+ ],
471
+ "support": {
472
+ "status": "untested"
473
+ }
474
+ },
475
+ {
476
+ "key": "QL_570",
477
+ "name": "QL-570",
478
+ "family": "brother-ql",
479
+ "transports": {
480
+ "usb": {
481
+ "vid": "0x04f9",
482
+ "pid": "0x2019"
483
+ }
484
+ },
485
+ "engines": [
486
+ {
487
+ "role": "primary",
488
+ "protocol": "ql-raster",
489
+ "dpi": 300,
490
+ "headDots": 720,
491
+ "mediaCompatibility": [
492
+ "dk"
493
+ ],
494
+ "capabilities": {
495
+ "autocut": true,
496
+ "mediaDetection": true
497
+ }
498
+ }
499
+ ],
500
+ "support": {
501
+ "status": "untested"
502
+ }
503
+ },
504
+ {
505
+ "key": "QL_580N",
506
+ "name": "QL-580N",
507
+ "family": "brother-ql",
508
+ "transports": {
509
+ "usb": {
510
+ "vid": "0x04f9",
511
+ "pid": "0x201b"
512
+ },
513
+ "tcp": {
514
+ "port": 9100
515
+ }
516
+ },
517
+ "engines": [
518
+ {
519
+ "role": "primary",
520
+ "protocol": "ql-raster",
521
+ "dpi": 300,
522
+ "headDots": 720,
523
+ "mediaCompatibility": [
524
+ "dk"
525
+ ],
526
+ "capabilities": {
527
+ "autocut": true,
528
+ "mediaDetection": true
529
+ }
530
+ }
531
+ ],
532
+ "support": {
533
+ "status": "untested"
534
+ }
535
+ },
536
+ {
537
+ "key": "QL_600",
538
+ "name": "QL-600",
539
+ "family": "brother-ql",
540
+ "transports": {
541
+ "usb": {
542
+ "vid": "0x04f9",
543
+ "pid": "0x2100"
544
+ }
545
+ },
546
+ "engines": [
547
+ {
548
+ "role": "primary",
549
+ "protocol": "ql-raster",
550
+ "dpi": 300,
551
+ "headDots": 720,
552
+ "mediaCompatibility": [
553
+ "dk"
554
+ ],
555
+ "capabilities": {
556
+ "autocut": true,
557
+ "mediaDetection": true
558
+ }
559
+ }
560
+ ],
561
+ "support": {
562
+ "status": "untested"
563
+ }
564
+ },
565
+ {
566
+ "key": "QL_650TD",
567
+ "name": "QL-650TD",
568
+ "family": "brother-ql",
569
+ "transports": {
570
+ "usb": {
571
+ "vid": "0x04f9",
572
+ "pid": "0x201c"
573
+ }
574
+ },
575
+ "engines": [
576
+ {
577
+ "role": "primary",
578
+ "protocol": "ql-raster",
579
+ "dpi": 300,
580
+ "headDots": 720,
581
+ "mediaCompatibility": [
582
+ "dk"
583
+ ],
584
+ "capabilities": {
585
+ "autocut": true,
586
+ "mediaDetection": true
587
+ }
588
+ }
589
+ ],
590
+ "support": {
591
+ "status": "untested"
592
+ }
593
+ },
594
+ {
595
+ "key": "QL_700",
596
+ "name": "QL-700",
597
+ "family": "brother-ql",
598
+ "transports": {
599
+ "usb": {
600
+ "vid": "0x04f9",
601
+ "pid": "0x2042"
602
+ }
603
+ },
604
+ "engines": [
605
+ {
606
+ "role": "primary",
607
+ "protocol": "ql-raster",
608
+ "dpi": 300,
609
+ "headDots": 720,
610
+ "mediaCompatibility": [
611
+ "dk"
612
+ ],
613
+ "capabilities": {
614
+ "autocut": true,
615
+ "mediaDetection": true
616
+ }
617
+ }
618
+ ],
619
+ "capabilities": {
620
+ "editorLite": true
621
+ },
622
+ "hardwareQuirks": "Cassette-based media detection. Printer hard-rejects with an error code if the host job dimensions do not match the loaded DK cassette. Apps that compare detected vs selected media should switch to the matching cassette before sending.",
623
+ "support": {
624
+ "status": "untested"
625
+ }
626
+ },
627
+ {
628
+ "key": "QL_710W",
629
+ "name": "QL-710W",
630
+ "family": "brother-ql",
631
+ "transports": {
632
+ "usb": {
633
+ "vid": "0x04f9",
634
+ "pid": "0x2044"
635
+ },
636
+ "tcp": {
637
+ "port": 9100
638
+ }
639
+ },
640
+ "engines": [
641
+ {
642
+ "role": "primary",
643
+ "protocol": "ql-raster",
644
+ "dpi": 300,
645
+ "headDots": 720,
646
+ "mediaCompatibility": [
647
+ "dk"
648
+ ],
649
+ "capabilities": {
650
+ "autocut": true,
651
+ "mediaDetection": true
652
+ }
653
+ }
654
+ ],
655
+ "capabilities": {
656
+ "editorLite": true
657
+ },
658
+ "support": {
659
+ "status": "untested"
660
+ }
661
+ },
662
+ {
663
+ "key": "QL_720NW",
664
+ "name": "QL-720NW",
665
+ "family": "brother-ql",
666
+ "transports": {
667
+ "usb": {
668
+ "vid": "0x04f9",
669
+ "pid": "0x2045"
670
+ },
671
+ "tcp": {
672
+ "port": 9100
673
+ }
674
+ },
675
+ "engines": [
676
+ {
677
+ "role": "primary",
678
+ "protocol": "ql-raster",
679
+ "dpi": 300,
680
+ "headDots": 720,
681
+ "mediaCompatibility": [
682
+ "dk"
683
+ ],
684
+ "capabilities": {
685
+ "autocut": true,
686
+ "mediaDetection": true
687
+ }
688
+ }
689
+ ],
690
+ "support": {
691
+ "status": "untested"
692
+ }
693
+ },
694
+ {
695
+ "key": "QL_800",
696
+ "name": "QL-800",
697
+ "family": "brother-ql",
698
+ "transports": {
699
+ "usb": {
700
+ "vid": "0x04f9",
701
+ "pid": "0x209b"
702
+ }
703
+ },
704
+ "engines": [
705
+ {
706
+ "role": "primary",
707
+ "protocol": "ql-raster",
708
+ "dpi": 300,
709
+ "headDots": 720,
710
+ "mediaCompatibility": [
711
+ "dk"
712
+ ],
713
+ "capabilities": {
714
+ "autocut": true,
715
+ "mediaDetection": true,
716
+ "twoColor": true
717
+ }
718
+ }
719
+ ],
720
+ "capabilities": {
721
+ "editorLite": true
722
+ },
723
+ "support": {
724
+ "status": "untested"
725
+ }
726
+ },
727
+ {
728
+ "key": "QL_810W",
729
+ "name": "QL-810W",
730
+ "family": "brother-ql",
731
+ "transports": {
732
+ "usb": {
733
+ "vid": "0x04f9",
734
+ "pid": "0x209c"
735
+ },
736
+ "tcp": {
737
+ "port": 9100
738
+ }
739
+ },
740
+ "engines": [
741
+ {
742
+ "role": "primary",
743
+ "protocol": "ql-raster",
744
+ "dpi": 300,
745
+ "headDots": 720,
746
+ "mediaCompatibility": [
747
+ "dk"
748
+ ],
749
+ "capabilities": {
750
+ "autocut": true,
751
+ "mediaDetection": true,
752
+ "twoColor": true
753
+ }
754
+ }
755
+ ],
756
+ "capabilities": {
757
+ "editorLite": true
758
+ },
759
+ "support": {
760
+ "status": "untested"
761
+ }
762
+ },
763
+ {
764
+ "key": "QL_820NWBc",
765
+ "name": "QL-820NWBc",
766
+ "family": "brother-ql",
767
+ "transports": {
768
+ "usb": {
769
+ "vid": "0x04f9",
770
+ "pid": "0x209d"
771
+ },
772
+ "tcp": {
773
+ "port": 9100
774
+ },
775
+ "bluetooth-spp": {
776
+ "namePrefix": "QL-820NWB"
777
+ }
778
+ },
779
+ "engines": [
780
+ {
781
+ "role": "primary",
782
+ "protocol": "ql-raster",
783
+ "dpi": 300,
784
+ "headDots": 720,
785
+ "mediaCompatibility": [
786
+ "dk"
787
+ ],
788
+ "capabilities": {
789
+ "autocut": true,
790
+ "mediaDetection": true,
791
+ "twoColor": true
792
+ }
793
+ }
794
+ ],
795
+ "capabilities": {
796
+ "editorLite": true
797
+ },
798
+ "hardwareQuirks": "QL-820NWB and QL-820NWBc share PID 0x209d; this entry covers both marketing names. Bluetooth on this device is classic SPP (paired at the OS level via RFCOMM), not GATT — the runtime serial implementation opens the OS-paired RFCOMM device path. macOS dropped classic Bluetooth SPP support so that route is unavailable there; Linux and Windows both work.",
799
+ "support": {
800
+ "status": "verified",
801
+ "transports": {
802
+ "usb": "verified",
803
+ "tcp": "verified",
804
+ "bluetooth-spp": "untested"
805
+ },
806
+ "lastVerified": "2026-04-27",
807
+ "packageVersion": "0.2.1",
808
+ "quirks": "Reference test device. Two-colour printing on DK-22251 confirmed, auto-cut works on USB and TCP, WebUSB demo prints correctly. The QL-820NWB and QL-820NWBc share PID 0x209d; this entry covers both marketing names.",
809
+ "reports": [
810
+ {
811
+ "issue": 0,
812
+ "reporter": "@mannes",
813
+ "date": "2026-04-27",
814
+ "result": "verified",
815
+ "os": "Linux",
816
+ "selfVerified": true,
817
+ "notes": "Bench verification by the maintainer at the time of seeding this entry. Issue #0 is a placeholder — replace with the real issue number when a public verification report is filed."
818
+ }
819
+ ]
820
+ }
821
+ }
822
+ ]
823
+ };
824
+ /**
825
+ * Per-key map of device entries. Built from the registry array via
826
+ * `Object.fromEntries`, but typed as `Record<DeviceKey, BrotherQLDevice>`
827
+ * so consumers can write `DEVICES.QL_820NWBc` and get a precise type
828
+ * back without literal narrowing leaking into engine capability access.
829
+ */
830
+ export const DEVICES = Object.fromEntries(DEVICE_REGISTRY.devices.map(d => [d.key, d]));
831
+ //# sourceMappingURL=devices.generated.js.map