@auto-engineer/component-parser 1.104.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/LICENSE +10 -0
  3. package/dist/src/build-html-prop-set.d.ts +4 -0
  4. package/dist/src/build-html-prop-set.d.ts.map +1 -0
  5. package/dist/src/build-html-prop-set.js +19 -0
  6. package/dist/src/build-html-prop-set.js.map +1 -0
  7. package/dist/src/build-html-prop-set.specs.d.ts +2 -0
  8. package/dist/src/build-html-prop-set.specs.d.ts.map +1 -0
  9. package/dist/src/build-html-prop-set.specs.js +28 -0
  10. package/dist/src/build-html-prop-set.specs.js.map +1 -0
  11. package/dist/src/create-project.d.ts +4 -0
  12. package/dist/src/create-project.d.ts.map +1 -0
  13. package/dist/src/create-project.js +6 -0
  14. package/dist/src/create-project.js.map +1 -0
  15. package/dist/src/create-project.specs.d.ts +2 -0
  16. package/dist/src/create-project.specs.d.ts.map +1 -0
  17. package/dist/src/create-project.specs.js +21 -0
  18. package/dist/src/create-project.specs.js.map +1 -0
  19. package/dist/src/extract-defaults.d.ts +4 -0
  20. package/dist/src/extract-defaults.d.ts.map +1 -0
  21. package/dist/src/extract-defaults.js +20 -0
  22. package/dist/src/extract-defaults.js.map +1 -0
  23. package/dist/src/extract-defaults.specs.d.ts +2 -0
  24. package/dist/src/extract-defaults.specs.d.ts.map +1 -0
  25. package/dist/src/extract-defaults.specs.js +22 -0
  26. package/dist/src/extract-defaults.specs.js.map +1 -0
  27. package/dist/src/index.d.ts +9 -0
  28. package/dist/src/index.d.ts.map +1 -0
  29. package/dist/src/index.js +7 -0
  30. package/dist/src/index.js.map +1 -0
  31. package/dist/src/parse-component-file.d.ts +12 -0
  32. package/dist/src/parse-component-file.d.ts.map +1 -0
  33. package/dist/src/parse-component-file.js +34 -0
  34. package/dist/src/parse-component-file.js.map +1 -0
  35. package/dist/src/parse-component-file.specs.d.ts +2 -0
  36. package/dist/src/parse-component-file.specs.d.ts.map +1 -0
  37. package/dist/src/parse-component-file.specs.js +181 -0
  38. package/dist/src/parse-component-file.specs.js.map +1 -0
  39. package/dist/src/parse-manifest.d.ts +5 -0
  40. package/dist/src/parse-manifest.d.ts.map +1 -0
  41. package/dist/src/parse-manifest.js +16 -0
  42. package/dist/src/parse-manifest.js.map +1 -0
  43. package/dist/src/parse-manifest.specs.d.ts +2 -0
  44. package/dist/src/parse-manifest.specs.d.ts.map +1 -0
  45. package/dist/src/parse-manifest.specs.js +35 -0
  46. package/dist/src/parse-manifest.specs.js.map +1 -0
  47. package/dist/src/resolve-props.d.ts +12 -0
  48. package/dist/src/resolve-props.d.ts.map +1 -0
  49. package/dist/src/resolve-props.js +35 -0
  50. package/dist/src/resolve-props.js.map +1 -0
  51. package/dist/src/resolve-props.specs.d.ts +2 -0
  52. package/dist/src/resolve-props.specs.d.ts.map +1 -0
  53. package/dist/src/resolve-props.specs.js +46 -0
  54. package/dist/src/resolve-props.specs.js.map +1 -0
  55. package/dist/src/test-project.d.ts +4 -0
  56. package/dist/src/test-project.d.ts.map +1 -0
  57. package/dist/src/test-project.js +12 -0
  58. package/dist/src/test-project.js.map +1 -0
  59. package/dist/tsconfig.tsbuildinfo +1 -0
  60. package/package.json +35 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,44 @@
