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.
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.
- Parsing: Reads
.archimatefiles 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
.archimatefile. - 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.
Ensure you have the following installed:
-
Clone the repository:
git clone https://github.com/localgod/tsarchi.git cd tsarchi -
Install the dependencies:
npm install
Before running the project, you need to compile the TypeScript files:
npm run buildThis will compile the TypeScript source files into the dist/ folder.
TSArchi includes example scripts that demonstrate how to use the library:
--input <path>: The path to the input.archimatefile you wish to parse and manipulate.--output <path>: The path where the modified model will be saved as a.archimatefile.
Running the sample example directly:
node ./dist/examples/sample01.mjs --input ./models/example.archimate --output ./models/output.archimateOr using npm script:
npm run exampleThe example script will:
- Parse the model in the input file.
- Add a new Application Component (if it doesn't already exist).
- Save the modified model to the output file.
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
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");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.
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,
});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",
});// 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");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
We welcome contributions! Please follow these steps to contribute to the project:
- Fork the repository.
- Create a feature branch (
git checkout -b feature/my-feature). - Commit your changes (
git commit -am 'Add my feature'). - Push to the branch (
git push origin feature/my-feature). - Create a pull request.
This project is licensed under the MIT License. See the LICENSE file for details.