@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 @@
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/models/token.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,164 @@
1
+ import { z } from 'zod';
2
+ // Token value types
3
+ export const ColorValueSchema = z.object({
4
+ type: z.literal('color'),
5
+ hex: z.string(),
6
+ rgba: z.object({
7
+ r: z.number(),
8
+ g: z.number(),
9
+ b: z.number(),
10
+ a: z.number(),
11
+ }).optional(),
12
+ });
13
+ export const SpacingValueSchema = z.object({
14
+ type: z.literal('spacing'),
15
+ value: z.number(),
16
+ unit: z.enum(['px', 'rem', 'em']),
17
+ });
18
+ export const TypographyValueSchema = z.object({
19
+ type: z.literal('typography'),
20
+ fontFamily: z.string(),
21
+ fontSize: z.number(),
22
+ fontWeight: z.number(),
23
+ lineHeight: z.number().optional(),
24
+ letterSpacing: z.number().optional(),
25
+ });
26
+ export const ShadowValueSchema = z.object({
27
+ type: z.literal('shadow'),
28
+ x: z.number(),
29
+ y: z.number(),
30
+ blur: z.number(),
31
+ spread: z.number(),
32
+ color: z.string(),
33
+ });
34
+ export const BorderValueSchema = z.object({
35
+ type: z.literal('border'),
36
+ width: z.number(),
37
+ style: z.enum(['solid', 'dashed', 'dotted', 'none']),
38
+ color: z.string(),
39
+ radius: z.number().optional(),
40
+ });
41
+ export const RawValueSchema = z.object({
42
+ type: z.literal('raw'),
43
+ value: z.string(),
44
+ });
45
+ export const TokenValueSchema = z.discriminatedUnion('type', [
46
+ ColorValueSchema,
47
+ SpacingValueSchema,
48
+ TypographyValueSchema,
49
+ ShadowValueSchema,
50
+ BorderValueSchema,
51
+ RawValueSchema,
52
+ ]);
53
+ // Token source types
54
+ export const CssTokenSourceSchema = z.object({
55
+ type: z.literal('css'),
56
+ path: z.string(),
57
+ selector: z.string().optional(),
58
+ line: z.number().optional(),
59
+ });
60
+ export const JsonTokenSourceSchema = z.object({
61
+ type: z.literal('json'),
62
+ path: z.string(),
63
+ key: z.string().optional(),
64
+ });
65
+ export const ScssTokenSourceSchema = z.object({
66
+ type: z.literal('scss'),
67
+ path: z.string(),
68
+ variableName: z.string(),
69
+ line: z.number().optional(),
70
+ });
71
+ export const FigmaTokenSourceSchema = z.object({
72
+ type: z.literal('figma'),
73
+ fileKey: z.string(),
74
+ variableId: z.string().optional(),
75
+ collectionName: z.string().optional(),
76
+ });
77
+ export const TokenSourceSchema = z.discriminatedUnion('type', [
78
+ CssTokenSourceSchema,
79
+ JsonTokenSourceSchema,
80
+ ScssTokenSourceSchema,
81
+ FigmaTokenSourceSchema,
82
+ ]);
83
+ // Token category
84
+ export const TokenCategorySchema = z.enum([
85
+ 'color',
86
+ 'spacing',
87
+ 'typography',
88
+ 'shadow',
89
+ 'border',
90
+ 'sizing',
91
+ 'motion',
92
+ 'other',
93
+ ]);
94
+ // Token metadata
95
+ export const TokenMetadataSchema = z.object({
96
+ deprecated: z.boolean().optional(),
97
+ deprecationReason: z.string().optional(),
98
+ description: z.string().optional(),
99
+ tags: z.array(z.string()).optional(),
100
+ });
101
+ // Main Token schema
102
+ export const DesignTokenSchema = z.object({
103
+ id: z.string(),
104
+ name: z.string(),
105
+ category: TokenCategorySchema,
106
+ value: TokenValueSchema,
107
+ source: TokenSourceSchema,
108
+ aliases: z.array(z.string()),
109
+ usedBy: z.array(z.string()),
110
+ metadata: TokenMetadataSchema,
111
+ scannedAt: z.date(),
112
+ });
113
+ // Helper to create token ID
114
+ export function createTokenId(source, name) {
115
+ switch (source.type) {
116
+ case 'css':
117
+ return `css:${source.path}:${name}`;
118
+ case 'json':
119
+ return `json:${source.path}:${name}`;
120
+ case 'scss':
121
+ return `scss:${source.path}:${source.variableName}`;
122
+ case 'figma':
123
+ return `figma:${source.fileKey}:${source.variableId || name}`;
124
+ }
125
+ }
126
+ // Helper to normalize token name for matching
127
+ export function normalizeTokenName(name) {
128
+ return name
129
+ .toLowerCase()
130
+ .replace(/[-_\s.]/g, '');
131
+ }
132
+ // Helper to compare token values
133
+ export function tokensMatch(a, b) {
134
+ if (a.type !== b.type)
135
+ return false;
136
+ switch (a.type) {
137
+ case 'color':
138
+ return a.hex.toLowerCase() === b.hex.toLowerCase();
139
+ case 'spacing':
140
+ return a.value === b.value && a.unit === b.unit;
141
+ case 'typography':
142
+ const bTypo = b;
143
+ return (a.fontFamily === bTypo.fontFamily &&
144
+ a.fontSize === bTypo.fontSize &&
145
+ a.fontWeight === bTypo.fontWeight);
146
+ case 'shadow':
147
+ const bShadow = b;
148
+ return (a.x === bShadow.x &&
149
+ a.y === bShadow.y &&
150
+ a.blur === bShadow.blur &&
151
+ a.spread === bShadow.spread &&
152
+ a.color.toLowerCase() === bShadow.color.toLowerCase());
153
+ case 'border':
154
+ const bBorder = b;
155
+ return (a.width === bBorder.width &&
156
+ a.style === bBorder.style &&
157
+ a.color.toLowerCase() === bBorder.color.toLowerCase());
158
+ case 'raw':
159
+ return a.value === b.value;
160
+ default:
161
+ return false;
162
+ }
163
+ }
164
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/models/token.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=token.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.test.d.ts","sourceRoot":"","sources":["../../src/models/token.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,168 @@
1
+ // packages/core/src/models/token.test.ts
2
+ import { describe, it, expect } from 'vitest';
3
+ import { createTokenId, normalizeTokenName, tokensMatch, } from './token.js';
4
+ describe('token model helpers', () => {
5
+ describe('createTokenId', () => {
6
+ it('creates id for CSS token', () => {
7
+ const source = { type: 'css', path: 'variables.css' };
8
+ const id = createTokenId(source, '--primary-color');
9
+ expect(id).toBe('css:variables.css:--primary-color');
10
+ });
11
+ it('creates id for JSON token', () => {
12
+ const source = { type: 'json', path: 'tokens.json', key: 'colors' };
13
+ const id = createTokenId(source, 'primary');
14
+ expect(id).toBe('json:tokens.json:primary');
15
+ });
16
+ it('creates id for SCSS token', () => {
17
+ const source = { type: 'scss', path: '_variables.scss', variableName: '$primary' };
18
+ const id = createTokenId(source, '$primary');
19
+ expect(id).toBe('scss:_variables.scss:$primary');
20
+ });
21
+ it('creates id for Figma token with variableId', () => {
22
+ const source = { type: 'figma', fileKey: 'abc123', variableId: 'var-456' };
23
+ const id = createTokenId(source, 'Primary/500');
24
+ expect(id).toBe('figma:abc123:var-456');
25
+ });
26
+ it('creates id for Figma token without variableId (uses name)', () => {
27
+ const source = { type: 'figma', fileKey: 'abc123' };
28
+ const id = createTokenId(source, 'Primary/500');
29
+ expect(id).toBe('figma:abc123:Primary/500');
30
+ });
31
+ });
32
+ describe('normalizeTokenName', () => {
33
+ it('lowercases names', () => {
34
+ expect(normalizeTokenName('PrimaryColor')).toBe('primarycolor');
35
+ });
36
+ it('removes hyphens', () => {
37
+ expect(normalizeTokenName('--primary-color')).toBe('primarycolor');
38
+ });
39
+ it('removes underscores', () => {
40
+ expect(normalizeTokenName('primary_color')).toBe('primarycolor');
41
+ });
42
+ it('removes spaces', () => {
43
+ expect(normalizeTokenName('primary color')).toBe('primarycolor');
44
+ });
45
+ it('removes dots', () => {
46
+ expect(normalizeTokenName('color.primary.500')).toBe('colorprimary500');
47
+ });
48
+ it('normalizes complex names consistently', () => {
49
+ // These should all normalize to the same value
50
+ expect(normalizeTokenName('--spacing-lg')).toBe('spacinglg');
51
+ expect(normalizeTokenName('spacing_lg')).toBe('spacinglg');
52
+ expect(normalizeTokenName('spacing.lg')).toBe('spacinglg');
53
+ expect(normalizeTokenName('SPACING-LG')).toBe('spacinglg');
54
+ });
55
+ });
56
+ describe('tokensMatch', () => {
57
+ describe('color tokens', () => {
58
+ it('matches identical colors', () => {
59
+ const a = { type: 'color', hex: '#ffffff' };
60
+ const b = { type: 'color', hex: '#ffffff' };
61
+ expect(tokensMatch(a, b)).toBe(true);
62
+ });
63
+ it('matches equivalent hex colors (case insensitive)', () => {
64
+ const a = { type: 'color', hex: '#FFFFFF' };
65
+ const b = { type: 'color', hex: '#ffffff' };
66
+ expect(tokensMatch(a, b)).toBe(true);
67
+ });
68
+ it('detects different colors', () => {
69
+ const a = { type: 'color', hex: '#ffffff' };
70
+ const b = { type: 'color', hex: '#000000' };
71
+ expect(tokensMatch(a, b)).toBe(false);
72
+ });
73
+ });
74
+ describe('spacing tokens', () => {
75
+ it('matches identical spacing', () => {
76
+ const a = { type: 'spacing', value: 16, unit: 'px' };
77
+ const b = { type: 'spacing', value: 16, unit: 'px' };
78
+ expect(tokensMatch(a, b)).toBe(true);
79
+ });
80
+ it('detects different spacing values', () => {
81
+ const a = { type: 'spacing', value: 16, unit: 'px' };
82
+ const b = { type: 'spacing', value: 24, unit: 'px' };
83
+ expect(tokensMatch(a, b)).toBe(false);
84
+ });
85
+ it('detects different spacing units', () => {
86
+ const a = { type: 'spacing', value: 16, unit: 'px' };
87
+ const b = { type: 'spacing', value: 16, unit: 'rem' };
88
+ expect(tokensMatch(a, b)).toBe(false);
89
+ });
90
+ });
91
+ describe('typography tokens', () => {
92
+ it('matches identical typography', () => {
93
+ const a = { type: 'typography', fontFamily: 'Inter', fontSize: 16, fontWeight: 400 };
94
+ const b = { type: 'typography', fontFamily: 'Inter', fontSize: 16, fontWeight: 400 };
95
+ expect(tokensMatch(a, b)).toBe(true);
96
+ });
97
+ it('detects different font family', () => {
98
+ const a = { type: 'typography', fontFamily: 'Inter', fontSize: 16, fontWeight: 400 };
99
+ const b = { type: 'typography', fontFamily: 'Roboto', fontSize: 16, fontWeight: 400 };
100
+ expect(tokensMatch(a, b)).toBe(false);
101
+ });
102
+ it('detects different font size', () => {
103
+ const a = { type: 'typography', fontFamily: 'Inter', fontSize: 16, fontWeight: 400 };
104
+ const b = { type: 'typography', fontFamily: 'Inter', fontSize: 18, fontWeight: 400 };
105
+ expect(tokensMatch(a, b)).toBe(false);
106
+ });
107
+ it('detects different font weight', () => {
108
+ const a = { type: 'typography', fontFamily: 'Inter', fontSize: 16, fontWeight: 400 };
109
+ const b = { type: 'typography', fontFamily: 'Inter', fontSize: 16, fontWeight: 700 };
110
+ expect(tokensMatch(a, b)).toBe(false);
111
+ });
112
+ });
113
+ describe('shadow tokens', () => {
114
+ it('matches identical shadows', () => {
115
+ const a = { type: 'shadow', x: 0, y: 4, blur: 8, spread: 0, color: '#000000' };
116
+ const b = { type: 'shadow', x: 0, y: 4, blur: 8, spread: 0, color: '#000000' };
117
+ expect(tokensMatch(a, b)).toBe(true);
118
+ });
119
+ it('matches shadows with case-insensitive colors', () => {
120
+ const a = { type: 'shadow', x: 0, y: 4, blur: 8, spread: 0, color: '#AABBCC' };
121
+ const b = { type: 'shadow', x: 0, y: 4, blur: 8, spread: 0, color: '#aabbcc' };
122
+ expect(tokensMatch(a, b)).toBe(true);
123
+ });
124
+ it('detects different shadow properties', () => {
125
+ const a = { type: 'shadow', x: 0, y: 4, blur: 8, spread: 0, color: '#000000' };
126
+ const b = { type: 'shadow', x: 0, y: 8, blur: 8, spread: 0, color: '#000000' };
127
+ expect(tokensMatch(a, b)).toBe(false);
128
+ });
129
+ });
130
+ describe('border tokens', () => {
131
+ it('matches identical borders', () => {
132
+ const a = { type: 'border', width: 1, style: 'solid', color: '#000000' };
133
+ const b = { type: 'border', width: 1, style: 'solid', color: '#000000' };
134
+ expect(tokensMatch(a, b)).toBe(true);
135
+ });
136
+ it('matches borders with case-insensitive colors', () => {
137
+ const a = { type: 'border', width: 1, style: 'solid', color: '#AABBCC' };
138
+ const b = { type: 'border', width: 1, style: 'solid', color: '#aabbcc' };
139
+ expect(tokensMatch(a, b)).toBe(true);
140
+ });
141
+ it('detects different border style', () => {
142
+ const a = { type: 'border', width: 1, style: 'solid', color: '#000000' };
143
+ const b = { type: 'border', width: 1, style: 'dashed', color: '#000000' };
144
+ expect(tokensMatch(a, b)).toBe(false);
145
+ });
146
+ });
147
+ describe('raw tokens', () => {
148
+ it('matches identical raw values', () => {
149
+ const a = { type: 'raw', value: '10px 20px' };
150
+ const b = { type: 'raw', value: '10px 20px' };
151
+ expect(tokensMatch(a, b)).toBe(true);
152
+ });
153
+ it('detects different raw values', () => {
154
+ const a = { type: 'raw', value: '10px 20px' };
155
+ const b = { type: 'raw', value: '10px 30px' };
156
+ expect(tokensMatch(a, b)).toBe(false);
157
+ });
158
+ });
159
+ describe('cross-type matching', () => {
160
+ it('returns false for different token types', () => {
161
+ const color = { type: 'color', hex: '#ffffff' };
162
+ const spacing = { type: 'spacing', value: 16, unit: 'px' };
163
+ expect(tokensMatch(color, spacing)).toBe(false);
164
+ });
165
+ });
166
+ });
167
+ });
168
+ //# sourceMappingURL=token.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.test.js","sourceRoot":"","sources":["../../src/models/token.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './types.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './types.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC"}
@@ -0,0 +1,60 @@
1
+ import type { Component, DesignToken } from '../models/index.js';
2
+ export interface PluginMetadata {
3
+ name: string;
4
+ version: string;
5
+ description?: string;
6
+ detects?: string[];
7
+ }
8
+ export interface ScanContext {
9
+ projectRoot: string;
10
+ config: Record<string, unknown>;
11
+ include?: string[];
12
+ exclude?: string[];
13
+ }
14
+ export interface ScanResult {
15
+ components: Component[];
16
+ tokens: DesignToken[];
17
+ errors: Array<{
18
+ file?: string;
19
+ message: string;
20
+ code?: string;
21
+ }>;
22
+ stats: {
23
+ filesScanned: number;
24
+ itemsFound: number;
25
+ duration: number;
26
+ };
27
+ }
28
+ export interface ReportContext {
29
+ ci: boolean;
30
+ format: 'json' | 'table' | 'markdown';
31
+ github?: {
32
+ token: string;
33
+ repo: string;
34
+ pr: number;
35
+ };
36
+ }
37
+ export interface DriftResult {
38
+ signals: Array<{
39
+ type: string;
40
+ severity: 'critical' | 'warning' | 'info';
41
+ message: string;
42
+ component?: string;
43
+ file?: string;
44
+ line?: number;
45
+ suggestion?: string;
46
+ }>;
47
+ summary: {
48
+ total: number;
49
+ critical: number;
50
+ warning: number;
51
+ info: number;
52
+ };
53
+ }
54
+ export interface BuoyPlugin {
55
+ metadata: PluginMetadata;
56
+ scan?(context: ScanContext): Promise<ScanResult>;
57
+ report?(results: DriftResult, context: ReportContext): Promise<void>;
58
+ }
59
+ export type PluginFactory = () => BuoyPlugin | Promise<BuoyPlugin>;
60
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/plugins/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjE,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CACvE;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;IACtC,MAAM,CAAC,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;QAC1C,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IACH,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7E;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,cAAc,CAAC;IAGzB,IAAI,CAAC,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAGjD,MAAM,CAAC,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtE;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/plugins/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@buoy-design/core",
3
+ "version": "0.1.0",
4
+ "description": "Core domain models and analysis for Buoy design drift detection",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "Buoy <hello@buoy.design>",
8
+ "homepage": "https://buoy.design",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/dylantarre/buoy-design.git",
12
+ "directory": "packages/core"
13
+ },
14
+ "bugs": {
15
+ "url": "https://github.com/dylantarre/buoy-design/issues"
16
+ },
17
+ "keywords": ["buoy", "design-system", "drift-detection", "design-tokens"],
18
+ "files": ["dist", "README.md"],
19
+ "main": "./dist/index.js",
20
+ "types": "./dist/index.d.ts",
21
+ "exports": {
22
+ ".": {
23
+ "types": "./dist/index.d.ts",
24
+ "import": "./dist/index.js"
25
+ },
26
+ "./models": {
27
+ "types": "./dist/models/index.d.ts",
28
+ "import": "./dist/models/index.js"
29
+ },
30
+ "./analysis": {
31
+ "types": "./dist/analysis/index.d.ts",
32
+ "import": "./dist/analysis/index.js"
33
+ }
34
+ },
35
+ "scripts": {
36
+ "build": "tsc",
37
+ "dev": "tsc --watch",
38
+ "typecheck": "tsc --noEmit",
39
+ "clean": "rm -rf dist",
40
+ "test": "vitest run",
41
+ "test:watch": "vitest"
42
+ },
43
+ "dependencies": {
44
+ "zod": "^3.24.1"
45
+ },
46
+ "devDependencies": {
47
+ "typescript": "^5.7.2"
48
+ }
49
+ }