@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.
Files changed (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +255 -0
  3. package/dist/cache/index.d.ts +110 -0
  4. package/dist/cache/index.d.ts.map +1 -0
  5. package/dist/cache/index.js +176 -0
  6. package/dist/cache/index.js.map +1 -0
  7. package/dist/cache/storage.d.ts +73 -0
  8. package/dist/cache/storage.d.ts.map +1 -0
  9. package/dist/cache/storage.js +176 -0
  10. package/dist/cache/storage.js.map +1 -0
  11. package/dist/cache/ttl.d.ts +62 -0
  12. package/dist/cache/ttl.d.ts.map +1 -0
  13. package/dist/cache/ttl.js +96 -0
  14. package/dist/cache/ttl.js.map +1 -0
  15. package/dist/extractor/classifier.d.ts +30 -0
  16. package/dist/extractor/classifier.d.ts.map +1 -0
  17. package/dist/extractor/classifier.js +150 -0
  18. package/dist/extractor/classifier.js.map +1 -0
  19. package/dist/extractor/forward-ref.d.ts +28 -0
  20. package/dist/extractor/forward-ref.d.ts.map +1 -0
  21. package/dist/extractor/forward-ref.js +134 -0
  22. package/dist/extractor/forward-ref.js.map +1 -0
  23. package/dist/extractor/index.d.ts +25 -0
  24. package/dist/extractor/index.d.ts.map +1 -0
  25. package/dist/extractor/index.js +43 -0
  26. package/dist/extractor/index.js.map +1 -0
  27. package/dist/extractor/interface.d.ts +40 -0
  28. package/dist/extractor/interface.d.ts.map +1 -0
  29. package/dist/extractor/interface.js +233 -0
  30. package/dist/extractor/interface.js.map +1 -0
  31. package/dist/extractor/jsdoc.d.ts +24 -0
  32. package/dist/extractor/jsdoc.d.ts.map +1 -0
  33. package/dist/extractor/jsdoc.js +74 -0
  34. package/dist/extractor/jsdoc.js.map +1 -0
  35. package/dist/extractor/project.d.ts +17 -0
  36. package/dist/extractor/project.d.ts.map +1 -0
  37. package/dist/extractor/project.js +33 -0
  38. package/dist/extractor/project.js.map +1 -0
  39. package/dist/extractor/props.d.ts +24 -0
  40. package/dist/extractor/props.d.ts.map +1 -0
  41. package/dist/extractor/props.js +78 -0
  42. package/dist/extractor/props.js.map +1 -0
  43. package/dist/extractor/type-resolver.d.ts +32 -0
  44. package/dist/extractor/type-resolver.d.ts.map +1 -0
  45. package/dist/extractor/type-resolver.js +129 -0
  46. package/dist/extractor/type-resolver.js.map +1 -0
  47. package/dist/fetcher/index.d.ts +7 -0
  48. package/dist/fetcher/index.d.ts.map +1 -0
  49. package/dist/fetcher/index.js +7 -0
  50. package/dist/fetcher/index.js.map +1 -0
  51. package/dist/fetcher/npm-registry.d.ts +45 -0
  52. package/dist/fetcher/npm-registry.d.ts.map +1 -0
  53. package/dist/fetcher/npm-registry.js +217 -0
  54. package/dist/fetcher/npm-registry.js.map +1 -0
  55. package/dist/fetcher/unified-package.d.ts +27 -0
  56. package/dist/fetcher/unified-package.d.ts.map +1 -0
  57. package/dist/fetcher/unified-package.js +99 -0
  58. package/dist/fetcher/unified-package.js.map +1 -0
  59. package/dist/fetcher/unpkg.d.ts +20 -0
  60. package/dist/fetcher/unpkg.d.ts.map +1 -0
  61. package/dist/fetcher/unpkg.js +57 -0
  62. package/dist/fetcher/unpkg.js.map +1 -0
  63. package/dist/index.d.ts +11 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +23 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/signatures/disambiguation.d.ts +30 -0
  68. package/dist/signatures/disambiguation.d.ts.map +1 -0
  69. package/dist/signatures/disambiguation.js +99 -0
  70. package/dist/signatures/disambiguation.js.map +1 -0
  71. package/dist/signatures/distinguishing.d.ts +29 -0
  72. package/dist/signatures/distinguishing.d.ts.map +1 -0
  73. package/dist/signatures/distinguishing.js +108 -0
  74. package/dist/signatures/distinguishing.js.map +1 -0
  75. package/dist/signatures/generator.d.ts +20 -0
  76. package/dist/signatures/generator.d.ts.map +1 -0
  77. package/dist/signatures/generator.js +147 -0
  78. package/dist/signatures/generator.js.map +1 -0
  79. package/dist/signatures/index.d.ts +10 -0
  80. package/dist/signatures/index.d.ts.map +1 -0
  81. package/dist/signatures/index.js +10 -0
  82. package/dist/signatures/index.js.map +1 -0
  83. package/dist/signatures/inference.d.ts +37 -0
  84. package/dist/signatures/inference.d.ts.map +1 -0
  85. package/dist/signatures/inference.js +132 -0
  86. package/dist/signatures/inference.js.map +1 -0
  87. package/dist/tools/extract-primitive.d.ts +49 -0
  88. package/dist/tools/extract-primitive.d.ts.map +1 -0
  89. package/dist/tools/extract-primitive.js +103 -0
  90. package/dist/tools/extract-primitive.js.map +1 -0
  91. package/dist/tools/index.d.ts +6 -0
  92. package/dist/tools/index.d.ts.map +1 -0
  93. package/dist/tools/index.js +6 -0
  94. package/dist/tools/index.js.map +1 -0
  95. package/dist/tools/list-primitives.d.ts +40 -0
  96. package/dist/tools/list-primitives.d.ts.map +1 -0
  97. package/dist/tools/list-primitives.js +53 -0
  98. package/dist/tools/list-primitives.js.map +1 -0
  99. package/dist/types/index.d.ts +83 -0
  100. package/dist/types/index.d.ts.map +1 -0
  101. package/dist/types/index.js +5 -0
  102. package/dist/types/index.js.map +1 -0
  103. 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,6 @@
1
+ /**
2
+ * MCP tools for limps-radix extension.
3
+ */
4
+ export { listPrimitivesTool, handleListPrimitives, } from './list-primitives.js';
5
+ export { extractPrimitiveTool, handleExtractPrimitive, } from './extract-primitive.js';
6
+ //# sourceMappingURL=index.js.map
@@ -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"}