@springfield/ham-radio-registry 1.0.2 → 1.0.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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## [1.0.4](https://gitlab.com/springfield-ham-radio/app/ham-radio-registry/compare/v1.0.3...v1.0.4) (2025-08-18)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * improve logging in NpmBasedConfigRegistry for error handling and package processing ([206b210](https://gitlab.com/springfield-ham-radio/app/ham-radio-registry/commit/206b210e4e9f8ca4db4eca4e29db66aea5b626a9))
7
+
8
+ ## [1.0.3](https://gitlab.com/springfield-ham-radio/app/ham-radio-registry/compare/v1.0.2...v1.0.3) (2025-08-18)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * enhance NpmBasedConfigRegistry to handle scoped packages and improve package processing logic ([1e08e7f](https://gitlab.com/springfield-ham-radio/app/ham-radio-registry/commit/1e08e7f7277fbb529011a5d48bc05fa9c14fa7bf))
14
+
1
15
  ## [1.0.2](https://gitlab.com/springfield-ham-radio/app/ham-radio-registry/compare/v1.0.1...v1.0.2) (2025-08-01)
2
16
 
3
17
 
package/dist/index.d.ts CHANGED
@@ -1,7 +1,8 @@
1
- export type { RadioConfigMetadata, RadioCapabilities, CodecConfig, } from './types/radio-config.js';
1
+ export type { RadioConfigMetadata, RadioCapabilities, CodecConfig, RegistryRadio, } from './types/radio-config.js';
2
2
  export type { ValidationResult } from '@springfield/ham-radio-api';
3
3
  export type { PluginModule, PluginCapabilities, SpringfieldPluginConfig, NpmPluginInfo, PluginManifest, PluginManifestConfiguration, PluginSharedComponents, PluginSecurity, } from './types/plugin-module.js';
4
- import type { RadioConfigRegistry } from './registry/config-registry.js';
4
+ export type { RadioConfigRegistry } from './registry/config-registry.js';
5
+ import { type RadioConfigRegistry } from './registry/config-registry.js';
5
6
  export type { SharedComponentManager } from '@springfield/ham-radio-api';
6
7
  export { DefaultSharedComponentManager } from './registry/shared-components.js';
7
8
  export type { NpmClient } from './utils/npm-client.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,WAAW,GACZ,MAAM,yBAAyB,CAAC;AAGjC,YAAY,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,YAAY,EACV,YAAY,EACZ,kBAAkB,EAClB,uBAAuB,EACvB,aAAa,EACb,cAAc,EACd,2BAA2B,EAC3B,sBAAsB,EACtB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAGlC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAIzE,YAAY,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAGhF,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,wBAAgB,cAAc,CAAC,MAAM,EAAE,GAAG,GAAG,mBAAmB,CAE/D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,WAAW,EACX,aAAa,GACd,MAAM,yBAAyB,CAAC;AAGjC,YAAY,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,YAAY,EACV,YAAY,EACZ,kBAAkB,EAClB,uBAAuB,EACvB,aAAa,EACb,cAAc,EACd,2BAA2B,EAC3B,sBAAsB,EACtB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAGlC,YAAY,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAA0B,KAAK,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAGjG,YAAY,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAGhF,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,wBAAgB,cAAc,CAAC,MAAM,EAAE,GAAG,GAAG,mBAAmB,CAE/D"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAIvE,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAIhF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,mDAAmD;AACnD,MAAM,UAAU,cAAc,CAAC,MAAW;IACxC,OAAO,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,sBAAsB,EAA4B,MAAM,+BAA+B,CAAC;AAIjG,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAIhF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,mDAAmD;AACnD,MAAM,UAAU,cAAc,CAAC,MAAW;IACxC,OAAO,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC"}
@@ -1,20 +1,34 @@
1
+ import type { RadioCodec, RadioModelId, ValidationResult } from '@springfield/ham-radio-api';
1
2
  import type { ILogLayer } from 'loglayer';
2
- import type { RadioModelId, RadioCodec, ValidationResult } from '@springfield/ham-radio-api';
3
- import type { RegistryRadio } from '../types/radio-config.js';
4
3
  import type { PluginModule } from '../types/plugin-module.js';
4
+ import type { RegistryRadio } from '../types/radio-config.js';
5
+ export interface SpringfieldRadioModuleConfig {
6
+ pluginType: string;
7
+ codecFactory?: string;
8
+ configPath?: string;
9
+ sharedPath?: string;
10
+ manufacturer?: string;
11
+ capabilities?: Record<string, unknown>;
12
+ }
13
+ export interface PackageJson extends Record<string, unknown> {
14
+ name: string;
15
+ version: string;
16
+ keywords?: string[];
17
+ springfield: SpringfieldRadioModuleConfig;
18
+ }
5
19
  /**
6
20
  * Radio configuration registry interface
7
21
  */
