@fundamental-ngx/mcp 0.62.0-rc.67

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.
Files changed (33) hide show
  1. package/README.md +109 -0
  2. package/package.json +21 -0
  3. package/src/data/components.json +61370 -0
  4. package/src/extractors/build-metadata.d.ts +8 -0
  5. package/src/extractors/build-metadata.js +178 -0
  6. package/src/extractors/build-metadata.js.map +1 -0
  7. package/src/extractors/cem-extractor.d.ts +17 -0
  8. package/src/extractors/cem-extractor.js +430 -0
  9. package/src/extractors/cem-extractor.js.map +1 -0
  10. package/src/extractors/changelog-extractor.d.ts +6 -0
  11. package/src/extractors/changelog-extractor.js +115 -0
  12. package/src/extractors/changelog-extractor.js.map +1 -0
  13. package/src/extractors/description-extractor.d.ts +11 -0
  14. package/src/extractors/description-extractor.js +58 -0
  15. package/src/extractors/description-extractor.js.map +1 -0
  16. package/src/extractors/example-extractor.d.ts +19 -0
  17. package/src/extractors/example-extractor.js +67 -0
  18. package/src/extractors/example-extractor.js.map +1 -0
  19. package/src/extractors/token-extractor.d.ts +6 -0
  20. package/src/extractors/token-extractor.js +345 -0
  21. package/src/extractors/token-extractor.js.map +1 -0
  22. package/src/extractors/typedoc-extractor.d.ts +16 -0
  23. package/src/extractors/typedoc-extractor.js +576 -0
  24. package/src/extractors/typedoc-extractor.js.map +1 -0
  25. package/src/index.d.ts +2 -0
  26. package/src/index.js +3 -0
  27. package/src/index.js.map +1 -0
  28. package/src/server.d.ts +1 -0
  29. package/src/server.js +794 -0
  30. package/src/server.js.map +1 -0
  31. package/src/types/component-metadata.d.ts +177 -0
  32. package/src/types/component-metadata.js +21 -0
  33. package/src/types/component-metadata.js.map +1 -0
