@tx5dr/contracts 1.7.2 → 1.7.4

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 (142) hide show
  1. package/dist/index.d.ts +5 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +7 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/schema/__tests__/ability.test.d.ts +2 -0
  6. package/dist/schema/__tests__/ability.test.d.ts.map +1 -0
  7. package/dist/schema/__tests__/ability.test.js +32 -0
  8. package/dist/schema/__tests__/ability.test.js.map +1 -0
  9. package/dist/schema/__tests__/audio.schema.test.js +4 -0
  10. package/dist/schema/__tests__/audio.schema.test.js.map +1 -1
  11. package/dist/schema/__tests__/cw-decoder.schema.test.d.ts +2 -0
  12. package/dist/schema/__tests__/cw-decoder.schema.test.d.ts.map +1 -0
  13. package/dist/schema/__tests__/cw-decoder.schema.test.js +114 -0
  14. package/dist/schema/__tests__/cw-decoder.schema.test.js.map +1 -0
  15. package/dist/schema/__tests__/device-ui.schema.test.d.ts +2 -0
  16. package/dist/schema/__tests__/device-ui.schema.test.d.ts.map +1 -0
  17. package/dist/schema/__tests__/device-ui.schema.test.js +111 -0
  18. package/dist/schema/__tests__/device-ui.schema.test.js.map +1 -0
  19. package/dist/schema/__tests__/operator.schema.test.d.ts +2 -0
  20. package/dist/schema/__tests__/operator.schema.test.d.ts.map +1 -0
  21. package/dist/schema/__tests__/operator.schema.test.js +23 -0
  22. package/dist/schema/__tests__/operator.schema.test.js.map +1 -0
  23. package/dist/schema/__tests__/process-monitor.schema.test.d.ts +2 -0
  24. package/dist/schema/__tests__/process-monitor.schema.test.d.ts.map +1 -0
  25. package/dist/schema/__tests__/process-monitor.schema.test.js +235 -0
  26. package/dist/schema/__tests__/process-monitor.schema.test.js.map +1 -0
  27. package/dist/schema/__tests__/radio.schema.test.d.ts +2 -0
  28. package/dist/schema/__tests__/radio.schema.test.d.ts.map +1 -0
  29. package/dist/schema/__tests__/radio.schema.test.js +143 -0
  30. package/dist/schema/__tests__/radio.schema.test.js.map +1 -0
  31. package/dist/schema/ability.d.ts +3 -1
  32. package/dist/schema/ability.d.ts.map +1 -1
  33. package/dist/schema/ability.js +11 -0
  34. package/dist/schema/ability.js.map +1 -1
  35. package/dist/schema/api-response.schema.d.ts +170 -3
  36. package/dist/schema/api-response.schema.d.ts.map +1 -1
  37. package/dist/schema/api-response.schema.js +22 -0
  38. package/dist/schema/api-response.schema.js.map +1 -1
  39. package/dist/schema/audio.schema.d.ts +369 -0
  40. package/dist/schema/audio.schema.d.ts.map +1 -1
  41. package/dist/schema/audio.schema.js +3 -0
  42. package/dist/schema/audio.schema.js.map +1 -1
  43. package/dist/schema/cpu-profile.schema.d.ts +6 -6
  44. package/dist/schema/cw-decoder.schema.d.ts +2501 -0
  45. package/dist/schema/cw-decoder.schema.d.ts.map +1 -0
  46. package/dist/schema/cw-decoder.schema.js +196 -0
  47. package/dist/schema/cw-decoder.schema.js.map +1 -0
  48. package/dist/schema/cw-keyer.schema.d.ts +368 -0
  49. package/dist/schema/cw-keyer.schema.d.ts.map +1 -0
  50. package/dist/schema/cw-keyer.schema.js +143 -0
  51. package/dist/schema/cw-keyer.schema.js.map +1 -0
  52. package/dist/schema/desktop-https.schema.js +1 -1
  53. package/dist/schema/desktop-https.schema.js.map +1 -1
  54. package/dist/schema/device-ui.schema.d.ts +1782 -0
  55. package/dist/schema/device-ui.schema.d.ts.map +1 -0
  56. package/dist/schema/device-ui.schema.js +156 -0
  57. package/dist/schema/device-ui.schema.js.map +1 -0
  58. package/dist/schema/logbook.schema.d.ts +2 -2
  59. package/dist/schema/mode.schema.d.ts +1 -0
  60. package/dist/schema/mode.schema.d.ts.map +1 -1
  61. package/dist/schema/mode.schema.js +8 -0
  62. package/dist/schema/mode.schema.js.map +1 -1
  63. package/dist/schema/operator.schema.d.ts +10 -10
  64. package/dist/schema/operator.schema.d.ts.map +1 -1
  65. package/dist/schema/operator.schema.js +6 -1
  66. package/dist/schema/operator.schema.js.map +1 -1
  67. package/dist/schema/plugin.schema.d.ts +653 -70
  68. package/dist/schema/plugin.schema.d.ts.map +1 -1
  69. package/dist/schema/plugin.schema.js +22 -2
  70. package/dist/schema/plugin.schema.js.map +1 -1
  71. package/dist/schema/process-monitor.schema.d.ts +3102 -42
  72. package/dist/schema/process-monitor.schema.d.ts.map +1 -1
  73. package/dist/schema/process-monitor.schema.js +54 -0
  74. package/dist/schema/process-monitor.schema.js.map +1 -1
  75. package/dist/schema/radio-capability.schema.d.ts +7 -7
  76. package/dist/schema/radio-capability.schema.d.ts.map +1 -1
  77. package/dist/schema/radio-capability.schema.js +41 -0
  78. package/dist/schema/radio-capability.schema.js.map +1 -1
  79. package/dist/schema/radio-power.schema.d.ts +6 -0
  80. package/dist/schema/radio-power.schema.d.ts.map +1 -1
  81. package/dist/schema/radio-profile.schema.d.ts +86 -0
  82. package/dist/schema/radio-profile.schema.d.ts.map +1 -1
  83. package/dist/schema/radio.schema.d.ts +166 -9
  84. package/dist/schema/radio.schema.d.ts.map +1 -1
  85. package/dist/schema/radio.schema.js +82 -0
  86. package/dist/schema/radio.schema.js.map +1 -1
  87. package/dist/schema/realtime.schema.d.ts +6 -6
  88. package/dist/schema/slot-info.schema.d.ts +136 -0
  89. package/dist/schema/slot-info.schema.d.ts.map +1 -1
  90. package/dist/schema/slot-info.schema.js +27 -2
  91. package/dist/schema/slot-info.schema.js.map +1 -1
  92. package/dist/schema/spectrum.schema.d.ts +24 -24
  93. package/dist/schema/voice-keyer.schema.d.ts +2 -2
  94. package/dist/schema/voice.schema.d.ts +1 -1
  95. package/dist/schema/voice.schema.d.ts.map +1 -1
  96. package/dist/schema/voice.schema.js +1 -1
  97. package/dist/schema/voice.schema.js.map +1 -1
  98. package/dist/schema/websocket.schema.d.ts +6066 -639
  99. package/dist/schema/websocket.schema.d.ts.map +1 -1
  100. package/dist/schema/websocket.schema.js +106 -4
  101. package/dist/schema/websocket.schema.js.map +1 -1
  102. package/dist/utils/__tests__/cwTiming.test.d.ts +2 -0
  103. package/dist/utils/__tests__/cwTiming.test.d.ts.map +1 -0
  104. package/dist/utils/__tests__/cwTiming.test.js +74 -0
  105. package/dist/utils/__tests__/cwTiming.test.js.map +1 -0
  106. package/dist/utils/callsign.d.ts +2 -0
  107. package/dist/utils/callsign.d.ts.map +1 -0
  108. package/dist/utils/callsign.js +8 -0
  109. package/dist/utils/callsign.js.map +1 -0
  110. package/dist/utils/cwTiming.d.ts +36 -0
  111. package/dist/utils/cwTiming.d.ts.map +1 -0
  112. package/dist/utils/cwTiming.js +155 -0
  113. package/dist/utils/cwTiming.js.map +1 -0
  114. package/package.json +1 -1
  115. package/src/index.ts +9 -0
  116. package/src/schema/__tests__/ability.test.ts +40 -0
  117. package/src/schema/__tests__/audio.schema.test.ts +4 -0
  118. package/src/schema/__tests__/cw-decoder.schema.test.ts +127 -0
  119. package/src/schema/__tests__/device-ui.schema.test.ts +122 -0
  120. package/src/schema/__tests__/operator.schema.test.ts +29 -0
  121. package/src/schema/__tests__/process-monitor.schema.test.ts +245 -0
  122. package/src/schema/__tests__/radio.schema.test.ts +160 -0
  123. package/src/schema/ability.ts +13 -0
  124. package/src/schema/api-response.schema.ts +22 -0
  125. package/src/schema/audio.schema.ts +3 -0
  126. package/src/schema/cw-decoder.schema.ts +234 -0
  127. package/src/schema/cw-keyer.schema.ts +177 -0
  128. package/src/schema/desktop-https.schema.ts +1 -1
  129. package/src/schema/device-ui.schema.ts +182 -0
  130. package/src/schema/mode.schema.ts +8 -0
  131. package/src/schema/operator.schema.ts +7 -1
  132. package/src/schema/plugin.schema.ts +28 -2
  133. package/src/schema/process-monitor.schema.ts +69 -0
  134. package/src/schema/radio-capability.schema.ts +41 -0
  135. package/src/schema/radio.schema.ts +97 -0
  136. package/src/schema/slot-info.schema.ts +33 -2
  137. package/src/schema/voice.schema.ts +1 -1
  138. package/src/schema/websocket.schema.ts +147 -4
  139. package/src/utils/__tests__/cwTiming.test.ts +91 -0
  140. package/src/utils/callsign.ts +9 -0
  141. package/src/utils/cwTiming.ts +203 -0
  142. package/test/decode-request-schema.test.ts +48 -0
