@likec4/config 1.46.4 → 1.48.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/LICENSE +1 -1
- package/dist/_chunks/libs/remeda.mjs +31 -0
- package/dist/index.d.mts +324 -2217
- package/dist/index.mjs +407 -1
- package/dist/node/index.d.mts +504 -12
- package/dist/node/index.mjs +472 -51
- package/package.json +20 -22
- package/schema.json +88 -84
- package/src/define-config.ts +4 -9
- package/src/filenames.ts +2 -0
- package/src/node/index.ts +39 -1
- package/src/node/load-config.ts +7 -6
- package/src/schema.image-alias.ts +1 -1
- package/src/schema.include.ts +4 -4
- package/src/schema.theme.ts +98 -51
- package/src/schema.ts +16 -7
- package/dist/shared/config.CUC_rqhf.mjs +0 -376
- package/src/logger.ts +0 -3
package/schema.json
CHANGED
|
@@ -84,7 +84,8 @@
|
|
|
84
84
|
},
|
|
85
85
|
"required": [
|
|
86
86
|
"paths"
|
|
87
|
-
]
|
|
87
|
+
],
|
|
88
|
+
"additionalProperties": false
|
|
88
89
|
},
|
|
89
90
|
"StylesConfiguration": {
|
|
90
91
|
"id": "StylesConfiguration",
|
|
@@ -96,6 +97,9 @@
|
|
|
96
97
|
},
|
|
97
98
|
"defaults": {
|
|
98
99
|
"$ref": "#/$defs/DefaultStyleValues"
|
|
100
|
+
},
|
|
101
|
+
"customCss": {
|
|
102
|
+
"$ref": "#/$defs/CustomStylesheets"
|
|
99
103
|
}
|
|
100
104
|
},
|
|
101
105
|
"additionalProperties": false
|
|
@@ -117,55 +121,13 @@
|
|
|
117
121
|
"ThemeColors": {
|
|
118
122
|
"id": "ThemeColors",
|
|
119
123
|
"description": "Override theme colors",
|
|
120
|
-
"
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
"$ref": "#/$defs/ThemeColorValues"
|
|
128
|
-
}
|
|
129
|
-
},
|
|
130
|
-
{
|
|
131
|
-
"type": "object",
|
|
132
|
-
"properties": {
|
|
133
|
-
"amber": {
|
|
134
|
-
"$ref": "#/$defs/ThemeColorValues"
|
|
135
|
-
},
|
|
136
|
-
"blue": {
|
|
137
|
-
"$ref": "#/$defs/ThemeColorValues"
|
|
138
|
-
},
|
|
139
|
-
"gray": {
|
|
140
|
-
"$ref": "#/$defs/ThemeColorValues"
|
|
141
|
-
},
|
|
142
|
-
"slate": {
|
|
143
|
-
"$ref": "#/$defs/ThemeColorValues"
|
|
144
|
-
},
|
|
145
|
-
"green": {
|
|
146
|
-
"$ref": "#/$defs/ThemeColorValues"
|
|
147
|
-
},
|
|
148
|
-
"indigo": {
|
|
149
|
-
"$ref": "#/$defs/ThemeColorValues"
|
|
150
|
-
},
|
|
151
|
-
"muted": {
|
|
152
|
-
"$ref": "#/$defs/ThemeColorValues"
|
|
153
|
-
},
|
|
154
|
-
"primary": {
|
|
155
|
-
"$ref": "#/$defs/ThemeColorValues"
|
|
156
|
-
},
|
|
157
|
-
"red": {
|
|
158
|
-
"$ref": "#/$defs/ThemeColorValues"
|
|
159
|
-
},
|
|
160
|
-
"secondary": {
|
|
161
|
-
"$ref": "#/$defs/ThemeColorValues"
|
|
162
|
-
},
|
|
163
|
-
"sky": {
|
|
164
|
-
"$ref": "#/$defs/ThemeColorValues"
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
]
|
|
124
|
+
"type": "object",
|
|
125
|
+
"propertyNames": {
|
|
126
|
+
"$ref": "#/$defs/ColorName"
|
|
127
|
+
},
|
|
128
|
+
"additionalProperties": {
|
|
129
|
+
"$ref": "#/$defs/ThemeColorValues"
|
|
130
|
+
}
|
|
169
131
|
},
|
|
170
132
|
"ColorName": {
|
|
171
133
|
"id": "ColorName",
|
|
@@ -174,8 +136,7 @@
|
|
|
174
136
|
"$ref": "#/$defs/ThemeColor"
|
|
175
137
|
},
|
|
176
138
|
{
|
|
177
|
-
"
|
|
178
|
-
"minLength": 1
|
|
139
|
+
"$ref": "#/$defs/CustomColorName"
|
|
179
140
|
}
|
|
180
141
|
]
|
|
181
142
|
},
|
|
@@ -196,6 +157,11 @@
|
|
|
196
157
|
"sky"
|
|
197
158
|
]
|
|
198
159
|
},
|
|
160
|
+
"CustomColorName": {
|
|
161
|
+
"id": "CustomColorName",
|
|
162
|
+
"type": "string",
|
|
163
|
+
"minLength": 1
|
|
164
|
+
},
|
|
199
165
|
"ThemeColorValues": {
|
|
200
166
|
"id": "ThemeColorValues",
|
|
201
167
|
"description": "Exact value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color values",
|
|
@@ -204,36 +170,7 @@
|
|
|
204
170
|
"$ref": "#/$defs/ColorLiteral"
|
|
205
171
|
},
|
|
206
172
|
{
|
|
207
|
-
"
|
|
208
|
-
"properties": {
|
|
209
|
-
"elements": {
|
|
210
|
-
"description": "Element color value (or a breakdown of specific color values)",
|
|
211
|
-
"anyOf": [
|
|
212
|
-
{
|
|
213
|
-
"$ref": "#/$defs/ColorLiteral"
|
|
214
|
-
},
|
|
215
|
-
{
|
|
216
|
-
"$ref": "#/$defs/ElementColorValues"
|
|
217
|
-
}
|
|
218
|
-
]
|
|
219
|
-
},
|
|
220
|
-
"relationships": {
|
|
221
|
-
"description": "Relationship color value (or a breakdown of specific color values)",
|
|
222
|
-
"anyOf": [
|
|
223
|
-
{
|
|
224
|
-
"$ref": "#/$defs/ColorLiteral"
|
|
225
|
-
},
|
|
226
|
-
{
|
|
227
|
-
"$ref": "#/$defs/RelationshipColorValues"
|
|
228
|
-
}
|
|
229
|
-
]
|
|
230
|
-
}
|
|
231
|
-
},
|
|
232
|
-
"required": [
|
|
233
|
-
"elements",
|
|
234
|
-
"relationships"
|
|
235
|
-
],
|
|
236
|
-
"additionalProperties": false
|
|
173
|
+
"$ref": "#/$defs/StrictThemeColorValues"
|
|
237
174
|
}
|
|
238
175
|
]
|
|
239
176
|
},
|
|
@@ -243,6 +180,39 @@
|
|
|
243
180
|
"type": "string",
|
|
244
181
|
"minLength": 1
|
|
245
182
|
},
|
|
183
|
+
"StrictThemeColorValues": {
|
|
184
|
+
"id": "StrictThemeColorValues",
|
|
185
|
+
"type": "object",
|
|
186
|
+
"properties": {
|
|
187
|
+
"elements": {
|
|
188
|
+
"description": "Element color value (or a breakdown of specific color values)",
|
|
189
|
+
"anyOf": [
|
|
190
|
+
{
|
|
191
|
+
"$ref": "#/$defs/ColorLiteral"
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
"$ref": "#/$defs/ElementColorValues"
|
|
195
|
+
}
|
|
196
|
+
]
|
|
197
|
+
},
|
|
198
|
+
"relationships": {
|
|
199
|
+
"description": "Relationship color value (or a breakdown of specific color values)",
|
|
200
|
+
"anyOf": [
|
|
201
|
+
{
|
|
202
|
+
"$ref": "#/$defs/ColorLiteral"
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
"$ref": "#/$defs/RelationshipColorValues"
|
|
206
|
+
}
|
|
207
|
+
]
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
"required": [
|
|
211
|
+
"elements",
|
|
212
|
+
"relationships"
|
|
213
|
+
],
|
|
214
|
+
"additionalProperties": false
|
|
215
|
+
},
|
|
246
216
|
"ElementColorValues": {
|
|
247
217
|
"id": "ElementColorValues",
|
|
248
218
|
"type": "object",
|
|
@@ -363,6 +333,10 @@
|
|
|
363
333
|
"description": "Default shape for elements",
|
|
364
334
|
"$ref": "#/$defs/ElementShape"
|
|
365
335
|
},
|
|
336
|
+
"iconPosition": {
|
|
337
|
+
"description": "Default icon position for elements",
|
|
338
|
+
"$ref": "#/$defs/IconPosition"
|
|
339
|
+
},
|
|
366
340
|
"group": {
|
|
367
341
|
"description": "Default style values for groups",
|
|
368
342
|
"$ref": "#/$defs/GroupDefaultStyleValues"
|
|
@@ -412,7 +386,19 @@
|
|
|
412
386
|
"mobile",
|
|
413
387
|
"cylinder",
|
|
414
388
|
"storage",
|
|
415
|
-
"queue"
|
|
389
|
+
"queue",
|
|
390
|
+
"bucket",
|
|
391
|
+
"document"
|
|
392
|
+
]
|
|
393
|
+
},
|
|
394
|
+
"IconPosition": {
|
|
395
|
+
"id": "IconPosition",
|
|
396
|
+
"type": "string",
|
|
397
|
+
"enum": [
|
|
398
|
+
"left",
|
|
399
|
+
"right",
|
|
400
|
+
"top",
|
|
401
|
+
"bottom"
|
|
416
402
|
]
|
|
417
403
|
},
|
|
418
404
|
"GroupDefaultStyleValues": {
|
|
@@ -480,6 +466,23 @@
|
|
|
480
466
|
"vee"
|
|
481
467
|
]
|
|
482
468
|
},
|
|
469
|
+
"CustomStylesheets": {
|
|
470
|
+
"id": "CustomStylesheets",
|
|
471
|
+
"description": "Custom CSS (or list of CSS files) to be included in the generated diagrams",
|
|
472
|
+
"anyOf": [
|
|
473
|
+
{
|
|
474
|
+
"type": "string",
|
|
475
|
+
"minLength": 1
|
|
476
|
+
},
|
|
477
|
+
{
|
|
478
|
+
"type": "array",
|
|
479
|
+
"items": {
|
|
480
|
+
"type": "string",
|
|
481
|
+
"minLength": 1
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
]
|
|
485
|
+
},
|
|
483
486
|
"manual-layouts-config": {
|
|
484
487
|
"id": "manual-layouts-config",
|
|
485
488
|
"description": "Configuration for manual layouts",
|
|
@@ -490,7 +493,8 @@
|
|
|
490
493
|
"default": ".likec4",
|
|
491
494
|
"type": "string"
|
|
492
495
|
}
|
|
493
|
-
}
|
|
496
|
+
},
|
|
497
|
+
"additionalProperties": false
|
|
494
498
|
}
|
|
495
499
|
}
|
|
496
500
|
}
|
package/src/define-config.ts
CHANGED
|
@@ -1,14 +1,8 @@
|
|
|
1
1
|
import type { LikeC4ProjectStylesConfig, LikeC4ProjectTheme, ThemeColorValues } from '@likec4/core/types'
|
|
2
2
|
import type { GeneratorFn, LikeC4ProjectConfig, LikeC4ProjectConfigInput } from './schema'
|
|
3
3
|
import { GeneratorsSchema, LikeC4ProjectConfigSchema } from './schema'
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
type LikeC4StylesConfigInput,
|
|
7
|
-
type ThemeColorValuesInput,
|
|
8
|
-
LikeC4Config_Styles_Theme,
|
|
9
|
-
LikeC4StylesConfigSchema,
|
|
10
|
-
ThemeColorValuesSchema,
|
|
11
|
-
} from './schema.theme'
|
|
4
|
+
import type { LikeC4ConfigThemeInput, LikeC4StylesConfigInput, ThemeColorValuesInput } from './schema.theme'
|
|
5
|
+
import { LikeC4Config_Styles_Theme, LikeC4StylesConfigSchema, ThemeColorValuesSchema } from './schema.theme'
|
|
12
6
|
|
|
13
7
|
/**
|
|
14
8
|
* Defines LikeC4 Project, allows custom generators that can be executed using CLI:
|
|
@@ -22,9 +16,10 @@ import {
|
|
|
22
16
|
* export default defineConfig({
|
|
23
17
|
* name: 'my-project',
|
|
24
18
|
* title: 'My Project',
|
|
19
|
+
*
|
|
25
20
|
* exclude: ['picomatch pattern'],
|
|
26
21
|
* generators: {
|
|
27
|
-
* '
|
|
22
|
+
* '<generator-name>': async ({ likec4model, ctx }) => {
|
|
28
23
|
* await ctx.write('my-generator.txt', likec4model.project.id)
|
|
29
24
|
* }
|
|
30
25
|
* }
|
package/src/filenames.ts
CHANGED
package/src/node/index.ts
CHANGED
|
@@ -1,2 +1,40 @@
|
|
|
1
|
-
export
|
|
1
|
+
export type {
|
|
2
|
+
GeneratorFn,
|
|
3
|
+
GeneratorFnContext,
|
|
4
|
+
GeneratorFnParams,
|
|
5
|
+
LikeC4ProjectConfig,
|
|
6
|
+
LikeC4ProjectConfigInput,
|
|
7
|
+
LikeC4ProjectJsonConfig,
|
|
8
|
+
LocateResult,
|
|
9
|
+
ManualLayoutsConfigSchema,
|
|
10
|
+
} from '../schema'
|
|
11
|
+
|
|
12
|
+
export type {
|
|
13
|
+
IncludeConfig,
|
|
14
|
+
} from '../schema.include'
|
|
15
|
+
|
|
16
|
+
export type {
|
|
17
|
+
LikeC4StylesConfig,
|
|
18
|
+
LikeC4StylesConfigInput,
|
|
19
|
+
} from '../schema.theme'
|
|
20
|
+
|
|
21
|
+
export { validateProjectConfig } from '../schema'
|
|
22
|
+
|
|
23
|
+
export { normalizeIncludeConfig, validateIncludePaths } from '../schema.include'
|
|
24
|
+
|
|
25
|
+
export {
|
|
26
|
+
ConfigFilenames,
|
|
27
|
+
isLikeC4Config,
|
|
28
|
+
isLikeC4JsonConfig,
|
|
29
|
+
isLikeC4NonJsonConfig,
|
|
30
|
+
} from '../filenames'
|
|
31
|
+
|
|
32
|
+
export {
|
|
33
|
+
defineConfig,
|
|
34
|
+
defineGenerators,
|
|
35
|
+
defineStyle,
|
|
36
|
+
defineTheme,
|
|
37
|
+
defineThemeColor,
|
|
38
|
+
} from '../define-config'
|
|
39
|
+
|
|
2
40
|
export { loadConfig } from './load-config'
|
package/src/node/load-config.ts
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
import { invariant } from '@likec4/core'
|
|
2
|
+
import { rootLogger } from '@likec4/log'
|
|
2
3
|
import { bundleRequire } from 'bundle-require'
|
|
3
4
|
import * as fs from 'node:fs/promises'
|
|
4
5
|
import { dirname } from 'node:path'
|
|
5
|
-
import type { URI } from 'vscode-uri'
|
|
6
6
|
import { defineConfig } from '../define-config'
|
|
7
7
|
import { isLikeC4JsonConfig, isLikeC4NonJsonConfig } from '../filenames'
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import type { LikeC4ProjectConfig, VscodeURI } from '../schema'
|
|
9
|
+
import { validateProjectConfig } from '../schema'
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Load LikeC4 Project config file.
|
|
13
13
|
* If filepath is a non-JSON file, it will be bundled and required
|
|
14
14
|
*/
|
|
15
|
-
export async function loadConfig(filepath:
|
|
15
|
+
export async function loadConfig(filepath: VscodeURI): Promise<LikeC4ProjectConfig> {
|
|
16
|
+
const logger = rootLogger.getChild('config')
|
|
16
17
|
logger.debug`Loading config file: ${filepath.fsPath}`
|
|
17
18
|
if (isLikeC4JsonConfig(filepath.fsPath)) {
|
|
18
19
|
try {
|
|
@@ -31,12 +32,12 @@ export async function loadConfig(filepath: URI): Promise<LikeC4ProjectConfig> {
|
|
|
31
32
|
filepath: filepath.fsPath,
|
|
32
33
|
cwd,
|
|
33
34
|
esbuildOptions: {
|
|
34
|
-
resolveExtensions: ['.
|
|
35
|
+
resolveExtensions: ['.ts', '.mts', '.cts', '.mjs', '.js', '.cjs'],
|
|
35
36
|
plugins: [{
|
|
36
37
|
name: 'likec4-config',
|
|
37
38
|
setup(build) {
|
|
38
39
|
/**
|
|
39
|
-
* Intercept @likec4/config imports
|
|
40
|
+
* Intercept @likec4/config and likec4/config imports
|
|
40
41
|
*/
|
|
41
42
|
build.onResolve({ filter: /^@?likec4\/config$/ }, (args) => ({
|
|
42
43
|
path: args.path,
|
package/src/schema.include.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import z from 'zod/v4'
|
|
2
2
|
|
|
3
3
|
// Relative path (no leading slash, drive letter, or protocol)
|
|
4
4
|
// eslint-disable-next-line no-useless-escape
|
|
@@ -13,7 +13,7 @@ const IncludePathValue = z
|
|
|
13
13
|
'Include path must be a relative path (no leading slash, drive letter, or protocol)',
|
|
14
14
|
)
|
|
15
15
|
|
|
16
|
-
export const IncludeConfigSchema = z.
|
|
16
|
+
export const IncludeConfigSchema = z.strictObject({
|
|
17
17
|
paths: z.array(IncludePathValue)
|
|
18
18
|
.min(1, 'Include paths cannot be empty')
|
|
19
19
|
.meta({
|
|
@@ -72,7 +72,7 @@ export function normalizeIncludeConfig(include?: LikeC4IncludeConfig): IncludeCo
|
|
|
72
72
|
return include
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
-
export function validateIncludePaths(include?: LikeC4IncludeConfig) {
|
|
75
|
+
export function validateIncludePaths(include?: LikeC4IncludeConfig): void {
|
|
76
76
|
if (!include?.paths) {
|
|
77
77
|
return
|
|
78
78
|
}
|
|
@@ -85,7 +85,7 @@ export function validateIncludePaths(include?: LikeC4IncludeConfig) {
|
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
-
if (invalidPaths.length) {
|
|
88
|
+
if (invalidPaths.length > 0) {
|
|
89
89
|
throw new Error(
|
|
90
90
|
`Invalid include path(s): ${
|
|
91
91
|
invalidPaths
|
package/src/schema.theme.ts
CHANGED
|
@@ -1,24 +1,30 @@
|
|
|
1
|
+
// oxlint-disable no-unsafe-type-assertion
|
|
2
|
+
import type {
|
|
3
|
+
ColorLiteral,
|
|
4
|
+
ElementColorValues,
|
|
5
|
+
RelationshipColorValues,
|
|
6
|
+
ThemeColorValues,
|
|
7
|
+
} from '@likec4/core/styles'
|
|
1
8
|
import {
|
|
2
|
-
type ColorLiteral,
|
|
3
|
-
type ElementColorValues,
|
|
4
|
-
type RelationshipColorValues,
|
|
5
|
-
type ThemeColor,
|
|
6
|
-
type ThemeColorValues,
|
|
7
9
|
BorderStyles,
|
|
8
10
|
computeColorValues,
|
|
9
11
|
ElementShapes,
|
|
12
|
+
IconPositions,
|
|
10
13
|
RelationshipArrowTypes,
|
|
11
14
|
Sizes,
|
|
12
15
|
ThemeColors,
|
|
13
16
|
} from '@likec4/core/styles'
|
|
14
|
-
import {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
import type {
|
|
18
|
+
CustomColor,
|
|
19
|
+
LikeC4ProjectStyleDefaults,
|
|
20
|
+
LikeC4ProjectStylesConfig,
|
|
21
|
+
LikeC4ProjectStylesCustomStylesheets,
|
|
22
|
+
LikeC4ProjectTheme,
|
|
23
|
+
ThemeColor,
|
|
19
24
|
} from '@likec4/core/types'
|
|
25
|
+
import { exact } from '@likec4/core/types'
|
|
20
26
|
import { fromKeys } from 'remeda'
|
|
21
|
-
import
|
|
27
|
+
import z from 'zod/v4'
|
|
22
28
|
|
|
23
29
|
const opacity = z
|
|
24
30
|
.int()
|
|
@@ -41,6 +47,10 @@ const size = z
|
|
|
41
47
|
.literal(Sizes)
|
|
42
48
|
.meta({ id: 'ElementSize' })
|
|
43
49
|
|
|
50
|
+
const iconPosition = z
|
|
51
|
+
.literal(IconPositions)
|
|
52
|
+
.meta({ id: 'IconPosition' })
|
|
53
|
+
|
|
44
54
|
const arrow = z
|
|
45
55
|
.literal(RelationshipArrowTypes)
|
|
46
56
|
.meta({ id: 'ArrowType' })
|
|
@@ -53,10 +63,19 @@ const themeColor = z
|
|
|
53
63
|
.literal(ThemeColors)
|
|
54
64
|
.meta({ id: 'ThemeColor' })
|
|
55
65
|
|
|
66
|
+
const customColor = z
|
|
67
|
+
.string()
|
|
68
|
+
.min(1, 'Custom color name cannot be empty')
|
|
69
|
+
.transform(value => value as unknown as CustomColor)
|
|
70
|
+
.meta({ id: 'CustomColorName' })
|
|
71
|
+
|
|
72
|
+
// type ColorNameLiteral = ThemeColor | string & Record<never, never>
|
|
73
|
+
|
|
56
74
|
const color = z
|
|
75
|
+
// .custom<ColorNameLiteral>(v => typeof v === 'string')
|
|
57
76
|
.union([
|
|
58
77
|
themeColor,
|
|
59
|
-
|
|
78
|
+
customColor,
|
|
60
79
|
])
|
|
61
80
|
.transform(value => value as ThemeColor)
|
|
62
81
|
.meta({ id: 'ColorName' })
|
|
@@ -90,35 +109,40 @@ const RelationshipColorValuesSchema = z
|
|
|
90
109
|
label: colorSchema.meta({ description: 'Label text color' }),
|
|
91
110
|
labelBg: colorSchema
|
|
92
111
|
.optional()
|
|
93
|
-
.default('rgba(0, 0, 0, 0)')
|
|
112
|
+
.default('rgba(0, 0, 0, 0.5)')
|
|
94
113
|
.meta({ description: 'Label background color' }),
|
|
95
114
|
})
|
|
96
115
|
.meta({ id: 'RelationshipColorValues' })
|
|
97
116
|
.transform(value => value as RelationshipColorValues)
|
|
98
117
|
|
|
118
|
+
const StrictThemeColorValuesSchema = z.strictObject({
|
|
119
|
+
elements: z
|
|
120
|
+
.union([colorSchema, ElementColorValuesSchema])
|
|
121
|
+
.meta({ description: 'Element color value (or a breakdown of specific color values)' })
|
|
122
|
+
.transform((value): ElementColorValues => {
|
|
123
|
+
if (typeof value === 'string') {
|
|
124
|
+
return computeColorValues(value).elements
|
|
125
|
+
}
|
|
126
|
+
return value
|
|
127
|
+
}),
|
|
128
|
+
relationships: z
|
|
129
|
+
.union([colorSchema, RelationshipColorValuesSchema])
|
|
130
|
+
.meta({
|
|
131
|
+
description: 'Relationship color value (or a breakdown of specific color values)',
|
|
132
|
+
})
|
|
133
|
+
.transform((value): RelationshipColorValues => {
|
|
134
|
+
if (typeof value === 'string') {
|
|
135
|
+
return computeColorValues(value).relationships
|
|
136
|
+
}
|
|
137
|
+
return value
|
|
138
|
+
}),
|
|
139
|
+
})
|
|
140
|
+
.meta({ id: 'StrictThemeColorValues' })
|
|
141
|
+
|
|
99
142
|
export const ThemeColorValuesSchema = z
|
|
100
143
|
.union([
|
|
101
144
|
colorSchema,
|
|
102
|
-
|
|
103
|
-
elements: z
|
|
104
|
-
.union([colorSchema, ElementColorValuesSchema])
|
|
105
|
-
.meta({ description: 'Element color value (or a breakdown of specific color values)' })
|
|
106
|
-
.transform((value): ElementColorValues => {
|
|
107
|
-
if (typeof value === 'string') {
|
|
108
|
-
return computeColorValues(value).elements
|
|
109
|
-
}
|
|
110
|
-
return value
|
|
111
|
-
}),
|
|
112
|
-
relationships: z
|
|
113
|
-
.union([colorSchema, RelationshipColorValuesSchema])
|
|
114
|
-
.meta({ description: 'Relationship color value (or a breakdown of specific color values)' })
|
|
115
|
-
.transform((value): RelationshipColorValues => {
|
|
116
|
-
if (typeof value === 'string') {
|
|
117
|
-
return computeColorValues(value).relationships
|
|
118
|
-
}
|
|
119
|
-
return value
|
|
120
|
-
}),
|
|
121
|
-
}),
|
|
145
|
+
StrictThemeColorValuesSchema,
|
|
122
146
|
])
|
|
123
147
|
.meta({
|
|
124
148
|
id: 'ThemeColorValues',
|
|
@@ -132,18 +156,12 @@ export const ThemeColorValuesSchema = z
|
|
|
132
156
|
})
|
|
133
157
|
export type ThemeColorValuesInput = z.input<typeof ThemeColorValuesSchema>
|
|
134
158
|
|
|
135
|
-
const ThemeColorsSchema = z.
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
)
|
|
140
|
-
|
|
141
|
-
fromKeys(ThemeColors, () => ThemeColorValuesSchema.optional()),
|
|
142
|
-
),
|
|
143
|
-
]).meta({
|
|
144
|
-
id: 'ThemeColors',
|
|
145
|
-
description: 'Override theme colors',
|
|
146
|
-
})
|
|
159
|
+
const ThemeColorsSchema = z.record(color, ThemeColorValuesSchema)
|
|
160
|
+
.meta({
|
|
161
|
+
id: 'ThemeColors',
|
|
162
|
+
description: 'Override theme colors',
|
|
163
|
+
})
|
|
164
|
+
.transform(value => value as Record<ThemeColor, ThemeColorValues>)
|
|
147
165
|
|
|
148
166
|
const DimensionsSchema = z.strictObject({
|
|
149
167
|
width: z.number().min(50),
|
|
@@ -220,6 +238,7 @@ const LikeC4Config_Styles_Defaults = z
|
|
|
220
238
|
}),
|
|
221
239
|
size: size.optional().meta({ description: 'Default size for elements' }),
|
|
222
240
|
shape: shape.optional().meta({ description: 'Default shape for elements' }),
|
|
241
|
+
iconPosition: iconPosition.optional().meta({ description: 'Default icon position for elements' }),
|
|
223
242
|
group: LikeC4Config_Styles_Defaults_Group.optional().meta({ description: 'Default style values for groups' }),
|
|
224
243
|
relationship: LikeC4Config_Styles_Defaults_Relationship.optional().meta({
|
|
225
244
|
description: 'Default style values for relationships',
|
|
@@ -231,21 +250,32 @@ const LikeC4Config_Styles_Defaults = z
|
|
|
231
250
|
'Override default values for style properties\nThese values will be used if such property is not defined',
|
|
232
251
|
})
|
|
233
252
|
|
|
253
|
+
const LikeC4Config_Styles_CustomStylesheets = z
|
|
254
|
+
.union([
|
|
255
|
+
z.string().min(1, 'Custom CSS file path cannot be empty'),
|
|
256
|
+
z.array(
|
|
257
|
+
z.string().min(1, 'Custom CSS file path cannot be empty'),
|
|
258
|
+
),
|
|
259
|
+
])
|
|
260
|
+
.meta({
|
|
261
|
+
id: 'CustomStylesheets',
|
|
262
|
+
description: 'Custom CSS (or list of CSS files) to be included in the generated diagrams',
|
|
263
|
+
})
|
|
264
|
+
|
|
234
265
|
export const LikeC4StylesConfigSchema = z
|
|
235
266
|
.strictObject({
|
|
236
267
|
theme: LikeC4Config_Styles_Theme.optional(),
|
|
237
268
|
defaults: LikeC4Config_Styles_Defaults.optional(),
|
|
238
|
-
|
|
239
|
-
// .array(z.string())
|
|
240
|
-
// .meta({ description: 'List of custom CSS files' }),
|
|
269
|
+
customCss: LikeC4Config_Styles_CustomStylesheets.optional(),
|
|
241
270
|
})
|
|
242
271
|
.meta({
|
|
243
272
|
id: 'StylesConfiguration',
|
|
244
273
|
description: 'Project styles customization',
|
|
245
274
|
})
|
|
246
|
-
.transform(({ theme, defaults }): LikeC4ProjectStylesConfig =>
|
|
275
|
+
.transform(({ theme, defaults, customCss }): LikeC4ProjectStylesConfig =>
|
|
247
276
|
exact({
|
|
248
277
|
defaults: normalizeDefaults(defaults),
|
|
278
|
+
customCss: normalizeStylesheets(customCss),
|
|
249
279
|
theme,
|
|
250
280
|
})
|
|
251
281
|
)
|
|
@@ -262,7 +292,24 @@ function normalizeDefaults(
|
|
|
262
292
|
const { relationship, group, ...rest } = defaults
|
|
263
293
|
return exact({
|
|
264
294
|
...rest,
|
|
265
|
-
relationship: relationship && exact(relationship)
|
|
266
|
-
group: group && exact(group)
|
|
295
|
+
relationship: relationship && exact(relationship) satisfies LikeC4ProjectStyleDefaults['relationship'],
|
|
296
|
+
group: group && exact(group) satisfies LikeC4ProjectStyleDefaults['group'],
|
|
267
297
|
})
|
|
268
298
|
}
|
|
299
|
+
|
|
300
|
+
function normalizeStylesheets(
|
|
301
|
+
stylesheets?: z.infer<typeof LikeC4Config_Styles_CustomStylesheets>,
|
|
302
|
+
): LikeC4ProjectStylesCustomStylesheets | undefined {
|
|
303
|
+
if (!stylesheets) {
|
|
304
|
+
return undefined
|
|
305
|
+
}
|
|
306
|
+
const paths = (Array.isArray(stylesheets) ? stylesheets : [stylesheets]).filter(Boolean)
|
|
307
|
+
if (paths.length === 0) {
|
|
308
|
+
return undefined
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
return {
|
|
312
|
+
paths,
|
|
313
|
+
content: '',
|
|
314
|
+
}
|
|
315
|
+
}
|