8
22
  export interface RadioConfigRegistry {
9
23
  discoverConfigurations(): Promise<RegistryRadio[]>;
10
- getConfiguration(configId: string): Promise<RegistryRadio | null>;
24
+ getConfiguration(configId: string): Promise<RegistryRadio | undefined>;
11
25
  getConfigurationsByManufacturer(manufacturer: string): Promise<RegistryRadio[]>;
12
26
  getConfigurationsByModule(moduleId: string): Promise<RegistryRadio[]>;
13
27
  validateConfiguration(config: RegistryRadio): ValidationResult;
14
28
  registerConfiguration(config: RegistryRadio): Promise<void>;
15
29
  installPlugin(moduleId: string): Promise<void>;
16
30
  listInstalledPlugins(): Promise<PluginModule[]>;
17
- getCodec(modelId: RadioModelId): Promise<RadioCodec | null>;
31
+ getCodec(modelId: RadioModelId): Promise<RadioCodec | undefined>;
18
32
  }
19
33
  /**
20
34
  * NPM-based configuration registry implementation
@@ -28,15 +42,17 @@ export declare class NpmBasedConfigRegistry implements RadioConfigRegistry {
28
42
  private logger;
29
43
  constructor(logger: ILogLayer);
30
44
  discoverConfigurations(): Promise<RegistryRadio[]>;
31
- getConfiguration(configId: string): Promise<RegistryRadio | null>;
45
+ getConfiguration(configId: string): Promise<RegistryRadio | undefined>;
32
46
  getConfigurationsByManufacturer(manufacturer: string): Promise<RegistryRadio[]>;
33
47
  getConfigurationsByModule(moduleId: string): Promise<RegistryRadio[]>;
34
48
  validateConfiguration(config: RegistryRadio): ValidationResult;
35
49
  registerConfiguration(config: RegistryRadio): Promise<void>;
36
50
  installPlugin(moduleId: string): Promise<void>;
37
51
  listInstalledPlugins(): Promise<PluginModule[]>;
38
- getCodec(modelId: RadioModelId): Promise<RadioCodec | null>;
52
+ getCodec(modelId: RadioModelId): Promise<RadioCodec | undefined>;
39
53
  private discoverPluginModules;
54
+ private processScopedPackage;
55
+ private processRegularPackage;
40
56
  private isRadioModule;
41
57
  private loadPluginModule;
42
58
  private loadConfigurationsFromPlugin;
@@ -1 +1 @@
1
- {"version":3,"file":"config-registry.d.ts","sourceRoot":"","sources":["../../src/registry/config-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC7F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAS9D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAElC,sBAAsB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAGnD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAGlE,+BAA+B,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAGhF,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAGtE,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,gBAAgB,CAAC;IAG/D,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAG5D,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAG/C,oBAAoB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAGhD,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;CAC7D;AAED;;GAEG;AACH,qBAAa,sBAAuB,YAAW,mBAAmB;IAChE,OAAO,CAAC,WAAW,CAAoC;IACvD,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,sBAAsB,CAAyB;IACvD,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,MAAM,CAAY;gBAEd,MAAM,EAAE,SAAS;IAMvB,sBAAsB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAkBlD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAcjE,+BAA+B,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAK/E,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAK3E,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,gBAAgB;IAqCxD,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAU3D,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB9C,oBAAoB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAI/C,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;YAqBnD,qBAAqB;IAmCnC,OAAO,CAAC,aAAa;YAeP,gBAAgB;YAgBhB,4BAA4B;YAoC5B,eAAe;YASf,iBAAiB;YAKjB,uBAAuB;YAavB,mBAAmB;YAanB,cAAc;IA4B5B,OAAO,CAAC,mBAAmB;YAMb,iBAAiB;CAWhC"}
1
+ {"version":3,"file":"config-registry.d.ts","sourceRoot":"","sources":["../../src/registry/config-registry.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import { DefaultSharedComponentManager } from './shared-components.js';
2
1
  import { DefaultNpmClient } from '../utils/npm-client.js';
3
- import { readdir, readFile } from 'fs/promises';
4
- import { join } from 'path';
5
- import { existsSync } from 'fs';
2
+ import { readFile, readdir } from 'node:fs/promises';
3
+ import { DefaultSharedComponentManager } from './shared-components.js';
4
+ import { existsSync } from 'node:fs';
5
+ import { join } from 'node:path';
6
6
  /**
7
7
  * NPM-based configuration registry implementation
8
8
  */
@@ -28,7 +28,7 @@ export class NpmBasedConfigRegistry {
28
28
  configs.push(...pluginConfigs);
29
29
  }
30
30
  catch (error) {
31
- this.logger.withError(error).warn('Failed to load configurations from plugin ' + plugin.name);
31
+ this.logger.withMetadata({ pluignName: plugin.name }).withError(error).warn('Failed to load configurations from plugin ');
32
32
  }
33
33
  }
34
34
  return configs;
@@ -42,7 +42,7 @@ export class NpmBasedConfigRegistry {
42
42
  if (this.configCache.size === 0) {
43
43
  await this.discoverConfigurations();
44
44
  }
45
- return this.configCache.get(configId) || null;
45
+ return this.configCache.get(configId);
46
46
  }
47
47
  async getConfigurationsByManufacturer(manufacturer) {
48
48
  const configs = await this.discoverConfigurations();
@@ -76,8 +76,8 @@ export class NpmBasedConfigRegistry {
76
76
  errors.push('Configuration must have settings schema');
77
77
  }
78
78
  return {
79
- isValid: errors.length === 0,
80
79
  errors,
80
+ isValid: errors.length === 0,
81
81
  warnings,
82
82
  };
83
83
  }
@@ -102,7 +102,7 @@ export class NpmBasedConfigRegistry {
102
102
  this.logger.withMetadata({ moduleId }).info('Installed plugin');
103
103
  }
104
104
  async listInstalledPlugins() {
105
- return Array.from(this.pluginCache.values());
105
+ return [...this.pluginCache.values()];
106
106
  }