package/dist/index.d.ts CHANGED
@@ -41,8 +41,12 @@ export * from './schema/auth.schema.js';
41
41
  export * from './schema/system.schema.js';
42
42
  export * from './schema/voice.schema.js';
43
43
  export * from './schema/voice-keyer.schema.js';
44
+ export * from './schema/cw-keyer.schema.js';
45
+ export * from './schema/cw-decoder.schema.js';
44
46
  export * from './schema/station-info.schema.js';
45
47
  export * from './utils/grid.js';
48
+ export * from './utils/callsign.js';
49
+ export * from './utils/cwTiming.js';
46
50
  export * from './schema/process-monitor.schema.js';
47
51
  export * from './schema/cpu-profile.schema.js';
48
52
  export * from './schema/openwebrx.schema.js';
@@ -53,6 +57,7 @@ export * from './schema/audio-sidecar.schema.js';
53
57
  export * from './schema/rigctld.schema.js';
54
58
  export * from './schema/realtime.schema.js';
55
59
  export * from './schema/desktop-https.schema.js';
60
+ export * from './schema/device-ui.schema.js';
56
61
  export * from './schema/plugin.schema.js';
57
62
  export * from './schema/update.schema.js';
58
63
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,iCAAiC,CAAC;AAChD,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AAGzC,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACf,MAAM,8BAA8B,CAAC;AAGtC,YAAY,EACV,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,QAAQ,EACT,MAAM,8BAA8B,CAAC;AAEtC,YAAY,EACV,cAAc,EACf,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,aAAa,EACd,MAAM,8BAA8B,CAAC;AAEtC,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,6BAA6B,EAC7B,2BAA2B,EAC3B,gCAAgC,EAChC,sCAAsC,EACtC,kCAAkC,GAEnC,MAAM,8BAA8B,CAAC;AAGtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AAGzC,cAAc,0BAA0B,CAAC;AAGzC,cAAc,yBAAyB,CAAC;AAGxC,cAAc,0BAA0B,CAAC;AAGzC,cAAc,0BAA0B,CAAC;AAGzC,cAAc,wBAAwB,CAAC;AAGvC,cAAc,0BAA0B,CAAC;AAGzC,cAAc,yBAAyB,CAAC;AAGxC,cAAc,6BAA6B,CAAC;AAG5C,cAAc,wBAAwB,CAAC;AAGvC,cAAc,8BAA8B,CAAC;AAG7C,cAAc,8BAA8B,CAAC;AAG7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AAGzC,cAAc,iCAAiC,CAAC;AAGhD,cAAc,iCAAiC,CAAC;AAGhD,cAAc,gCAAgC,CAAC;AAG/C,cAAc,kCAAkC,CAAC;AAGjD,cAAc,qBAAqB,CAAC;AAGpC,cAAc,yBAAyB,CAAC;AAGxC,cAAc,2BAA2B,CAAC;AAG1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAG/C,cAAc,iCAAiC,CAAC;AAGhD,cAAc,iBAAiB,CAAC;AAGhC,cAAc,oCAAoC,CAAC;AAGnD,cAAc,gCAAgC,CAAC;AAG/C,cAAc,8BAA8B,CAAC;AAG7C,cAAc,qCAAqC,CAAC;AAGpD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAGhD,cAAc,kCAAkC,CAAC;AAGjD,cAAc,4BAA4B,CAAC;AAG3C,cAAc,6BAA6B,CAAC;AAG5C,cAAc,kCAAkC,CAAC;AAGjD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,iCAAiC,CAAC;AAChD,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AAGzC,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACf,MAAM,8BAA8B,CAAC;AAGtC,YAAY,EACV,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,QAAQ,EACT,MAAM,8BAA8B,CAAC;AAEtC,YAAY,EACV,cAAc,EACf,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,aAAa,EACd,MAAM,8BAA8B,CAAC;AAEtC,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,6BAA6B,EAC7B,2BAA2B,EAC3B,gCAAgC,EAChC,sCAAsC,EACtC,kCAAkC,GAEnC,MAAM,8BAA8B,CAAC;AAGtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AAGzC,cAAc,0BAA0B,CAAC;AAGzC,cAAc,yBAAyB,CAAC;AAGxC,cAAc,0BAA0B,CAAC;AAGzC,cAAc,0BAA0B,CAAC;AAGzC,cAAc,wBAAwB,CAAC;AAGvC,cAAc,0BAA0B,CAAC;AAGzC,cAAc,yBAAyB,CAAC;AAGxC,cAAc,6BAA6B,CAAC;AAG5C,cAAc,wBAAwB,CAAC;AAGvC,cAAc,8BAA8B,CAAC;AAG7C,cAAc,8BAA8B,CAAC;AAG7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AAGzC,cAAc,iCAAiC,CAAC;AAGhD,cAAc,iCAAiC,CAAC;AAGhD,cAAc,gCAAgC,CAAC;AAG/C,cAAc,kCAAkC,CAAC;AAGjD,cAAc,qBAAqB,CAAC;AAGpC,cAAc,yBAAyB,CAAC;AAGxC,cAAc,2BAA2B,CAAC;AAG1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAG/C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAG9C,cAAc,iCAAiC,CAAC;AAGhD,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AAGpC,cAAc,oCAAoC,CAAC;AAGnD,cAAc,gCAAgC,CAAC;AAG/C,cAAc,8BAA8B,CAAC;AAG7C,cAAc,qCAAqC,CAAC;AAGpD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAGhD,cAAc,kCAAkC,CAAC;AAGjD,cAAc,4BAA4B,CAAC;AAG3C,cAAc,6BAA6B,CAAC;AAG5C,cAAc,kCAAkC,CAAC;AAGjD,cAAc,8BAA8B,CAAC;AAG7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC"}
package/dist/index.js CHANGED
@@ -61,10 +61,15 @@ export * from './schema/system.schema.js';
61
61
  // Voice Schema
