This commit is contained in:
Timo Hocker 2020-04-24 17:01:26 +02:00
parent c57af9bf57
commit 3b67053b3e
12 changed files with 212 additions and 63 deletions

52
lib/Color.ts Normal file
View File

@ -0,0 +1,52 @@
/* eslint-disable no-magic-numbers */
import { num_to_hex } from '@scode/encoding-helper';
export class Color {
public static readonly black = new Color (0, 0, 0);
public static readonly red = new Color (255, 0, 0);
public static readonly green = new Color (0, 255, 0);
public static readonly yellow = new Color (255, 255, 0);
public static readonly blue = new Color (0, 0, 255);
public static readonly magenta = new Color (255, 0, 255);
public static readonly cyan = new Color (0, 255, 255);
public static readonly white = new Color (255, 255, 255);
public static readonly transparent = new Color (0, 0, 0, 0);
public static readonly gray = new Color (128, 128, 128);
private red: number;
private green: number;
private blue: number;
private alpha: number;
private check_range (n: number): void {
if (n < 0 || n > 255)
throw new Error ('number out of range');
}
public constructor (red: number, green: number, blue: number, alpha = 255) {
this.check_range (red);
this.check_range (green);
this.check_range (blue);
this.check_range (alpha);
this.red = red;
this.green = green;
this.blue = blue;
this.alpha = alpha;
}
// eslint-disable-next-line @typescript-eslint/naming-convention
public toString (): string {
return `#${num_to_hex (
this.red,
2
)}${num_to_hex (
this.green,
2
)}${num_to_hex (
this.blue,
2
)}${this.alpha === 255
? ''
: num_to_hex (this.alpha, 2)}`;
}
}

View File

