@ts-graphviz/common 2.1.5 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,192 @@
1
1
  # @ts-graphviz/common
2
2
 
3
+ ## 3.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - [#1363](https://github.com/ts-graphviz/ts-graphviz/pull/1363) [`9328563`](https://github.com/ts-graphviz/ts-graphviz/commit/932856396ed0dede1dfc6737344a628f9667d07c) Thanks [@kamiazya](https://github.com/kamiazya)! - 🚨 Breaking Changes: Drop Node.js 18 support
8
+
9
+ Minimum required version is now Node.js 20+
10
+
11
+ ### ESM-Only Distribution
12
+
13
+ - **Remove CommonJS builds**: All packages now distribute only ESM (ECMAScript Modules)
14
+ - **Package exports**: Removed `require` fields from `package.json` exports
15
+ - **Module type**: All packages are now `"type": "module"`
16
+
17
+ ## 🔄 Migration Guide
18
+
19
+ ### For ESM Projects (Recommended)
20
+
21
+ ```json
22
+ {
23
+ "type": "module"
24
+ }
25
+ ```
26
+
27
+ ```typescript
28
+ // Import syntax remains unchanged
29
+ import { Digraph, Node, Edge, toDot } from "ts-graphviz";
30
+ import { toFile } from "ts-graphviz/adapter";
31
+ import { parse } from "ts-graphviz/ast";
32
+ ```
33
+
34
+ ### For CommonJS Projects
35
+
36
+ If you are using CommonJS (CJS) and need to migrate to ESM, you will need to update your project to support dynamic imports. This is necessary because the packages no longer provide CommonJS builds.
37
+
38
+ ### Before (CJS)
39
+
40
+ ```javascript
41
+ // JavaScript (CommonJS)
42
+ function createGraph() {
43
+ // Dynamic import is required because the packages no longer provide CommonJS builds.
44
+ const { Digraph, Node, Edge, toDot } = require("ts-graphviz");
45
+ const graph = new Digraph();
46
+ return toDot(graph);
47
+ }
48
+ ```
49
+
50
+ ### After (ESM)
51
+
52
+ ```javascript
53
+ async function createGraph() {
54
+ const { Digraph, Node, Edge, toDot } = await import("ts-graphviz");
55
+
56
+ const graph = new Digraph();
57
+ // Create your graph...
58
+ return toDot(graph);
59
+ }
60
+ ```
61
+
62
+ ```typescript
63
+ // TypeScript (CommonJS)
64
+ // Update tsconfig.json
65
+ {
66
+ "compilerOptions": {
67
+ "module": "Node16",
68
+ "moduleResolution": "Node16"
69
+ }
70
+ }
71
+
72
+ // Use dynamic imports
73
+ async function createGraph() {
74
+ const tsGraphviz = await import('ts-graphviz');
75
+ const { Digraph, Node, Edge, toDot } = tsGraphviz;
76
+
77
+ const graph = new Digraph();
78
+ // Create your graph...
79
+ return toDot(graph);
80
+ }
81
+ ```
82
+
83
+ ## 🎯 Benefits
84
+
85
+ - **Modern JavaScript**: Leveraging native ES modules for better performance
86
+ - **Smaller bundle sizes**: ESM enables better tree-shaking
87
+ - **Future-proof**: Aligning with the JavaScript ecosystem direction
88
+ - **Better TypeScript support**: Enhanced module resolution
89
+
90
+ ### Minor Changes
91
+
92
+ - [#1363](https://github.com/ts-graphviz/ts-graphviz/pull/1363) [`9328563`](https://github.com/ts-graphviz/ts-graphviz/commit/932856396ed0dede1dfc6737344a628f9667d07c) Thanks [@kamiazya](https://github.com/kamiazya)! - Define Supported environment and Support levels
93
+
94
+ To provide clarity on the environments in which ts-graphviz operates, we have categorized support levels:
95
+
96
+ ## Support Levels
97
+
98
+ ### Tier 1: Full Support
99
+
100
+ - **Definition**: Environments that are fully supported, with comprehensive automated testing and maintenance.
101
+ - **Environments**:
102
+ - **Node.js LTS versions**: All active Long-Term Support (LTS) versions.
103
+ - If a Node.js LTS version is released, we will ensure compatibility with it.
104
+ - If a Node.js LTS version is deprecated, we will drop support for it in the next major release.
105
+ - **Details**:
106
+ - We run automated tests on all LTS versions of Node.js.
107
+ - Full compatibility and performance are ensured.
108
+ - Critical issues are prioritized for fixes.
109
+
110
+ ### Tier 2: Active Support
111
+
112
+ - **Definition**: Environments that receive active support with limited automated testing.
113
+ - **Environments**:
114
+ - **Deno Latest LTS version**: The latest Long-Term Support (LTS) version of Deno.
115
+ - If a new Deno LTS version is released, we will ensure compatibility with it.
116
+ - If a Deno LTS version is deprecated, we will drop support for it in the next minor release.
117
+ - **Node.js Current Release**: The latest Node.js release outside the LTS schedule.
118
+ - If a new Node.js current release is available, we will ensure compatibility with it.
119
+ - If a Node.js current release is deprecated, we will drop support for it in the next minor release.
120
+ - **Details**:
121
+ - Compatibility is maintained, and issues are addressed.
122
+
123
+ ### Tier 3: Community Support
124
+
125
+ - **Definition**: Environments that are not officially tested but are supported on a best-effort basis.
126
+ - **Environments**:
127
+ - **Modern Browsers**: Latest versions of major browsers, including:
128
+ - Google Chrome
129
+ - Mozilla Firefox
130
+ - Microsoft Edge
131
+ - Apple Safari
132
+ - **Deno Current Release**: The latest Deno release outside the LTS schedule.
133
+ - **Details**:
134
+ - Installation methods are provided.
135
+ - No automated testing is performed.
136
+ - Issues reported by users will be addressed.
137
+ - Targeting the latest versions ensures compatibility with modern web standards.
138
+ - We will not actively test or maintain compatibility with older versions of browsers.
139
+
140
+ - [#1363](https://github.com/ts-graphviz/ts-graphviz/pull/1363) [`9328563`](https://github.com/ts-graphviz/ts-graphviz/commit/932856396ed0dede1dfc6737344a628f9667d07c) Thanks [@kamiazya](https://github.com/kamiazya)! - Export type guard and node reference utility APIs
141
+
142
+ ## New Public APIs
143
+
144
+ ### Type Guard Functions
145
+
146
+ - **`isNodeModel(object: unknown): object is NodeModel`** - Type guard for NodeModel objects
147
+ - **`isEdgeModel(object: unknown): object is EdgeModel`** - Type guard for EdgeModel objects
148
+ - **`isSubgraphModel(object: unknown): object is SubgraphModel`** - Type guard for SubgraphModel objects
149
+ - **`isRootGraphModel(object: unknown): object is RootGraphModel`** - Type guard for RootGraphModel objects
150
+ - **`isAttributeListModel(object: unknown): object is AttributeListModel`** - Type guard for AttributeListModel objects
151
+
152
+ ### Node Reference Utilities
153
+
154
+ - **`isForwardRefNode(object: unknown): object is ForwardRefNode`** - Type guard for ForwardRefNode objects
155
+ - **`isNodeRef(node: unknown): node is NodeRef`** - Type guard for NodeRef objects (NodeModel or ForwardRefNode)
156
+ - **`isNodeRefLike(node: unknown): node is NodeRefLike`** - Type guard for NodeRefLike objects (string or NodeRef)
157
+ - **`isNodeRefGroupLike(target: NodeRefLike | NodeRefGroupLike): target is NodeRefGroupLike`** - Type guard for arrays of NodeRefLike
158
+ - **`isCompass(c: string): c is Compass`** - Type guard for valid compass directions ('n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw', 'c')
159
+
160
+ ### Conversion Utilities
161
+
162
+ - **`toNodeRef(target: NodeRefLike): NodeRef`** - Converts NodeRefLike to structured NodeRef object
163
+ - **`toNodeRefGroup(targets: NodeRefGroupLike): NodeRefGroup`** - Converts array of NodeRefLike to array of NodeRef objects
164
+
165
+ ### New Types
166
+
167
+ - **`FilterableModel`** - Union type of all model types that can be filtered using type guards
168
+
169
+ ## Features
170
+
171
+ - **Enhanced Type Safety**: All functions provide strict runtime type checking with TypeScript type narrowing
172
+ - **Comprehensive Documentation**: Full JSDoc comments with usage examples for all public APIs
173
+ - **Node Reference Parsing**: Parse complex node reference strings like `"node1:port:n"` into structured objects
174
+ - **Compass Direction Validation**: Validate and work with Graphviz compass directions
175
+
176
+ ### Patch Changes
177
+
178
+ - [#1363](https://github.com/ts-graphviz/ts-graphviz/pull/1363) [`9328563`](https://github.com/ts-graphviz/ts-graphviz/commit/932856396ed0dede1dfc6737344a628f9667d07c) Thanks [@kamiazya](https://github.com/kamiazya)! - Update Develop Environment
179
+
180
+ - Drop turbo
181
+ - Upgrade biome to 2.0
182
+ - Upgrade TypeScript to 5.8
183
+ - Upgrade Vite to 7.0
184
+ - Upgrade Vitest to 3.2
185
+ - Upgrade Peggy to 5.0 and drop ts-pegjs
186
+ - Implement new E2E test workflow
187
+
188
+ - [#1363](https://github.com/ts-graphviz/ts-graphviz/pull/1363) [`9328563`](https://github.com/ts-graphviz/ts-graphviz/commit/932856396ed0dede1dfc6737344a628f9667d07c) Thanks [@kamiazya](https://github.com/kamiazya)! - New GitHub Action main workflow and tests
189
+
3
190
  ## 2.1.5
4
191
 
5
192
  ### Patch Changes
package/LICENSE CHANGED
@@ -1,7 +1,6 @@
1
-
2
1
  The MIT License (MIT)
3
2
 
4
- Copyright (c) 2019-2024 Yuki Yamazaki
3
+ Copyright (c) 2019-2025 Yuki Yamazaki
5
4
 
6
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
7
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,24 +1,72 @@
1
+ <div align="center">
2
+
3
+ [![Main](https://github.com/ts-graphviz/ts-graphviz/actions/workflows/main.yaml/badge.svg)](https://github.com/ts-graphviz/ts-graphviz/actions/workflows/main.yaml)
4
+ [![CodeQL](https://github.com/ts-graphviz/ts-graphviz/actions/workflows/codeql-analysis.yml/badge.svg)](https://github.com/ts-graphviz/ts-graphviz/actions/workflows/codeql-analysis.yml)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/ts-graphviz/ts-graphviz/blob/main/LICENSE)
6
+ [![All Contributors](https://img.shields.io/github/all-contributors/ts-graphviz/ts-graphviz?color=orange)](#contributors-)
7
+
8
+ [![OpenSSF Best Practices](https://www.bestpractices.dev/projects/8396/badge)](https://www.bestpractices.dev/projects/8396)
9
+ [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/ts-graphviz/ts-graphviz/badge)](https://scorecard.dev/viewer/?uri=github.com/ts-graphviz/ts-graphviz)
10
+ [![Tidelift](https://tidelift.com/badges/package/npm/ts-graphviz?style=flat)](https://tidelift.com/subscription/pkg/npm-ts-graphviz?utm_source=npm-ts-graphviz&utm_medium=readme)
11
+
12
+ [![npm version](https://badge.fury.io/js/ts-graphviz.svg)](https://badge.fury.io/js/ts-graphviz)
13
+ ![node version](https://img.shields.io/node/v/ts-graphviz)
14
+ [![deno version](https://img.shields.io/badge/deno-lts-black?logo=deno)](https://github.com/denoland/deno)
15
+ [![npm](https://img.shields.io/npm/dm/ts-graphviz)](https://npmtrends.com/ts-graphviz)
16
+
1
17
  # @ts-graphviz/common
2
18
 
3
- > It is part of the ts-graphviz library, which is split into modular packages to improve maintainability, flexibility, and ease of use.
19
+ Type information, constants, and utility functions related to the DOT language attributes, attribute values, and models for ts-graphviz.
20
+
21
+ 🔗
22
+
23
+ [![GitHub](https://img.shields.io/badge/-GitHub-181717?logo=GitHub&style=flat)](https://github.com/ts-graphviz/ts-graphviz)
24
+ [![npm](https://img.shields.io/badge/-npm-CB3837?logo=npm&style=flat)](https://www.npmjs.com/package/ts-graphviz)
25
+ [![Reference](https://img.shields.io/badge/-API_Reference-3178C6?logo=TypeScript&style=flat&logoColor=fff)](https://ts-graphviz.github.io/ts-graphviz/)
26
+ [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/ts-graphviz/ts-graphviz)
4
27
 
5
- This package contains type information, constants, and utility functions related to the DOT language attributes, attribute values, and models for ts-graphviz.
28
+ [![Sponsor](https://img.shields.io/badge/-GitHub%20Sponsor-fff?logo=GitHub%20Sponsors&style=flat)](https://github.com/sponsors/ts-graphviz)
29
+ [![OpenCollective](https://img.shields.io/badge/-OpenCollective-7FADF2?logo=opencollective&style=flat&logoColor=white)](https://opencollective.com/ts-graphviz)
30
+
31
+ [![format: Biome](https://img.shields.io/badge/format%20with-Biome-F7B911?logo=biome&style=flat)](https://biomejs.dev/)
32
+ [![test: Vitest](https://img.shields.io/badge/tested%20with-Vitest-6E9F18?logo=vitest&style=flat)](https://vitest.dev/)
33
+ [![build: Vite](https://img.shields.io/badge/build%20with-Vite-646CFF?logo=vite&style=flat)](https://rollupjs.org/)
34
+
35
+ </div>
36
+
37
+ ---
38
+
39
+ > It is part of the ts-graphviz library, which is split into modular packages to improve maintainability, flexibility, and ease of use.
6
40
 
7
41
  ## Features
8
42
 
9
- - Type definitions for DOT language elements, such as attributes and attribute values
10
- - Constants representing common attribute names and values
11
- - Utility functions for working with DOT language elements
43
+ - **Type definitions** for DOT language elements, including attributes and attribute values
44
+ - **Constants** representing common attribute names and values
45
+ - **Comprehensive type guards** for runtime type checking and TypeScript type narrowing
46
+ - **Node reference utilities** for parsing and converting complex node references
47
+ - **Performance-optimized utilities** for working with large model collections
48
+ - **Seamless integration** with @ts-graphviz/react for type-safe model filtering
49
+ - **Dual-mode type handling** - runtime validation or trusted user assertions
12
50
 
13
51
  ## Usage
14
52
 
53
+ ### Basic Type Definitions
54
+
15
55
  Import the necessary types, constants, or utility functions from the `@ts-graphviz/common` package:
16
56
 
17
57
  ```ts
18
- import { NodeAttributesObject, EdgeAttributesObject } from '@ts-graphviz/common';
58
+ import {
59
+ NodeAttributesObject,
60
+ EdgeAttributesObject,
61
+ isNodeModel,
62
+ isEdgeModel,
63
+ toNodeRef
64
+ } from '@ts-graphviz/common';
19
65
  ```
20
66
 
21
- Use the imported items in your project to work with the DOT language elements:
67
+ ### Type-Safe Model Operations
68
+
69
+ The package excels at providing type safety for graph model operations:
22
70
 
23
71
 
24
72
  ```ts
@@ -33,15 +81,151 @@ const edgeAttr: EdgeAttributesObject = {
33
81
  };
34
82
  ```
35
83
 
36
- For more examples and usage details, please refer to the ts-graphviz documentation.
84
+ ### Type Guards and Model Utilities
37
85
 
86
+ The package provides powerful type guards for working with graph models with full TypeScript integration:
38
87
 
39
- ## Contributing
88
+ ```ts
89
+ import {
90
+ isNodeModel,
91
+ isEdgeModel,
92
+ isRootGraphModel,
93
+ isSubgraphModel,
94
+ isAttributeListModel
95
+ } from '@ts-graphviz/common';
96
+
97
+ // Type-safe model checking
98
+ if (isNodeModel(someModel)) {
99
+ // TypeScript knows someModel is NodeModel
100
+ console.log(someModel.id);
101
+ }
102
+
103
+ if (isEdgeModel(someModel)) {
104
+ // TypeScript knows someModel is EdgeModel
105
+ console.log(someModel.targets);
106
+ }
107
+ ```
40
108
 
41
- Contributions to the ts-graphviz project are welcome.
109
+ ### Node Reference Utilities
42
110
 
43
- Please refer to the main ts-graphviz repository for guidelines on how to contribute.
111
+ Utilities for working with node references and compass directions:
112
+
113
+ ```ts
114
+ import {
115
+ isNodeRef,
116
+ isNodeRefLike,
117
+ isCompass,
118
+ toNodeRef,
119
+ toNodeRefGroup
120
+ } from '@ts-graphviz/common';
121
+
122
+ // Check if a value is a valid node reference
123
+ if (isNodeRefLike('node1:port:n')) {
124
+ const nodeRef = toNodeRef('node1:port:n');
125
+ console.log(nodeRef); // { id: 'node1', port: 'port', compass: 'n' }
126
+ }
127
+
128
+ // Convert multiple node references
129
+ const targets = toNodeRefGroup(['node1', 'node2:port', 'node3::s']);
130
+ console.log(targets);
131
+ // [
132
+ // { id: 'node1' },
133
+ // { id: 'node2', port: 'port' },
134
+ // { id: 'node3', port: '', compass: 's' }
135
+ // ]
136
+
137
+ // Validate compass directions
138
+ if (isCompass('ne')) {
139
+ console.log('Valid compass direction');
140
+ }
141
+ ```
44
142
 
45
- ## License
143
+ ### Advanced Type Checking
144
+
145
+ The package provides additional utilities for complex type checking scenarios:
146
+
147
+ ```ts
148
+ import {
149
+ isForwardRefNode,
150
+ isNodeRefGroupLike,
151
+ isNodeRef,
152
+ isNodeRefLike,
153
+ FilterableModel
154
+ } from '@ts-graphviz/common';
155
+
156
+ // Check for forward reference nodes
157
+ const forwardRef = { id: 'futureNode' };
158
+ if (isForwardRefNode(forwardRef)) {
159
+ console.log('Valid forward reference');
160
+ }
161
+
162
+ // Validate arrays of node references
163
+ const targets = ['node1', 'node2:port'];
164
+ if (isNodeRefGroupLike(targets)) {
165
+ const nodeRefs = toNodeRefGroup(targets);
166
+ // Process validated node references
167
+ }
168
+ ```
169
+
170
+ For more examples and usage details, please refer to the ts-graphviz documentation.
46
171
 
47
- This package is released under the MIT License.
172
+ ## Contributors 👥
173
+
174
+ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
175
+
176
+ <!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
177
+ <!-- prettier-ignore-start -->
178
+ <!-- markdownlint-disable -->
179
+ <table>
180
+ <tbody>
181
+ <tr>
182
+ <td align="center" valign="top" width="14.28%"><a href="http://blog.kamiazya.tech/"><img src="https://avatars0.githubusercontent.com/u/35218186?v=4?s=100" width="100px;" alt="Yuki Yamazaki"/><br /><sub><b>Yuki Yamazaki</b></sub></a><br /><a href="https://github.com/ts-graphviz/ts-graphviz/commits?author=kamiazya" title="Code">💻</a> <a href="https://github.com/ts-graphviz/ts-graphviz/commits?author=kamiazya" title="Tests">⚠️</a> <a href="https://github.com/ts-graphviz/ts-graphviz/commits?author=kamiazya" title="Documentation">📖</a> <a href="#ideas-kamiazya" title="Ideas, Planning, & Feedback">🤔</a></td>
183
+ <td align="center" valign="top" width="14.28%"><a href="https://laysent.com"><img src="https://avatars2.githubusercontent.com/u/1191606?v=4?s=100" width="100px;" alt="LaySent"/><br /><sub><b>LaySent</b></sub></a><br /><a href="https://github.com/ts-graphviz/ts-graphviz/issues?q=author%3Alaysent" title="Bug reports">🐛</a> <a href="https://github.com/ts-graphviz/ts-graphviz/commits?author=laysent" title="Tests">⚠️</a></td>
184
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/elasticdotventures"><img src="https://avatars0.githubusercontent.com/u/35611074?v=4?s=100" width="100px;" alt="elasticdotventures"/><br /><sub><b>elasticdotventures</b></sub></a><br /><a href="https://github.com/ts-graphviz/ts-graphviz/commits?author=elasticdotventures" title="Documentation">📖</a></td>
185
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/ChristianMurphy"><img src="https://avatars.githubusercontent.com/u/3107513?v=4?s=100" width="100px;" alt="Christian Murphy"/><br /><sub><b>Christian Murphy</b></sub></a><br /><a href="https://github.com/ts-graphviz/ts-graphviz/commits?author=ChristianMurphy" title="Code">💻</a> <a href="#ideas-ChristianMurphy" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/ts-graphviz/ts-graphviz/commits?author=ChristianMurphy" title="Documentation">📖</a></td>
186
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/ArtemAdamenko"><img src="https://avatars.githubusercontent.com/u/2178516?v=4?s=100" width="100px;" alt="Artem"/><br /><sub><b>Artem</b></sub></a><br /><a href="https://github.com/ts-graphviz/ts-graphviz/issues?q=author%3AArtemAdamenko" title="Bug reports">🐛</a></td>
187
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/fredericohpandolfo"><img src="https://avatars.githubusercontent.com/u/24229136?v=4?s=100" width="100px;" alt="fredericohpandolfo"/><br /><sub><b>fredericohpandolfo</b></sub></a><br /><a href="https://github.com/ts-graphviz/ts-graphviz/issues?q=author%3Afredericohpandolfo" title="Bug reports">🐛</a></td>
188
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/diegoquinteiro"><img src="https://avatars.githubusercontent.com/u/1878108?v=4?s=100" width="100px;" alt="diegoquinteiro"/><br /><sub><b>diegoquinteiro</b></sub></a><br /><a href="https://github.com/ts-graphviz/ts-graphviz/issues?q=author%3Adiegoquinteiro" title="Bug reports">🐛</a></td>
189
+ </tr>
190
+ <tr>
191
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/robross0606"><img src="https://avatars.githubusercontent.com/u/2965467?v=4?s=100" width="100px;" alt="robross0606"/><br /><sub><b>robross0606</b></sub></a><br /><a href="#ideas-robross0606" title="Ideas, Planning, & Feedback">🤔</a></td>
192
+ <td align="center" valign="top" width="14.28%"><a href="https://blake-regalia.net"><img src="https://avatars.githubusercontent.com/u/1456400?v=4?s=100" width="100px;" alt="Blake Regalia"/><br /><sub><b>Blake Regalia</b></sub></a><br /><a href="https://github.com/ts-graphviz/ts-graphviz/issues?q=author%3Ablake-regalia" title="Bug reports">🐛</a></td>
193
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/bigbug"><img src="https://avatars.githubusercontent.com/u/27259?v=4?s=100" width="100px;" alt="bigbug"/><br /><sub><b>bigbug</b></sub></a><br /><a href="#question-bigbug" title="Answering Questions">💬</a></td>
194
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/murawakimitsuhiro"><img src="https://avatars.githubusercontent.com/u/13833242?v=4?s=100" width="100px;" alt="mrwk"/><br /><sub><b>mrwk</b></sub></a><br /><a href="#question-murawakimitsuhiro" title="Answering Questions">💬</a></td>
195
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/svdvonde"><img src="https://avatars.githubusercontent.com/u/2751783?v=4?s=100" width="100px;" alt="svdvonde"/><br /><sub><b>svdvonde</b></sub></a><br /><a href="#question-svdvonde" title="Answering Questions">💬</a></td>
196
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/seethroughdev"><img src="https://avatars.githubusercontent.com/u/203779?v=4?s=100" width="100px;" alt="Adam"/><br /><sub><b>Adam</b></sub></a><br /><a href="#question-seethroughdev" title="Answering Questions">💬</a></td>
197
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/trevor-scheer"><img src="https://avatars.githubusercontent.com/u/29644393?v=4?s=100" width="100px;" alt="Trevor Scheer"/><br /><sub><b>Trevor Scheer</b></sub></a><br /><a href="#a11y-trevor-scheer" title="Accessibility">️️️️♿️</a></td>
198
+ </tr>
199
+ <tr>
200
+ <td align="center" valign="top" width="14.28%"><a href="https://pre.ms"><img src="https://avatars.githubusercontent.com/u/238277?v=4?s=100" width="100px;" alt="Prem Pillai"/><br /><sub><b>Prem Pillai</b></sub></a><br /><a href="https://github.com/ts-graphviz/ts-graphviz/issues?q=author%3Acloud-on-prem" title="Bug reports">🐛</a></td>
201
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/nagasawaryoya"><img src="https://avatars.githubusercontent.com/u/53528726?v=4?s=100" width="100px;" alt="nagasawaryoya"/><br /><sub><b>nagasawaryoya</b></sub></a><br /><a href="https://github.com/ts-graphviz/ts-graphviz/commits?author=nagasawaryoya" title="Code">💻</a> <a href="https://github.com/ts-graphviz/ts-graphviz/commits?author=nagasawaryoya" title="Tests">⚠️</a></td>
202
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/tokidrill"><img src="https://avatars.githubusercontent.com/u/42460318?v=4?s=100" width="100px;" alt="YukiSasaki"/><br /><sub><b>YukiSasaki</b></sub></a><br /><a href="https://github.com/ts-graphviz/ts-graphviz/commits?author=tokidrill" title="Code">💻</a> <a href="https://github.com/ts-graphviz/ts-graphviz/commits?author=tokidrill" title="Tests">⚠️</a></td>
203
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/Madd0g"><img src="https://avatars.githubusercontent.com/u/1171003?v=4?s=100" width="100px;" alt="Madd0g"/><br /><sub><b>Madd0g</b></sub></a><br /><a href="https://github.com/ts-graphviz/ts-graphviz/issues?q=author%3AMadd0g" title="Bug reports">🐛</a></td>
204
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/j4k0xb"><img src="https://avatars.githubusercontent.com/u/55899582?v=4?s=100" width="100px;" alt="j4k0xb"/><br /><sub><b>j4k0xb</b></sub></a><br /><a href="https://github.com/ts-graphviz/ts-graphviz/issues?q=author%3Aj4k0xb" title="Bug reports">🐛</a></td>
205
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/haved"><img src="https://avatars.githubusercontent.com/u/3748845?v=4?s=100" width="100px;" alt="HKrogstie"/><br /><sub><b>HKrogstie</b></sub></a><br /><a href="https://github.com/ts-graphviz/ts-graphviz/issues?q=author%3Ahaved" title="Bug reports">🐛</a></td>
206
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/septatrix"><img src="https://avatars.githubusercontent.com/u/24257556?v=4?s=100" width="100px;" alt="Nils K"/><br /><sub><b>Nils K</b></sub></a><br /><a href="https://github.com/ts-graphviz/ts-graphviz/issues?q=author%3Aseptatrix" title="Bug reports">🐛</a></td>
207
+ </tr>
208
+ <tr>
209
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/hao2013"><img src="https://avatars.githubusercontent.com/u/67059492?v=4?s=100" width="100px;" alt="hao2013"/><br /><sub><b>hao2013</b></sub></a><br /><a href="#maintenance-hao2013" title="Maintenance">🚧</a> <a href="https://github.com/ts-graphviz/ts-graphviz/pulls?q=is%3Apr+reviewed-by%3Ahao2013" title="Reviewed Pull Requests">👀</a></td>
210
+ <td align="center" valign="top" width="14.28%"><a href="http://www.walterra.dev"><img src="https://avatars.githubusercontent.com/u/230104?v=4?s=100" width="100px;" alt="Walter Rafelsberger"/><br /><sub><b>Walter Rafelsberger</b></sub></a><br /><a href="#question-walterra" title="Answering Questions">💬</a></td>
211
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/grsjst"><img src="https://avatars.githubusercontent.com/u/4739018?v=4?s=100" width="100px;" alt="grsjst"/><br /><sub><b>grsjst</b></sub></a><br /><a href="https://github.com/ts-graphviz/ts-graphviz/issues?q=author%3Agrsjst" title="Bug reports">🐛</a></td>
212
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/stephenirven"><img src="https://avatars.githubusercontent.com/u/4293560?v=4?s=100" width="100px;" alt="Steve"/><br /><sub><b>Steve</b></sub></a><br /><a href="https://github.com/ts-graphviz/ts-graphviz/issues?q=author%3Astephenirven" title="Bug reports">🐛</a></td>
213
+ </tr>
214
+ </tbody>
215
+ </table>
216
+
217
+ <!-- markdownlint-restore -->
218
+ <!-- prettier-ignore-end -->
219
+
220
+ <!-- ALL-CONTRIBUTORS-LIST:END -->
221
+
222
+ This project follows the [all-contributors](https://github.com/all-contributors/all-contributors)
223
+ specification. Contributions of any kind welcome!
224
+
225
+ ## Changelog 📜
226
+
227
+ See [CHANGELOG.md](https://github.com/ts-graphviz/ts-graphviz/blob/main/packages/common/CHANGELOG.md) for more details.
228
+
229
+ ## License ⚖️
230
+
231
+ This software is released under the MIT License, see [LICENSE](https://github.com/ts-graphviz/ts-graphviz/blob/main/LICENSE).