@buoy-design/core 0.1.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 (57) hide show
  1. package/dist/analysis/index.d.ts +2 -0
  2. package/dist/analysis/index.d.ts.map +1 -0
  3. package/dist/analysis/index.js +2 -0
  4. package/dist/analysis/index.js.map +1 -0
  5. package/dist/analysis/semantic-diff.d.ts +100 -0
  6. package/dist/analysis/semantic-diff.d.ts.map +1 -0
  7. package/dist/analysis/semantic-diff.js +716 -0
  8. package/dist/analysis/semantic-diff.js.map +1 -0
  9. package/dist/analysis/semantic-diff.test.d.ts +2 -0
  10. package/dist/analysis/semantic-diff.test.d.ts.map +1 -0
  11. package/dist/analysis/semantic-diff.test.js +188 -0
  12. package/dist/analysis/semantic-diff.test.js.map +1 -0
  13. package/dist/index.d.ts +4 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +7 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/models/component.d.ts +638 -0
  18. package/dist/models/component.d.ts.map +1 -0
  19. package/dist/models/component.js +116 -0
  20. package/dist/models/component.js.map +1 -0
  21. package/dist/models/component.test.d.ts +2 -0
  22. package/dist/models/component.test.d.ts.map +1 -0
  23. package/dist/models/component.test.js +55 -0
  24. package/dist/models/component.test.js.map +1 -0
  25. package/dist/models/drift.d.ts +692 -0
  26. package/dist/models/drift.d.ts.map +1 -0
  27. package/dist/models/drift.js +152 -0
  28. package/dist/models/drift.js.map +1 -0
  29. package/dist/models/drift.test.d.ts +2 -0
  30. package/dist/models/drift.test.d.ts.map +1 -0
  31. package/dist/models/drift.test.js +38 -0
  32. package/dist/models/drift.test.js.map +1 -0
  33. package/dist/models/index.d.ts +9 -0
  34. package/dist/models/index.d.ts.map +1 -0
  35. package/dist/models/index.js +9 -0
  36. package/dist/models/index.js.map +1 -0
  37. package/dist/models/intent.d.ts +226 -0
  38. package/dist/models/intent.d.ts.map +1 -0
  39. package/dist/models/intent.js +84 -0
  40. package/dist/models/intent.js.map +1 -0
  41. package/dist/models/token.d.ts +740 -0
  42. package/dist/models/token.d.ts.map +1 -0
  43. package/dist/models/token.js +164 -0
  44. package/dist/models/token.js.map +1 -0
  45. package/dist/models/token.test.d.ts +2 -0
  46. package/dist/models/token.test.d.ts.map +1 -0
  47. package/dist/models/token.test.js +168 -0
  48. package/dist/models/token.test.js.map +1 -0
  49. package/dist/plugins/index.d.ts +2 -0
  50. package/dist/plugins/index.d.ts.map +1 -0
  51. package/dist/plugins/index.js +2 -0
  52. package/dist/plugins/index.js.map +1 -0
  53. package/dist/plugins/types.d.ts +60 -0
  54. package/dist/plugins/types.d.ts.map +1 -0
  55. package/dist/plugins/types.js +2 -0
  56. package/dist/plugins/types.js.map +1 -0
  57. package/package.json +49 -0