62
62
  export * from './schema/voice.schema.js';
63
63
  export * from './schema/voice-keyer.schema.js';
64
+ // CW Keyer Schema
65
+ export * from './schema/cw-keyer.schema.js';
66
+ export * from './schema/cw-decoder.schema.js';
64
67
  // Station Info Schema
65
68
  export * from './schema/station-info.schema.js';
66
69
  // Grid Utils
67
70
  export * from './utils/grid.js';
71
+ export * from './utils/callsign.js';
72
+ export * from './utils/cwTiming.js';
68
73
  // Process Monitor Schema
69
74
  export * from './schema/process-monitor.schema.js';
70
75
  // CPU Profile Schema
@@ -84,6 +89,8 @@ export * from './schema/rigctld.schema.js';
84
89
  export * from './schema/realtime.schema.js';
85
90
  // Desktop HTTPS Schema
86
91
  export * from './schema/desktop-https.schema.js';
92
+ // Device UI Schema
93
+ export * from './schema/device-ui.schema.js';
87
94
  // Plugin Schema
88
95
  export * from './schema/plugin.schema.js';
89
96
  export * from './schema/update.schema.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iBAAiB;AACjB,cAAc,iCAAiC,CAAC;AAChD,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AAEzC,oDAAoD;AACpD,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACf,MAAM,8BAA8B,CAAC;AAetC,OAAO,EACL,aAAa,EACd,MAAM,8BAA8B,CAAC;AActC,mBAAmB;AACnB,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AAEzC,WAAW;AACX,cAAc,0BAA0B,CAAC;AAEzC,YAAY;AACZ,cAAc,yBAAyB,CAAC;AAExC,eAAe;AACf,cAAc,0BAA0B,CAAC;AAEzC,eAAe;AACf,cAAc,0BAA0B,CAAC;AAEzC,aAAa;AACb,cAAc,wBAAwB,CAAC;AAEvC,eAAe;AACf,cAAc,0BAA0B,CAAC;AAEzC,cAAc;AACd,cAAc,yBAAyB,CAAC;AAExC,kBAAkB;AAClB,cAAc,6BAA6B,CAAC;AAE5C,eAAe;AACf,cAAc,wBAAwB,CAAC;AAEvC,mBAAmB;AACnB,cAAc,8BAA8B,CAAC;AAE7C,mBAAmB;AACnB,cAAc,8BAA8B,CAAC;AAE7C,iBAAiB;AACjB,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AAEzC,sBAAsB;AACtB,cAAc,iCAAiC,CAAC;AAEhD,+BAA+B;AAC/B,cAAc,iCAAiC,CAAC;AAEhD,qBAAqB;AACrB,cAAc,gCAAgC,CAAC;AAE/C,uBAAuB;AACvB,cAAc,kCAAkC,CAAC;AAEjD,oEAAoE;AACpE,cAAc,qBAAqB,CAAC;AAEpC,cAAc;AACd,cAAc,yBAAyB,CAAC;AAExC,gBAAgB;AAChB,cAAc,2BAA2B,CAAC;AAE1C,eAAe;AACf,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAE/C,sBAAsB;AACtB,cAAc,iCAAiC,CAAC;AAEhD,aAAa;AACb,cAAc,iBAAiB,CAAC;AAEhC,yBAAyB;AACzB,cAAc,oCAAoC,CAAC;AAEnD,qBAAqB;AACrB,cAAc,gCAAgC,CAAC;AAE/C,mBAAmB;AACnB,cAAc,8BAA8B,CAAC;AAE7C,0BAA0B;AAC1B,cAAc,qCAAqC,CAAC;AAEpD,qBAAqB;AACrB,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAEhD,uBAAuB;AACvB,cAAc,kCAAkC,CAAC;AAEjD,wBAAwB;AACxB,cAAc,4BAA4B,CAAC;AAE3C,kBAAkB;AAClB,cAAc,6BAA6B,CAAC;AAE5C,uBAAuB;AACvB,cAAc,kCAAkC,CAAC;AAEjD,gBAAgB;AAChB,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iBAAiB;AACjB,cAAc,iCAAiC,CAAC;AAChD,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AAEzC,oDAAoD;AACpD,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACf,MAAM,8BAA8B,CAAC;AAetC,OAAO,EACL,aAAa,EACd,MAAM,8BAA8B,CAAC;AActC,mBAAmB;AACnB,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AAEzC,WAAW;AACX,cAAc,0BAA0B,CAAC;AAEzC,YAAY;AACZ,cAAc,yBAAyB,CAAC;AAExC,eAAe;AACf,cAAc,0BAA0B,CAAC;AAEzC,eAAe;AACf,cAAc,0BAA0B,CAAC;AAEzC,aAAa;AACb,cAAc,wBAAwB,CAAC;AAEvC,eAAe;AACf,cAAc,0BAA0B,CAAC;AAEzC,cAAc;AACd,cAAc,yBAAyB,CAAC;AAExC,kBAAkB;AAClB,cAAc,6BAA6B,CAAC;AAE5C,eAAe;AACf,cAAc,wBAAwB,CAAC;AAEvC,mBAAmB;AACnB,cAAc,8BAA8B,CAAC;AAE7C,mBAAmB;AACnB,cAAc,8BAA8B,CAAC;AAE7C,iBAAiB;AACjB,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AAEzC,sBAAsB;AACtB,cAAc,iCAAiC,CAAC;AAEhD,+BAA+B;AAC/B,cAAc,iCAAiC,CAAC;AAEhD,qBAAqB;AACrB,cAAc,gCAAgC,CAAC;AAE/C,uBAAuB;AACvB,cAAc,kCAAkC,CAAC;AAEjD,oEAAoE;AACpE,cAAc,qBAAqB,CAAC;AAEpC,cAAc;AACd,cAAc,yBAAyB,CAAC;AAExC,gBAAgB;AAChB,cAAc,2BAA2B,CAAC;AAE1C,eAAe;AACf,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAE/C,kBAAkB;AAClB,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAE9C,sBAAsB;AACtB,cAAc,iCAAiC,CAAC;AAEhD,aAAa;AACb,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AAEpC,yBAAyB;AACzB,cAAc,oCAAoC,CAAC;AAEnD,qBAAqB;AACrB,cAAc,gCAAgC,CAAC;AAE/C,mBAAmB;AACnB,cAAc,8BAA8B,CAAC;AAE7C,0BAA0B;AAC1B,cAAc,qCAAqC,CAAC;AAEpD,qBAAqB;AACrB,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAEhD,uBAAuB;AACvB,cAAc,kCAAkC,CAAC;AAEjD,wBAAwB;AACxB,cAAc,4BAA4B,CAAC;AAE3C,kBAAkB;AAClB,cAAc,6BAA6B,CAAC;AAE5C,uBAAuB;AACvB,cAAc,kCAAkC,CAAC;AAEjD,mBAAmB;AACnB,cAAc,8BAA8B,CAAC;AAE7C,gBAAgB;AAChB,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ability.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ability.test.d.ts","sourceRoot":"","sources":["../../../src/schema/__tests__/ability.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { buildAbilityRules, Permission, PERMISSION_GROUPS, PERMISSION_RULE_MAP, } from '../ability.js';
