@sudosandwich/limps-radix 0.1.1
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 +21 -0
- package/README.md +255 -0
- package/dist/cache/index.d.ts +110 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +176 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/storage.d.ts +73 -0
- package/dist/cache/storage.d.ts.map +1 -0
- package/dist/cache/storage.js +176 -0
- package/dist/cache/storage.js.map +1 -0
- package/dist/cache/ttl.d.ts +62 -0
- package/dist/cache/ttl.d.ts.map +1 -0
- package/dist/cache/ttl.js +96 -0
- package/dist/cache/ttl.js.map +1 -0
- package/dist/extractor/classifier.d.ts +30 -0
- package/dist/extractor/classifier.d.ts.map +1 -0
- package/dist/extractor/classifier.js +150 -0
- package/dist/extractor/classifier.js.map +1 -0
- package/dist/extractor/forward-ref.d.ts +28 -0
- package/dist/extractor/forward-ref.d.ts.map +1 -0
- package/dist/extractor/forward-ref.js +134 -0
- package/dist/extractor/forward-ref.js.map +1 -0
- package/dist/extractor/index.d.ts +25 -0
- package/dist/extractor/index.d.ts.map +1 -0
- package/dist/extractor/index.js +43 -0
- package/dist/extractor/index.js.map +1 -0
- package/dist/extractor/interface.d.ts +40 -0
- package/dist/extractor/interface.d.ts.map +1 -0
- package/dist/extractor/interface.js +233 -0
- package/dist/extractor/interface.js.map +1 -0
- package/dist/extractor/jsdoc.d.ts +24 -0
- package/dist/extractor/jsdoc.d.ts.map +1 -0
- package/dist/extractor/jsdoc.js +74 -0
- package/dist/extractor/jsdoc.js.map +1 -0
- package/dist/extractor/project.d.ts +17 -0
- package/dist/extractor/project.d.ts.map +1 -0
- package/dist/extractor/project.js +33 -0
- package/dist/extractor/project.js.map +1 -0
- package/dist/extractor/props.d.ts +24 -0
- package/dist/extractor/props.d.ts.map +1 -0
- package/dist/extractor/props.js +78 -0
- package/dist/extractor/props.js.map +1 -0
- package/dist/extractor/type-resolver.d.ts +32 -0
- package/dist/extractor/type-resolver.d.ts.map +1 -0
- package/dist/extractor/type-resolver.js +129 -0
- package/dist/extractor/type-resolver.js.map +1 -0
- package/dist/fetcher/index.d.ts +7 -0
- package/dist/fetcher/index.d.ts.map +1 -0
- package/dist/fetcher/index.js +7 -0
- package/dist/fetcher/index.js.map +1 -0
- package/dist/fetcher/npm-registry.d.ts +45 -0
- package/dist/fetcher/npm-registry.d.ts.map +1 -0
- package/dist/fetcher/npm-registry.js +217 -0
- package/dist/fetcher/npm-registry.js.map +1 -0
- package/dist/fetcher/unified-package.d.ts +27 -0
- package/dist/fetcher/unified-package.d.ts.map +1 -0
- package/dist/fetcher/unified-package.js +99 -0
- package/dist/fetcher/unified-package.js.map +1 -0
- package/dist/fetcher/unpkg.d.ts +20 -0
- package/dist/fetcher/unpkg.d.ts.map +1 -0
- package/dist/fetcher/unpkg.js +57 -0
- package/dist/fetcher/unpkg.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/signatures/disambiguation.d.ts +30 -0
- package/dist/signatures/disambiguation.d.ts.map +1 -0
- package/dist/signatures/disambiguation.js +99 -0
- package/dist/signatures/disambiguation.js.map +1 -0
- package/dist/signatures/distinguishing.d.ts +29 -0
- package/dist/signatures/distinguishing.d.ts.map +1 -0
- package/dist/signatures/distinguishing.js +108 -0
- package/dist/signatures/distinguishing.js.map +1 -0
- package/dist/signatures/generator.d.ts +20 -0
- package/dist/signatures/generator.d.ts.map +1 -0
- package/dist/signatures/generator.js +147 -0
- package/dist/signatures/generator.js.map +1 -0
- package/dist/signatures/index.d.ts +10 -0
- package/dist/signatures/index.d.ts.map +1 -0
- package/dist/signatures/index.js +10 -0
- package/dist/signatures/index.js.map +1 -0
- package/dist/signatures/inference.d.ts +37 -0
- package/dist/signatures/inference.d.ts.map +1 -0
- package/dist/signatures/inference.js +132 -0
- package/dist/signatures/inference.js.map +1 -0
- package/dist/tools/extract-primitive.d.ts +49 -0
- package/dist/tools/extract-primitive.d.ts.map +1 -0
- package/dist/tools/extract-primitive.js +103 -0
- package/dist/tools/extract-primitive.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +6 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list-primitives.d.ts +40 -0
- package/dist/tools/list-primitives.d.ts.map +1 -0
- package/dist/tools/list-primitives.js +53 -0
- package/dist/tools/list-primitives.js.map +1 -0
- package/dist/types/index.d.ts +83 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main signature generator for Radix primitives.
|
|
3
|
+
* Combines inference, distinguishing, and disambiguation to create BehaviorSignature.
|
|
4
|
+
*/
|
|
5
|
+
import { inferStatePattern, inferCompositionPattern, inferRenderingPattern, } from './inference.js';
|
|
6
|
+
import { getDistinguishingProps, getAntiPatternProps } from './distinguishing.js';
|
|
7
|
+
import { getSimilarPrimitives, getDisambiguationRule } from './disambiguation.js';
|
|
8
|
+
/**
|
|
9
|
+
* Patterns for inferring sub-component roles from names.
|
|
10
|
+
*/
|
|
11
|
+
const ROLE_PATTERNS = {
|
|
12
|
+
trigger: [/^Trigger$/i, /Trigger$/i],
|
|
13
|
+
content: [/^Content$/i, /Content$/i, /^Portal$/i],
|
|
14
|
+
overlay: [/^Overlay$/i, /^Backdrop$/i],
|
|
15
|
+
item: [/^Item$/i, /Item$/i, /^Option$/i],
|
|
16
|
+
indicator: [/^Indicator$/i, /^Thumb$/i, /^Range$/i],
|
|
17
|
+
other: [], // Default fallback
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Infer the role of a sub-component based on its name.
|
|
21
|
+
* @param componentName - Name of the sub-component
|
|
22
|
+
* @returns The inferred role
|
|
23
|
+
*/
|
|
24
|
+
function inferSubComponentRole(componentName) {
|
|
25
|
+
// Check each role's patterns in priority order
|
|
26
|
+
const roleOrder = [
|
|
27
|
+
'trigger',
|
|
28
|
+
'content',
|
|
29
|
+
'overlay',
|
|
30
|
+
'item',
|
|
31
|
+
'indicator',
|
|
32
|
+
];
|
|
33
|
+
for (const role of roleOrder) {
|
|
34
|
+
const patterns = ROLE_PATTERNS[role];
|
|
35
|
+
if (patterns.some((pattern) => pattern.test(componentName))) {
|
|
36
|
+
return role;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return 'other';
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Determine if a sub-component is required based on its name and props.
|
|
43
|
+
* @param subComponent - The sub-component definition
|
|
44
|
+
* @param primitiveName - The primitive name for context
|
|
45
|
+
* @returns True if the component is required
|
|
46
|
+
*/
|
|
47
|
+
function isSubComponentRequired(subComponent, primitiveName) {
|
|
48
|
+
const name = subComponent.name;
|
|
49
|
+
// Root is always required
|
|
50
|
+
if (name === 'Root') {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
// Trigger is usually required for interactive primitives
|
|
54
|
+
const interactivePrimitives = [
|
|
55
|
+
'Dialog',
|
|
56
|
+
'AlertDialog',
|
|
57
|
+
'Popover',
|
|
58
|
+
'Tooltip',
|
|
59
|
+
'HoverCard',
|
|
60
|
+
'DropdownMenu',
|
|
61
|
+
'ContextMenu',
|
|
62
|
+
'Select',
|
|
63
|
+
'Collapsible',
|
|
64
|
+
];
|
|
65
|
+
if (name === 'Trigger' && interactivePrimitives.includes(primitiveName)) {
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
// Content is usually required for compound primitives
|
|
69
|
+
const contentRequiredPrimitives = [
|
|
70
|
+
'Dialog',
|
|
71
|
+
'AlertDialog',
|
|
72
|
+
'Popover',
|
|
73
|
+
'Tooltip',
|
|
74
|
+
'HoverCard',
|
|
75
|
+
'DropdownMenu',
|
|
76
|
+
'ContextMenu',
|
|
77
|
+
'Select',
|
|
78
|
+
'Tabs',
|
|
79
|
+
'Accordion',
|
|
80
|
+
'Collapsible',
|
|
81
|
+
];
|
|
82
|
+
if (name === 'Content' && contentRequiredPrimitives.includes(primitiveName)) {
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
// Item is required for list-based primitives
|
|
86
|
+
if (name === 'Item') {
|
|
87
|
+
const itemRequiredPrimitives = ['RadioGroup', 'ToggleGroup', 'Tabs', 'Accordion'];
|
|
88
|
+
return itemRequiredPrimitives.includes(primitiveName);
|
|
89
|
+
}
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Generate a BehaviorSignature from an ExtractedPrimitive.
|
|
94
|
+
* This is the main entry point for signature generation.
|
|
95
|
+
*
|
|
96
|
+
* @param extracted - The extracted primitive data
|
|
97
|
+
* @returns The generated behavior signature
|
|
98
|
+
*/
|
|
99
|
+
export function generateSignature(extracted) {
|
|
100
|
+
// Get all props from root and sub-components for pattern inference
|
|
101
|
+
const allRootProps = extracted.rootProps;
|
|
102
|
+
// Find the main props (from Root or primary component)
|
|
103
|
+
const rootSubComponent = extracted.subComponents.find((c) => c.name === 'Root');
|
|
104
|
+
const primaryProps = rootSubComponent
|
|
105
|
+
? [...allRootProps, ...rootSubComponent.props]
|
|
106
|
+
: allRootProps;
|
|
107
|
+
// Remove duplicates by prop name
|
|
108
|
+
const uniqueProps = Array.from(new Map(primaryProps.map((p) => [p.name, p])).values());
|
|
109
|
+
// Infer patterns
|
|
110
|
+
const statePattern = inferStatePattern(uniqueProps);
|
|
111
|
+
const compositionPattern = inferCompositionPattern(extracted.subComponents);
|
|
112
|
+
const renderingPattern = inferRenderingPattern(extracted.subComponents, uniqueProps);
|
|
113
|
+
// Get distinguishing characteristics
|
|
114
|
+
const distinguishingProps = getDistinguishingProps(extracted.name);
|
|
115
|
+
const antiPatternProps = getAntiPatternProps(extracted.name);
|
|
116
|
+
// Map sub-components with roles
|
|
117
|
+
const subComponents = extracted.subComponents.map((sc) => ({
|
|
118
|
+
name: sc.name,
|
|
119
|
+
role: inferSubComponentRole(sc.name),
|
|
120
|
+
required: isSubComponentRequired(sc, extracted.name),
|
|
121
|
+
}));
|
|
122
|
+
// Get disambiguation info
|
|
123
|
+
const similarTo = getSimilarPrimitives(extracted.name);
|
|
124
|
+
const disambiguationRule = getDisambiguationRule(extracted.name);
|
|
125
|
+
return {
|
|
126
|
+
primitive: extracted.name,
|
|
127
|
+
package: extracted.package,
|
|
128
|
+
version: extracted.version,
|
|
129
|
+
statePattern,
|
|
130
|
+
compositionPattern,
|
|
131
|
+
renderingPattern,
|
|
132
|
+
distinguishingProps,
|
|
133
|
+
antiPatternProps,
|
|
134
|
+
subComponents,
|
|
135
|
+
similarTo,
|
|
136
|
+
disambiguationRule,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Generate signatures for multiple primitives.
|
|
141
|
+
* @param extractedList - Array of extracted primitives
|
|
142
|
+
* @returns Array of behavior signatures
|
|
143
|
+
*/
|
|
144
|
+
export function generateSignatures(extractedList) {
|
|
145
|
+
return extractedList.map(generateSignature);
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/signatures/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Signature generation module for Radix primitives.
|
|
3
|
+
*
|
|
4
|
+
* Transforms ExtractedPrimitive data into BehaviorSignature contracts.
|
|
5
|
+
*/
|
|
6
|
+
export { inferStatePattern, inferCompositionPattern, inferRenderingPattern, } from './inference.js';
|
|
7
|
+
export { getDistinguishingProps, getAntiPatternProps, getKnownPrimitives, isKnownPrimitive, } from './distinguishing.js';
|
|
8
|
+
export { getSimilarPrimitives, getDisambiguationRule, getSimilarityGroup, areSimilar, } from './disambiguation.js';
|
|
9
|
+
export { generateSignature, generateSignatures } from './generator.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/signatures/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,UAAU,GACX,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Signature generation module for Radix primitives.
|
|
3
|
+
*
|
|
4
|
+
* Transforms ExtractedPrimitive data into BehaviorSignature contracts.
|
|
5
|
+
*/
|
|
6
|
+
export { inferStatePattern, inferCompositionPattern, inferRenderingPattern, } from './inference.js';
|
|
7
|
+
export { getDistinguishingProps, getAntiPatternProps, getKnownPrimitives, isKnownPrimitive, } from './distinguishing.js';
|
|
8
|
+
export { getSimilarPrimitives, getDisambiguationRule, getSimilarityGroup, areSimilar, } from './disambiguation.js';
|
|
9
|
+
export { generateSignature, generateSignatures } from './generator.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/signatures/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,UAAU,GACX,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pattern inference for Radix primitives.
|
|
3
|
+
* Analyzes ExtractedPrimitive data to determine behavioral patterns.
|
|
4
|
+
*/
|
|
5
|
+
import type { PropDefinition, SubComponentDefinition, StatePattern, CompositionPattern, RenderingPattern } from '../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Infer the state pattern from root props.
|
|
8
|
+
*
|
|
9
|
+
* State patterns:
|
|
10
|
+
* - binary: Has open/defaultOpen + onOpenChange (Dialog, Popover, Tooltip)
|
|
11
|
+
* - single-value: Has value + onValueChange without array type (Select, RadioGroup)
|
|
12
|
+
* - multi-value: Has value[] + onValueChange (ToggleGroup type="multiple")
|
|
13
|
+
* - range: Has min, max, step props (Slider)
|
|
14
|
+
* - text: Has value as string type + onChange (TextField patterns)
|
|
15
|
+
* - none: No state control props (Separator, AspectRatio)
|
|
16
|
+
*/
|
|
17
|
+
export declare function inferStatePattern(props: PropDefinition[]): StatePattern;
|
|
18
|
+
/**
|
|
19
|
+
* Infer the composition pattern from sub-components.
|
|
20
|
+
*
|
|
21
|
+
* Composition patterns:
|
|
22
|
+
* - monolithic: Single component, no sub-components (Checkbox, Switch)
|
|
23
|
+
* - compound: Root + Trigger + Content pattern, 3+ sub-components
|
|
24
|
+
* - provider: Only provides context, no UI (Direction Provider)
|
|
25
|
+
*/
|
|
26
|
+
export declare function inferCompositionPattern(subComponents: SubComponentDefinition[]): CompositionPattern;
|
|
27
|
+
/**
|
|
28
|
+
* Infer the rendering pattern from sub-components and props.
|
|
29
|
+
*
|
|
30
|
+
* Rendering patterns:
|
|
31
|
+
* - portal: Has Portal sub-component that's always used
|
|
32
|
+
* - portal-conditional: Has Portal that only renders when open
|
|
33
|
+
* - conditional: Shows/hides content based on state (Accordion)
|
|
34
|
+
* - inline: Always renders in place (Checkbox, Radio)
|
|
35
|
+
*/
|
|
36
|
+
export declare function inferRenderingPattern(subComponents: SubComponentDefinition[], props: PropDefinition[]): RenderingPattern;
|
|
37
|
+
//# sourceMappingURL=inference.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inference.d.ts","sourceRoot":"","sources":["../../src/signatures/inference.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EACtB,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,YAAY,CAyDvE;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,sBAAsB,EAAE,GACtC,kBAAkB,CAmCpB;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,sBAAsB,EAAE,EACvC,KAAK,EAAE,cAAc,EAAE,GACtB,gBAAgB,CA0ClB"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pattern inference for Radix primitives.
|
|
3
|
+
* Analyzes ExtractedPrimitive data to determine behavioral patterns.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Infer the state pattern from root props.
|
|
7
|
+
*
|
|
8
|
+
* State patterns:
|
|
9
|
+
* - binary: Has open/defaultOpen + onOpenChange (Dialog, Popover, Tooltip)
|
|
10
|
+
* - single-value: Has value + onValueChange without array type (Select, RadioGroup)
|
|
11
|
+
* - multi-value: Has value[] + onValueChange (ToggleGroup type="multiple")
|
|
12
|
+
* - range: Has min, max, step props (Slider)
|
|
13
|
+
* - text: Has value as string type + onChange (TextField patterns)
|
|
14
|
+
* - none: No state control props (Separator, AspectRatio)
|
|
15
|
+
*/
|
|
16
|
+
export function inferStatePattern(props) {
|
|
17
|
+
const propNames = new Set(props.map((p) => p.name));
|
|
18
|
+
const propMap = new Map(props.map((p) => [p.name, p]));
|
|
19
|
+
// Check for range pattern (Slider) - most specific first
|
|
20
|
+
if (propNames.has('min') ||
|
|
21
|
+
propNames.has('max') ||
|
|
22
|
+
propNames.has('step') ||
|
|
23
|
+
propNames.has('minStepsBetweenThumbs')) {
|
|
24
|
+
return 'range';
|
|
25
|
+
}
|
|
26
|
+
// Check for binary pattern (Dialog, Popover, Tooltip, etc.)
|
|
27
|
+
const hasBinaryState = (propNames.has('open') || propNames.has('defaultOpen')) &&
|
|
28
|
+
propNames.has('onOpenChange');
|
|
29
|
+
const hasCheckedState = (propNames.has('checked') || propNames.has('defaultChecked')) &&
|
|
30
|
+
propNames.has('onCheckedChange');
|
|
31
|
+
const hasPressedState = (propNames.has('pressed') || propNames.has('defaultPressed')) &&
|
|
32
|
+
propNames.has('onPressedChange');
|
|
33
|
+
if (hasBinaryState || hasCheckedState || hasPressedState) {
|
|
34
|
+
return 'binary';
|
|
35
|
+
}
|
|
36
|
+
// Check for value patterns (Select, RadioGroup, ToggleGroup)
|
|
37
|
+
if (propNames.has('value') ||
|
|
38
|
+
propNames.has('defaultValue') ||
|
|
39
|
+
propNames.has('onValueChange')) {
|
|
40
|
+
const valueProp = propMap.get('value') || propMap.get('defaultValue');
|
|
41
|
+
const valueType = valueProp?.type || '';
|
|
42
|
+
// Multi-value: array type
|
|
43
|
+
if (valueType.includes('[]') || valueType.includes('Array')) {
|
|
44
|
+
return 'multi-value';
|
|
45
|
+
}
|
|
46
|
+
// Text: string type with typical text input patterns
|
|
47
|
+
if (valueType === 'string' &&
|
|
48
|
+
(propNames.has('onChange') || propNames.has('onInput'))) {
|
|
49
|
+
return 'text';
|
|
50
|
+
}
|
|
51
|
+
// Single-value: everything else with value
|
|
52
|
+
return 'single-value';
|
|
53
|
+
}
|
|
54
|
+
// No state control props found
|
|
55
|
+
return 'none';
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Infer the composition pattern from sub-components.
|
|
59
|
+
*
|
|
60
|
+
* Composition patterns:
|
|
61
|
+
* - monolithic: Single component, no sub-components (Checkbox, Switch)
|
|
62
|
+
* - compound: Root + Trigger + Content pattern, 3+ sub-components
|
|
63
|
+
* - provider: Only provides context, no UI (Direction Provider)
|
|
64
|
+
*/
|
|
65
|
+
export function inferCompositionPattern(subComponents) {
|
|
66
|
+
const componentNames = new Set(subComponents.map((c) => c.name));
|
|
67
|
+
// Provider pattern: only has Provider or Root with no visual components
|
|
68
|
+
const providerOnlyNames = ['Provider', 'Root'];
|
|
69
|
+
const hasOnlyProviderComponents = subComponents.length <= 1 &&
|
|
70
|
+
subComponents.every((c) => providerOnlyNames.includes(c.name));
|
|
71
|
+
// Check if it looks like a context provider (no UI components)
|
|
72
|
+
if (hasOnlyProviderComponents && subComponents.length === 1) {
|
|
73
|
+
const firstComponent = subComponents[0];
|
|
74
|
+
// If the only component has very few props and they're all context-related
|
|
75
|
+
const hasMinimalProps = firstComponent.props.length <= 3;
|
|
76
|
+
const hasNoVisualProps = !firstComponent.props.some((p) => p.name === 'asChild' || p.name === 'className' || p.name === 'style');
|
|
77
|
+
if (hasMinimalProps && hasNoVisualProps) {
|
|
78
|
+
return 'provider';
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Compound pattern: 3+ sub-components or has Trigger/Content pattern
|
|
82
|
+
const hasCompoundPattern = (componentNames.has('Trigger') || componentNames.has('Content')) &&
|
|
83
|
+
subComponents.length >= 2;
|
|
84
|
+
const hasMultipleComponents = subComponents.length >= 3;
|
|
85
|
+
if (hasCompoundPattern || hasMultipleComponents) {
|
|
86
|
+
return 'compound';
|
|
87
|
+
}
|
|
88
|
+
// Monolithic: single component or very few sub-components
|
|
89
|
+
return 'monolithic';
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Infer the rendering pattern from sub-components and props.
|
|
93
|
+
*
|
|
94
|
+
* Rendering patterns:
|
|
95
|
+
* - portal: Has Portal sub-component that's always used
|
|
96
|
+
* - portal-conditional: Has Portal that only renders when open
|
|
97
|
+
* - conditional: Shows/hides content based on state (Accordion)
|
|
98
|
+
* - inline: Always renders in place (Checkbox, Radio)
|
|
99
|
+
*/
|
|
100
|
+
export function inferRenderingPattern(subComponents, props) {
|
|
101
|
+
const componentNames = new Set(subComponents.map((c) => c.name));
|
|
102
|
+
const propNames = new Set(props.map((p) => p.name));
|
|
103
|
+
// Check for Portal sub-component
|
|
104
|
+
const hasPortal = componentNames.has('Portal');
|
|
105
|
+
// Check for overlay components (suggest portaling)
|
|
106
|
+
const hasOverlay = componentNames.has('Overlay') || componentNames.has('Backdrop');
|
|
107
|
+
// Check for state-dependent rendering
|
|
108
|
+
const hasOpenState = propNames.has('open') ||
|
|
109
|
+
propNames.has('defaultOpen') ||
|
|
110
|
+
propNames.has('onOpenChange');
|
|
111
|
+
const hasForceMount = [...subComponents].some((c) => c.props.some((p) => p.name === 'forceMount'));
|
|
112
|
+
// Portal pattern
|
|
113
|
+
if (hasPortal) {
|
|
114
|
+
// Portal-conditional: has open state (renders portal when open)
|
|
115
|
+
if (hasOpenState) {
|
|
116
|
+
return 'portal-conditional';
|
|
117
|
+
}
|
|
118
|
+
// Portal: always portals (like Toast)
|
|
119
|
+
return 'portal';
|
|
120
|
+
}
|
|
121
|
+
// Has overlay suggests portal behavior even without explicit Portal component
|
|
122
|
+
if (hasOverlay && hasOpenState) {
|
|
123
|
+
return 'portal-conditional';
|
|
124
|
+
}
|
|
125
|
+
// Conditional pattern: has forceMount prop or open state without portal
|
|
126
|
+
if (hasForceMount || hasOpenState) {
|
|
127
|
+
return 'conditional';
|
|
128
|
+
}
|
|
129
|
+
// Default to inline
|
|
130
|
+
return 'inline';
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=inference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inference.js","sourceRoot":"","sources":["../../src/signatures/inference.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tool for extracting the full behavioral contract from a Radix primitive.
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import type { ExtensionTool } from '@sudosandwich/limps/extensions';
|
|
6
|
+
/**
|
|
7
|
+
* Input schema for radix_extract_primitive tool.
|
|
8
|
+
*/
|
|
9
|
+
export declare const extractPrimitiveInputSchema: z.ZodObject<{
|
|
10
|
+
primitive: z.ZodString;
|
|
11
|
+
version: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
12
|
+
}, z.core.$strip>;
|
|
13
|
+
export type ExtractPrimitiveInput = z.infer<typeof extractPrimitiveInputSchema>;
|
|
14
|
+
/**
|
|
15
|
+
* Output schema for radix_extract_primitive tool.
|
|
16
|
+
*/
|
|
17
|
+
export interface ExtractPrimitiveOutput {
|
|
18
|
+
primitive: string;
|
|
19
|
+
package: string;
|
|
20
|
+
version: string;
|
|
21
|
+
behavior: {
|
|
22
|
+
statePattern: string;
|
|
23
|
+
compositionPattern: string;
|
|
24
|
+
renderingPattern: string;
|
|
25
|
+
};
|
|
26
|
+
subComponents: {
|
|
27
|
+
name: string;
|
|
28
|
+
props: {
|
|
29
|
+
name: string;
|
|
30
|
+
type: string;
|
|
31
|
+
required: boolean;
|
|
32
|
+
default?: string;
|
|
33
|
+
category: 'state' | 'event' | 'config' | 'composition' | 'other';
|
|
34
|
+
}[];
|
|
35
|
+
}[];
|
|
36
|
+
similarTo: string[];
|
|
37
|
+
disambiguationRule?: string;
|
|
38
|
+
}
|
|
39
|
+
export declare function handleExtractPrimitive(input: unknown): Promise<{
|
|
40
|
+
content: {
|
|
41
|
+
type: 'text';
|
|
42
|
+
text: string;
|
|
43
|
+
}[];
|
|
44
|
+
}>;
|
|
45
|
+
/**
|
|
46
|
+
* MCP tool definition for extracting a Radix primitive's contract.
|
|
47
|
+
*/
|
|
48
|
+
export declare const extractPrimitiveTool: ExtensionTool;
|
|
49
|
+
//# sourceMappingURL=extract-primitive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-primitive.d.ts","sourceRoot":"","sources":["../../src/tools/extract-primitive.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAcpE;;GAEG;AACH,eAAO,MAAM,2BAA2B;;;iBAOtC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAEhB,QAAQ,EAAE;QACR,YAAY,EAAE,MAAM,CAAC;QACrB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IAEF,aAAa,EAAE;QACb,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE;YACL,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,EAAE,OAAO,CAAC;YAClB,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,QAAQ,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,aAAa,GAAG,OAAO,CAAC;SAClE,EAAE,CAAC;KACL,EAAE,CAAC;IAEJ,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAmBD,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,OAAO,GACb,OAAO,CAAC;IAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAAC,CAoFxD;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,aAMlC,CAAC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tool for extracting the full behavioral contract from a Radix primitive.
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { resolvePackage, fetchTypesWithFallback, } from '../fetcher/index.js';
|
|
6
|
+
import { extractPrimitive, getPropCategory } from '../extractor/index.js';
|
|
7
|
+
import { generateSignature } from '../signatures/index.js';
|
|
8
|
+
import { getFromCache, saveToCache, getSignatureFromCache, saveSignatureToCache, } from '../cache/index.js';
|
|
9
|
+
/**
|
|
10
|
+
* Input schema for radix_extract_primitive tool.
|
|
11
|
+
*/
|
|
12
|
+
export const extractPrimitiveInputSchema = z.object({
|
|
13
|
+
primitive: z.string().describe('Primitive name (e.g., "dialog", "popover", "tooltip")'),
|
|
14
|
+
version: z
|
|
15
|
+
.string()
|
|
16
|
+
.optional()
|
|
17
|
+
.default('latest')
|
|
18
|
+
.describe('Radix version (default: latest)'),
|
|
19
|
+
});
|
|
20
|
+
/**
|
|
21
|
+
* Handler for the radix_extract_primitive tool.
|
|
22
|
+
*
|
|
23
|
+
* @param input - Tool input parameters
|
|
24
|
+
* @returns Full primitive contract with behavioral classification
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* Convert kebab-case or lowercase primitive name to PascalCase.
|
|
28
|
+
* @example "dialog" -> "Dialog", "alert-dialog" -> "AlertDialog"
|
|
29
|
+
*/
|
|
30
|
+
function toPascalCase(name) {
|
|
31
|
+
return name
|
|
32
|
+
.split('-')
|
|
33
|
+
.map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
34
|
+
.join('');
|
|
35
|
+
}
|
|
36
|
+
export async function handleExtractPrimitive(input) {
|
|
37
|
+
const parsed = extractPrimitiveInputSchema.parse(input);
|
|
38
|
+
const primitiveSlug = parsed.primitive.toLowerCase();
|
|
39
|
+
const primitiveName = toPascalCase(parsed.primitive); // PascalCase for extractor/cache
|
|
40
|
+
const versionHint = parsed.version || 'latest';
|
|
41
|
+
// Resolve package source and version (use slug for fetcher)
|
|
42
|
+
const resolved = await resolvePackage(primitiveSlug, versionHint);
|
|
43
|
+
let resolvedContent = null;
|
|
44
|
+
// Try cache first (use PascalCase for cache keys)
|
|
45
|
+
let extracted = await getFromCache(primitiveName, resolved.version);
|
|
46
|
+
let signature = await getSignatureFromCache(primitiveName, resolved.version);
|
|
47
|
+
if (!extracted) {
|
|
48
|
+
// Fetch and extract (use slug for fetcher)
|
|
49
|
+
resolvedContent = await fetchTypesWithFallback(primitiveSlug, versionHint);
|
|
50
|
+
extracted = extractPrimitive(resolvedContent.content, primitiveName, // Use PascalCase for extractor
|
|
51
|
+
resolvedContent.resolved.version, resolvedContent.resolved.packageName);
|
|
52
|
+
// Save to cache (use PascalCase for cache keys)
|
|
53
|
+
await saveToCache(primitiveName, resolvedContent.resolved.version, extracted);
|
|
54
|
+
}
|
|
55
|
+
if (!signature) {
|
|
56
|
+
// Generate signature
|
|
57
|
+
signature = generateSignature(extracted);
|
|
58
|
+
// Save to cache (use PascalCase for cache keys)
|
|
59
|
+
const resolvedVersion = resolvedContent?.resolved.version ?? resolved.version;
|
|
60
|
+
await saveSignatureToCache(primitiveName, resolvedVersion, signature);
|
|
61
|
+
}
|
|
62
|
+
// Format output
|
|
63
|
+
const resolvedPackage = resolvedContent?.resolved ??
|
|
64
|
+
{
|
|
65
|
+
packageName: extracted.package,
|
|
66
|
+
version: extracted.version,
|
|
67
|
+
};
|
|
68
|
+
const output = {
|
|
69
|
+
primitive: extracted.name,
|
|
70
|
+
package: resolvedPackage.packageName,
|
|
71
|
+
version: resolvedPackage.version,
|
|
72
|
+
behavior: {
|
|
73
|
+
statePattern: signature.statePattern,
|
|
74
|
+
compositionPattern: signature.compositionPattern,
|
|
75
|
+
renderingPattern: signature.renderingPattern,
|
|
76
|
+
},
|
|
77
|
+
subComponents: extracted.subComponents.map((sc) => ({
|
|
78
|
+
name: sc.name,
|
|
79
|
+
props: sc.props.map((p) => ({
|
|
80
|
+
name: p.name,
|
|
81
|
+
type: p.type,
|
|
82
|
+
required: p.required,
|
|
83
|
+
default: p.defaultValue,
|
|
84
|
+
category: getPropCategory(p.name),
|
|
85
|
+
})),
|
|
86
|
+
})),
|
|
87
|
+
similarTo: signature.similarTo,
|
|
88
|
+
disambiguationRule: signature.disambiguationRule,
|
|
89
|
+
};
|
|
90
|
+
return {
|
|
91
|
+
content: [{ type: 'text', text: JSON.stringify(output, null, 2) }],
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* MCP tool definition for extracting a Radix primitive's contract.
|
|
96
|
+
*/
|
|
97
|
+
export const extractPrimitiveTool = {
|
|
98
|
+
name: 'radix_extract_primitive',
|
|
99
|
+
description: 'Extract the behavioral contract from a Radix UI primitive, including sub-components, props, and semantic classification',
|
|
100
|
+
inputSchema: extractPrimitiveInputSchema,
|
|
101
|
+
handler: handleExtractPrimitive,
|
|
102
|
+
};
|
|
103
|
+
//# sourceMappingURL=extract-primitive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-primitive.js","sourceRoot":"","sources":["../../src/tools/extract-primitive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tools for limps-radix extension.
|
|
3
|
+
*/
|
|
4
|
+
export { listPrimitivesTool, handleListPrimitives, type ListPrimitivesInput, type ListPrimitivesOutput, } from './list-primitives.js';
|
|
5
|
+
export { extractPrimitiveTool, handleExtractPrimitive, type ExtractPrimitiveInput, type ExtractPrimitiveOutput, } from './extract-primitive.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,GAC1B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,GAC5B,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,kBAAkB,EAClB,oBAAoB,GAGrB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,oBAAoB,EACpB,sBAAsB,GAGvB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tool for listing all available Radix UI primitives.
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import type { ExtensionTool } from '@sudosandwich/limps/extensions';
|
|
6
|
+
/**
|
|
7
|
+
* Input schema for radix_list_primitives tool.
|
|
8
|
+
*/
|
|
9
|
+
export declare const listPrimitivesInputSchema: z.ZodObject<{
|
|
10
|
+
version: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
11
|
+
}, z.core.$strip>;
|
|
12
|
+
export type ListPrimitivesInput = z.infer<typeof listPrimitivesInputSchema>;
|
|
13
|
+
/**
|
|
14
|
+
* Output schema for radix_list_primitives tool.
|
|
15
|
+
*/
|
|
16
|
+
export interface ListPrimitivesOutput {
|
|
17
|
+
version: string;
|
|
18
|
+
primitives: {
|
|
19
|
+
name: string;
|
|
20
|
+
package: string;
|
|
21
|
+
description?: string;
|
|
22
|
+
}[];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Handler for the radix_list_primitives tool.
|
|
26
|
+
*
|
|
27
|
+
* @param input - Tool input parameters
|
|
28
|
+
* @returns List of primitives with metadata
|
|
29
|
+
*/
|
|
30
|
+
export declare function handleListPrimitives(input: unknown): Promise<{
|
|
31
|
+
content: {
|
|
32
|
+
type: 'text';
|
|
33
|
+
text: string;
|
|
34
|
+
}[];
|
|
35
|
+
}>;
|
|
36
|
+
/**
|
|
37
|
+
* MCP tool definition for listing Radix primitives.
|
|
38
|
+
*/
|
|
39
|
+
export declare const listPrimitivesTool: ExtensionTool;
|
|
40
|
+
//# sourceMappingURL=list-primitives.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-primitives.d.ts","sourceRoot":"","sources":["../../src/tools/list-primitives.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAGpE;;GAEG;AACH,eAAO,MAAM,yBAAyB;;iBAMpC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,EAAE,CAAC;CACL;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,OAAO,GACb,OAAO,CAAC;IAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAAC,CAyBxD;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,aAMhC,CAAC"}
|