@tx5dr/plugin-api 1.1.0 → 1.2.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.
@@ -0,0 +1,421 @@
1
+ /**
2
+ * ADIF (Amateur Data Interchange Format) utilities
3
+ *
4
+ * Provides parsing, generation and conversion of ADIF format records.
5
+ * Used by logbook sync plugins (WaveLog, QRZ, LoTW).
6
+ */
7
+ import { getBandFromFrequency, resolveDXCCEntity, DXCC_RESOLVER_VERSION } from '@tx5dr/core';
8
+ import { parseLegacyComment, resolveQsoComment } from './qso-text-fields.js';
9
+ function mapAdifModeToInternal(mode, submode) {
10
+ const normalizedMode = mode?.trim().toUpperCase();
11
+ const normalizedSubmode = submode?.trim().toUpperCase();
12
+ if (normalizedMode === 'MFSK' && normalizedSubmode === 'FT4') {
13
+ return { mode: 'FT4', submode: 'FT4' };
14
+ }
15
+ return {
16
+ mode: mode || 'FT8',
17
+ submode: submode || undefined,
18
+ };
19
+ }
20
+ function mapInternalModeToAdif(mode, submode) {
21
+ const normalizedMode = mode?.trim().toUpperCase();
22
+ const normalizedSubmode = submode?.trim().toUpperCase();
23
+ if (normalizedMode === 'FT4') {
24
+ return { mode: 'MFSK', submode: 'FT4' };
25
+ }
26
+ if (normalizedMode === 'MFSK' && normalizedSubmode) {
27
+ return { mode: 'MFSK', submode: normalizedSubmode };
28
+ }
29
+ return {
30
+ mode: mode || 'FT8',
31
+ submode: submode || undefined,
32
+ };
33
+ }
34
+ /**
35
+ * Format a Date as ADIF date string (YYYYMMDD).
36
+ */
37
+ export function formatADIFDate(date) {
38
+ const year = date.getUTCFullYear().toString().padStart(4, '0');
39
+ const month = (date.getUTCMonth() + 1).toString().padStart(2, '0');
40
+ const day = date.getUTCDate().toString().padStart(2, '0');
41
+ return `${year}${month}${day}`;
42
+ }
43
+ /**
44
+ * Format a Date as ADIF time string (HHMMSS).
45
+ */
46
+ export function formatADIFTime(date) {
47
+ const hours = date.getUTCHours().toString().padStart(2, '0');
48
+ const minutes = date.getUTCMinutes().toString().padStart(2, '0');
49
+ const seconds = date.getUTCSeconds().toString().padStart(2, '0');
50
+ return `${hours}${minutes}${seconds}`;
51
+ }
52
+ /**
53
+ * Parse ADIF date and time strings into an ISO date string.
54
+ * @param dateStr ADIF date format YYYYMMDD
55
+ * @param timeStr ADIF time format HHMMSS or HHMM
56
+ */
57
+ export function parseADIFDateTime(dateStr, timeStr) {
58
+ const year = dateStr.substring(0, 4);
59
+ const month = dateStr.substring(4, 6);
60
+ const day = dateStr.substring(6, 8);
61
+ const hour = timeStr.substring(0, 2);
62
+ const minute = timeStr.substring(2, 4);
63
+ const second = timeStr.substring(4, 6) || '00';
64
+ return new Date(`${year}-${month}-${day}T${hour}:${minute}:${second}Z`).toISOString();
65
+ }
66
+ /**
67
+ * Convert a QSORecord to a single ADIF record string.
68
+ */
69
+ export function convertQSOToADIF(qso, options) {
70
+ const adifFields = [];
71
+ const opts = { includeStationCallsign: false, includeMyGrid: true, ...options };
72
+ const adifMode = mapInternalModeToAdif(qso.mode, qso.submode);
73
+ adifFields.push(`<call:${qso.callsign.length}>${qso.callsign}`);
74
+ const startTime = new Date(qso.startTime);
75
+ const qsoDate = formatADIFDate(startTime);
76
+ const qsoTime = formatADIFTime(startTime);
77
+ adifFields.push(`<qso_date:8>${qsoDate}`);
78
+ adifFields.push(`<time_on:6>${qsoTime}`);
79
+ if (qso.endTime) {
80
+ const endTime = new Date(qso.endTime);
81
+ adifFields.push(`<qso_date_off:8>${formatADIFDate(endTime)}`);
82
+ adifFields.push(`<time_off:6>${formatADIFTime(endTime)}`);
83
+ }
84
+ else {
85
+ adifFields.push(`<qso_date_off:8>${qsoDate}`);
86
+ adifFields.push(`<time_off:6>${qsoTime}`);
87
+ }
88
+ if (adifMode.mode) {
89
+ adifFields.push(`<mode:${adifMode.mode.length}>${adifMode.mode}`);
90
+ }
91
+ if (adifMode.submode) {
92
+ adifFields.push(`<submode:${adifMode.submode.length}>${adifMode.submode}`);
93
+ }
94
+ const freqMHz = (qso.frequency / 1000000).toFixed(6);
95
+ adifFields.push(`<freq:${freqMHz.length}>${freqMHz}`);
96
+ const band = getBandFromFrequency(qso.frequency);
97
+ if (band !== 'Unknown') {
98
+ adifFields.push(`<band:${band.length}>${band}`);
99
+ }
100
+ if (qso.grid) {
101
+ adifFields.push(`<gridsquare:${qso.grid.length}>${qso.grid}`);
102
+ }
103
+ if (qso.dxccId) {
104
+ const value = String(qso.dxccId);
105
+ adifFields.push(`<dxcc:${value.length}>${value}`);
106
+ }
107
+ if (qso.dxccEntity) {
108
+ adifFields.push(`<country:${qso.dxccEntity.length}>${qso.dxccEntity}`);
109
+ }
110
+ if (qso.cqZone) {
111
+ const value = String(qso.cqZone);
112
+ adifFields.push(`<cqz:${value.length}>${value}`);
113
+ }
114
+ if (qso.ituZone) {
115
+ const value = String(qso.ituZone);
116
+ adifFields.push(`<ituz:${value.length}>${value}`);
117
+ }
118
+ if (qso.reportSent) {
119
+ adifFields.push(`<rst_sent:${qso.reportSent.length}>${qso.reportSent}`);
120
+ }
121
+ if (qso.reportReceived) {
122
+ adifFields.push(`<rst_rcvd:${qso.reportReceived.length}>${qso.reportReceived}`);
123
+ }
124
+ if (opts.includeStationCallsign && qso.myCallsign) {
125
+ adifFields.push(`<station_callsign:${qso.myCallsign.length}>${qso.myCallsign}`);
126
+ }
127
+ if (qso.myDxccId) {
128
+ const value = String(qso.myDxccId);
129
+ adifFields.push(`<my_dxcc:${value.length}>${value}`);
130
+ }
131
+ if (qso.myCqZone) {
132
+ const value = String(qso.myCqZone);
133
+ adifFields.push(`<my_cq_zone:${value.length}>${value}`);
134
+ }
135
+ if (qso.myItuZone) {
136
+ const value = String(qso.myItuZone);
137
+ adifFields.push(`<my_itu_zone:${value.length}>${value}`);
138
+ }
139
+ if (qso.myState) {
140
+ adifFields.push(`<my_state:${qso.myState.length}>${qso.myState}`);
141
+ }
142
+ if (qso.myCounty) {
143
+ adifFields.push(`<my_cnty:${qso.myCounty.length}>${qso.myCounty}`);
144
+ }
145
+ if (qso.myIota) {
146
+ adifFields.push(`<my_iota:${qso.myIota.length}>${qso.myIota}`);
147
+ }
148
+ if (opts.includeMyGrid && qso.myGrid) {
149
+ adifFields.push(`<my_gridsquare:${qso.myGrid.length}>${qso.myGrid}`);
150
+ }
151
+ if (qso.myCallsign) {
152
+ adifFields.push(`<operator:${qso.myCallsign.length}>${qso.myCallsign}`);
153
+ }
154
+ if (qso.lotwQslSent) {
155
+ adifFields.push(`<lotw_qsl_sent:${qso.lotwQslSent.length}>${qso.lotwQslSent}`);
156
+ }
157
+ if (qso.lotwQslReceived) {
158
+ adifFields.push(`<lotw_qsl_rcvd:${qso.lotwQslReceived.length}>${qso.lotwQslReceived}`);
159
+ }
160
+ if (qso.lotwQslSentDate) {
161
+ const dateStr = formatADIFDate(new Date(qso.lotwQslSentDate));
162
+ adifFields.push(`<lotw_qslsdate:8>${dateStr}`);
163
+ }
164
+ if (qso.lotwQslReceivedDate) {
165
+ const dateStr = formatADIFDate(new Date(qso.lotwQslReceivedDate));
166
+ adifFields.push(`<lotw_qslrdate:8>${dateStr}`);
167
+ }
168
+ if (qso.dxccStatus) {
169
+ adifFields.push(`<app_tx5dr_dxcc_status:${qso.dxccStatus.length}>${qso.dxccStatus}`);
170
+ }
171
+ if (qso.dxccSource) {
172
+ adifFields.push(`<app_tx5dr_dxcc_source:${qso.dxccSource.length}>${qso.dxccSource}`);
173
+ }
174
+ if (qso.dxccConfidence) {
175
+ adifFields.push(`<app_tx5dr_dxcc_confidence:${qso.dxccConfidence.length}>${qso.dxccConfidence}`);
176
+ }
177
+ if (qso.dxccNeedsReview !== undefined) {
178
+ adifFields.push(`<app_tx5dr_dxcc_needs_review:1>${qso.dxccNeedsReview ? 'Y' : 'N'}`);
179
+ }
180
+ if (qso.stationLocationId) {
181
+ adifFields.push(`<app_tx5dr_station_location_id:${qso.stationLocationId.length}>${qso.stationLocationId}`);
182
+ }
183
+ const comment = resolveQsoComment(qso);
184
+ if (comment) {
185
+ adifFields.push(`<comment:${comment.length}>${comment}`);
186
+ }
187
+ if (qso.qth) {
188
+ adifFields.push(`<qth:${qso.qth.length}>${qso.qth}`);
189
+ }
190
+ if (qso.notes) {
191
+ adifFields.push(`<notes:${qso.notes.length}>${qso.notes}`);
192
+ }
193
+ adifFields.push('<eor>');
194
+ return adifFields.join(' ');
195
+ }
196
+ /**
197
+ * Parse ADIF field string into key-value pairs.
198
+ */
199
+ export function parseADIFFields(recordStr) {
200
+ const fields = {};
201
+ const fieldRegex = /<(\w+):(\d+)>([^<]*)/gi;
202
+ let match;
203
+ while ((match = fieldRegex.exec(recordStr)) !== null) {
204
+ const fieldName = match[1].toLowerCase();
205
+ const fieldLength = parseInt(match[2]);
206
+ const fieldValue = match[3].substring(0, fieldLength);
207
+ fields[fieldName] = fieldValue;
208
+ }
209
+ return fields;
210
+ }
211
+ /**
212
+ * Parse a single ADIF record string into a QSORecord.
213
+ * @param recordStr Single ADIF record string
214
+ * @param source Source identifier (used for ID generation)
215
+ */
216
+ export function parseADIFRecord(recordStr, source = 'adif') {
217
+ const fields = parseADIFFields(recordStr);
218
+ if (!fields.call || !fields.qso_date || !fields.time_on) {
219
+ console.warn('[ADIFUtils] ADIF record missing required fields, skipping:', fields);
220
+ return null;
221
+ }
222
+ try {
223
+ const qsoDate = fields.qso_date;
224
+ const timeOn = fields.time_on;
225
+ const timeOff = fields.time_off || timeOn;
226
+ const modeInfo = mapAdifModeToInternal(fields.mode, fields.submode);
227
+ const startTime = parseADIFDateTime(qsoDate, timeOn);
228
+ const endTime = parseADIFDateTime(fields.qso_date_off || qsoDate, timeOff);
229
+ const { comment, messageHistory } = parseLegacyComment(fields.comment);
230
+ const record = {
231
+ id: `${source}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
232
+ callsign: fields.call.toUpperCase(),
233
+ startTime: new Date(startTime).getTime(),
234
+ endTime: new Date(endTime).getTime(),
235
+ frequency: fields.freq ? Math.round(parseFloat(fields.freq) * 1000000) : 14074000,
236
+ mode: modeInfo.mode,
237
+ submode: modeInfo.submode,
238
+ reportSent: fields.rst_sent || '',
239
+ reportReceived: fields.rst_rcvd || '',
240
+ grid: fields.gridsquare || '',
241
+ myCallsign: fields.station_callsign || fields.operator || undefined,
242
+ myGrid: fields.my_gridsquare || '',
243
+ qth: fields.qth || undefined,
244
+ comment,
245
+ notes: fields.notes || fields.note || undefined,
246
+ messageHistory,
247
+ };
248
+ if (fields.dxcc) {
249
+ const parsedDxcc = Number.parseInt(fields.dxcc, 10);
250
+ if (Number.isFinite(parsedDxcc)) {
251
+ record.dxccId = parsedDxcc;
252
+ }
253
+ }
254
+ if (fields.country) {
255
+ record.dxccEntity = fields.country;
256
+ }
257
+ if (fields.cqz) {
258
+ const parsedCqz = Number.parseInt(fields.cqz, 10);
259
+ if (Number.isFinite(parsedCqz)) {
260
+ record.cqZone = parsedCqz;
261
+ }
262
+ }
263
+ if (fields.ituz) {
264
+ const parsedItuz = Number.parseInt(fields.ituz, 10);
265
+ if (Number.isFinite(parsedItuz)) {
266
+ record.ituZone = parsedItuz;
267
+ }
268
+ }
269
+ if (fields.my_dxcc) {
270
+ const parsedMyDxcc = Number.parseInt(fields.my_dxcc, 10);
271
+ if (Number.isFinite(parsedMyDxcc)) {
272
+ record.myDxccId = parsedMyDxcc;
273
+ }
274
+ }
275
+ if (fields.my_cq_zone) {
276
+ const parsedMyCq = Number.parseInt(fields.my_cq_zone, 10);
277
+ if (Number.isFinite(parsedMyCq)) {
278
+ record.myCqZone = parsedMyCq;
279
+ }
280
+ }
281
+ if (fields.my_itu_zone) {
282
+ const parsedMyItu = Number.parseInt(fields.my_itu_zone, 10);
283
+ if (Number.isFinite(parsedMyItu)) {
284
+ record.myItuZone = parsedMyItu;
285
+ }
286
+ }
287
+ if (fields.my_state) {
288
+ record.myState = fields.my_state;
289
+ }
290
+ if (fields.my_cnty) {
291
+ record.myCounty = fields.my_cnty;
292
+ }
293
+ if (fields.my_iota) {
294
+ record.myIota = fields.my_iota;
295
+ }
296
+ if (fields.app_tx5dr_dxcc_status) {
297
+ record.dxccStatus = fields.app_tx5dr_dxcc_status;
298
+ }
299
+ if (fields.app_tx5dr_dxcc_source) {
300
+ record.dxccSource = fields.app_tx5dr_dxcc_source;
301
+ }
302
+ if (fields.app_tx5dr_dxcc_confidence) {
303
+ record.dxccConfidence = fields.app_tx5dr_dxcc_confidence;
304
+ }
305
+ if (fields.app_tx5dr_dxcc_needs_review) {
306
+ record.dxccNeedsReview = fields.app_tx5dr_dxcc_needs_review === 'Y';
307
+ }
308
+ if (fields.app_tx5dr_station_location_id) {
309
+ record.stationLocationId = fields.app_tx5dr_station_location_id;
310
+ }
311
+ // LoTW QSL status
312
+ const lotwSent = fields.lotw_qsl_sent?.toUpperCase();
313
+ if (lotwSent && ['Y', 'N', 'R', 'Q', 'I'].includes(lotwSent)) {
314
+ record.lotwQslSent = lotwSent;
315
+ }
316
+ const lotwRcvd = (fields.lotw_qsl_rcvd || fields.app_lotw_rxqsl)?.toUpperCase();
317
+ if (lotwRcvd && ['Y', 'N', 'R', 'I', 'V'].includes(lotwRcvd)) {
318
+ record.lotwQslReceived = lotwRcvd;
319
+ }
320
+ if (fields.lotw_qslsdate) {
321
+ try {
322
+ record.lotwQslSentDate = new Date(parseADIFDateTime(fields.lotw_qslsdate, '000000')).getTime();
323
+ }
324
+ catch { /* ignore parse error */ }
325
+ }
326
+ if (fields.lotw_qslrdate) {
327
+ try {
328
+ record.lotwQslReceivedDate = new Date(parseADIFDateTime(fields.lotw_qslrdate, '000000')).getTime();
329
+ }
330
+ catch { /* ignore parse error */ }
331
+ }
332
+ // QRZ QSL status
333
+ const qrzStatus = fields.app_qrzlog_status?.toUpperCase();
334
+ if (qrzStatus === 'C' || qrzStatus === 'Y') {
335
+ record.qrzQslReceived = 'Y';
336
+ }
337
+ if (record.dxccSource !== 'manual_override') {
338
+ const resolution = resolveDXCCEntity(record.callsign, record.startTime);
339
+ if (resolution.entity) {
340
+ record.dxccId = resolution.entity.entityCode;
341
+ record.dxccEntity = resolution.entity.name;
342
+ record.countryCode = resolution.entity.countryCode;
343
+ record.cqZone = resolution.entity.cqZone;
344
+ record.ituZone = resolution.entity.ituZone;
345
+ record.dxccStatus = resolution.entity.deleted ? 'deleted' : 'current';
346
+ record.dxccConfidence = resolution.confidence;
347
+ record.dxccSource = 'resolver';
348
+ record.dxccNeedsReview = resolution.needsReview;
349
+ record.dxccResolvedAt = Date.now();
350
+ record.dxccResolverVersion = DXCC_RESOLVER_VERSION;
351
+ }
352
+ else {
353
+ record.dxccId = undefined;
354
+ record.dxccEntity = undefined;
355
+ record.countryCode = undefined;
356
+ record.cqZone = undefined;
357
+ record.ituZone = undefined;
358
+ record.dxccStatus = 'unknown';
359
+ record.dxccConfidence = resolution.confidence;
360
+ record.dxccSource = 'resolver';
361
+ record.dxccNeedsReview = true;
362
+ record.dxccResolvedAt = Date.now();
363
+ record.dxccResolverVersion = DXCC_RESOLVER_VERSION;
364
+ }
365
+ }
366
+ return record;
367
+ }
368
+ catch (error) {
369
+ console.warn('[ADIFUtils] Error parsing ADIF record', { error, fields });
370
+ return null;
371
+ }
372
+ }
373
+ /**
374
+ * Parse a complete ADIF content string into QSORecord array.
375
+ * @param adifContent Complete ADIF file content
376
+ * @param source Source identifier
377
+ */
378
+ export function parseADIFContent(adifContent, source = 'adif') {
379
+ const records = [];
380
+ try {
381
+ const eohIndex = adifContent.search(/<eoh>/i);
382
+ const body = eohIndex >= 0 ? adifContent.substring(eohIndex + 5) : adifContent;
383
+ const recordStrings = body.split(/<eor>/i).filter(r => r.trim().length > 0);
384
+ for (const recordStr of recordStrings) {
385
+ const qso = parseADIFRecord(recordStr, source);
386
+ if (qso) {
387
+ records.push(qso);
388
+ }
389
+ }
390
+ }
391
+ catch (error) {
392
+ console.error('[ADIFUtils] Failed to parse ADIF content:', error);
393
+ throw new Error('ADIF format parse error');
394
+ }
395
+ return records;
396
+ }
397
+ /**
398
+ * Generate a complete ADIF file with header.
399
+ */
400
+ export function generateADIFFile(qsos, options) {
401
+ const opts = {
402
+ programId: 'TX5DR',
403
+ programVersion: '1.0',
404
+ includeStationCallsign: false,
405
+ ...options,
406
+ };
407
+ const lines = [];
408
+ lines.push(`Generated by ${opts.programId} v${opts.programVersion}`);
409
+ lines.push(`<adif_ver:5>3.1.4`);
410
+ lines.push(`<programid:${opts.programId.length}>${opts.programId}`);
411
+ lines.push(`<programversion:${opts.programVersion.length}>${opts.programVersion}`);
412
+ lines.push('<eoh>');
413
+ lines.push('');
414
+ for (const qso of qsos) {
415
+ lines.push(convertQSOToADIF(qso, {
416
+ includeStationCallsign: opts.includeStationCallsign,
417
+ }));
418
+ }
419
+ return lines.join('\n');
420
+ }
421
+ //# sourceMappingURL=adif.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adif.js","sourceRoot":"","sources":["../../src/utils/adif.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Callsign normalization utilities
3
+ *
4
+ * Strips portable/mobile suffixes (e.g. BG3YZA/P → BG3YZA) so that
5
+ * logbook access checks match the base callsign regardless of suffix.
6
+ */
7
+ /**
8
+ * Extract the base callsign by removing prefixes/suffixes.
9
+ * Picks the longest segment that looks like a callsign (contains both
10
+ * letters and digits). Examples:
11
+ * "BG3YZA" → "BG3YZA"
12
+ * "BG3YZA/P" → "BG3YZA"
13
+ * "VK9/BG3YZA" → "BG3YZA"
14
+ * "BG3YZA/QRP" → "BG3YZA"
15
+ */
16
+ export declare function normalizeCallsign(callsign: string): string;
17
+ //# sourceMappingURL=callsign.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callsign.d.ts","sourceRoot":"","sources":["../../src/utils/callsign.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAW1D"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Callsign normalization utilities
3
+ *
4
+ * Strips portable/mobile suffixes (e.g. BG3YZA/P → BG3YZA) so that
5
+ * logbook access checks match the base callsign regardless of suffix.
6
+ */
7
+ /**
8
+ * Extract the base callsign by removing prefixes/suffixes.
9
+ * Picks the longest segment that looks like a callsign (contains both
10
+ * letters and digits). Examples:
11
+ * "BG3YZA" → "BG3YZA"
12
+ * "BG3YZA/P" → "BG3YZA"
13
+ * "VK9/BG3YZA" → "BG3YZA"
14
+ * "BG3YZA/QRP" → "BG3YZA"
15
+ */
16
+ export function normalizeCallsign(callsign) {
17
+ const upper = callsign.toUpperCase().trim();
18
+ if (!upper.includes('/'))
19
+ return upper;
20
+ const parts = upper.split('/');
21
+ let best = parts[0];
22
+ for (const part of parts) {
23
+ if (part.length > best.length && /[A-Z]/.test(part) && /\d/.test(part)) {
24
+ best = part;
25
+ }
26
+ }
27
+ return best;
28
+ }
29
+ //# sourceMappingURL=callsign.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callsign.js","sourceRoot":"","sources":["../../src/utils/callsign.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAC5C,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACvE,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface PluginPageBoundResource {
2
+ kind: 'callsign' | 'operator';
3
+ value: string;
4
+ }
5
+ export declare function getPluginPageScopeSegments(resource?: PluginPageBoundResource | null): string[];
6
+ export declare function getPluginPageScopePath(resource?: PluginPageBoundResource | null): string;
7
+ //# sourceMappingURL=page-scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-scope.d.ts","sourceRoot":"","sources":["../../src/utils/page-scope.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,UAAU,GAAG,UAAU,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;CACf;AAMD,wBAAgB,0BAA0B,CACxC,QAAQ,CAAC,EAAE,uBAAuB,GAAG,IAAI,GACxC,MAAM,EAAE,CAUV;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,CAAC,EAAE,uBAAuB,GAAG,IAAI,GACxC,MAAM,CAER"}
@@ -0,0 +1,18 @@
1
+ import path from 'path';
2
+ import { normalizeCallsign } from './callsign.js';
3
+ function toSafeSegment(value) {
4
+ return encodeURIComponent(value.trim());
5
+ }
6
+ export function getPluginPageScopeSegments(resource) {
7
+ if (!resource) {
8
+ return ['global'];
9
+ }
10
+ if (resource.kind === 'callsign') {
11
+ return ['callsigns', toSafeSegment(normalizeCallsign(resource.value))];
12
+ }
13
+ return ['operators', toSafeSegment(resource.value)];
14
+ }
15
+ export function getPluginPageScopePath(resource) {
16
+ return path.posix.join(...getPluginPageScopeSegments(resource));
17
+ }
18
+ //# sourceMappingURL=page-scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-scope.js","sourceRoot":"","sources":["../../src/utils/page-scope.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAOlD,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,QAAyC;IAEzC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpB,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACjC,OAAO,CAAC,WAAW,EAAE,aAAa,CAAC,iBAAiB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,CAAC,WAAW,EAAE,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,QAAyC;IAEzC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { QSORecord } from '@tx5dr/contracts';
2
+ export declare function normalizeMessageHistory(value: unknown): string[];
3
+ export declare function buildCommentFromMessageHistory(messageHistory?: readonly string[]): string | undefined;
4
+ export declare function parseLegacyComment(comment?: string): {
5
+ comment?: string;
6
+ messageHistory: string[];
7
+ };
8
+ export declare function resolveQsoComment(qso: Pick<QSORecord, 'comment' | 'messageHistory'>): string | undefined;
9
+ //# sourceMappingURL=qso-text-fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qso-text-fields.d.ts","sourceRoot":"","sources":["../../src/utils/qso-text-fields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAWlD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAQhE;AAED,wBAAgB,8BAA8B,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAGrG;AAED,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,EAAE,CAAA;CAAE,CAenG;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,gBAAgB,CAAC,GAAG,MAAM,GAAG,SAAS,CAExG"}
@@ -0,0 +1,37 @@
1
+ function normalizeOptionalString(value) {
2
+ if (typeof value !== 'string') {
3
+ return undefined;
4
+ }
5
+ const trimmed = value.trim();
6
+ return trimmed.length > 0 ? trimmed : undefined;
7
+ }
8
+ export function normalizeMessageHistory(value) {
9
+ if (!Array.isArray(value)) {
10
+ return [];
11
+ }
12
+ return value
13
+ .map((item) => (typeof item === 'string' ? item.trim() : ''))
14
+ .filter((item) => item.length > 0);
15
+ }
16
+ export function buildCommentFromMessageHistory(messageHistory) {
17
+ const normalized = normalizeMessageHistory(messageHistory ?? []);
18
+ return normalized.length > 0 ? normalized.join(' | ') : undefined;
19
+ }
20
+ export function parseLegacyComment(comment) {
21
+ const normalizedComment = normalizeOptionalString(comment);
22
+ if (!normalizedComment) {
23
+ return { comment: undefined, messageHistory: [] };
24
+ }
25
+ const messageHistory = normalizedComment
26
+ .split(' | ')
27
+ .map((part) => part.trim())
28
+ .filter((part) => part.length > 0);
29
+ return {
30
+ comment: normalizedComment,
31
+ messageHistory: messageHistory.length > 1 ? messageHistory : [],
32
+ };
33
+ }
34
+ export function resolveQsoComment(qso) {
35
+ return normalizeOptionalString(qso.comment) ?? buildCommentFromMessageHistory(qso.messageHistory);
36
+ }
37
+ //# sourceMappingURL=qso-text-fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qso-text-fields.js","sourceRoot":"","sources":["../../src/utils/qso-text-fields.ts"],"names":[],"mappings":"AAEA,SAAS,uBAAuB,CAAC,KAAc;IAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SAC5D,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,cAAkC;IAC/E,MAAM,UAAU,GAAG,uBAAuB,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;IACjE,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAC3D,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;IACpD,CAAC;IAED,MAAM,cAAc,GAAG,iBAAiB;SACrC,KAAK,CAAC,KAAK,CAAC;SACZ,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAErC,OAAO;QACL,OAAO,EAAE,iBAAiB;QAC1B,cAAc,EAAE,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE;KAChE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAkD;IAClF,OAAO,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,8BAA8B,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AACpG,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tx5dr/plugin-api",
3
- "version": "1.1.0",
3
+ "version": "1.2.1",
4
4
  "type": "module",
5
5
  "description": "Public plugin API for TX-5DR digital radio engine",
6
6
  "license": "MIT",
@@ -17,7 +17,9 @@
17
17
  "digital-radio"
18
18
  ],
19
19
  "files": [
20
- "dist"
20
+ "dist",
21
+ "src/bridge.d.ts",
22
+ "tokens.css"
21
23
  ],
22
24
  "main": "dist/index.js",
23
25
  "types": "dist/index.d.ts",
@@ -31,6 +33,9 @@
31
33
  "import": "./dist/testing/index.js",
32
34
  "require": "./dist/testing/index.js",
33
35
  "types": "./dist/testing/index.d.ts"
36
+ },
37
+ "./bridge": {
38
+ "types": "./src/bridge.d.ts"
34
39
  }
35
40
  },
36
41
  "scripts": {
@@ -39,9 +44,11 @@
39
44
  "lint": "eslint src/**/*.ts",
40
45
  "test": "vitest run --passWithNoTests"
41
46
  },
47
+ "dependencies": {
48
+ "@tx5dr/contracts": "1.2.1",
49
+ "@tx5dr/core": "1.2.1"
50
+ },
42
51
  "devDependencies": {
43
- "@tx5dr/contracts": "workspace:*",
44
- "@tx5dr/shared-config": "workspace:*",
45
52
  "typescript": "^5.0.0",
46
53
  "vitest": "^1.0.0"
47
54
  }