1
+ # @auto-engineer/component-parser
2
+
3
+ ## 1.104.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`78976f5`](https://github.com/BeOnAuto/auto-engineer/commit/78976f5df70cec2320f548f08d4b950bda1c5063) Thanks [@osamanar](https://github.com/osamanar)! - - **component-parser**: extractDefaults extracts destructuring defaults
8
+
9
+ - [`ad74fec`](https://github.com/BeOnAuto/auto-engineer/commit/ad74fecdba40dff69a57c1fb5c0b36e7de40df35) Thanks [@osamanar](https://github.com/osamanar)! - - **component-parser**: buildHtmlPropSet resolves HTML div prop names
10
+
11
+ - [`4ca9d54`](https://github.com/BeOnAuto/auto-engineer/commit/4ca9d5434af53f9bbffa6d8af61082534693cbd2) Thanks [@osamanar](https://github.com/osamanar)! - - **component-parser**: add Card.tsx tests verifying pure HTML wrappers have empty props
12
+
13
+ - [`4ca9d54`](https://github.com/BeOnAuto/auto-engineer/commit/4ca9d5434af53f9bbffa6d8af61082534693cbd2) Thanks [@osamanar](https://github.com/osamanar)! - - **component-parser**: add Card.tsx tests verifying pure HTML wrappers have empty props
14
+
15
+ - [`8d4a3d1`](https://github.com/BeOnAuto/auto-engineer/commit/8d4a3d1c992ce35e390260007e1575052df4bc39) Thanks [@osamanar](https://github.com/osamanar)! - - **component-parser**: resolveCustomProps filters HTML props from component type
16
+
17
+ - [`4ca9d54`](https://github.com/BeOnAuto/auto-engineer/commit/4ca9d5434af53f9bbffa6d8af61082534693cbd2) Thanks [@osamanar](https://github.com/osamanar)! - - **component-parser**: add Card.tsx tests verifying pure HTML wrappers have empty props
18
+
19
+ - [`fb635c1`](https://github.com/BeOnAuto/auto-engineer/commit/fb635c1b23a1ad472e76604ad9ee502c8ebe453e) Thanks [@osamanar](https://github.com/osamanar)! - - **component-parser**: add Carousel.tsx tests for separate type def and custom prop survival
20
+
21
+ - [`21f0490`](https://github.com/BeOnAuto/auto-engineer/commit/21f04909e0378673fe94180d3ff081e222120580) Thanks [@osamanar](https://github.com/osamanar)! - - **component-parser**: parseManifestComponents deduplicates and parses component paths
22
+
23
+ - [`98d70d8`](https://github.com/BeOnAuto/auto-engineer/commit/98d70d8116ec8e87bee34aa1e506ef77fa8ffd37) Thanks [@osamanar](https://github.com/osamanar)! - - **component-parser**: parseComponentFile extracts Button props
24
+
25
+ - [`27df054`](https://github.com/BeOnAuto/auto-engineer/commit/27df054af29a314fdacef7dec2ffb15748d61036) Thanks [@osamanar](https://github.com/osamanar)! - - **component-parser**: createProject returns ts-morph Project from tsconfig
26
+
27
+ - [`8fc425d`](https://github.com/BeOnAuto/auto-engineer/commit/8fc425d6c53ed4bac3739f703edbd788eb1e3397) Thanks [@osamanar](https://github.com/osamanar)! - - Added component-parser package that extracts and deduplicates component props, filtering out standard HTML attributes to surface only custom props
28
+ - Replaced client-side component merging with server-side approach using the new component-parser, simplifying the React client build pipeline
29
+ - Fixed components database not being properly built in generate-react-client
30
+ - Fixed out-of-date package lock
31
+
32
+ - [`48a7155`](https://github.com/BeOnAuto/auto-engineer/commit/48a7155ccdfca8ad58028564d821902e2d1c7b0d) Thanks [@osamanar](https://github.com/osamanar)! - - **generate-react-client**: replace merge with component-parser
33
+
34
+ - [`4ca9d54`](https://github.com/BeOnAuto/auto-engineer/commit/4ca9d5434af53f9bbffa6d8af61082534693cbd2) Thanks [@osamanar](https://github.com/osamanar)! - - **component-parser**: add Accordion.tsx tests for Radix prop survival
35
+
36
+ ### Patch Changes
37
+
38
+ - [`f5be819`](https://github.com/BeOnAuto/auto-engineer/commit/f5be8199bbcc358dd2f5d9940e404a55b32ef853) Thanks [@osamanar](https://github.com/osamanar)! - - Fixed an issue where the components database was not being properly built during React client generation
39
+
40
+ - [`6f72c42`](https://github.com/BeOnAuto/auto-engineer/commit/6f72c4259c96da831e72348de005ff6e70140b61) Thanks [@osamanar](https://github.com/osamanar)! - - Fixed failing tests across the project
41
+
42
+ - [`a5615d9`](https://github.com/BeOnAuto/auto-engineer/commit/a5615d944a1836d80722452c50f10c955a664a90) Thanks [@osamanar](https://github.com/osamanar)! - - **component-parser**: mark all bursts complete in ketchup plan
43
+
44
+ - [`47a13ab`](https://github.com/BeOnAuto/auto-engineer/commit/47a13abe754ef572cedb578ef61bb3b1c07961e8) Thanks [@osamanar](https://github.com/osamanar)! - - **component-parser**: scaffold @auto-engineer/component-parser package
package/LICENSE ADDED
@@ -0,0 +1,10 @@
1
+ Elastic License 2.0
2
+
3
+ Copyright 2024 Sam Hatoum
4
+
5
+ This software and associated documentation files (the "Software") are licensed under the Elastic License 2.0 (the "License"). You may not use this file except in compliance with the License.
6
+
7
+ You may obtain a copy of the License at:
8
+ https://www.elastic.co/licensing/elastic-license
9
+
10
+ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
@@ -0,0 +1,4 @@
1
+ import type { Project } from 'ts-morph';
2
+ declare function buildHtmlPropSet(project: Project): Set<string>;
3
+ export { buildHtmlPropSet };
4
+ //# sourceMappingURL=build-html-prop-set.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-html-prop-set.d.ts","sourceRoot":"","sources":["../../src/build-html-prop-set.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAExC,iBAAS,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAqBvD;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { dirname, resolve } from 'node:path';
2
+ function buildHtmlPropSet(project) {
3
+ const existingFile = project.getSourceFiles().find((sf) => sf.getFilePath().endsWith('.tsx'));
4
+ const baseDir = existingFile
5
+ ? dirname(existingFile.getFilePath())
6
+ : (project.getRootDirectories()[0]?.getPath() ?? '.');
7
+ const helperPath = resolve(baseDir, '__html_props_helper__.tsx');
8
+ const helperFile = project.createSourceFile(helperPath, 'import type * as React from "react"; type DivProps = React.ComponentProps<"div">; export type { DivProps };', { overwrite: true });
9
+ const typeAlias = helperFile.getTypeAlias('DivProps');
10
+ const resolved = typeAlias.getType();
11
+ const props = new Set();
12
+ for (const prop of resolved.getProperties()) {
13
+ props.add(prop.getName());
14
+ }
15
+ helperFile.delete();
16
+ return props;
17
+ }
18
+ export { buildHtmlPropSet };
19
+ //# sourceMappingURL=build-html-prop-set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-html-prop-set.js","sourceRoot":"","sources":["../../src/build-html-prop-set.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAG7C,SAAS,gBAAgB,CAAC,OAAgB;IACxC,MAAM,YAAY,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9F,MAAM,OAAO,GAAG,YAAY;QAC1B,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;QACrC,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,2BAA2B,CAAC,CAAC;IAEjE,MAAM,UAAU,GAAG,OAAO,CAAC,gBAAgB,CACzC,UAAU,EACV,6GAA6G,EAC7G,EAAE,SAAS,EAAE,IAAI,EAAE,CACpB,CAAC;IAEF,MAAM,SAAS,GAAG,UAAU,CAAC,YAAY,CAAC,UAAU,CAAE,CAAC;IACvD,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC;QAC5C,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5B,CAAC;IACD,UAAU,CAAC,MAAM,EAAE,CAAC;IACpB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=build-html-prop-set.specs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-html-prop-set.specs.d.ts","sourceRoot":"","sources":["../../src/build-html-prop-set.specs.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { buildHtmlPropSet } from './build-html-prop-set.js';
3
+ import { getTestProject } from './test-project.js';
4
+ describe('buildHtmlPropSet', () => {
5
+ it('includes standard HTML div props like className, onClick, id, style', () => {
6
+ const project = getTestProject();
7
+ const htmlProps = buildHtmlPropSet(project);
8
+ expect(htmlProps.has('className')).toBe(true);
9
+ expect(htmlProps.has('onClick')).toBe(true);
10
+ expect(htmlProps.has('id')).toBe(true);
11
+ expect(htmlProps.has('style')).toBe(true);
12
+ expect(htmlProps.has('children')).toBe(true);
13
+ });
14
+ it('does not include component-specific props like variant or asChild', () => {
15
+ const project = getTestProject();
16
+ const htmlProps = buildHtmlPropSet(project);
17
+ expect(htmlProps.has('variant')).toBe(false);
18
+ expect(htmlProps.has('asChild')).toBe(false);
19
+ expect(htmlProps.has('size')).toBe(false);
20
+ });
21
+ it('includes aria and data attribute props', () => {
22
+ const project = getTestProject();
23
+ const htmlProps = buildHtmlPropSet(project);
24
+ expect(htmlProps.has('aria-label')).toBe(true);
25
+ expect(htmlProps.has('role')).toBe(true);
26
+ });
27
+ });
28
+ //# sourceMappingURL=build-html-prop-set.specs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-html-prop-set.specs.js","sourceRoot":"","sources":["../../src/build-html-prop-set.specs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;QAEjC,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAE5C,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;QAEjC,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAE5C,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;QAEjC,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAE5C,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Project } from 'ts-morph';
2
+ declare function createProject(tsconfigPath: string): Project;
3
+ export { createProject };
4
+ //# sourceMappingURL=create-project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-project.d.ts","sourceRoot":"","sources":["../../src/create-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,iBAAS,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Project } from 'ts-morph';
2
+ function createProject(tsconfigPath) {
3
+ return new Project({ tsConfigFilePath: tsconfigPath });
4
+ }
5
+ export { createProject };
6
+ //# sourceMappingURL=create-project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-project.js","sourceRoot":"","sources":["../../src/create-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,SAAS,aAAa,CAAC,YAAoB;IACzC,OAAO,IAAI,OAAO,CAAC,EAAE,gBAAgB,EAAE,YAAY,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=create-project.specs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-project.specs.d.ts","sourceRoot":"","sources":["../../src/create-project.specs.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { createProject } from './create-project.js';
3
+ import { getTestProject, STARTER_TSCONFIG } from './test-project.js';
4
+ describe('createProject', () => {
5
+ it('returns a ts-morph Project that can resolve source files from the starter tsconfig', () => {
6
+ const project = getTestProject();
7
+ const sourceFiles = project.getSourceFiles();
8
+ expect(sourceFiles.length).toBeGreaterThan(0);
9
+ });
10
+ it('resolves the Button component file from the starter', () => {
11
+ const project = getTestProject();
12
+ const buttonFile = project.getSourceFiles().find((sf) => sf.getFilePath().endsWith('Button.tsx'));
13
+ expect(buttonFile).toBeDefined();
14
+ expect(buttonFile.getFilePath()).toContain('__fixtures__/Button.tsx');
15
+ });
16
+ it('accepts a tsconfig path and creates a new project', () => {
17
+ const project = createProject(STARTER_TSCONFIG);
18
+ expect(project.getSourceFiles().length).toBeGreaterThan(0);
19
+ });
20
+ });
21
+ //# sourceMappingURL=create-project.specs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-project.specs.js","sourceRoot":"","sources":["../../src/create-project.specs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElE,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,oFAAoF,EAAE,GAAG,EAAE;QAC5F,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;QAEjC,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;QAE7C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;QAEjC,MAAM,UAAU,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;QAElG,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,CAAC,UAAW,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,OAAO,GAAG,aAAa,CAAC,gBAAgB,CAAC,CAAC;QAEhD,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type FunctionDeclaration } from 'ts-morph';
2
+ declare function extractDefaults(fn: FunctionDeclaration): Map<string, string>;
3
+ export { extractDefaults };
4
+ //# sourceMappingURL=extract-defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-defaults.d.ts","sourceRoot":"","sources":["../../src/extract-defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAc,MAAM,UAAU,CAAC;AAEhE,iBAAS,eAAe,CAAC,EAAE,EAAE,mBAAmB,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAkBrE;AAED,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { SyntaxKind } from 'ts-morph';
2
+ function extractDefaults(fn) {
3
+ const defaults = new Map();
4
+ const params = fn.getParameters();
5
+ for (const param of params) {
6
+ const nameNode = param.getNameNode();
7
+ if (nameNode.getKind() !== SyntaxKind.ObjectBindingPattern)
8
+ continue;
9
+ const bindingPattern = nameNode.asKind(SyntaxKind.ObjectBindingPattern);
10
+ for (const element of bindingPattern.getElements()) {
11
+ const initializer = element.getInitializer();
12
+ if (initializer) {
13
+ defaults.set(element.getName(), initializer.getText());
14
+ }
15
+ }
16
+ }
17
+ return defaults;
18
+ }
19
+ export { extractDefaults };
20
+ //# sourceMappingURL=extract-defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-defaults.js","sourceRoot":"","sources":["../../src/extract-defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,UAAU,EAAE,MAAM,UAAU,CAAC;AAEhE,SAAS,eAAe,CAAC,EAAuB;IAC9C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,MAAM,MAAM,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;IAElC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACrC,IAAI,QAAQ,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,oBAAoB;YAAE,SAAS;QAErE,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,oBAAoB,CAAE,CAAC;QACzE,KAAK,MAAM,OAAO,IAAI,cAAc,CAAC,WAAW,EAAE,EAAE,CAAC;YACnD,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;YAC7C,IAAI,WAAW,EAAE,CAAC;gBAChB,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=extract-defaults.specs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-defaults.specs.d.ts","sourceRoot":"","sources":["../../src/extract-defaults.specs.ts"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { extractDefaults } from './extract-defaults.js';
3
+ import { getTestProject } from './test-project.js';
4
+ describe('extractDefaults', () => {
5
+ it('extracts destructuring defaults from Button function params', () => {
6
+ const project = getTestProject();
7
+ const buttonFile = project.getSourceFiles().find((sf) => sf.getFilePath().endsWith('Button.tsx'));
8
+ const buttonFn = buttonFile.getFunction('Button');
9
+ const defaults = extractDefaults(buttonFn);
10
+ expect(defaults.get('variant')).toBe("'default'");
11
+ expect(defaults.get('size')).toBe("'default'");
12
+ expect(defaults.get('asChild')).toBe('false');
13
+ });
14
+ it('returns empty map when function has no destructuring defaults', () => {
15
+ const project = getTestProject();
16
+ const cardFile = project.getSourceFiles().find((sf) => sf.getFilePath().endsWith('Card.tsx'));
17
+ const cardFn = cardFile.getFunction('Card');
18
+ const defaults = extractDefaults(cardFn);
19
+ expect(defaults.size).toBe(0);
20
+ });
21
+ });
22
+ //# sourceMappingURL=extract-defaults.specs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-defaults.specs.js","sourceRoot":"","sources":["../../src/extract-defaults.specs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAE,CAAC;QACnG,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAE,CAAC;QAEnD,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QAE3C,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAClD,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAE,CAAC;QAC/F,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAE,CAAC;QAE7C,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QAEzC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ export { buildHtmlPropSet } from './build-html-prop-set';
2
+ export { createProject } from './create-project';
3
+ export { extractDefaults } from './extract-defaults';
4
+ export type { ParsedComponent } from './parse-component-file';
5
+ export { parseComponentFile } from './parse-component-file';
6
+ export { parseManifestComponents } from './parse-manifest';
7
+ export type { PropInfo } from './resolve-props';
8
+ export { resolveCustomProps } from './resolve-props';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { buildHtmlPropSet } from './build-html-prop-set.js';
2
+ export { createProject } from './create-project.js';
3
+ export { extractDefaults } from './extract-defaults.js';
4
+ export { parseComponentFile } from './parse-component-file.js';
5
+ export { parseManifestComponents } from './parse-manifest.js';
6
+ export { resolveCustomProps } from './resolve-props.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { Project } from 'ts-morph';
2
+ import type { PropInfo } from './resolve-props';
3
+ type ParsedComponent = {
4
+ name: string;
5
+ filePath: string;
6
+ props: PropInfo[];
7
+ description?: string;
8
+ };
9
+ declare function parseComponentFile(project: Project, filePath: string): ParsedComponent[];
10
+ export { parseComponentFile };
11
+ export type { ParsedComponent };
12
+ //# sourceMappingURL=parse-component-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-component-file.d.ts","sourceRoot":"","sources":["../../src/parse-component-file.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAGxC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGhD,KAAK,eAAe,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,iBAAS,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,EAAE,CAgCjF;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAC9B,YAAY,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { buildHtmlPropSet } from './build-html-prop-set.js';
2
+ import { extractDefaults } from './extract-defaults.js';
3
+ import { resolveCustomProps } from './resolve-props.js';
4
+ function parseComponentFile(project, filePath) {
5
+ const sourceFile = project.getSourceFile(filePath);
6
+ if (!sourceFile)
7
+ return [];
8
+ const htmlProps = buildHtmlPropSet(project);
9
+ const results = [];
10
+ for (const fn of sourceFile.getFunctions()) {
11
+ const name = fn.getName();
12
+ if (!name || name[0] !== name[0].toUpperCase())
13
+ continue;
14
+ const params = fn.getParameters();
15
+ if (params.length === 0)
16
+ continue;
17
+ const defaults = extractDefaults(fn);
18
+ const paramType = params[0].getType();
19
+ const props = resolveCustomProps(paramType, htmlProps, defaults);
20
+ const jsDocs = fn.getJsDocs();
21
+ const description = jsDocs.length > 0 ? jsDocs[0].getDescription().trim() : undefined;
22
+ const component = {
23
+ name,
24
+ filePath,
25
+ props,
26
+ };
27
+ if (description)
28
+ component.description = description;
29
+ results.push(component);
30
+ }
31
+ return results;
32
+ }
33
+ export { parseComponentFile };
34
+ //# sourceMappingURL=parse-component-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-component-file.js","sourceRoot":"","sources":["../../src/parse-component-file.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AASrD,SAAS,kBAAkB,CAAC,OAAgB,EAAE,QAAgB;IAC5D,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,CAAC;IAE3B,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,KAAK,MAAM,EAAE,IAAI,UAAU,CAAC,YAAY,EAAE,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;YAAE,SAAS;QAEzD,MAAM,MAAM,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;QAClC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAElC,MAAM,QAAQ,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,kBAAkB,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEjE,MAAM,MAAM,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;QAC9B,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAEtF,MAAM,SAAS,GAAoB;YACjC,IAAI;YACJ,QAAQ;YACR,KAAK;SACN,CAAC;QACF,IAAI,WAAW;YAAE,SAAS,CAAC,WAAW,GAAG,WAAW,CAAC;QAErD,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parse-component-file.specs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-component-file.specs.d.ts","sourceRoot":"","sources":["../../src/parse-component-file.specs.ts"],"names":[],"mappings":""}
@@ -0,0 +1,181 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { parseComponentFile } from './parse-component-file.js';
3
+ import { getTestProject } from './test-project.js';
4
+ describe('parseComponentFile', () => {
5
+ it('parses Button.tsx and returns Button with variant, size, asChild props', () => {
6
+ const project = getTestProject();
7
+ const buttonPath = project
8
+ .getSourceFiles()
9
+ .find((sf) => sf.getFilePath().endsWith('Button.tsx'))
10
+ .getFilePath();
11
+ const result = parseComponentFile(project, buttonPath);
12
+ const button = result.find((c) => c.name === 'Button');
13
+ expect(button).toBeDefined();
14
+ expect(button.filePath).toBe(buttonPath);
15
+ const propNames = button.props.map((p) => p.name);
16
+ expect(propNames).toContain('variant');
17
+ expect(propNames).toContain('size');
18
+ expect(propNames).toContain('asChild');
19
+ const variant = button.props.find((p) => p.name === 'variant');
20
+ expect(variant.defaultValue).toBe("'default'");
21
+ expect(variant.required).toBe(false);
22
+ const asChild = button.props.find((p) => p.name === 'asChild');
23
+ expect(asChild.defaultValue).toBe('false');
24
+ expect(asChild.required).toBe(false);
25
+ expect(asChild.type).toBe('boolean');
26
+ });
27
+ it('includes JSDoc description for Button', () => {
28
+ const project = getTestProject();
29
+ const buttonPath = project
30
+ .getSourceFiles()
31
+ .find((sf) => sf.getFilePath().endsWith('Button.tsx'))
32
+ .getFilePath();
33
+ const result = parseComponentFile(project, buttonPath);
34
+ const button = result.find((c) => c.name === 'Button');
35
+ expect(button.description).toContain('clickable element');
36
+ });
37
+ it('excludes HTML props like className, onClick, children from Button', () => {
38
+ const project = getTestProject();
39
+ const buttonPath = project
40
+ .getSourceFiles()
41
+ .find((sf) => sf.getFilePath().endsWith('Button.tsx'))
42
+ .getFilePath();
43
+ const result = parseComponentFile(project, buttonPath);
44
+ const button = result.find((c) => c.name === 'Button');
45
+ const propNames = button.props.map((p) => p.name);
46
+ expect(propNames).not.toContain('className');
47
+ expect(propNames).not.toContain('onClick');
48
+ expect(propNames).not.toContain('children');
49
+ });
50
+ describe('Card.tsx — pure HTML wrappers', () => {
51
+ function getCardComponents() {
52
+ const project = getTestProject();
53
+ const cardPath = project
54
+ .getSourceFiles()
55
+ .find((sf) => sf.getFilePath().endsWith('Card.tsx'))
56
+ .getFilePath();
57
+ return parseComponentFile(project, cardPath);
58
+ }
59
+ it('finds all 7 Card components', () => {
60
+ const result = getCardComponents();
61
+ expect(result.map((c) => c.name)).toEqual([
62
+ 'Card',
63
+ 'CardHeader',
64
+ 'CardTitle',
65
+ 'CardDescription',
66
+ 'CardAction',
67
+ 'CardContent',
68
+ 'CardFooter',
69
+ ]);
70
+ });
71
+ it('returns empty props for every Card component', () => {
72
+ const result = getCardComponents();
73
+ expect(result.map((c) => c.props)).toEqual([[], [], [], [], [], [], []]);
74
+ });
75
+ });
76
+ describe('Carousel.tsx', () => {
77
+ function getCarouselComponents() {
78
+ const project = getTestProject();
79
+ const carouselPath = project
80
+ .getSourceFiles()
81
+ .find((sf) => sf.getFilePath().endsWith('Carousel.tsx'))
82
+ .getFilePath();
83
+ return parseComponentFile(project, carouselPath);
84
+ }
85
+ it('Carousel has custom props from separate CarouselProps type', () => {
86
+ const components = getCarouselComponents();
87
+ const carousel = components.find((c) => c.name === 'Carousel');
88
+ const propNames = carousel.props.map((p) => p.name);
89
+ expect(propNames).toContain('opts');
90
+ expect(propNames).toContain('plugins');
91
+ expect(propNames).toContain('orientation');
92
+ expect(propNames).toContain('setApi');
93
+ });
94
+ it('Carousel orientation has default value of horizontal', () => {
95
+ const components = getCarouselComponents();
96
+ const carousel = components.find((c) => c.name === 'Carousel');
97
+ const orientation = carousel.props.find((p) => p.name === 'orientation');
98
+ expect(orientation.defaultValue).toBe("'horizontal'");
99
+ expect(orientation.required).toBe(false);
100
+ });
101
+ it('Carousel excludes HTML props like className, children, onClick', () => {
102
+ const components = getCarouselComponents();
103
+ const carousel = components.find((c) => c.name === 'Carousel');
104
+ const propNames = carousel.props.map((p) => p.name);
105
+ expect(propNames).not.toContain('className');
106
+ expect(propNames).not.toContain('children');
107
+ expect(propNames).not.toContain('onClick');
108
+ });
109
+ it('CarouselPrevious has variant and size with defaults', () => {
110
+ const components = getCarouselComponents();
111
+ const prev = components.find((c) => c.name === 'CarouselPrevious');
112
+ const variant = prev.props.find((p) => p.name === 'variant');
113
+ expect(variant.defaultValue).toBe("'outline'");
114
+ expect(variant.required).toBe(false);
115
+ const size = prev.props.find((p) => p.name === 'size');
116
+ expect(size.defaultValue).toBe("'icon'");
117
+ expect(size.required).toBe(false);
118
+ });
119
+ it('CarouselNext has variant and size with defaults', () => {
120
+ const components = getCarouselComponents();
121
+ const next = components.find((c) => c.name === 'CarouselNext');
122
+ const variant = next.props.find((p) => p.name === 'variant');
123
+ expect(variant.defaultValue).toBe("'outline'");
124
+ expect(variant.required).toBe(false);
125
+ const size = next.props.find((p) => p.name === 'size');
126
+ expect(size.defaultValue).toBe("'icon'");
127
+ expect(size.required).toBe(false);
128
+ });
129
+ });
130
+ describe('Accordion.tsx — Radix-specific props survive HTML subtraction', () => {
131
+ function getAccordionComponents() {
132
+ const project = getTestProject();
133
+ const accordionPath = project
134
+ .getSourceFiles()
135
+ .find((sf) => sf.getFilePath().endsWith('Accordion.tsx'))
136
+ .getFilePath();
137
+ return parseComponentFile(project, accordionPath);
138
+ }
139
+ it('finds all four components', () => {
140
+ const components = getAccordionComponents();
141
+ expect(components.map((c) => c.name)).toEqual([
142
+ 'Accordion',
143
+ 'AccordionItem',
144
+ 'AccordionTrigger',
145
+ 'AccordionContent',
146
+ ]);
147
+ });
148
+ it('Accordion root has exactly the Radix-specific props with no HTML div props', () => {
149
+ const components = getAccordionComponents();
150
+ const accordion = components.find((c) => c.name === 'Accordion');
151
+ expect(accordion.props.map((p) => p.name)).toEqual([
152
+ 'type',
153
+ 'value',
154
+ 'onValueChange',
155
+ 'disabled',
156
+ 'orientation',
157
+ 'asChild',
158
+ ]);
159
+ const typeProp = accordion.props.find((p) => p.name === 'type');
160
+ expect(typeProp.required).toBe(true);
161
+ expect(typeProp.type).toBe('"single" | "multiple"');
162
+ const valueProp = accordion.props.find((p) => p.name === 'value');
163
+ expect(valueProp.required).toBe(false);
164
+ expect(valueProp.type).toBe('string | string[]');
165
+ });
166
+ it('AccordionItem exposes value as a required string prop', () => {
167
+ const components = getAccordionComponents();
168
+ const item = components.find((c) => c.name === 'AccordionItem');
169
+ expect(item.props.map((p) => p.name)).toEqual(['disabled', 'value', 'asChild']);
170
+ const valueProp = item.props.find((p) => p.name === 'value');
171
+ expect(valueProp.required).toBe(true);
172
+ expect(valueProp.type).toBe('string');
173
+ });
174
+ it('AccordionContent exposes asChild and forceMount only', () => {
175
+ const components = getAccordionComponents();
176
+ const content = components.find((c) => c.name === 'AccordionContent');
177
+ expect(content.props.map((p) => p.name)).toEqual(['asChild', 'forceMount']);
178
+ });
179
+ });
180
+ });
181
+ //# sourceMappingURL=parse-component-file.specs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-component-file.specs.js","sourceRoot":"","sources":["../../src/parse-component-file.specs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Project } from 'ts-morph';
2
+ import type { ParsedComponent } from './parse-component-file';
3
+ declare function parseManifestComponents(project: Project, componentPaths: string[], projectRoot: string): ParsedComponent[];
4
+ export { parseManifestComponents };
5
+ //# sourceMappingURL=parse-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-manifest.d.ts","sourceRoot":"","sources":["../../src/parse-manifest.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG9D,iBAAS,uBAAuB,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,eAAe,EAAE,CAYnH;AAED,OAAO,EAAE,uBAAuB,EAAE,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { resolve } from 'node:path';
2
+ import { parseComponentFile } from './parse-component-file.js';
3
+ function parseManifestComponents(project, componentPaths, projectRoot) {
4
+ const results = [];
5
+ const seenPaths = new Set();
6
+ for (const relativePath of componentPaths) {
7
+ const absolutePath = resolve(projectRoot, relativePath);
8
+ if (seenPaths.has(absolutePath))
9
+ continue;
10
+ seenPaths.add(absolutePath);
11
+ results.push(...parseComponentFile(project, absolutePath));
12
+ }
13
+ return results;
14
+ }
15
+ export { parseManifestComponents };
16
+ //# sourceMappingURL=parse-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-manifest.js","sourceRoot":"","sources":["../../src/parse-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,SAAS,uBAAuB,CAAC,OAAgB,EAAE,cAAwB,EAAE,WAAmB;IAC9F,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAEpC,KAAK,MAAM,YAAY,IAAI,cAAc,EAAE,CAAC;QAC1C,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QACxD,IAAI,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC;YAAE,SAAS;QAC1C,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,OAAO,EAAE,uBAAuB,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parse-manifest.specs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-manifest.specs.d.ts","sourceRoot":"","sources":["../../src/parse-manifest.specs.ts"],"names":[],"mappings":""}