@tx5dr/plugin-api 1.7.12 → 2.0.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.
- package/README.md +274 -17
- package/dist/__tests__/adif.test.js +40 -0
- package/dist/__tests__/adif.test.js.map +1 -1
- package/dist/__tests__/capability-context.test.d.ts +2 -0
- package/dist/__tests__/capability-context.test.d.ts.map +1 -0
- package/dist/__tests__/capability-context.test.js +99 -0
- package/dist/__tests__/capability-context.test.js.map +1 -0
- package/dist/__tests__/testing-utils.test.js +217 -15
- package/dist/__tests__/testing-utils.test.js.map +1 -1
- package/dist/capabilities.d.ts +37 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +48 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/context.d.ts +95 -56
- package/dist/context.d.ts.map +1 -1
- package/dist/definition.d.ts +73 -20
- package/dist/definition.d.ts.map +1 -1
- package/dist/definition.js +8 -1
- package/dist/definition.js.map +1 -1
- package/dist/helpers.d.ts +322 -129
- package/dist/helpers.d.ts.map +1 -1
- package/dist/hooks.d.ts +54 -34
- package/dist/hooks.d.ts.map +1 -1
- package/dist/host-dependencies.d.ts +101 -0
- package/dist/host-dependencies.d.ts.map +1 -1
- package/dist/index.d.ts +9 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/runtime.d.ts +164 -9
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +9 -1
- package/dist/runtime.js.map +1 -1
- package/dist/settings.d.ts +31 -0
- package/dist/settings.d.ts.map +1 -1
- package/dist/sync.d.ts +98 -6
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +6 -0
- package/dist/sync.js.map +1 -1
- package/dist/testing/index.d.ts +70 -12
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +307 -105
- package/dist/testing/index.js.map +1 -1
- package/dist/utils/adif.d.ts.map +1 -1
- package/dist/utils/adif.js +6 -2
- package/dist/utils/adif.js.map +1 -1
- package/dist/utils/qso-text-fields.d.ts +7 -1
- package/dist/utils/qso-text-fields.d.ts.map +1 -1
- package/dist/utils/qso-text-fields.js +74 -6
- package/dist/utils/qso-text-fields.js.map +1 -1
- package/package.json +4 -4
package/dist/sync.js
CHANGED
|
@@ -4,12 +4,15 @@
|
|
|
4
4
|
* A utility plugin registers a sync provider via `ctx.logbookSync.register()`
|
|
5
5
|
* during `onLoad`. The host manages per-callsign lifecycle, auto-upload on QSO
|
|
6
6
|
* completion, and renders the provider's settings page in the sync modal.
|
|
7
|
+
* Registration requires a global API v2 utility with `logbook:sync`; the
|
|
8
|
+
* referenced settings page must use `resourceBinding: 'callsign'`.
|
|
7
9
|
*/
|
|
8
10
|
const SECRET_QUERY_PARAM_PATTERN = /([?&](?:api[_-]?key|key|password|pass|token|auth|authorization|secret|login)=)([^&#\s]+)/gi;
|
|
9
11
|
const WAVELOG_STATION_INFO_KEY_PATTERN = /(\/station_info\/)([^/?#\s]+)/gi;
|
|
10
12
|
function escapeRegExp(value) {
|
|
11
13
|
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
12
14
|
}
|
|
15
|
+
/** Best-effort redaction of explicit secrets and common credential-bearing URL/query patterns. */
|
|
13
16
|
export function sanitizeSyncFailureText(value, secrets = []) {
|
|
14
17
|
let text = typeof value === 'string' ? value : String(value ?? '');
|
|
15
18
|
for (const secret of secrets) {
|
|
@@ -22,6 +25,7 @@ export function sanitizeSyncFailureText(value, secrets = []) {
|
|
|
22
25
|
.replace(SECRET_QUERY_PARAM_PATTERN, '$1[redacted]')
|
|
23
26
|
.replace(WAVELOG_STATION_INFO_KEY_PATTERN, '$1[redacted]');
|
|
24
27
|
}
|
|
28
|
+
/** Builds a normalized failure after sanitizing its message and detail. */
|
|
25
29
|
export function createSyncFailure(input) {
|
|
26
30
|
const secrets = input.secrets ?? [];
|
|
27
31
|
const message = sanitizeSyncFailureText(input.message || input.code || 'Sync failed', secrets);
|
|
@@ -39,6 +43,7 @@ export function createSyncFailure(input) {
|
|
|
39
43
|
detail,
|
|
40
44
|
};
|
|
41
45
|
}
|
|
46
|
+
/** Converts an unknown thrown value into a normalized, sanitized failure. */
|
|
42
47
|
export function errorToSyncFailure(error, defaults) {
|
|
43
48
|
const message = error instanceof Error
|
|
44
49
|
? error.message
|
|
@@ -53,6 +58,7 @@ export function errorToSyncFailure(error, defaults) {
|
|
|
53
58
|
detail: defaults.detail ?? cause,
|
|
54
59
|
});
|
|
55
60
|
}
|
|
61
|
+
/** Formats one failure for compact user-facing lists. */
|
|
56
62
|
export function failureMessage(failure) {
|
|
57
63
|
const prefix = failure.qsoCallsign ? `${failure.qsoCallsign}: ` : '';
|
|
58
64
|
const suffix = failure.httpStatus ? ` (HTTP ${failure.httpStatus})` : '';
|
package/dist/sync.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"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"}
|
package/dist/testing/index.d.ts
CHANGED
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
* import { createMockContext, createMockSlotInfo } from '@tx5dr/plugin-api/testing';
|
|
10
10
|
* ```
|
|
11
11
|
*/
|
|
12
|
-
import type { KVStore, PluginLogger, PluginTimers,
|
|
12
|
+
import type { KVStore, PluginLogger, PluginTimers, OperatorSnapshot, OperatorCommandPort, PluginOperatorCommand, RadioView, RadioCapabilitiesView, RadioCommandPort, RadioTunerCommandPort, RadioPowerView, RadioPowerCommandPort, LogbookAccess, BandAccess, UIBridge, PluginFileStore, PluginNetworkControl, PluginEventBus, PluginEventBusMessage, PluginUdpRemoteInfo, PluginUdpSocket } from '../helpers.js';
|
|
13
13
|
import type { HostSettingsControl } from '../settings.js';
|
|
14
|
-
import type {
|
|
14
|
+
import type { PluginContextFor } from '../context.js';
|
|
15
15
|
import type { HostDependencies } from '../host-dependencies.js';
|
|
16
16
|
import type { SlotInfo, ParsedFT8Message, ModeDescriptor, PluginPermission } from '@tx5dr/contracts';
|
|
17
17
|
/** KVStore backed by an in-memory Map. Inspect `_data` in assertions. */
|
|
@@ -33,9 +33,14 @@ export interface MockTimers extends PluginTimers {
|
|
|
33
33
|
/** UIBridge that captures sent data. Inspect `_sentData` in assertions. */
|
|
34
34
|
export interface MockUIBridge extends UIBridge {
|
|
35
35
|
readonly _sentData: Map<string, unknown[]>;
|
|
36
|
+
readonly _events: Array<{
|
|
37
|
+
type: string;
|
|
38
|
+
id: string;
|
|
39
|
+
data?: unknown;
|
|
40
|
+
}>;
|
|
36
41
|
}
|
|
37
42
|
/** Full mock context with typed access to all sub-mocks. */
|
|
38
|
-
|
|
43
|
+
interface MockPluginContextDecorations {
|
|
39
44
|
readonly store: {
|
|
40
45
|
readonly global: MockKVStore;
|
|
41
46
|
readonly operator: MockKVStore;
|
|
@@ -44,8 +49,11 @@ export interface MockPluginContext extends PluginContext {
|
|
|
44
49
|
readonly timers: MockTimers;
|
|
45
50
|
readonly ui: MockUIBridge;
|
|
46
51
|
readonly settings: HostSettingsControl;
|
|
47
|
-
|
|
48
|
-
|
|
52
|
+
}
|
|
53
|
+
export type MockPluginContextFor<Permissions extends readonly PluginPermission[]> = PluginContextFor<Permissions> & MockPluginContextDecorations;
|
|
54
|
+
export type MockPluginContext = MockPluginContextFor<readonly []>;
|
|
55
|
+
export interface MockOperatorCommandPort extends OperatorCommandPort {
|
|
56
|
+
readonly _commands: PluginOperatorCommand[];
|
|
49
57
|
}
|
|
50
58
|
export interface MockUdpSocket extends PluginUdpSocket {
|
|
51
59
|
readonly _sent: Array<{
|
|
@@ -64,18 +72,58 @@ export interface MockUdpSocket extends PluginUdpSocket {
|
|
|
64
72
|
export interface MockNetworkControl extends PluginNetworkControl {
|
|
65
73
|
readonly _sockets: MockUdpSocket[];
|
|
66
74
|
}
|
|
75
|
+
export interface MockEventBus extends PluginEventBus {
|
|
76
|
+
readonly _subscriptions: Map<string, Array<(message: PluginEventBusMessage) => void | Promise<void>>>;
|
|
77
|
+
readonly _published: PluginEventBusMessage[];
|
|
78
|
+
}
|
|
67
79
|
export declare function createMockKVStore(initial?: Record<string, unknown>): MockKVStore;
|
|
68
80
|
export declare function createMockLogger(): MockLogger;
|
|
69
81
|
export declare function createMockTimers(): MockTimers;
|
|
70
|
-
export declare function
|
|
71
|
-
export declare function
|
|
82
|
+
export declare function createMockOperatorSnapshot(overrides?: Partial<OperatorSnapshot>): OperatorSnapshot;
|
|
83
|
+
export declare function createMockOperatorCommandPort(submit?: (command: PluginOperatorCommand) => void | Promise<void>): MockOperatorCommandPort;
|
|
84
|
+
export declare function createMockRadioView(overrides?: Partial<RadioView>): RadioView;
|
|
85
|
+
export declare function createMockRadioCapabilitiesView(): RadioCapabilitiesView;
|
|
86
|
+
export declare function createMockRadioCommandPort(): RadioCommandPort;
|
|
87
|
+
export declare function createMockRadioTunerCommandPort(): RadioTunerCommandPort;
|
|
88
|
+
export declare function createMockRadioPowerView(): RadioPowerView;
|
|
89
|
+
export declare function createMockRadioPowerCommandPort(): RadioPowerCommandPort;
|
|
72
90
|
export declare function createMockLogbookAccess(overrides?: Partial<LogbookAccess>): LogbookAccess;
|
|
73
91
|
export declare function createMockBandAccess(overrides?: Partial<BandAccess>): BandAccess;
|
|
74
92
|
export declare function createMockUIBridge(): MockUIBridge;
|
|
75
93
|
export declare function createMockFileStore(): PluginFileStore;
|
|
76
94
|
export declare function createMockNetworkControl(): MockNetworkControl;
|
|
95
|
+
/**
|
|
96
|
+
* Options for {@link createMockEventBus}.
|
|
97
|
+
*/
|
|
98
|
+
export interface MockEventBusOptions {
|
|
99
|
+
/** Publisher metadata injected into every message. Defaults to `mock-plugin` / `operator-0`. */
|
|
100
|
+
owner?: {
|
|
101
|
+
pluginName?: string;
|
|
102
|
+
instanceScope?: 'operator' | 'global';
|
|
103
|
+
operatorId?: string;
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Creates a mock {@link PluginEventBus} for unit testing plugin code.
|
|
108
|
+
*
|
|
109
|
+
* All published messages are recorded in `_published` for assertion.
|
|
110
|
+
* The internal `_subscriptions` map lets tests inspect active subscriptions.
|
|
111
|
+
*
|
|
112
|
+
* @param options - Optional configuration for publisher metadata.
|
|
113
|
+
* @returns A mock event bus with inspection helpers.
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* ```ts
|
|
117
|
+
* const bus = createMockEventBus({ owner: { pluginName: 'my-plugin' } });
|
|
118
|
+
* bus.subscribe('topic', handler);
|
|
119
|
+
* bus.publish('topic', { value: 42 });
|
|
120
|
+
* expect(bus._published).toHaveLength(1);
|
|
121
|
+
* expect(bus._published[0].publisher.pluginName).toBe('my-plugin');
|
|
122
|
+
* ```
|
|
123
|
+
*/
|
|
124
|
+
export declare function createMockEventBus(options?: MockEventBusOptions): MockEventBus;
|
|
77
125
|
export declare function createMockHostSettingsControl(overrides?: Partial<HostSettingsControl>): HostSettingsControl;
|
|
78
|
-
export interface MockPluginContextOptions {
|
|
126
|
+
export interface MockPluginContextOptions<Permissions extends readonly PluginPermission[] = readonly []> {
|
|
79
127
|
/** Initial config values (default: empty). */
|
|
80
128
|
config?: Record<string, unknown>;
|
|
81
129
|
/** Operator identifier (default: `'operator-0'`). */
|
|
@@ -89,28 +137,38 @@ export interface MockPluginContextOptions {
|
|
|
89
137
|
/** Partial mode descriptor overrides. */
|
|
90
138
|
mode?: Partial<ModeDescriptor>;
|
|
91
139
|
/** Additional operator control overrides. */
|
|
92
|
-
operator?: Partial<
|
|
140
|
+
operator?: Partial<OperatorSnapshot>;
|
|
141
|
+
/** Optional command-port override. Otherwise created only with `operator:transmit-control`. */
|
|
142
|
+
operatorCommands?: OperatorCommandPort;
|
|
93
143
|
/** Network control override. */
|
|
94
144
|
network?: PluginNetworkControl;
|
|
95
145
|
/** Radio control overrides. */
|
|
96
|
-
radio?: Partial<
|
|
146
|
+
radio?: Partial<RadioView>;
|
|
147
|
+
radioCapabilities?: RadioCapabilitiesView;
|
|
148
|
+
radioCommands?: RadioCommandPort;
|
|
149
|
+
radioTunerCommands?: RadioTunerCommandPort;
|
|
150
|
+
radioPower?: RadioPowerView;
|
|
151
|
+
radioPowerCommands?: RadioPowerCommandPort;
|
|
97
152
|
/** Logbook access overrides. */
|
|
98
153
|
logbook?: Partial<LogbookAccess>;
|
|
99
154
|
/** Band access overrides. */
|
|
100
155
|
band?: Partial<BandAccess>;
|
|
101
156
|
/** Host settings control overrides. */
|
|
102
157
|
settings?: Partial<HostSettingsControl>;
|
|
158
|
+
/** Event bus override. */
|
|
159
|
+
eventBus?: PluginEventBus;
|
|
103
160
|
/** Host dependency overrides. */
|
|
104
161
|
hostDependencies?: HostDependencies;
|
|
105
162
|
/** Manifest permissions to model permission-gated optional host dependencies. */
|
|
106
|
-
permissions?:
|
|
163
|
+
permissions?: Permissions;
|
|
107
164
|
/** Pre-constructed stores (uses fresh empty stores when omitted). */
|
|
108
165
|
store?: {
|
|
109
166
|
global?: MockKVStore;
|
|
110
167
|
operator?: MockKVStore;
|
|
111
168
|
};
|
|
112
169
|
}
|
|
113
|
-
export declare function createMockContext(options?: MockPluginContextOptions):
|
|
170
|
+
export declare function createMockContext<const Permissions extends readonly PluginPermission[] = readonly []>(options?: MockPluginContextOptions<Permissions>): MockPluginContextFor<Permissions>;
|
|
114
171
|
export declare function createMockSlotInfo(overrides?: Partial<SlotInfo>): SlotInfo;
|
|
115
172
|
export declare function createMockParsedMessage(overrides?: Partial<ParsedFT8Message>): ParsedFT8Message;
|
|
173
|
+
export {};
|
|
116
174
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"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"}
|