@schemyx/mcp 0.1.2 → 0.1.4
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/codebase-scanner/bundle.js +233 -1
- package/dist/codebase-scanner/bundle.js.map +1 -1
- package/dist/codebase-scanner/extractors.d.ts +4 -0
- package/dist/codebase-scanner/extractors.js +115 -3
- package/dist/codebase-scanner/extractors.js.map +1 -1
- package/dist/codebase-scanner/recipes.d.ts +7 -0
- package/dist/codebase-scanner/recipes.js +186 -0
- package/dist/codebase-scanner/recipes.js.map +1 -1
- package/dist/codebase-scanner/types.d.ts +3 -1
- package/package.json +1 -1
|
@@ -183,6 +183,8 @@ function createBundle(rootPath, projectType, files) {
|
|
|
183
183
|
const nodes = [];
|
|
184
184
|
const edges = [];
|
|
185
185
|
const reviewItems = [];
|
|
186
|
+
const componentStyleContext = createComponentStyleContext(files);
|
|
187
|
+
enrichUiElementsWithComponentStyles(files, componentStyleContext);
|
|
186
188
|
const styleResolutionContext = createStyleResolutionContext(files);
|
|
187
189
|
for (const file of files) {
|
|
188
190
|
const fileSource = sourceInfo('core.files', 'high', [`path:${file.relPath}`], file);
|
|
@@ -722,6 +724,186 @@ function createBundle(rootPath, projectType, files) {
|
|
|
722
724
|
detected: detectProjectFacts(files),
|
|
723
725
|
};
|
|
724
726
|
}
|
|
727
|
+
function createComponentStyleContext(files) {
|
|
728
|
+
const byName = new Map();
|
|
729
|
+
const byHelper = new Map();
|
|
730
|
+
for (const file of files) {
|
|
731
|
+
for (const definition of file.componentStyleDefinitions) {
|
|
732
|
+
if (!byName.has(definition.name)) {
|
|
733
|
+
byName.set(definition.name, definition);
|
|
734
|
+
}
|
|
735
|
+
if (definition.styleHelper && !byHelper.has(definition.styleHelper)) {
|
|
736
|
+
byHelper.set(definition.styleHelper, definition);
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
return { byName, byHelper };
|
|
741
|
+
}
|
|
742
|
+
function enrichUiElementsWithComponentStyles(files, context) {
|
|
743
|
+
for (const file of files) {
|
|
744
|
+
file.uiElements = file.uiElements.map((element) => enrichUiElementWithComponentStyles(element, context));
|
|
745
|
+
file.uiElements = file.uiElements.map((element) => ({
|
|
746
|
+
...element,
|
|
747
|
+
childSummary: element.childSummary?.map((child) => enrichUiChildWithComponentStyles(child, context)),
|
|
748
|
+
}));
|
|
749
|
+
file.classReferences = (0, utils_1.unique)([
|
|
750
|
+
...file.classReferences,
|
|
751
|
+
...file.uiElements.flatMap((element) => element.classes),
|
|
752
|
+
...file.uiElements.flatMap((element) => element.defaultClasses ?? []),
|
|
753
|
+
]).slice(0, 500);
|
|
754
|
+
file.tailwindUtilities = (0, utils_1.unique)([
|
|
755
|
+
...file.tailwindUtilities,
|
|
756
|
+
...file.uiElements.flatMap((element) => element.classes),
|
|
757
|
+
...file.uiElements.flatMap((element) => element.defaultClasses ?? []),
|
|
758
|
+
]).slice(0, 160);
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
function enrichUiElementWithComponentStyles(element, context) {
|
|
762
|
+
const resolved = resolveComponentStyleClasses(element.originalTag, element.styleHelper, element.variants ?? element.styleHelperVariants, context);
|
|
763
|
+
if (!resolved.classes.length) {
|
|
764
|
+
return element;
|
|
765
|
+
}
|
|
766
|
+
const defaultClasses = mergeTailwindConflictClasses([
|
|
767
|
+
...resolved.defaultClasses,
|
|
768
|
+
...(element.defaultClasses ?? []),
|
|
769
|
+
]);
|
|
770
|
+
const classes = mergeTailwindConflictClasses([
|
|
771
|
+
...resolved.classes,
|
|
772
|
+
...element.classes,
|
|
773
|
+
...defaultClasses,
|
|
774
|
+
]);
|
|
775
|
+
return {
|
|
776
|
+
...element,
|
|
777
|
+
classes,
|
|
778
|
+
defaultClasses,
|
|
779
|
+
classGroups: (0, extractors_1.groupTailwindClasses)(classes),
|
|
780
|
+
styleHelper: element.styleHelper ?? resolved.styleHelper,
|
|
781
|
+
...(element.styleHelperVariants ?? resolved.styleHelperVariants
|
|
782
|
+
? {
|
|
783
|
+
styleHelperVariants: {
|
|
784
|
+
...(resolved.styleHelperVariants ?? {}),
|
|
785
|
+
...(element.styleHelperVariants ?? {}),
|
|
786
|
+
},
|
|
787
|
+
}
|
|
788
|
+
: {}),
|
|
789
|
+
};
|
|
790
|
+
}
|
|
791
|
+
function enrichUiChildWithComponentStyles(child, context) {
|
|
792
|
+
const resolved = resolveComponentStyleClasses(child.originalTag, child.styleHelper, child.variants ?? child.styleHelperVariants, context);
|
|
793
|
+
if (!resolved.classes.length) {
|
|
794
|
+
return child;
|
|
795
|
+
}
|
|
796
|
+
const defaultClasses = mergeTailwindConflictClasses([
|
|
797
|
+
...resolved.defaultClasses,
|
|
798
|
+
...(child.defaultClasses ?? []),
|
|
799
|
+
]);
|
|
800
|
+
const classes = mergeTailwindConflictClasses([
|
|
801
|
+
...resolved.classes,
|
|
802
|
+
...child.classes,
|
|
803
|
+
...defaultClasses,
|
|
804
|
+
]);
|
|
805
|
+
return {
|
|
806
|
+
...child,
|
|
807
|
+
classes,
|
|
808
|
+
defaultClasses,
|
|
809
|
+
styleHelper: child.styleHelper ?? resolved.styleHelper,
|
|
810
|
+
...(child.styleHelperVariants ?? resolved.styleHelperVariants
|
|
811
|
+
? {
|
|
812
|
+
styleHelperVariants: {
|
|
813
|
+
...(resolved.styleHelperVariants ?? {}),
|
|
814
|
+
...(child.styleHelperVariants ?? {}),
|
|
815
|
+
},
|
|
816
|
+
}
|
|
817
|
+
: {}),
|
|
818
|
+
};
|
|
819
|
+
}
|
|
820
|
+
function resolveComponentStyleClasses(componentName, styleHelperName, variants, context) {
|
|
821
|
+
const wrapper = componentName ? context.byName.get(componentName) : undefined;
|
|
822
|
+
const helperName = styleHelperName ?? wrapper?.styleHelper;
|
|
823
|
+
const helper = helperName ? context.byName.get(helperName) : undefined;
|
|
824
|
+
const helperClasses = helper
|
|
825
|
+
? resolveComponentDefinitionClasses(helper, variants)
|
|
826
|
+
: { classes: [], defaultClasses: [] };
|
|
827
|
+
const wrapperClasses = wrapper
|
|
828
|
+
? resolveComponentDefinitionClasses(wrapper, variants)
|
|
829
|
+
: { classes: [], defaultClasses: [] };
|
|
830
|
+
const normalizedVariants = normalizeVariantRecord(variants);
|
|
831
|
+
return {
|
|
832
|
+
classes: (0, utils_1.unique)([...wrapperClasses.classes, ...helperClasses.classes]),
|
|
833
|
+
defaultClasses: (0, utils_1.unique)([...wrapperClasses.defaultClasses, ...helperClasses.defaultClasses]),
|
|
834
|
+
...(helperName ? { styleHelper: helperName } : {}),
|
|
835
|
+
...(Object.keys(normalizedVariants).length ? { styleHelperVariants: normalizedVariants } : {}),
|
|
836
|
+
};
|
|
837
|
+
}
|
|
838
|
+
function resolveComponentDefinitionClasses(definition, variants) {
|
|
839
|
+
const normalizedVariants = normalizeVariantRecord(variants);
|
|
840
|
+
const defaultClasses = new Set(definition.baseClasses);
|
|
841
|
+
const classes = new Set(definition.classes);
|
|
842
|
+
for (const [variantName, variantMap] of Object.entries(definition.variants)) {
|
|
843
|
+
const requestedVariant = normalizedVariants[variantName] ?? definition.defaultVariants[variantName];
|
|
844
|
+
if (requestedVariant && variantMap[requestedVariant]) {
|
|
845
|
+
for (const className of variantMap[requestedVariant]) {
|
|
846
|
+
defaultClasses.add(className);
|
|
847
|
+
classes.add(className);
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
}
|
|
851
|
+
return {
|
|
852
|
+
classes: Array.from(classes),
|
|
853
|
+
defaultClasses: Array.from(defaultClasses),
|
|
854
|
+
};
|
|
855
|
+
}
|
|
856
|
+
function normalizeVariantRecord(variants) {
|
|
857
|
+
const normalized = {};
|
|
858
|
+
for (const [key, value] of Object.entries(variants ?? {})) {
|
|
859
|
+
if (typeof value === 'string' && /^[A-Za-z0-9_-]+$/.test(value)) {
|
|
860
|
+
normalized[key] = value;
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
return normalized;
|
|
864
|
+
}
|
|
865
|
+
function mergeTailwindConflictClasses(classes) {
|
|
866
|
+
const result = [];
|
|
867
|
+
const keyIndexes = new Map();
|
|
868
|
+
for (const className of classes) {
|
|
869
|
+
const key = tailwindConflictKey(className);
|
|
870
|
+
if (key && keyIndexes.has(key)) {
|
|
871
|
+
result[keyIndexes.get(key)] = className;
|
|
872
|
+
continue;
|
|
873
|
+
}
|
|
874
|
+
if (key) {
|
|
875
|
+
keyIndexes.set(key, result.length);
|
|
876
|
+
}
|
|
877
|
+
result.push(className);
|
|
878
|
+
}
|
|
879
|
+
return (0, utils_1.unique)(result);
|
|
880
|
+
}
|
|
881
|
+
function tailwindConflictKey(className) {
|
|
882
|
+
const segments = className.split(':');
|
|
883
|
+
const base = segments.pop() ?? className;
|
|
884
|
+
const prefix = segments.join(':');
|
|
885
|
+
const keyPrefix = prefix ? `${prefix}|` : '';
|
|
886
|
+
if (/^-?bg-/.test(base)) {
|
|
887
|
+
return `${keyPrefix}bg`;
|
|
888
|
+
}
|
|
889
|
+
if (/^rounded(?:-|$|\[)/.test(base)) {
|
|
890
|
+
const side = base.match(/^rounded(?:-([trbl]|tl|tr|br|bl|s|e|ss|se|ee|es))?(?:-|$|\[)/)?.[1];
|
|
891
|
+
return `${keyPrefix}rounded:${side ?? 'all'}`;
|
|
892
|
+
}
|
|
893
|
+
if (/^border-(?:\[[^\]]+\]|transparent|current|black|white|[a-z]+-\d{2,3}|[a-z][a-z0-9-]*)$/.test(base)) {
|
|
894
|
+
return `${keyPrefix}border-color`;
|
|
895
|
+
}
|
|
896
|
+
if (/^text-(?:\[[^\]]+\]|transparent|current|black|white|foreground|muted-foreground|card-foreground|primary-foreground|secondary-foreground|[a-z]+-\d{2,3})$/.test(base)) {
|
|
897
|
+
return `${keyPrefix}text-color`;
|
|
898
|
+
}
|
|
899
|
+
if (/^text-(?:xs|sm|base|lg|xl|[2-9]xl|\[[^\]]+\])$/.test(base)) {
|
|
900
|
+
return `${keyPrefix}text-size`;
|
|
901
|
+
}
|
|
902
|
+
if (/^shadow(?:-|$|\[)/.test(base)) {
|
|
903
|
+
return `${keyPrefix}shadow`;
|
|
904
|
+
}
|
|
905
|
+
return undefined;
|
|
906
|
+
}
|
|
725
907
|
function addEntry(entries, usedKeys, entry) {
|
|
726
908
|
let key = entry.key;
|
|
727
909
|
if (usedKeys.has(key)) {
|
|
@@ -1641,10 +1823,41 @@ function tailwindDeclarationsForClass(className, styleContext) {
|
|
|
1641
1823
|
const [, value] = base.match(/^grid-cols-(\d+)$/) ?? [];
|
|
1642
1824
|
declarations.push(declaration('grid-template-columns', `repeat(${value}, minmax(0, 1fr))`));
|
|
1643
1825
|
}
|
|
1826
|
+
if (/^grid-cols-\[([^\]]+)\]$/.test(base)) {
|
|
1827
|
+
declarations.push(declaration('grid-template-columns', arbitraryValue(base).replace(/_/g, ' ')));
|
|
1828
|
+
}
|
|
1644
1829
|
if (/^grid-rows-(\d+)$/.test(base)) {
|
|
1645
1830
|
const [, value] = base.match(/^grid-rows-(\d+)$/) ?? [];
|
|
1646
1831
|
declarations.push(declaration('grid-template-rows', `repeat(${value}, minmax(0, 1fr))`));
|
|
1647
1832
|
}
|
|
1833
|
+
if (/^grid-rows-\[([^\]]+)\]$/.test(base)) {
|
|
1834
|
+
declarations.push(declaration('grid-template-rows', arbitraryValue(base).replace(/_/g, ' ')));
|
|
1835
|
+
}
|
|
1836
|
+
if (base === 'auto-rows-fr') {
|
|
1837
|
+
declarations.push(declaration('grid-auto-rows', 'minmax(0, 1fr)'));
|
|
1838
|
+
}
|
|
1839
|
+
if (/^auto-rows-\[([^\]]+)\]$/.test(base)) {
|
|
1840
|
+
declarations.push(declaration('grid-auto-rows', arbitraryValue(base).replace(/_/g, ' ')));
|
|
1841
|
+
}
|
|
1842
|
+
if (base === 'flex-row')
|
|
1843
|
+
declarations.push(declaration('flex-direction', 'row'));
|
|
1844
|
+
if (base === 'flex-col')
|
|
1845
|
+
declarations.push(declaration('flex-direction', 'column'));
|
|
1846
|
+
if (base === 'flex-wrap')
|
|
1847
|
+
declarations.push(declaration('flex-wrap', 'wrap'));
|
|
1848
|
+
if (base === 'flex-nowrap')
|
|
1849
|
+
declarations.push(declaration('flex-wrap', 'nowrap'));
|
|
1850
|
+
if (base === 'object-cover')
|
|
1851
|
+
declarations.push(declaration('object-fit', 'cover'));
|
|
1852
|
+
if (base === 'object-contain')
|
|
1853
|
+
declarations.push(declaration('object-fit', 'contain'));
|
|
1854
|
+
if (base === 'object-fill')
|
|
1855
|
+
declarations.push(declaration('object-fit', 'fill'));
|
|
1856
|
+
if (base === 'object-center')
|
|
1857
|
+
declarations.push(declaration('object-position', 'center'));
|
|
1858
|
+
if (/^aspect-\[([^\]]+)\]$/.test(base)) {
|
|
1859
|
+
declarations.push(declaration('aspect-ratio', arbitraryValue(base).replace(/_/g, ' ')));
|
|
1860
|
+
}
|
|
1648
1861
|
if (/^col-span-(\d+)$/.test(base)) {
|
|
1649
1862
|
const [, value] = base.match(/^col-span-(\d+)$/) ?? [];
|
|
1650
1863
|
declarations.push(declaration('grid-column', `span ${value} / span ${value}`));
|
|
@@ -1876,6 +2089,14 @@ function colorKeywordValue(token) {
|
|
|
1876
2089
|
return colors[token];
|
|
1877
2090
|
}
|
|
1878
2091
|
function opacityToPercent(value) {
|
|
2092
|
+
const arbitrary = arbitraryTokenValue(value);
|
|
2093
|
+
if (arbitrary) {
|
|
2094
|
+
const numericArbitrary = Number(arbitrary);
|
|
2095
|
+
if (Number.isFinite(numericArbitrary)) {
|
|
2096
|
+
return `${numericArbitrary * 100}%`;
|
|
2097
|
+
}
|
|
2098
|
+
return arbitrary;
|
|
2099
|
+
}
|
|
1879
2100
|
const numeric = Number(value);
|
|
1880
2101
|
if (Number.isFinite(numeric)) {
|
|
1881
2102
|
return `${numeric}%`;
|
|
@@ -1904,6 +2125,17 @@ function tailwindNamedSizeValue(token) {
|
|
|
1904
2125
|
max: 'max-content',
|
|
1905
2126
|
fit: 'fit-content',
|
|
1906
2127
|
prose: '65ch',
|
|
2128
|
+
xs: '20rem',
|
|
2129
|
+
sm: '24rem',
|
|
2130
|
+
md: '28rem',
|
|
2131
|
+
lg: '32rem',
|
|
2132
|
+
xl: '36rem',
|
|
2133
|
+
'2xl': '42rem',
|
|
2134
|
+
'3xl': '48rem',
|
|
2135
|
+
'4xl': '56rem',
|
|
2136
|
+
'5xl': '64rem',
|
|
2137
|
+
'6xl': '72rem',
|
|
2138
|
+
'7xl': '80rem',
|
|
1907
2139
|
};
|
|
1908
2140
|
return values[token];
|
|
1909
2141
|
}
|
|
@@ -2391,7 +2623,7 @@ function createUiContract(input) {
|
|
|
2391
2623
|
layout: omitEmptyRecord({
|
|
2392
2624
|
display: filterUiContractClasses(allClasses, (className) => /^(?:flex|inline-flex|grid|inline-grid|block|inline|inline-block|hidden|contents|table)$/.test((0, utils_1.classBase)(className))),
|
|
2393
2625
|
alignment: filterUiContractClasses(allClasses, (className) => /^(?:items-|justify-|content-|self-|place-)/.test((0, utils_1.classBase)(className))),
|
|
2394
|
-
grid: filterUiContractClasses(allClasses, (className) => /^(?:grid|grid-cols-|col-|row-)/.test((0, utils_1.classBase)(className))),
|
|
2626
|
+
grid: filterUiContractClasses(allClasses, (className) => /^(?:grid|grid-cols-|grid-rows-|auto-rows-|auto-cols-|col-|row-)/.test((0, utils_1.classBase)(className))),
|
|
2395
2627
|
flex: filterUiContractClasses(allClasses, (className) => /^(?:flex|inline-flex|flex-|basis-|grow|shrink)/.test((0, utils_1.classBase)(className))),
|
|
2396
2628
|
spacing: grouped.spacing ?? [],
|
|
2397
2629
|
sizing: grouped.sizing ?? [],
|