@arbor-css/core 0.0.71 → 0.0.73

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/run.d.ts CHANGED
@@ -1,3 +1,2 @@
1
- #!/usr/bin/node
2
1
  export {};
3
2
  //# sourceMappingURL=run.d.ts.map
package/dist/cli/run.js CHANGED
@@ -1,4 +1,3 @@
1
- #!/usr/bin/node
2
1
  /// <reference types="node" />
3
2
  import { createJiti } from 'jiti';
4
3
  import fs from 'node:fs';
@@ -6,7 +5,50 @@ import path from 'node:path';
6
5
  import yargs from 'yargs';
7
6
  import { hideBin } from 'yargs/helpers';
8
7
  import { generateStylesheet } from '../stylesheet/generateStylesheet.js';
8
+ import { createPrefixValidationConfig, createTokenMap, validateCssContent, } from './validate.js';
9
9
  const jiti = createJiti(import.meta.url);
10
+ async function loadArborConfig(configPath) {
11
+ const arborModule = await jiti.import(configPath);
12
+ const arbor = arborModule.default ?? arborModule.arbor ?? arborModule;
13
+ if (!arbor || typeof arbor !== 'object' || !('$' in arbor)) {
14
+ throw new Error('Configuration file must export an Arbor preset object as default export.');
15
+ }
16
+ return arbor;
17
+ }
18
+ const CSS_EXTENSIONS = new Set(['.css', '.scss', '.less']);
19
+ const SKIPPED_DIRECTORIES = new Set([
20
+ '.git',
21
+ 'node_modules',
22
+ 'dist',
23
+ '.next',
24
+ '.astro',
25
+ ]);
26
+ async function collectCssFiles(rootDir) {
27
+ const files = [];
28
+ async function walk(currentDir) {
29
+ const entries = await fs.promises.readdir(currentDir, {
30
+ withFileTypes: true,
31
+ });
32
+ for (const entry of entries) {
33
+ const entryPath = path.join(currentDir, entry.name);
34
+ if (entry.isDirectory()) {
35
+ if (SKIPPED_DIRECTORIES.has(entry.name)) {
36
+ continue;
37
+ }
38
+ await walk(entryPath);
39
+ continue;
40
+ }
41
+ if (!entry.isFile()) {
42
+ continue;
43
+ }
44
+ if (CSS_EXTENSIONS.has(path.extname(entry.name).toLowerCase())) {
45
+ files.push(entryPath);
46
+ }
47
+ }
48
+ }
49
+ await walk(rootDir);
50
+ return files;
51
+ }
10
52
  yargs(hideBin(process.argv))