3
+ import { UserRole } from '../auth.schema.js';
4
+ describe('ability contracts', () => {
5
+ it('maps CW decoder permissions to separate control and config capabilities', () => {
6
+ expect(PERMISSION_RULE_MAP[Permission.CW_DECODER_CONTROL]).toEqual({
7
+ action: 'execute',
8
+ subject: 'CWDecoder',
9
+ });
10
+ expect(PERMISSION_RULE_MAP[Permission.CW_DECODER_CONFIG]).toEqual({
11
+ action: 'update',
12
+ subject: 'CWDecoderConfig',
13
+ });
14
+ });
15
+ it('keeps CW decoder permissions delegatable instead of granting them to every operator', () => {
16
+ expect(buildAbilityRules({ role: UserRole.OPERATOR, operatorIds: ['op1'] }))
17
+ .not.toContainEqual({ action: 'execute', subject: 'CWDecoder' });
18
+ expect(buildAbilityRules({
19
+ role: UserRole.OPERATOR,
20
+ operatorIds: ['op1'],
21
+ permissionGrants: [{ permission: Permission.CW_DECODER_CONTROL }],
22
+ })).toContainEqual({ action: 'execute', subject: 'CWDecoder' });
23
+ });
24
+ it('exposes CW permissions in the token permission groups', () => {
25
+ const cwGroup = PERMISSION_GROUPS.find(group => group.key === 'cw');
26
+ expect(cwGroup?.permissions).toEqual([
27
+ Permission.CW_DECODER_CONTROL,
28
+ Permission.CW_DECODER_CONFIG,
29
+ ]);
30
+ });
31
+ });
32
+ //# sourceMappingURL=ability.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ability.test.js","sourceRoot":"","sources":["../../../src/schema/__tests__/ability.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,iBAAiB,EACjB,UAAU,EACV,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,CAAC,mBAAmB,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC;YACjE,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,WAAW;SACrB,CAAC,CAAC;QACH,MAAM,CAAC,mBAAmB,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC;YAChE,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,iBAAiB;SAC3B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qFAAqF,EAAE,GAAG,EAAE;QAC7F,MAAM,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;aACzE,GAAG,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;QAEnE,MAAM,CAAC,iBAAiB,CAAC;YACvB,IAAI,EAAE,QAAQ,CAAC,QAAQ;YACvB,WAAW,EAAE,CAAC,KAAK,CAAC;YACpB,gBAAgB,EAAE,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,kBAAkB,EAAE,CAAC;SAClE,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;QACpE,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,OAAO,CAAC;YACnC,UAAU,CAAC,kBAAkB;YAC7B,UAAU,CAAC,iBAAiB;SAC7B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -8,6 +8,9 @@ const device = {
8
8
  sampleRate: 48000,
