This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
This project provides add-ons for bpmn-visualization. It extends the base BpmnVisualization class to support a plugin system and provides utility functions for working with BPMN elements.
This is an npm workspaces monorepo with 3 packages:
packages/addons: The main library package (@process-analytics/bpmn-visualization-addons)packages/demo: Demo application using Vite, showcasing the addons functionalitypackages/check-ts-support: TypeScript support validation utilities
npm install- Install all dependencies for all workspacesnpm run dev:demo- Develop the library and demo simultaneously with live updates (demo at http://localhost:5173/)npm run dev -w packages/addons- Build the addons library in watch modenpm run dev -w packages/demo- Run the demo in development mode
npm run build -w packages/addons- Build the addons library (outputs topackages/addons/lib/)npm run build -w packages/demo- Build the demo application
npm test -w packages/addons- Run all testsnpm test -w packages/addons -- <test-file-path>- Run a specific test filenpm run test-check -w packages/addons- Type-check test files without running them
npm run lint- Lint and auto-fix all filesnpm run lint-check- Lint check without fixing
npm run clean -w packages/addons- Remove thelib/directory
The central architectural concept is the plugin system. This package extends the BpmnVisualization class from bpmn-visualization to support plugins:
-
Base Extension:
packages/addons/src/plugins-support.tsdefines:BpmnVisualizationclass that extends the baseBpmnVisualizationfrombpmn-visualizationPlugininterface that all plugins must implementPluginConstructortype for plugin constructor signaturesGlobalOptionstype that extends base options with plugin support
-
Plugin Lifecycle:
- Plugins are passed to
BpmnVisualizationconstructor viaoptions.pluginsarray - Each plugin is constructed with
(bpmnVisualization, options)parameters - Plugins must implement
getPluginId()to return a unique identifier - Plugins can optionally implement
configure(options)for post-construction setup - Retrieve plugins using
bpmnVisualization.getPlugin<PluginType>(pluginId)
- Plugins are passed to
-
Available Plugins (in
packages/addons/src/plugins/):CssClassesPlugin: Manipulate CSS classes on BPMN elementsElementsPlugin: RetrieveBpmnElementandBpmnSemanticobjectsOverlaysPlugin: Manage overlays on BPMN elements (enhanced with show/hide)StylePlugin: Manipulate styles of BPMN elementsStyleByNamePlugin: Style manipulation by element name (not just ID)
Located in packages/addons/src/:
bpmn-elements.ts:BpmnElementsSearcher(find elements by name) andBpmnElementsIdentifier(identify BPMN element types)paths.ts:PathResolverandCasePathResolverfor inferring BPMN paths from completed/pending elements
Tests use Jest with jsdom environment:
- Test files:
packages/addons/test/spec/**/*.test.ts - Test fixtures:
packages/addons/test/fixtures/ - Shared test utilities:
packages/addons/test/shared/ - Configuration:
packages/addons/jest.config.js - Uses
@swc/jestfor fast TypeScript transformation
- All packages use
"type": "module"in package.json - Import statements must include
.jsextension even for.tsfiles (e.g.,import { foo } from './bar.js') - Jest configuration includes moduleNameMapper to handle this
- Target: ES2017
- Module: ES2015
- Strict mode enabled
- Declaration files generated in
lib/alongside compiled JS stripInternal: true- JSDoc@internalitems not in declarations
The addons package has bpmn-visualization as a peer dependency. This means:
- Users must install both
bpmn-visualizationand@process-analytics/bpmn-visualization-addons - Import
BpmnVisualizationfrom addons to use plugins, NOT frombpmn-visualizationdirectly - The compatible version range is defined in
packages/addons/package.jsonpeerDependencies
When modifying code:
- Maintain ES module import syntax with
.jsextensions - All new plugins must implement the
Plugininterface fromplugins-support.ts - Plugin IDs must be unique across all registered plugins
- Test files should be placed in
test/spec/mirroring thesrc/structure - Use descriptive variable names and comment only complex code