107
107
  async getCodec(modelId) {
108
108
  // Check cache first
@@ -112,7 +112,7 @@ export class NpmBasedConfigRegistry {
112
112
  // Find configuration for this model
113
113
  const config = await this.getConfiguration(modelId);
114
114
  if (!config || !config.codec) {
115
- return null;
115
+ return undefined;
116
116
  }
117
117
  // Load codec based on configuration
118
118
  const codec = await this.loadCodecFromConfig(config);
@@ -131,24 +131,65 @@ export class NpmBasedConfigRegistry {
131
131
  const entries = await readdir(nodeModulesPath, { withFileTypes: true });
132
132
  for (const entry of entries) {
133
133
  if (entry.isDirectory()) {
134
- const packageJsonPath = join(nodeModulesPath, entry.name, 'package.json');
135
- try {
136
- const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf8'));
137
- // Check if this is a radio module
138
- if (this.isRadioModule(packageJson)) {
139
- const plugin = await this.loadPluginModule(entry.name, packageJson);
140
- plugins.push(plugin);
141
- this.pluginCache.set(entry.name, plugin);
142
- }
134
+ if (entry.name.startsWith('@')) {
135
+ // Handle scoped packages
136
+ await this.processScopedPackage(nodeModulesPath, entry.name, plugins);
143
137
  }
144
- catch (error) {
145
- // Skip invalid packages
146
- this.logger.withMetadata({ name: entry.name, error }).debug('Skipped invalid package');
138
+ else {
139
+ // Handle regular packages
140
+ await this.processRegularPackage(nodeModulesPath, entry.name, plugins);
147
141
  }
148
142
  }
149
143
  }
150
144
  return plugins;
151
145
  }
146
+ async processScopedPackage(nodeModulesPath, scopeName, plugins) {
147
+ // First, try to process the scoped directory as a package itself
148
+ // (some scoped packages like @types/node have their own package.json)
149
+ const scopePackageJsonPath = join(nodeModulesPath, scopeName, 'package.json');
150
+ try {
151
+ if (existsSync(scopePackageJsonPath)) {
152
+ // The scoped directory itself is a package
153
+ await this.processRegularPackage(nodeModulesPath, scopeName, plugins);
154
+ return; // Don't scan subdirectories if this is a package itself
155
+ }
156
+ }
157
+ catch (error) {
158
+ // If processing as a package fails, continue to scan subdirectories
159
+ this.logger.withMetadata({ error, scopeName }).debug('Scoped directory is not a package, scanning subdirectories');
160
+ }
161
+ // If the scoped directory is not a package itself, scan for sub-packages
162
+ try {
163
+ const scopePath = join(nodeModulesPath, scopeName);
164
+ const scopedEntries = await readdir(scopePath, { withFileTypes: true });
165
+ for (const scopedEntry of scopedEntries) {
166
+ if (scopedEntry.isDirectory()) {
167
+ const fullPackageName = `${scopeName}/${scopedEntry.name}`;
168
+ await this.processRegularPackage(nodeModulesPath, fullPackageName, plugins);
169
+ }
170
+ }
171
+ }
172
+ catch (error) {
173
+ // Skip invalid scoped packages
174
+ this.logger.withError(error).withMetadata({ scopeName }).trace('Skipped invalid scoped package directory');
175
+ }
176
+ }
177
+ async processRegularPackage(nodeModulesPath, packageName, plugins) {
178
+ const packageJsonPath = join(nodeModulesPath, packageName, 'package.json');
179
+ try {
180
+ const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf8'));
181
+ // Check if this is a radio module
182
+ if (this.isRadioModule(packageJson)) {
183
+ const plugin = await this.loadPluginModule(packageName, packageJson);
184
+ plugins.push(plugin);
185
+ this.pluginCache.set(packageName, plugin);
186
+ }
187
+ }
188
+ catch (error) {
189
+ // Skip invalid packages
190
+ this.logger.withError(error).withMetadata({ packageName }).trace('Skipped invalid package');
191
+ }
192
+ }
152
193
  isRadioModule(packageJson) {
153
194
  const name = packageJson.name || '';
154
195
  // Check naming convention
@@ -156,21 +197,21 @@ export class NpmBasedConfigRegistry {
156
197
  // Check springfield plugin field
157
198
  const hasSpringfieldField = packageJson.springfield?.pluginType === 'radio-module';
158
199
  // Check keywords
159
- const hasKeywords = packageJson.keywords?.includes('radio-module');
200
+ const hasKeywords = packageJson.keywords?.includes('radio-module') ?? false;
160
201
  return isNamedCorrectly || hasSpringfieldField || hasKeywords;
161
202
  }
162
203
  async loadPluginModule(moduleName, packageJson) {
163
204
  const modulePath = join(process.cwd(), 'node_modules', moduleName);
164
205
  const springfieldConfig = packageJson.springfield || {};
165
206
  return {
166
- name: moduleName,
167
- version: packageJson.version,
168
- manufacturer: springfieldConfig.manufacturer,
169
- configPath: join(modulePath, springfieldConfig.configPath || 'configs'),
170
- sharedPath: join(modulePath, springfieldConfig.sharedPath || 'shared'),
171
- codecFactoryPath: springfieldConfig.codecFactory ? join(modulePath, springfieldConfig.codecFactory) : undefined,
172
207
  capabilities: springfieldConfig.capabilities || {},
208
+ codecFactoryPath: springfieldConfig.codecFactory ? join(modulePath, springfieldConfig.codecFactory) : undefined,
209
+ configPath: join(modulePath, springfieldConfig.configPath || 'configs'),
210
+ manufacturer: springfieldConfig.manufacturer,
211
+ name: moduleName,
173
212
  packageJson,
213
+ sharedPath: join(modulePath, springfieldConfig.sharedPath || 'shared'),
214
+ version: packageJson.version,
174
215
  };
175
216
  }
176
217
  async loadConfigurationsFromPlugin(plugin) {
@@ -228,7 +269,7 @@ export class NpmBasedConfigRegistry {
228
269
  }
229
270
  async loadCodecFromConfig(config) {
230
271
  if (!config.codec || config.codec.type !== 'shared' || !config.codec.reference) {
231
- return null;
272
+ return undefined;
232
273
  }
233
274
  const codecPath = this.sharedComponentManager.resolveReference(config.codec.reference, config.metadata.pluginPath || '');
234
275
  return this.sharedComponentManager.loadCodec(codecPath, {
@@ -255,8 +296,8 @@ export class NpmBasedConfigRegistry {
255
296
  errors.push(`Failed to validate plugin: ${error}`);
256
297
  }
257
298
  return {
258
- isValid: errors.length === 0,
259
299
  errors,
300
+ isValid: errors.length === 0,
260
301
  warnings,
261
302
  };
262
303
  }
@@ -266,8 +307,8 @@ export class NpmBasedConfigRegistry {
266
307
  return true;
267
308
  }
268
309
  async runPackageManager(args) {
269
- const { exec } = await import('child_process');
270
- const { promisify } = await import('util');
310
+ const { exec } = await import('node:child_process');
311
+ const { promisify } = await import('node:util');
271
312
  const execAsync = promisify(exec);
272
313
  try {
273
314
  await execAsync(`yarn ${args.join(' ')}`);
@@ -1 +1 @@
1
- {"version":3,"file":"config-registry.js","sourceRoot":"","sources":["../../src/registry/config-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-registry.js","sourceRoot":"","sources":["../../src/registry/config-registry.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import type { ILogLayer } from 'loglayer';
2
1
  import type { RadioCodec, SharedComponentManager } from '@springfield/ham-radio-api';
2
+ import type { ILogLayer } from 'loglayer';
3
3
  /**
4
4
  * Default implementation of the shared component manager
5
5
  */
@@ -1 +1 @@
1
- {"version":3,"file":"shared-components.d.ts","sourceRoot":"","sources":["../../src/registry/shared-components.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAG1C,OAAO,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAErF;;GAEG;AACH,qBAAa,6BAA8B,YAAW,sBAAsB;IAC1E,OAAO,CAAC,MAAM,CAAY;gBAEd,MAAM,EAAE,SAAS;IAIvB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAahE,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAapE,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAwBxF,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;CAc9D"}
1
+ {"version":3,"file":"shared-components.d.ts","sourceRoot":"","sources":["../../src/registry/shared-components.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACrF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAI1C;;GAEG;AACH,qBAAa,6BAA8B,YAAW,sBAAsB;IAC1E,OAAO,CAAC,MAAM,CAAY;gBAEd,MAAM,EAAE,SAAS;IAIvB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAahE,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAapE,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAwBxF,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;CAc9D"}
@@ -1,5 +1,5 @@
1
- import { readFile } from 'fs/promises';
2
- import { join } from 'path';
1
+ import { join } from 'node:path';
2
+ import { readFile } from 'node:fs/promises';
3
3
  /**
4
4
  * Default implementation of the shared component manager
5
5
  */
@@ -1 +1 @@
1
- {"version":3,"file":"shared-components.js","sourceRoot":"","sources":["../../src/registry/shared-components.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shared-components.js","sourceRoot":"","sources":["../../src/registry/shared-components.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@springfield/ham-radio-registry",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "author": "Bryan Hunt",
5
5
  "license": "MIT",
6
6
  "packageManager": "yarn@4.9.2",
@@ -59,15 +59,15 @@
59
59
  "@semantic-release/changelog": "6.0.3",
60
60
  "@semantic-release/git": "10.0.1",
61
61
  "@semantic-release/gitlab": "13.2.6",
62
- "chai": "5.2.0",
62
+ "chai": "5.2.1",
63
63
  "husky": "9.1.7",
64
- "oxlint": "1.8.0",
64
+ "oxlint": "1.12.0",
65
65
  "semantic-release": "23.1.1",
66
66
  "semantic-release-yarn": "3.0.2",
67
- "typescript": "5.8.3"
67
+ "typescript": "5.9.2"
68
68
  },
69
69
  "dependencies": {
70
- "@springfield/ham-radio-api": "^16.1.1",
70
+ "@springfield/ham-radio-api": "^16.1.3",
71
71
  "loglayer": "^6.6.0"
72
72
  }
73
73
  }
package/src/index.ts CHANGED
@@ -3,6 +3,7 @@ export type {
3
3
  RadioConfigMetadata,
4
4
  RadioCapabilities,
5
5
  CodecConfig,
6
+ RegistryRadio,
6
7
  } from './types/radio-config.js';
7
8
 
8
9
  // Re-export common types from ham-radio-api
@@ -20,8 +21,8 @@ export type {
20
21
  } from './types/plugin-module.js';
21
22
 
22
23
  // Registry components
23
- import type { RadioConfigRegistry } from './registry/config-registry.js';
24
- import { NpmBasedConfigRegistry } from './registry/config-registry.js';
24
+ export type { RadioConfigRegistry } from './registry/config-registry.js';
25
+ import { NpmBasedConfigRegistry, type RadioConfigRegistry } from './registry/config-registry.js';
25
26
 
26
27
  // Shared components
27
28
  export type { SharedComponentManager } from '@springfield/ham-radio-api';
@@ -1,14 +1,28 @@
1
+ import { DefaultNpmClient, type NpmClient } from '../utils/npm-client.js';
2
+ import type { RadioCodec, RadioModelId, SharedComponentManager, ValidationResult } from '@springfield/ham-radio-api';
3
+ import { readFile, readdir } from 'node:fs/promises';
4
+ import { DefaultSharedComponentManager } from './shared-components.js';
1
5
  import type { ILogLayer } from 'loglayer';
2
- import type { RadioModelId, RadioCodec, ValidationResult } from '@springfield/ham-radio-api';
3
- import type { RegistryRadio } from '../types/radio-config.js';
4
6
  import type { PluginModule } from '../types/plugin-module.js';
5
- import type { SharedComponentManager } from '@springfield/ham-radio-api';
6
- import type { NpmClient } from '../utils/npm-client.js';
7
- import { DefaultSharedComponentManager } from './shared-components.js';
8
- import { DefaultNpmClient } from '../utils/npm-client.js';
9
- import { readdir, readFile } from 'fs/promises';
10
- import { join } from 'path';
11
- import { existsSync } from 'fs';
7
+ import type { RegistryRadio } from '../types/radio-config.js';
8
+ import { existsSync } from 'node:fs';
9
+ import { join } from 'node:path';
10
+
11
+ export interface SpringfieldRadioModuleConfig {
12
+ pluginType: string;
13
+ codecFactory?: string;
14
+ configPath?: string;
15
+ sharedPath?: string;
16
+ manufacturer?: string;
17
+ capabilities?: Record<string, unknown>;
18
+ }
19
+
20
+ export interface PackageJson extends Record<string, unknown> {
21
+ name: string;
22
+ version: string;
23
+ keywords?: string[];
24
+ springfield: SpringfieldRadioModuleConfig;
25
+ }
12
26
 
13
27
  /**
14
28
  * Radio configuration registry interface
@@ -18,7 +32,7 @@ export interface RadioConfigRegistry {
18
32
  discoverConfigurations(): Promise<RegistryRadio[]>;
19
33
 
20
34
  // Get configuration by ID
21
- getConfiguration(configId: string): Promise<RegistryRadio | null>;
35
+ getConfiguration(configId: string): Promise<RegistryRadio | undefined>;
22
36
 
23
37
  // Get configurations by manufacturer
24
38
  getConfigurationsByManufacturer(manufacturer: string): Promise<RegistryRadio[]>;
@@ -39,7 +53,7 @@ export interface RadioConfigRegistry {
39
53
  listInstalledPlugins(): Promise<PluginModule[]>;
40
54
 
41
55
  // Get codec for a radio model
42
- getCodec(modelId: RadioModelId): Promise<RadioCodec | null>;
56
+ getCodec(modelId: RadioModelId): Promise<RadioCodec | undefined>;
43
57
  }
44
58
 
45
59
  /**
@@ -70,17 +84,17 @@ export class NpmBasedConfigRegistry implements RadioConfigRegistry {
70
84
  const pluginConfigs = await this.loadConfigurationsFromPlugin(plugin);
71
85
  configs.push(...pluginConfigs);
72
86
  } catch (error) {
73
- this.logger.withError(error).warn('Failed to load configurations from plugin ' + plugin.name);
87
+ this.logger.withMetadata({ pluignName: plugin.name }).withError(error).warn('Failed to load configurations from plugin ');
74
88
  }
75
89
  }
76
90
 
77
91
  return configs;
78
92
  }
79
93
 
80
- async getConfiguration(configId: string): Promise<RegistryRadio | null> {
94
+ async getConfiguration(configId: string): Promise<RegistryRadio | undefined> {
81
95
  // Check cache first
82
96
  if (this.configCache.has(configId)) {
83
- return this.configCache.get(configId)!;
97
+ return this.configCache.get(configId);
84
98
  }
85
99
 
86
100
  // Discover configurations if cache is empty
@@ -88,7 +102,7 @@ export class NpmBasedConfigRegistry implements RadioConfigRegistry {
88
102
  await this.discoverConfigurations();
89
103
  }
90
104
 
91
- return this.configCache.get(configId) || null;
105
+ return this.configCache.get(configId);
92
106
  }
93
107
 
94
108
  async getConfigurationsByManufacturer(manufacturer: string): Promise<RegistryRadio[]> {
@@ -132,8 +146,8 @@ export class NpmBasedConfigRegistry implements RadioConfigRegistry {
132
146
  }
133
147
 
134
148
  return {
135
- isValid: errors.length === 0,
136
149
  errors,
150
+ isValid: errors.length === 0,
137
151
  warnings,
138
152
  };
139
153
  }
@@ -165,19 +179,19 @@ export class NpmBasedConfigRegistry implements RadioConfigRegistry {
165
179
  }
166
180
 
167
181
  async listInstalledPlugins(): Promise<PluginModule[]> {
168
- return Array.from(this.pluginCache.values());
182
+ return [...this.pluginCache.values()];
169
183
  }
170
184
 
171
- async getCodec(modelId: RadioModelId): Promise<RadioCodec | null> {
185
+ async getCodec(modelId: RadioModelId): Promise<RadioCodec | undefined> {
172
186
  // Check cache first
173
187
  if (this.codecCache.has(modelId)) {
174
- return this.codecCache.get(modelId)!;
188
+ return this.codecCache.get(modelId);
175
189
  }
176
190
 
177
191
  // Find configuration for this model
178
192
  const config = await this.getConfiguration(modelId);
179
193
  if (!config || !config.codec) {
180
- return null;
194
+ return undefined;
181
195
  }
182
196
 
183
197
  // Load codec based on configuration
@@ -203,28 +217,71 @@ export class NpmBasedConfigRegistry implements RadioConfigRegistry {
203
217
 
204
218
  for (const entry of entries) {
205
219
  if (entry.isDirectory()) {
206
- const packageJsonPath = join(nodeModulesPath, entry.name, 'package.json');
220
+ if (entry.name.startsWith('@')) {
221
+ // Handle scoped packages
222
+ await this.processScopedPackage(nodeModulesPath, entry.name, plugins);
223
+ } else {
224
+ // Handle regular packages
225
+ await this.processRegularPackage(nodeModulesPath, entry.name, plugins);
226
+ }
227
+ }
228
+ }
207
229
 
208
- try {
209
- const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf8'));
230
+ return plugins;
231
+ }
210
232
 
211
- // Check if this is a radio module
212
- if (this.isRadioModule(packageJson)) {
213
- const plugin = await this.loadPluginModule(entry.name, packageJson);
214
- plugins.push(plugin);
215
- this.pluginCache.set(entry.name, plugin);
216
- }
217
- } catch (error) {
218
- // Skip invalid packages
219
- this.logger.withMetadata({ name: entry.name, error } as any).debug('Skipped invalid package');
233
+ private async processScopedPackage(nodeModulesPath: string, scopeName: string, plugins: PluginModule[]): Promise<void> {
234
+ // First, try to process the scoped directory as a package itself
235
+ // (some scoped packages like @types/node have their own package.json)
236
+ const scopePackageJsonPath = join(nodeModulesPath, scopeName, 'package.json');
237
+
238
+ try {
239
+ if (existsSync(scopePackageJsonPath)) {
240
+ // The scoped directory itself is a package
241
+ await this.processRegularPackage(nodeModulesPath, scopeName, plugins);
242
+ return; // Don't scan subdirectories if this is a package itself
243
+ }
244
+ } catch (error) {
245
+ // If processing as a package fails, continue to scan subdirectories
246
+ this.logger.withMetadata({ error, scopeName }).debug('Scoped directory is not a package, scanning subdirectories');
247
+ }
248
+
249
+ // If the scoped directory is not a package itself, scan for sub-packages
250
+ try {
251
+ const scopePath = join(nodeModulesPath, scopeName);
252
+ const scopedEntries = await readdir(scopePath, { withFileTypes: true });
253
+
254
+ for (const scopedEntry of scopedEntries) {
255
+ if (scopedEntry.isDirectory()) {
256
+ const fullPackageName = `${scopeName}/${scopedEntry.name}`;
257
+ await this.processRegularPackage(nodeModulesPath, fullPackageName, plugins);
220
258
  }
221
259
  }
260
+ } catch (error) {
261
+ // Skip invalid scoped packages
262
+ this.logger.withError(error).withMetadata({ scopeName }).trace('Skipped invalid scoped package directory');
222
263
  }
264
+ }
223
265
 
224
- return plugins;
266
+ private async processRegularPackage(nodeModulesPath: string, packageName: string, plugins: PluginModule[]): Promise<void> {
267
+ const packageJsonPath = join(nodeModulesPath, packageName, 'package.json');
268
+
269
+ try {
270
+ const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf8'));
271
+
272
+ // Check if this is a radio module
273
+ if (this.isRadioModule(packageJson)) {
274
+ const plugin = await this.loadPluginModule(packageName, packageJson);
275
+ plugins.push(plugin);
276
+ this.pluginCache.set(packageName, plugin);
277
+ }
278
+ } catch (error) {
279
+ // Skip invalid packages
280
+ this.logger.withError(error).withMetadata({ packageName }).trace('Skipped invalid package');
281
+ }
225
282
  }
226
283
 
227
- private isRadioModule(packageJson: any): boolean {
284
+ private isRadioModule(packageJson: PackageJson): boolean {
228
285
  const name = packageJson.name || '';
229
286
 
230
287
  // Check naming convention
@@ -234,24 +291,24 @@ export class NpmBasedConfigRegistry implements RadioConfigRegistry {
234
291
  const hasSpringfieldField = packageJson.springfield?.pluginType === 'radio-module';
235
292
 
236
293
  // Check keywords
237
- const hasKeywords = packageJson.keywords?.includes('radio-module');
294
+ const hasKeywords = packageJson.keywords?.includes('radio-module') ?? false;
238
295
 
239
296
  return isNamedCorrectly || hasSpringfieldField || hasKeywords;
240
297
  }
241
298
 
242
- private async loadPluginModule(moduleName: string, packageJson: any): Promise<PluginModule> {
299
+ private async loadPluginModule(moduleName: string, packageJson: PackageJson): Promise<PluginModule> {
243
300
  const modulePath = join(process.cwd(), 'node_modules', moduleName);
244
- const springfieldConfig = packageJson.springfield || {};
301
+ const springfieldConfig = packageJson.springfield|| {};
245
302
 
246
303
  return {
247
- name: moduleName,
248
- version: packageJson.version,
249
- manufacturer: springfieldConfig.manufacturer,
250
- configPath: join(modulePath, springfieldConfig.configPath || 'configs'),
251
- sharedPath: join(modulePath, springfieldConfig.sharedPath || 'shared'),
252
- codecFactoryPath: springfieldConfig.codecFactory ? join(modulePath, springfieldConfig.codecFactory) : undefined,
253
304
  capabilities: springfieldConfig.capabilities || {},
305
+ codecFactoryPath: springfieldConfig.codecFactory ? join(modulePath, springfieldConfig.codecFactory) : undefined,
306
+ configPath: join(modulePath, springfieldConfig.configPath || 'configs'),
307
+ manufacturer: springfieldConfig.manufacturer,
308
+ name: moduleName,
254
309
  packageJson,
310
+ sharedPath: join(modulePath, springfieldConfig.sharedPath || 'shared'),
311
+ version: packageJson.version,
255
312
  } as PluginModule;
256
313
  }
257
314
 
@@ -308,19 +365,19 @@ export class NpmBasedConfigRegistry implements RadioConfigRegistry {
308
365
  private async resolveSharedComponents(config: RegistryRadio, plugin: PluginModule): Promise<void> {
309
366
  // Resolve schema references
310
367
  if (config.settingsSchema.settingsSchema && typeof config.settingsSchema.settingsSchema === 'object' && '$ref' in config.settingsSchema.settingsSchema) {
311
- const schemaPath = this.sharedComponentManager.resolveReference(config.settingsSchema.settingsSchema.$ref, plugin.configPath);
368
+ const schemaPath = this.sharedComponentManager.resolveReference(config.settingsSchema.settingsSchema.$ref as string, plugin.configPath);
312
369
  config.settingsSchema.settingsSchema = await this.sharedComponentManager.loadSchema(schemaPath);
313
370
  }
314
371
 
315
372
  if (config.settingsSchema.channelSchema && typeof config.settingsSchema.channelSchema === 'object' && '$ref' in config.settingsSchema.channelSchema) {
316
- const schemaPath = this.sharedComponentManager.resolveReference(config.settingsSchema.channelSchema.$ref, plugin.configPath);
373
+ const schemaPath = this.sharedComponentManager.resolveReference(config.settingsSchema.channelSchema.$ref as string, plugin.configPath);
317
374
  config.settingsSchema.channelSchema = await this.sharedComponentManager.loadSchema(schemaPath);
318
375
  }
319
376
  }
320
377
 
321
- private async loadCodecFromConfig(config: RegistryRadio): Promise<RadioCodec | null> {
378
+ private async loadCodecFromConfig(config: RegistryRadio): Promise<RadioCodec | undefined> {
322
379
  if (!config.codec || config.codec.type !== 'shared' || !config.codec.reference) {
323
- return null;
380
+ return undefined;
324
381
  }
325
382
 
326
383
  const codecPath = this.sharedComponentManager.resolveReference(config.codec.reference, config.metadata.pluginPath || '');
@@ -353,8 +410,8 @@ export class NpmBasedConfigRegistry implements RadioConfigRegistry {
353
410
  }
354
411
 
355
412
  return {
356
- isValid: errors.length === 0,
357
413
  errors,
414
+ isValid: errors.length === 0,
358
415
  warnings,
359
416
  };
360
417
  }
@@ -366,8 +423,8 @@ export class NpmBasedConfigRegistry implements RadioConfigRegistry {
366
423
  }
367
424
 
368
425
  private async runPackageManager(args: string[]): Promise<void> {
369
- const { exec } = await import('child_process');
370
- const { promisify } = await import('util');
426
+ const { exec } = await import('node:child_process');
427
+ const { promisify } = await import('node:util');
371
428
  const execAsync = promisify(exec);
372
429
 
373
430
  try {
@@ -1,7 +1,7 @@
1
- import type { ILogLayer } from 'loglayer';
2
- import { readFile } from 'fs/promises';
3
- import { join } from 'path';
4
1
  import type { RadioCodec, SharedComponentManager } from '@springfield/ham-radio-api';
2
+ import type { ILogLayer } from 'loglayer';
3
+ import { join } from 'node:path';
4
+ import { readFile } from 'node:fs/promises';
5
5
 
6
6
  /**
7
7
  * Default implementation of the shared component manager
@@ -22,7 +22,7 @@ export interface NpmClient {
22
22
  * NPM search response interface
23
23
  */
24
24
  interface NpmSearchResponse {
25
- objects: Array<{
25
+ objects: {
26
26
  package: {
27
27
  name: string;
28
28
  version: string;
@@ -35,7 +35,7 @@ interface NpmSearchResponse {
35
35
  date?: string;
36
36
  springfield?: any;
37
37
  };
38
- }>;
38
+ }[];
39
39
  }
40
40
 
41
41
  /**