@likec4/core 1.10.0 → 1.11.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/dist/index.cjs +610 -223
- package/dist/index.d.cts +202 -221
- package/dist/index.d.mts +202 -221
- package/dist/index.d.ts +202 -221
- package/dist/index.mjs +611 -225
- package/dist/shared/{core.DeifT5lC.mjs → core.CUlHblBQ.mjs} +5 -5
- package/dist/shared/{core.CpR2fq5B.d.cts → core.aVt8heZL.d.cts} +199 -354
- package/dist/shared/{core.CpR2fq5B.d.mts → core.aVt8heZL.d.mts} +199 -354
- package/dist/shared/{core.CpR2fq5B.d.ts → core.aVt8heZL.d.ts} +199 -354
- package/dist/types/index.cjs +1 -2
- package/dist/types/index.d.cts +2 -1
- package/dist/types/index.d.mts +2 -1
- package/dist/types/index.d.ts +2 -1
- package/dist/types/index.mjs +1 -1
- package/package.json +14 -10
- package/src/index.ts +2 -0
- package/src/model/LikeC4DiagramModel.ts +338 -0
- package/src/model/LikeC4Model.ts +227 -145
- package/src/model/LikeC4ViewModel.ts +45 -43
- package/src/model/index.ts +3 -2
- package/src/model/types.ts +13 -0
- package/src/types/_common.ts +2 -0
- package/src/types/index.ts +0 -2
- package/src/types/model.ts +10 -1
- package/src/utils/promises.ts +13 -2
- package/src/model/__test__/LikeC4Model.spec.ts +0 -79
- package/src/utils/compare-natural.spec.ts +0 -37
- package/src/utils/fqn.spec.ts +0 -202
- package/src/utils/relations.spec.ts +0 -266
- package/dist/shared/{core.Db3ntVII.cjs → core.D78YmZ_A.cjs} +4 -4
package/dist/index.cjs
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
const types_index = require('./shared/core.
|
|
3
|
+
const types_index = require('./shared/core.D78YmZ_A.cjs');
|
|
4
|
+
|
|
5
|
+
const { min: min$4, max: max$4 } = Math;
|
|
4
6
|
|
|
5
7
|
const limit = (x, low = 0, high = 1) => {
|
|
6
|
-
return min$
|
|
8
|
+
return min$4(max$4(low, x), high);
|
|
7
9
|
};
|
|
8
10
|
|
|
9
11
|
const clip_rgb = (rgb) => {
|
|
@@ -124,7 +126,7 @@ class Color {
|
|
|
124
126
|
}
|
|
125
127
|
|
|
126
128
|
// this gets updated automatically
|
|
127
|
-
const version = '3.
|
|
129
|
+
const version = '3.1.1';
|
|
128
130
|
|
|
129
131
|
const chroma = (...args) => {
|
|
130
132
|
return new Color(...args);
|
|
@@ -2605,6 +2607,72 @@ const contrast = (a, b) => {
|
|
|
2605
2607
|
return l1 > l2 ? (l1 + 0.05) / (l2 + 0.05) : (l2 + 0.05) / (l1 + 0.05);
|
|
2606
2608
|
};
|
|
2607
2609
|
|
|
2610
|
+
/**
|
|
2611
|
+
* @license
|
|
2612
|
+
*
|
|
2613
|
+
* The APCA contrast prediction algorithm is based of the formulas published
|
|
2614
|
+
* in the APCA-1.0.98G specification by Myndex. The specification is available at:
|
|
2615
|
+
* https://raw.githubusercontent.com/Myndex/apca-w3/master/images/APCAw3_0.1.17_APCA0.0.98G.svg
|
|
2616
|
+
*
|
|
2617
|
+
* Note that the APCA implementation is still beta, so please update to
|
|
2618
|
+
* future versions of chroma.js when they become available.
|
|
2619
|
+
*
|
|
2620
|
+
* You can read more about the APCA Readability Criterion at
|
|
2621
|
+
* https://readtech.org/ARC/
|
|
2622
|
+
*/
|
|
2623
|
+
|
|
2624
|
+
// constants
|
|
2625
|
+
const W_offset = 0.027;
|
|
2626
|
+
const P_in = 0.0005;
|
|
2627
|
+
const P_out = 0.1;
|
|
2628
|
+
const R_scale = 1.14;
|
|
2629
|
+
const B_threshold = 0.022;
|
|
2630
|
+
const B_exp = 1.414;
|
|
2631
|
+
|
|
2632
|
+
const contrastAPCA = (text, bg) => {
|
|
2633
|
+
// parse input colors
|
|
2634
|
+
text = new Color(text);
|
|
2635
|
+
bg = new Color(bg);
|
|
2636
|
+
// if text color has alpha, blend against background
|
|
2637
|
+
if (text.alpha() < 1) {
|
|
2638
|
+
text = mix(bg, text, text.alpha(), 'rgb');
|
|
2639
|
+
}
|
|
2640
|
+
const l_text = lum(...text.rgb());
|
|
2641
|
+
const l_bg = lum(...bg.rgb());
|
|
2642
|
+
|
|
2643
|
+
// soft clamp black levels
|
|
2644
|
+
const Y_text =
|
|
2645
|
+
l_text >= B_threshold
|
|
2646
|
+
? l_text
|
|
2647
|
+
: l_text + Math.pow(B_threshold - l_text, B_exp);
|
|
2648
|
+
const Y_bg =
|
|
2649
|
+
l_bg >= B_threshold ? l_bg : l_bg + Math.pow(B_threshold - l_bg, B_exp);
|
|
2650
|
+
|
|
2651
|
+
// normal polarity (dark text on light background)
|
|
2652
|
+
const S_norm = Math.pow(Y_bg, 0.56) - Math.pow(Y_text, 0.57);
|
|
2653
|
+
// reverse polarity (light text on dark background)
|
|
2654
|
+
const S_rev = Math.pow(Y_bg, 0.65) - Math.pow(Y_text, 0.62);
|
|
2655
|
+
// clamp noise then scale
|
|
2656
|
+
const C =
|
|
2657
|
+
Math.abs(Y_bg - Y_text) < P_in
|
|
2658
|
+
? 0
|
|
2659
|
+
: Y_text < Y_bg
|
|
2660
|
+
? S_norm * R_scale
|
|
2661
|
+
: S_rev * R_scale;
|
|
2662
|
+
// clamp minimum contrast then offset
|
|
2663
|
+
const S_apc = Math.abs(C) < P_out ? 0 : C > 0 ? C - W_offset : C + W_offset;
|
|
2664
|
+
// scale to 100
|
|
2665
|
+
return S_apc * 100;
|
|
2666
|
+
};
|
|
2667
|
+
|
|
2668
|
+
function lum(r, g, b) {
|
|
2669
|
+
return (
|
|
2670
|
+
0.2126729 * Math.pow(r / 255, 2.4) +
|
|
2671
|
+
0.7151522 * Math.pow(g / 255, 2.4) +
|
|
2672
|
+
0.072175 * Math.pow(b / 255, 2.4)
|
|
2673
|
+
);
|
|
2674
|
+
}
|
|
2675
|
+
|
|
2608
2676
|
const { sqrt, pow, min, max: max$1, atan2, abs, cos, sin, exp, PI } = Math;
|
|
2609
2677
|
|
|
2610
2678
|
function deltaE (a, b, Kl = 1, Kc = 1, Kh = 1) {
|
|
@@ -2767,10 +2835,24 @@ const colorbrewer = {
|
|
|
2767
2835
|
Pastel1: ['#fbb4ae', '#b3cde3', '#ccebc5', '#decbe4', '#fed9a6', '#ffffcc', '#e5d8bd', '#fddaec', '#f2f2f2']
|
|
2768
2836
|
};
|
|
2769
2837
|
|
|
2770
|
-
|
|
2771
|
-
|
|
2772
|
-
|
|
2773
|
-
|
|
2838
|
+
const colorbrewerTypes = Object.keys(colorbrewer);
|
|
2839
|
+
const typeMap = new Map(colorbrewerTypes.map((key) => [key.toLowerCase(), key]));
|
|
2840
|
+
|
|
2841
|
+
// use Proxy to allow case-insensitive access to palettes
|
|
2842
|
+
const colorbrewerProxy =
|
|
2843
|
+
typeof Proxy === 'function'
|
|
2844
|
+
? new Proxy(colorbrewer, {
|
|
2845
|
+
get(target, prop) {
|
|
2846
|
+
const lower = prop.toLowerCase();
|
|
2847
|
+
if (typeMap.has(lower)) {
|
|
2848
|
+
return target[typeMap.get(lower)];
|
|
2849
|
+
}
|
|
2850
|
+
},
|
|
2851
|
+
getOwnPropertyNames() {
|
|
2852
|
+
return Object.getOwnPropertyNames(colorbrewerTypes);
|
|
2853
|
+
}
|
|
2854
|
+
})
|
|
2855
|
+
: colorbrewer;
|
|
2774
2856
|
|
|
2775
2857
|
const cmyk2rgb = (...args) => {
|
|
2776
2858
|
args = unpack(args, 'cmyk');
|
|
@@ -2875,7 +2957,7 @@ const lch2css = (...args) => {
|
|
|
2875
2957
|
let mode = last(args) || 'lab';
|
|
2876
2958
|
lcha[0] = rnd2(lcha[0]) + '%';
|
|
2877
2959
|
lcha[1] = rnd2(lcha[1]);
|
|
2878
|
-
lcha[2] = rnd2(lcha[2]) + 'deg'; // add deg unit to hue
|
|
2960
|
+
lcha[2] = isNaN(lcha[2]) ? 'none' : rnd2(lcha[2]) + 'deg'; // add deg unit to hue
|
|
2879
2961
|
if (mode === 'lcha' || (lcha.length > 3 && lcha[3] < 1)) {
|
|
2880
2962
|
lcha[3] = '/ ' + (lcha.length > 3 ? lcha[3] : 1);
|
|
2881
2963
|
} else {
|
|
@@ -2884,7 +2966,7 @@ const lch2css = (...args) => {
|
|
|
2884
2966
|
return `lch(${lcha.join(' ')})`;
|
|
2885
2967
|
};
|
|
2886
2968
|
|
|
2887
|
-
const oklab2css
|
|
2969
|
+
const oklab2css = (...args) => {
|
|
2888
2970
|
const laba = unpack(args, 'lab');
|
|
2889
2971
|
laba[0] = rnd2(laba[0] * 100) + '%';
|
|
2890
2972
|
laba[1] = rnd3(laba[1]);
|
|
@@ -2904,17 +2986,17 @@ const rgb2oklch = (...args) => {
|
|
|
2904
2986
|
return [L, c, h, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];
|
|
2905
2987
|
};
|
|
2906
2988
|
|
|
2907
|
-
const
|
|
2908
|
-
const
|
|
2909
|
-
|
|
2910
|
-
|
|
2911
|
-
|
|
2912
|
-
if (
|
|
2913
|
-
|
|
2989
|
+
const oklch2css = (...args) => {
|
|
2990
|
+
const lcha = unpack(args, 'lch');
|
|
2991
|
+
lcha[0] = rnd2(lcha[0] * 100) + '%';
|
|
2992
|
+
lcha[1] = rnd3(lcha[1]);
|
|
2993
|
+
lcha[2] = isNaN(lcha[2]) ? 'none' : rnd2(lcha[2]) + 'deg'; // add deg unit to hue
|
|
2994
|
+
if (lcha.length > 3 && lcha[3] < 1) {
|
|
2995
|
+
lcha[3] = '/ ' + (lcha.length > 3 ? lcha[3] : 1);
|
|
2914
2996
|
} else {
|
|
2915
|
-
|
|
2997
|
+
lcha.length = 3;
|
|
2916
2998
|
}
|
|
2917
|
-
return `oklch(${
|
|
2999
|
+
return `oklch(${lcha.join(' ')})`;
|
|
2918
3000
|
};
|
|
2919
3001
|
|
|
2920
3002
|
const { round: round$2 } = Math;
|
|
@@ -2950,10 +3032,10 @@ const rgb2css = (...args) => {
|
|
|
2950
3032
|
return cssColor;
|
|
2951
3033
|
}
|
|
2952
3034
|
if (mode.substr(0, 5) === 'oklab') {
|
|
2953
|
-
return oklab2css
|
|
3035
|
+
return oklab2css(rgb2oklab(rgba));
|
|
2954
3036
|
}
|
|
2955
3037
|
if (mode.substr(0, 5) === 'oklch') {
|
|
2956
|
-
return
|
|
3038
|
+
return oklch2css(rgb2oklch(rgba));
|
|
2957
3039
|
}
|
|
2958
3040
|
rgba[0] = round$2(rgba[0]);
|
|
2959
3041
|
rgba[1] = round$2(rgba[1]);
|
|
@@ -2973,42 +3055,75 @@ const oklch2rgb = (...args) => {
|
|
|
2973
3055
|
return [r, g, b, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];
|
|
2974
3056
|
};
|
|
2975
3057
|
|
|
2976
|
-
const
|
|
2977
|
-
const
|
|
2978
|
-
|
|
2979
|
-
const
|
|
2980
|
-
|
|
2981
|
-
const
|
|
2982
|
-
|
|
2983
|
-
|
|
2984
|
-
|
|
2985
|
-
|
|
2986
|
-
const
|
|
2987
|
-
|
|
2988
|
-
|
|
2989
|
-
|
|
2990
|
-
|
|
2991
|
-
|
|
2992
|
-
|
|
2993
|
-
|
|
2994
|
-
|
|
2995
|
-
|
|
2996
|
-
|
|
2997
|
-
|
|
3058
|
+
const INT_OR_PCT = /((?:-?\d+)|(?:-?\d+(?:\.\d+)?)%|none)/.source;
|
|
3059
|
+
const FLOAT_OR_PCT = /((?:-?(?:\d+(?:\.\d*)?|\.\d+)%?)|none)/.source;
|
|
3060
|
+
const PCT = /((?:-?(?:\d+(?:\.\d*)?|\.\d+)%)|none)/.source;
|
|
3061
|
+
const RE_S = /\s*/.source;
|
|
3062
|
+
const SEP = /\s+/.source;
|
|
3063
|
+
const COMMA = /\s*,\s*/.source;
|
|
3064
|
+
const ANLGE = /((?:-?(?:\d+(?:\.\d*)?|\.\d+)(?:deg)?)|none)/.source;
|
|
3065
|
+
const ALPHA = /\s*(?:\/\s*((?:[01]|[01]?\.\d+)|\d+(?:\.\d+)?%))?/.source;
|
|
3066
|
+
|
|
3067
|
+
// e.g. rgb(250 20 0), rgb(100% 50% 20%), rgb(100% 50% 20% / 0.5)
|
|
3068
|
+
const RE_RGB = new RegExp(
|
|
3069
|
+
'^rgba?\\(' +
|
|
3070
|
+
RE_S +
|
|
3071
|
+
[INT_OR_PCT, INT_OR_PCT, INT_OR_PCT].join(SEP) +
|
|
3072
|
+
ALPHA +
|
|
3073
|
+
'\\)$'
|
|
3074
|
+
);
|
|
3075
|
+
const RE_RGB_LEGACY = new RegExp(
|
|
3076
|
+
'^rgb\\(' +
|
|
3077
|
+
RE_S +
|
|
3078
|
+
[INT_OR_PCT, INT_OR_PCT, INT_OR_PCT].join(COMMA) +
|
|
3079
|
+
RE_S +
|
|
3080
|
+
'\\)$'
|
|
3081
|
+
);
|
|
3082
|
+
const RE_RGBA_LEGACY = new RegExp(
|
|
3083
|
+
'^rgba\\(' +
|
|
3084
|
+
RE_S +
|
|
3085
|
+
[INT_OR_PCT, INT_OR_PCT, INT_OR_PCT, FLOAT_OR_PCT].join(COMMA) +
|
|
3086
|
+
RE_S +
|
|
3087
|
+
'\\)$'
|
|
3088
|
+
);
|
|
2998
3089
|
|
|
2999
|
-
const
|
|
3000
|
-
|
|
3090
|
+
const RE_HSL = new RegExp(
|
|
3091
|
+
'^hsla?\\(' + RE_S + [ANLGE, PCT, PCT].join(SEP) + ALPHA + '\\)$'
|
|
3092
|
+
);
|
|
3093
|
+
const RE_HSL_LEGACY = new RegExp(
|
|
3094
|
+
'^hsl?\\(' + RE_S + [ANLGE, PCT, PCT].join(COMMA) + RE_S + '\\)$'
|
|
3095
|
+
);
|
|
3001
3096
|
const RE_HSLA_LEGACY =
|
|
3002
3097
|
/^hsla\(\s*(-?\d+(?:\.\d+)?),\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)$/;
|
|
3003
3098
|
|
|
3004
|
-
const RE_LAB =
|
|
3005
|
-
|
|
3006
|
-
|
|
3007
|
-
|
|
3008
|
-
|
|
3009
|
-
|
|
3010
|
-
|
|
3011
|
-
|
|
3099
|
+
const RE_LAB = new RegExp(
|
|
3100
|
+
'^lab\\(' +
|
|
3101
|
+
RE_S +
|
|
3102
|
+
[FLOAT_OR_PCT, FLOAT_OR_PCT, FLOAT_OR_PCT].join(SEP) +
|
|
3103
|
+
ALPHA +
|
|
3104
|
+
'\\)$'
|
|
3105
|
+
);
|
|
3106
|
+
const RE_LCH = new RegExp(
|
|
3107
|
+
'^lch\\(' +
|
|
3108
|
+
RE_S +
|
|
3109
|
+
[FLOAT_OR_PCT, FLOAT_OR_PCT, ANLGE].join(SEP) +
|
|
3110
|
+
ALPHA +
|
|
3111
|
+
'\\)$'
|
|
3112
|
+
);
|
|
3113
|
+
const RE_OKLAB = new RegExp(
|
|
3114
|
+
'^oklab\\(' +
|
|
3115
|
+
RE_S +
|
|
3116
|
+
[FLOAT_OR_PCT, FLOAT_OR_PCT, FLOAT_OR_PCT].join(SEP) +
|
|
3117
|
+
ALPHA +
|
|
3118
|
+
'\\)$'
|
|
3119
|
+
);
|
|
3120
|
+
const RE_OKLCH = new RegExp(
|
|
3121
|
+
'^oklch\\(' +
|
|
3122
|
+
RE_S +
|
|
3123
|
+
[FLOAT_OR_PCT, FLOAT_OR_PCT, ANLGE].join(SEP) +
|
|
3124
|
+
ALPHA +
|
|
3125
|
+
'\\)$'
|
|
3126
|
+
);
|
|
3012
3127
|
|
|
3013
3128
|
const { round: round$1 } = Math;
|
|
3014
3129
|
|
|
@@ -3035,6 +3150,11 @@ const noneToValue = (v, noneValue) => {
|
|
|
3035
3150
|
|
|
3036
3151
|
const css2rgb = (css) => {
|
|
3037
3152
|
css = css.toLowerCase().trim();
|
|
3153
|
+
|
|
3154
|
+
if (css === 'transparent') {
|
|
3155
|
+
return [0, 0, 0, 0];
|
|
3156
|
+
}
|
|
3157
|
+
|
|
3038
3158
|
let m;
|
|
3039
3159
|
|
|
3040
3160
|
if (input.format.named) {
|
|
@@ -3046,58 +3166,39 @@ const css2rgb = (css) => {
|
|
|
3046
3166
|
|
|
3047
3167
|
// rgb(250 20 0) or rgb(250,20,0)
|
|
3048
3168
|
if ((m = css.match(RE_RGB)) || (m = css.match(RE_RGB_LEGACY))) {
|
|
3049
|
-
|
|
3169
|
+
let rgb = m.slice(1, 4);
|
|
3050
3170
|
for (let i = 0; i < 3; i++) {
|
|
3051
|
-
rgb[i] = +rgb[i];
|
|
3171
|
+
rgb[i] = +percentToAbsolute(noneToValue(rgb[i], 0), 0, 255);
|
|
3052
3172
|
}
|
|
3053
|
-
rgb
|
|
3173
|
+
rgb = roundRGB(rgb);
|
|
3174
|
+
const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;
|
|
3175
|
+
rgb[3] = alpha; // default alpha
|
|
3054
3176
|
return rgb;
|
|
3055
3177
|
}
|
|
3056
3178
|
|
|
3057
3179
|
// rgba(250,20,0,0.4)
|
|
3058
|
-
if ((m = css.match(
|
|
3180
|
+
if ((m = css.match(RE_RGBA_LEGACY))) {
|
|
3059
3181
|
const rgb = m.slice(1, 5);
|
|
3060
3182
|
for (let i = 0; i < 4; i++) {
|
|
3061
|
-
rgb[i] = +rgb[i];
|
|
3062
|
-
}
|
|
3063
|
-
return rgb;
|
|
3064
|
-
}
|
|
3065
|
-
|
|
3066
|
-
// rgb(100%,0%,0%)
|
|
3067
|
-
if ((m = css.match(RE_RGB_PCT)) || (m = css.match(RE_RGB_PCT_LEGACY))) {
|
|
3068
|
-
const rgb = m.slice(1, 4);
|
|
3069
|
-
for (let i = 0; i < 3; i++) {
|
|
3070
|
-
rgb[i] = round$1(rgb[i] * 2.55);
|
|
3071
|
-
}
|
|
3072
|
-
rgb[3] = 1; // default alpha
|
|
3073
|
-
return rgb;
|
|
3074
|
-
}
|
|
3075
|
-
|
|
3076
|
-
// rgba(100%,0%,0%,0.4)
|
|
3077
|
-
if ((m = css.match(RE_RGBA_PCT)) || (m = css.match(RE_RGBA_PCT_LEGACY))) {
|
|
3078
|
-
const rgb = m.slice(1, 5);
|
|
3079
|
-
for (let i = 0; i < 3; i++) {
|
|
3080
|
-
rgb[i] = round$1(rgb[i] * 2.55);
|
|
3183
|
+
rgb[i] = +percentToAbsolute(rgb[i], 0, 255);
|
|
3081
3184
|
}
|
|
3082
|
-
rgb[3] = +rgb[3];
|
|
3083
3185
|
return rgb;
|
|
3084
3186
|
}
|
|
3085
3187
|
|
|
3086
3188
|
// hsl(0,100%,50%)
|
|
3087
3189
|
if ((m = css.match(RE_HSL)) || (m = css.match(RE_HSL_LEGACY))) {
|
|
3088
3190
|
const hsl = m.slice(1, 4);
|
|
3089
|
-
hsl[
|
|
3090
|
-
hsl[
|
|
3091
|
-
|
|
3092
|
-
|
|
3093
|
-
|
|
3094
|
-
|
|
3095
|
-
rgb[3] = 1;
|
|
3191
|
+
hsl[0] = +noneToValue(hsl[0].replace('deg', ''), 0);
|
|
3192
|
+
hsl[1] = +percentToAbsolute(noneToValue(hsl[1], 0), 0, 100) * 0.01;
|
|
3193
|
+
hsl[2] = +percentToAbsolute(noneToValue(hsl[2], 0), 0, 100) * 0.01;
|
|
3194
|
+
const rgb = roundRGB(hsl2rgb(hsl));
|
|
3195
|
+
const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;
|
|
3196
|
+
rgb[3] = alpha;
|
|
3096
3197
|
return rgb;
|
|
3097
3198
|
}
|
|
3098
3199
|
|
|
3099
3200
|
// hsla(0,100%,50%,0.5)
|
|
3100
|
-
if ((m = css.match(
|
|
3201
|
+
if ((m = css.match(RE_HSLA_LEGACY))) {
|
|
3101
3202
|
const hsl = m.slice(1, 4);
|
|
3102
3203
|
hsl[1] *= 0.01;
|
|
3103
3204
|
hsl[2] *= 0.01;
|
|
@@ -3111,16 +3212,17 @@ const css2rgb = (css) => {
|
|
|
3111
3212
|
|
|
3112
3213
|
if ((m = css.match(RE_LAB))) {
|
|
3113
3214
|
const lab = m.slice(1, 4);
|
|
3114
|
-
lab[0] = percentToAbsolute(lab[0], 0, 100);
|
|
3115
|
-
lab[1] = percentToAbsolute(lab[1], -125, 125, true);
|
|
3116
|
-
lab[2] = percentToAbsolute(lab[2], -125, 125, true);
|
|
3215
|
+
lab[0] = percentToAbsolute(noneToValue(lab[0], 0), 0, 100);
|
|
3216
|
+
lab[1] = percentToAbsolute(noneToValue(lab[1], 0), -125, 125, true);
|
|
3217
|
+
lab[2] = percentToAbsolute(noneToValue(lab[2], 0), -125, 125, true);
|
|
3117
3218
|
// convert to D50 Lab whitepoint
|
|
3118
3219
|
const wp = getLabWhitePoint();
|
|
3119
3220
|
setLabWhitePoint('d50');
|
|
3120
3221
|
const rgb = roundRGB(lab2rgb(lab));
|
|
3121
3222
|
// convert back to original Lab whitepoint
|
|
3122
3223
|
setLabWhitePoint(wp);
|
|
3123
|
-
|
|
3224
|
+
const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;
|
|
3225
|
+
rgb[3] = alpha;
|
|
3124
3226
|
return rgb;
|
|
3125
3227
|
}
|
|
3126
3228
|
|
|
@@ -3135,27 +3237,30 @@ const css2rgb = (css) => {
|
|
|
3135
3237
|
const rgb = roundRGB(lch2rgb(lch));
|
|
3136
3238
|
// convert back to original Lab whitepoint
|
|
3137
3239
|
setLabWhitePoint(wp);
|
|
3138
|
-
|
|
3240
|
+
const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;
|
|
3241
|
+
rgb[3] = alpha;
|
|
3139
3242
|
return rgb;
|
|
3140
3243
|
}
|
|
3141
3244
|
|
|
3142
3245
|
if ((m = css.match(RE_OKLAB))) {
|
|
3143
3246
|
const oklab = m.slice(1, 4);
|
|
3144
|
-
oklab[0] = percentToAbsolute(oklab[0], 0, 1);
|
|
3145
|
-
oklab[1] = percentToAbsolute(oklab[1], -0.4, 0.4, true);
|
|
3146
|
-
oklab[2] = percentToAbsolute(oklab[2], -0.4, 0.4, true);
|
|
3247
|
+
oklab[0] = percentToAbsolute(noneToValue(oklab[0], 0), 0, 1);
|
|
3248
|
+
oklab[1] = percentToAbsolute(noneToValue(oklab[1], 0), -0.4, 0.4, true);
|
|
3249
|
+
oklab[2] = percentToAbsolute(noneToValue(oklab[2], 0), -0.4, 0.4, true);
|
|
3147
3250
|
const rgb = roundRGB(oklab2rgb(oklab));
|
|
3148
|
-
|
|
3251
|
+
const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;
|
|
3252
|
+
rgb[3] = alpha;
|
|
3149
3253
|
return rgb;
|
|
3150
3254
|
}
|
|
3151
3255
|
|
|
3152
3256
|
if ((m = css.match(RE_OKLCH))) {
|
|
3153
3257
|
const oklch = m.slice(1, 4);
|
|
3154
|
-
oklch[0] = percentToAbsolute(oklch[0], 0, 1);
|
|
3258
|
+
oklch[0] = percentToAbsolute(noneToValue(oklch[0], 0), 0, 1);
|
|
3155
3259
|
oklch[1] = percentToAbsolute(noneToValue(oklch[1], 0), 0, 0.4, false);
|
|
3156
3260
|
oklch[2] = +noneToValue(oklch[2].replace('deg', ''), 0);
|
|
3157
3261
|
const rgb = roundRGB(oklch2rgb(oklch));
|
|
3158
|
-
|
|
3262
|
+
const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;
|
|
3263
|
+
rgb[3] = alpha;
|
|
3159
3264
|
return rgb;
|
|
3160
3265
|
}
|
|
3161
3266
|
};
|
|
@@ -3164,11 +3269,7 @@ css2rgb.test = (s) => {
|
|
|
3164
3269
|
return (
|
|
3165
3270
|
// modern
|
|
3166
3271
|
RE_RGB.test(s) ||
|
|
3167
|
-
RE_RGBA.test(s) ||
|
|
3168
|
-
RE_RGB_PCT.test(s) ||
|
|
3169
|
-
RE_RGBA_PCT.test(s) ||
|
|
3170
3272
|
RE_HSL.test(s) ||
|
|
3171
|
-
RE_HSLA.test(s) ||
|
|
3172
3273
|
RE_LAB.test(s) ||
|
|
3173
3274
|
RE_LCH.test(s) ||
|
|
3174
3275
|
RE_OKLAB.test(s) ||
|
|
@@ -3176,10 +3277,9 @@ css2rgb.test = (s) => {
|
|
|
3176
3277
|
// legacy
|
|
3177
3278
|
RE_RGB_LEGACY.test(s) ||
|
|
3178
3279
|
RE_RGBA_LEGACY.test(s) ||
|
|
3179
|
-
RE_RGB_PCT_LEGACY.test(s) ||
|
|
3180
|
-
RE_RGBA_PCT_LEGACY.test(s) ||
|
|
3181
3280
|
RE_HSL_LEGACY.test(s) ||
|
|
3182
|
-
RE_HSLA_LEGACY.test(s)
|
|
3281
|
+
RE_HSLA_LEGACY.test(s) ||
|
|
3282
|
+
s === 'transparent'
|
|
3183
3283
|
);
|
|
3184
3284
|
};
|
|
3185
3285
|
|
|
@@ -3345,10 +3445,11 @@ Object.assign(chroma, {
|
|
|
3345
3445
|
average,
|
|
3346
3446
|
bezier: bezier$1,
|
|
3347
3447
|
blend,
|
|
3348
|
-
brewer:
|
|
3448
|
+
brewer: colorbrewerProxy,
|
|
3349
3449
|
Color,
|
|
3350
3450
|
colors: w3cx11,
|
|
3351
3451
|
contrast,
|
|
3452
|
+
contrastAPCA,
|
|
3352
3453
|
cubehelix,
|
|
3353
3454
|
deltaE,
|
|
3354
3455
|
distance,
|
|
@@ -3555,14 +3656,256 @@ function computeColorValues(color) {
|
|
|
3555
3656
|
}
|
|
3556
3657
|
}
|
|
3557
3658
|
|
|
3558
|
-
function r$1(...
|
|
3659
|
+
function r$1(...n){return types_index.u(Object.values,n)}
|
|
3559
3660
|
|
|
3560
3661
|
function i(...e){return types_index.u(r,e)}var r=(e,t)=>e.length>=t;
|
|
3561
3662
|
|
|
3663
|
+
function o(r,n){let e=Math.ceil(r),t=Math.floor(n);if(t<e)throw new RangeError(`randomInteger: The range [${r.toString()},${n.toString()}] contains no integer`);return Math.floor(Math.random()*(t-e+1)+e)}
|
|
3664
|
+
|
|
3562
3665
|
function t(r){return typeof r=="string"}
|
|
3563
3666
|
|
|
3564
3667
|
function n(e){return !!e}
|
|
3565
3668
|
|
|
3669
|
+
function getId(element) {
|
|
3670
|
+
return t(element) ? element : element.id;
|
|
3671
|
+
}
|
|
3672
|
+
|
|
3673
|
+
class LikeC4DiagramModel {
|
|
3674
|
+
constructor(view, model) {
|
|
3675
|
+
this.view = view;
|
|
3676
|
+
this.model = model;
|
|
3677
|
+
for (const node of view.nodes) {
|
|
3678
|
+
const el = new LikeC4DiagramModel.Element(node, this);
|
|
3679
|
+
this._elements.set(node.id, el);
|
|
3680
|
+
if (types_index.e(node.parent)) {
|
|
3681
|
+
this._rootElements.add(el);
|
|
3682
|
+
}
|
|
3683
|
+
}
|
|
3684
|
+
this._connections = new Map(view.edges.map((e) => [e.id, new LikeC4DiagramModel.Connection(e, this)]));
|
|
3685
|
+
}
|
|
3686
|
+
_rootElements = /* @__PURE__ */ new Set();
|
|
3687
|
+
_elements = /* @__PURE__ */ new Map();
|
|
3688
|
+
_connections;
|
|
3689
|
+
get isDynamic() {
|
|
3690
|
+
return this.view.__ === "dynamic";
|
|
3691
|
+
}
|
|
3692
|
+
get id() {
|
|
3693
|
+
return this.view.id;
|
|
3694
|
+
}
|
|
3695
|
+
get title() {
|
|
3696
|
+
return this.view.title;
|
|
3697
|
+
}
|
|
3698
|
+
get viewOf() {
|
|
3699
|
+
if (types_index.e(this.view.__) || this.view.__ === "element") {
|
|
3700
|
+
const computedView = this.view;
|
|
3701
|
+
return computedView.viewOf ? this.model.element(computedView.viewOf) : null;
|
|
3702
|
+
}
|
|
3703
|
+
return null;
|
|
3704
|
+
}
|
|
3705
|
+
get tags() {
|
|
3706
|
+
return this.view.tags ?? [];
|
|
3707
|
+
}
|
|
3708
|
+
roots() {
|
|
3709
|
+
return [...this._rootElements];
|
|
3710
|
+
}
|
|
3711
|
+
elements() {
|
|
3712
|
+
return [...this._elements.values()];
|
|
3713
|
+
}
|
|
3714
|
+
element(id) {
|
|
3715
|
+
return types_index.nonNullable(this._elements.get(id), `LikeC4DiagramModel.Element ${id} in view ${this.view.id} not found`);
|
|
3716
|
+
}
|
|
3717
|
+
hasElement(id) {
|
|
3718
|
+
return this._elements.has(id);
|
|
3719
|
+
}
|
|
3720
|
+
connections() {
|
|
3721
|
+
return [...this._connections.values()];
|
|
3722
|
+
}
|
|
3723
|
+
connection(id) {
|
|
3724
|
+
return types_index.nonNullable(this._connections.get(id), `Connection ${id} in view ${this.view.id} not found`);
|
|
3725
|
+
}
|
|
3726
|
+
findConnections(source, target, direction = "direct") {
|
|
3727
|
+
const sourceId = getId(source);
|
|
3728
|
+
const targetId = getId(target);
|
|
3729
|
+
return this.connections().filter(
|
|
3730
|
+
(c) => c.source.id === sourceId && c.target.id === targetId || direction === "both" && c.source.id === targetId && c.target.id === sourceId
|
|
3731
|
+
);
|
|
3732
|
+
}
|
|
3733
|
+
parent(element) {
|
|
3734
|
+
const el = this.element(getId(element));
|
|
3735
|
+
return el.node.parent ? this.element(el.node.parent) : null;
|
|
3736
|
+
}
|
|
3737
|
+
children(element) {
|
|
3738
|
+
const el = this.element(getId(element));
|
|
3739
|
+
return el.node.children.map((c) => this.element(c));
|
|
3740
|
+
}
|
|
3741
|
+
// Get all sibling (i.e. same parent)
|
|
3742
|
+
siblings(element) {
|
|
3743
|
+
const id = getId(element);
|
|
3744
|
+
const parent = this.parent(id);
|
|
3745
|
+
const siblings = parent ? this.children(parent) : this.roots();
|
|
3746
|
+
return siblings.filter((e) => e.id !== id);
|
|
3747
|
+
}
|
|
3748
|
+
/**
|
|
3749
|
+
* Get all ancestor elements (i.e. parent, parent’s parent, etc.)
|
|
3750
|
+
* (from closest to root)
|
|
3751
|
+
*/
|
|
3752
|
+
ancestors(element) {
|
|
3753
|
+
let id = getId(element);
|
|
3754
|
+
const result = [];
|
|
3755
|
+
let parent;
|
|
3756
|
+
while (parent = this.parent(id)) {
|
|
3757
|
+
result.push(parent);
|
|
3758
|
+
id = parent.id;
|
|
3759
|
+
}
|
|
3760
|
+
return result;
|
|
3761
|
+
}
|
|
3762
|
+
descendants(element) {
|
|
3763
|
+
const children = this.children(element);
|
|
3764
|
+
return children.flatMap((c) => [c, ...this.descendants(c.id)]);
|
|
3765
|
+
}
|
|
3766
|
+
incoming(element, filter = "all") {
|
|
3767
|
+
const el = this.element(getId(element));
|
|
3768
|
+
const edges = el.node.inEdges.map((e) => this.connection(e));
|
|
3769
|
+
if (filter === "all" || edges.length === 0) {
|
|
3770
|
+
return edges;
|
|
3771
|
+
}
|
|
3772
|
+
return edges.filter((rel) => {
|
|
3773
|
+
if (filter === "direct") {
|
|
3774
|
+
return rel.target.id === el.id;
|
|
3775
|
+
}
|
|
3776
|
+
return rel.target.id !== el.id;
|
|
3777
|
+
});
|
|
3778
|
+
}
|
|
3779
|
+
incomers(element, filter = "all") {
|
|
3780
|
+
return this.incoming(element, filter).map((r) => r.source);
|
|
3781
|
+
}
|
|
3782
|
+
/**
|
|
3783
|
+
* Outgoing relationships from the element and its descendants
|
|
3784
|
+
*/
|
|
3785
|
+
outgoing(element, filter = "all") {
|
|
3786
|
+
const el = this.element(getId(element));
|
|
3787
|
+
const edges = el.node.outEdges.map((e) => this.connection(e));
|
|
3788
|
+
if (filter === "all" || edges.length === 0) {
|
|
3789
|
+
return edges;
|
|
3790
|
+
}
|
|
3791
|
+
return edges.filter((rel) => {
|
|
3792
|
+
if (filter === "direct") {
|
|
3793
|
+
return rel.source.id === el.id;
|
|
3794
|
+
}
|
|
3795
|
+
return rel.source.id !== el.id;
|
|
3796
|
+
});
|
|
3797
|
+
}
|
|
3798
|
+
outgoers(element, filter = "all") {
|
|
3799
|
+
return this.outgoing(element, filter).map((r) => r.target);
|
|
3800
|
+
}
|
|
3801
|
+
}
|
|
3802
|
+
((LikeC4DiagramModel2) => {
|
|
3803
|
+
class Element {
|
|
3804
|
+
constructor(node, view) {
|
|
3805
|
+
this.node = node;
|
|
3806
|
+
this.view = view;
|
|
3807
|
+
}
|
|
3808
|
+
get id() {
|
|
3809
|
+
return this.node.id;
|
|
3810
|
+
}
|
|
3811
|
+
get title() {
|
|
3812
|
+
return this.node.title;
|
|
3813
|
+
}
|
|
3814
|
+
get kind() {
|
|
3815
|
+
return this.node.kind;
|
|
3816
|
+
}
|
|
3817
|
+
get isRoot() {
|
|
3818
|
+
return types_index.e(this.node.parent);
|
|
3819
|
+
}
|
|
3820
|
+
get hasNested() {
|
|
3821
|
+
return this.node.children.length > 0;
|
|
3822
|
+
}
|
|
3823
|
+
get shape() {
|
|
3824
|
+
return this.node.shape;
|
|
3825
|
+
}
|
|
3826
|
+
get color() {
|
|
3827
|
+
return this.node.color;
|
|
3828
|
+
}
|
|
3829
|
+
get tags() {
|
|
3830
|
+
return this.node.tags ?? [];
|
|
3831
|
+
}
|
|
3832
|
+
get level() {
|
|
3833
|
+
return this.node.level;
|
|
3834
|
+
}
|
|
3835
|
+
get depth() {
|
|
3836
|
+
return this.node.depth ?? 0;
|
|
3837
|
+
}
|
|
3838
|
+
model() {
|
|
3839
|
+
return this.view.model.element(this.id);
|
|
3840
|
+
}
|
|
3841
|
+
parent() {
|
|
3842
|
+
return this.node.parent ? this.view.element(this.node.parent) : null;
|
|
3843
|
+
}
|
|
3844
|
+
metadata(key, defaultValue) {
|
|
3845
|
+
return this.model().metadata(key) ?? defaultValue;
|
|
3846
|
+
}
|
|
3847
|
+
hasMetadata(key) {
|
|
3848
|
+
return this.model().hasMetadata(key);
|
|
3849
|
+
}
|
|
3850
|
+
ancestors() {
|
|
3851
|
+
return this.view.ancestors(this);
|
|
3852
|
+
}
|
|
3853
|
+
siblings() {
|
|
3854
|
+
return this.view.siblings(this);
|
|
3855
|
+
}
|
|
3856
|
+
descendants() {
|
|
3857
|
+
return this.view.descendants(this);
|
|
3858
|
+
}
|
|
3859
|
+
children() {
|
|
3860
|
+
return this.view.children(this);
|
|
3861
|
+
}
|
|
3862
|
+
incoming(filter = "all") {
|
|
3863
|
+
return this.view.incoming(this, filter);
|
|
3864
|
+
}
|
|
3865
|
+
incomers(filter = "all") {
|
|
3866
|
+
return this.view.incomers(this, filter);
|
|
3867
|
+
}
|
|
3868
|
+
outgoing(filter = "all") {
|
|
3869
|
+
return this.view.outgoing(this, filter);
|
|
3870
|
+
}
|
|
3871
|
+
outgoers(filter = "all") {
|
|
3872
|
+
return this.view.outgoers(this, filter);
|
|
3873
|
+
}
|
|
3874
|
+
connectionsTo(target) {
|
|
3875
|
+
return this.view.findConnections(this, target);
|
|
3876
|
+
}
|
|
3877
|
+
}
|
|
3878
|
+
LikeC4DiagramModel2.Element = Element;
|
|
3879
|
+
class Connection {
|
|
3880
|
+
constructor(edge, view) {
|
|
3881
|
+
this.edge = edge;
|
|
3882
|
+
this.view = view;
|
|
3883
|
+
}
|
|
3884
|
+
get id() {
|
|
3885
|
+
return this.edge.id;
|
|
3886
|
+
}
|
|
3887
|
+
get source() {
|
|
3888
|
+
return this.view.element(this.edge.source);
|
|
3889
|
+
}
|
|
3890
|
+
get target() {
|
|
3891
|
+
return this.view.element(this.edge.target);
|
|
3892
|
+
}
|
|
3893
|
+
get tags() {
|
|
3894
|
+
return this.edge.tags ?? [];
|
|
3895
|
+
}
|
|
3896
|
+
get color() {
|
|
3897
|
+
return this.edge.color ?? types_index.DefaultRelationshipColor;
|
|
3898
|
+
}
|
|
3899
|
+
/**
|
|
3900
|
+
* Model relationships
|
|
3901
|
+
*/
|
|
3902
|
+
relationships() {
|
|
3903
|
+
return this.edge.relations.map((r) => types_index.nonNullable(this.view.model.relationship(r)));
|
|
3904
|
+
}
|
|
3905
|
+
}
|
|
3906
|
+
LikeC4DiagramModel2.Connection = Connection;
|
|
3907
|
+
})(LikeC4DiagramModel || (LikeC4DiagramModel = {}));
|
|
3908
|
+
|
|
3566
3909
|
function getDefaultExportFromCjs (x) {
|
|
3567
3910
|
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
|
3568
3911
|
}
|
|
@@ -3760,16 +4103,16 @@ class LikeC4ViewModel {
|
|
|
3760
4103
|
this.model = model;
|
|
3761
4104
|
for (const node of view.nodes) {
|
|
3762
4105
|
const el = new LikeC4ViewModel.Element(node, this);
|
|
3763
|
-
this
|
|
4106
|
+
this._elements.set(node.id, el);
|
|
3764
4107
|
if (types_index.e(node.parent)) {
|
|
3765
|
-
this
|
|
4108
|
+
this._rootElements.add(el);
|
|
3766
4109
|
}
|
|
3767
4110
|
}
|
|
3768
|
-
this
|
|
4111
|
+
this._connections = new Map(view.edges.map((e) => [e.id, new LikeC4ViewModel.Connection(e, this)]));
|
|
3769
4112
|
}
|
|
3770
|
-
|
|
3771
|
-
|
|
3772
|
-
|
|
4113
|
+
_rootElements = /* @__PURE__ */ new Set();
|
|
4114
|
+
_elements = /* @__PURE__ */ new Map();
|
|
4115
|
+
_connections;
|
|
3773
4116
|
get id() {
|
|
3774
4117
|
return this.view.id;
|
|
3775
4118
|
}
|
|
@@ -3786,41 +4129,41 @@ class LikeC4ViewModel {
|
|
|
3786
4129
|
return this.view.tags ?? [];
|
|
3787
4130
|
}
|
|
3788
4131
|
roots() {
|
|
3789
|
-
return [...this
|
|
4132
|
+
return [...this._rootElements];
|
|
3790
4133
|
}
|
|
3791
4134
|
elements() {
|
|
3792
|
-
return [...this
|
|
4135
|
+
return [...this._elements.values()];
|
|
3793
4136
|
}
|
|
3794
4137
|
element(id) {
|
|
3795
|
-
return types_index.nonNullable(this
|
|
4138
|
+
return types_index.nonNullable(this._elements.get(id), `LikeC4ViewModel.Element ${id} in view ${this.id} not found`);
|
|
3796
4139
|
}
|
|
3797
4140
|
hasElement(id) {
|
|
3798
|
-
return this
|
|
4141
|
+
return this._elements.has(id);
|
|
3799
4142
|
}
|
|
3800
4143
|
connections() {
|
|
3801
|
-
return [...this
|
|
4144
|
+
return [...this._connections.values()];
|
|
3802
4145
|
}
|
|
3803
4146
|
connection(id) {
|
|
3804
|
-
return types_index.nonNullable(this
|
|
4147
|
+
return types_index.nonNullable(this._connections.get(id), `Connection ${id} in view ${this.id} not found`);
|
|
3805
4148
|
}
|
|
3806
4149
|
findConnections(source, target, direction = "direct") {
|
|
3807
|
-
const sourceId =
|
|
3808
|
-
const targetId =
|
|
4150
|
+
const sourceId = getId(source);
|
|
4151
|
+
const targetId = getId(target);
|
|
3809
4152
|
return this.connections().filter(
|
|
3810
4153
|
(c) => c.source.id === sourceId && c.target.id === targetId || direction === "both" && c.source.id === targetId && c.target.id === sourceId
|
|
3811
4154
|
);
|
|
3812
4155
|
}
|
|
3813
4156
|
parent(element) {
|
|
3814
|
-
const el = this.element(
|
|
4157
|
+
const el = this.element(getId(element));
|
|
3815
4158
|
return el.node.parent ? this.element(el.node.parent) : null;
|
|
3816
4159
|
}
|
|
3817
4160
|
children(element) {
|
|
3818
|
-
const el = this.element(
|
|
4161
|
+
const el = this.element(getId(element));
|
|
3819
4162
|
return el.node.children.map((c) => this.element(c));
|
|
3820
4163
|
}
|
|
3821
4164
|
// Get all sibling (i.e. same parent)
|
|
3822
4165
|
siblings(element) {
|
|
3823
|
-
const id =
|
|
4166
|
+
const id = getId(element);
|
|
3824
4167
|
const parent = this.parent(id);
|
|
3825
4168
|
const siblings = parent ? this.children(parent) : this.roots();
|
|
3826
4169
|
return siblings.filter((e) => e.id !== id);
|
|
@@ -3830,7 +4173,7 @@ class LikeC4ViewModel {
|
|
|
3830
4173
|
* (from closest to root)
|
|
3831
4174
|
*/
|
|
3832
4175
|
ancestors(element) {
|
|
3833
|
-
let id =
|
|
4176
|
+
let id = getId(element);
|
|
3834
4177
|
const result = [];
|
|
3835
4178
|
let parent;
|
|
3836
4179
|
while (parent = this.parent(id)) {
|
|
@@ -3844,8 +4187,8 @@ class LikeC4ViewModel {
|
|
|
3844
4187
|
return children.flatMap((c) => [c, ...this.descendants(c.id)]);
|
|
3845
4188
|
}
|
|
3846
4189
|
incoming(element, filter = "all") {
|
|
3847
|
-
const el = this.element(
|
|
3848
|
-
const edges = el.node.inEdges.map((e) => types_index.nonNullable(this
|
|
4190
|
+
const el = this.element(getId(element));
|
|
4191
|
+
const edges = el.node.inEdges.map((e) => types_index.nonNullable(this._connections.get(e), `Edge ${e} not found`));
|
|
3849
4192
|
if (filter === "all" || edges.length === 0) {
|
|
3850
4193
|
return edges;
|
|
3851
4194
|
}
|
|
@@ -3863,8 +4206,8 @@ class LikeC4ViewModel {
|
|
|
3863
4206
|
* Outgoing relationships from the element and its descendants
|
|
3864
4207
|
*/
|
|
3865
4208
|
outgoing(element, filter = "all") {
|
|
3866
|
-
const el = this.element(
|
|
3867
|
-
const edges = el.node.outEdges.map((e) => types_index.nonNullable(this
|
|
4209
|
+
const el = this.element(getId(element));
|
|
4210
|
+
const edges = el.node.outEdges.map((e) => types_index.nonNullable(this._connections.get(e), `Edge ${e} not found`));
|
|
3868
4211
|
if (filter === "all" || edges.length === 0) {
|
|
3869
4212
|
return edges;
|
|
3870
4213
|
}
|
|
@@ -3977,103 +4320,126 @@ class LikeC4ViewModel {
|
|
|
3977
4320
|
LikeC4ViewModel2.Connection = Connection;
|
|
3978
4321
|
})(LikeC4ViewModel || (LikeC4ViewModel = {}));
|
|
3979
4322
|
|
|
3980
|
-
const RelationsSet = Set;
|
|
3981
|
-
const MapRelations = Map;
|
|
3982
4323
|
class LikeC4Model {
|
|
3983
|
-
constructor(
|
|
3984
|
-
this.
|
|
3985
|
-
|
|
4324
|
+
constructor(type, sourcemodel, elements, relations) {
|
|
4325
|
+
this.type = type;
|
|
4326
|
+
this.sourcemodel = sourcemodel;
|
|
4327
|
+
for (const el of elements) {
|
|
3986
4328
|
this.addElement(el);
|
|
3987
4329
|
}
|
|
3988
|
-
for (const rel of
|
|
4330
|
+
for (const rel of relations) {
|
|
3989
4331
|
this.addRelation(rel);
|
|
3990
4332
|
}
|
|
3991
|
-
this.#views = new Map(
|
|
3992
|
-
r$1(computed.views).map((v) => [v.id, new LikeC4ViewModel(v, this)])
|
|
3993
|
-
);
|
|
3994
4333
|
}
|
|
3995
|
-
|
|
4334
|
+
_elements = /* @__PURE__ */ new Map();
|
|
3996
4335
|
// Parent element for given FQN
|
|
3997
|
-
|
|
4336
|
+
_parents = /* @__PURE__ */ new Map();
|
|
3998
4337
|
// Children elements for given FQN
|
|
3999
|
-
|
|
4000
|
-
|
|
4001
|
-
|
|
4338
|
+
_children = /* @__PURE__ */ new Map();
|
|
4339
|
+
_rootElements = /* @__PURE__ */ new Set();
|
|
4340
|
+
_relations = /* @__PURE__ */ new Map();
|
|
4002
4341
|
// Incoming to an element or its descendants
|
|
4003
|
-
|
|
4342
|
+
_incoming = /* @__PURE__ */ new Map();
|
|
4004
4343
|
// Outgoing from an element or its descendants
|
|
4005
|
-
|
|
4344
|
+
_outgoing = /* @__PURE__ */ new Map();
|
|
4006
4345
|
// Relationships inside the element, among descendants
|
|
4007
|
-
|
|
4008
|
-
|
|
4009
|
-
|
|
4010
|
-
static
|
|
4011
|
-
|
|
4346
|
+
_internal = /* @__PURE__ */ new Map();
|
|
4347
|
+
_cacheAscendingSiblings = /* @__PURE__ */ new Map();
|
|
4348
|
+
_views = /* @__PURE__ */ new Map();
|
|
4349
|
+
static create(source) {
|
|
4350
|
+
if (source.__ === "layouted") {
|
|
4351
|
+
return LikeC4Model.layouted(source);
|
|
4352
|
+
}
|
|
4353
|
+
return LikeC4Model.computed(source);
|
|
4354
|
+
}
|
|
4355
|
+
static computed(source) {
|
|
4356
|
+
const instance = new LikeC4Model(
|
|
4357
|
+
"computed",
|
|
4358
|
+
source,
|
|
4359
|
+
r$1(source.elements),
|
|
4360
|
+
r$1(source.relations)
|
|
4361
|
+
);
|
|
4362
|
+
for (const view of r$1(source.views)) {
|
|
4363
|
+
instance._views.set(view.id, new LikeC4ViewModel(view, instance));
|
|
4364
|
+
}
|
|
4365
|
+
return instance;
|
|
4366
|
+
}
|
|
4367
|
+
static layouted(source) {
|
|
4368
|
+
const instance = new LikeC4Model(
|
|
4369
|
+
"layouted",
|
|
4370
|
+
source,
|
|
4371
|
+
r$1(source.elements),
|
|
4372
|
+
r$1(source.relations)
|
|
4373
|
+
);
|
|
4374
|
+
for (const view of r$1(source.views)) {
|
|
4375
|
+
instance._views.set(view.id, new LikeC4DiagramModel(view, instance));
|
|
4376
|
+
}
|
|
4377
|
+
return instance;
|
|
4012
4378
|
}
|
|
4013
4379
|
/**
|
|
4014
4380
|
* Returns the root elements of the model.
|
|
4015
4381
|
*/
|
|
4016
4382
|
roots() {
|
|
4017
|
-
return [...this
|
|
4383
|
+
return [...this._rootElements];
|
|
4018
4384
|
}
|
|
4019
4385
|
/**
|
|
4020
4386
|
* Returns all elements in the model.
|
|
4021
4387
|
*/
|
|
4022
4388
|
elements() {
|
|
4023
|
-
return [...this
|
|
4389
|
+
return [...this._elements.values()];
|
|
4024
4390
|
}
|
|
4025
4391
|
/**
|
|
4026
4392
|
* Returns a specific element by its FQN.
|
|
4027
4393
|
*/
|
|
4028
4394
|
element(id) {
|
|
4029
|
-
return types_index.nonNullable(this
|
|
4395
|
+
return types_index.nonNullable(this._elements.get(id), `Element ${id} not found`);
|
|
4030
4396
|
}
|
|
4031
4397
|
/**
|
|
4032
4398
|
* Returns all relationships in the model.
|
|
4033
4399
|
*/
|
|
4034
4400
|
relationships() {
|
|
4035
|
-
return [...this
|
|
4401
|
+
return [...this._relations.values()];
|
|
4036
4402
|
}
|
|
4037
4403
|
/**
|
|
4038
4404
|
* Returns a specific relationship by its ID.
|
|
4039
4405
|
*/
|
|
4040
4406
|
relationship(id) {
|
|
4041
|
-
return types_index.nonNullable(this
|
|
4407
|
+
return types_index.nonNullable(this._relations.get(id), `Relation ${id} not found`);
|
|
4042
4408
|
}
|
|
4043
4409
|
/**
|
|
4044
4410
|
* Returns all views in the model.
|
|
4045
4411
|
*/
|
|
4046
4412
|
views() {
|
|
4047
|
-
return [...this
|
|
4413
|
+
return [...this._views.values()];
|
|
4048
4414
|
}
|
|
4049
4415
|
/**
|
|
4050
4416
|
* Returns a specific view by its ID.
|
|
4051
4417
|
*/
|
|
4052
4418
|
view(viewId) {
|
|
4053
|
-
return types_index.nonNullable(this
|
|
4419
|
+
return types_index.nonNullable(this._views.get(viewId), `View ${viewId} not found`);
|
|
4054
4420
|
}
|
|
4055
4421
|
/**
|
|
4056
4422
|
* Returns the parent element of given element.
|
|
4057
4423
|
* @see ancestors
|
|
4058
4424
|
*/
|
|
4059
4425
|
parent(element) {
|
|
4060
|
-
const id =
|
|
4061
|
-
return this
|
|
4426
|
+
const id = getId(element);
|
|
4427
|
+
return this._parents.get(id) || null;
|
|
4062
4428
|
}
|
|
4063
4429
|
/**
|
|
4064
4430
|
* Get all children of the element (only direct children),
|
|
4065
4431
|
* @see descendants
|
|
4066
4432
|
*/
|
|
4067
4433
|
children(element) {
|
|
4068
|
-
const id =
|
|
4434
|
+
const id = getId(element);
|
|
4069
4435
|
return this._childrenOf(id);
|
|
4070
4436
|
}
|
|
4071
4437
|
/**
|
|
4072
4438
|
* Get all sibling (i.e. same parent)
|
|
4073
4439
|
*/
|
|
4074
4440
|
siblings(element) {
|
|
4075
|
-
const id =
|
|
4076
|
-
const parent = this
|
|
4441
|
+
const id = getId(element);
|
|
4442
|
+
const parent = this._parents.get(id);
|
|
4077
4443
|
const siblings = parent ? this._childrenOf(parent.id) : this.roots();
|
|
4078
4444
|
return siblings.filter((e) => e.id !== id);
|
|
4079
4445
|
}
|
|
@@ -4085,7 +4451,7 @@ class LikeC4Model {
|
|
|
4085
4451
|
let id = t(element) ? element : element.id;
|
|
4086
4452
|
const result = [];
|
|
4087
4453
|
let parent;
|
|
4088
|
-
while (parent = this
|
|
4454
|
+
while (parent = this._parents.get(id)) {
|
|
4089
4455
|
result.push(parent);
|
|
4090
4456
|
id = parent.id;
|
|
4091
4457
|
}
|
|
@@ -4095,7 +4461,7 @@ class LikeC4Model {
|
|
|
4095
4461
|
* Get all descendant elements (i.e. children, children’s children, etc.)
|
|
4096
4462
|
*/
|
|
4097
4463
|
descendants(element) {
|
|
4098
|
-
const id =
|
|
4464
|
+
const id = getId(element);
|
|
4099
4465
|
const children = this._childrenOf(id);
|
|
4100
4466
|
return children.flatMap((c) => [c, ...this.descendants(c.id)]);
|
|
4101
4467
|
}
|
|
@@ -4104,7 +4470,7 @@ class LikeC4Model {
|
|
|
4104
4470
|
* @see incomers
|
|
4105
4471
|
*/
|
|
4106
4472
|
incoming(element, filter = "all") {
|
|
4107
|
-
const id =
|
|
4473
|
+
const id = getId(element);
|
|
4108
4474
|
const incoming = Array.from(this._incomingTo(id));
|
|
4109
4475
|
if (filter === "all" || incoming.length === 0) {
|
|
4110
4476
|
return incoming;
|
|
@@ -4127,7 +4493,7 @@ class LikeC4Model {
|
|
|
4127
4493
|
* @see outgoers
|
|
4128
4494
|
*/
|
|
4129
4495
|
outgoing(element, filter = "all") {
|
|
4130
|
-
const id =
|
|
4496
|
+
const id = getId(element);
|
|
4131
4497
|
const outgoing = Array.from(this._outgoingFrom(id));
|
|
4132
4498
|
if (filter === "all" || outgoing.length === 0) {
|
|
4133
4499
|
return outgoing;
|
|
@@ -4149,7 +4515,7 @@ class LikeC4Model {
|
|
|
4149
4515
|
* Relationships inside the element, among descendants
|
|
4150
4516
|
*/
|
|
4151
4517
|
internal(element) {
|
|
4152
|
-
const id =
|
|
4518
|
+
const id = getId(element);
|
|
4153
4519
|
return Array.from(this._internalOf(id));
|
|
4154
4520
|
}
|
|
4155
4521
|
/**
|
|
@@ -4157,14 +4523,14 @@ class LikeC4Model {
|
|
|
4157
4523
|
* (from closest to root)
|
|
4158
4524
|
*/
|
|
4159
4525
|
ascendingSiblings(element) {
|
|
4160
|
-
const id =
|
|
4161
|
-
let siblings = this
|
|
4526
|
+
const id = getId(element);
|
|
4527
|
+
let siblings = this._cacheAscendingSiblings.get(id);
|
|
4162
4528
|
if (!siblings) {
|
|
4163
4529
|
siblings = [
|
|
4164
4530
|
...this.siblings(id),
|
|
4165
4531
|
...this.ancestors(id).flatMap((a) => this.siblings(a.id))
|
|
4166
4532
|
];
|
|
4167
|
-
this
|
|
4533
|
+
this._cacheAscendingSiblings.set(id, siblings);
|
|
4168
4534
|
}
|
|
4169
4535
|
return siblings.slice();
|
|
4170
4536
|
}
|
|
@@ -4172,29 +4538,29 @@ class LikeC4Model {
|
|
|
4172
4538
|
* Resolve all views that contain the element
|
|
4173
4539
|
*/
|
|
4174
4540
|
viewsWithElement(element) {
|
|
4175
|
-
const id =
|
|
4176
|
-
return [...this
|
|
4541
|
+
const id = getId(element);
|
|
4542
|
+
return [...this._views.values()].filter((v) => v.hasElement(id));
|
|
4177
4543
|
}
|
|
4178
4544
|
addElement(parsed) {
|
|
4179
|
-
if (this
|
|
4545
|
+
if (this._elements.has(parsed.id)) {
|
|
4180
4546
|
throw new Error(`Element ${parsed.id} already exists`);
|
|
4181
4547
|
}
|
|
4182
|
-
const el = new LikeC4Model.
|
|
4183
|
-
this
|
|
4548
|
+
const el = new LikeC4Model.ElementModel(parsed, this);
|
|
4549
|
+
this._elements.set(el.id, el);
|
|
4184
4550
|
const parentId = parentFqn(el.id);
|
|
4185
4551
|
if (parentId) {
|
|
4186
|
-
this
|
|
4552
|
+
this._parents.set(el.id, this.element(parentId));
|
|
4187
4553
|
this._childrenOf(parentId).push(el);
|
|
4188
4554
|
} else {
|
|
4189
|
-
this
|
|
4555
|
+
this._rootElements.add(el);
|
|
4190
4556
|
}
|
|
4191
4557
|
}
|
|
4192
4558
|
addRelation(relation) {
|
|
4193
|
-
if (this
|
|
4559
|
+
if (this._relations.has(relation.id)) {
|
|
4194
4560
|
throw new Error(`Relation ${relation.id} already exists`);
|
|
4195
4561
|
}
|
|
4196
4562
|
const rel = new LikeC4Model.Relationship(relation, this);
|
|
4197
|
-
this
|
|
4563
|
+
this._relations.set(rel.id, rel);
|
|
4198
4564
|
this._incomingTo(relation.target).add(rel);
|
|
4199
4565
|
this._outgoingFrom(relation.source).add(rel);
|
|
4200
4566
|
const relParent = commonAncestor(relation.source, relation.target);
|
|
@@ -4217,40 +4583,85 @@ class LikeC4Model {
|
|
|
4217
4583
|
}
|
|
4218
4584
|
}
|
|
4219
4585
|
_childrenOf(id) {
|
|
4220
|
-
let children = this
|
|
4586
|
+
let children = this._children.get(id);
|
|
4221
4587
|
if (!children) {
|
|
4222
4588
|
children = [];
|
|
4223
|
-
this
|
|
4589
|
+
this._children.set(id, children);
|
|
4224
4590
|
}
|
|
4225
4591
|
return children;
|
|
4226
4592
|
}
|
|
4227
4593
|
_incomingTo(id) {
|
|
4228
|
-
let incoming = this
|
|
4594
|
+
let incoming = this._incoming.get(id);
|
|
4229
4595
|
if (!incoming) {
|
|
4230
|
-
incoming = new
|
|
4231
|
-
this
|
|
4596
|
+
incoming = /* @__PURE__ */ new Set();
|
|
4597
|
+
this._incoming.set(id, incoming);
|
|
4232
4598
|
}
|
|
4233
4599
|
return incoming;
|
|
4234
4600
|
}
|
|
4235
4601
|
_outgoingFrom(id) {
|
|
4236
|
-
let outgoing = this
|
|
4602
|
+
let outgoing = this._outgoing.get(id);
|
|
4237
4603
|
if (!outgoing) {
|
|
4238
|
-
outgoing = new
|
|
4239
|
-
this
|
|
4604
|
+
outgoing = /* @__PURE__ */ new Set();
|
|
4605
|
+
this._outgoing.set(id, outgoing);
|
|
4240
4606
|
}
|
|
4241
4607
|
return outgoing;
|
|
4242
4608
|
}
|
|
4243
4609
|
_internalOf(id) {
|
|
4244
|
-
let internal = this
|
|
4610
|
+
let internal = this._internal.get(id);
|
|
4245
4611
|
if (!internal) {
|
|
4246
|
-
internal = new
|
|
4247
|
-
this
|
|
4612
|
+
internal = /* @__PURE__ */ new Set();
|
|
4613
|
+
this._internal.set(id, internal);
|
|
4248
4614
|
}
|
|
4249
4615
|
return internal;
|
|
4250
4616
|
}
|
|
4251
4617
|
}
|
|
4252
4618
|
((LikeC4Model2) => {
|
|
4253
|
-
|
|
4619
|
+
function isModel(model) {
|
|
4620
|
+
return model instanceof LikeC4Model2;
|
|
4621
|
+
}
|
|
4622
|
+
LikeC4Model2.isModel = isModel;
|
|
4623
|
+
((ViewModel2) => {
|
|
4624
|
+
function isLayouted2(model) {
|
|
4625
|
+
return model instanceof LikeC4DiagramModel;
|
|
4626
|
+
}
|
|
4627
|
+
ViewModel2.isLayouted = isLayouted2;
|
|
4628
|
+
})(LikeC4Model2.ViewModel || (LikeC4Model2.ViewModel = {}));
|
|
4629
|
+
function isLayouted(model) {
|
|
4630
|
+
return model.type === "layouted";
|
|
4631
|
+
}
|
|
4632
|
+
LikeC4Model2.isLayouted = isLayouted;
|
|
4633
|
+
class Relationship {
|
|
4634
|
+
constructor(relationship, model) {
|
|
4635
|
+
this.relationship = relationship;
|
|
4636
|
+
this.model = model;
|
|
4637
|
+
}
|
|
4638
|
+
get id() {
|
|
4639
|
+
return this.relationship.id;
|
|
4640
|
+
}
|
|
4641
|
+
get title() {
|
|
4642
|
+
return this.relationship.title;
|
|
4643
|
+
}
|
|
4644
|
+
get kind() {
|
|
4645
|
+
return this.relationship.kind ?? null;
|
|
4646
|
+
}
|
|
4647
|
+
get tags() {
|
|
4648
|
+
return this.relationship.tags ?? [];
|
|
4649
|
+
}
|
|
4650
|
+
get source() {
|
|
4651
|
+
return this.model.element(this.relationship.source);
|
|
4652
|
+
}
|
|
4653
|
+
get target() {
|
|
4654
|
+
return this.model.element(this.relationship.target);
|
|
4655
|
+
}
|
|
4656
|
+
metadata(key, defaultValue) {
|
|
4657
|
+
return this.relationship.metadata?.[key] ?? defaultValue;
|
|
4658
|
+
}
|
|
4659
|
+
hasMetadata(key) {
|
|
4660
|
+
return n(this.relationship.metadata?.[key]);
|
|
4661
|
+
}
|
|
4662
|
+
}
|
|
4663
|
+
LikeC4Model2.Relationship = Relationship;
|
|
4664
|
+
class ElementModel {
|
|
4254
4665
|
constructor(element, model) {
|
|
4255
4666
|
this.element = element;
|
|
4256
4667
|
this.model = model;
|
|
@@ -4325,46 +4736,21 @@ class LikeC4Model {
|
|
|
4325
4736
|
// return
|
|
4326
4737
|
// }
|
|
4327
4738
|
}
|
|
4328
|
-
LikeC4Model2.
|
|
4329
|
-
class Relationship {
|
|
4330
|
-
constructor(relationship, model) {
|
|
4331
|
-
this.relationship = relationship;
|
|
4332
|
-
this.model = model;
|
|
4333
|
-
}
|
|
4334
|
-
get id() {
|
|
4335
|
-
return this.relationship.id;
|
|
4336
|
-
}
|
|
4337
|
-
get title() {
|
|
4338
|
-
return this.relationship.title;
|
|
4339
|
-
}
|
|
4340
|
-
get kind() {
|
|
4341
|
-
return this.relationship.kind ?? null;
|
|
4342
|
-
}
|
|
4343
|
-
get tags() {
|
|
4344
|
-
return this.relationship.tags ?? [];
|
|
4345
|
-
}
|
|
4346
|
-
get source() {
|
|
4347
|
-
return this.model.element(this.relationship.source);
|
|
4348
|
-
}
|
|
4349
|
-
get target() {
|
|
4350
|
-
return this.model.element(this.relationship.target);
|
|
4351
|
-
}
|
|
4352
|
-
metadata(key, defaultValue) {
|
|
4353
|
-
return this.relationship.metadata?.[key] ?? defaultValue;
|
|
4354
|
-
}
|
|
4355
|
-
hasMetadata(key) {
|
|
4356
|
-
return n(this.relationship.metadata?.[key]);
|
|
4357
|
-
}
|
|
4358
|
-
}
|
|
4359
|
-
LikeC4Model2.Relationship = Relationship;
|
|
4739
|
+
LikeC4Model2.ElementModel = ElementModel;
|
|
4360
4740
|
})(LikeC4Model || (LikeC4Model = {}));
|
|
4361
4741
|
|
|
4362
4742
|
const DELAY = "LIKEC4_DELAY";
|
|
4363
|
-
function delay(
|
|
4743
|
+
function delay(...args) {
|
|
4744
|
+
let ms = 100;
|
|
4745
|
+
if (args.length === 2) {
|
|
4746
|
+
ms = o(args[0], args[1]);
|
|
4747
|
+
} else if (args.length === 1) {
|
|
4748
|
+
ms = args[0];
|
|
4749
|
+
}
|
|
4364
4750
|
return new Promise((resolve) => {
|
|
4365
4751
|
setTimeout(() => {
|
|
4366
4752
|
resolve(DELAY);
|
|
4367
|
-
}, ms);
|
|
4753
|
+
}, ms ?? 100);
|
|
4368
4754
|
});
|
|
4369
4755
|
}
|
|
4370
4756
|
|
|
@@ -4441,6 +4827,7 @@ exports.nonNullable = types_index.nonNullable;
|
|
|
4441
4827
|
exports.nonexhaustive = types_index.nonexhaustive;
|
|
4442
4828
|
exports.whereOperatorAsPredicate = types_index.whereOperatorAsPredicate;
|
|
4443
4829
|
exports.ElementColors = ElementColors;
|
|
4830
|
+
exports.LikeC4DiagramModel = LikeC4DiagramModel;
|
|
4444
4831
|
exports.LikeC4Model = LikeC4Model;
|
|
4445
4832
|
exports.LikeC4ViewModel = LikeC4ViewModel;
|
|
4446
4833
|
exports.RelationshipColors = RelationshipColors;
|