@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
@@ -1,56 +1,62 @@
1
1
  import { describe, it, expect } from 'vitest';
2
- import { DEVICES, findDevice, isMassStorageMode } from '../devices.js';
2
+ import { DEVICES, findDevice, getUsbIds, isMassStorageMode } from '../devices.js';
3
3
  describe('findDevice', () => {
4
- it('returns correct descriptor for QL-820NWB', () => {
5
- const dev = findDevice(0x04f9, 0x20a7);
6
- expect(dev).toBeDefined();
7
- expect(dev.name).toBe('QL-820NWB');
8
- expect(dev.twoColor).toBe(true);
9
- });
10
- it('returns correct descriptor for QL-820NWBc', () => {
4
+ it('returns correct entry for QL-820NWBc (PID shared with QL-820NWB)', () => {
11
5
  const dev = findDevice(0x04f9, 0x209d);
12
6
  expect(dev).toBeDefined();
13
7
  expect(dev.name).toBe('QL-820NWBc');
14
- expect(dev.twoColor).toBe(true);
8
+ expect(dev.engines[0]?.capabilities?.twoColor).toBe(true);
9
+ });
10
+ it('returns correct entry for QL-1100', () => {
11
+ const dev = findDevice(0x04f9, 0x20a7);
12
+ expect(dev).toBeDefined();
13
+ expect(dev.name).toBe('QL-1100');
14
+ expect(dev.engines[0]?.headDots).toBe(1296);
15
15
  });
16
- it('returns correct descriptor for QL-500', () => {
16
+ it('returns correct entry for QL-500', () => {
17
17
  const dev = findDevice(0x04f9, 0x2013);
18
18
  expect(dev).toBeDefined();
19
19
  expect(dev.name).toBe('QL-500');
20
- expect(dev.autocut).toBe(false);
20
+ // QL-500 has no autocut — the capability flag is absent.
21
+ expect(dev.engines[0]?.capabilities?.autocut).toBeUndefined();
21
22
  });
22
23
  it('returns undefined for unknown PID', () => {
23
24
  expect(findDevice(0x04f9, 0x9999)).toBeUndefined();
24
25
  });
25
26
  it('returns undefined for unknown VID', () => {
26
- expect(findDevice(0x1234, 0x20a7)).toBeUndefined();
27
+ expect(findDevice(0x1234, 0x209d)).toBeUndefined();
27
28
  });
28
29
  });
29
30
  describe('isMassStorageMode', () => {
30
- it('returns true for 0x20AA (QL-1100 mass storage)', () => {
31
+ it('returns true for 0x20a9 (QL-1100 mass storage)', () => {
32
+ expect(isMassStorageMode(0x20a9)).toBe(true);
33
+ });
34
+ it('returns true for 0x20aa (QL-1110NWB mass storage)', () => {
31
35
  expect(isMassStorageMode(0x20aa)).toBe(true);
32
36
  });
33
- it('returns true for 0x20AB (QL-1110NWB mass storage)', () => {
34
- expect(isMassStorageMode(0x20ab)).toBe(true);
37
+ it('returns true for 0x20ac (QL-1115NWB mass storage)', () => {
38
+ expect(isMassStorageMode(0x20ac)).toBe(true);
35
39
  });
36
40
  it('returns false for all printer-class PIDs', () => {
37
41
  for (const dev of Object.values(DEVICES)) {
38
- expect(isMassStorageMode(dev.pid)).toBe(false);
42
+ const ids = getUsbIds(dev);
43
+ if (ids)
44
+ expect(isMassStorageMode(ids.pid)).toBe(false);
39
45
  }
40
46
  });
41
47
  });
42
48
  describe('Device registry invariants', () => {
43
- it('every two-color device has bytesPerRow 90', () => {
49
+ it('every two-color device has a 720-dot engine', () => {
44
50
  for (const dev of Object.values(DEVICES)) {
45
- if (dev.twoColor) {
46
- expect(dev.bytesPerRow).toBe(90);
51
+ if (dev.engines[0]?.capabilities?.twoColor) {
52
+ expect(dev.engines[0].headDots).toBe(720);
47
53
  }
48
54
  }
49
55
  });
50
- it('every device with headPins 1296 has bytesPerRow 162', () => {
56
+ it('every device with headDots 1296 belongs to the QL-1xxx series', () => {
51
57
  for (const dev of Object.values(DEVICES)) {
52
- if (dev.headPins === 1296) {
53
- expect(dev.bytesPerRow).toBe(162);
58
+ if (dev.engines[0]?.headDots === 1296) {
59
+ expect(dev.name).toMatch(/^QL-1\d{3}/);
54
60
  }
55
61
  }
56
62
  });
@@ -59,19 +65,94 @@ describe('Device registry invariants', () => {
59
65
  expect(dev.family).toBe('brother-ql');
60
66
  }
61
67
  });
62
- it('QL-820NWB(c) advertise serial/web-serial for OS-paired Bluetooth', () => {
63
- for (const key of ['QL_820NWB', 'QL_820NWBc']) {
68
+ it('every device declares a USB transport with hex-string vid+pid', () => {
69
+ for (const dev of Object.values(DEVICES)) {
70
+ expect(dev.transports.usb).toBeDefined();
71
+ expect(dev.transports.usb.vid).toMatch(/^0x[0-9a-f]+$/);
72
+ expect(dev.transports.usb.pid).toMatch(/^0x[0-9a-f]+$/);
73
+ }
74
+ });
75
+ });
76
+ describe('PT-* device entries', () => {
77
+ const PT_KEYS = ['PT_E550W', 'PT_P750W', 'PT_P900', 'PT_P900W', 'PT_P950NW', 'PT_P910BT'];
78
+ it('every PT entry resolves by (vid, pid)', () => {
79
+ const expected = {
80
+ PT_E550W: 0x2060,
81
+ PT_P750W: 0x2062,
82
+ PT_P900: 0x2083,
83
+ PT_P900W: 0x2085,
84
+ PT_P950NW: 0x2086,
85
+ PT_P910BT: 0x20c7,
86
+ };
87
+ for (const key of PT_KEYS) {
88
+ const pid = expected[key];
89
+ const dev = findDevice(0x04f9, pid);
90
+ expect(dev, key).toBeDefined();
91
+ expect(dev.key).toBe(key);
92
+ }
93
+ });
94
+ it('every PT engine uses the pt-raster protocol', () => {
95
+ for (const key of PT_KEYS) {
64
96
  const dev = DEVICES[key];
65
- expect(dev.transports).toContain('serial');
66
- expect(dev.transports).toContain('web-serial');
97
+ expect(dev.engines[0]?.protocol, key).toBe('pt-raster');
67
98
  }
68
99
  });
69
- it('no device descriptor declares web-bluetooth', () => {
70
- // Bluetooth on the 820 series is classic SPP, not GATT — the
71
- // serial transports cover it. See packages/core/src/types.ts.
72
- for (const dev of Object.values(DEVICES)) {
73
- expect(dev.transports).not.toContain('web-bluetooth');
100
+ it('every PT engine has headDots in {128, 560}', () => {
101
+ for (const key of PT_KEYS) {
102
+ const dev = DEVICES[key];
103
+ expect([128, 560]).toContain(dev.engines[0]?.headDots);
74
104
  }
75
105
  });
106
+ it('PT high-res dpi is exactly 2× the native dpi', () => {
107
+ for (const key of PT_KEYS) {
108
+ const dev = DEVICES[key];
109
+ const engine = dev.engines[0];
110
+ const dpi = engine.dpi;
111
+ const highResDpi = engine.capabilities?.highResDpi;
112
+ expect(highResDpi, `${key} highResDpi`).toBeDefined();
113
+ expect(highResDpi).toBe(dpi * 2);
114
+ }
115
+ });
116
+ it('128-dot family is 180 dpi, 560-dot family is 360 dpi', () => {
117
+ for (const key of PT_KEYS) {
118
+ const dev = DEVICES[key];
119
+ const engine = dev.engines[0];
120
+ if (engine.headDots === 128)
121
+ expect(engine.dpi).toBe(180);
122
+ else if (engine.headDots === 560)
123
+ expect(engine.dpi).toBe(360);
124
+ }
125
+ });
126
+ it('every PT entry ships untested', () => {
127
+ for (const key of PT_KEYS) {
128
+ const dev = DEVICES[key];
129
+ expect(dev.support.status).toBe('untested');
130
+ }
131
+ });
132
+ it('PT-P910BT is TZe-only (no HSe in mediaCompatibility)', () => {
133
+ const dev = DEVICES.PT_P910BT;
134
+ expect(dev.engines[0]?.mediaCompatibility).toEqual(['tze']);
135
+ });
136
+ it('all other PT models declare TZe + HSe 2:1 + HSe 3:1', () => {
137
+ for (const key of ['PT_E550W', 'PT_P750W', 'PT_P900', 'PT_P900W', 'PT_P950NW']) {
138
+ const dev = DEVICES[key];
139
+ expect(dev.engines[0]?.mediaCompatibility, key).toEqual(['tze', 'hse-2to1', 'hse-3to1']);
140
+ }
141
+ });
142
+ it('PT-P750W carries both printer PID 0x2062 and mass-storage PID 0x2065', () => {
143
+ const dev = DEVICES.PT_P750W;
144
+ expect(dev.transports.usb?.pid).toBe('0x2062');
145
+ expect(dev.capabilities?.massStoragePid).toBe('0x2065');
146
+ expect(isMassStorageMode(0x2065)).toBe(true);
147
+ });
148
+ it('PT-P910BT declares bluetooth-spp transport', () => {
149
+ const dev = DEVICES.PT_P910BT;
150
+ expect(dev.transports['bluetooth-spp']).toBeDefined();
151
+ expect(dev.transports['bluetooth-spp']?.namePrefix).toBe('PT-P910');
152
+ });
153
+ it('PT-P900 is USB-only (no tcp / bluetooth)', () => {
154
+ const dev = DEVICES.PT_P900;
155
+ expect(Object.keys(dev.transports).sort()).toEqual(['usb']);
156
+ });
76
157
  });
77
158
  //# sourceMappingURL=devices.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"devices.test.js","sourceRoot":"","sources":["../../src/__tests__/devices.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"devices.test.js","sourceRoot":"","sources":["../../src/__tests__/devices.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElF,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACrC,MAAM,CAAC,GAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClC,MAAM,CAAC,GAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjC,yDAAyD;QACzD,MAAM,CAAC,GAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACzC,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YAC3B,IAAI,GAAG;gBAAE,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACzC,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;gBAC3C,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACzC,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACzC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACxC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACzC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;YACzC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,GAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YACzD,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,GAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,MAAM,OAAO,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IAE1F,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,QAAQ,GAA2B;YACvC,QAAQ,EAAE,MAAM;YAChB,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,MAAM;YACf,QAAQ,EAAE,MAAM;YAChB,SAAS,EAAE,MAAM;YACjB,SAAS,EAAE,MAAM;SAClB,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YACpC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;YAC/B,MAAM,CAAC,GAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,GAA2B,CAAC,CAAC;YACjD,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,GAA2B,CAAC,CAAC;YACjD,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,GAA2B,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;YACvB,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,EAAE,UAAgC,CAAC;YACzE,MAAM,CAAC,UAAU,EAAE,GAAG,GAAG,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;YACtD,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,GAA2B,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC;YAC/B,IAAI,MAAM,CAAC,QAAQ,KAAK,GAAG;gBAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;iBACrD,IAAI,MAAM,CAAC,QAAQ,KAAK,GAAG;gBAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,GAA2B,CAAC,CAAC;YACjD,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,CAAC;YAC/E,MAAM,GAAG,GAAG,OAAO,CAAC,GAA2B,CAAC,CAAC;YACjD,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACtD,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;QAC5B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,5 +1,27 @@
1
1
  import { describe, it, expect } from 'vitest';
2
- import { MEDIA, findMedia, findMediaByWidth } from '../media.js';
2
+ import { mediaCompatibleWith } from '@thermal-label/contracts';
3
+ import { MEDIA, defaultMediaForEngine, findMedia, findMediaByDimensions, findMediaByWidth, resolveTapeGeometry, } from '../media.js';
4
+ import { DEVICES } from '../devices.js';
5
+ const NARROW_PT_ENGINE = {
6
+ protocol: 'pt-raster',
7
+ headDots: 128,
8
+ mediaCompatibility: ['tze', 'hse-2to1', 'hse-3to1'],
9
+ };
10
+ const WIDE_PT_ENGINE = {
11
+ protocol: 'pt-raster',
12
+ headDots: 560,
13
+ mediaCompatibility: ['tze', 'hse-2to1', 'hse-3to1'],
14
+ };
15
+ const TZE_ONLY_PT_ENGINE = {
16
+ protocol: 'pt-raster',
17
+ headDots: 560,
18
+ mediaCompatibility: ['tze'],
19
+ };
20
+ const QL_ENGINE = {
21
+ protocol: 'ql-raster',
22
+ headDots: 720,
23
+ mediaCompatibility: ['dk'],
24
+ };
3
25
  describe('findMedia', () => {
4
26
  it('returns correct descriptor for 62mm continuous (ID 259)', () => {
5
27
  const m = findMedia(259);
@@ -89,5 +111,233 @@ describe('Media registry invariants', () => {
89
111
  const unique = new Set(ids);
90
112
  expect(unique.size).toBe(ids.length);
91
113
  });
114
+ it('every entry declares a tape system', () => {
115
+ for (const m of Object.values(MEDIA)) {
116
+ expect(m.tapeSystem, `entry ${m.id.toString()}`).toBeDefined();
117
+ }
118
+ });
119
+ it('TZe ids occupy the 401-419 range, HSe 421-459', () => {
120
+ for (const m of Object.values(MEDIA)) {
121
+ if (m.tapeSystem === 'tze') {
122
+ expect(m.id, m.name).toBeGreaterThanOrEqual(401);
123
+ expect(m.id, m.name).toBeLessThanOrEqual(419);
124
+ }
125
+ else if (m.tapeSystem === 'hse-2to1') {
126
+ expect(m.id, m.name).toBeGreaterThanOrEqual(421);
127
+ expect(m.id, m.name).toBeLessThanOrEqual(439);
128
+ }
129
+ else if (m.tapeSystem === 'hse-3to1') {
130
+ expect(m.id, m.name).toBeGreaterThanOrEqual(441);
131
+ expect(m.id, m.name).toBeLessThanOrEqual(459);
132
+ }
133
+ else {
134
+ expect(m.tapeSystem, m.name).toBe('dk');
135
+ }
136
+ }
137
+ });
138
+ it('TZe / HSe pin sums equal the head-family pin count', () => {
139
+ for (const m of Object.values(MEDIA)) {
140
+ if (m.tapeSystem === 'dk')
141
+ continue;
142
+ if (m.geometry?.narrow) {
143
+ const { leftMarginPins, printAreaDots, rightMarginPins } = m.geometry.narrow;
144
+ expect(leftMarginPins + printAreaDots + rightMarginPins, `${m.name} narrow head sum`).toBe(128);
145
+ }
146
+ if (m.geometry?.wide) {
147
+ const { leftMarginPins, printAreaDots, rightMarginPins } = m.geometry.wide;
148
+ expect(leftMarginPins + printAreaDots + rightMarginPins, `${m.name} wide head sum`).toBe(560);
149
+ }
150
+ }
151
+ });
152
+ it('36 mm TZe and 31 mm HSe-3:1 are wide-head only', () => {
153
+ expect(MEDIA[407].geometry?.narrow).toBeUndefined();
154
+ expect(MEDIA[407].geometry?.wide).toBeDefined();
155
+ expect(MEDIA[445].geometry?.narrow).toBeUndefined();
156
+ expect(MEDIA[445].geometry?.wide).toBeDefined();
157
+ });
158
+ });
159
+ describe('findMediaByDimensions — engine gating', () => {
160
+ it('legacy call (no engine) keeps DK-only behaviour for 12 mm continuous', () => {
161
+ const m = findMediaByDimensions(12, 0);
162
+ expect(m).toBeDefined();
163
+ expect(m.tapeSystem).toBe('dk');
164
+ expect(m.id).toBe(257);
165
+ });
166
+ it('QL engine for 12 mm returns the DK entry, never a TZe entry', () => {
167
+ const m = findMediaByDimensions(12, 0, false, QL_ENGINE);
168
+ expect(m.tapeSystem).toBe('dk');
169
+ expect(m.id).toBe(257);
170
+ });
171
+ it('narrow PT engine for 12 mm returns the 128-dot TZe entry', () => {
172
+ const m = findMediaByDimensions(12, 0, false, NARROW_PT_ENGINE);
173
+ expect(m.tapeSystem).toBe('tze');
174
+ expect(m.id).toBe(404);
175
+ expect(m.geometry?.narrow).toBeDefined();
176
+ });
177
+ it('wide PT engine for 12 mm returns the same TZe row (geometry resolves later)', () => {
178
+ const m = findMediaByDimensions(12, 0, false, WIDE_PT_ENGINE);
179
+ expect(m.tapeSystem).toBe('tze');
180
+ expect(m.id).toBe(404);
181
+ expect(m.geometry?.wide).toBeDefined();
182
+ });
183
+ it('narrow PT engine cannot reach 36 mm TZe', () => {
184
+ const m = findMediaByDimensions(36, 0, false, NARROW_PT_ENGINE);
185
+ expect(m).toBeUndefined();
186
+ });
187
+ it('wide PT engine resolves 36 mm TZe', () => {
188
+ const m = findMediaByDimensions(36, 0, false, WIDE_PT_ENGINE);
189
+ expect(m.id).toBe(407);
190
+ });
191
+ it('narrow PT engine cannot reach 31 mm HSe-3:1', () => {
192
+ const m = findMediaByDimensions(31, 0, false, NARROW_PT_ENGINE);
193
+ expect(m).toBeUndefined();
194
+ });
195
+ it('wide PT engine resolves 31 mm HSe-3:1', () => {
196
+ const m = findMediaByDimensions(31, 0, false, WIDE_PT_ENGINE);
197
+ expect(m.id).toBe(445);
198
+ });
199
+ it('TZe-only PT engine never returns HSe entries', () => {
200
+ expect(findMediaByDimensions(11.7, 0, false, TZE_ONLY_PT_ENGINE)).toBeUndefined();
201
+ expect(findMediaByDimensions(5.2, 0, false, TZE_ONLY_PT_ENGINE)).toBeUndefined();
202
+ expect(findMediaByDimensions(31, 0, false, TZE_ONLY_PT_ENGINE)).toBeUndefined();
203
+ });
204
+ it('TZe-only PT engine still resolves TZe widths', () => {
205
+ const m = findMediaByDimensions(24, 0, false, TZE_ONLY_PT_ENGINE);
206
+ expect(m.tapeSystem).toBe('tze');
207
+ });
208
+ });
209
+ describe('resolveTapeGeometry', () => {
210
+ it('returns flat fields for DK entries regardless of engine head dots', () => {
211
+ const dk = MEDIA[259];
212
+ const geom = resolveTapeGeometry(dk, { headDots: 720 });
213
+ expect(geom.printAreaDots).toBe(696);
214
+ });
215
+ it('routes TZe through narrow / wide based on engine.headDots', () => {
216
+ const tze12 = MEDIA[404];
217
+ const narrow = resolveTapeGeometry(tze12, { headDots: 128 });
218
+ expect(narrow.printAreaDots).toBe(70);
219
+ const wide = resolveTapeGeometry(tze12, { headDots: 560 });
220
+ expect(wide.printAreaDots).toBe(150);
221
+ });
222
+ it('throws when the requested head family has no geometry', () => {
223
+ expect(() => resolveTapeGeometry(MEDIA[407], { headDots: 128 })).toThrow(/narrow/);
224
+ expect(() => resolveTapeGeometry(MEDIA[445], { headDots: 128 })).toThrow(/narrow/);
225
+ });
226
+ });
227
+ describe('defaultMediaForEngine', () => {
228
+ it('returns DK-22205 for QL engines', () => {
229
+ expect(defaultMediaForEngine({ protocol: 'ql-raster' }).id).toBe(259);
230
+ });
231
+ it('returns 12 mm TZe for PT engines', () => {
232
+ expect(defaultMediaForEngine({ protocol: 'pt-raster' }).id).toBe(404);
233
+ });
234
+ });
235
+ describe('Substrate-gate field-shape invariants', () => {
236
+ it('every entry declares a non-empty targetModels', () => {
237
+ for (const m of Object.values(MEDIA)) {
238
+ expect(m.targetModels, m.name).toBeDefined();
239
+ expect(m.targetModels.length, m.name).toBeGreaterThan(0);
240
+ }
241
+ });
242
+ it('every entry declares a category', () => {
243
+ for (const m of Object.values(MEDIA)) {
244
+ expect(m.category, m.name).toBeDefined();
245
+ }
246
+ });
247
+ it('targetModels is consistent with tapeSystem', () => {
248
+ for (const m of Object.values(MEDIA)) {
249
+ // DK rolls allow either 'dk' or 'dk-wide' in targetModels — both
250
+ // are DK-substrate tags. Other tape systems carry the bare value.
251
+ if (m.tapeSystem === 'dk') {
252
+ const ok = m.targetModels.includes('dk') || m.targetModels.includes('dk-wide');
253
+ expect(ok, `${m.name} targetModels=${JSON.stringify(m.targetModels)}`).toBe(true);
254
+ }
255
+ else {
256
+ expect(m.targetModels, m.name).toContain(m.tapeSystem);
257
+ }
258
+ }
259
+ });
260
+ it('every DK row with widthMm > 62 is tagged dk-wide', () => {
261
+ for (const m of Object.values(MEDIA)) {
262
+ if (m.tapeSystem === 'dk' && m.widthMm > 62) {
263
+ expect(m.targetModels, `${m.name} (id ${m.id.toString()})`).toContain('dk-wide');
264
+ }
265
+ }
266
+ });
267
+ it('every QL-1xxx engine accepts both dk and dk-wide', () => {
268
+ const wideKeys = ['QL_1050', 'QL_1060N', 'QL_1100', 'QL_1110NWB', 'QL_1115NWB'];
269
+ for (const key of wideKeys) {
270
+ const compat = DEVICES[key].engines[0].mediaCompatibility;
271
+ expect(compat, key).toContain('dk');
272
+ expect(compat, key).toContain('dk-wide');
273
+ }
274
+ });
275
+ it('no narrow QL chassis lists dk-wide', () => {
276
+ for (const d of Object.values(DEVICES)) {
277
+ if (!d.key.startsWith('QL_'))
278
+ continue;
279
+ // The five 1296-dot chassis are the wide tier; everything else is 720-dot.
280
+ const headDots = d.engines[0].headDots;
281
+ if (headDots === 720) {
282
+ expect(d.engines[0].mediaCompatibility, d.key).not.toContain('dk-wide');
283
+ }
284
+ }
285
+ });
286
+ });
287
+ describe('Substrate-gate enforcement matrix (mediaCompatibleWith)', () => {
288
+ // Representative engines for each compatibility class. The matrix
289
+ // walks every media row against each and asserts the cell — catches
290
+ // a row losing its targetModels (would falsely match every engine),
291
+ // an HSe row mistagged 'tze', a 102 mm row losing 'dk-wide', or a
292
+ // future engine dropping the substrate tag.
293
+ const CLASSES = {
294
+ qlStandard: DEVICES.QL_700.engines[0],
295
+ qlWide: DEVICES.QL_1100.engines[0],
296
+ ptTzeHse: DEVICES.PT_P900.engines[0],
297
+ ptTzeOnly: DEVICES.PT_P910BT.engines[0],
298
+ };
299
+ // For a media row, returns the set of class keys that should accept it.
300
+ function expectedClassesFor(m) {
301
+ const isWide = m.targetModels?.includes('dk-wide') ?? false;
302
+ const set = new Set();
303
+ if (m.tapeSystem === 'dk') {
304
+ if (isWide) {
305
+ set.add('qlWide');
306
+ }
307
+ else {
308
+ set.add('qlStandard');
309
+ set.add('qlWide');
310
+ }
311
+ }
312
+ else if (m.tapeSystem === 'tze') {
313
+ set.add('ptTzeHse');
314
+ set.add('ptTzeOnly');
315
+ }
316
+ else if (m.tapeSystem === 'hse-2to1' || m.tapeSystem === 'hse-3to1') {
317
+ set.add('ptTzeHse');
318
+ }
319
+ return set;
320
+ }
321
+ it('every (engine class, media row) cell matches expectation', () => {
322
+ for (const m of Object.values(MEDIA)) {
323
+ const expected = expectedClassesFor(m);
324
+ for (const key of Object.keys(CLASSES)) {
325
+ const got = mediaCompatibleWith(m, CLASSES[key]);
326
+ const want = expected.has(key);
327
+ expect(got, `${m.name} (id ${m.id.toString()}) on ${key}`).toBe(want);
328
+ }
329
+ }
330
+ });
331
+ it('PT-P910BT does not surface HSe media', () => {
332
+ // Strictly redundant with the matrix above, but worth keeping
333
+ // separately so a future bisect on a "P910BT shows HSe media"
334
+ // report finds a test named after the case.
335
+ const engine = DEVICES.PT_P910BT.engines[0];
336
+ for (const m of Object.values(MEDIA)) {
337
+ if (m.tapeSystem === 'hse-2to1' || m.tapeSystem === 'hse-3to1') {
338
+ expect(mediaCompatibleWith(m, engine), m.name).toBe(false);
339
+ }
340
+ }
341
+ });
92
342
  });
93
343
  //# sourceMappingURL=media.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"media.test.js","sourceRoot":"","sources":["../../src/__tests__/media.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"media.test.js","sourceRoot":"","sources":["../../src/__tests__/media.test.ts"],"names":[],"mappings":"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"}