@@ -0,0 +1,116 @@
1
+ import { z } from 'zod';
2
+ // Component source location types
3
+ export const ReactSourceSchema = z.object({
4
+ type: z.literal('react'),
5
+ path: z.string(),
6
+ exportName: z.string(),
7
+ line: z.number().optional(),
8
+ });
9
+ export const FigmaSourceSchema = z.object({
10
+ type: z.literal('figma'),
11
+ fileKey: z.string(),
12
+ nodeId: z.string(),
13
+ url: z.string().optional(),
14
+ });
15
+ export const StorybookSourceSchema = z.object({
16
+ type: z.literal('storybook'),
17
+ storyId: z.string(),
18
+ kind: z.string(),
19
+ url: z.string().optional(),
20
+ });
21
+ export const VueSourceSchema = z.object({
22
+ type: z.literal('vue'),
23
+ path: z.string(),
24
+ exportName: z.string(),
25
+ line: z.number().optional(),
26
+ });
27
+ export const SvelteSourceSchema = z.object({
28
+ type: z.literal('svelte'),
29
+ path: z.string(),
30
+ exportName: z.string(),
31
+ line: z.number().optional(),
32
+ });
33
+ export const ComponentSourceSchema = z.discriminatedUnion('type', [
34
+ ReactSourceSchema,
35
+ FigmaSourceSchema,
36
+ StorybookSourceSchema,
37
+ VueSourceSchema,
38
+ SvelteSourceSchema,
39
+ ]);
40
+ // Prop definitions
41
+ export const PropDefinitionSchema = z.object({
42
+ name: z.string(),
43
+ type: z.string(),
44
+ required: z.boolean(),
45
+ defaultValue: z.unknown().optional(),
46
+ description: z.string().optional(),
47
+ });
48
+ // Variant definitions
49
+ export const VariantDefinitionSchema = z.object({
50
+ name: z.string(),
51
+ props: z.record(z.unknown()),
52
+ });
53
+ // Token references within components
54
+ export const TokenReferenceSchema = z.object({
55
+ tokenId: z.string(),
56
+ tokenName: z.string(),
57
+ usage: z.enum(['color', 'spacing', 'typography', 'shadow', 'border', 'other']),
58
+ location: z.string(),
59
+ });
60
+ // Accessibility info
61
+ export const AccessibilityInfoSchema = z.object({
62
+ hasAriaLabel: z.boolean().optional(),
63
+ hasRole: z.boolean().optional(),
64
+ issues: z.array(z.string()).optional(),
65
+ });
66
+ // Hardcoded style value (could be a token)
67
+ export const HardcodedValueSchema = z.object({
68
+ type: z.enum(['color', 'spacing', 'fontSize', 'fontFamily', 'shadow', 'border', 'other']),
69
+ value: z.string(),
70
+ property: z.string(), // e.g., 'backgroundColor', 'padding', 'color'
71
+ location: z.string(), // line:column or description
72
+ });
73
+ // Component metadata
74
+ export const ComponentMetadataSchema = z.object({
75
+ deprecated: z.boolean().optional(),
76
+ deprecationReason: z.string().optional(),
77
+ tags: z.array(z.string()).optional(),
78
+ accessibility: AccessibilityInfoSchema.optional(),
79
+ documentation: z.string().optional(),
80
+ hardcodedValues: z.array(HardcodedValueSchema).optional(),
81
+ });
82
+ // Main Component schema
83
+ export const ComponentSchema = z.object({
84
+ id: z.string(),
85
+ name: z.string(),
86
+ source: ComponentSourceSchema,
87
+ props: z.array(PropDefinitionSchema),
88
+ variants: z.array(VariantDefinitionSchema),
89
+ tokens: z.array(TokenReferenceSchema),
90
+ dependencies: z.array(z.string()),
91
+ metadata: ComponentMetadataSchema,
92
+ scannedAt: z.date(),
93
+ });
94
+ // Helper to create component ID
95
+ export function createComponentId(source, _name) {
96
+ switch (source.type) {
97
+ case 'react':
98
+ return `react:${source.path}:${source.exportName}`;
99
+ case 'figma':
100
+ return `figma:${source.fileKey}:${source.nodeId}`;
101
+ case 'storybook':
102
+ return `storybook:${source.storyId}`;
103
+ case 'vue':
104
+ return `vue:${source.path}:${source.exportName}`;
105
+ case 'svelte':
106
+ return `svelte:${source.path}:${source.exportName}`;
107
+ }
108
+ }
109
+ // Helper to normalize component name for matching
110
+ export function normalizeComponentName(name) {
111
+ return name
112
+ .toLowerCase()
113
+ .replace(/[-_\s]/g, '')
114
+ .replace(/component$/i, '');
115
+ }
116
+ //# sourceMappingURL=component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component.js","sourceRoot":"","sources":["../../src/models/component.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=component.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component.test.d.ts","sourceRoot":"","sources":["../../src/models/component.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,55 @@
1
+ // packages/core/src/models/component.test.ts
2
+ import { describe, it, expect } from 'vitest';
3
+ import { createComponentId, normalizeComponentName } from './component.js';
4
+ describe('component model helpers', () => {
5
+ describe('createComponentId', () => {
6
+ it('creates id for React component', () => {
7
+ const source = {
8
+ type: 'react',
9
+ path: 'src/Button.tsx',
10
+ exportName: 'Button',
11
+ };
12
+ const id = createComponentId(source, 'Button');
13
+ expect(id).toBe('react:src/Button.tsx:Button');
14
+ });
15
+ it('creates id for Figma component', () => {
16
+ const source = {
17
+ type: 'figma',
18
+ fileKey: 'abc123',
19
+ nodeId: '1:23',
20
+ };
21
+ const id = createComponentId(source, 'Button');
22
+ expect(id).toBe('figma:abc123:1:23');
23
+ });
24
+ it('creates id for Vue component', () => {
25
+ const source = {
26
+ type: 'vue',
27
+ path: 'src/Button.vue',
28
+ exportName: 'default',
29
+ };
30
+ const id = createComponentId(source, 'Button');
31
+ expect(id).toBe('vue:src/Button.vue:default');
32
+ });
33
+ });
34
+ describe('normalizeComponentName', () => {
35
+ it('lowercases names', () => {
36
+ expect(normalizeComponentName('Button')).toBe('button');
37
+ });
38
+ it('removes hyphens', () => {
39
+ expect(normalizeComponentName('my-button')).toBe('mybutton');
40
+ });
41
+ it('removes underscores', () => {
42
+ expect(normalizeComponentName('my_button')).toBe('mybutton');
43
+ });
44
+ it('removes spaces', () => {
45
+ expect(normalizeComponentName('My Button')).toBe('mybutton');
46
+ });
47
+ it('removes Component suffix', () => {
48
+ expect(normalizeComponentName('ButtonComponent')).toBe('button');
49
+ });
50
+ it('handles complex names', () => {
51
+ expect(normalizeComponentName('Primary-Button_Component')).toBe('primarybutton');
52
+ });
53
+ });
54
+ });
55
+ //# sourceMappingURL=component.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component.test.js","sourceRoot":"","sources":["../../src/models/component.test.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAG3E,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,MAAM,GAAgB;gBAC1B,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,gBAAgB;gBACtB,UAAU,EAAE,QAAQ;aACrB,CAAC;YACF,MAAM,EAAE,GAAG,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC/C,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,MAAM,GAAgB;gBAC1B,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,QAAQ;gBACjB,MAAM,EAAE,MAAM;aACf,CAAC;YACF,MAAM,EAAE,GAAG,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC/C,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,MAAM,GAAc;gBACxB,IAAI,EAAE,KAAK;gBACX,IAAI,EAAE,gBAAgB;gBACtB,UAAU,EAAE,SAAS;aACtB,CAAC;YACF,MAAM,EAAE,GAAG,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC/C,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;YAC1B,MAAM,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;YACzB,MAAM,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;YAC7B,MAAM,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;YACxB,MAAM,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;YAC/B,MAAM,CAAC,sBAAsB,CAAC,0BAA0B,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACnF,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}