@@ -0,0 +1,6 @@
1
+ import { ChangelogEntry } from '../types/component-metadata';
2
+ /**
3
+ * Extract changelog entries from all library CHANGELOG.md files.
4
+ * Parses conventional-changelog format into structured entries.
5
+ */
6
+ export declare function extractChangelogs(basePath: string): Promise<ChangelogEntry[]>;
@@ -0,0 +1,115 @@
1
+ import { readFile } from 'fs/promises';
2
+ import { resolve } from 'path';
3
+ const LIBRARY_CHANGELOGS = [
4
+ { path: 'libs/core/CHANGELOG.md', library: '@fundamental-ngx/core' },
5
+ { path: 'libs/platform/CHANGELOG.md', library: '@fundamental-ngx/platform' },
6
+ { path: 'libs/btp/CHANGELOG.md', library: '@fundamental-ngx/btp' },
7
+ { path: 'libs/cx/CHANGELOG.md', library: '@fundamental-ngx/cx' },
8
+ { path: 'libs/cdk/CHANGELOG.md', library: '@fundamental-ngx/cdk' },
9
+ { path: 'libs/i18n/CHANGELOG.md', library: '@fundamental-ngx/i18n' }
10
+ ];
11
+ /**
12
+ * Extract changelog entries from all library CHANGELOG.md files.
13
+ * Parses conventional-changelog format into structured entries.
14
+ */
15
+ export async function extractChangelogs(basePath) {
16
+ const allEntries = [];
17
+ for (const config of LIBRARY_CHANGELOGS) {
18
+ try {
19
+ const content = await readFile(resolve(basePath, config.path), 'utf-8');
20
+ const entries = parseChangelog(content, config.library);
21
+ allEntries.push(...entries);
22
+ }
23
+ catch {
24
+ // CHANGELOG.md may not exist for all libraries
25
+ }
26
+ }
27
+ return allEntries;
28
+ }
29
+ /**
30
+ * Parse a CHANGELOG.md into structured entries.
31
+ *
32
+ * Supports two formats:
33
+ *
34
+ * Lerna (pre-0.58):
35
+ * ```
36
+ * # [0.58.0-rc.25](url) (2025-11-26)
37
+ * ### Bug Fixes
38
+ * * **core:** description (#1234) (hash)
39
+ * ### Features
40
+ * * **platform:** description (#1234) (hash)
41
+ * ### BREAKING CHANGES
42
+ * * **core:** description
43
+ * ```
44
+ *
45
+ * NX Release (0.58+):
46
+ * ```
47
+ * ## 0.62.0-rc.67 (2026-04-11)
48
+ * ### 🩹 Fixes
49
+ * - **core:** description ([#1234](url))
50
+ * ### 🚀 Features
51
+ * - **platform:** description ([#1234](url))
52
+ * ### ⚠️ Breaking Changes
53
+ * - **core:** description
54
+ * ```
55
+ */
56
+ function parseChangelog(content, library) {
57
+ const entries = [];
58
+ const lines = content.split('\n');
59
+ let currentVersion = '';
60
+ let currentSection = null;
61
+ for (const line of lines) {
62
+ // Version header - Lerna: # [0.58.0-rc.25](url) (date)
63
+ const lernaVersionMatch = line.match(/^#\s+\[([^\]]+)\]/);
64
+ if (lernaVersionMatch) {
65
+ currentVersion = lernaVersionMatch[1];
66
+ currentSection = null;
67
+ continue;
68
+ }
69
+ // Version header - NX: ## 0.62.0-rc.67 (date)
70
+ const nxVersionMatch = line.match(/^## (\d+\.\d+\.\d+(?:-[^\s]+)?)\s+\(/);
71
+ if (nxVersionMatch) {
72
+ currentVersion = nxVersionMatch[1];
73
+ currentSection = null;
74
+ continue;
75
+ }
76
+ // Section header - matches both Lerna ("Bug Fixes", "Features") and NX ("🩹 Fixes", "🚀 Features")
77
+ if (line.match(/^###?\s+(?:🩹\s+)?(?:Bug )?Fixes/i)) {
78
+ currentSection = 'fix';
79
+ continue;
80
+ }
81
+ if (line.match(/^###?\s+(?:🚀\s+)?Features/i)) {
82
+ currentSection = 'feature';
83
+ continue;
84
+ }
85
+ if (line.match(/^###?\s+(?:⚠️\s+)?Breaking Change/i)) {
86
+ currentSection = 'breaking';
87
+ continue;
88
+ }
89
+ if (line.match(/^###?\s+Deprecat/i)) {
90
+ currentSection = 'deprecation';
91
+ continue;
92
+ }
93
+ // Entry line - Lerna: * **scope:** desc | NX: - **scope:** desc
94
+ if (currentSection && currentVersion) {
95
+ const entryMatch = line.match(/^[-*]\s+(?:⚠️\s+)?\*\*([^*:]+):\*\*\s+(.+)/);
96
+ if (entryMatch) {
97
+ const scope = entryMatch[1].trim();
98
+ const rawDescription = entryMatch[2]
99
+ .replace(/\s*\(\[[\da-f]+\]\([^)]+\)\)$/, '') // Remove commit hash link (Lerna)
100
+ .replace(/\s*\(\[#\d+\]\([^)]+\)\)$/, '') // Remove PR link (NX)
101
+ .replace(/\s*\(#\d+\)/, '') // Remove bare issue reference
102
+ .trim();
103
+ entries.push({
104
+ library,
105
+ version: currentVersion,
106
+ type: currentSection,
107
+ description: rawDescription,
108
+ component: scope !== library.split('/')[1] ? scope : undefined
109
+ });
110
+ }
111
+ }
112
+ }
113
+ return entries;
114
+ }
115
+ //# sourceMappingURL=changelog-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changelog-extractor.js","sourceRoot":"","sources":["../../../../../libs/mcp-server/src/extractors/changelog-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Extract human-written component descriptions from the docs app header templates.
3
+ *
4
+ * Each component's docs page has a `*-header.component.html` file containing:
5
+ * ```html
6
+ * <description>Human-readable description text...</description>
7
+ * ```
8
+ *
9
+ * @returns Map from `"<package>/<component>"` (e.g. `"core/wizard"`) to the description string.
10
+ */
11
+ export declare function extractDescriptions(basePath: string): Promise<Map<string, string>>;
@@ -0,0 +1,58 @@
1
+ import { glob } from 'fast-glob';
2
+ import { readFile } from 'fs/promises';
3
+ import { resolve } from 'path';
4
+ /**
5
+ * Extract human-written component descriptions from the docs app header templates.
6
+ *
7
+ * Each component's docs page has a `*-header.component.html` file containing:
8
+ * ```html
9
+ * <description>Human-readable description text...</description>
10
+ * ```
11
+ *
12
+ * @returns Map from `"<package>/<component>"` (e.g. `"core/wizard"`) to the description string.
13
+ */
14
+ export async function extractDescriptions(basePath) {
15
+ const docsRoot = resolve(basePath, 'libs/docs');
16
+ const pattern = '*/**/*-header.component.html';
17
+ const files = await glob(pattern, { cwd: docsRoot, absolute: false });
18
+ const descriptions = new Map();
19
+ await Promise.all(files.map(async (relPath) => {
20
+ // relPath: "core/wizard/wizard-header/wizard-header.component.html"
21
+ const parts = relPath.split('/');
22
+ if (parts.length < 3) {
23
+ return;
24
+ }
25
+ const pkg = parts[0]; // "core", "platform", "btp", etc.
26
+ const component = parts[1]; // "wizard", "info-label", etc.
27
+ const key = `${pkg}/${component}`;
28
+ try {
29
+ const html = await readFile(resolve(docsRoot, relPath), 'utf-8');
30
+ const description = parseDescription(html);
31
+ if (description) {
32
+ descriptions.set(key, description);
33
+ }
34
+ }
35
+ catch {
36
+ // skip unreadable files
37
+ }
38
+ }));
39
+ return descriptions;
40
+ }
41
+ /**
42
+ * Parse the `<description>...</description>` content from a header template,
43
+ * stripping HTML tags and normalising whitespace into a plain-text string.
44
+ */
45
+ function parseDescription(html) {
46
+ const match = html.match(/<description>([\s\S]*?)<\/description>/);
47
+ if (!match) {
48
+ return null;
49
+ }
50
+ const raw = match[1]
51
+ // Strip HTML tags
52
+ .replace(/<[^>]+>/g, ' ')
53
+ // Collapse whitespace
54
+ .replace(/\s+/g, ' ')
55
+ .trim();
56
+ return raw || null;
57
+ }
58
+ //# sourceMappingURL=description-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"description-extractor.js","sourceRoot":"","sources":["../../../../../libs/mcp-server/src/extractors/description-extractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,QAAgB;IACtD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,8BAA8B,CAAC;IAC/C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAEtE,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE/C,MAAM,OAAO,CAAC,GAAG,CACb,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,oEAAoE;QACpE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnB,OAAO;QACX,CAAC;QAED,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,kCAAkC;QACxD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,+BAA+B;QAC3D,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC;QAElC,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;YACjE,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,WAAW,EAAE,CAAC;gBACd,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YACvC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,wBAAwB;QAC5B,CAAC;IACL,CAAC,CAAC,CACL,CAAC;IAEF,OAAO,YAAY,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,IAAY;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACnE,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;QAChB,kBAAkB;SACjB,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;QACzB,sBAAsB;SACrB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;IAEZ,OAAO,GAAG,IAAI,IAAI,CAAC;AACvB,CAAC"}
@@ -0,0 +1,19 @@
1
+ export interface ComponentExample {
2
+ /** Component directory name, e.g. "button", "dialog" */
3
+ componentDir: string;
4
+ /** Library name, e.g. "core", "platform" */
5
+ libraryDir: string;
6
+ /** Example file name, e.g. "button-types-example" */
7
+ name: string;
8
+ /** Description derived from file name */
9
+ description: string;
10
+ /** TypeScript source code */
11
+ typescript: string;
12
+ /** HTML template (if separate file exists) */
13
+ html?: string;
14
+ }
15
+ /**
16
+ * Extract example components from the docs folder.
17
+ * Examples live at: libs/docs/{library}/{component}/examples/*-example.component.ts
18
+ */
19
+ export declare function extractExamples(basePath: string): Promise<Map<string, ComponentExample[]>>;
@@ -0,0 +1,67 @@
1
+ import { glob } from 'fast-glob';
2
+ import { readFile } from 'fs/promises';
3
+ import { resolve } from 'path';
4
+ /**
5
+ * Extract example components from the docs folder.
6
+ * Examples live at: libs/docs/{library}/{component}/examples/*-example.component.ts
7
+ */
8
+ export async function extractExamples(basePath) {
9
+ const pattern = 'libs/docs/*/*/examples/*-example.component.ts';
10
+ const files = await glob(pattern, { cwd: basePath, absolute: false });
11
+ const exampleMap = new Map();
12
+ for (const file of files) {
13
+ // Parse path: libs/docs/{library}/{component}/examples/{name}.component.ts
14
+ const parts = file.split('/');
15
+ if (parts.length < 6) {
16
+ continue;
17
+ }
18
+ const libraryDir = parts[2]; // e.g. "core", "platform"
19
+ const componentDir = parts[3]; // e.g. "button", "dialog"
20
+ const fileName = parts[5]; // e.g. "button-types-example.component.ts"
21
+ // Skip non-example files
22
+ if (!fileName.includes('-example.component.ts')) {
23
+ continue;
24
+ }
25
+ const exampleName = fileName.replace('.component.ts', '');
26
+ const description = formatExampleName(exampleName);
27
+ try {
28
+ const tsContent = await readFile(resolve(basePath, file), 'utf-8');
29
+ // Check for a matching HTML template
30
+ const htmlPath = file.replace('.component.ts', '.component.html');
31
+ let htmlContent;
32
+ try {
33
+ htmlContent = await readFile(resolve(basePath, htmlPath), 'utf-8');
34
+ }
35
+ catch {
36
+ // No separate HTML file — template is inline in the TS file
37
+ }
38
+ const example = {
39
+ componentDir,
40
+ libraryDir,
41
+ name: exampleName,
42
+ description,
43
+ typescript: tsContent,
44
+ html: htmlContent
45
+ };
46
+ const key = `${libraryDir}/${componentDir}`;
47
+ const existing = exampleMap.get(key) ?? [];
48
+ existing.push(example);
49
+ exampleMap.set(key, existing);
50
+ }
51
+ catch {
52
+ // Skip unreadable files
53
+ }
54
+ }
55
+ return exampleMap;
56
+ }
57
+ /**
58
+ * Convert a file name like "button-types-example" to "Button Types".
59
+ */
60
+ function formatExampleName(name) {
61
+ return name
62
+ .replace(/-example$/, '')
63
+ .split('-')
64
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
65
+ .join(' ');
66
+ }
67
+ //# sourceMappingURL=example-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example-extractor.js","sourceRoot":"","sources":["../../../../../libs/mcp-server/src/extractors/example-extractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAiB/B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB;IAClD,MAAM,OAAO,GAAG,+CAA+C,CAAC;IAChE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAEtE,MAAM,UAAU,GAAG,IAAI,GAAG,EAA8B,CAAC;IAEzD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,2EAA2E;QAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnB,SAAS;QACb,CAAC;QAED,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,0BAA0B;QACvD,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,0BAA0B;QACzD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,2CAA2C;QAEtE,yBAAyB;QACzB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;YAC9C,SAAS;QACb,CAAC;QAED,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAEnD,IAAI,CAAC;YACD,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YAEnE,qCAAqC;YACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;YAClE,IAAI,WAA+B,CAAC;YACpC,IAAI,CAAC;gBACD,WAAW,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;YACvE,CAAC;YAAC,MAAM,CAAC;gBACL,4DAA4D;YAChE,CAAC;YAED,MAAM,OAAO,GAAqB;gBAC9B,YAAY;gBACZ,UAAU;gBACV,IAAI,EAAE,WAAW;gBACjB,WAAW;gBACX,UAAU,EAAE,SAAS;gBACrB,IAAI,EAAE,WAAW;aACpB,CAAC;YAEF,MAAM,GAAG,GAAG,GAAG,UAAU,IAAI,YAAY,EAAE,CAAC;YAC5C,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAC3C,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACL,wBAAwB;QAC5B,CAAC;IACL,CAAC;IAED,OAAO,UAAU,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,IAAY;IACnC,OAAO,IAAI;SACN,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;SACxB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { DesignToken } from '../types/component-metadata';
2
+ /**
3
+ * Extract design tokens from fundamental-styles utility CSS files
4
+ * and SAP theming CSS custom properties.
5
+ */
6
+ export declare function extractDesignTokens(basePath: string): Promise<DesignToken[]>;
@@ -0,0 +1,345 @@
1
+ import { readFile } from 'fs/promises';
2
+ import { resolve } from 'path';
3
+ /**
4
+ * Extract design tokens from fundamental-styles utility CSS files
5
+ * and SAP theming CSS custom properties.
6
+ */
7
+ export async function extractDesignTokens(basePath) {
8
+ const tokens = [];
9
+ // Extract utility classes from fundamental-styles
10
+ tokens.push(...(await extractUtilityClasses(basePath)));
11
+ // Extract SAP theme CSS custom properties
12
+ tokens.push(...getSapThemeTokens());
13
+ return tokens;
14
+ }
15
+ /**
16
+ * Parse utility class names and their CSS values from fundamental-styles dist files.
17
+ */
18
+ async function extractUtilityClasses(basePath) {
19
+ const tokens = [];
20
+ const utilityFiles = [
21
+ { file: 'node_modules/fundamental-styles/dist/margins.css', category: 'spacing' },
22
+ { file: 'node_modules/fundamental-styles/dist/paddings.css', category: 'spacing' }
23
+ ];
24
+ for (const { file, category } of utilityFiles) {
25
+ try {
26
+ const content = await readFile(resolve(basePath, file), 'utf-8');
27
+ const classTokens = parseUtilityClassesFromCss(content, category);
28
+ tokens.push(...classTokens);
29
+ }
30
+ catch {
31
+ // File may not exist
32
+ }
33
+ }
34
+ return tokens;
35
+ }
36
+ /**
37
+ * Parse CSS class names from a minified/normal CSS file.
38
+ * Matches patterns like: .fd-margin--tiny{margin-block:.5rem;...}
39
+ */
40
+ function parseUtilityClassesFromCss(css, category) {
41
+ const tokens = [];
42
+ const classPattern = /\.(fd-[a-z0-9-]+)\{([^}]+)\}/g;
43
+ let match;
44
+ while ((match = classPattern.exec(css)) !== null) {
45
+ const className = match[1];
46
+ const properties = match[2];
47
+ tokens.push({
48
+ name: className,
49
+ category,
50
+ description: describeUtilityClass(className),
51
+ value: cleanCssValue(properties),
52
+ example: `<div class="${className}">...</div>`
53
+ });
54
+ }
55
+ return tokens;
56
+ }
57
+ function describeUtilityClass(className) {
58
+ const parts = className.replace('fd-', '').split('--');
59
+ const property = parts[0].split('-').join(' ');
60
+ const size = parts[1] || '';
61
+ const sizeMap = {
62
+ tiny: '0.5rem',
63
+ sm: '1rem',
64
+ md: '2rem',
65
+ lg: '3rem',
66
+ none: '0'
67
+ };
68
+ const sizeDesc = sizeMap[size] ? ` (${sizeMap[size]})` : '';
69
+ return `Applies ${property}${sizeDesc}`;
70
+ }
71
+ function cleanCssValue(raw) {
72
+ // Take only the first few property declarations, trim vendor prefixes
73
+ return raw
74
+ .split(';')
75
+ .filter((p) => !p.includes('-webkit-'))
76
+ .slice(0, 2)
77
+ .join('; ')
78
+ .trim();
79
+ }
80
+ /**
81
+ * Common SAP theme CSS custom properties.
82
+ * These are defined by @sap-theming/theming-base-content and available at runtime.
83
+ */
84
+ function getSapThemeTokens() {
85
+ return [
86
+ // Colors
87
+ {
88
+ name: '--sapBackgroundColor',
89
+ category: 'color',
90
+ description: 'Base background color',
91
+ example: 'background-color: var(--sapBackgroundColor)'
92
+ },
93
+ {
94
+ name: '--sapBrandColor',
95
+ category: 'color',
96
+ description: 'Brand/accent color',
97
+ example: 'color: var(--sapBrandColor)'
98
+ },
99
+ {
100
+ name: '--sapTextColor',
101
+ category: 'color',
102
+ description: 'Default text color',
103
+ example: 'color: var(--sapTextColor)'
104
+ },
105
+ {
106
+ name: '--sapLinkColor',
107
+ category: 'color',
108
+ description: 'Link text color',
109
+ example: 'color: var(--sapLinkColor)'
110
+ },
111
+ {
112
+ name: '--sapShellColor',
113
+ category: 'color',
114
+ description: 'Shell/header background',
115
+ example: 'background-color: var(--sapShellColor)'
116
+ },
117
+ {
118
+ name: '--sapButton_Background',
119
+ category: 'color',
120
+ description: 'Default button background',
121
+ example: 'background-color: var(--sapButton_Background)'
122
+ },
123
+ {
124
+ name: '--sapButton_Emphasized_Background',
125
+ category: 'color',
126
+ description: 'Emphasized button background',
127
+ example: 'background-color: var(--sapButton_Emphasized_Background)'
128
+ },
129
+ {
130
+ name: '--sapPositiveColor',
131
+ category: 'color',
132
+ description: 'Positive/success semantic color',
133
+ example: 'color: var(--sapPositiveColor)'
134
+ },
135
+ {
136
+ name: '--sapNegativeColor',
137
+ category: 'color',
138
+ description: 'Negative/error semantic color',
139
+ example: 'color: var(--sapNegativeColor)'
140
+ },
141
+ {
142
+ name: '--sapCriticalColor',
143
+ category: 'color',
144
+ description: 'Critical/warning semantic color',
145
+ example: 'color: var(--sapCriticalColor)'
146
+ },
147
+ {
148
+ name: '--sapInformativeColor',
149
+ category: 'color',
150
+ description: 'Informative semantic color',
151
+ example: 'color: var(--sapInformativeColor)'
152
+ },
153
+ {
154
+ name: '--sapNeutralColor',
155
+ category: 'color',
156
+ description: 'Neutral semantic color',
157
+ example: 'color: var(--sapNeutralColor)'
158
+ },
159
+ {
160
+ name: '--sapField_Background',
161
+ category: 'color',
162
+ description: 'Form field background',
163
+ example: 'background-color: var(--sapField_Background)'
164
+ },
165
+ {
166
+ name: '--sapField_BorderColor',
167
+ category: 'color',
168
+ description: 'Form field border color',
169
+ example: 'border-color: var(--sapField_BorderColor)'
170
+ },
171
+ {
172
+ name: '--sapList_Background',
173
+ category: 'color',
174
+ description: 'List item background',
175
+ example: 'background-color: var(--sapList_Background)'
176
+ },
177
+ {
178
+ name: '--sapList_HeaderBackground',
179
+ category: 'color',
180
+ description: 'List header background',
181
+ example: 'background-color: var(--sapList_HeaderBackground)'
182
+ },
183
+ {
184
+ name: '--sapPageHeader_Background',
185
+ category: 'color',
186
+ description: 'Page header background',
187
+ example: 'background-color: var(--sapPageHeader_Background)'
188
+ },
189
+ {
190
+ name: '--sapObjectHeader_Background',
191
+ category: 'color',
192
+ description: 'Object header background',
193
+ example: 'background-color: var(--sapObjectHeader_Background)'
194
+ },
195
+ {
196
+ name: '--sapGroup_TitleBackground',
197
+ category: 'color',
198
+ description: 'Group title background',
199
+ example: 'background-color: var(--sapGroup_TitleBackground)'
200
+ },
201
+ {
202
+ name: '--sapTile_Background',
203
+ category: 'color',
204
+ description: 'Tile background',
205
+ example: 'background-color: var(--sapTile_Background)'
206
+ },
207
+ {
208
+ name: '--sapHighlightColor',
209
+ category: 'color',
210
+ description: 'Highlight/hover color',
211
+ example: 'background-color: var(--sapHighlightColor)'
212
+ },
213
+ {
214
+ name: '--sapSelectedColor',
215
+ category: 'color',
216
+ description: 'Selected item indicator color',
217
+ example: 'border-color: var(--sapSelectedColor)'
218
+ },
219
+ {
220
+ name: '--sapActiveColor',
221
+ category: 'color',
222
+ description: 'Active state color',
223
+ example: 'color: var(--sapActiveColor)'
224
+ },
225
+ // Typography
226
+ {
227
+ name: '--sapFontFamily',
228
+ category: 'typography',
229
+ description: 'Default font family',
230
+ example: 'font-family: var(--sapFontFamily)'
231
+ },
232
+ {
233
+ name: '--sapFontSize',
234
+ category: 'typography',
235
+ description: 'Base font size (0.875rem)',
236
+ example: 'font-size: var(--sapFontSize)'
237
+ },
238
+ {
239
+ name: '--sapFontSmallSize',
240
+ category: 'typography',
241
+ description: 'Small font size (0.75rem)',
242
+ example: 'font-size: var(--sapFontSmallSize)'
243
+ },
244
+ {
245
+ name: '--sapFontLargeSize',
246
+ category: 'typography',
247
+ description: 'Large font size (1rem)',
248
+ example: 'font-size: var(--sapFontLargeSize)'
249
+ },
250
+ {
251
+ name: '--sapFontHeader1Size',
252
+ category: 'typography',
253
+ description: 'H1 font size (2.25rem)',
254
+ example: 'font-size: var(--sapFontHeader1Size)'
255
+ },
256
+ {
257
+ name: '--sapFontHeader2Size',
258
+ category: 'typography',
259
+ description: 'H2 font size (1.5rem)',
260
+ example: 'font-size: var(--sapFontHeader2Size)'
261
+ },
262
+ {
263
+ name: '--sapFontHeader3Size',
264
+ category: 'typography',
265
+ description: 'H3 font size (1.25rem)',
266
+ example: 'font-size: var(--sapFontHeader3Size)'
267
+ },
268
+ {
269
+ name: '--sapFontHeader4Size',
270
+ category: 'typography',
271
+ description: 'H4 font size (1.125rem)',
272
+ example: 'font-size: var(--sapFontHeader4Size)'
273
+ },
274
+ {
275
+ name: '--sapFontHeader5Size',
276
+ category: 'typography',
277
+ description: 'H5 font size (1rem)',
278
+ example: 'font-size: var(--sapFontHeader5Size)'
279
+ },
280
+ // Spacing / Sizing
281
+ {
282
+ name: '--sapElement_Height',
283
+ category: 'size',
284
+ description: 'Default element height (2.75rem)',
285
+ example: 'height: var(--sapElement_Height)'
286
+ },
287
+ {
288
+ name: '--sapElement_Compact_Height',
289
+ category: 'size',
290
+ description: 'Compact element height (2rem)',
291
+ example: 'height: var(--sapElement_Compact_Height)'
292
+ },
293
+ {
294
+ name: '--sapContent_GridSize',
295
+ category: 'size',
296
+ description: 'Base grid size (1rem)',
297
+ example: 'gap: var(--sapContent_GridSize)'
298
+ },
299
+ // Elevation / Shadows
300
+ {
301
+ name: '--sapContent_Shadow0',
302
+ category: 'elevation',
303
+ description: 'Level 0 shadow (none)',
304
+ example: 'box-shadow: var(--sapContent_Shadow0)'
305
+ },
306
+ {
307
+ name: '--sapContent_Shadow1',
308
+ category: 'elevation',
309
+ description: 'Level 1 shadow (cards)',
310
+ example: 'box-shadow: var(--sapContent_Shadow1)'
311
+ },
312
+ {
313
+ name: '--sapContent_Shadow2',
314
+ category: 'elevation',
315
+ description: 'Level 2 shadow (popovers)',
316
+ example: 'box-shadow: var(--sapContent_Shadow2)'
317
+ },
318
+ {
319
+ name: '--sapContent_Shadow3',
320
+ category: 'elevation',
321
+ description: 'Level 3 shadow (dialogs)',
322
+ example: 'box-shadow: var(--sapContent_Shadow3)'
323
+ },
324
+ // Borders
325
+ {
326
+ name: '--sapField_BorderWidth',
327
+ category: 'border',
328
+ description: 'Field border width',
329
+ example: 'border-width: var(--sapField_BorderWidth)'
330
+ },
331
+ {
332
+ name: '--sapField_BorderCornerRadius',
333
+ category: 'border',
334
+ description: 'Field border radius',
335
+ example: 'border-radius: var(--sapField_BorderCornerRadius)'
336
+ },
337
+ {
338
+ name: '--sapButton_BorderCornerRadius',
339
+ category: 'border',
340
+ description: 'Button border radius',
341
+ example: 'border-radius: var(--sapButton_BorderCornerRadius)'
342
+ }
343
+ ];
344
+ }
345
+ //# sourceMappingURL=token-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-extractor.js","sourceRoot":"","sources":["../../../../../libs/mcp-server/src/extractors/token-extractor.ts"],"names":[],"mappings":"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"}