11
53
  .command('build', 'Build your CSS', (y) => y
12
54
  .option('config', {
@@ -19,21 +61,86 @@ yargs(hideBin(process.argv))
19
61
  type: 'string',
20
62
  description: 'Path to the output file',
21
63
  }), async (argv) => {
22
- console.log('Building with config:', argv.config);
23
- console.log('Output file:', argv.output);
24
- const arborModule = await jiti.import(path.join(process.cwd(), argv.config || 'arbor.config.ts'));
25
- const arbor = arborModule.default ?? arborModule.arbor;
26
- if (!arbor) {
27
- console.error('Error: Configuration file must export a default Arbor config object.');
64
+ try {
65
+ console.log('Building with config:', argv.config);
66
+ console.log('Output file:', argv.output);
67
+ const resolvedConfigPath = path.join(process.cwd(), argv.config || 'arbor.config.ts');
68
+ const arbor = await loadArborConfig(resolvedConfigPath);
69
+ const content = await generateStylesheet(arbor);
70
+ if (argv.output) {
71
+ await fs.promises.writeFile(argv.output, content, 'utf-8');
72
+ console.log(`Stylesheet written to ${argv.output}`);
73
+ }
74
+ else {
75
+ console.log(content);
76
+ }
77
+ }
78
+ catch (error) {
79
+ console.error(error instanceof Error ? error.message : String(error));
28
80
  process.exit(1);
29
81
  }
30
- const content = await generateStylesheet(arbor);
31
- if (argv.output) {
32
- await fs.promises.writeFile(argv.output, content, 'utf-8');
33
- console.log(`Stylesheet written to ${argv.output}`);
82
+ })
83
+ .command('validate [files...]', 'Validate Arbor-prefixed CSS declarations, function calls, and @apply mixins', (y) => y
84
+ .positional('files', {
85
+ type: 'string',
86
+ array: true,
87
+ default: [],
88
+ description: 'CSS files to validate',
89
+ })
90
+ .option('config', {
91
+ alias: 'c',
92
+ type: 'string',
93
+ description: 'Path to the configuration file',
94
+ }), async (argv) => {
95
+ try {
96
+ const providedFiles = argv.files ?? [];
97
+ const files = providedFiles.length > 0 ?
98
+ providedFiles.map((file) => path.isAbsolute(file) ? file : path.join(process.cwd(), file))
99
+ : await collectCssFiles(process.cwd());
100
+ if (files.length === 0) {
101
+ console.error('No CSS files found to validate.');
102
+ process.exit(1);
103
+ }
104
+ const resolvedConfigPath = path.join(process.cwd(), argv.config || 'arbor.config.ts');
105
+ const arbor = await loadArborConfig(resolvedConfigPath);
106
+ const tokenMap = createTokenMap(arbor);
107
+ const prefixConfig = createPrefixValidationConfig(arbor.context.tokenPrefixes);
108
+ let totalIssues = 0;
109
+ for (const filePath of files) {
110
+ const displayPath = path.relative(process.cwd(), filePath) || filePath;
111
+ let cssContent = '';
112
+ try {
113
+ cssContent = await fs.promises.readFile(filePath, 'utf-8');
114
+ }
115
+ catch (error) {
116
+ console.error(`ERROR ${displayPath}: ${error instanceof Error ? error.message : String(error)}`);
117
+ totalIssues += 1;
118
+ continue;
119
+ }
120
+ const issues = validateCssContent({
121
+ content: cssContent,
122
+ tokenMap,
123
+ prefixConfig,
124
+ });
125
+ if (issues.length === 0) {
126
+ console.log(`OK ${displayPath}`);
127
+ continue;
128
+ }
129
+ console.error(`ERROR ${displayPath}`);
130
+ for (const issue of issues) {
131
+ console.error(` ${issue.line}:${issue.column} ${issue.message}`);
132
+ }
133
+ totalIssues += issues.length;
134
+ }
135
+ if (totalIssues > 0) {
136
+ console.error(`Validation failed with ${totalIssues} issue(s).`);
137
+ process.exit(1);
138
+ }
139
+ console.log(`Validation passed for ${files.length} file(s).`);
34
140
  }
35
- else {
36
- console.log(content);
141
+ catch (error) {
142
+ console.error(error instanceof Error ? error.message : String(error));
143
+ process.exit(1);
37
144
  }
38
145
  })
39
146
  .demandCommand(1, 'You need to specify a command')
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":";AACA,8BAA8B;AAE9B,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAEzE,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEzC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KAC1B,OAAO,CACP,OAAO,EACP,gBAAgB,EAChB,CAAC,CAAC,EAAE,EAAE,CACL,CAAC;KACC,MAAM,CAAC,QAAQ,EAAE;IACjB,KAAK,EAAE,GAAG;IACV,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,gCAAgC;CAC7C,CAAC;KACD,MAAM,CAAC,QAAQ,EAAE;IACjB,KAAK,EAAE,GAAG;IACV,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,yBAAyB;CACtC,CAAC,EACJ,KAAK,EAAE,IAAI,EAAE,EAAE;IACd,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,WAAW,GAAQ,MAAM,IAAI,CAAC,MAAM,CACzC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,IAAI,iBAAiB,CAAC,CAC1D,CAAC;IACF,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,IAAI,WAAW,CAAC,KAAK,CAAC;IACvD,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CACZ,sEAAsE,CACtE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAChD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;AACF,CAAC,CACD;KACA,aAAa,CAAC,CAAC,EAAE,+BAA+B,CAAC;KACjD,IAAI,EAAE;KACN,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { type ArborFunction, type ArborMixin } from '@arbor-css/functions';
2
+ import { type ArborResolvedPrefixes } from '@arbor-css/globals';
3
+ import type { AnyArborPreset } from '@arbor-css/preset/config';
4
+ import type { Token } from '@arbor-css/tokens';
5
+ type TokenMapValue = Token | ArborFunction | ArborMixin<any, any>;
6
+ export type TokenMap = Map<string, TokenMapValue>;
7
+ export interface PrefixValidationConfig {
8
+ tokenPrefixes: string[];
9
+ functionNamePrefix: string;
10
+ mixinNamePrefix: string;
11
+ }
12
+ export interface ValidationIssue {
13
+ name: string;
14
+ kind: 'token' | 'function' | 'mixin';
15
+ message: string;
16
+ index: number;
17
+ line: number;
18
+ column: number;
19
+ }
20
+ export declare function createTokenMap(preset: AnyArborPreset): TokenMap;
21
+ export declare function createPrefixValidationConfig(tokenPrefixes: ArborResolvedPrefixes): PrefixValidationConfig;
22
+ export declare function validateCssContent({ content, tokenMap, prefixConfig, }: {
23
+ content: string;
24
+ tokenMap: TokenMap;
25
+ prefixConfig: PrefixValidationConfig;
26
+ }): ValidationIssue[];
27
+ export {};
28
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/cli/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEN,KAAK,qBAAqB,EAC1B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE/C,KAAK,aAAa,GAAG,KAAK,GAAG,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAElE,MAAM,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAElD,MAAM,WAAW,sBAAsB;IACtC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CACf;AAiFD,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,QAAQ,CAgB/D;AAED,wBAAgB,4BAA4B,CAC3C,aAAa,EAAE,qBAAqB,GAClC,sBAAsB,CAqBxB;AAED,wBAAgB,kBAAkB,CAAC,EAClC,OAAO,EACP,QAAQ,EACR,YAAY,GACZ,EAAE;IACF,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,sBAAsB,CAAC;CACrC,GAAG,eAAe,EAAE,CA6GpB"}
@@ -0,0 +1,185 @@
1
+ import { isFunction, isMixin, } from '@arbor-css/functions';
2
+ import { DEFAULT_MODE_TOKEN_PREFIX, } from '@arbor-css/globals';
3
+ import { flattenToPropsList } from '@arbor-css/modes';
4
+ function escapeRegex(value) {
5
+ return value.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
6
+ }
7
+ function getLineStarts(content) {
8
+ const lineStarts = [0];
9
+ for (let i = 0; i < content.length; i += 1) {
10
+ if (content[i] === '\n') {
11
+ lineStarts.push(i + 1);
12
+ }
13
+ }
14
+ return lineStarts;
15
+ }
16
+ function indexToLineColumn(index, lineStarts) {
17
+ let low = 0;
18
+ let high = lineStarts.length - 1;
19
+ while (low <= high) {
20
+ const mid = Math.floor((low + high) / 2);
21
+ const lineStart = lineStarts[mid];
22
+ const nextLineStart = mid + 1 < lineStarts.length ?
23
+ lineStarts[mid + 1]
24
+ : Number.POSITIVE_INFINITY;
25
+ if (index < lineStart) {
26
+ high = mid - 1;
27
+ continue;
28
+ }
29
+ if (index >= nextLineStart) {
30
+ low = mid + 1;
31
+ continue;
32
+ }
33
+ return {
34
+ line: mid + 1,
35
+ column: index - lineStart + 1,
36
+ };
37
+ }
38
+ return {
39
+ line: 1,
40
+ column: index + 1,
41
+ };
42
+ }
43
+ function addIssue(issues, seen, lineStarts, { name, kind, message, index, }) {
44
+ const key = `${kind}:${name}:${index}:${message}`;
45
+ if (seen.has(key)) {
46
+ return;
47
+ }
48
+ seen.add(key);
49
+ const { line, column } = indexToLineColumn(index, lineStarts);
50
+ issues.push({
51
+ name,
52
+ kind,
53
+ message,
54
+ index,
55
+ line,
56
+ column,
57
+ });
58
+ }
59
+ export function createTokenMap(preset) {
60
+ const tokenMap = new Map();
61
+ for (const token of flattenToPropsList(preset.$)) {
62
+ tokenMap.set(token.name, token);
63
+ }
64
+ for (const fn of preset.functions ? Object.values(preset.functions) : []) {
65
+ tokenMap.set(fn.name, fn);
66
+ }
67
+ for (const mixin of preset.mixins ? Object.values(preset.mixins) : []) {
68
+ tokenMap.set(mixin.name, mixin);
69
+ }
70
+ return tokenMap;
71
+ }
72
+ export function createPrefixValidationConfig(tokenPrefixes) {
73
+ const configuredPrefixes = [
74
+ tokenPrefixes.modeTokenPrefix,
75
+ tokenPrefixes.primitiveTokenPrefix,
76
+ tokenPrefixes.metaTokenPrefix,
77
+ tokenPrefixes.refTokenPrefix,
78
+ tokenPrefixes.mixinTokenPrefix,
79
+ tokenPrefixes.functionNamePrefix,
80
+ tokenPrefixes.mixinNamePrefix,
81
+ ].filter((value) => typeof value === 'string');
82
+ const declarationPrefixes = [...new Set(configuredPrefixes)];
83
+ if (declarationPrefixes.length === 0) {
84
+ declarationPrefixes.push(DEFAULT_MODE_TOKEN_PREFIX);
85
+ }
86
+ return {
87
+ tokenPrefixes: declarationPrefixes,
88
+ functionNamePrefix: tokenPrefixes.functionNamePrefix,
89
+ mixinNamePrefix: tokenPrefixes.mixinNamePrefix,
90
+ };
91
+ }
92
+ export function validateCssContent({ content, tokenMap, prefixConfig, }) {
93
+ const issues = [];
94
+ const seen = new Set();
95
+ const lineStarts = getLineStarts(content);
96
+ for (const prefix of prefixConfig.tokenPrefixes) {
97
+ const generalPropertyUsageRegex = new RegExp(`[\\s(](${escapeRegex(prefix)}[\\w-]+)[\\s)]`, 'gm');
98
+ for (const match of content.matchAll(generalPropertyUsageRegex)) {
99
+ if (match.index === undefined) {
100
+ continue;
101
+ }
102
+ const propertyName = match[1];
103
+ const index = match.index;
104
+ const matchedValue = tokenMap.get(propertyName);
105
+ if (!matchedValue) {
106
+ addIssue(issues, seen, lineStarts, {
107
+ name: propertyName,
108
+ kind: 'token',
109
+ message: `Unknown CSS property or Arbor token: ${propertyName}`,
110
+ index,
111
+ });
112
+ }
113
+ }
114
+ const declarationRegex = new RegExp(`(^|[;{\\s])(${escapeRegex(prefix)}[\\w-]+)\\s*:`, 'gm');
115
+ for (const match of content.matchAll(declarationRegex)) {
116
+ if (match.index === undefined) {
117
+ continue;
118
+ }
119
+ const name = match[2];
120
+ const index = match.index + match[1].length;
121
+ const matchedValue = tokenMap.get(name);
122
+ if (!matchedValue) {
123
+ addIssue(issues, seen, lineStarts, {
124
+ name,
125
+ kind: 'token',
126
+ message: `Unknown Arbor token: ${name}`,
127
+ index,
128
+ });
129
+ continue;
130
+ }
131
+ if (isFunction(matchedValue)) {
132
+ addIssue(issues, seen, lineStarts, {
133
+ name,
134
+ kind: 'token',
135
+ message: `Arbor functions cannot be used as property declarations: ${name}`,
136
+ index,
137
+ });
138
+ continue;
139
+ }
140
+ if (isMixin(matchedValue)) {
141
+ addIssue(issues, seen, lineStarts, {
142
+ name,
143
+ kind: 'token',
144
+ message: `Arbor mixins cannot be used as property declarations: ${name}`,
145
+ index,
146
+ });
147
+ }
148
+ }
149
+ }
150
+ const functionCallRegex = new RegExp(`(${escapeRegex(prefixConfig.functionNamePrefix)}[\\w-]+)\\s*\\(`, 'g');
151
+ for (const match of content.matchAll(functionCallRegex)) {
152
+ if (match.index === undefined) {
153
+ continue;
154
+ }
155
+ const name = match[1];
156
+ const matchedValue = tokenMap.get(name);
157
+ if (!matchedValue || !isFunction(matchedValue)) {
158
+ addIssue(issues, seen, lineStarts, {
159
+ name,
160
+ kind: 'function',
161
+ message: `Unknown Arbor function: ${name}`,
162
+ index: match.index,
163
+ });
164
+ }
165
+ }
166
+ const mixinApplyRegex = new RegExp(`@apply\\s+(${escapeRegex(prefixConfig.mixinNamePrefix)}[\\w-]+)`, 'g');
167
+ for (const match of content.matchAll(mixinApplyRegex)) {
168
+ if (match.index === undefined) {
169
+ continue;
170
+ }
171
+ const name = match[1];
172
+ const nameIndex = match.index + match[0].indexOf(name);
173
+ const matchedValue = tokenMap.get(name);
174
+ if (!matchedValue || !isMixin(matchedValue)) {
175
+ addIssue(issues, seen, lineStarts, {
176
+ name,
177
+ kind: 'mixin',
178
+ message: `Unknown Arbor mixin: ${name}`,
179
+ index: nameIndex,
180
+ });
181
+ }
182
+ }
183
+ return issues;
184
+ }
185
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/cli/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=validate.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.test.d.ts","sourceRoot":"","sources":["../../src/cli/validate.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,91 @@
1
+ import { createArbor } from '@arbor-css/preset';
2
+ import { expect, it } from 'vitest';
3
+ import { createPrefixValidationConfig, createTokenMap, validateCssContent, } from './validate.js';
4
+ function createTestPreset() {
5
+ const builder = createArbor({
6
+ modeTokenPrefix: '--x-',
7
+ primitiveTokenPrefix: '--xp-',
8
+ metaTokenPrefix: '--x_-',
9
+ refTokenPrefix: '--xref-',
10
+ functionNamePrefix: '--x-fn-',
11
+ mixinNamePrefix: '--x-mx-',
12
+ mixinTokenPrefix: '--x-mx-',
13
+ });
14
+ const double = builder.context.createFunction('double', {
15
+ parameters: ['--value'],
16
+ definition: ($, value) => $ `${value}`,
17
+ });
18
+ const fg = builder.context.createMixin('fg', {
19
+ parameters: ['--color'],
20
+ definition: (css, { parameters: [color] }) => ({
21
+ color: css `${color}`,
22
+ }),
23
+ });
24
+ return builder.preset({
25
+ color: {
26
+ mainColor: 'brand',
27
+ ranges: {
28
+ brand: {
29
+ hue: 120,
30
+ },
31
+ },
32
+ },
33
+ functions: { double },
34
+ mixins: { fg },
35
+ });
36
+ }
37
+ it('reports unknown declarations, functions, and mixins for configured prefixes', () => {
38
+ const preset = createTestPreset();
39
+ const issues = validateCssContent({
40
+ content: [
41
+ '.card {',
42
+ ' --x-does-not-exist: 1px;',
43
+ ' width: --x-fn-missing(1);',
44
+ ' @apply --x-mx-missing;',
45
+ '}',
46
+ ].join('\n'),
47
+ tokenMap: createTokenMap(preset),
48
+ prefixConfig: createPrefixValidationConfig(preset.context.tokenPrefixes),
49
+ });
50
+ expect(issues).toHaveLength(3);
51
+ expect(issues.map((issue) => issue.message)).toEqual(expect.arrayContaining([
52
+ 'Unknown Arbor token: --x-does-not-exist',
53
+ 'Unknown Arbor function: --x-fn-missing',
54
+ 'Unknown Arbor mixin: --x-mx-missing',
55
+ ]));
56
+ });
57
+ it('reports misuse when functions or mixins are used as declarations', () => {
58
+ const preset = createTestPreset();
59
+ const issues = validateCssContent({
60
+ content: [
61
+ '.card {',
62
+ ' --x-fn-double: 1;',
63
+ ' --x-mx-fg: red;',
64
+ '}',
65
+ ].join('\n'),
66
+ tokenMap: createTokenMap(preset),
67
+ prefixConfig: createPrefixValidationConfig(preset.context.tokenPrefixes),
68
+ });
69
+ expect(issues).toHaveLength(2);
70
+ expect(issues.map((issue) => issue.message)).toEqual(expect.arrayContaining([
71
+ 'Arbor functions cannot be used as property declarations: --x-fn-double',
72
+ 'Arbor mixins cannot be used as property declarations: --x-mx-fg',
73
+ ]));
74
+ });
75
+ it('accepts existing declarations, function calls, and mixin apply usage', () => {
76
+ const preset = createTestPreset();
77
+ const knownTokenName = preset.$.mode.spacing.md.name;
78
+ const issues = validateCssContent({
79
+ content: [
80
+ '.card {',
81
+ ` ${knownTokenName}: 1rem;`,
82
+ ' width: --x-fn-double(1);',
83
+ ' @apply --x-mx-fg(red);',
84
+ '}',
85
+ ].join('\n'),
86
+ tokenMap: createTokenMap(preset),
87
+ prefixConfig: createPrefixValidationConfig(preset.context.tokenPrefixes),
88
+ });
89
+ expect(issues).toEqual([]);
90
+ });
91
+ //# sourceMappingURL=validate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.test.js","sourceRoot":"","sources":["../../src/cli/validate.test.ts"],"names":[],"mappings":"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"}
@@ -35,6 +35,6 @@ it('applies descriptions to all built-in system and global tokens', () => {
35
35
  });
36
36
  const tokens = tokenSchemaToList(preset.$.system);
37
37
  expect(tokens.every((token) => typeof token.description === 'string' && token.description.length > 0)).toBe(true);
38
- expect(preset.$.system.global.baseFontSize.description).toBe('Defines the root font size used to derive Arbor typography tokens.');
38
+ expect(preset.$.system.global.baseFontSize.description).toBeDefined();
39
39
  });
40
40
  //# sourceMappingURL=getStructuredTokensMap.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getStructuredTokensMap.test.js","sourceRoot":"","sources":["../src/getStructuredTokensMap.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;IACnF,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC;QACnC,KAAK,EAAE;YACN,MAAM,EAAE;gBACP,KAAK,EAAE;oBACN,GAAG,EAAE,EAAE;iBACP;aACD;YACD,SAAS,EAAE,OAAO;SAClB;KACD,CAAC,CAAC;IACH,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;IAC/C,MAAM,GAAG,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAE3C,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC/E,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;IACxE,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC;QACnC,KAAK,EAAE;YACN,MAAM,EAAE;gBACP,KAAK,EAAE;oBACN,GAAG,EAAE,EAAE;iBACP;aACD;YACD,SAAS,EAAE,OAAO;SAClB;KACD,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAElD,MAAM,CACL,MAAM,CAAC,KAAK,CACX,CAAC,KAAK,EAAE,EAAE,CACT,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CACtE,CACD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,IAAI,CAC3D,oEAAoE,CACpE,CAAC;AACH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"getStructuredTokensMap.test.js","sourceRoot":"","sources":["../src/getStructuredTokensMap.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;IACnF,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC;QACnC,KAAK,EAAE;YACN,MAAM,EAAE;gBACP,KAAK,EAAE;oBACN,GAAG,EAAE,EAAE;iBACP;aACD;YACD,SAAS,EAAE,OAAO;SAClB;KACD,CAAC,CAAC;IACH,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;IAC/C,MAAM,GAAG,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAE3C,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC/E,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;IACxE,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC;QACnC,KAAK,EAAE;YACN,MAAM,EAAE;gBACP,KAAK,EAAE;oBACN,GAAG,EAAE,EAAE;iBACP;aACD;YACD,SAAS,EAAE,OAAO;SAClB;KACD,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAElD,MAAM,CACL,MAAM,CAAC,KAAK,CACX,CAAC,KAAK,EAAE,EAAE,CACT,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CACtE,CACD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;AACvE,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arbor-css/core",
3
- "version": "0.0.71",
3
+ "version": "0.0.73",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -41,18 +41,18 @@
41
41
  "jiti": "^2.6.1",
42
42
  "lil-gui": "^0.21.0",
43
43
  "yargs": "^18.0.0",
44
- "@arbor-css/preset": "0.0.71",
45
- "@arbor-css/tokens": "0.0.71",
46
- "@arbor-css/colors": "0.0.71",
47
- "@arbor-css/globals": "0.0.71",
48
- "@arbor-css/typography": "0.0.71",
49
- "@arbor-css/modes": "0.0.71",
50
- "@arbor-css/primitives": "0.0.71",
51
- "@arbor-css/spacing": "0.0.71",
52
- "@arbor-css/util": "0.0.71",
53
- "@arbor-css/functions": "0.0.71",
54
- "@arbor-css/calc": "0.0.71",
55
- "@arbor-css/shadows": "0.0.71"
44
+ "@arbor-css/preset": "0.0.73",
45
+ "@arbor-css/tokens": "0.0.73",
46
+ "@arbor-css/typography": "0.0.73",
47
+ "@arbor-css/colors": "0.0.73",
48
+ "@arbor-css/modes": "0.0.73",
49
+ "@arbor-css/globals": "0.0.73",
50
+ "@arbor-css/primitives": "0.0.73",
51
+ "@arbor-css/spacing": "0.0.73",
52
+ "@arbor-css/shadows": "0.0.73",
53
+ "@arbor-css/util": "0.0.73",
54
+ "@arbor-css/functions": "0.0.73",
55
+ "@arbor-css/calc": "0.0.73"
56
56
  },
57
57
  "scripts": {
58
58
  "build": "tsc",