@ -1,6 +1,11 @@
import { EdgeStyles } from './Styles';
import { Color } from './Color';
export class Edge {
public origin: string;
public target: string;
public style?: EdgeStyles;
public color?: Color;
public constructor (origin: string, target: string) {
this.origin = origin;
@ -9,6 +14,17 @@ export class Edge {
// eslint-disable-next-line @typescript-eslint/naming-convention
public toString (): string {
return `${this.origin} -> ${this.target}`;
const attributes = [];
if (this.style)
attributes.push ({ name: 'style', value: this.style.toString () });
if (this.color)
attributes.push ({ name: 'color', value: this.color.toString () });
const attr_string = ` [${attributes.map ((v) => `${v.name}="${v.value}"`)
.join (',')}]`;
return `${this.origin} -> ${this.target}${attributes.length > 0
? attr_string
: ''}`;
}
}

View File

@ -1,18 +1,30 @@
import { Element } from './Element';
import { Edge } from './Edge';
import { Node } from './Node';
import { GraphStyles } from './Styles';
import { Color } from './Color';
export class Graph extends Element {
public children: Array<Graph> = [];
public nodes: Array<Node> = [];
public is_root = false;
public edges: Array<Edge> = [];
public style?: GraphStyles;
public color?: Color;
// eslint-disable-next-line @typescript-eslint/naming-convention
public toString (level = 0): string {
const header = this.parent
? `subgraph cluster_${this.full_name}`
: `digraph ${this.full_name}`;
const attributes = [];
if (this.color)
attributes.push ({ name: 'color', value: this.color.toString () });
if (this.style)
attributes.push ({ name: 'style', value: this.style.toString () });
let attrs = `\n ${attributes.map ((v) => `${v.name} = ${v.value}`)
.join ('\n ')}\n`;
let children = `\n ${this.children.map ((c) => c.toString (level + 1))
.join ('\n ')}\n`;
let nodes = `\n ${this.nodes.map ((c) => c.toString ())
@ -20,6 +32,8 @@ export class Graph extends Element {
let edges = `\n ${this.edges.map ((c) => c.toString ())
.join ('\n ')}\n`;
if (attrs === '\n \n')
attrs = '';
if (children === '\n \n')
children = '';
if (nodes === '\n \n')
@ -27,7 +41,7 @@ export class Graph extends Element {
if (edges === '\n \n')
edges = '';
return `${header} {${children}${nodes}${edges}}`
return `${header} {${attrs}${children}${nodes}${edges}}`
.replace (/\n/gu, `\n${' '.repeat (level)}`)
.replace (/^\s+$/gmu, '');
}

View File

@ -1,9 +1,13 @@
import { Element } from './Element';
import { NodeStyles } from './Styles';
import { Color } from './Color';
export class Node extends Element {
public label?: string;
public is_table = false;
public table_contents?: Array<Array<string>>;
public style?: NodeStyles;
public color?: Color;
public constructor (name: string, parent?: string, label?: string) {
super (name, parent);

32
lib/Styles.ts Normal file
View File

@ -0,0 +1,32 @@
enum EdgeStyles {
default = '',
solid = 'solid',
dashed = 'dashed',
dotted='dotted',
bold='bold'
}
enum NodeStyles {
default = '',
solid='solid',
dashed='dashed',
dotted='dotted',
bold='bold',
rounded='rounded',
diagonals='diagonals',
filled='filled',
striped='striped',
wedged='wedged'
}
enum GraphStyles {
solid = 'solid',
dashed = 'dashed',
dotted = 'dotted',
bold = 'bold',
rounded = 'rounded',
filled = 'filled',
striped = 'striped'
}
export { EdgeStyles, NodeStyles, GraphStyles };

View File

@ -2,3 +2,5 @@ export { Graph } from './Graph';
export { Node } from './Node';
export { Element } from './Element';
export { Edge } from './Edge';
export { Color } from './Color';
export { EdgeStyles, NodeStyles, GraphStyles } from './Styles';

View File

@ -20,5 +20,8 @@
"files": [
"/dist/",
"LICENSE"
]
}
],
"dependencies": {
"@scode/encoding-helper": "^1.0.21"
}
}

9
test/Color.ts Normal file
View File

@ -0,0 +1,9 @@
import test from 'ava';
import { Color } from '../lib';
test ('serialize', (t) => {
const wh = Color.white;
const tr = Color.transparent;
t.is (wh.toString (), '#ffffff');
t.is (tr.toString (), '#00000000');
});

View File

@ -1,8 +1,10 @@
import test from 'ava';
import { Edge } from '../lib';
import { Edge, Color, EdgeStyles } from '../lib';
test ('serialize', (t) => {
const e = new Edge ('foo', 'bar');
e.color = Color.white;
e.style = EdgeStyles.dashed;
const serialized = e.toString ();
t.is (serialized, 'foo -> bar');
t.is (serialized, 'foo -> bar [style="dashed",color="#ffffff"]');
});

View File

@ -1,8 +1,11 @@
import test from 'ava';
import { Graph } from '../lib';
import { Graph, GraphStyles, Color } from '../lib';
const result = `digraph foo {
subgraph cluster_foo_baz {
color = #ff0000
style = bold
foo_baz_asd [label=<asd>]
}
@ -19,6 +22,8 @@ test ('serialize', (t) => {
g.add_graph ((graph) => {
graph.name = 'baz';
graph.add_node ('asd');
graph.style = GraphStyles.bold;
graph.color = Color.red;
});
g.add_node ('baz');

View File

@ -1,15 +1,18 @@
import test from 'ava';
import { Node } from '../lib/Node';
import { NodeStyles, Node, Color } from '../lib';
const serialized_simple = 'bar_foo [label=<baz>]';
const serialized_simple
= 'bar_foo [label=<baz>,style="dashed",color="#00ff00"]';
const serialized_table = `bar_foo [label=<<table>
<tr><td>foo</td><td>bar</td><td>baz</td></tr>
<tr><td>bar</td><td>baz</td><td>foo</td></tr>
<tr><td>baz</td><td>foo</td><td>bar</td></tr>
</table>>]`;
</table>>,style="invis",color="#00ff00"]`;
test ('serialize simple', (t) => {
const g = new Node ('foo', 'bar', 'baz');
g.color = Color.green;
g.style = NodeStyles.dashed;
const serialized = g.toString ();
t.is (g.full_name, 'bar_foo');
@ -18,6 +21,8 @@ test ('serialize simple', (t) => {
test ('serialize table', (t) => {
const g = new Node ('foo', 'bar', 'baz');
g.color = Color.green;
g.style = NodeStyles.dashed;
g.table_contents = [
[

111
yarn.lock
View File

@ -227,10 +227,15 @@
"@nodelib/fs.scandir" "2.1.3"
fastq "^1.6.0"
"@scode/encoding-helper@^1.0.21":
version "1.0.23"
resolved "https://npm.scode.ovh/@scode%2fencoding-helper/-/encoding-helper-1.0.23.tgz#5955758e37ac608f571ef3602071ebc1c9866f8c"
integrity sha512-ShUWprWjUNd6/+TeJoPGwnMu6am0zWPsTLGQh0OimmCyeIGnXsV6a6B4Ettzkf0uVS59gQdGTdKvbxskusWzZQ==
"@scode/eslint-config-es6@^1.0.1":
version "1.0.20"
resolved "https://npm.scode.ovh/@scode%2feslint-config-es6/-/eslint-config-es6-1.0.20.tgz#b4a5deeab8168a73233b41149134d85bb075638f"
integrity sha512-h00GK6F5jycy7OmmXa9QHHIbv1x7DmMBuwLJSpl+lJD+pi7AUCCQv7oHmZ8autCZXXC9/8bPwJWrH9udIuiujg==
version "1.0.22"
resolved "https://npm.scode.ovh/@scode%2feslint-config-es6/-/eslint-config-es6-1.0.22.tgz#be1a200c821137e74b829ec0029acc81734f1fca"
integrity sha512-/BnuycrNMFm4KKk2rz7JF0DBAN/JvWKpE0uK2fLz8m4o88TX5AKrlUg/w4c6ctPTzhD9t9tS9tuZFn/Vs0J3mg==
dependencies:
"@scode/eslint-config" "^2.0.1"
eslint-plugin-import "^2.20.1"
@ -245,11 +250,11 @@
"@typescript-eslint/parser" "^2.26.0"
"@scode/eslint-config@^2.0.1":
version "2.0.10"
resolved "https://npm.scode.ovh/@scode%2feslint-config/-/eslint-config-2.0.10.tgz#a154d30de47893046cda34925c191a88f400ddc9"
integrity sha512-6BEMBK8VNPX+9FWkBhXzCWQ6j0l0JTS0F0UTUcPnzefau48WYlFZyORtyIc8H0OvYaeeLUD1gUNjLVsKjwTPHg==
version "2.0.11"
resolved "https://npm.scode.ovh/@scode%2feslint-config/-/eslint-config-2.0.11.tgz#3cc3cd71f3bc3ac39868bf608e0517bee09da58f"
integrity sha512-K8DpFdmepU1FNp0QJn5gbXS45g7k04rFUJp2OKQDqSa+3iywBvi44pMzJNOdZjkj+t3dGcOdeWcYOngz2MjdlA==
dependencies:
eslint-plugin-jsdoc "^23.0.0"
eslint-plugin-jsdoc "^24.0.0"
eslint-plugin-node "^11.0.0"
eslint-plugin-sort-requires-by-path "^1.0.2"
@ -300,9 +305,9 @@
integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
"@types/node@*":
version "13.11.1"
resolved "https://registry.yarnpkg.com/@types/node/-/node-13.11.1.tgz#49a2a83df9d26daacead30d0ccc8762b128d53c7"
integrity sha512-eWQGP3qtxwL8FGneRrC5DwrJLGN4/dH1clNTuLfN81HCrxVtxRjygDTUoZJ5ASlDEeo0ppYFQjQIlXhtXpOn6g==
version "13.13.2"
resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.2.tgz#160d82623610db590a64e8ca81784e11117e5a54"
integrity sha512-LB2R1Oyhpg8gu4SON/mfforE525+Hi/M1ineICEDftqNVTyFg1aRIeGuTvXAoWHc4nbrFncWtJgMmoyRvuGh7A==
"@types/normalize-package-data@^2.4.0":
version "2.4.0"
@ -310,39 +315,39 @@
integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==
"@typescript-eslint/eslint-plugin@^2.26.0":
version "2.28.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.28.0.tgz#4431bc6d3af41903e5255770703d4e55a0ccbdec"
integrity sha512-w0Ugcq2iatloEabQP56BRWJowliXUP5Wv6f9fKzjJmDW81hOTBxRoJ4LoEOxRpz9gcY51Libytd2ba3yLmSOfg==
version "2.29.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.29.0.tgz#c9efab7624e3dd6d144a0e4577a541d1bd42c2ac"
integrity sha512-X/YAY7azKirENm4QRpT7OVmzok02cSkqeIcLmdz6gXUQG4Hk0Fi9oBAynSAyNXeGdMRuZvjBa0c1Lu0dn/u6VA==
dependencies:
"@typescript-eslint/experimental-utils" "2.28.0"
"@typescript-eslint/experimental-utils" "2.29.0"
functional-red-black-tree "^1.0.1"
regexpp "^3.0.0"
tsutils "^3.17.1"
"@typescript-eslint/experimental-utils@2.28.0":
version "2.28.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.28.0.tgz#1fd0961cd8ef6522687b4c562647da6e71f8833d"
integrity sha512-4SL9OWjvFbHumM/Zh/ZeEjUFxrYKtdCi7At4GyKTbQlrj1HcphIDXlje4Uu4cY+qzszR5NdVin4CCm6AXCjd6w==
"@typescript-eslint/experimental-utils@2.29.0":
version "2.29.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.29.0.tgz#3cb8060de9265ba131625a96bbfec31ba6d4a0fe"
integrity sha512-H/6VJr6eWYstyqjWXBP2Nn1hQJyvJoFdDtsHxGiD+lEP7piGnGpb/ZQd+z1ZSB1F7dN+WsxUDh8+S4LwI+f3jw==
dependencies:
"@types/json-schema" "^7.0.3"
"@typescript-eslint/typescript-estree" "2.28.0"
"@typescript-eslint/typescript-estree" "2.29.0"
eslint-scope "^5.0.0"
eslint-utils "^2.0.0"
"@typescript-eslint/parser@^2.26.0":
version "2.28.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.28.0.tgz#bb761286efd2b0714761cab9d0ee5847cf080385"
integrity sha512-RqPybRDquui9d+K86lL7iPqH6Dfp9461oyqvlXMNtap+PyqYbkY5dB7LawQjDzot99fqzvS0ZLZdfe+1Bt3Jgw==
version "2.29.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.29.0.tgz#6e3c4e21ed6393dc05b9d8b47f0b7e731ef21c9c"
integrity sha512-H78M+jcu5Tf6m/5N8iiFblUUv+HJDguMSdFfzwa6vSg9lKR8Mk9BsgeSjO8l2EshKnJKcbv0e8IDDOvSNjl0EA==
dependencies:
"@types/eslint-visitor-keys" "^1.0.0"
"@typescript-eslint/experimental-utils" "2.28.0"
"@typescript-eslint/typescript-estree" "2.28.0"
"@typescript-eslint/experimental-utils" "2.29.0"
"@typescript-eslint/typescript-estree" "2.29.0"
eslint-visitor-keys "^1.1.0"
"@typescript-eslint/typescript-estree@2.28.0":
version "2.28.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.28.0.tgz#d34949099ff81092c36dc275b6a1ea580729ba00"
integrity sha512-HDr8MP9wfwkiuqzRVkuM3BeDrOC4cKbO5a6BymZBHUt5y/2pL0BXD6I/C/ceq2IZoHWhcASk+5/zo+dwgu9V8Q==
"@typescript-eslint/typescript-estree@2.29.0":
version "2.29.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.29.0.tgz#1be6612bb02fc37ac9f466521c1459a4744e8d3a"
integrity sha512-3YGbtnWy4az16Egy5Fj5CckkVlpIh0MADtAQza+jiMADRSKkjdpzZp/5WuvwK/Qib3Z0HtzrDFeWanS99dNhnA==
dependencies:
debug "^4.1.1"
eslint-visitor-keys "^1.1.0"
@ -371,9 +376,9 @@ aggregate-error@^3.0.0:
indent-string "^4.0.0"
ajv@^6.10.0, ajv@^6.10.2:
version "6.12.0"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7"
integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==
version "6.12.2"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd"
integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==
dependencies:
fast-deep-equal "^3.1.1"
fast-json-stable-stringify "^2.0.0"
@ -1133,10 +1138,10 @@ eslint-plugin-import@^2.20.1:
read-pkg-up "^2.0.0"
resolve "^1.12.0"
eslint-plugin-jsdoc@^23.0.0:
version "23.0.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-23.0.0.tgz#f80dca482fc9d93a9e30b3ead70b88dee261caa3"
integrity sha512-zj5ZephjKkFU/J9hEw3RcjwpuywChvwNMgHs2DTgOuKarpJ65SJU3JGgx/K4y9l8iFw0ysrk6NlAKDX88ZwZdw==
eslint-plugin-jsdoc@^24.0.0:
version "24.0.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-24.0.0.tgz#41c7b06d33741e41e80a8f08c82aaa58ceef2e4b"
integrity sha512-AGAc9PYpramsJGVmqtxnXBYlq+AMh+hIZdbJ52OLvyJS3f+PaT/PzuckRFOLnth2uhCDv4IjgsB3r5jUFWqUnw==
dependencies:
comment-parser "^0.7.2"
debug "^4.1.1"
@ -1409,9 +1414,9 @@ fs.realpath@^1.0.0:
integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
fsevents@~2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805"
integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==
version "2.1.3"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
function-bind@^1.1.1:
version "1.1.1"
@ -2076,9 +2081,9 @@ lowercase-keys@^2.0.0:
integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
make-dir@^3.0.0, make-dir@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392"
integrity sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==
version "3.1.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
dependencies:
semver "^6.0.0"
@ -2311,9 +2316,9 @@ optionator@^0.8.3:
word-wrap "~1.2.3"
ora@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/ora/-/ora-4.0.3.tgz#752a1b7b4be4825546a7a3d59256fa523b6b6d05"
integrity sha512-fnDebVFyz309A73cqCipVL1fBZewq4vwgSHfxh43vVy31mbyoQ8sCH3Oeaog/owYOs/lLlGVPCISQonTneg6Pg==
version "4.0.4"
resolved "https://registry.yarnpkg.com/ora/-/ora-4.0.4.tgz#e8da697cc5b6a47266655bf68e0fb588d29a545d"
integrity sha512-77iGeVU1cIdRhgFzCK8aw1fbtT1B/iZAvWjS+l/o1x0RShMgxHUZaD2yDpWsNCPwXg9z1ZA78Kbdvr8kBmG/Ww==
dependencies:
chalk "^3.0.0"
cli-cursor "^3.1.0"
@ -2698,9 +2703,9 @@ resolve-from@^5.0.0:
integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.3.2:
version "1.16.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.16.0.tgz#063dc704fa3413e13ac1d0d1756a7cbfe95dd1a7"
integrity sha512-LarL/PIKJvc09k1jaeT4kQb/8/7P+qV4qSnN2K80AES+OHdfZELAKVOBjxsvtToT/uLOfFbvYvKfZmV8cee7nA==
version "1.17.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
dependencies:
path-parse "^1.0.6"
@ -2847,9 +2852,9 @@ slice-ansi@^3.0.0:
is-fullwidth-code-point "^3.0.0"
source-map-support@^0.5.16:
version "0.5.16"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042"
integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==
version "0.5.19"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
dependencies:
buffer-from "^1.0.0"
source-map "^0.6.0"
@ -2885,9 +2890,9 @@ spdx-correct@^3.0.0:
spdx-license-ids "^3.0.0"
spdx-exceptions@^2.1.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977"
integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==
version "2.3.0"
resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
spdx-expression-parse@^3.0.0:
version "3.0.0"