Skip to content

TSArchi is a TypeScript-based utility for parsing .archimate files and manipulating the contained ArchiMate models.

License

Notifications You must be signed in to change notification settings

localgod/tsarchi

Repository files navigation

TSArchi

TSArchi is a TypeScript-based utility for parsing .archimate files and manipulating the contained ArchiMate models. The project enables reading, editing, and saving enterprise architecture models compliant with the ArchiMate standard.

Introduction

TSArchi provides a TypeScript-based tool for parsing, modifying, and saving .archimate files. ArchiMate is an open, independent modeling language for enterprise architecture, and TSArchi allows you to work with these models programmatically.

Features

  • Parsing: Reads .archimate files and converts them into a TypeScript object model.
  • Model Manipulation: Add, modify, and remove elements and relationships in the parsed model.
  • Model Serialization: Save the modified model back into an .archimate file.
  • Type Safety: Enforces strong TypeScript types for all operations on the model.
  • Error Resilience: Graceful handling of invalid XML, missing data, and malformed files.
  • Element Upsert: Smart insert/update operations that preserve existing IDs while updating properties.
  • Comprehensive Element Support: Full support for all ArchiMate 3.x element types and relationships.
  • Advanced View Management: Create, update, and manage ArchiMate diagrams with visual positioning and styling.
  • Auto-layout Capabilities: Generate views automatically with grid, circular, or hierarchical layouts.

Getting Started

Prerequisites

Ensure you have the following installed:

Installation

  1. Clone the repository:

    git clone https://github.com/localgod/tsarchi.git
    cd tsarchi
  2. Install the dependencies:

    npm install

Building the Project

Before running the project, you need to compile the TypeScript files:

npm run build

This will compile the TypeScript source files into the dist/ folder.

Usage

Running Examples

TSArchi includes example scripts that demonstrate how to use the library:

  • --input <path>: The path to the input .archimate file you wish to parse and manipulate.
  • --output <path>: The path where the modified model will be saved as a .archimate file.

Example Commands

Running the sample example directly:

node ./dist/examples/sample01.mjs --input ./models/example.archimate --output ./models/output.archimate

Or using npm script:

npm run example

The example script will:

  1. Parse the model in the input file.
  2. Add a new Application Component (if it doesn't already exist).
  3. Save the modified model to the output file.

Creating Your Own Examples

You can create additional examples in the examples/ folder. Each example should:

  • Import TSArchi from ../src/TsArchi.mjs
  • Use native Node.js argument parsing (no external dependencies)
  • Follow the naming pattern sampleXX.mts

Parsing an ArchiMate File Programmatically

You can use TSArchi programmatically in your TypeScript/JavaScript projects:

import { TsArchi } from 'tsarchi';

const tsArchi = new TsArchi();

// Load and parse an ArchiMate file
const model = await tsArchi.loadModel('./path/to/model.archimate');

// Add a new element
const newElement = {
  id: model.generateRandomId(),
  type: 'ApplicationComponent',
  name: 'My New Component',
  properties: new Map([['version', '2.0']])
};

model.upsertElement(newElement);

// Save the modified model
await tsArchi.saveModel('./path/to/output.archimate');

Available Element Types

TSArchi supports all standard ArchiMate element types organized by layers:

  • Strategy Layer: Capability, CourseOfAction, Resource, ValueStream, etc.
  • Business Layer: BusinessActor, BusinessRole, BusinessProcess, BusinessService, etc.
  • Application Layer: ApplicationComponent, ApplicationService, DataObject, etc.
  • Technology Layer: Node, Device, SystemSoftware, TechnologyService, etc.
  • Motivation Layer: Stakeholder, Driver, Goal, Requirement, etc.
  • Implementation & Migration: WorkPackage, Deliverable, ImplementationEvent, etc.

View Management

TSArchi provides comprehensive view management capabilities for creating and manipulating ArchiMate diagrams:

import { TsArchi } from 'tsarchi';

const tsArchi = new TsArchi();
const model = await tsArchi.loadModel('./model.archimate');

// Create a new view
const view = model.createView('Application Overview', {
  viewpoint: 'application',
  documentation: 'Overview of application components'
});

// Add elements to the view with positioning
const bounds1 = { x: 100, y: 100, width: 120, height: 55 };
const bounds2 = { x: 300, y: 100, width: 120, height: 55 };

const obj1 = model.addDiagramObject(view.id, 'app-component-1-id', bounds1, {
  fillColor: '#c9e7b7',
  textAlignment: 1
});

const obj2 = model.addDiagramObject(view.id, 'app-component-2-id', bounds2, {
  fillColor: '#ffd93d'
});

// Create connections between elements
model.addConnection(view.id, obj1.id, obj2.id, 'relationship-id', {
  lineColor: '#0066cc',
  lineWidth: 2
});

// Create groups to organize elements
const groupBounds = { x: 50, y: 50, width: 400, height: 150 };
const group = model.addGroup(view.id, 'Application Layer', groupBounds, {
  fillColor: '#e6f3ff',
  documentation: 'Application layer components'
});

// Add elements to groups
model.addDiagramObjectToGroup(view.id, group.id, 'another-element-id', 
  { x: 20, y: 20, width: 120, height: 55 });

Auto-generating Views

Create views automatically from existing model elements:

// Generate view from specific elements
const elementIds = ['comp-1', 'comp-2', 'comp-3'];
const generatedView = model.generateViewFromElements('Generated View', elementIds, {
  layoutType: 'grid',
  includeRelationships: true,
  viewpoint: 'application'
});

// Create view from all elements of a specific type
const appView = model.createViewByElementType('Application Components', 'ApplicationComponent', {
  layoutType: 'circular',
  includeRelationships: true
});

// Create view from all elements in a folder
const businessView = model.createViewByFolder('Business Overview', 'business', {
  layoutType: 'hierarchical'
});

View Management Operations

// List all views
const allViews = model.listViews();
console.log(`Found ${allViews.length} views`);

// Get specific view
const view = model.getView('view-id');

// Update diagram object styling
model.updateDiagramObjectStyle('view-id', 'object-id', {
  fillColor: '#ff6b6b',
  bounds: { x: 150, y: 150, width: 140, height: 65 },
  textAlignment: 2
});

// Delete a view
model.deleteView('view-id');

Error Handling

TSArchi includes robust error handling:

  • Invalid XML files return empty objects instead of throwing errors
  • Missing or malformed bounds data defaults to zero values
  • Duplicate elements are handled gracefully with upsert operations
  • View operations validate element and relationship existence

Contributing

We welcome contributions! Please follow these steps to contribute to the project:

  1. Fork the repository.
  2. Create a feature branch (git checkout -b feature/my-feature).
  3. Commit your changes (git commit -am 'Add my feature').
  4. Push to the branch (git push origin feature/my-feature).
  5. Create a pull request.

License

This project is licensed under the MIT License. See the LICENSE file for details.

About

TSArchi is a TypeScript-based utility for parsing .archimate files and manipulating the contained ArchiMate models.

Topics

Resources

License

Stars

Watchers

Forks

Contributors 4

  •  
  •  
  •  
  •