@eventcatalog/core 2.15.0 → 2.16.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/default-files-for-collections/ubiquitousLanguages.md +7 -0
- package/dist/analytics/analytics.cjs +1 -1
- package/dist/analytics/analytics.js +2 -2
- package/dist/analytics/log-build.cjs +1 -1
- package/dist/analytics/log-build.js +3 -3
- package/dist/catalog-to-astro-content-directory.cjs +12 -3
- package/dist/catalog-to-astro-content-directory.js +2 -2
- package/dist/{chunk-O6BGVVOW.js → chunk-55YPRY5U.js} +3 -2
- package/dist/{chunk-PK2EQVPD.js → chunk-5RNDOKYT.js} +10 -2
- package/dist/{chunk-KI4KAUWW.js → chunk-6VJTKPOS.js} +1 -1
- package/dist/{chunk-65VQIGAP.js → chunk-BT6ILNB3.js} +1 -1
- package/dist/{chunk-TGOUSS6C.js → chunk-DMGFALQN.js} +1 -1
- package/dist/{chunk-7HYM3M5I.js → chunk-NTCYOR4N.js} +1 -1
- package/dist/constants.cjs +1 -1
- package/dist/constants.js +1 -1
- package/dist/eventcatalog.cjs +13 -4
- package/dist/eventcatalog.js +6 -6
- package/dist/map-catalog-to-astro.cjs +10 -2
- package/dist/map-catalog-to-astro.js +1 -1
- package/dist/watcher.cjs +10 -2
- package/dist/watcher.js +2 -2
- package/eventcatalog/src/components/MDX/NodeGraph/Edges/AnimatedMessageEdge.tsx +1 -1
- package/eventcatalog/src/components/MDX/NodeGraph/NodeGraph.tsx +1 -0
- package/eventcatalog/src/components/MDX/SchemaViewer/SchemaViewer.astro +6 -1
- package/eventcatalog/src/components/SideBars/CatalogResourcesSideBar/index.tsx +19 -1
- package/eventcatalog/src/components/SideBars/DomainSideBar.astro +23 -0
- package/eventcatalog/src/components/Tables/columns/ServiceTableColumns.tsx +87 -55
- package/eventcatalog/src/content/config.ts +18 -0
- package/eventcatalog/src/pages/docs/[type]/[id]/language.astro +301 -0
- package/eventcatalog/src/utils/collections/domains.ts +17 -2
- package/eventcatalog/src/utils/collections/icons.ts +3 -0
- package/package.json +3 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ubiquitous-language
|
|
3
|
+
name: Ubiquitous Language
|
|
4
|
+
summary: A shared language used by all team members to communicate about the system.
|
|
5
|
+
description: A shared language used by all team members to communicate about the system.
|
|
6
|
+
---
|
|
7
|
+
<!-- Do not delete this file, required for EC, you an ignore this file -->
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
log_build_default
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import "../chunk-
|
|
5
|
-
import "../chunk-
|
|
3
|
+
} from "../chunk-6VJTKPOS.js";
|
|
4
|
+
import "../chunk-BT6ILNB3.js";
|
|
5
|
+
import "../chunk-DMGFALQN.js";
|
|
6
6
|
import "../chunk-E7TXTI7G.js";
|
|
7
7
|
export {
|
|
8
8
|
log_build_default as default
|
|
@@ -129,7 +129,8 @@ var COLLECTION_KEYS = [
|
|
|
129
129
|
"pages",
|
|
130
130
|
"changelogs",
|
|
131
131
|
"queries",
|
|
132
|
-
"channels"
|
|
132
|
+
"channels",
|
|
133
|
+
"ubiquitousLanguages"
|
|
133
134
|
];
|
|
134
135
|
function mapCatalogToAstro({ filePath, astroDir, projectDir }) {
|
|
135
136
|
const relativeFilePath = removeBasePath(filePath, projectDir);
|
|
@@ -139,7 +140,11 @@ function mapCatalogToAstro({ filePath, astroDir, projectDir }) {
|
|
|
139
140
|
const baseTargetPaths = getBaseTargetPaths(relativeFilePath);
|
|
140
141
|
const relativeTargetPath = getRelativeTargetPath(relativeFilePath);
|
|
141
142
|
return baseTargetPaths.map(
|
|
142
|
-
(base) => import_node_path2.default.join(
|
|
143
|
+
(base) => import_node_path2.default.join(
|
|
144
|
+
astroDir,
|
|
145
|
+
base,
|
|
146
|
+
relativeTargetPath.replace("index.md", "index.mdx").replace("changelog.md", "changelog.mdx").replace("ubiquitous-language.md", "ubiquitous-language.mdx")
|
|
147
|
+
)
|
|
143
148
|
);
|
|
144
149
|
}
|
|
145
150
|
function removeBasePath(fullPath, basePath) {
|
|
@@ -172,6 +177,9 @@ function getBaseTargetPaths(filePath) {
|
|
|
172
177
|
if (filePathArr[filePathArr.length - 1] == "changelog.md") {
|
|
173
178
|
return [import_node_path2.default.join("src", "content", "changelogs")];
|
|
174
179
|
}
|
|
180
|
+
if (filePathArr[filePathArr.length - 1] == "ubiquitous-language.md") {
|
|
181
|
+
return [import_node_path2.default.join("src", "content", "ubiquitousLanguages")];
|
|
182
|
+
}
|
|
175
183
|
if (filePathArr[filePathArr.length - 1].match(/\.md$/)) {
|
|
176
184
|
return [import_node_path2.default.join("src", "content")];
|
|
177
185
|
}
|
|
@@ -241,7 +249,8 @@ var ensureAstroCollectionNotEmpty = async (astroDir) => {
|
|
|
241
249
|
"pages",
|
|
242
250
|
"changelogs",
|
|
243
251
|
"queries",
|
|
244
|
-
"channels"
|
|
252
|
+
"channels",
|
|
253
|
+
"ubiquitousLanguages"
|
|
245
254
|
];
|
|
246
255
|
const emptyCollections = [];
|
|
247
256
|
for (const collection of COLLECTIONS) {
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
} from "./chunk-E7TXTI7G.js";
|
|
5
5
|
import {
|
|
6
6
|
mapCatalogToAstro
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-5RNDOKYT.js";
|
|
8
8
|
|
|
9
9
|
// src/catalog-to-astro-content-directory.js
|
|
10
10
|
import { glob } from "glob";
|
|
@@ -50,7 +50,8 @@ var ensureAstroCollectionNotEmpty = async (astroDir) => {
|
|
|
50
50
|
"pages",
|
|
51
51
|
"changelogs",
|
|
52
52
|
"queries",
|
|
53
|
-
"channels"
|
|
53
|
+
"channels",
|
|
54
|
+
"ubiquitousLanguages"
|
|
54
55
|
];
|
|
55
56
|
const emptyCollections = [];
|
|
56
57
|
for (const collection of COLLECTIONS) {
|
|
@@ -11,7 +11,8 @@ var COLLECTION_KEYS = [
|
|
|
11
11
|
"pages",
|
|
12
12
|
"changelogs",
|
|
13
13
|
"queries",
|
|
14
|
-
"channels"
|
|
14
|
+
"channels",
|
|
15
|
+
"ubiquitousLanguages"
|
|
15
16
|
];
|
|
16
17
|
function mapCatalogToAstro({ filePath, astroDir, projectDir }) {
|
|
17
18
|
const relativeFilePath = removeBasePath(filePath, projectDir);
|
|
@@ -21,7 +22,11 @@ function mapCatalogToAstro({ filePath, astroDir, projectDir }) {
|
|
|
21
22
|
const baseTargetPaths = getBaseTargetPaths(relativeFilePath);
|
|
22
23
|
const relativeTargetPath = getRelativeTargetPath(relativeFilePath);
|
|
23
24
|
return baseTargetPaths.map(
|
|
24
|
-
(base) => path.join(
|
|
25
|
+
(base) => path.join(
|
|
26
|
+
astroDir,
|
|
27
|
+
base,
|
|
28
|
+
relativeTargetPath.replace("index.md", "index.mdx").replace("changelog.md", "changelog.mdx").replace("ubiquitous-language.md", "ubiquitous-language.mdx")
|
|
29
|
+
)
|
|
25
30
|
);
|
|
26
31
|
}
|
|
27
32
|
function removeBasePath(fullPath, basePath) {
|
|
@@ -54,6 +59,9 @@ function getBaseTargetPaths(filePath) {
|
|
|
54
59
|
if (filePathArr[filePathArr.length - 1] == "changelog.md") {
|
|
55
60
|
return [path.join("src", "content", "changelogs")];
|
|
56
61
|
}
|
|
62
|
+
if (filePathArr[filePathArr.length - 1] == "ubiquitous-language.md") {
|
|
63
|
+
return [path.join("src", "content", "ubiquitousLanguages")];
|
|
64
|
+
}
|
|
57
65
|
if (filePathArr[filePathArr.length - 1].match(/\.md$/)) {
|
|
58
66
|
return [path.join("src", "content")];
|
|
59
67
|
}
|
package/dist/constants.cjs
CHANGED
package/dist/constants.js
CHANGED
package/dist/eventcatalog.cjs
CHANGED
|
@@ -161,7 +161,7 @@ var import_axios = __toESM(require("axios"), 1);
|
|
|
161
161
|
var import_os = __toESM(require("os"), 1);
|
|
162
162
|
|
|
163
163
|
// package.json
|
|
164
|
-
var version = "2.
|
|
164
|
+
var version = "2.16.0";
|
|
165
165
|
|
|
166
166
|
// src/constants.ts
|
|
167
167
|
var VERSION = version;
|
|
@@ -226,7 +226,8 @@ var COLLECTION_KEYS = [
|
|
|
226
226
|
"pages",
|
|
227
227
|
"changelogs",
|
|
228
228
|
"queries",
|
|
229
|
-
"channels"
|
|
229
|
+
"channels",
|
|
230
|
+
"ubiquitousLanguages"
|
|
230
231
|
];
|
|
231
232
|
function mapCatalogToAstro({ filePath, astroDir, projectDir }) {
|
|
232
233
|
const relativeFilePath = removeBasePath(filePath, projectDir);
|
|
@@ -236,7 +237,11 @@ function mapCatalogToAstro({ filePath, astroDir, projectDir }) {
|
|
|
236
237
|
const baseTargetPaths = getBaseTargetPaths(relativeFilePath);
|
|
237
238
|
const relativeTargetPath = getRelativeTargetPath(relativeFilePath);
|
|
238
239
|
return baseTargetPaths.map(
|
|
239
|
-
(base) => import_node_path3.default.join(
|
|
240
|
+
(base) => import_node_path3.default.join(
|
|
241
|
+
astroDir,
|
|
242
|
+
base,
|
|
243
|
+
relativeTargetPath.replace("index.md", "index.mdx").replace("changelog.md", "changelog.mdx").replace("ubiquitous-language.md", "ubiquitous-language.mdx")
|
|
244
|
+
)
|
|
240
245
|
);
|
|
241
246
|
}
|
|
242
247
|
function removeBasePath(fullPath, basePath) {
|
|
@@ -269,6 +274,9 @@ function getBaseTargetPaths(filePath) {
|
|
|
269
274
|
if (filePathArr[filePathArr.length - 1] == "changelog.md") {
|
|
270
275
|
return [import_node_path3.default.join("src", "content", "changelogs")];
|
|
271
276
|
}
|
|
277
|
+
if (filePathArr[filePathArr.length - 1] == "ubiquitous-language.md") {
|
|
278
|
+
return [import_node_path3.default.join("src", "content", "ubiquitousLanguages")];
|
|
279
|
+
}
|
|
272
280
|
if (filePathArr[filePathArr.length - 1].match(/\.md$/)) {
|
|
273
281
|
return [import_node_path3.default.join("src", "content")];
|
|
274
282
|
}
|
|
@@ -425,7 +433,8 @@ var ensureAstroCollectionNotEmpty = async (astroDir) => {
|
|
|
425
433
|
"pages",
|
|
426
434
|
"changelogs",
|
|
427
435
|
"queries",
|
|
428
|
-
"channels"
|
|
436
|
+
"channels",
|
|
437
|
+
"ubiquitousLanguages"
|
|
429
438
|
];
|
|
430
439
|
const emptyCollections = [];
|
|
431
440
|
for (const collection of COLLECTIONS) {
|
package/dist/eventcatalog.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import {
|
|
2
2
|
log_build_default
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-6VJTKPOS.js";
|
|
4
|
+
import "./chunk-BT6ILNB3.js";
|
|
5
5
|
import {
|
|
6
6
|
catalogToAstro
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-55YPRY5U.js";
|
|
8
8
|
import {
|
|
9
9
|
VERSION
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-DMGFALQN.js";
|
|
11
11
|
import {
|
|
12
12
|
generate
|
|
13
13
|
} from "./chunk-YEQVKHST.js";
|
|
14
14
|
import {
|
|
15
15
|
watch
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-NTCYOR4N.js";
|
|
17
17
|
import "./chunk-E7TXTI7G.js";
|
|
18
|
-
import "./chunk-
|
|
18
|
+
import "./chunk-5RNDOKYT.js";
|
|
19
19
|
|
|
20
20
|
// src/eventcatalog.ts
|
|
21
21
|
import { Command } from "commander";
|
|
@@ -45,7 +45,8 @@ var COLLECTION_KEYS = [
|
|
|
45
45
|
"pages",
|
|
46
46
|
"changelogs",
|
|
47
47
|
"queries",
|
|
48
|
-
"channels"
|
|
48
|
+
"channels",
|
|
49
|
+
"ubiquitousLanguages"
|
|
49
50
|
];
|
|
50
51
|
function mapCatalogToAstro({ filePath, astroDir, projectDir }) {
|
|
51
52
|
const relativeFilePath = removeBasePath(filePath, projectDir);
|
|
@@ -55,7 +56,11 @@ function mapCatalogToAstro({ filePath, astroDir, projectDir }) {
|
|
|
55
56
|
const baseTargetPaths = getBaseTargetPaths(relativeFilePath);
|
|
56
57
|
const relativeTargetPath = getRelativeTargetPath(relativeFilePath);
|
|
57
58
|
return baseTargetPaths.map(
|
|
58
|
-
(base) => import_node_path.default.join(
|
|
59
|
+
(base) => import_node_path.default.join(
|
|
60
|
+
astroDir,
|
|
61
|
+
base,
|
|
62
|
+
relativeTargetPath.replace("index.md", "index.mdx").replace("changelog.md", "changelog.mdx").replace("ubiquitous-language.md", "ubiquitous-language.mdx")
|
|
63
|
+
)
|
|
59
64
|
);
|
|
60
65
|
}
|
|
61
66
|
function removeBasePath(fullPath, basePath) {
|
|
@@ -88,6 +93,9 @@ function getBaseTargetPaths(filePath) {
|
|
|
88
93
|
if (filePathArr[filePathArr.length - 1] == "changelog.md") {
|
|
89
94
|
return [import_node_path.default.join("src", "content", "changelogs")];
|
|
90
95
|
}
|
|
96
|
+
if (filePathArr[filePathArr.length - 1] == "ubiquitous-language.md") {
|
|
97
|
+
return [import_node_path.default.join("src", "content", "ubiquitousLanguages")];
|
|
98
|
+
}
|
|
91
99
|
if (filePathArr[filePathArr.length - 1].match(/\.md$/)) {
|
|
92
100
|
return [import_node_path.default.join("src", "content")];
|
|
93
101
|
}
|
package/dist/watcher.cjs
CHANGED
|
@@ -49,7 +49,8 @@ var COLLECTION_KEYS = [
|
|
|
49
49
|
"pages",
|
|
50
50
|
"changelogs",
|
|
51
51
|
"queries",
|
|
52
|
-
"channels"
|
|
52
|
+
"channels",
|
|
53
|
+
"ubiquitousLanguages"
|
|
53
54
|
];
|
|
54
55
|
function mapCatalogToAstro({ filePath, astroDir, projectDir }) {
|
|
55
56
|
const relativeFilePath = removeBasePath(filePath, projectDir);
|
|
@@ -59,7 +60,11 @@ function mapCatalogToAstro({ filePath, astroDir, projectDir }) {
|
|
|
59
60
|
const baseTargetPaths = getBaseTargetPaths(relativeFilePath);
|
|
60
61
|
const relativeTargetPath = getRelativeTargetPath(relativeFilePath);
|
|
61
62
|
return baseTargetPaths.map(
|
|
62
|
-
(base) => import_node_path.default.join(
|
|
63
|
+
(base) => import_node_path.default.join(
|
|
64
|
+
astroDir,
|
|
65
|
+
base,
|
|
66
|
+
relativeTargetPath.replace("index.md", "index.mdx").replace("changelog.md", "changelog.mdx").replace("ubiquitous-language.md", "ubiquitous-language.mdx")
|
|
67
|
+
)
|
|
63
68
|
);
|
|
64
69
|
}
|
|
65
70
|
function removeBasePath(fullPath, basePath) {
|
|
@@ -92,6 +97,9 @@ function getBaseTargetPaths(filePath) {
|
|
|
92
97
|
if (filePathArr[filePathArr.length - 1] == "changelog.md") {
|
|
93
98
|
return [import_node_path.default.join("src", "content", "changelogs")];
|
|
94
99
|
}
|
|
100
|
+
if (filePathArr[filePathArr.length - 1] == "ubiquitous-language.md") {
|
|
101
|
+
return [import_node_path.default.join("src", "content", "ubiquitousLanguages")];
|
|
102
|
+
}
|
|
95
103
|
if (filePathArr[filePathArr.length - 1].match(/\.md$/)) {
|
|
96
104
|
return [import_node_path.default.join("src", "content")];
|
|
97
105
|
}
|
package/dist/watcher.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
const { catalog, id } = Astro.props;
|
|
3
3
|
import fs from 'node:fs/promises';
|
|
4
4
|
import { existsSync } from 'fs';
|
|
5
|
+
import yaml from 'js-yaml';
|
|
5
6
|
import path from 'path';
|
|
6
7
|
import SchemaViewerClient from './SchemaViewer';
|
|
7
8
|
import Admonition from '../Admonition';
|
|
@@ -48,7 +49,11 @@ try {
|
|
|
48
49
|
if (exists) {
|
|
49
50
|
// Load the schema for the component
|
|
50
51
|
schema = await fs.readFile(schemaPath, 'utf-8');
|
|
51
|
-
|
|
52
|
+
if (schemaPath.endsWith('.yml') || schemaPath.endsWith('.yaml')) {
|
|
53
|
+
schema = yaml.load(schema);
|
|
54
|
+
} else {
|
|
55
|
+
schema = JSON.parse(schema);
|
|
56
|
+
}
|
|
52
57
|
}
|
|
53
58
|
|
|
54
59
|
return {
|
|
@@ -4,12 +4,28 @@ import { ChevronDownIcon, ChevronUpIcon } from '@heroicons/react/24/outline';
|
|
|
4
4
|
import './styles.css';
|
|
5
5
|
import { getIconForCollection as getIconForCollectionOriginal } from '@utils/collections/icons';
|
|
6
6
|
|
|
7
|
+
const STORAGE_KEY = 'EventCatalog:catalogSidebarCollapsedGroups';
|
|
8
|
+
|
|
7
9
|
const CatalogResourcesSideBar = ({ resources, currentPath }: any) => {
|
|
8
10
|
const [data, setData] = useState(resources);
|
|
9
11
|
const [searchQuery, setSearchQuery] = useState('');
|
|
10
|
-
const [
|
|
12
|
+
const [isInitialized, setIsInitialized] = useState(false);
|
|
13
|
+
const [collapsedGroups, setCollapsedGroups] = useState<{ [key: string]: boolean }>(() => {
|
|
14
|
+
if (typeof window !== 'undefined') {
|
|
15
|
+
const saved = window.localStorage.getItem(STORAGE_KEY);
|
|
16
|
+
setIsInitialized(true);
|
|
17
|
+
return saved ? JSON.parse(saved) : {};
|
|
18
|
+
}
|
|
19
|
+
return {};
|
|
20
|
+
});
|
|
11
21
|
const decodedCurrentPath = decodeURIComponent(currentPath);
|
|
12
22
|
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
if (typeof window !== 'undefined') {
|
|
25
|
+
window.localStorage.setItem(STORAGE_KEY, JSON.stringify(collapsedGroups));
|
|
26
|
+
}
|
|
27
|
+
}, [collapsedGroups]);
|
|
28
|
+
|
|
13
29
|
const handleSearch = (e: React.ChangeEvent<HTMLInputElement>) => {
|
|
14
30
|
setSearchQuery(e.target.value);
|
|
15
31
|
};
|
|
@@ -47,6 +63,8 @@ const CatalogResourcesSideBar = ({ resources, currentPath }: any) => {
|
|
|
47
63
|
|
|
48
64
|
const getIconForCollection = useMemo(() => getIconForCollectionOriginal, []);
|
|
49
65
|
|
|
66
|
+
if (!isInitialized) return null;
|
|
67
|
+
|
|
50
68
|
return (
|
|
51
69
|
<nav className="space-y-6 text-black ">
|
|
52
70
|
<div className="space-y-2">
|
|
@@ -3,6 +3,7 @@ import OwnersList from '@components/Lists/OwnersList';
|
|
|
3
3
|
import PillListFlat from '@components/Lists/PillListFlat';
|
|
4
4
|
import RepositoryList from '@components/Lists/RepositoryList.astro';
|
|
5
5
|
import VersionList from '@components/Lists/VersionList.astro';
|
|
6
|
+
import { getUbiquitousLanguage } from '@utils/collections/domains';
|
|
6
7
|
import { buildUrl } from '@utils/url-builder';
|
|
7
8
|
import { getEntry, type CollectionEntry } from 'astro:content';
|
|
8
9
|
import { ScrollText, Workflow } from 'lucide-react';
|
|
@@ -14,6 +15,9 @@ const { domain } = Astro.props;
|
|
|
14
15
|
|
|
15
16
|
// @ts-ignore
|
|
16
17
|
const services = (domain.data.services as CollectionEntry<'services'>[]) || [];
|
|
18
|
+
const ubiquitousLanguage = await getUbiquitousLanguage(domain);
|
|
19
|
+
const hasUbiquitousLanguage = ubiquitousLanguage.length > 0;
|
|
20
|
+
const ubiquitousLanguageDictionary = hasUbiquitousLanguage ? ubiquitousLanguage[0].data.dictionary : [];
|
|
17
21
|
|
|
18
22
|
const ownersRaw = domain.data?.owners || [];
|
|
19
23
|
const owners = await Promise.all(ownersRaw.map((o) => getEntry(o)));
|
|
@@ -26,6 +30,13 @@ const serviceList = services.map((p) => ({
|
|
|
26
30
|
href: buildUrl(`/docs/${p.collection}/${p.data.id}/${p.data.version}`),
|
|
27
31
|
}));
|
|
28
32
|
|
|
33
|
+
const ubiquitousLanguageList = ubiquitousLanguageDictionary?.map((l) => ({
|
|
34
|
+
label: l.name,
|
|
35
|
+
badge: 'Ubiquitous Language',
|
|
36
|
+
collection: 'ubiquitousLanguages',
|
|
37
|
+
href: buildUrl(`/docs/${domain.collection}/${domain.data.id}/language?id=${l.id}`),
|
|
38
|
+
}));
|
|
39
|
+
|
|
29
40
|
const ownersList = owners.map((o) => ({
|
|
30
41
|
label: o.data.name,
|
|
31
42
|
type: o.collection,
|
|
@@ -45,6 +56,17 @@ const ownersList = owners.map((o) => ({
|
|
|
45
56
|
icon="ServerIcon"
|
|
46
57
|
client:load
|
|
47
58
|
/>
|
|
59
|
+
{
|
|
60
|
+
ubiquitousLanguageList && hasUbiquitousLanguage && (
|
|
61
|
+
<PillListFlat
|
|
62
|
+
title={`Ubiquitous Language Dictionary (${ubiquitousLanguageDictionary?.length})`}
|
|
63
|
+
pills={ubiquitousLanguageList}
|
|
64
|
+
color="pink"
|
|
65
|
+
emptyMessage={`This domain does not have any documented ubiquitous language.`}
|
|
66
|
+
client:load
|
|
67
|
+
/>
|
|
68
|
+
)
|
|
69
|
+
}
|
|
48
70
|
{domain.data.versions && <VersionList versions={domain.data.versions} collectionItem={domain} />}
|
|
49
71
|
{
|
|
50
72
|
domain.data.repository && (
|
|
@@ -57,6 +79,7 @@ const ownersList = owners.map((o) => ({
|
|
|
57
79
|
emptyMessage={`This domain does not have any documented owners.`}
|
|
58
80
|
client:load
|
|
59
81
|
/>
|
|
82
|
+
|
|
60
83
|
<div class="space-y-2">
|
|
61
84
|
<a
|
|
62
85
|
href={buildUrl(`/visualiser/${domain.collection}/${domain.data.id}/${domain.data.version}`)}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ServerIcon, BoltIcon, ChatBubbleLeftIcon } from '@heroicons/react/24/solid';
|
|
2
2
|
import { createColumnHelper } from '@tanstack/react-table';
|
|
3
3
|
import type { CollectionEntry } from 'astro:content';
|
|
4
|
-
import { useMemo } from 'react';
|
|
4
|
+
import { useMemo, useState } from 'react';
|
|
5
5
|
import { filterByName, filterCollectionByName } from '../filters/custom-filters';
|
|
6
6
|
import { buildUrl } from '@utils/url-builder';
|
|
7
7
|
import { getColorAndIconForMessageType } from './MessageTableColumns';
|
|
@@ -65,39 +65,59 @@ export const columns = () => [
|
|
|
65
65
|
collectionFilterKey: 'receives',
|
|
66
66
|
},
|
|
67
67
|
cell: (info) => {
|
|
68
|
-
const receives = info.getValue();
|
|
68
|
+
const receives = info.getValue() || [];
|
|
69
|
+
const isExpandable = receives?.length > 10;
|
|
70
|
+
const isOpen = isExpandable ? receives?.length < 10 : true;
|
|
71
|
+
const [isExpanded, setIsExpanded] = useState(isOpen);
|
|
72
|
+
|
|
73
|
+
const receiversWithIcons = useMemo(
|
|
74
|
+
() =>
|
|
75
|
+
receives?.map((consumer: any) => {
|
|
76
|
+
const type = consumer.collection.slice(0, -1);
|
|
77
|
+
return {
|
|
78
|
+
...consumer,
|
|
79
|
+
...getColorAndIconForMessageType(type),
|
|
80
|
+
};
|
|
81
|
+
}) || [],
|
|
82
|
+
[receives]
|
|
83
|
+
);
|
|
84
|
+
|
|
69
85
|
if (receives?.length === 0 || !receives)
|
|
70
86
|
return <div className="text-sm text-gray-400/80 text-left italic">Service receives no messages.</div>;
|
|
71
87
|
|
|
72
88
|
return (
|
|
73
|
-
<
|
|
74
|
-
{
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
>
|
|
83
|
-
<
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
<span className="
|
|
89
|
-
{consumer.
|
|
89
|
+
<div>
|
|
90
|
+
{isExpandable && (
|
|
91
|
+
<button onClick={() => setIsExpanded(!isExpanded)} className="mb-2 text-sm text-gray-600 hover:text-gray-900">
|
|
92
|
+
{isExpanded ? '▼' : '▶'} {receives.length} message{receives.length !== 1 ? 's' : ''}
|
|
93
|
+
</button>
|
|
94
|
+
)}
|
|
95
|
+
{isExpanded && (
|
|
96
|
+
<ul>
|
|
97
|
+
{receiversWithIcons.map((consumer: any, index: number) => (
|
|
98
|
+
<li key={`${consumer.data.id}-${index}`} className="py-1 group font-light ">
|
|
99
|
+
<a
|
|
100
|
+
href={buildUrl(`/docs/${consumer.collection}/${consumer.data.id}/${consumer.data.version}`)}
|
|
101
|
+
className="group-hover:text-primary flex space-x-1 items-center "
|
|
102
|
+
>
|
|
103
|
+
<div className={`flex items-center border border-gray-300 shadow-sm rounded-md`}>
|
|
104
|
+
<span className="flex items-center">
|
|
105
|
+
<span className={`bg-${consumer.color}-500 h-full rounded-tl rounded-bl p-1`}>
|
|
106
|
+
<consumer.Icon className="h-4 w-4 text-white" />
|
|
107
|
+
</span>
|
|
108
|
+
<span className="leading-none px-2 group-hover:underline ">
|
|
109
|
+
{consumer.data.name} (v{consumer.data.version})
|
|
110
|
+
</span>
|
|
90
111
|
</span>
|
|
91
|
-
</
|
|
92
|
-
</
|
|
93
|
-
</
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
</
|
|
112
|
+
</div>
|
|
113
|
+
</a>
|
|
114
|
+
</li>
|
|
115
|
+
))}
|
|
116
|
+
</ul>
|
|
117
|
+
)}
|
|
118
|
+
</div>
|
|
98
119
|
);
|
|
99
120
|
},
|
|
100
|
-
// footer: (info) => info.column.id,
|
|
101
121
|
filterFn: filterCollectionByName('receives'),
|
|
102
122
|
}),
|
|
103
123
|
columnHelper.accessor('data.sends', {
|
|
@@ -107,40 +127,52 @@ export const columns = () => [
|
|
|
107
127
|
collectionFilterKey: 'sends',
|
|
108
128
|
},
|
|
109
129
|
cell: (info) => {
|
|
110
|
-
const sends = info.getValue();
|
|
130
|
+
const sends = info.getValue() || [];
|
|
131
|
+
const isExpandable = sends?.length > 10;
|
|
132
|
+
const isOpen = isExpandable ? sends?.length < 10 : true;
|
|
133
|
+
const [isExpanded, setIsExpanded] = useState(isOpen);
|
|
134
|
+
|
|
111
135
|
if (sends?.length === 0 || !sends)
|
|
112
136
|
return <div className="text-sm text-gray-400/80 text-left italic">Service sends no messages.</div>;
|
|
113
137
|
|
|
114
138
|
return (
|
|
115
|
-
<
|
|
116
|
-
{
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
139
|
+
<div>
|
|
140
|
+
{isExpandable && (
|
|
141
|
+
<button onClick={() => setIsExpanded(!isExpanded)} className="mb-2 text-sm text-gray-600 hover:text-gray-900">
|
|
142
|
+
{isExpanded ? '▼' : '▶'} {sends.length} message{sends.length !== 1 ? 's' : ''}
|
|
143
|
+
</button>
|
|
144
|
+
)}
|
|
145
|
+
{isExpanded && (
|
|
146
|
+
<ul>
|
|
147
|
+
{sends.map((consumer: any, index: number) => {
|
|
148
|
+
const type = consumer.collection.slice(0, -1);
|
|
149
|
+
const color = type === 'event' ? 'orange' : 'blue';
|
|
150
|
+
const Icon = type === 'event' ? BoltIcon : ChatBubbleLeftIcon;
|
|
151
|
+
return (
|
|
152
|
+
<li key={`${consumer.data.id}-${index}`} className="py-1 group font-light">
|
|
153
|
+
<a
|
|
154
|
+
href={buildUrl(`/docs/${consumer.collection}/${consumer.data.id}/${consumer.data.version}`)}
|
|
155
|
+
className="group-hover:text-primary flex space-x-1 items-center "
|
|
156
|
+
>
|
|
157
|
+
<div className={`flex items-center border border-gray-300 shadow-sm rounded-md`}>
|
|
158
|
+
<span className="flex items-center">
|
|
159
|
+
<span className={`bg-${color}-500 h-full rounded-tl rounded-bl p-1`}>
|
|
160
|
+
<Icon className="h-4 w-4 text-white" />
|
|
161
|
+
</span>
|
|
162
|
+
<span className="leading-none px-2 group-hover:underline ">
|
|
163
|
+
{consumer.data.name} (v{consumer.data.version})
|
|
164
|
+
</span>
|
|
165
|
+
</span>
|
|
166
|
+
</div>
|
|
167
|
+
</a>
|
|
168
|
+
</li>
|
|
169
|
+
);
|
|
170
|
+
})}
|
|
171
|
+
</ul>
|
|
172
|
+
)}
|
|
173
|
+
</div>
|
|
141
174
|
);
|
|
142
175
|
},
|
|
143
|
-
// footer: (info) => info.column.id,
|
|
144
176
|
filterFn: filterCollectionByName('sends'),
|
|
145
177
|
}),
|
|
146
178
|
columnHelper.accessor('data.name', {
|
|
@@ -221,6 +221,23 @@ const domains = defineCollection({
|
|
|
221
221
|
.merge(baseSchema),
|
|
222
222
|
});
|
|
223
223
|
|
|
224
|
+
const ubiquitousLanguages = defineCollection({
|
|
225
|
+
type: 'content',
|
|
226
|
+
schema: z.object({
|
|
227
|
+
dictionary: z
|
|
228
|
+
.array(
|
|
229
|
+
z.object({
|
|
230
|
+
id: z.string(),
|
|
231
|
+
name: z.string(),
|
|
232
|
+
summary: z.string().optional(),
|
|
233
|
+
description: z.string().optional(),
|
|
234
|
+
icon: z.string().optional(),
|
|
235
|
+
})
|
|
236
|
+
)
|
|
237
|
+
.optional(),
|
|
238
|
+
}),
|
|
239
|
+
});
|
|
240
|
+
|
|
224
241
|
const users = defineCollection({
|
|
225
242
|
type: 'content',
|
|
226
243
|
schema: z.object({
|
|
@@ -270,4 +287,5 @@ export const collections = {
|
|
|
270
287
|
flows,
|
|
271
288
|
pages,
|
|
272
289
|
changelogs,
|
|
290
|
+
ubiquitousLanguages,
|
|
273
291
|
};
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
---
|
|
2
|
+
import Footer from '@layouts/Footer.astro';
|
|
3
|
+
import VerticalSideBarLayout from '@layouts/VerticalSideBarLayout.astro';
|
|
4
|
+
import { getDomains, type Domain, getUbiquitousLanguage } from '@utils/collections/domains';
|
|
5
|
+
import type { CollectionEntry } from 'astro:content';
|
|
6
|
+
import { ViewTransitions } from 'astro:transitions';
|
|
7
|
+
import * as LucideIcons from 'lucide-react';
|
|
8
|
+
|
|
9
|
+
export async function getStaticPaths() {
|
|
10
|
+
const domains = await getDomains();
|
|
11
|
+
|
|
12
|
+
const buildPages = (collection: CollectionEntry<'domains'>[]) => {
|
|
13
|
+
return collection.map((item) => ({
|
|
14
|
+
params: {
|
|
15
|
+
type: item.collection,
|
|
16
|
+
id: item.data.id,
|
|
17
|
+
},
|
|
18
|
+
props: {
|
|
19
|
+
type: item.collection,
|
|
20
|
+
...item,
|
|
21
|
+
},
|
|
22
|
+
}));
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
return [...buildPages(domains)];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const props = Astro.props;
|
|
29
|
+
const pageTitle = `${props.collection} | ${props.data.name}`.replace(/^\w/, (c) => c.toUpperCase());
|
|
30
|
+
const ubiquitousLanguages = await getUbiquitousLanguage(props);
|
|
31
|
+
|
|
32
|
+
const ubiquitousLanguage = ubiquitousLanguages[0];
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
<VerticalSideBarLayout title={pageTitle} description={props.data.summary}>
|
|
36
|
+
<main class="flex sm:px-8 docs-layout h-full">
|
|
37
|
+
<div class="flex docs-layout w-full">
|
|
38
|
+
<div class="w-full lg:mr-2 pr-8 overflow-y-auto py-8 min-h-[50em]">
|
|
39
|
+
<nav class="flex mb-4" aria-label="Breadcrumb">
|
|
40
|
+
<ol class="inline-flex items-center space-x-1 md:space-x-3">
|
|
41
|
+
<li class="inline-flex items-center">
|
|
42
|
+
<a
|
|
43
|
+
href={`/docs/${props.type}/${props.data.id}/${props.data.latestVersion}`}
|
|
44
|
+
class="inline-flex items-center text-sm font-medium text-gray-500 hover:text-primary"
|
|
45
|
+
>
|
|
46
|
+
<svg
|
|
47
|
+
class="w-3 h-3 mr-2.5"
|
|
48
|
+
aria-hidden="true"
|
|
49
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
50
|
+
fill="none"
|
|
51
|
+
viewBox="0 0 24 24"
|
|
52
|
+
stroke-width="2"
|
|
53
|
+
stroke="currentColor"
|
|
54
|
+
>
|
|
55
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M10.5 19.5L3 12m0 0l7.5-7.5M3 12h18"></path>
|
|
56
|
+
</svg>
|
|
57
|
+
Back to Documentation
|
|
58
|
+
</a>
|
|
59
|
+
</li>
|
|
60
|
+
</ol>
|
|
61
|
+
</nav>
|
|
62
|
+
|
|
63
|
+
<div class="border-b border-gray-200 flex justify-between items-start md:pb-2">
|
|
64
|
+
<div>
|
|
65
|
+
<h2 id="doc-page-header" class="text-2xl md:text-4xl font-bold text-black">Domain Language Explorer</h2>
|
|
66
|
+
<h2 class="text-2xl pt-2 text-gray-500 font-light">{props.data.name} domain</h2>
|
|
67
|
+
</div>
|
|
68
|
+
</div>
|
|
69
|
+
|
|
70
|
+
{
|
|
71
|
+
!ubiquitousLanguage && (
|
|
72
|
+
<div class="bg-yellow-50 border-l-4 border-yellow-400 p-4 my-4">
|
|
73
|
+
<p class="text-yellow-700">
|
|
74
|
+
This domain does not have any defined ubiquitous language terms yet. Consider adding some terms to help establish
|
|
75
|
+
a common vocabulary for your domain.
|
|
76
|
+
</p>
|
|
77
|
+
</div>
|
|
78
|
+
)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
<div class="py-4 w-full min-h-[calc(100vh-10em)]">
|
|
82
|
+
{
|
|
83
|
+
ubiquitousLanguage && (
|
|
84
|
+
<>
|
|
85
|
+
<div class="mb-6">
|
|
86
|
+
<input
|
|
87
|
+
type="text"
|
|
88
|
+
id="searchInput"
|
|
89
|
+
placeholder="Search terms..."
|
|
90
|
+
class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
|
|
91
|
+
/>
|
|
92
|
+
</div>
|
|
93
|
+
|
|
94
|
+
{!ubiquitousLanguage ? (
|
|
95
|
+
<div class="text-center py-12 bg-gray-50 rounded-lg">
|
|
96
|
+
<h3 class="text-lg font-medium text-gray-900">No domain language terms</h3>
|
|
97
|
+
<p class="mt-2 text-sm text-gray-500">There are no language terms defined for this domain yet.</p>
|
|
98
|
+
</div>
|
|
99
|
+
) : (
|
|
100
|
+
<div id="termsGrid" class="grid grid-cols-1 md:grid-cols-3 gap-4">
|
|
101
|
+
{ubiquitousLanguage?.data?.dictionary?.map((term) => (
|
|
102
|
+
<div class="term-card block bg-white border border-gray-200 rounded-lg p-6 transition-all duration-300 ease-in-out hover:shadow-md hover:border-primary focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-primary focus:ring-white min-h-[12em] cursor-pointer">
|
|
103
|
+
<div class="flex flex-col h-full space-y-8">
|
|
104
|
+
{term.icon && (
|
|
105
|
+
<>
|
|
106
|
+
{(() => {
|
|
107
|
+
const Icon = LucideIcons[term.icon as keyof typeof LucideIcons];
|
|
108
|
+
//@ts-ignore
|
|
109
|
+
return Icon ? <Icon className="w-6 h-6 text-primary" /> : null;
|
|
110
|
+
})()}
|
|
111
|
+
</>
|
|
112
|
+
)}
|
|
113
|
+
<div>
|
|
114
|
+
<h3 class="text-gray-800 text-lg font-semibold transition-colors duration-300 ease-in-out group-hover:text-gray-300">
|
|
115
|
+
{term.name}
|
|
116
|
+
</h3>
|
|
117
|
+
<div class="term-content">
|
|
118
|
+
<p class="summary-text text-gray-600 transition-colors duration-300 ease-in-out group-hover:text-gray-200 m-0 font-light text-sm mb-4">
|
|
119
|
+
{term.summary}
|
|
120
|
+
</p>
|
|
121
|
+
{term.description && (
|
|
122
|
+
<>
|
|
123
|
+
<p class="description-text hidden text-gray-600 transition-colors duration-300 ease-in-out group-hover:text-gray-200 m-0 font-light text-sm whitespace-pre-line">
|
|
124
|
+
{term.description}
|
|
125
|
+
</p>
|
|
126
|
+
<span class="show-more-text text-sm text-primary font-medium">Show more</span>
|
|
127
|
+
</>
|
|
128
|
+
)}
|
|
129
|
+
</div>
|
|
130
|
+
</div>
|
|
131
|
+
</div>
|
|
132
|
+
</div>
|
|
133
|
+
))}
|
|
134
|
+
</div>
|
|
135
|
+
)}
|
|
136
|
+
|
|
137
|
+
<div id="noSearchResults" class="hidden text-center py-12 bg-gray-50 rounded-lg">
|
|
138
|
+
<h3 class="text-lg font-medium text-gray-900">No matching terms</h3>
|
|
139
|
+
<p class="mt-2 text-sm text-gray-500">Try adjusting your search terms.</p>
|
|
140
|
+
</div>
|
|
141
|
+
</>
|
|
142
|
+
)
|
|
143
|
+
}
|
|
144
|
+
</div>
|
|
145
|
+
|
|
146
|
+
<Footer />
|
|
147
|
+
</div>
|
|
148
|
+
</div>
|
|
149
|
+
<ViewTransitions />
|
|
150
|
+
</main>
|
|
151
|
+
|
|
152
|
+
<script>
|
|
153
|
+
function initializeSearch() {
|
|
154
|
+
const searchInput = document.getElementById('searchInput');
|
|
155
|
+
const termCards = document.querySelectorAll('.term-card');
|
|
156
|
+
const noSearchResults = document.getElementById('noSearchResults');
|
|
157
|
+
|
|
158
|
+
searchInput?.addEventListener('input', (e) => {
|
|
159
|
+
const searchTerm = (e.target as HTMLInputElement).value.toLowerCase();
|
|
160
|
+
let visibleCount = 0;
|
|
161
|
+
|
|
162
|
+
termCards.forEach((card) => {
|
|
163
|
+
const title = card.querySelector('h3')?.textContent?.toLowerCase() || '';
|
|
164
|
+
const description = card.querySelector('p')?.textContent?.toLowerCase() || '';
|
|
165
|
+
const matches = title.includes(searchTerm) || description.includes(searchTerm);
|
|
166
|
+
|
|
167
|
+
card.classList.toggle('hidden', !matches);
|
|
168
|
+
if (matches) visibleCount++;
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
// Show/hide no results message
|
|
172
|
+
if (noSearchResults) {
|
|
173
|
+
noSearchResults.classList.toggle('hidden', visibleCount > 0);
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function initializeShowMore() {
|
|
179
|
+
const cards = document.querySelectorAll('.term-card');
|
|
180
|
+
|
|
181
|
+
cards.forEach((card) => {
|
|
182
|
+
const newCard = card.cloneNode(true);
|
|
183
|
+
if (card.parentNode) {
|
|
184
|
+
card.parentNode.replaceChild(newCard, card);
|
|
185
|
+
// Initially show summary
|
|
186
|
+
const summary = (newCard as Element).querySelector('.summary-text');
|
|
187
|
+
summary?.classList.add('visible');
|
|
188
|
+
}
|
|
189
|
+
newCard.addEventListener('click', () => {
|
|
190
|
+
const description = (newCard as Element).querySelector('.description-text');
|
|
191
|
+
const summary = (newCard as Element).querySelector('.summary-text');
|
|
192
|
+
const showMoreText = (newCard as Element).querySelector('.show-more-text');
|
|
193
|
+
|
|
194
|
+
if (description && summary && showMoreText) {
|
|
195
|
+
(newCard as Element).classList.toggle('expanded');
|
|
196
|
+
description.classList.toggle('visible');
|
|
197
|
+
summary.classList.toggle('visible');
|
|
198
|
+
showMoreText.textContent = description.classList.contains('visible') ? 'Show less' : 'Show more';
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function highlightMatchingTerm() {
|
|
205
|
+
const urlParams = new URLSearchParams(window.location.search);
|
|
206
|
+
const termId = urlParams.get('id');
|
|
207
|
+
|
|
208
|
+
if (termId) {
|
|
209
|
+
const cards = document.querySelectorAll('.term-card');
|
|
210
|
+
cards.forEach((card) => {
|
|
211
|
+
const termName = card.querySelector('h3')?.textContent?.trim();
|
|
212
|
+
if (termName?.toLowerCase() === termId.toLowerCase()) {
|
|
213
|
+
// Add highlight class
|
|
214
|
+
card.classList.add('highlighted');
|
|
215
|
+
(card as HTMLElement).click();
|
|
216
|
+
|
|
217
|
+
setTimeout(() => {
|
|
218
|
+
// Scroll into view
|
|
219
|
+
card.scrollIntoView({ behavior: 'smooth', block: 'center' });
|
|
220
|
+
}, 300);
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
document.addEventListener('astro:page-load', () => {
|
|
227
|
+
initializeShowMore();
|
|
228
|
+
initializeSearch();
|
|
229
|
+
highlightMatchingTerm();
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
initializeShowMore();
|
|
233
|
+
initializeSearch();
|
|
234
|
+
highlightMatchingTerm();
|
|
235
|
+
</script>
|
|
236
|
+
|
|
237
|
+
<style is:global>
|
|
238
|
+
.term-card {
|
|
239
|
+
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
240
|
+
min-height: 12em;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
.term-card.expanded {
|
|
244
|
+
min-height: 24em;
|
|
245
|
+
background-color: rgb(249 250 251);
|
|
246
|
+
z-index: 10;
|
|
247
|
+
box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
.summary-text,
|
|
251
|
+
.description-text {
|
|
252
|
+
transition:
|
|
253
|
+
opacity 0.3s ease-in-out,
|
|
254
|
+
max-height 0.3s ease-in-out;
|
|
255
|
+
opacity: 0;
|
|
256
|
+
max-height: 0;
|
|
257
|
+
overflow: hidden;
|
|
258
|
+
display: none;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
.summary-text.visible,
|
|
262
|
+
.description-text.visible {
|
|
263
|
+
opacity: 1;
|
|
264
|
+
max-height: 500px;
|
|
265
|
+
margin-bottom: 1rem;
|
|
266
|
+
display: block;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
.description-text {
|
|
270
|
+
white-space: pre-line;
|
|
271
|
+
line-height: 1.5;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
.show-more-text {
|
|
275
|
+
display: block;
|
|
276
|
+
margin-top: 0.5rem;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
.term-card.expanded .show-more-text {
|
|
280
|
+
display: none;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
.term-card.highlighted {
|
|
284
|
+
border-color: var(--color-primary);
|
|
285
|
+
box-shadow: 0 0 0 2px var(--color-primary);
|
|
286
|
+
animation: pulse 1s;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
@keyframes pulse {
|
|
290
|
+
0%,
|
|
291
|
+
100% {
|
|
292
|
+
transform: scale(1);
|
|
293
|
+
box-shadow: 0 0 0 2px var(--color-primary);
|
|
294
|
+
}
|
|
295
|
+
50% {
|
|
296
|
+
transform: scale(1.01);
|
|
297
|
+
box-shadow: 0 0 0 4px var(--color-primary);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
</style>
|
|
301
|
+
</VerticalSideBarLayout>
|
|
@@ -6,7 +6,7 @@ import path from 'path';
|
|
|
6
6
|
const PROJECT_DIR = process.env.PROJECT_DIR || process.cwd();
|
|
7
7
|
|
|
8
8
|
export type Domain = CollectionEntry<'domains'>;
|
|
9
|
-
|
|
9
|
+
export type UbiquitousLanguage = CollectionEntry<'ubiquitousLanguages'>;
|
|
10
10
|
interface Props {
|
|
11
11
|
getAllVersions?: boolean;
|
|
12
12
|
}
|
|
@@ -28,7 +28,9 @@ export const getDomains = async ({ getAllVersions = true }: Props = {}): Promise
|
|
|
28
28
|
const servicesInDomain = domain.data.services || [];
|
|
29
29
|
|
|
30
30
|
const services = servicesInDomain
|
|
31
|
-
.map((_service
|
|
31
|
+
.map((_service: { id: string; version: string | undefined }) =>
|
|
32
|
+
getItemsFromCollectionByIdAndSemverOrLatest(servicesCollection, _service.id, _service.version)
|
|
33
|
+
)
|
|
32
34
|
.flat();
|
|
33
35
|
|
|
34
36
|
return {
|
|
@@ -50,3 +52,16 @@ export const getDomains = async ({ getAllVersions = true }: Props = {}): Promise
|
|
|
50
52
|
};
|
|
51
53
|
});
|
|
52
54
|
};
|
|
55
|
+
|
|
56
|
+
export const getUbiquitousLanguage = async (domain: Domain): Promise<UbiquitousLanguage[]> => {
|
|
57
|
+
const { collection, data, slug } = domain;
|
|
58
|
+
|
|
59
|
+
const allUbiquitousLanguages = await getCollection('ubiquitousLanguages');
|
|
60
|
+
console.log('allUbiquitousLanguages', allUbiquitousLanguages, collection, slug, data.name);
|
|
61
|
+
|
|
62
|
+
const ubiquitousLanguages = await getCollection('ubiquitousLanguages', (ubiquitousLanguage) => {
|
|
63
|
+
return ubiquitousLanguage.id.includes(`${collection}/${data.name}`);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
return ubiquitousLanguages;
|
|
67
|
+
};
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
ArrowsRightLeftIcon,
|
|
11
11
|
VariableIcon,
|
|
12
12
|
} from '@heroicons/react/24/outline';
|
|
13
|
+
import { BookText } from 'lucide-react';
|
|
13
14
|
|
|
14
15
|
export const getIconForCollection = (collection: string) => {
|
|
15
16
|
switch (collection) {
|
|
@@ -33,6 +34,8 @@ export const getIconForCollection = (collection: string) => {
|
|
|
33
34
|
return ArrowsRightLeftIcon;
|
|
34
35
|
case 'channels-parameter':
|
|
35
36
|
return VariableIcon;
|
|
37
|
+
case 'ubiquitousLanguages':
|
|
38
|
+
return BookText;
|
|
36
39
|
default:
|
|
37
40
|
return ServerIcon;
|
|
38
41
|
}
|
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"url": "https://github.com/event-catalog/eventcatalog.git"
|
|
7
7
|
},
|
|
8
8
|
"type": "module",
|
|
9
|
-
"version": "2.
|
|
9
|
+
"version": "2.16.0",
|
|
10
10
|
"publishConfig": {
|
|
11
11
|
"access": "public"
|
|
12
12
|
},
|
|
@@ -68,6 +68,7 @@
|
|
|
68
68
|
"glob": "^10.4.1",
|
|
69
69
|
"gray-matter": "^4.0.3",
|
|
70
70
|
"html-to-image": "^1.11.11",
|
|
71
|
+
"js-yaml": "^4.1.0",
|
|
71
72
|
"lodash.debounce": "^4.0.8",
|
|
72
73
|
"lodash.merge": "4.6.2",
|
|
73
74
|
"lucide-react": "^0.453.0",
|
|
@@ -91,6 +92,7 @@
|
|
|
91
92
|
"@playwright/test": "^1.48.1",
|
|
92
93
|
"@types/dagre": "^0.7.52",
|
|
93
94
|
"@types/diff": "^5.2.2",
|
|
95
|
+
"@types/js-yaml": "^4.0.9",
|
|
94
96
|
"@types/lodash.debounce": "^4.0.9",
|
|
95
97
|
"@types/lodash.merge": "4.6.9",
|
|
96
98
|
"@types/node": "^20.14.2",
|