9
9
  sampleRates: [44100, 48000],
10
10
  type: 'input',
11
+ availability: 'available',
12
+ isActiveByTx5dr: false,
13
+ lastSeenAt: 1_700_000_000_000,
11
14
  };
12
15
  describe('audio device resolution schemas', () => {
13
16
  it('accepts every resolution status', () => {
@@ -56,6 +59,7 @@ describe('audio device resolution schemas', () => {
56
59
  outputBufferSizes: [128, 256, 512, 768, 1024],
57
60
  });
58
61
  expect(parsed.inputDevices[0]?.sampleRates).toEqual([44100, 48000]);
62
+ expect(parsed.inputDevices[0]?.availability).toBe('available');
59
63
  expect(parsed.inputBufferSizes).toContain(768);
60
64
  });
61
65
  it('accepts legacy and split audio settings', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"audio.schema.test.js","sourceRoot":"","sources":["../../../src/schema/__tests__/audio.schema.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audio.schema.test.js","sourceRoot":"","sources":["../../../src/schema/__tests__/audio.schema.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cw-decoder.schema.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cw-decoder.schema.test.d.ts","sourceRoot":"","sources":["../../../src/schema/__tests__/cw-decoder.schema.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,114 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { CWDecoderConfigSchema, CWDecoderEventSchema, CWDecoderStatusSchema, CWDecoderTuningUpdateSchema, } from '../cw-decoder.schema.js';
3
+ describe('CW decoder contracts', () => {
4
+ it('parses v1 defaults', () => {
5
+ expect(CWDecoderConfigSchema.parse({})).toMatchObject({
6
+ enabled: false,
7
+ backend: 'deepcw-onnx',
8
+ runtimeBackend: 'cpu',
9
+ modelSize: 'tiny',
10
+ language: 'en',
11
+ mode: 'streaming',
12
+ targetFreqHz: 800,
13
+ filterWidthHz: 800,
14
+ windowSeconds: 12,
15
+ decodeIntervalMs: 1000,
16
+ muteWhileTransmitting: true,
17
+ workerCount: 1,
18
+ minCommitChars: 1,
19
+ commitStability: 2,
20
+ maxPendingAgeMs: 4000,
21
+ });
22
+ });
23
+ it('accepts pending and commit transcript events', () => {
24
+ expect(CWDecoderEventSchema.parse({
25
+ kind: 'pending',
26
+ text: 'CQ TEST',
27
+ confidence: 0.8,
28
+ timestamp: 1,
29
+ })).toMatchObject({ kind: 'pending', text: 'CQ TEST' });
30
+ expect(CWDecoderEventSchema.parse({
31
+ kind: 'commit',
32
+ text: 'CQ TEST',
33
+ confidence: 0.9,
34
+ timestamp: 2,
35
+ segment: {
36
+ id: 'seg-1',
37
+ sessionId: 'session-1',
38
+ sequence: 1,
39
+ text: 'CQ TEST',
40
+ startedAt: 1,
41
+ updatedAt: 2,
42
+ endedAt: 2,
43
+ confidence: 0.9,
44
+ finalized: true,
45
+ prependSpace: true,
46
+ },
47
+ })).toMatchObject({ kind: 'commit', segment: { finalized: true } });
48
+ });
49
+ it('accepts structured transcript reset, pending, and commit events', () => {
50
+ expect(CWDecoderEventSchema.parse({
51
+ kind: 'transcript_reset',
52
+ sessionId: 'session-1',
53
+ timestamp: 1,
54
+ })).toMatchObject({ kind: 'transcript_reset', sessionId: 'session-1' });
55
+ expect(CWDecoderEventSchema.parse({
56
+ kind: 'transcript_pending',
57
+ pending: {
58
+ sessionId: 'session-1',
59
+ version: 1,
60
+ text: 'CQ TE',
61
+ plainText: 'CQ TE',
62
+ finalized: false,
63
+ confidence: 0.7,
64
+ targetFreqHz: 800,
65
+ filterWidthHz: 800,
66
+ updatedAt: 2,
67
+ },
68
+ timestamp: 2,
69
+ })).toMatchObject({ kind: 'transcript_pending', pending: { finalized: false, version: 1 } });
70
+ expect(CWDecoderEventSchema.parse({
71
+ kind: 'transcript_commit',
72
+ segment: {
73
+ id: 'seg-1',
74
+ sessionId: 'session-1',
75
+ sequence: 1,
76
+ text: 'CQ TEST',
77
+ plainText: 'CQ TEST',
78
+ finalized: true,
79
+ prependSpace: false,
80
+ confidence: 0.9,
81
+ targetFreqHz: 800,
82
+ filterWidthHz: 800,
83
+ characterSpans: [{ char: 'C', startFrame: 1, endFrame: 2 }],
84
+ wordSpaceSpans: [{ startFrame: 10, endFrame: 12 }],
85
+ startedAt: 1,
86
+ endedAt: 3,
87
+ updatedAt: 3,
88
+ },
89
+ timestamp: 3,
90
+ })).toMatchObject({ kind: 'transcript_commit', segment: { sequence: 1, prependSpace: false } });
91
+ });
92
+ it('rejects model sizes that are not packaged in v1', () => {
93
+ expect(() => CWDecoderConfigSchema.parse({ modelSize: 'base' })).toThrow();
94
+ });
95
+ it('validates runtime tuning updates', () => {
96
+ expect(CWDecoderTuningUpdateSchema.parse({ targetFreqHz: 650 })).toEqual({ targetFreqHz: 650 });
97
+ expect(CWDecoderTuningUpdateSchema.parse({ filterWidthHz: 250 })).toEqual({ filterWidthHz: 250 });
98
+ expect(() => CWDecoderTuningUpdateSchema.parse({})).toThrow();
99
+ expect(() => CWDecoderTuningUpdateSchema.parse({ targetFreqHz: 50 })).toThrow();
100
+ expect(() => CWDecoderTuningUpdateSchema.parse({ filterWidthHz: 900 })).toThrow();
101
+ });
102
+ it('represents muted listening state', () => {
103
+ const config = CWDecoderConfigSchema.parse({ enabled: true });
104
+ expect(CWDecoderStatusSchema.parse({
105
+ enabled: true,
106
+ state: 'muted',
107
+ config,
108
+ muted: true,
109
+ active: false,
110
+ updatedAt: 3,
111
+ })).toMatchObject({ state: 'muted', muted: true });
112
+ });
113
+ });
114
+ //# sourceMappingURL=cw-decoder.schema.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cw-decoder.schema.test.js","sourceRoot":"","sources":["../../../src/schema/__tests__/cw-decoder.schema.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=device-ui.schema.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-ui.schema.test.d.ts","sourceRoot":"","sources":["../../../src/schema/__tests__/device-ui.schema.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,111 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { DeviceUiBootstrapSnapshotSchema, DeviceUiWsEventSchema, DeviceUiJwtPayloadSchema, DeviceUiSessionRequestSchema, DeviceUiSessionResponseSchema, } from '../device-ui.schema.js';
3
+ describe('device UI schemas', () => {
4
+ it('accepts the dedicated device UI JWT payload only', () => {
5
+ expect(DeviceUiJwtPayloadSchema.parse({
6
+ typ: 'device-ui',
7
+ aud: 'tx5dr-device-ui',
8
+ deviceId: 'panel-1',
9
+ sessionId: 'session-1',
10
+ iat: 1,
11
+ exp: 2,
12
+ }).aud).toBe('tx5dr-device-ui');
13
+ expect(() => DeviceUiJwtPayloadSchema.parse({
14
+ typ: 'access',
15
+ aud: 'tx5dr-device-ui',
16
+ deviceId: 'panel-1',
17
+ sessionId: 'session-1',
18
+ iat: 1,
19
+ exp: 2,
20
+ })).toThrow();
21
+ });
22
+ it('describes session request and response contracts', () => {
23
+ expect(DeviceUiSessionRequestSchema.parse({ deviceId: 'panel-1', sessionToken: 'secret' }).deviceId).toBe('panel-1');
24
+ expect(DeviceUiSessionResponseSchema.parse({
25
+ jwt: 'jwt',
26
+ deviceId: 'panel-1',
27
+ sessionId: 'session-1',
28
+ expiresAt: 1_700_000_001_000,
29
+ }).sessionId).toBe('session-1');
30
+ });
31
+ it('describes the mode-aware bootstrap snapshot and WS event', () => {
32
+ const snapshot = DeviceUiBootstrapSnapshotSchema.parse({
33
+ server: { status: 'ok', version: 'test', webPort: 8076 },
34
+ station: { callsign: 'BG5DRB', callsigns: ['BG5DRB', 'BG5AAA'] },
35
+ operators: [{ id: 'op1', callsign: 'BG5AAA', active: true, transmitting: false, ptt: false }],
36
+ engine: { running: true, mode: 'digital', currentMode: { name: 'FT8', slotMs: 15000 }, state: 'running' },
37
+ radio: { connected: true, frequency: 7074000, radioMode: 'USB-D', ptt: false, tx: false },
38
+ ft8: {
39
+ slot: null,
40
+ utc: null,
41
+ cycle: null,
42
+ periodMs: 15000,
43
+ recentDecodeRawMessages: ['CQ TEST AA00'],
44
+ lastDecodeRawMessage: 'CQ TEST AA00',
45
+ recentFramesSlotId: 'FT8-1',
46
+ recentFramesSlotStartMs: 1_700_000_000_000,
47
+ recentFrames: [{
48
+ slotId: 'FT8-1',
49
+ slotStartMs: 1_700_000_000_000,
50
+ snr: -10,
51
+ freq: 1200,
52
+ dt: 0.1,
53
+ message: 'CQ TEST AA00',
54
+ operatorId: null,
55
+ countryZh: '测试地区',
56
+ countryEn: 'Test Region',
57
+ }],
58
+ currentTx: { active: false, operatorIds: [], messages: [], lastMessage: null, slotStartMs: null },
59
+ },
60
+ voice: {
61
+ active: false,
62
+ radioMode: null,
63
+ pttLocked: false,
64
+ pttLockedByLabel: null,
65
+ keyerActive: false,
66
+ keyerMode: null,
67
+ keyerSlotId: null,
68
+ },
69
+ cw: {
70
+ decoder: {
71
+ enabled: false,
72
+ active: false,
73
+ state: 'disabled',
74
+ muted: false,
75
+ pendingText: '',
76
+ committedText: '',
77
+ lastDecodeAt: null,
78
+ updatedAt: 1,
79
+ },
80
+ keyer: {
81
+ active: false,
82
+ mode: null,
83
+ messageId: null,
84
+ currentText: null,
85
+ lastText: null,
86
+ },
87
+ currentTx: {
88
+ active: false,
89
+ messages: [],
90
+ lastMessage: null,
91
+ },
92
+ },
93
+ access: { localUrl: 'http://192.168.1.10:8076', localUrls: ['http://192.168.1.10:8076'] },
94
+ updatedAt: 1,
95
+ });
96
+ expect(snapshot.station.callsign).toBe('BG5DRB');
97
+ expect(snapshot.station.callsigns).toEqual(['BG5DRB', 'BG5AAA']);
98
+ expect(snapshot.operators[0]?.callsign).toBe('BG5AAA');
99
+ expect(snapshot.ft8.recentFramesSlotId).toBe('FT8-1');
100
+ expect(snapshot.ft8.recentFrames[0]?.slotId).toBe('FT8-1');
101
+ expect(snapshot.ft8.recentFrames[0]?.countryZh).toBe('测试地区');
102
+ expect(snapshot.ft8.lastDecodeRawMessage).toBe('CQ TEST AA00');
103
+ expect(snapshot.cw.decoder.state).toBe('disabled');
104
+ expect(DeviceUiWsEventSchema.parse({
105
+ type: 'snapshot',
106
+ payload: snapshot,
107
+ timestamp: '2026-05-14T00:00:00.000Z',
108
+ }).payload.server.status).toBe('ok');
109
+ });
110
+ });
111
+ //# sourceMappingURL=device-ui.schema.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-ui.schema.test.js","sourceRoot":"","sources":["../../../src/schema/__tests__/device-ui.schema.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=operator.schema.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator.schema.test.d.ts","sourceRoot":"","sources":["../../../src/schema/__tests__/operator.schema.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { CreateRadioOperatorRequestSchema, UpdateRadioOperatorRequestSchema, sanitizeCallsignInput } from '../../index.js';
3
+ import { MODES } from '../mode.schema.js';
4
+ describe('operator callsign normalization', () => {
5
+ it('uppercases callsigns while preserving portable separators', () => {
6
+ expect(sanitizeCallsignInput(' bg5abc/p ')).toBe('BG5ABC/P');
7
+ });
8
+ it('normalizes callsigns in create and update payloads', () => {
9
+ const createPayload = CreateRadioOperatorRequestSchema.parse({
10
+ myCallsign: 'bg5abc/p',
11
+ myGrid: 'OL63',
12
+ frequency: 1000,
13
+ transmitCycles: [0],
14
+ mode: MODES.FT8,
15
+ });
16
+ const updatePayload = UpdateRadioOperatorRequestSchema.parse({
17
+ myCallsign: 'vk9/bg3yza',
18
+ });
19
+ expect(createPayload.myCallsign).toBe('BG5ABC/P');
20
+ expect(updatePayload.myCallsign).toBe('VK9/BG3YZA');
21
+ });
22
+ });
23
+ //# sourceMappingURL=operator.schema.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator.schema.test.js","sourceRoot":"","sources":["../../../src/schema/__tests__/operator.schema.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,gCAAgC,EAChC,gCAAgC,EAChC,qBAAqB,EACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,aAAa,GAAG,gCAAgC,CAAC,KAAK,CAAC;YAC3D,UAAU,EAAE,UAAU;YACtB,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,IAAI;YACf,cAAc,EAAE,CAAC,CAAC,CAAC;YACnB,IAAI,EAAE,KAAK,CAAC,GAAG;SAChB,CAAC,CAAC;QACH,MAAM,aAAa,GAAG,gCAAgC,CAAC,KAAK,CAAC;YAC3D,UAAU,EAAE,YAAY;SACzB,CAAC,CAAC;QAEH,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClD,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=process-monitor.schema.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-monitor.schema.test.d.ts","sourceRoot":"","sources":["../../../src/schema/__tests__/process-monitor.schema.test.ts"],"names":[],"mappings":""}