Skip to content

[M10/LNS-003] Implement lens composition engine #232

@flyingrobots

Description

@flyingrobots

LNS-003: Lens Composition Engine

Parent: #227 (M10 LENS)

What

Implement composeLenses() in src/lens.js and wire into renderView() in src/views.js via options.lenses parameter.

  • composeLenses(lensNames) → returns a single function that chains lenses left-to-right
  • renderView(graph, viewName, options) gains options.lenses (array of lens names)
  • needsProperties propagates: if ANY lens in chain needs it, the view runs with properties

Why

Composition is what makes lenses powerful — view:lens1:lens2 applies transformations in sequence.

Acceptance Criteria

  • composeLenses(['a', 'b']) applies a then b to ViewResult
  • Unknown lens name → clear error with available lens list
  • needsProperties propagation works correctly
  • Wired into renderView() — passing lenses: ['incomplete'] works
  • Empty lenses array = no-op (identity)
  • Tests for composition order, error cases, needsProperties propagation

Dependencies

  • LNS-002 (lens registry must exist)

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestmilestone:M10M10 LENS — Composable View Projectionswave:1Wave 1 — Foundation (lenses + context + contracts)

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions