@springfield/ham-radio-registry 1.0.16 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/catalog/content-hash.d.ts +9 -0
  2. package/dist/catalog/content-hash.d.ts.map +1 -0
  3. package/dist/catalog/content-hash.js +18 -0
  4. package/dist/catalog/content-hash.js.map +1 -0
  5. package/dist/catalog/extract-catalog-metadata.d.ts +6 -0
  6. package/dist/catalog/extract-catalog-metadata.d.ts.map +1 -0
  7. package/dist/catalog/extract-catalog-metadata.js +29 -0
  8. package/dist/catalog/extract-catalog-metadata.js.map +1 -0
  9. package/dist/catalog/hydrate-radio-config.d.ts +7 -0
  10. package/dist/catalog/hydrate-radio-config.d.ts.map +1 -0
  11. package/dist/catalog/hydrate-radio-config.js +50 -0
  12. package/dist/catalog/hydrate-radio-config.js.map +1 -0
  13. package/dist/catalog/index.d.ts +5 -0
  14. package/dist/catalog/index.d.ts.map +1 -0
  15. package/dist/catalog/index.js +5 -0
  16. package/dist/catalog/index.js.map +1 -0
  17. package/dist/catalog/validate-configuration.d.ts +7 -0
  18. package/dist/catalog/validate-configuration.d.ts.map +1 -0
  19. package/dist/catalog/validate-configuration.js +31 -0
  20. package/dist/catalog/validate-configuration.js.map +1 -0
  21. package/dist/index.d.ts +2 -8
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +2 -7
  24. package/dist/index.js.map +1 -1
  25. package/dist/node.d.ts +17 -0
  26. package/dist/node.d.ts.map +1 -0
  27. package/dist/node.js +16 -0
  28. package/dist/node.js.map +1 -0
  29. package/dist/registry/config-registry.d.ts.map +1 -1
  30. package/dist/registry/config-registry.js +20 -28
  31. package/dist/registry/config-registry.js.map +1 -1
  32. package/dist/types/radio-config.d.ts +21 -5
  33. package/dist/types/radio-config.d.ts.map +1 -1
  34. package/package.json +13 -1
  35. package/src/catalog/content-hash.ts +20 -0
  36. package/src/catalog/extract-catalog-metadata.ts +36 -0
  37. package/src/catalog/hydrate-radio-config.ts +72 -0
  38. package/src/catalog/index.ts +4 -0
  39. package/src/catalog/validate-configuration.ts +40 -0
  40. package/src/index.ts +10 -16
  41. package/src/node.ts +25 -0
  42. package/src/registry/config-registry.ts +25 -36
  43. package/src/types/radio-config.ts +23 -5
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Stable FNV-1a 32-bit hash of a string (browser- and Node-safe, sync).
3
+ */
4
+ export declare function computeContentHash(value: string): string;
5
+ /**
6
+ * Hash a resolved radio config for catalog change detection.
7
+ */
8
+ export declare function hashRadioConfig(config: unknown): string;
9
+ //# sourceMappingURL=content-hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-hash.d.ts","sourceRoot":"","sources":["../../src/catalog/content-hash.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASxD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAEvD"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Stable FNV-1a 32-bit hash of a string (browser- and Node-safe, sync).
3
+ */
4
+ export function computeContentHash(value) {
5
+ let hash = 0x811c9dc5;
6
+ for (let index = 0; index < value.length; index += 1) {
7
+ hash ^= value.charCodeAt(index);
8
+ hash = Math.imul(hash, 0x01000193);
9
+ }
10
+ return (hash >>> 0).toString(16).padStart(8, '0');
11
+ }
12
+ /**
13
+ * Hash a resolved radio config for catalog change detection.
14
+ */
15
+ export function hashRadioConfig(config) {
16
+ return computeContentHash(JSON.stringify(config));
17
+ }
18
+ //# sourceMappingURL=content-hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-hash.js","sourceRoot":"","sources":["../../src/catalog/content-hash.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,IAAI,IAAI,GAAG,UAAU,CAAC;IAEtB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAe;IAC7C,OAAO,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { RadioCatalogEntry, RadioCatalogSource, RegistryRadio } from '../types/radio-config.js';
2
+ /**
3
+ * Extract lightweight catalog metadata from a hydrated radio config.
4
+ */
5
+ export declare function extractCatalogMetadata(radio: RegistryRadio, source?: RadioCatalogSource, contentHash?: string): RadioCatalogEntry;
6
+ //# sourceMappingURL=extract-catalog-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-catalog-metadata.d.ts","sourceRoot":"","sources":["../../src/catalog/extract-catalog-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAqB,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAUxH;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,aAAa,EACpB,MAAM,GAAE,kBAA2B,EACnC,WAAW,CAAC,EAAE,MAAM,GACnB,iBAAiB,CAkBnB"}
@@ -0,0 +1,29 @@
1
+ import { hashRadioConfig } from './content-hash.js';
2
+ const DEFAULT_CAPABILITIES = {
3
+ memoryRead: false,
4
+ memoryWrite: false,
5
+ channelProgramming: false,
6
+ settingsProgramming: false,
7
+ };
8
+ /**
9
+ * Extract lightweight catalog metadata from a hydrated radio config.
10
+ */
11
+ export function extractCatalogMetadata(radio, source = 'user', contentHash) {
12
+ const capabilities = {
13
+ memoryRead: radio.capabilities?.memoryRead ?? DEFAULT_CAPABILITIES.memoryRead,
14
+ memoryWrite: radio.capabilities?.memoryWrite ?? DEFAULT_CAPABILITIES.memoryWrite,
15
+ channelProgramming: radio.capabilities?.channelProgramming ?? DEFAULT_CAPABILITIES.channelProgramming,
16
+ settingsProgramming: radio.capabilities?.settingsProgramming ?? DEFAULT_CAPABILITIES.settingsProgramming,
17
+ };
18
+ return {
19
+ modelId: radio.id.model,
20
+ name: radio.id.name,
21
+ manufacturer: radio.id.manufacturer,
22
+ version: radio.version,
23
+ description: radio.description,
24
+ capabilities,
25
+ source,
26
+ contentHash: contentHash ?? hashRadioConfig(radio),
27
+ };
28
+ }
29
+ //# sourceMappingURL=extract-catalog-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-catalog-metadata.js","sourceRoot":"","sources":["../../src/catalog/extract-catalog-metadata.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,oBAAoB,GAAsB;IAC9C,UAAU,EAAE,KAAK;IACjB,WAAW,EAAE,KAAK;IAClB,kBAAkB,EAAE,KAAK;IACzB,mBAAmB,EAAE,KAAK;CAC3B,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAoB,EACpB,MAAM,GAAuB,MAAM,EACnC,WAAoB;IAEpB,MAAM,YAAY,GAAsB;QACtC,UAAU,EAAE,KAAK,CAAC,YAAY,EAAE,UAAU,IAAI,oBAAoB,CAAC,UAAU;QAC7E,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,WAAW,IAAI,oBAAoB,CAAC,WAAW;QAChF,kBAAkB,EAAE,KAAK,CAAC,YAAY,EAAE,kBAAkB,IAAI,oBAAoB,CAAC,kBAAkB;QACrG,mBAAmB,EAAE,KAAK,CAAC,YAAY,EAAE,mBAAmB,IAAI,oBAAoB,CAAC,mBAAmB;KACzG,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK;QACvB,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI;QACnB,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY;QACnC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,YAAY;QACZ,MAAM;QACN,WAAW,EAAE,WAAW,IAAI,eAAe,CAAC,KAAK,CAAC;KACnD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { RegistryRadio } from '../types/radio-config.js';
2
+ /**
3
+ * Parse radio config JSON (or object) and inline `$ref` documents from `documentsByRef`.
4
+ * Keys in `documentsByRef` must match `$ref` strings exactly as they appear in the config.
5
+ */
6
+ export declare function hydrateRadioConfig(json: string | Record<string, unknown>, documentsByRef?: Record<string, unknown>): RegistryRadio;
7
+ //# sourceMappingURL=hydrate-radio-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hydrate-radio-config.d.ts","sourceRoot":"","sources":["../../src/catalog/hydrate-radio-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuB,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAqDnF;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,cAAc,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAC3C,aAAa,CAWf"}
@@ -0,0 +1,50 @@
1
+ function isRefObject(value) {
2
+ return typeof value === 'object' && value !== null && '$ref' in value && typeof value.$ref === 'string';
3
+ }
4
+ function resolveRef(ref, documentsByRef) {
5
+ if (!(ref in documentsByRef)) {
6
+ throw new Error(`Missing document for $ref: ${ref}`);
7
+ }
8
+ return structuredClone(documentsByRef[ref]);
9
+ }
10
+ function resolveValue(value, documentsByRef) {
11
+ if (isRefObject(value)) {
12
+ return resolveRef(value.$ref, documentsByRef);
13
+ }
14
+ if (Array.isArray(value)) {
15
+ return value.map((item) => resolveValue(item, documentsByRef));
16
+ }
17
+ if (typeof value === 'object' && value !== null) {
18
+ const result = {};
19
+ for (const [key, nested] of Object.entries(value)) {
20
+ result[key] = resolveValue(nested, documentsByRef);
21
+ }
22
+ return result;
23
+ }
24
+ return value;
25
+ }
26
+ function normalizeMetadata(raw) {
27
+ const metadata = (typeof raw === 'object' && raw !== null ? raw : {});
28
+ return {
29
+ moduleId: typeof metadata.moduleId === 'string' ? metadata.moduleId : '',
30
+ moduleVersion: typeof metadata.moduleVersion === 'string' ? metadata.moduleVersion : '',
31
+ pluginPath: typeof metadata.pluginPath === 'string' ? metadata.pluginPath : '',
32
+ ...(typeof metadata.lastUpdated === 'string' ? { lastUpdated: metadata.lastUpdated } : {}),
33
+ ...(typeof metadata.author === 'string' ? { author: metadata.author } : {}),
34
+ ...(typeof metadata.license === 'string' ? { license: metadata.license } : {}),
35
+ };
36
+ }
37
+ /**
38
+ * Parse radio config JSON (or object) and inline `$ref` documents from `documentsByRef`.
39
+ * Keys in `documentsByRef` must match `$ref` strings exactly as they appear in the config.
40
+ */
41
+ export function hydrateRadioConfig(json, documentsByRef = {}) {
42
+ const parsed = typeof json === 'string' ? JSON.parse(json) : structuredClone(json);
43
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
44
+ throw new Error('Radio configuration must be a JSON object');
45
+ }
46
+ const resolved = resolveValue(parsed, documentsByRef);
47
+ resolved.metadata = normalizeMetadata(resolved.metadata);
48
+ return resolved;
49
+ }
50
+ //# sourceMappingURL=hydrate-radio-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hydrate-radio-config.js","sourceRoot":"","sources":["../../src/catalog/hydrate-radio-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { hydrateRadioConfig } from './hydrate-radio-config.js';
2
+ export { extractCatalogMetadata } from './extract-catalog-metadata.js';
3
+ export { validateConfiguration } from './validate-configuration.js';
4
+ export { computeContentHash, hashRadioConfig } from './content-hash.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/catalog/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { hydrateRadioConfig } from './hydrate-radio-config.js';
2
+ export { extractCatalogMetadata } from './extract-catalog-metadata.js';
3
+ export { validateConfiguration } from './validate-configuration.js';
4
+ export { computeContentHash, hashRadioConfig } from './content-hash.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/catalog/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ValidationResult } from '@springfield/ham-radio-api';
2
+ import type { RegistryRadio } from '../types/radio-config.js';
3
+ /**
4
+ * Validate a radio configuration for catalog ingest and registry use.
5
+ */
6
+ export declare function validateConfiguration(config: RegistryRadio): ValidationResult;
7
+ //# sourceMappingURL=validate-configuration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-configuration.d.ts","sourceRoot":"","sources":["../../src/catalog/validate-configuration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,gBAAgB,CAiC7E"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Validate a radio configuration for catalog ingest and registry use.
3
+ */
4
+ export function validateConfiguration(config) {
5
+ const errors = [];
6
+ const warnings = [];
7
+ if (!config.id?.model) {
8
+ errors.push('Configuration must have a valid model ID');
9
+ }
10
+ if (!config.serialConfig) {
11
+ errors.push('Configuration must have serial configuration');
12
+ }
13
+ if (!config.memoryConfig) {
14
+ errors.push('Configuration must have memory configuration');
15
+ }
16
+ if (!config.readMemory || config.readMemory.length === 0) {
17
+ errors.push('Configuration must have read memory protocol');
18
+ }
19
+ if (!config.writeMemory || config.writeMemory.length === 0) {
20
+ errors.push('Configuration must have write memory protocol');
21
+ }
22
+ if (!config.settingsSchema) {
23
+ errors.push('Configuration must have settings schema');
24
+ }
25
+ return {
26
+ errors,
27
+ isValid: errors.length === 0,
28
+ warnings,
29
+ };
30
+ }
31
+ //# sourceMappingURL=validate-configuration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-configuration.js","sourceRoot":"","sources":["../../src/catalog/validate-configuration.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAqB;IACzD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3D,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IACzD,CAAC;IAED,OAAO;QACL,MAAM;QACN,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC5B,QAAQ;KACT,CAAC;AACJ,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,11 +1,5 @@
1
- export type { RadioConfigMetadata, RadioCapabilities, CodecConfig, RegistryRadio, } from './types/radio-config.js';
1
+ export type { RadioConfigMetadata, RadioCapabilities, CodecConfig, RegistryRadio, RadioCatalogEntry, RadioCatalogSource, } 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
- export type { RadioConfigRegistry } from './registry/config-registry.js';
5
- import { type RadioConfigRegistry } from './registry/config-registry.js';
6
- export type { SharedComponentManager } from '@springfield/ham-radio-api';
7
- export { DefaultSharedComponentManager } from './registry/shared-components.js';
8
- export type { NpmClient } from './utils/npm-client.js';
9
- export { DefaultNpmClient } from './utils/npm-client.js';
10
- export declare function createRegistry(logger: any): RadioConfigRegistry;
4
+ export { hydrateRadioConfig, extractCatalogMetadata, validateConfiguration, computeContentHash, hashRadioConfig, } from './catalog/index.js';
11
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,kBAAkB,GACnB,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,EACL,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,GAChB,MAAM,oBAAoB,CAAC"}
package/dist/index.js CHANGED
@@ -1,8 +1,3 @@
1
- import { NpmBasedConfigRegistry } from './registry/config-registry.js';
2
- export { DefaultSharedComponentManager } from './registry/shared-components.js';
3
- export { DefaultNpmClient } from './utils/npm-client.js';
4
- // Factory function for creating registry instances
5
- export function createRegistry(logger) {
6
- return new NpmBasedConfigRegistry(logger);
7
- }
1
+ // Browser-safe catalog API (no node:fs)
2
+ export { hydrateRadioConfig, extractCatalogMetadata, validateConfiguration, computeContentHash, hashRadioConfig, } from './catalog/index.js';
8
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
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
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAwBA,wCAAwC;AACxC,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,GAChB,MAAM,oBAAoB,CAAC"}
package/dist/node.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Node.js entry — npm/fs plugin discovery. Import from `@springfield/ham-radio-registry/node`.
3
+ */
4
+ export type { RadioConfigRegistry } from './registry/config-registry.js';
5
+ export { NpmBasedConfigRegistry } from './registry/config-registry.js';
6
+ export type { SharedComponentManager } from '@springfield/ham-radio-api';
7
+ export { DefaultSharedComponentManager } from './registry/shared-components.js';
8
+ export type { NpmClient } from './utils/npm-client.js';
9
+ export { DefaultNpmClient } from './utils/npm-client.js';
10
+ import { type RadioConfigRegistry } from './registry/config-registry.js';
11
+ import type { ILogLayer } from 'loglayer';
12
+ /**
13
+ * Create an npm-based radio configuration registry (Node.js only).
14
+ */
15
+ export declare function createRegistry(logger: ILogLayer): RadioConfigRegistry;
16
+ export * from './index.js';
17
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,YAAY,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAEhF,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAA0B,KAAK,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACjG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,mBAAmB,CAErE;AAGD,cAAc,YAAY,CAAC"}
package/dist/node.js ADDED
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Node.js entry — npm/fs plugin discovery. Import from `@springfield/ham-radio-registry/node`.
3
+ */
4
+ export { NpmBasedConfigRegistry } from './registry/config-registry.js';
5
+ export { DefaultSharedComponentManager } from './registry/shared-components.js';
6
+ export { DefaultNpmClient } from './utils/npm-client.js';
7
+ import { NpmBasedConfigRegistry } from './registry/config-registry.js';
8
+ /**
9
+ * Create an npm-based radio configuration registry (Node.js only).
10
+ */
11
+ export function createRegistry(logger) {
12
+ return new NpmBasedConfigRegistry(logger);
13
+ }
14
+ // Re-export browser-safe catalog API for convenience
15
+ export * from './index.js';
16
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAGvE,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAGhF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,sBAAsB,EAA4B,MAAM,+BAA+B,CAAC;AAGjG;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAiB;IAC9C,OAAO,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,qDAAqD;AACrD,cAAc,YAAY,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"config-registry.d.ts","sourceRoot":"","sources":["../../src/registry/config-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-registry.d.ts","sourceRoot":"","sources":["../../src/registry/config-registry.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  import { DefaultNpmClient } from '../utils/npm-client.js';
2
+ import { createMemoryMapCodec } from '@springfield/ham-radio-utils';
2
3
  import { readFile, readdir } from 'node:fs/promises';
3
4
  import { DefaultSharedComponentManager } from './shared-components.js';
5
+ import { validateConfiguration as validateRadioConfiguration } from '../catalog/validate-configuration.js';
4
6
  import { existsSync } from 'node:fs';
5
7
  import { join } from 'node:path';
6
8
  /**
@@ -53,33 +55,7 @@ export class NpmBasedConfigRegistry {
53
55
  return configs.filter((config) => config.metadata.moduleId === moduleId);
54
56
  }
55
57
  validateConfiguration(config) {
56
- const errors = [];
57
- const warnings = [];
58
- // Basic validation
59
- if (!config.id?.model) {
60
- errors.push('Configuration must have a valid model ID');
61
- }
62
- if (!config.serialConfig) {
63
- errors.push('Configuration must have serial configuration');
64
- }
65
- if (!config.memoryConfig) {
66
- errors.push('Configuration must have memory configuration');
67
- }
68
- if (!config.readMemory || config.readMemory.length === 0) {
69
- errors.push('Configuration must have read memory protocol');
70
- }
71
- if (!config.writeMemory || config.writeMemory.length === 0) {
72
- errors.push('Configuration must have write memory protocol');
73
- }
74
- // Schema validation
75
- if (!config.settingsSchema) {
76
- errors.push('Configuration must have settings schema');
77
- }
78
- return {
79
- errors,
80
- isValid: errors.length === 0,
81
- warnings,
82
- };
58
+ return validateRadioConfiguration(config);
83
59
  }
84
60
  async registerConfiguration(config) {
85
61
  const validation = this.validateConfiguration(config);
@@ -111,7 +87,7 @@ export class NpmBasedConfigRegistry {
111
87
  }
112
88
  // Find configuration for this model
113
89
  const config = await this.getConfiguration(modelId);
114
- if (!config || !config.codec) {
90
+ if (!config) {
115
91
  return undefined;
116
92
  }
117
93
  // Load codec based on configuration
@@ -266,8 +242,24 @@ export class NpmBasedConfigRegistry {
266
242
  const schemaPath = this.sharedComponentManager.resolveReference(config.settingsSchema.channelSchema.$ref, plugin.configPath);
267
243
  config.settingsSchema.channelSchema = await this.sharedComponentManager.loadSchema(schemaPath);
268
244
  }
245
+ if (config.memoryMap && typeof config.memoryMap === 'object' && '$ref' in config.memoryMap) {
246
+ const memoryMapPath = this.sharedComponentManager.resolveReference(config.memoryMap.$ref, plugin.configPath);
247
+ config.memoryMap = (await this.sharedComponentManager.loadSchema(memoryMapPath));
248
+ }
269
249
  }
270
250
  async loadCodecFromConfig(config) {
251
+ const memoryMap = config.memoryMap;
252
+ const usesMemoryMap = !config.codec ||
253
+ config.codec.type === 'memoryMap' ||
254
+ (config.codec.type !== 'shared' && memoryMap !== undefined && !('$ref' in memoryMap));
255
+ if (usesMemoryMap && memoryMap && typeof memoryMap === 'object' && !('$ref' in memoryMap)) {
256
+ return createMemoryMapCodec({
257
+ radioModel: config.id.model,
258
+ memoryMap,
259
+ memoryConfig: config.memoryConfig,
260
+ logger: this.logger,
261
+ });
262
+ }
271
263
  if (!config.codec || config.codec.type !== 'shared' || !config.codec.reference) {
272
264
  return undefined;
273
265
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config-registry.js","sourceRoot":"","sources":["../../src/registry/config-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAkB,MAAM,wBAAwB,CAAC;AAE1E,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AAIvE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAkDjC;;GAEG;AACH,MAAM,OAAO,sBAAsB;IACzB,WAAW,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC/C,WAAW,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC9C,UAAU,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC3C,sBAAsB,CAAyB;IAC/C,SAAS,CAAY;IACrB,MAAM,CAAY;IAE1B,YAAY,MAAiB;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,sBAAsB,GAAG,IAAI,6BAA6B,CAAC,MAAM,CAAC,CAAC;QACxE,IAAI,CAAC,SAAS,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,sBAAsB;QAC1B,MAAM,OAAO,GAAoB,EAAE,CAAC;QAEpC,4CAA4C;QAC5C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAEzD,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC;gBACtE,OAAO,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;YACjC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;YAC5H,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,QAAgB;QACrC,oBAAoB;QACpB,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;QAED,4CAA4C;QAC5C,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC;QACtC,CAAC;QAED,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,+BAA+B,CAAC,YAAoB;QACxD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC;QACpD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,KAAK,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;IACzG,CAAC;IAED,KAAK,CAAC,yBAAyB,CAAC,QAAgB;QAC9C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC;QACpD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC3E,CAAC;IAED,qBAAqB,CAAC,MAAqB;QACzC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,mBAAmB;QACnB,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzD,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QAC/D,CAAC;QAED,oBAAoB;QACpB,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACzD,CAAC;QAED,OAAO;YACL,MAAM;YACN,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC5B,QAAQ;SACT,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,MAAqB;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,0BAA0B,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAC1F,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAgB;QAClC,sCAAsC;QACtC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,6BAA6B,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/E,CAAC;QAED,qBAAqB;QACrB,MAAM,IAAI,CAAC,iBAAiB,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;QAEhD,iCAAiC;QACjC,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAEpC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,oBAAoB;QACxB,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAqB;QAClC,oBAAoB;QACpB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;QAED,oCAAoC;QACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,oCAAoC;QACpC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACrD,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,qBAAqB;QACjC,MAAM,OAAO,GAAmB,EAAE,CAAC;QAEnC,sCAAsC;QACtC,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;QAE5D,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACjC,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,eAAe,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAExE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC/B,yBAAyB;oBACzB,MAAM,IAAI,CAAC,oBAAoB,CAAC,eAAe,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBACxE,CAAC;qBAAM,CAAC;oBACN,0BAA0B;oBAC1B,MAAM,IAAI,CAAC,qBAAqB,CAAC,eAAe,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBACzE,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAES,KAAK,CAAC,oBAAoB,CAAC,eAAuB,EAAE,SAAiB,EAAE,OAAuB;QACtG,iEAAiE;QACjE,sEAAsE;QACtE,MAAM,oBAAoB,GAAG,IAAI,CAAC,eAAe,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;QAE9E,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;gBACrC,2CAA2C;gBAC3C,MAAM,IAAI,CAAC,qBAAqB,CAAC,eAAe,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;gBACtE,OAAO,CAAC,wDAAwD;YAClE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,oEAAoE;YACpE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;QACrH,CAAC;QAED,yEAAyE;QACzE,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;YACnD,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAExE,KAAK,MAAM,WAAW,IAAI,aAAa,EAAE,CAAC;gBACxC,IAAI,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC;oBAC9B,MAAM,eAAe,GAAG,GAAG,SAAS,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;oBAC3D,MAAM,IAAI,CAAC,qBAAqB,CAAC,eAAe,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;gBAC9E,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,+BAA+B;YAC/B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC7G,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,qBAAqB,CAAC,eAAuB,EAAE,WAAmB,EAAE,OAAuB;QACvG,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;QAE3E,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;YAExE,kCAAkC;YAClC,IAAI,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;gBACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;gBACrE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACrB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,wBAAwB;YACxB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,WAAwB;QAC5C,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC;QAEpC,0BAA0B;QAC1B,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,4BAA4B,CAAC,CAAC;QAExG,iCAAiC;QACjC,MAAM,mBAAmB,GAAG,WAAW,CAAC,WAAW,EAAE,UAAU,KAAK,cAAc,CAAC;QAEnF,iBAAiB;QACjB,MAAM,WAAW,GAAG,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC;QAE5E,OAAO,gBAAgB,IAAI,mBAAmB,IAAI,WAAW,CAAC;IAChE,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,UAAkB,EAAE,WAAwB;QACzE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;QACnE,MAAM,iBAAiB,GAAG,WAAW,CAAC,WAAW,IAAG,EAAE,CAAC;QAEvD,OAAO;YACL,YAAY,EAAE,iBAAiB,CAAC,YAAY,IAAI,EAAE;YAClD,gBAAgB,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS;YAC/G,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,UAAU,IAAI,SAAS,CAAC;YACvE,YAAY,EAAE,iBAAiB,CAAC,YAAY;YAC5C,IAAI,EAAE,UAAU;YAChB,WAAW;YACX,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,UAAU,IAAI,QAAQ,CAAC;YACtE,OAAO,EAAE,WAAW,CAAC,OAAO;SACb,CAAC;IACpB,CAAC;IAEO,KAAK,CAAC,4BAA4B,CAAC,MAAoB;QAC7D,MAAM,OAAO,GAAoB,EAAE,CAAC;QAEpC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAElE,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACrC,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;oBAExD,sCAAsC;oBACtC,MAAM,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBAEnD,sBAAsB;oBACtB,MAAM,CAAC,QAAQ,GAAG;wBAChB,GAAG,MAAM,CAAC,QAAQ;wBAClB,QAAQ,EAAE,MAAM,CAAC,IAAI;wBACrB,aAAa,EAAE,MAAM,CAAC,OAAO;wBAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;qBAC9B,CAAC;oBAEF,IAAI,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;wBAC/C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBACrB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;oBAChD,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,qCAAqC,UAAU,GAAG,CAAC,CAAC;gBACxF,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,qCAAqC,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC;QAC/F,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,UAAkB;QAC9C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;QACxC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9F,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,UAAkB;QAChD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAEO,KAAK,CAAC,uBAAuB,CAAC,MAAqB,EAAE,MAAoB;QAC/E,4BAA4B;QAC5B,IAAI,MAAM,CAAC,cAAc,CAAC,cAAc,IAAI,OAAO,MAAM,CAAC,cAAc,CAAC,cAAc,KAAK,QAAQ,IAAI,MAAM,IAAI,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;YACvJ,MAAM,UAAU,GAAG,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC,IAAc,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YACxI,MAAM,CAAC,cAAc,CAAC,cAAc,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAClG,CAAC;QAED,IAAI,MAAM,CAAC,cAAc,CAAC,aAAa,IAAI,OAAO,MAAM,CAAC,cAAc,CAAC,aAAa,KAAK,QAAQ,IAAI,MAAM,IAAI,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC;YACpJ,MAAM,UAAU,GAAG,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,MAAM,CAAC,cAAc,CAAC,aAAa,CAAC,IAAc,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YACvI,MAAM,CAAC,cAAc,CAAC,aAAa,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QACjG,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,MAAqB;QACrD,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YAC/E,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;QAEzH,OAAO,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,SAAS,EAAE;YACtD,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK;YACxB,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM;SACvB,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,QAAgB;QAC3C,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,IAAI,CAAC;YACH,qCAAqC;YACrC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YAElE,+BAA+B;YAC/B,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;gBACrC,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YAC/C,CAAC;YAED,8BAA8B;YAC9B,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAC;QACrD,CAAC;QAED,OAAO;YACL,MAAM;YACN,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC5B,QAAQ;SACT,CAAC;IACJ,CAAC;IAEO,mBAAmB;QACzB,oCAAoC;QACpC,2CAA2C;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,IAAc;QAC5C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACpD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAElC,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"config-registry.js","sourceRoot":"","sources":["../../src/registry/config-registry.ts"],"names":[],"mappings":"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"}
@@ -11,20 +11,19 @@ export interface RadioConfigMetadata {
11
11
  license?: string;
12
12
  }
13
13
  /**
14
- * Radio capabilities
14
+ * Radio capabilities (matches radio-module JSON configs)
15
15
  */
16
16
  export interface RadioCapabilities {
17
- dslProtocols: boolean;
18
- customCodecs: boolean;
19
17
  memoryRead: boolean;
20
18
  memoryWrite: boolean;
21
- sharedComponents: boolean;
19
+ channelProgramming: boolean;
20
+ settingsProgramming: boolean;
22
21
  }
23
22
  /**
24
23
  * Codec configuration
25
24
  */
26
25
  export interface CodecConfig {
27
- type: 'shared' | 'inline';
26
+ type: 'shared' | 'inline' | 'memoryMap';
28
27
  reference?: string;
29
28
  config?: Record<string, unknown>;
30
29
  }
@@ -37,4 +36,21 @@ export interface RegistryRadio extends Radio {
37
36
  codec?: CodecConfig;
38
37
  metadata: RadioConfigMetadata;
39
38
  }
39
+ /**
40
+ * Source of a catalogued radio configuration
41
+ */
42
+ export type RadioCatalogSource = 'bundled' | 'user';
43
+ /**
44
+ * Lightweight catalog metadata for listing radios (e.g. import dialog)
45
+ */
46
+ export interface RadioCatalogEntry {
47
+ modelId: string;
48
+ name: string;
49
+ manufacturer: string;
50
+ version: string;
51
+ description: string;
52
+ capabilities: RadioCapabilities;
53
+ source: RadioCatalogSource;
54
+ contentHash: string;
55
+ }
40
56
  //# sourceMappingURL=radio-config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"radio-config.d.ts","sourceRoot":"","sources":["../../src/types/radio-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,KAAK;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,iBAAiB,CAAC;IAChC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,mBAAmB,CAAC;CAC/B"}
1
+ {"version":3,"file":"radio-config.d.ts","sourceRoot":"","sources":["../../src/types/radio-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,KAAK;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,iBAAiB,CAAC;IAChC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,mBAAmB,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,MAAM,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,iBAAiB,CAAC;IAChC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;CACrB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@springfield/ham-radio-registry",
3
- "version": "1.0.16",
3
+ "version": "1.2.0",
4
4
  "author": "Bryan Hunt",
5
5
  "license": "MIT",
6
6
  "readme": "README.md",
@@ -11,6 +11,17 @@
11
11
  "type": "module",
12
12
  "main": "dist/index.js",
13
13
  "types": "dist/index.d.ts",
14
+ "exports": {
15
+ ".": {
16
+ "import": "./dist/index.js",
17
+ "types": "./dist/index.d.ts"
18
+ },
19
+ "./node": {
20
+ "import": "./dist/node.js",
21
+ "types": "./dist/node.d.ts"
22
+ },
23
+ "./package.json": "./package.json"
24
+ },
14
25
  "repository": {
15
26
  "type": "git",
16
27
  "url": "git+https://github.com/springfield-ham-radio/ham-radio-registry.git"
@@ -32,6 +43,7 @@
32
43
  },
33
44
  "dependencies": {
34
45
  "@springfield/ham-radio-api": "^17.3.0",
46
+ "@springfield/ham-radio-utils": "^4.6.0",
35
47
  "loglayer": "^9.4.0"
36
48
  },
37
49
  "devDependencies": {
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Stable FNV-1a 32-bit hash of a string (browser- and Node-safe, sync).
3
+ */
4
+ export function computeContentHash(value: string): string {
5
+ let hash = 0x811c9dc5;
6
+
7
+ for (let index = 0; index < value.length; index += 1) {
8
+ hash ^= value.charCodeAt(index);
9
+ hash = Math.imul(hash, 0x01000193);
10
+ }
11
+
12
+ return (hash >>> 0).toString(16).padStart(8, '0');
13
+ }
14
+
15
+ /**
16
+ * Hash a resolved radio config for catalog change detection.
17
+ */
18
+ export function hashRadioConfig(config: unknown): string {
19
+ return computeContentHash(JSON.stringify(config));
20
+ }
@@ -0,0 +1,36 @@
1
+ import type { RadioCatalogEntry, RadioCatalogSource, RadioCapabilities, RegistryRadio } from '../types/radio-config.js';
2
+ import { hashRadioConfig } from './content-hash.js';
3
+
4
+ const DEFAULT_CAPABILITIES: RadioCapabilities = {
5
+ memoryRead: false,
6
+ memoryWrite: false,
7
+ channelProgramming: false,
8
+ settingsProgramming: false,
9
+ };
10
+
11
+ /**
12
+ * Extract lightweight catalog metadata from a hydrated radio config.
13
+ */
14
+ export function extractCatalogMetadata(
15
+ radio: RegistryRadio,
16
+ source: RadioCatalogSource = 'user',
17
+ contentHash?: string,
18
+ ): RadioCatalogEntry {
19
+ const capabilities: RadioCapabilities = {
20
+ memoryRead: radio.capabilities?.memoryRead ?? DEFAULT_CAPABILITIES.memoryRead,
21
+ memoryWrite: radio.capabilities?.memoryWrite ?? DEFAULT_CAPABILITIES.memoryWrite,
22
+ channelProgramming: radio.capabilities?.channelProgramming ?? DEFAULT_CAPABILITIES.channelProgramming,
23
+ settingsProgramming: radio.capabilities?.settingsProgramming ?? DEFAULT_CAPABILITIES.settingsProgramming,
24
+ };
25
+
26
+ return {
27
+ modelId: radio.id.model,
28
+ name: radio.id.name,
29
+ manufacturer: radio.id.manufacturer,
30
+ version: radio.version,
31
+ description: radio.description,
32
+ capabilities,
33
+ source,
34
+ contentHash: contentHash ?? hashRadioConfig(radio),
35
+ };
36
+ }
@@ -0,0 +1,72 @@
1
+ import type { RadioConfigMetadata, RegistryRadio } from '../types/radio-config.js';
2
+
3
+ interface RefObject {
4
+ $ref: string;
5
+ }
6
+
7
+ function isRefObject(value: unknown): value is RefObject {
8
+ return typeof value === 'object' && value !== null && '$ref' in value && typeof (value as RefObject).$ref === 'string';
9
+ }
10
+
11
+ function resolveRef(ref: string, documentsByRef: Record<string, unknown>): unknown {
12
+ if (!(ref in documentsByRef)) {
13
+ throw new Error(`Missing document for $ref: ${ref}`);
14
+ }
15
+
16
+ return structuredClone(documentsByRef[ref]);
17
+ }
18
+
19
+ function resolveValue(value: unknown, documentsByRef: Record<string, unknown>): unknown {
20
+ if (isRefObject(value)) {
21
+ return resolveRef(value.$ref, documentsByRef);
22
+ }
23
+
24
+ if (Array.isArray(value)) {
25
+ return value.map((item) => resolveValue(item, documentsByRef));
26
+ }
27
+
28
+ if (typeof value === 'object' && value !== null) {
29
+ const result: Record<string, unknown> = {};
30
+
31
+ for (const [key, nested] of Object.entries(value)) {
32
+ result[key] = resolveValue(nested, documentsByRef);
33
+ }
34
+
35
+ return result;
36
+ }
37
+
38
+ return value;
39
+ }
40
+
41
+ function normalizeMetadata(raw: unknown): RadioConfigMetadata {
42
+ const metadata = (typeof raw === 'object' && raw !== null ? raw : {}) as Partial<RadioConfigMetadata> & Record<string, unknown>;
43
+
44
+ return {
45
+ moduleId: typeof metadata.moduleId === 'string' ? metadata.moduleId : '',
46
+ moduleVersion: typeof metadata.moduleVersion === 'string' ? metadata.moduleVersion : '',
47
+ pluginPath: typeof metadata.pluginPath === 'string' ? metadata.pluginPath : '',
48
+ ...(typeof metadata.lastUpdated === 'string' ? { lastUpdated: metadata.lastUpdated } : {}),
49
+ ...(typeof metadata.author === 'string' ? { author: metadata.author } : {}),
50
+ ...(typeof metadata.license === 'string' ? { license: metadata.license } : {}),
51
+ };
52
+ }
53
+
54
+ /**
55
+ * Parse radio config JSON (or object) and inline `$ref` documents from `documentsByRef`.
56
+ * Keys in `documentsByRef` must match `$ref` strings exactly as they appear in the config.
57
+ */
58
+ export function hydrateRadioConfig(
59
+ json: string | Record<string, unknown>,
60
+ documentsByRef: Record<string, unknown> = {},
61
+ ): RegistryRadio {
62
+ const parsed: unknown = typeof json === 'string' ? JSON.parse(json) : structuredClone(json);
63
+
64
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
65
+ throw new Error('Radio configuration must be a JSON object');
66
+ }
67
+
68
+ const resolved = resolveValue(parsed, documentsByRef) as Record<string, unknown>;
69
+ resolved.metadata = normalizeMetadata(resolved.metadata);
70
+
71
+ return resolved as unknown as RegistryRadio;
72
+ }
@@ -0,0 +1,4 @@
1
+ export { hydrateRadioConfig } from './hydrate-radio-config.js';
2
+ export { extractCatalogMetadata } from './extract-catalog-metadata.js';
3
+ export { validateConfiguration } from './validate-configuration.js';
4
+ export { computeContentHash, hashRadioConfig } from './content-hash.js';
@@ -0,0 +1,40 @@
1
+ import type { ValidationResult } from '@springfield/ham-radio-api';
2
+ import type { RegistryRadio } from '../types/radio-config.js';
3
+
4
+ /**
5
+ * Validate a radio configuration for catalog ingest and registry use.
6
+ */
7
+ export function validateConfiguration(config: RegistryRadio): ValidationResult {
8
+ const errors: string[] = [];
9
+ const warnings: string[] = [];
10
+
11
+ if (!config.id?.model) {
12
+ errors.push('Configuration must have a valid model ID');
13
+ }
14
+
15
+ if (!config.serialConfig) {
16
+ errors.push('Configuration must have serial configuration');
17
+ }
18
+
19
+ if (!config.memoryConfig) {
20
+ errors.push('Configuration must have memory configuration');
21
+ }
22
+
23
+ if (!config.readMemory || config.readMemory.length === 0) {
24
+ errors.push('Configuration must have read memory protocol');
25
+ }
26
+
27
+ if (!config.writeMemory || config.writeMemory.length === 0) {
28
+ errors.push('Configuration must have write memory protocol');
29
+ }
30
+
31
+ if (!config.settingsSchema) {
32
+ errors.push('Configuration must have settings schema');
33
+ }
34
+
35
+ return {
36
+ errors,
37
+ isValid: errors.length === 0,
38
+ warnings,
39
+ };
40
+ }
package/src/index.ts CHANGED
@@ -4,6 +4,8 @@ export type {
4
4
  RadioCapabilities,
5
5
  CodecConfig,
6
6
  RegistryRadio,
7
+ RadioCatalogEntry,
8
+ RadioCatalogSource,
7
9
  } from './types/radio-config.js';
8
10
 
9
11
  // Re-export common types from ham-radio-api
@@ -20,19 +22,11 @@ export type {
20
22
  PluginSecurity,
21
23
  } from './types/plugin-module.js';
22
24
 
23
- // Registry components
24
- export type { RadioConfigRegistry } from './registry/config-registry.js';
25
- import { NpmBasedConfigRegistry, type RadioConfigRegistry } from './registry/config-registry.js';
26
-
27
- // Shared components
28
- export type { SharedComponentManager } from '@springfield/ham-radio-api';
29
- export { DefaultSharedComponentManager } from './registry/shared-components.js';
30
-
31
- // NPM client
32
- export type { NpmClient } from './utils/npm-client.js';
33
- export { DefaultNpmClient } from './utils/npm-client.js';
34
-
35
- // Factory function for creating registry instances
36
- export function createRegistry(logger: any): RadioConfigRegistry {
37
- return new NpmBasedConfigRegistry(logger);
38
- }
25
+ // Browser-safe catalog API (no node:fs)
26
+ export {
27
+ hydrateRadioConfig,
28
+ extractCatalogMetadata,
29
+ validateConfiguration,
30
+ computeContentHash,
31
+ hashRadioConfig,
32
+ } from './catalog/index.js';
package/src/node.ts ADDED
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Node.js entry — npm/fs plugin discovery. Import from `@springfield/ham-radio-registry/node`.
3
+ */
4
+
5
+ export type { RadioConfigRegistry } from './registry/config-registry.js';
6
+ export { NpmBasedConfigRegistry } from './registry/config-registry.js';
7
+
8
+ export type { SharedComponentManager } from '@springfield/ham-radio-api';
9
+ export { DefaultSharedComponentManager } from './registry/shared-components.js';
10
+
11
+ export type { NpmClient } from './utils/npm-client.js';
12
+ export { DefaultNpmClient } from './utils/npm-client.js';
13
+
14
+ import { NpmBasedConfigRegistry, type RadioConfigRegistry } from './registry/config-registry.js';
15
+ import type { ILogLayer } from 'loglayer';
16
+
17
+ /**
18
+ * Create an npm-based radio configuration registry (Node.js only).
19
+ */
20
+ export function createRegistry(logger: ILogLayer): RadioConfigRegistry {
21
+ return new NpmBasedConfigRegistry(logger);
22
+ }
23
+
24
+ // Re-export browser-safe catalog API for convenience
25
+ export * from './index.js';
@@ -1,10 +1,12 @@
1
1
  import { DefaultNpmClient, type NpmClient } from '../utils/npm-client.js';
2
- import type { RadioCodec, RadioModelId, SharedComponentManager, ValidationResult } from '@springfield/ham-radio-api';
2
+ import type { RadioCodec, RadioMemoryMap, RadioModelId, SharedComponentManager, ValidationResult } from '@springfield/ham-radio-api';
3
+ import { createMemoryMapCodec } from '@springfield/ham-radio-utils';
3
4
  import { readFile, readdir } from 'node:fs/promises';
4
5
  import { DefaultSharedComponentManager } from './shared-components.js';
5
6
  import type { ILogLayer } from 'loglayer';
6
7
  import type { PluginModule } from '../types/plugin-module.js';
7
8
  import type { RegistryRadio } from '../types/radio-config.js';
9
+ import { validateConfiguration as validateRadioConfiguration } from '../catalog/validate-configuration.js';
8
10
  import { existsSync } from 'node:fs';
9
11
  import { join } from 'node:path';
10
12
 
@@ -116,40 +118,7 @@ export class NpmBasedConfigRegistry implements RadioConfigRegistry {
116
118
  }
117
119
 
118
120
  validateConfiguration(config: RegistryRadio): ValidationResult {
119
- const errors: string[] = [];
120
- const warnings: string[] = [];
121
-
122
- // Basic validation
123
- if (!config.id?.model) {
124
- errors.push('Configuration must have a valid model ID');
125
- }
126
-
127
- if (!config.serialConfig) {
128
- errors.push('Configuration must have serial configuration');
129
- }
130
-
131
- if (!config.memoryConfig) {
132
- errors.push('Configuration must have memory configuration');
133
- }
134
-
135
- if (!config.readMemory || config.readMemory.length === 0) {
136
- errors.push('Configuration must have read memory protocol');
137
- }
138
-
139
- if (!config.writeMemory || config.writeMemory.length === 0) {
140
- errors.push('Configuration must have write memory protocol');
141
- }
142
-
143
- // Schema validation
144
- if (!config.settingsSchema) {
145
- errors.push('Configuration must have settings schema');
146
- }
147
-
148
- return {
149
- errors,
150
- isValid: errors.length === 0,
151
- warnings,
152
- };
121
+ return validateRadioConfiguration(config);
153
122
  }
154
123
 
155
124
  async registerConfiguration(config: RegistryRadio): Promise<void> {
@@ -190,7 +159,7 @@ export class NpmBasedConfigRegistry implements RadioConfigRegistry {
190
159
 
191
160
  // Find configuration for this model
192
161
  const config = await this.getConfiguration(modelId);
193
- if (!config || !config.codec) {
162
+ if (!config) {
194
163
  return undefined;
195
164
  }
196
165
 
@@ -373,9 +342,29 @@ export class NpmBasedConfigRegistry implements RadioConfigRegistry {
373
342
  const schemaPath = this.sharedComponentManager.resolveReference(config.settingsSchema.channelSchema.$ref as string, plugin.configPath);
374
343
  config.settingsSchema.channelSchema = await this.sharedComponentManager.loadSchema(schemaPath);
375
344
  }
345
+
346
+ if (config.memoryMap && typeof config.memoryMap === 'object' && '$ref' in config.memoryMap) {
347
+ const memoryMapPath = this.sharedComponentManager.resolveReference(config.memoryMap.$ref as string, plugin.configPath);
348
+ config.memoryMap = (await this.sharedComponentManager.loadSchema(memoryMapPath)) as unknown as RadioMemoryMap;
349
+ }
376
350
  }
377
351
 
378
352
  private async loadCodecFromConfig(config: RegistryRadio): Promise<RadioCodec | undefined> {
353
+ const memoryMap = config.memoryMap;
354
+ const usesMemoryMap =
355
+ !config.codec ||
356
+ config.codec.type === 'memoryMap' ||
357
+ (config.codec.type !== 'shared' && memoryMap !== undefined && !('$ref' in (memoryMap as object)));
358
+
359
+ if (usesMemoryMap && memoryMap && typeof memoryMap === 'object' && !('$ref' in memoryMap)) {
360
+ return createMemoryMapCodec({
361
+ radioModel: config.id.model,
362
+ memoryMap,
363
+ memoryConfig: config.memoryConfig,
364
+ logger: this.logger,
365
+ });
366
+ }
367
+
379
368
  if (!config.codec || config.codec.type !== 'shared' || !config.codec.reference) {
380
369
  return undefined;
381
370
  }
@@ -13,21 +13,20 @@ export interface RadioConfigMetadata {
13
13
  }
14
14
 
15
15
  /**
16
- * Radio capabilities
16
+ * Radio capabilities (matches radio-module JSON configs)
17
17
  */
18
18
  export interface RadioCapabilities {
19
- dslProtocols: boolean;
20
- customCodecs: boolean;
21
19
  memoryRead: boolean;
22
20
  memoryWrite: boolean;
23
- sharedComponents: boolean;
21
+ channelProgramming: boolean;
22
+ settingsProgramming: boolean;
24
23
  }
25
24
 
26
25
  /**
27
26
  * Codec configuration
28
27
  */
29
28
  export interface CodecConfig {
30
- type: 'shared' | 'inline';
29
+ type: 'shared' | 'inline' | 'memoryMap';
31
30
  reference?: string;
32
31
  config?: Record<string, unknown>;
33
32
  }
@@ -41,3 +40,22 @@ export interface RegistryRadio extends Radio {
41
40
  codec?: CodecConfig;
42
41
  metadata: RadioConfigMetadata;
43
42
  }
43
+
44
+ /**
45
+ * Source of a catalogued radio configuration
46
+ */
47
+ export type RadioCatalogSource = 'bundled' | 'user';
48
+
49
+ /**
50
+ * Lightweight catalog metadata for listing radios (e.g. import dialog)
51
+ */
52
+ export interface RadioCatalogEntry {
53
+ modelId: string;
54
+ name: string;
55
+ manufacturer: string;
56
+ version: string;
57
+ description: string;
58
+ capabilities: RadioCapabilities;
59
+ source: RadioCatalogSource;
60
+ contentHash: string;
61
+ }