All files / core/blong-browser/src/viewers resolveViewer.ts

100% Statements 11/11
80% Branches 8/10
100% Functions 2/2
100% Lines 9/9

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58                                                                                        3x 1x 1x   2x 1x 1x 1x 1x     1x    
/**
 * resolveViewer — resolve the viewer for a commander leaf node.
 *
 * Priority:
 *  1. explicit `viewer` type on the descriptor level (registered viewers)
 *  2. model-system recognition — if the node maps to a registered
 *     `{subject}.{object}` model, the model-generated browse page component key
 *     is returned (the caller opens it as a portal tab) — see `resolveViewer`
 *  3. generic `json` fallback
 */
import {getViewer} from './registry.js';
import type {CommanderViewer} from './registry.js';
 
export interface ICommanderModelRef {
    subject: string;
    object: string;
}
 
/** Leaf meta carried by the source descriptor level. */
export interface ICommanderLeafMeta {
    /** Explicit viewer type (registered in the viewer registry). */
    viewer?: string;
    /** Model-system reference for recognition of `{subject}.{object}` resources. */
    model?: ICommanderModelRef;
}
 
export interface IResolvedViewer {
    /** A registered viewer component (for direct mount). */
    component?: CommanderViewer;
    /** A portal page-action component key (e.g. `component/party.person.browse`). */
    page?: string;
    /** Resolved type key ('model' when the model system owns it). */
    type: string;
}
 
/**
 * Resolve the viewer for a leaf node.
 * `models` should be the list of `{subject, object}` pairs declared by the
 * model system (e.g. from `subject.model.list` / the model aggregator).
 */
export function resolveViewer(
    meta: ICommanderLeafMeta | undefined,
    models?: ICommanderModelRef[],
): IResolvedViewer {
    if (meta?.viewer) {
        const component = getViewer(meta.viewer);
        Eif (component) return {component, type: meta.viewer};
    }
    if (meta?.model) {
        const {subject, object} = meta.model;
        const recognized = models?.some(m => m.subject === subject && m.object === object);
        Eif (recognized) {
            return {page: `component/${subject}.${object}.browse`, type: 'model'};
        }
    }
    return {component: getViewer('json'), type: 'json'};
}