dispersa 1.0.0 → 1.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.
package/dist/lint.cjs CHANGED
@@ -734,7 +734,15 @@ var PathSchemaMatcher = class {
734
734
  * DP[i][j] = can we match path[0..i) with pattern[0..j)?
735
735
  */
736
736
  matchPattern(pattern, pathSegments) {
737
- const patternParts = pattern.filter((p) => p.type === "segment" || p.type === "wildcard");
737
+ const patternParts = pattern.filter((p) => {
738
+ if (p.type === "segment" || p.type === "wildcard") {
739
+ return true;
740
+ }
741
+ if (p.type === "literal") {
742
+ return p.value !== "." && !/^\.+$/.test(p.value);
743
+ }
744
+ return false;
745
+ });
738
746
  const pathLen = pathSegments.length;
739
747
  const patternLen = patternParts.length;
740
748
  const dp = [];
@@ -791,6 +799,10 @@ var PathSchemaMatcher = class {
791
799
  if (part.type === "wildcard") {
792
800
  return true;
793
801
  }
802
+ if (part.type === "literal" && part.value !== void 0) {
803
+ const literalValue = part.value.replace(/^\.+|\.+$/g, "");
804
+ return literalValue === value;
805
+ }
794
806
  if (part.type === "segment" && part.name) {
795
807
  const segment = this.segments[part.name];
796
808
  if (!segment) {
package/dist/lint.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lint/create-rule.ts","../src/shared/errors/index.ts","../src/lint/plugin-loader.ts","../src/lint/lint-runner.ts","../src/lint/utils/glob-matcher.ts","../src/lint/utils/reference-extractor.ts","../src/lint/rules/naming-convention.ts","../src/lint/rules/no-deprecated-usage.ts","../src/lint/rules/no-duplicate-values.ts","../src/lint/rules/path-schema/matcher.ts","../src/lint/rules/path-schema/index.ts","../src/lint/rules/require-description.ts","../src/lint/rules/index.ts","../src/cli/formatters/lint-formatter.ts"],"names":["process","isAbsolute","resolve","createJiti","require","createRequire"],"mappings":"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","file":"lint.cjs","sourcesContent":["/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Factory function for creating type-safe lint rules\n *\n * Use `createRule()` to define rules with full TypeScript inference\n * for message IDs and options.\n */\n\nimport type { LintRule } from './types'\n\n/**\n * Factory function for creating type-safe lint rules\n *\n * This function provides no runtime behavior - it simply returns the rule\n * as-is. Its purpose is to provide type inference and autocomplete for\n * message IDs and options.\n *\n * @template MessageIds - Union type of message IDs this rule can produce\n * @template Options - Rule-specific options type\n *\n * @param rule - The rule definition\n * @returns The same rule definition with full type inference\n *\n * @example\n * ```typescript\n * import { createRule } from 'dispersa/lint'\n *\n * export const requireDescription = createRule<\n * 'MISSING_DESCRIPTION' | 'TOO_SHORT',\n * { minLength?: number }\n * >({\n * meta: {\n * name: 'require-description',\n * description: 'Require tokens to have descriptions',\n * messages: {\n * MISSING_DESCRIPTION: \"Token '{{name}}' is missing a description\",\n * TOO_SHORT: \"Token '{{name}}' description is too short ({{length}} chars, min {{minLength}})\",\n * },\n * },\n * defaultOptions: { minLength: 10 },\n * create({ tokens, report, options }) {\n * for (const token of Object.values(tokens)) {\n * if (!token.$description) {\n * report({ token, messageId: 'MISSING_DESCRIPTION', data: { name: token.name } })\n * } else if (token.$description.length < options.minLength) {\n * report({\n * token,\n * messageId: 'TOO_SHORT',\n * data: { name: token.name, length: token.$description.length, minLength: options.minLength },\n * })\n * }\n * }\n * },\n * })\n * ```\n */\nexport function createRule<\n MessageIds extends string,\n Options extends Record<string, unknown> = Record<string, never>,\n>(rule: LintRule<MessageIds, Options>): LintRule<MessageIds, Options> {\n return rule\n}\n\n/**\n * Helper type for extracting options type from a rule\n *\n * @example\n * ```typescript\n * const myRule = createRule<'MSG', { format: string }>({ ... })\n * type MyOptions = RuleOptions<typeof myRule> // { format: string }\n * ```\n */\nexport type RuleOptions<T extends LintRule> = T extends LintRule<string, infer O> ? O : never\n\n/**\n * Helper type for extracting message IDs from a rule\n *\n * @example\n * ```typescript\n * const myRule = createRule<'MSG1' | 'MSG2', { format: string }>({ ... })\n * type MyMessages = RuleMessages<typeof myRule> // 'MSG1' | 'MSG2'\n * ```\n */\nexport type RuleMessages<T extends LintRule> =\n T extends LintRule<infer M, Record<string, unknown>> ? M : never\n","/**\n * @fileoverview Custom error classes for Dispersa\n *\n * Error classes are intentionally kept as simple value objects with no\n * imports from utility modules. Suggestion formatting is done at call\n * sites to keep the error hierarchy dependency-free.\n */\n\n/**\n * Base error class for all Dispersa errors\n */\nexport class DispersaError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'DispersaError'\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, this.constructor)\n }\n }\n}\n\n/**\n * Thrown when a token reference cannot be resolved\n *\n * @param referenceName - The token name that could not be found\n * @param suggestions - Similar token names for \"did you mean?\" hints\n * @param message - Optional custom message (overrides auto-generated message)\n */\nexport class TokenReferenceError extends DispersaError {\n constructor(\n public referenceName: string,\n public suggestions: string[] = [],\n message?: string,\n ) {\n const hint = TokenReferenceError.formatHint(suggestions)\n super(\n message ??\n `Token reference resolution failed: '${referenceName}'. Token does not exist.${hint}`,\n )\n this.name = 'TokenReferenceError'\n }\n\n private static formatHint(suggestions: string[]): string {\n if (suggestions.length === 0) {\n return ''\n }\n if (suggestions.length === 1) {\n return ` Did you mean \"${suggestions[0]}\"?`\n }\n const quoted = suggestions.map((s) => `\"${s}\"`)\n const last = quoted.pop()!\n return ` Did you mean ${quoted.join(', ')} or ${last}?`\n }\n}\n\n/**\n * Thrown when a circular reference is detected\n */\nexport class CircularReferenceError extends DispersaError {\n constructor(\n public tokenName: string,\n public referencePath: string[],\n ) {\n super(\n `Token resolution failed: '${tokenName}'. Circular reference detected in path: ${referencePath.join(' -> ')}`,\n )\n this.name = 'CircularReferenceError'\n }\n}\n\n/**\n * Thrown when validation fails\n */\nexport class ValidationError extends DispersaError {\n constructor(\n message: string,\n public errors: { message: string; path?: string }[],\n ) {\n super(message)\n this.name = 'ValidationError'\n }\n}\n\n/**\n * Thrown when file operations fail\n */\nexport class FileOperationError extends DispersaError {\n constructor(\n public operation: 'read' | 'write',\n public filePath: string,\n public originalError: Error,\n ) {\n super(`Failed to ${operation} file: ${filePath}. ${originalError.message}`)\n this.name = 'FileOperationError'\n }\n}\n\n/**\n * Thrown when a build configuration is invalid\n */\nexport class ConfigurationError extends DispersaError {\n constructor(message: string) {\n super(message)\n this.name = 'ConfigurationError'\n }\n}\n\n/**\n * Thrown when base permutation cannot be determined\n */\nexport class BasePermutationError extends DispersaError {\n constructor(\n message = 'Base permutation determination failed. Define a default modifier in resolver.',\n ) {\n super(message)\n this.name = 'BasePermutationError'\n }\n}\n\n/**\n * Thrown when an unknown modifier or context is used\n *\n * @param modifierName - Name of the modifier that failed validation\n * @param contextValue - The invalid context value (if applicable)\n * @param availableValues - Valid options (context names or modifier names) for the error message\n */\nexport class ModifierError extends DispersaError {\n constructor(\n public modifierName: string,\n public contextValue?: string,\n public availableValues: string[] = [],\n ) {\n const available = availableValues.length > 0 ? ` Available: ${availableValues.join(', ')}.` : ''\n\n const message =\n contextValue != null && contextValue !== ''\n ? `Modifier validation failed: '${modifierName}'. Invalid context '${contextValue}'.${available}`\n : `Modifier validation failed: '${modifierName}'. Modifier not defined in resolver.${available}`\n super(message)\n this.name = 'ModifierError'\n }\n}\n\n/**\n * Thrown when lint errors are found and failOnError is true\n *\n * @param issues - Array of lint issues that caused the error\n */\nexport class LintError extends DispersaError {\n constructor(\n public issues: Array<{\n ruleId: string\n severity: 'error' | 'warn'\n message: string\n tokenName: string\n tokenPath: string[]\n }>,\n ) {\n const errorCount = issues.filter((i) => i.severity === 'error').length\n const warningCount = issues.filter((i) => i.severity === 'warn').length\n super(`Lint failed with ${errorCount} error(s) and ${warningCount} warning(s).`)\n this.name = 'LintError'\n }\n}\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Plugin loader for lint plugins\n *\n * Supports loading plugins from:\n * - Inline plugin objects\n * - String module paths (package names or file paths)\n */\n\nimport { createRequire } from 'node:module'\nimport { isAbsolute, resolve } from 'node:path'\nimport process from 'node:process'\n\nimport { ConfigurationError } from '@shared/errors'\nimport { createJiti } from 'jiti'\n\nimport type { LintPlugin } from './types'\n\nexport type PluginLoaderOptions = {\n /**\n * Base directory for resolving relative plugin paths\n * @default process.cwd()\n */\n cwd?: string\n}\n\n/**\n * Loads lint plugins from various sources\n *\n * Handles:\n * - Inline `LintPlugin` objects (returned as-is)\n * - Package names (e.g., '@dispersa/lint-plugin-a11y')\n * - Relative file paths (e.g., './plugins/my-plugin.ts')\n * - Absolute file paths\n *\n * @security **Warning**: Loading plugins from external packages or file paths\n * executes arbitrary code. Only load plugins from trusted sources.\n * For programmatic usage, prefer passing plugin objects directly rather than\n * strings that trigger dynamic imports.\n *\n * @example\n * ```typescript\n * const loader = new PluginLoader({ cwd: process.cwd() })\n *\n * // Load from inline object\n * const plugin1 = await loader.load(myPlugin)\n *\n * // Load from package\n * const plugin2 = await loader.load('@dispersa/lint-plugin-a11y')\n *\n * // Load from file\n * const plugin3 = await loader.load('./plugins/custom.ts')\n * ```\n */\nexport class PluginLoader {\n private cwd: string\n private jiti: ReturnType<typeof createJiti> | null = null\n private cache: Map<string, LintPlugin> = new Map()\n\n constructor(options: PluginLoaderOptions = {}) {\n this.cwd = options.cwd ?? process.cwd()\n }\n\n /**\n * Load a plugin from an inline object or module path\n *\n * @param source - Plugin object or module path string\n * @returns Loaded plugin\n * @throws {ConfigurationError} If plugin cannot be loaded or is invalid\n */\n async load(source: LintPlugin | string): Promise<LintPlugin> {\n // Inline plugin object - return as-is\n if (this.isPluginObject(source)) {\n this.validatePlugin(source)\n return source\n }\n\n // String path - load module\n const modulePath = source as string\n const cached = this.cache.get(modulePath)\n if (cached) {\n return cached\n }\n\n const plugin = await this.loadFromModule(modulePath)\n this.validatePlugin(plugin)\n this.cache.set(modulePath, plugin)\n return plugin\n }\n\n /**\n * Load multiple plugins\n *\n * @param plugins - Record of namespace to plugin source\n * @returns Record of namespace to loaded plugin\n */\n async loadAll(plugins: Record<string, LintPlugin | string>): Promise<Record<string, LintPlugin>> {\n const entries = Object.entries(plugins)\n const loaded = await Promise.all(\n entries.map(async ([namespace, source]) => [namespace, await this.load(source)] as const),\n )\n return Object.fromEntries(loaded)\n }\n\n /**\n * Check if source is an inline plugin object\n */\n private isPluginObject(source: LintPlugin | string): source is LintPlugin {\n return typeof source !== 'string'\n }\n\n /**\n * Load a plugin from a module path\n */\n private async loadFromModule(modulePath: string): Promise<LintPlugin> {\n // Resolve relative paths from cwd\n const resolvedPath = isAbsolute(modulePath) ? modulePath : resolve(this.cwd, modulePath)\n\n // Check if it's a file path or package name\n const isFilePath =\n modulePath.startsWith('./') || modulePath.startsWith('../') || isAbsolute(modulePath)\n\n try {\n if (isFilePath) {\n return await this.loadFromFile(resolvedPath)\n }\n return await this.loadFromPackage(modulePath)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n throw new ConfigurationError(`Failed to load lint plugin '${modulePath}': ${message}`)\n }\n }\n\n /**\n * Load a plugin from a file path using jiti (supports TypeScript)\n */\n private async loadFromFile(filePath: string): Promise<LintPlugin> {\n this.jiti ??= createJiti(this.cwd, {\n interopDefault: true,\n })\n\n const loaded = await this.jiti(filePath)\n const plugin = this.extractPlugin(loaded)\n\n if (!plugin) {\n throw new ConfigurationError(`Plugin file '${filePath}' does not export a valid LintPlugin`)\n }\n\n return plugin\n }\n\n /**\n * Load a plugin from a package name\n */\n private async loadFromPackage(packageName: string): Promise<LintPlugin> {\n // Try to require the package\n const require = createRequire(this.cwd)\n\n let resolvedPath: string\n try {\n resolvedPath = require.resolve(packageName, { paths: [this.cwd] })\n } catch {\n // Fallback: try from this module's location\n try {\n resolvedPath = require.resolve(packageName)\n } catch {\n throw new ConfigurationError(\n `Cannot find package '${packageName}'. Make sure it is installed.`,\n )\n }\n }\n\n // Use jiti to support ESM/CJS interoperability\n this.jiti ??= createJiti(this.cwd, {\n interopDefault: true,\n })\n\n const loaded = await this.jiti(resolvedPath)\n const plugin = this.extractPlugin(loaded)\n\n if (!plugin) {\n throw new ConfigurationError(`Package '${packageName}' does not export a valid LintPlugin`)\n }\n\n return plugin\n }\n\n /**\n * Extract plugin from loaded module\n *\n * Supports multiple export patterns:\n * - export default plugin\n * - export const plugin = {...}\n * - module.exports = plugin (CJS)\n */\n private extractPlugin(loaded: unknown): LintPlugin | null {\n if (!loaded || typeof loaded !== 'object') {\n return null\n }\n\n const module = loaded as Record<string, unknown>\n\n // Priority 1: default export\n if (module.default && this.isValidPluginStructure(module.default)) {\n return module.default as LintPlugin\n }\n\n // Priority 2: named export 'plugin'\n if (module.plugin && this.isValidPluginStructure(module.plugin)) {\n return module.plugin as LintPlugin\n }\n\n // Priority 3: module is the plugin itself (CJS module.exports = plugin)\n if (this.isValidPluginStructure(loaded)) {\n return loaded as LintPlugin\n }\n\n return null\n }\n\n /**\n * Check if object has required plugin structure\n */\n private isValidPluginStructure(obj: unknown): boolean {\n if (!obj || typeof obj !== 'object') {\n return false\n }\n\n const plugin = obj as Record<string, unknown>\n const rules = plugin.rules as Record<string, unknown> | undefined\n\n if (\n plugin.meta === undefined ||\n typeof plugin.meta !== 'object' ||\n !(plugin.meta as Record<string, unknown>).name ||\n rules === undefined ||\n Object.keys(rules).length === 0\n ) {\n return false\n }\n\n return true\n }\n\n /**\n * Validate a loaded plugin\n */\n private validatePlugin(plugin: LintPlugin): void {\n if (!plugin.meta) {\n throw new ConfigurationError('Lint plugin must have a meta property with name')\n }\n\n if (!plugin.meta.name) {\n throw new ConfigurationError('Lint plugin meta.name is required')\n }\n\n if (\n !plugin.rules ||\n typeof plugin.rules !== 'object' ||\n Object.keys(plugin.rules).length === 0\n ) {\n throw new ConfigurationError(\n `Lint plugin '${plugin.meta.name}' must have a non-empty rules object`,\n )\n }\n\n // Validate each rule\n for (const [ruleName, rule] of Object.entries(plugin.rules)) {\n if (!rule.meta) {\n throw new ConfigurationError(\n `Rule '${ruleName}' in plugin '${plugin.meta.name}' is missing meta property`,\n )\n }\n if (!rule.meta.messages || typeof rule.meta.messages !== 'object') {\n throw new ConfigurationError(\n `Rule '${ruleName}' in plugin '${plugin.meta.name}' is missing meta.messages`,\n )\n }\n if (typeof rule.create !== 'function') {\n throw new ConfigurationError(\n `Rule '${ruleName}' in plugin '${plugin.meta.name}' is missing create function`,\n )\n }\n }\n }\n\n /**\n * Clear the plugin cache\n */\n clearCache(): void {\n this.cache.clear()\n }\n}\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Lint runner that executes rules in parallel against tokens\n *\n * The lint runner is responsible for:\n * - Loading plugins and resolving rule configurations\n * - Executing rules in parallel for performance\n * - Collecting and aggregating lint issues\n * - Interpolating message templates with data\n */\n\nimport type { InternalResolvedTokens, TokenType } from '@tokens/types'\n\nimport { PluginLoader } from './plugin-loader'\nimport type {\n AnyLintRule,\n LintConfig,\n LintIssue,\n LintPlugin,\n LintReportDescriptor,\n LintResult,\n LintRuleContext,\n ResolvedLintConfig,\n ResolvedRuleConfig,\n RuleConfig,\n} from './types'\n\nexport type LintRunnerOptions = LintConfig & {\n /** Callback for runner warnings (e.g. unknown rule). Defaults to console.warn. */\n onWarn?: (message: string) => void\n}\n\n/**\n * Executes lint rules against a set of tokens\n *\n * @example\n * ```typescript\n * const config: LintConfig = {\n * plugins: {\n * dispersa: dispersaPlugin,\n * },\n * rules: {\n * 'dispersa/require-description': 'warn',\n * 'dispersa/naming-convention': ['error', { format: 'kebab-case' }],\n * },\n * }\n *\n * const runner = new LintRunner(config)\n * const result = await runner.run(tokens)\n *\n * console.log(`Found ${result.errorCount} errors, ${result.warningCount} warnings`)\n * ```\n */\nexport class LintRunner {\n private config: LintRunnerOptions\n private pluginLoader: PluginLoader\n private resolvedConfig: ResolvedLintConfig | null = null\n private warn: (message: string) => void\n\n constructor(config: LintRunnerOptions) {\n this.config = config\n this.pluginLoader = new PluginLoader()\n this.warn = config.onWarn ?? console.warn\n }\n\n /**\n * Run all configured rules against the provided tokens\n *\n * Rules are executed in parallel for performance. Issues are collected\n * and returned with counts by severity.\n *\n * @param tokens - Resolved tokens to lint\n * @returns Lint result with issues and counts\n */\n async run(tokens: InternalResolvedTokens): Promise<LintResult> {\n this.resolvedConfig ??= await this.resolveConfig()\n\n const { rules, plugins } = this.resolvedConfig\n const issues: LintIssue[] = []\n\n if (Object.keys(rules).length === 0) {\n return { issues: [], errorCount: 0, warningCount: 0 }\n }\n\n const rulePromises = Object.entries(rules).map(async ([ruleId, ruleConfig]) => {\n const { severity, options } = ruleConfig\n\n const rule = this.resolveRule(ruleId, plugins)\n if (!rule) {\n this.warn(`[lint] Unknown rule '${ruleId}' - no plugin provides this rule`)\n return []\n }\n\n const reports: LintReportDescriptor<string>[] = []\n const applicableTokens = this.filterTokensByAppliesTo(tokens, rule.meta.appliesTo)\n const mergedOptions = rule.defaultOptions ? { ...rule.defaultOptions, ...options } : options\n\n const context: LintRuleContext<string, Record<string, unknown>> = {\n id: ruleId,\n options: mergedOptions,\n tokens: applicableTokens,\n report: (descriptor) => {\n reports.push(descriptor)\n },\n }\n\n try {\n await rule.create(context)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return [\n {\n ruleId: 'lint/rule-error',\n severity: 'error' as const,\n message: `Rule '${ruleId}' failed: ${message}`,\n tokenName: '(rule execution)',\n tokenPath: [],\n },\n ]\n }\n\n return reports.map((report) => {\n const messageTemplate = rule.meta.messages[report.messageId]\n const message = messageTemplate\n ? this.interpolateMessage(messageTemplate, report.data)\n : report.messageId\n\n return {\n ruleId,\n severity,\n message,\n tokenName: report.token.name,\n tokenPath: report.token.path,\n }\n })\n })\n\n const allIssues = await Promise.all(rulePromises)\n issues.push(...allIssues.flat())\n\n const errorCount = issues.filter((i) => i.severity === 'error').length\n const warningCount = issues.filter((i) => i.severity === 'warn').length\n\n return { issues, errorCount, warningCount }\n }\n\n /**\n * Resolve configuration: load plugins, parse rule configs\n */\n private async resolveConfig(): Promise<ResolvedLintConfig> {\n const { plugins: pluginSources = {}, rules: ruleConfigs = {} } = this.config\n\n const plugins = await this.pluginLoader.loadAll(pluginSources)\n\n const rules: Record<string, ResolvedRuleConfig> = {}\n\n for (const [ruleId, config] of Object.entries(ruleConfigs)) {\n const resolved = this.resolveRuleConfig(config)\n if (resolved) {\n rules[ruleId] = resolved\n }\n }\n\n return {\n enabled: true,\n failOnError: this.config.failOnError ?? true,\n plugins,\n rules,\n }\n }\n\n private filterTokensByAppliesTo(\n tokens: InternalResolvedTokens,\n appliesTo: TokenType[] | 'all' | undefined,\n ): InternalResolvedTokens {\n if (!appliesTo || appliesTo === 'all') {\n return tokens\n }\n\n const filtered: InternalResolvedTokens = {}\n for (const [name, token] of Object.entries(tokens)) {\n if (token.$type && appliesTo.includes(token.$type)) {\n filtered[name] = token\n }\n }\n return filtered\n }\n\n /**\n * Parse rule configuration into resolved format\n */\n private resolveRuleConfig(config: RuleConfig): ResolvedRuleConfig | null {\n // Shorthand: severity only\n if (typeof config === 'string') {\n if (config === 'off') {\n return null\n }\n return { severity: config, options: {} }\n }\n\n // Longhand: [severity, options]\n const [severity, options = {}] = config\n if (severity === 'off') {\n return null\n }\n\n return { severity, options }\n }\n\n /**\n * Resolve a rule from plugins by rule ID\n *\n * Rule IDs are formatted as 'namespace/rule-name'\n */\n private resolveRule(ruleId: string, plugins: Record<string, LintPlugin>): AnyLintRule | null {\n const separatorIndex = ruleId.indexOf('/')\n if (separatorIndex === -1) {\n return null\n }\n\n const namespace = ruleId.slice(0, separatorIndex)\n const ruleName = ruleId.slice(separatorIndex + 1)\n\n const plugin = plugins[namespace]\n if (!plugin) {\n return null\n }\n\n return plugin.rules[ruleName] ?? null\n }\n\n /**\n * Interpolate message template with data\n *\n * Replaces {{key}} placeholders with values from data\n */\n private interpolateMessage(template: string, data?: Record<string, string | number>): string {\n if (!data) {\n return template\n }\n\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => {\n const value = data[key]\n return value !== undefined ? String(value) : `{{${key}}}`\n })\n }\n\n /**\n * Clear the plugin cache\n */\n clearCache(): void {\n this.pluginLoader.clearCache()\n this.resolvedConfig = null\n }\n}\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Shared glob pattern matching utilities for lint rules\n *\n * Provides bounded caching to prevent memory leaks in long-running processes.\n */\n\nconst MAX_CACHE_SIZE = 1000\n\nconst cache = new Map<string, RegExp>()\n\n/**\n * Convert a glob pattern to a RegExp\n *\n * Supports `*` as a wildcard that matches any characters.\n * Results are cached with a bounded cache to prevent memory leaks.\n *\n * @param pattern - Glob pattern (e.g., 'color-*', '*.primary')\n * @returns Compiled RegExp\n *\n * @example\n * ```typescript\n * const regex = globToRegex('color-*')\n * regex.test('color-primary') // true\n * regex.test('spacing-base') // false\n * ```\n */\nexport function globToRegex(pattern: string): RegExp {\n const cached = cache.get(pattern)\n if (cached) {\n cache.delete(pattern)\n cache.set(pattern, cached)\n return cached\n }\n\n const regex = new RegExp(\n '^' +\n pattern\n .split('*')\n .map((part) => part.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n .join('.*') +\n '$',\n )\n\n if (cache.size >= MAX_CACHE_SIZE) {\n const oldest = cache.keys().next().value\n if (oldest !== undefined) {\n cache.delete(oldest)\n }\n }\n\n cache.set(pattern, regex)\n return regex\n}\n\n/**\n * Check if a name matches any of the given glob patterns\n *\n * @param name - String to test\n * @param patterns - Array of glob patterns\n * @returns true if name matches any pattern\n *\n * @example\n * ```typescript\n * matchesGlob('color-primary', ['color-*', 'spacing-*']) // true\n * matchesGlob('typography-base', ['color-*']) // false\n * ```\n */\nexport function matchesGlob(name: string, patterns: string[]): boolean {\n return patterns.some((pattern) => globToRegex(pattern).test(name))\n}\n\n/**\n * Clear the glob pattern cache\n *\n * Useful for testing or when memory needs to be reclaimed.\n */\nexport function clearGlobCache(): void {\n cache.clear()\n}\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Utility for extracting token references from values\n *\n * Used by rules that need to detect references to other tokens,\n * such as no-deprecated-usage.\n */\n\nconst ALIAS_PATTERN = /\\{([^}]+)\\}/g\n\n/**\n * Extract all token references from a value\n *\n * Recursively traverses objects and arrays to find all references\n * in the form `{token.name}`.\n *\n * @param value - Value to extract references from\n * @returns Array of referenced token names\n *\n * @example\n * ```typescript\n * extractReferences('{color.primary}') // ['color.primary']\n * extractReferences('{color.base.primary}') // ['color.base.primary']\n * extractReferences('border: {border.width} solid {color.border}') // ['border.width', 'color.border']\n * extractReferences({ value: '{spacing.md}', nested: { ref: '{spacing.lg}' } }) // ['spacing.md', 'spacing.lg']\n * ```\n */\nexport function extractReferences(value: unknown): string[] {\n const refs: string[] = []\n\n if (typeof value === 'string') {\n let match\n ALIAS_PATTERN.lastIndex = 0\n while ((match = ALIAS_PATTERN.exec(value)) !== null) {\n if (match[1]) {\n refs.push(match[1])\n }\n }\n } else if (Array.isArray(value)) {\n for (const item of value) {\n refs.push(...extractReferences(item))\n }\n } else if (typeof value === 'object' && value !== null) {\n for (const v of Object.values(value as Record<string, unknown>)) {\n refs.push(...extractReferences(v))\n }\n }\n\n return refs\n}\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Rule: naming-convention\n *\n * Enforces consistent token naming conventions.\n */\n\nimport { createRule } from '@lint/create-rule'\nimport { matchesGlob } from '@lint/utils'\n\nexport const NamingConventionMessages = {\n INVALID_FORMAT: 'INVALID_FORMAT',\n INVALID_SEGMENT: 'INVALID_SEGMENT',\n} as const\n\nexport type NamingConventionOptions = {\n /**\n * Naming format to enforce\n * - 'kebab-case': color-brand-primary, red-500, blue-600\n * - 'camelCase': colorBrandPrimary\n * - 'PascalCase': ColorBrandPrimary\n * - 'snake_case': color_brand_primary\n * - 'screaming-snake': COLOR_BRAND_PRIMARY\n */\n format?: 'kebab-case' | 'camelCase' | 'PascalCase' | 'snake_case' | 'screaming-snake'\n /** Token name patterns to ignore (glob patterns) */\n ignore?: string[]\n /** Custom regex pattern to validate against */\n pattern?: string\n /**\n * Allow purely numeric path segments (e.g., spacing.0, spacing.1)\n * Common in design system scales. Default: true\n */\n allowNumericSegments?: boolean\n}\n\nconst PATTERNS: Record<string, RegExp> = {\n 'kebab-case': /^([a-z][a-z0-9]*)(-[a-z0-9]+)*$/,\n camelCase: /^[a-z][a-zA-Z0-9]*$/,\n PascalCase: /^[A-Z][a-zA-Z0-9]*$/,\n snake_case: /^([a-z][a-z0-9]*)(_[a-z0-9]+)*$/,\n 'screaming-snake': /^([A-Z][A-Z0-9]*)(_[A-Z0-9]+)*$/,\n}\n\nconst DEFAULT_PATTERN = /^[a-z][a-z0-9]*(-[a-z][a-z0-9]*)*$/\n\nexport const namingConvention = createRule<\n (typeof NamingConventionMessages)[keyof typeof NamingConventionMessages],\n NamingConventionOptions\n>({\n meta: {\n name: 'naming-convention',\n description: 'Enforce consistent token naming conventions',\n messages: {\n INVALID_FORMAT: \"Token '{{name}}' does not match '{{format}}' format\",\n INVALID_SEGMENT:\n \"Segment '{{segment}}' in token '{{name}}' does not match '{{format}}' format\",\n },\n },\n defaultOptions: { format: 'kebab-case', allowNumericSegments: true },\n create({ tokens, options, report }) {\n const format = options.format ?? 'kebab-case'\n const ignore = options.ignore ?? []\n const customPattern = options.pattern\n const allowNumericSegments = options.allowNumericSegments ?? true\n\n // Use custom pattern if provided, otherwise use built-in format\n let segmentPattern: RegExp\n if (customPattern) {\n segmentPattern = new RegExp(customPattern)\n } else {\n segmentPattern = PATTERNS[format] ?? DEFAULT_PATTERN\n }\n\n // Pattern for pure numeric segments (common in design systems: spacing.0, spacing.1)\n const numericPattern = /^\\d+$/\n\n for (const token of Object.values(tokens)) {\n // Skip ignored tokens\n if (ignore.length > 0 && matchesGlob(token.name, ignore)) {\n continue\n }\n\n // Check each path segment\n const segments = token.path\n let hasError = false\n\n for (const segment of segments) {\n // Allow pure numeric segments if option is enabled\n if (allowNumericSegments && numericPattern.test(segment)) {\n continue\n }\n\n if (!segmentPattern.test(segment)) {\n report({\n token,\n messageId: 'INVALID_SEGMENT',\n data: { name: token.name, segment, format: customPattern ?? format },\n })\n hasError = true\n break\n }\n }\n\n // If no segment errors, also check full name for custom patterns\n if (!hasError && customPattern && !segmentPattern.test(token.name)) {\n report({\n token,\n messageId: 'INVALID_FORMAT',\n data: { name: token.name, format: customPattern },\n })\n }\n }\n },\n})\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Rule: no-deprecated-usage\n *\n * Warns when tokens reference deprecated tokens.\n */\n\nimport { createRule } from '@lint/create-rule'\nimport { extractReferences, matchesGlob } from '@lint/utils'\n\nexport const NoDeprecatedUsageMessages = {\n REFERENCES_DEPRECATED: 'REFERENCES_DEPRECATED',\n} as const\n\nexport type NoDeprecatedUsageOptions = {\n /** Token name patterns to ignore (glob patterns) */\n ignore?: string[]\n}\n\nexport const noDeprecatedUsage = createRule<\n (typeof NoDeprecatedUsageMessages)[keyof typeof NoDeprecatedUsageMessages],\n NoDeprecatedUsageOptions\n>({\n meta: {\n name: 'no-deprecated-usage',\n description: 'Disallow references to deprecated tokens',\n messages: {\n REFERENCES_DEPRECATED: \"Token '{{name}}' references deprecated token '{{ref}}'. {{reason}}\",\n },\n },\n defaultOptions: {},\n create({ tokens, options, report }) {\n const ignore = options.ignore ?? []\n\n // Build set of deprecated tokens\n const deprecatedTokens = new Map<string, string | true>()\n for (const token of Object.values(tokens)) {\n if (token.$deprecated) {\n const reason = typeof token.$deprecated === 'string' ? token.$deprecated : ''\n deprecatedTokens.set(token.name, reason || true)\n }\n }\n\n // If no deprecated tokens, nothing to check\n if (deprecatedTokens.size === 0) {\n return\n }\n\n for (const token of Object.values(tokens)) {\n // Skip ignored tokens\n if (ignore.length > 0 && matchesGlob(token.name, ignore)) {\n continue\n }\n\n // Skip deprecated tokens themselves\n if (deprecatedTokens.has(token.name)) {\n continue\n }\n\n // Extract references from original value\n const refs = extractReferences(token.originalValue)\n\n for (const ref of refs) {\n const deprecation = deprecatedTokens.get(ref)\n if (deprecation) {\n const reason = deprecation === true ? '' : `(${deprecation})`\n report({\n token,\n messageId: 'REFERENCES_DEPRECATED',\n data: { name: token.name, ref, reason },\n })\n }\n }\n }\n },\n})\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Rule: no-duplicate-values\n *\n * Detects tokens with duplicate values (excluding aliases).\n */\n\nimport { createRule } from '@lint/create-rule'\nimport { matchesGlob } from '@lint/utils'\n\nexport const NoDuplicateValuesMessages = {\n DUPLICATE_VALUE: 'DUPLICATE_VALUE',\n} as const\n\nexport type NoDuplicateValuesOptions = {\n /** Token name patterns to ignore (glob patterns) */\n ignore?: string[]\n /** Only check specific token types */\n types?: string[]\n}\n\nfunction valueKey(value: unknown): string {\n if (value === null) {\n return 'null'\n }\n if (value === undefined) {\n return 'undefined'\n }\n if (typeof value === 'object') {\n return JSON.stringify(sortKeys(value))\n }\n return String(value)\n}\n\nfunction sortKeys(obj: unknown): unknown {\n if (Array.isArray(obj)) {\n return obj.map(sortKeys)\n }\n if (typeof obj === 'object' && obj !== null) {\n const sorted: Record<string, unknown> = {}\n for (const key of Object.keys(obj).sort()) {\n sorted[key] = sortKeys((obj as Record<string, unknown>)[key])\n }\n return sorted\n }\n return obj\n}\n\nexport const noDuplicateValues = createRule<\n (typeof NoDuplicateValuesMessages)[keyof typeof NoDuplicateValuesMessages],\n NoDuplicateValuesOptions\n>({\n meta: {\n name: 'no-duplicate-values',\n description: 'Detect tokens with duplicate values (excluding aliases)',\n messages: {\n DUPLICATE_VALUE:\n \"Token '{{name}}' has the same value as '{{duplicate}}'. Consider using an alias instead.\",\n },\n },\n defaultOptions: {},\n create({ tokens, options, report }) {\n const ignore = options.ignore ?? []\n const types = options.types\n\n const valueMap = new Map<string, (typeof tokens)[string][]>()\n\n for (const token of Object.values(tokens)) {\n if (ignore.length > 0 && matchesGlob(token.name, ignore)) {\n continue\n }\n\n if (token._isAlias) {\n continue\n }\n\n if (types && types.length > 0 && !types.includes(token.$type ?? '')) {\n continue\n }\n\n const key = valueKey(token.$value)\n const existing = valueMap.get(key)\n if (existing) {\n existing.push(token)\n } else {\n valueMap.set(key, [token])\n }\n }\n\n for (const tokenList of valueMap.values()) {\n if (tokenList.length > 1) {\n const first = tokenList[0]\n if (!first) {\n continue\n }\n\n for (let i = 1; i < tokenList.length; i++) {\n const current = tokenList[i]\n if (current) {\n report({\n token: current,\n messageId: 'DUPLICATE_VALUE',\n data: { name: current.name, duplicate: first.name },\n })\n }\n }\n }\n }\n },\n})\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Path schema matcher implementation\n */\n\nimport { matchesGlob } from '@lint/utils'\nimport type { ResolvedToken } from '@tokens/types'\n\nimport type { PathSchemaConfig, SegmentDefinition, TransitionRule } from './types'\n\nexport type Violation = {\n type: 'INVALID_PATH' | 'UNKNOWN_SEGMENT' | 'FORBIDDEN_TRANSITION'\n data: Record<string, string | number>\n}\n\ntype Pattern = string | string[] | RegExp\n\ntype CompiledPattern = Array<\n { type: 'segment'; name: string } | { type: 'literal'; value: string } | { type: 'wildcard' }\n>\n\ntype CompiledTransition = {\n from: Pattern\n to: Pattern\n allow: boolean\n}\n\nexport { matchesGlob }\n\n/**\n * Compiles and validates token paths against a schema\n */\nexport class PathSchemaMatcher {\n private segments: Record<string, SegmentDefinition>\n private pathPatterns: CompiledPattern[]\n private transitionRules: CompiledTransition[]\n\n constructor(config: PathSchemaConfig) {\n this.segments = config.segments ?? {}\n this.pathPatterns = this.compilePaths(config.paths ?? [], this.segments)\n this.transitionRules = this.compileTransitions(config.transitions ?? [])\n }\n\n /**\n * Validate a token against the schema\n */\n validate(token: ResolvedToken): Violation[] {\n const violations: Violation[] = []\n const pathSegments = token.path\n const hasPaths = this.pathPatterns.length > 0\n const hasTransitions = this.transitionRules.length > 0\n\n // Check transitions if defined\n if (hasTransitions) {\n const transitionViolations = this.validateTransitions(pathSegments, token.name)\n violations.push(...transitionViolations)\n }\n\n // Check against path patterns if defined\n if (hasPaths) {\n const matchesAny = this.pathPatterns.some((p) => this.matchPattern(p, pathSegments))\n if (!matchesAny) {\n violations.push({\n type: 'INVALID_PATH',\n data: { path: token.name },\n })\n }\n }\n\n return violations\n }\n\n /**\n * Validate transitions between segments.\n *\n * Deny rules are checked independently (any match = violation).\n * Allow rules use OR semantics: at least one must match.\n */\n private validateTransitions(segments: string[], tokenName: string): Violation[] {\n const violations: Violation[] = []\n\n for (let i = 0; i < segments.length - 1; i++) {\n const from = segments[i]\n const to = segments[i + 1]\n\n if (!from || !to) {\n continue\n }\n\n const applicableRules = this.transitionRules.filter((r) => this.matchesPattern(from, r.from))\n\n if (applicableRules.length === 0) {\n continue\n }\n\n const denyRules = applicableRules.filter((r) => r.allow === false)\n const allowRules = applicableRules.filter((r) => r.allow !== false)\n\n for (const rule of denyRules) {\n if (this.matchesPattern(to, rule.to)) {\n violations.push({\n type: 'FORBIDDEN_TRANSITION',\n data: { from, to, path: tokenName },\n })\n }\n }\n\n if (allowRules.length > 0) {\n const anyAllowMatches = allowRules.some((r) => this.matchesPattern(to, r.to))\n if (!anyAllowMatches) {\n violations.push({\n type: 'FORBIDDEN_TRANSITION',\n data: { from, to, path: tokenName },\n })\n }\n }\n }\n\n return violations\n }\n\n /**\n * Check if a value matches a pattern\n */\n private matchesPattern(value: string, pattern: Pattern): boolean {\n if (typeof pattern === 'string') {\n return value === pattern\n }\n if (Array.isArray(pattern)) {\n return pattern.includes(value)\n }\n return pattern.test(value)\n }\n\n /**\n * Compile path patterns into matcher structures\n */\n private compilePaths(\n patterns: string[],\n segments: Record<string, SegmentDefinition>,\n ): CompiledPattern[] {\n return patterns.map((p) => this.parsePattern(p, segments))\n }\n\n /**\n * Parse a path pattern string into compiled form\n * - `{name}` is a segment placeholder\n * - `*` is a wildcard that matches any single segment\n * - `.` is the path separator (implicit between segments)\n */\n private parsePattern(\n pattern: string,\n _segments: Record<string, SegmentDefinition>,\n ): CompiledPattern {\n const parts: CompiledPattern = []\n const regex = /\\{(\\w+)\\}|(\\*)|([^{}*]+)/g\n let match\n\n while ((match = regex.exec(pattern)) !== null) {\n if (match[1]) {\n parts.push({ type: 'segment', name: match[1] })\n } else if (match[2]) {\n parts.push({ type: 'wildcard' })\n } else if (match[3]) {\n parts.push({ type: 'literal', value: match[3] })\n }\n }\n\n return parts\n }\n\n /**\n * Match path segments against a compiled pattern using dynamic programming.\n * Supports optional segments via DP table.\n *\n * DP[i][j] = can we match path[0..i) with pattern[0..j)?\n */\n private matchPattern(pattern: CompiledPattern, pathSegments: string[]): boolean {\n // Extract pattern parts that consume segments (segments + wildcards)\n const patternParts = pattern.filter((p) => p.type === 'segment' || p.type === 'wildcard')\n const pathLen = pathSegments.length\n const patternLen = patternParts.length\n\n // DP table: dp[i][j] = can we match first i path segments with first j pattern parts?\n // Initialize with false values\n const dp: boolean[][] = []\n for (let i = 0; i <= pathLen; i++) {\n dp[i] = []\n for (let j = 0; j <= patternLen; j++) {\n dp[i]![j] = false\n }\n }\n\n // Base case: empty path matches empty pattern\n dp[0]![0] = true\n\n // Fill DP table\n for (let i = 0; i <= pathLen; i++) {\n for (let j = 0; j <= patternLen; j++) {\n const currentState = dp[i]![j]\n if (!currentState) {\n continue\n }\n\n // If we've consumed all path segments, we can still skip remaining optional pattern parts\n if (i === pathLen) {\n // Can skip remaining optional pattern parts\n if (j < patternLen && this.isPartOptional(patternParts[j]!)) {\n dp[i]![j + 1] = true\n }\n continue\n }\n\n // If we've consumed all pattern parts, we can only continue if path is also exhausted\n if (j === patternLen) {\n if (i === pathLen) {\n dp[i]![j] = true\n }\n continue\n }\n\n const part = patternParts[j]!\n\n // ALWAYS try to match current path segment with current pattern part first\n if (i < pathLen && this.matchPatternPart(part, pathSegments[i]!)) {\n dp[i + 1]![j + 1] = true\n }\n\n // THEN try skipping current pattern part if it's optional\n // (this is separate from matching - both can be valid)\n if (this.isPartOptional(part)) {\n dp[i]![j + 1] = true\n }\n }\n }\n\n // Path matches if we can reach any state where both path and pattern are consumed\n return dp[pathLen]![patternLen] ?? false\n }\n\n /**\n * Check if a pattern part is optional based on its segment definition\n */\n private isPartOptional(part: { type: string; name?: string }): boolean {\n if (part.type !== 'segment' || !part.name) {\n return false // Wildcards are not optional\n }\n const segmentDef = this.segments[part.name]\n return segmentDef?.optional ?? false\n }\n\n /**\n * Match a single pattern part against a path segment value\n */\n private matchPatternPart(\n part: { type: string; name?: string; value?: string },\n value: string,\n ): boolean {\n if (part.type === 'wildcard') {\n return true\n }\n\n if (part.type === 'segment' && part.name) {\n const segment = this.segments[part.name]\n if (!segment) {\n return true\n }\n return this.matchesSegmentDefinition(value, segment)\n }\n\n return false\n }\n\n /**\n * Check if a value matches a segment definition\n */\n private matchesSegmentDefinition(value: string, definition: SegmentDefinition): boolean {\n const { values } = definition\n if (Array.isArray(values)) {\n return values.some((v) => (typeof v === 'string' ? v === value : v.test(value)))\n }\n return values.test(value)\n }\n\n /**\n * Compile transition rules\n */\n private compileTransitions(transitions: TransitionRule[]): CompiledTransition[] {\n return transitions.map((t) => ({\n from: t.from,\n to: t.to,\n allow: t.allow ?? true,\n }))\n }\n}\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Rule: path-schema\n *\n * Enforces token path structure using segment definitions and patterns.\n */\n\nimport { createRule } from '@lint/create-rule'\n\nimport { PathSchemaMatcher, matchesGlob } from './matcher'\nimport type { PathSchemaConfig } from './types'\n\nexport { type PathSchemaConfig, type SegmentDefinition, type TransitionRule } from './types'\n\nexport const PathSchemaMessages = {\n INVALID_PATH: 'INVALID_PATH',\n UNKNOWN_SEGMENT: 'UNKNOWN_SEGMENT',\n FORBIDDEN_TRANSITION: 'FORBIDDEN_TRANSITION',\n} as const\n\nexport const pathSchema = createRule<\n (typeof PathSchemaMessages)[keyof typeof PathSchemaMessages],\n PathSchemaConfig\n>({\n meta: {\n name: 'path-schema',\n description: 'Enforce token path segment structure',\n messages: {\n INVALID_PATH: \"Token path '{{path}}' does not match any defined pattern\",\n UNKNOWN_SEGMENT: \"Segment '{{segment}}' at position {{position}} in '{{path}}' is not valid\",\n FORBIDDEN_TRANSITION: \"Segment '{{to}}' cannot follow '{{from}}' in path '{{path}}'\",\n },\n },\n defaultOptions: {\n segments: {},\n paths: [],\n transitions: [],\n },\n create({ tokens, options, report }) {\n const ignore = options.ignore ?? []\n\n // Skip if no patterns or transitions defined\n if (\n (!options.paths || options.paths.length === 0) &&\n (!options.transitions || options.transitions.length === 0)\n ) {\n return\n }\n\n const matcher = new PathSchemaMatcher(options)\n\n for (const token of Object.values(tokens)) {\n // Skip ignored tokens\n if (ignore.length > 0 && matchesGlob(token.name, ignore)) {\n continue\n }\n\n const violations = matcher.validate(token)\n\n for (const violation of violations) {\n report({\n token,\n messageId: violation.type,\n data: violation.data as Record<string, string>,\n })\n }\n }\n },\n})\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Rule: require-description\n *\n * Requires tokens to have descriptions.\n */\n\nimport { createRule } from '@lint/create-rule'\nimport { matchesGlob } from '@lint/utils'\n\nexport const RequireDescriptionMessages = {\n MISSING_DESCRIPTION: 'MISSING_DESCRIPTION',\n TOO_SHORT: 'TOO_SHORT',\n} as const\n\nexport type RequireDescriptionOptions = {\n /** Minimum length for description. Default: 1 */\n minLength?: number\n /** Token name patterns to ignore (glob patterns) */\n ignore?: string[]\n}\n\nexport const requireDescription = createRule<\n (typeof RequireDescriptionMessages)[keyof typeof RequireDescriptionMessages],\n RequireDescriptionOptions\n>({\n meta: {\n name: 'require-description',\n description: 'Require tokens to have descriptions',\n messages: {\n MISSING_DESCRIPTION: \"Token '{{name}}' is missing a description\",\n TOO_SHORT: \"Token '{{name}}' description is too short ({{length}} chars, min {{minLength}})\",\n },\n },\n defaultOptions: { minLength: 1 },\n create({ tokens, options, report }) {\n const minLength = options.minLength ?? 1\n const ignore = options.ignore ?? []\n\n for (const token of Object.values(tokens)) {\n // Skip ignored tokens\n if (ignore.length > 0 && matchesGlob(token.name, ignore)) {\n continue\n }\n\n if (!token.$description) {\n report({\n token,\n messageId: 'MISSING_DESCRIPTION',\n data: { name: token.name },\n })\n } else if (token.$description.length < minLength) {\n report({\n token,\n messageId: 'TOO_SHORT',\n data: {\n name: token.name,\n length: token.$description.length,\n minLength,\n },\n })\n }\n }\n },\n})\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Built-in lint rules and dispersa plugin\n */\n\nimport type { LintPlugin, LintConfig } from '@lint/types'\n\nimport type { NamingConventionOptions } from './naming-convention'\nimport { namingConvention } from './naming-convention'\nimport type { NoDeprecatedUsageOptions } from './no-deprecated-usage'\nimport { noDeprecatedUsage } from './no-deprecated-usage'\nimport type { NoDuplicateValuesOptions } from './no-duplicate-values'\nimport { noDuplicateValues } from './no-duplicate-values'\nimport type { PathSchemaConfig } from './path-schema'\nimport { pathSchema } from './path-schema'\nimport type { RequireDescriptionOptions } from './require-description'\nimport { requireDescription } from './require-description'\n\n// Re-export rules for direct use\nexport { requireDescription } from './require-description'\nexport { namingConvention } from './naming-convention'\nexport { noDeprecatedUsage } from './no-deprecated-usage'\nexport { noDuplicateValues } from './no-duplicate-values'\nexport {\n pathSchema,\n type PathSchemaConfig,\n type SegmentDefinition,\n type TransitionRule,\n} from './path-schema'\n\n// Export option types for plugin authors\nexport type { RequireDescriptionOptions } from './require-description'\nexport type { NamingConventionOptions } from './naming-convention'\nexport type { NoDeprecatedUsageOptions } from './no-deprecated-usage'\nexport type { NoDuplicateValuesOptions } from './no-duplicate-values'\n\n/**\n * Builds the dispersa plugin with its predefined configs.\n *\n * Uses a factory to encapsulate the self-referential setup:\n * configs reference the plugin, and the plugin carries configs.\n * The returned objects are fully formed -- no external mutation.\n */\nfunction buildDispersaPlugin() {\n const rules = {\n 'require-description': requireDescription,\n 'naming-convention': namingConvention,\n 'no-deprecated-usage': noDeprecatedUsage,\n 'no-duplicate-values': noDuplicateValues,\n 'path-schema': pathSchema,\n }\n\n const plugin: LintPlugin = { meta: { name: 'dispersa' }, rules, configs: {} }\n\n const recommended: LintConfig = {\n plugins: { dispersa: plugin },\n rules: {\n 'dispersa/require-description': 'warn',\n 'dispersa/naming-convention': ['error', { format: 'kebab-case' }],\n 'dispersa/no-deprecated-usage': 'warn',\n },\n }\n\n const strict: LintConfig = {\n plugins: { dispersa: plugin },\n rules: {\n 'dispersa/require-description': 'error',\n 'dispersa/naming-convention': ['error', { format: 'kebab-case' }],\n 'dispersa/no-deprecated-usage': 'error',\n 'dispersa/no-duplicate-values': 'error',\n },\n }\n\n const minimal: LintConfig = {\n plugins: { dispersa: plugin },\n rules: {\n 'dispersa/no-deprecated-usage': 'warn',\n },\n }\n\n plugin.configs = { recommended, strict, minimal }\n\n return { plugin, recommended, strict, minimal } as const\n}\n\nconst {\n plugin: dispersaPlugin,\n recommended: recommendedConfig,\n strict: strictConfig,\n minimal: minimalConfig,\n} = buildDispersaPlugin()\n\n/**\n * Built-in Dispersa lint plugin\n *\n * Provides core lint rules for design token validation.\n *\n * @example\n * ```typescript\n * import { dispersaPlugin } from 'dispersa/lint'\n *\n * const config = {\n * plugins: { dispersa: dispersaPlugin },\n * rules: {\n * 'dispersa/require-description': 'warn',\n * 'dispersa/naming-convention': ['error', { format: 'kebab-case' }],\n * },\n * }\n * ```\n */\nexport { dispersaPlugin }\n\n/** Recommended lint configuration */\nexport { recommendedConfig }\n\n/** Strict lint configuration */\nexport { strictConfig }\n\n/** Minimal lint configuration */\nexport { minimalConfig }\n\n// ============================================================================\n// Declaration Merging: Register dispersa's built-in rules in the type registry\n// ============================================================================\n\ndeclare module '../types' {\n interface RulesRegistry {\n 'dispersa/require-description': RequireDescriptionOptions\n 'dispersa/naming-convention': NamingConventionOptions\n 'dispersa/no-deprecated-usage': NoDeprecatedUsageOptions\n 'dispersa/no-duplicate-values': NoDuplicateValuesOptions\n 'dispersa/path-schema': PathSchemaConfig\n }\n}\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Lint output formatter interface and utilities\n */\n\nimport type { LintIssue, LintResult, LintFormatter } from '@lint/types'\n\n/**\n * Format lint results as JSON\n */\nexport const formatLintJson: LintFormatter = (result: LintResult): string => {\n return JSON.stringify(result, null, 2)\n}\n\n/**\n * Format lint results in a human-readable stylish format\n */\nexport const formatLintStylish: LintFormatter = (result: LintResult): string => {\n const lines: string[] = []\n\n if (result.issues.length === 0) {\n return '✓ No lint issues found'\n }\n\n // Group issues by token\n const byToken = new Map<string, LintIssue[]>()\n for (const issue of result.issues) {\n const existing = byToken.get(issue.tokenName) ?? []\n existing.push(issue)\n byToken.set(issue.tokenName, existing)\n }\n\n // Output issues\n for (const [tokenName, issues] of byToken) {\n lines.push(``)\n lines.push(` ${tokenName}`)\n for (const issue of issues) {\n const severity = issue.severity === 'error' ? '✖' : '⚠'\n const label = issue.severity === 'error' ? 'error' : 'warning'\n lines.push(` ${severity} ${label}: ${issue.message} [${issue.ruleId}]`)\n }\n }\n\n // Summary\n lines.push(``)\n if (result.errorCount > 0 || result.warningCount > 0) {\n const parts: string[] = []\n if (result.errorCount > 0) {\n parts.push(`${result.errorCount} error${result.errorCount === 1 ? '' : 's'}`)\n }\n if (result.warningCount > 0) {\n parts.push(`${result.warningCount} warning${result.warningCount === 1 ? '' : 's'}`)\n }\n lines.push(`✖ ${parts.join(', ')}`)\n }\n\n return lines.join('\\n')\n}\n\n/**\n * Format lint results for CI output (compact, parseable)\n */\nexport const formatLintCompact: LintFormatter = (result: LintResult): string => {\n const lines: string[] = []\n\n for (const issue of result.issues) {\n const severity = issue.severity.toUpperCase()\n lines.push(`${severity}: ${issue.ruleId} - ${issue.message} (token: ${issue.tokenName})`)\n }\n\n if (result.errorCount > 0 || result.warningCount > 0) {\n lines.push(`SUMMARY: ${result.errorCount} errors, ${result.warningCount} warnings`)\n }\n\n return lines.join('\\n')\n}\n"]}
1
+ {"version":3,"sources":["../src/lint/create-rule.ts","../src/shared/errors/index.ts","../src/lint/plugin-loader.ts","../src/lint/lint-runner.ts","../src/lint/utils/glob-matcher.ts","../src/lint/utils/reference-extractor.ts","../src/lint/rules/naming-convention.ts","../src/lint/rules/no-deprecated-usage.ts","../src/lint/rules/no-duplicate-values.ts","../src/lint/rules/path-schema/matcher.ts","../src/lint/rules/path-schema/index.ts","../src/lint/rules/require-description.ts","../src/lint/rules/index.ts","../src/cli/formatters/lint-formatter.ts"],"names":["process","isAbsolute","resolve","createJiti","require","createRequire"],"mappings":"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","file":"lint.cjs","sourcesContent":["/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Factory function for creating type-safe lint rules\n *\n * Use `createRule()` to define rules with full TypeScript inference\n * for message IDs and options.\n */\n\nimport type { LintRule } from './types'\n\n/**\n * Factory function for creating type-safe lint rules\n *\n * This function provides no runtime behavior - it simply returns the rule\n * as-is. Its purpose is to provide type inference and autocomplete for\n * message IDs and options.\n *\n * @template MessageIds - Union type of message IDs this rule can produce\n * @template Options - Rule-specific options type\n *\n * @param rule - The rule definition\n * @returns The same rule definition with full type inference\n *\n * @example\n * ```typescript\n * import { createRule } from 'dispersa/lint'\n *\n * export const requireDescription = createRule<\n * 'MISSING_DESCRIPTION' | 'TOO_SHORT',\n * { minLength?: number }\n * >({\n * meta: {\n * name: 'require-description',\n * description: 'Require tokens to have descriptions',\n * messages: {\n * MISSING_DESCRIPTION: \"Token '{{name}}' is missing a description\",\n * TOO_SHORT: \"Token '{{name}}' description is too short ({{length}} chars, min {{minLength}})\",\n * },\n * },\n * defaultOptions: { minLength: 10 },\n * create({ tokens, report, options }) {\n * for (const token of Object.values(tokens)) {\n * if (!token.$description) {\n * report({ token, messageId: 'MISSING_DESCRIPTION', data: { name: token.name } })\n * } else if (token.$description.length < options.minLength) {\n * report({\n * token,\n * messageId: 'TOO_SHORT',\n * data: { name: token.name, length: token.$description.length, minLength: options.minLength },\n * })\n * }\n * }\n * },\n * })\n * ```\n */\nexport function createRule<\n MessageIds extends string,\n Options extends Record<string, unknown> = Record<string, never>,\n>(rule: LintRule<MessageIds, Options>): LintRule<MessageIds, Options> {\n return rule\n}\n\n/**\n * Helper type for extracting options type from a rule\n *\n * @example\n * ```typescript\n * const myRule = createRule<'MSG', { format: string }>({ ... })\n * type MyOptions = RuleOptions<typeof myRule> // { format: string }\n * ```\n */\nexport type RuleOptions<T extends LintRule> = T extends LintRule<string, infer O> ? O : never\n\n/**\n * Helper type for extracting message IDs from a rule\n *\n * @example\n * ```typescript\n * const myRule = createRule<'MSG1' | 'MSG2', { format: string }>({ ... })\n * type MyMessages = RuleMessages<typeof myRule> // 'MSG1' | 'MSG2'\n * ```\n */\nexport type RuleMessages<T extends LintRule> =\n T extends LintRule<infer M, Record<string, unknown>> ? M : never\n","/**\n * @fileoverview Custom error classes for Dispersa\n *\n * Error classes are intentionally kept as simple value objects with no\n * imports from utility modules. Suggestion formatting is done at call\n * sites to keep the error hierarchy dependency-free.\n */\n\n/**\n * Base error class for all Dispersa errors\n */\nexport class DispersaError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'DispersaError'\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, this.constructor)\n }\n }\n}\n\n/**\n * Thrown when a token reference cannot be resolved\n *\n * @param referenceName - The token name that could not be found\n * @param suggestions - Similar token names for \"did you mean?\" hints\n * @param message - Optional custom message (overrides auto-generated message)\n */\nexport class TokenReferenceError extends DispersaError {\n constructor(\n public referenceName: string,\n public suggestions: string[] = [],\n message?: string,\n ) {\n const hint = TokenReferenceError.formatHint(suggestions)\n super(\n message ??\n `Token reference resolution failed: '${referenceName}'. Token does not exist.${hint}`,\n )\n this.name = 'TokenReferenceError'\n }\n\n private static formatHint(suggestions: string[]): string {\n if (suggestions.length === 0) {\n return ''\n }\n if (suggestions.length === 1) {\n return ` Did you mean \"${suggestions[0]}\"?`\n }\n const quoted = suggestions.map((s) => `\"${s}\"`)\n const last = quoted.pop()!\n return ` Did you mean ${quoted.join(', ')} or ${last}?`\n }\n}\n\n/**\n * Thrown when a circular reference is detected\n */\nexport class CircularReferenceError extends DispersaError {\n constructor(\n public tokenName: string,\n public referencePath: string[],\n ) {\n super(\n `Token resolution failed: '${tokenName}'. Circular reference detected in path: ${referencePath.join(' -> ')}`,\n )\n this.name = 'CircularReferenceError'\n }\n}\n\n/**\n * Thrown when validation fails\n */\nexport class ValidationError extends DispersaError {\n constructor(\n message: string,\n public errors: { message: string; path?: string }[],\n ) {\n super(message)\n this.name = 'ValidationError'\n }\n}\n\n/**\n * Thrown when file operations fail\n */\nexport class FileOperationError extends DispersaError {\n constructor(\n public operation: 'read' | 'write',\n public filePath: string,\n public originalError: Error,\n ) {\n super(`Failed to ${operation} file: ${filePath}. ${originalError.message}`)\n this.name = 'FileOperationError'\n }\n}\n\n/**\n * Thrown when a build configuration is invalid\n */\nexport class ConfigurationError extends DispersaError {\n constructor(message: string) {\n super(message)\n this.name = 'ConfigurationError'\n }\n}\n\n/**\n * Thrown when base permutation cannot be determined\n */\nexport class BasePermutationError extends DispersaError {\n constructor(\n message = 'Base permutation determination failed. Define a default modifier in resolver.',\n ) {\n super(message)\n this.name = 'BasePermutationError'\n }\n}\n\n/**\n * Thrown when an unknown modifier or context is used\n *\n * @param modifierName - Name of the modifier that failed validation\n * @param contextValue - The invalid context value (if applicable)\n * @param availableValues - Valid options (context names or modifier names) for the error message\n */\nexport class ModifierError extends DispersaError {\n constructor(\n public modifierName: string,\n public contextValue?: string,\n public availableValues: string[] = [],\n ) {\n const available = availableValues.length > 0 ? ` Available: ${availableValues.join(', ')}.` : ''\n\n const message =\n contextValue != null && contextValue !== ''\n ? `Modifier validation failed: '${modifierName}'. Invalid context '${contextValue}'.${available}`\n : `Modifier validation failed: '${modifierName}'. Modifier not defined in resolver.${available}`\n super(message)\n this.name = 'ModifierError'\n }\n}\n\n/**\n * Thrown when lint errors are found and failOnError is true\n *\n * @param issues - Array of lint issues that caused the error\n */\nexport class LintError extends DispersaError {\n constructor(\n public issues: Array<{\n ruleId: string\n severity: 'error' | 'warn'\n message: string\n tokenName: string\n tokenPath: string[]\n }>,\n ) {\n const errorCount = issues.filter((i) => i.severity === 'error').length\n const warningCount = issues.filter((i) => i.severity === 'warn').length\n super(`Lint failed with ${errorCount} error(s) and ${warningCount} warning(s).`)\n this.name = 'LintError'\n }\n}\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Plugin loader for lint plugins\n *\n * Supports loading plugins from:\n * - Inline plugin objects\n * - String module paths (package names or file paths)\n */\n\nimport { createRequire } from 'node:module'\nimport { isAbsolute, resolve } from 'node:path'\nimport process from 'node:process'\n\nimport { ConfigurationError } from '@shared/errors'\nimport { createJiti } from 'jiti'\n\nimport type { LintPlugin } from './types'\n\nexport type PluginLoaderOptions = {\n /**\n * Base directory for resolving relative plugin paths\n * @default process.cwd()\n */\n cwd?: string\n}\n\n/**\n * Loads lint plugins from various sources\n *\n * Handles:\n * - Inline `LintPlugin` objects (returned as-is)\n * - Package names (e.g., '@dispersa/lint-plugin-a11y')\n * - Relative file paths (e.g., './plugins/my-plugin.ts')\n * - Absolute file paths\n *\n * @security **Warning**: Loading plugins from external packages or file paths\n * executes arbitrary code. Only load plugins from trusted sources.\n * For programmatic usage, prefer passing plugin objects directly rather than\n * strings that trigger dynamic imports.\n *\n * @example\n * ```typescript\n * const loader = new PluginLoader({ cwd: process.cwd() })\n *\n * // Load from inline object\n * const plugin1 = await loader.load(myPlugin)\n *\n * // Load from package\n * const plugin2 = await loader.load('@dispersa/lint-plugin-a11y')\n *\n * // Load from file\n * const plugin3 = await loader.load('./plugins/custom.ts')\n * ```\n */\nexport class PluginLoader {\n private cwd: string\n private jiti: ReturnType<typeof createJiti> | null = null\n private cache: Map<string, LintPlugin> = new Map()\n\n constructor(options: PluginLoaderOptions = {}) {\n this.cwd = options.cwd ?? process.cwd()\n }\n\n /**\n * Load a plugin from an inline object or module path\n *\n * @param source - Plugin object or module path string\n * @returns Loaded plugin\n * @throws {ConfigurationError} If plugin cannot be loaded or is invalid\n */\n async load(source: LintPlugin | string): Promise<LintPlugin> {\n // Inline plugin object - return as-is\n if (this.isPluginObject(source)) {\n this.validatePlugin(source)\n return source\n }\n\n // String path - load module\n const modulePath = source as string\n const cached = this.cache.get(modulePath)\n if (cached) {\n return cached\n }\n\n const plugin = await this.loadFromModule(modulePath)\n this.validatePlugin(plugin)\n this.cache.set(modulePath, plugin)\n return plugin\n }\n\n /**\n * Load multiple plugins\n *\n * @param plugins - Record of namespace to plugin source\n * @returns Record of namespace to loaded plugin\n */\n async loadAll(plugins: Record<string, LintPlugin | string>): Promise<Record<string, LintPlugin>> {\n const entries = Object.entries(plugins)\n const loaded = await Promise.all(\n entries.map(async ([namespace, source]) => [namespace, await this.load(source)] as const),\n )\n return Object.fromEntries(loaded)\n }\n\n /**\n * Check if source is an inline plugin object\n */\n private isPluginObject(source: LintPlugin | string): source is LintPlugin {\n return typeof source !== 'string'\n }\n\n /**\n * Load a plugin from a module path\n */\n private async loadFromModule(modulePath: string): Promise<LintPlugin> {\n // Resolve relative paths from cwd\n const resolvedPath = isAbsolute(modulePath) ? modulePath : resolve(this.cwd, modulePath)\n\n // Check if it's a file path or package name\n const isFilePath =\n modulePath.startsWith('./') || modulePath.startsWith('../') || isAbsolute(modulePath)\n\n try {\n if (isFilePath) {\n return await this.loadFromFile(resolvedPath)\n }\n return await this.loadFromPackage(modulePath)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n throw new ConfigurationError(`Failed to load lint plugin '${modulePath}': ${message}`)\n }\n }\n\n /**\n * Load a plugin from a file path using jiti (supports TypeScript)\n */\n private async loadFromFile(filePath: string): Promise<LintPlugin> {\n this.jiti ??= createJiti(this.cwd, {\n interopDefault: true,\n })\n\n const loaded = await this.jiti(filePath)\n const plugin = this.extractPlugin(loaded)\n\n if (!plugin) {\n throw new ConfigurationError(`Plugin file '${filePath}' does not export a valid LintPlugin`)\n }\n\n return plugin\n }\n\n /**\n * Load a plugin from a package name\n */\n private async loadFromPackage(packageName: string): Promise<LintPlugin> {\n // Try to require the package\n const require = createRequire(this.cwd)\n\n let resolvedPath: string\n try {\n resolvedPath = require.resolve(packageName, { paths: [this.cwd] })\n } catch {\n // Fallback: try from this module's location\n try {\n resolvedPath = require.resolve(packageName)\n } catch {\n throw new ConfigurationError(\n `Cannot find package '${packageName}'. Make sure it is installed.`,\n )\n }\n }\n\n // Use jiti to support ESM/CJS interoperability\n this.jiti ??= createJiti(this.cwd, {\n interopDefault: true,\n })\n\n const loaded = await this.jiti(resolvedPath)\n const plugin = this.extractPlugin(loaded)\n\n if (!plugin) {\n throw new ConfigurationError(`Package '${packageName}' does not export a valid LintPlugin`)\n }\n\n return plugin\n }\n\n /**\n * Extract plugin from loaded module\n *\n * Supports multiple export patterns:\n * - export default plugin\n * - export const plugin = {...}\n * - module.exports = plugin (CJS)\n */\n private extractPlugin(loaded: unknown): LintPlugin | null {\n if (!loaded || typeof loaded !== 'object') {\n return null\n }\n\n const module = loaded as Record<string, unknown>\n\n // Priority 1: default export\n if (module.default && this.isValidPluginStructure(module.default)) {\n return module.default as LintPlugin\n }\n\n // Priority 2: named export 'plugin'\n if (module.plugin && this.isValidPluginStructure(module.plugin)) {\n return module.plugin as LintPlugin\n }\n\n // Priority 3: module is the plugin itself (CJS module.exports = plugin)\n if (this.isValidPluginStructure(loaded)) {\n return loaded as LintPlugin\n }\n\n return null\n }\n\n /**\n * Check if object has required plugin structure\n */\n private isValidPluginStructure(obj: unknown): boolean {\n if (!obj || typeof obj !== 'object') {\n return false\n }\n\n const plugin = obj as Record<string, unknown>\n const rules = plugin.rules as Record<string, unknown> | undefined\n\n if (\n plugin.meta === undefined ||\n typeof plugin.meta !== 'object' ||\n !(plugin.meta as Record<string, unknown>).name ||\n rules === undefined ||\n Object.keys(rules).length === 0\n ) {\n return false\n }\n\n return true\n }\n\n /**\n * Validate a loaded plugin\n */\n private validatePlugin(plugin: LintPlugin): void {\n if (!plugin.meta) {\n throw new ConfigurationError('Lint plugin must have a meta property with name')\n }\n\n if (!plugin.meta.name) {\n throw new ConfigurationError('Lint plugin meta.name is required')\n }\n\n if (\n !plugin.rules ||\n typeof plugin.rules !== 'object' ||\n Object.keys(plugin.rules).length === 0\n ) {\n throw new ConfigurationError(\n `Lint plugin '${plugin.meta.name}' must have a non-empty rules object`,\n )\n }\n\n // Validate each rule\n for (const [ruleName, rule] of Object.entries(plugin.rules)) {\n if (!rule.meta) {\n throw new ConfigurationError(\n `Rule '${ruleName}' in plugin '${plugin.meta.name}' is missing meta property`,\n )\n }\n if (!rule.meta.messages || typeof rule.meta.messages !== 'object') {\n throw new ConfigurationError(\n `Rule '${ruleName}' in plugin '${plugin.meta.name}' is missing meta.messages`,\n )\n }\n if (typeof rule.create !== 'function') {\n throw new ConfigurationError(\n `Rule '${ruleName}' in plugin '${plugin.meta.name}' is missing create function`,\n )\n }\n }\n }\n\n /**\n * Clear the plugin cache\n */\n clearCache(): void {\n this.cache.clear()\n }\n}\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Lint runner that executes rules in parallel against tokens\n *\n * The lint runner is responsible for:\n * - Loading plugins and resolving rule configurations\n * - Executing rules in parallel for performance\n * - Collecting and aggregating lint issues\n * - Interpolating message templates with data\n */\n\nimport type { InternalResolvedTokens, TokenType } from '@tokens/types'\n\nimport { PluginLoader } from './plugin-loader'\nimport type {\n AnyLintRule,\n LintConfig,\n LintIssue,\n LintPlugin,\n LintReportDescriptor,\n LintResult,\n LintRuleContext,\n ResolvedLintConfig,\n ResolvedRuleConfig,\n RuleConfig,\n} from './types'\n\nexport type LintRunnerOptions = LintConfig & {\n /** Callback for runner warnings (e.g. unknown rule). Defaults to console.warn. */\n onWarn?: (message: string) => void\n}\n\n/**\n * Executes lint rules against a set of tokens\n *\n * @example\n * ```typescript\n * const config: LintConfig = {\n * plugins: {\n * dispersa: dispersaPlugin,\n * },\n * rules: {\n * 'dispersa/require-description': 'warn',\n * 'dispersa/naming-convention': ['error', { format: 'kebab-case' }],\n * },\n * }\n *\n * const runner = new LintRunner(config)\n * const result = await runner.run(tokens)\n *\n * console.log(`Found ${result.errorCount} errors, ${result.warningCount} warnings`)\n * ```\n */\nexport class LintRunner {\n private config: LintRunnerOptions\n private pluginLoader: PluginLoader\n private resolvedConfig: ResolvedLintConfig | null = null\n private warn: (message: string) => void\n\n constructor(config: LintRunnerOptions) {\n this.config = config\n this.pluginLoader = new PluginLoader()\n this.warn = config.onWarn ?? console.warn\n }\n\n /**\n * Run all configured rules against the provided tokens\n *\n * Rules are executed in parallel for performance. Issues are collected\n * and returned with counts by severity.\n *\n * @param tokens - Resolved tokens to lint\n * @returns Lint result with issues and counts\n */\n async run(tokens: InternalResolvedTokens): Promise<LintResult> {\n this.resolvedConfig ??= await this.resolveConfig()\n\n const { rules, plugins } = this.resolvedConfig\n const issues: LintIssue[] = []\n\n if (Object.keys(rules).length === 0) {\n return { issues: [], errorCount: 0, warningCount: 0 }\n }\n\n const rulePromises = Object.entries(rules).map(async ([ruleId, ruleConfig]) => {\n const { severity, options } = ruleConfig\n\n const rule = this.resolveRule(ruleId, plugins)\n if (!rule) {\n this.warn(`[lint] Unknown rule '${ruleId}' - no plugin provides this rule`)\n return []\n }\n\n const reports: LintReportDescriptor<string>[] = []\n const applicableTokens = this.filterTokensByAppliesTo(tokens, rule.meta.appliesTo)\n const mergedOptions = rule.defaultOptions ? { ...rule.defaultOptions, ...options } : options\n\n const context: LintRuleContext<string, Record<string, unknown>> = {\n id: ruleId,\n options: mergedOptions,\n tokens: applicableTokens,\n report: (descriptor) => {\n reports.push(descriptor)\n },\n }\n\n try {\n await rule.create(context)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return [\n {\n ruleId: 'lint/rule-error',\n severity: 'error' as const,\n message: `Rule '${ruleId}' failed: ${message}`,\n tokenName: '(rule execution)',\n tokenPath: [],\n },\n ]\n }\n\n return reports.map((report) => {\n const messageTemplate = rule.meta.messages[report.messageId]\n const message = messageTemplate\n ? this.interpolateMessage(messageTemplate, report.data)\n : report.messageId\n\n return {\n ruleId,\n severity,\n message,\n tokenName: report.token.name,\n tokenPath: report.token.path,\n }\n })\n })\n\n const allIssues = await Promise.all(rulePromises)\n issues.push(...allIssues.flat())\n\n const errorCount = issues.filter((i) => i.severity === 'error').length\n const warningCount = issues.filter((i) => i.severity === 'warn').length\n\n return { issues, errorCount, warningCount }\n }\n\n /**\n * Resolve configuration: load plugins, parse rule configs\n */\n private async resolveConfig(): Promise<ResolvedLintConfig> {\n const { plugins: pluginSources = {}, rules: ruleConfigs = {} } = this.config\n\n const plugins = await this.pluginLoader.loadAll(pluginSources)\n\n const rules: Record<string, ResolvedRuleConfig> = {}\n\n for (const [ruleId, config] of Object.entries(ruleConfigs)) {\n const resolved = this.resolveRuleConfig(config)\n if (resolved) {\n rules[ruleId] = resolved\n }\n }\n\n return {\n enabled: true,\n failOnError: this.config.failOnError ?? true,\n plugins,\n rules,\n }\n }\n\n private filterTokensByAppliesTo(\n tokens: InternalResolvedTokens,\n appliesTo: TokenType[] | 'all' | undefined,\n ): InternalResolvedTokens {\n if (!appliesTo || appliesTo === 'all') {\n return tokens\n }\n\n const filtered: InternalResolvedTokens = {}\n for (const [name, token] of Object.entries(tokens)) {\n if (token.$type && appliesTo.includes(token.$type)) {\n filtered[name] = token\n }\n }\n return filtered\n }\n\n /**\n * Parse rule configuration into resolved format\n */\n private resolveRuleConfig(config: RuleConfig): ResolvedRuleConfig | null {\n // Shorthand: severity only\n if (typeof config === 'string') {\n if (config === 'off') {\n return null\n }\n return { severity: config, options: {} }\n }\n\n // Longhand: [severity, options]\n const [severity, options = {}] = config\n if (severity === 'off') {\n return null\n }\n\n return { severity, options }\n }\n\n /**\n * Resolve a rule from plugins by rule ID\n *\n * Rule IDs are formatted as 'namespace/rule-name'\n */\n private resolveRule(ruleId: string, plugins: Record<string, LintPlugin>): AnyLintRule | null {\n const separatorIndex = ruleId.indexOf('/')\n if (separatorIndex === -1) {\n return null\n }\n\n const namespace = ruleId.slice(0, separatorIndex)\n const ruleName = ruleId.slice(separatorIndex + 1)\n\n const plugin = plugins[namespace]\n if (!plugin) {\n return null\n }\n\n return plugin.rules[ruleName] ?? null\n }\n\n /**\n * Interpolate message template with data\n *\n * Replaces {{key}} placeholders with values from data\n */\n private interpolateMessage(template: string, data?: Record<string, string | number>): string {\n if (!data) {\n return template\n }\n\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => {\n const value = data[key]\n return value !== undefined ? String(value) : `{{${key}}}`\n })\n }\n\n /**\n * Clear the plugin cache\n */\n clearCache(): void {\n this.pluginLoader.clearCache()\n this.resolvedConfig = null\n }\n}\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Shared glob pattern matching utilities for lint rules\n *\n * Provides bounded caching to prevent memory leaks in long-running processes.\n */\n\nconst MAX_CACHE_SIZE = 1000\n\nconst cache = new Map<string, RegExp>()\n\n/**\n * Convert a glob pattern to a RegExp\n *\n * Supports `*` as a wildcard that matches any characters.\n * Results are cached with a bounded cache to prevent memory leaks.\n *\n * @param pattern - Glob pattern (e.g., 'color-*', '*.primary')\n * @returns Compiled RegExp\n *\n * @example\n * ```typescript\n * const regex = globToRegex('color-*')\n * regex.test('color-primary') // true\n * regex.test('spacing-base') // false\n * ```\n */\nexport function globToRegex(pattern: string): RegExp {\n const cached = cache.get(pattern)\n if (cached) {\n cache.delete(pattern)\n cache.set(pattern, cached)\n return cached\n }\n\n const regex = new RegExp(\n '^' +\n pattern\n .split('*')\n .map((part) => part.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n .join('.*') +\n '$',\n )\n\n if (cache.size >= MAX_CACHE_SIZE) {\n const oldest = cache.keys().next().value\n if (oldest !== undefined) {\n cache.delete(oldest)\n }\n }\n\n cache.set(pattern, regex)\n return regex\n}\n\n/**\n * Check if a name matches any of the given glob patterns\n *\n * @param name - String to test\n * @param patterns - Array of glob patterns\n * @returns true if name matches any pattern\n *\n * @example\n * ```typescript\n * matchesGlob('color-primary', ['color-*', 'spacing-*']) // true\n * matchesGlob('typography-base', ['color-*']) // false\n * ```\n */\nexport function matchesGlob(name: string, patterns: string[]): boolean {\n return patterns.some((pattern) => globToRegex(pattern).test(name))\n}\n\n/**\n * Clear the glob pattern cache\n *\n * Useful for testing or when memory needs to be reclaimed.\n */\nexport function clearGlobCache(): void {\n cache.clear()\n}\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Utility for extracting token references from values\n *\n * Used by rules that need to detect references to other tokens,\n * such as no-deprecated-usage.\n */\n\nconst ALIAS_PATTERN = /\\{([^}]+)\\}/g\n\n/**\n * Extract all token references from a value\n *\n * Recursively traverses objects and arrays to find all references\n * in the form `{token.name}`.\n *\n * @param value - Value to extract references from\n * @returns Array of referenced token names\n *\n * @example\n * ```typescript\n * extractReferences('{color.primary}') // ['color.primary']\n * extractReferences('{color.base.primary}') // ['color.base.primary']\n * extractReferences('border: {border.width} solid {color.border}') // ['border.width', 'color.border']\n * extractReferences({ value: '{spacing.md}', nested: { ref: '{spacing.lg}' } }) // ['spacing.md', 'spacing.lg']\n * ```\n */\nexport function extractReferences(value: unknown): string[] {\n const refs: string[] = []\n\n if (typeof value === 'string') {\n let match\n ALIAS_PATTERN.lastIndex = 0\n while ((match = ALIAS_PATTERN.exec(value)) !== null) {\n if (match[1]) {\n refs.push(match[1])\n }\n }\n } else if (Array.isArray(value)) {\n for (const item of value) {\n refs.push(...extractReferences(item))\n }\n } else if (typeof value === 'object' && value !== null) {\n for (const v of Object.values(value as Record<string, unknown>)) {\n refs.push(...extractReferences(v))\n }\n }\n\n return refs\n}\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Rule: naming-convention\n *\n * Enforces consistent token naming conventions.\n */\n\nimport { createRule } from '@lint/create-rule'\nimport { matchesGlob } from '@lint/utils'\n\nexport const NamingConventionMessages = {\n INVALID_FORMAT: 'INVALID_FORMAT',\n INVALID_SEGMENT: 'INVALID_SEGMENT',\n} as const\n\nexport type NamingConventionOptions = {\n /**\n * Naming format to enforce\n * - 'kebab-case': color-brand-primary, red-500, blue-600\n * - 'camelCase': colorBrandPrimary\n * - 'PascalCase': ColorBrandPrimary\n * - 'snake_case': color_brand_primary\n * - 'screaming-snake': COLOR_BRAND_PRIMARY\n */\n format?: 'kebab-case' | 'camelCase' | 'PascalCase' | 'snake_case' | 'screaming-snake'\n /** Token name patterns to ignore (glob patterns) */\n ignore?: string[]\n /** Custom regex pattern to validate against */\n pattern?: string\n /**\n * Allow purely numeric path segments (e.g., spacing.0, spacing.1)\n * Common in design system scales. Default: true\n */\n allowNumericSegments?: boolean\n}\n\nconst PATTERNS: Record<string, RegExp> = {\n 'kebab-case': /^([a-z][a-z0-9]*)(-[a-z0-9]+)*$/,\n camelCase: /^[a-z][a-zA-Z0-9]*$/,\n PascalCase: /^[A-Z][a-zA-Z0-9]*$/,\n snake_case: /^([a-z][a-z0-9]*)(_[a-z0-9]+)*$/,\n 'screaming-snake': /^([A-Z][A-Z0-9]*)(_[A-Z0-9]+)*$/,\n}\n\nconst DEFAULT_PATTERN = /^[a-z][a-z0-9]*(-[a-z][a-z0-9]*)*$/\n\nexport const namingConvention = createRule<\n (typeof NamingConventionMessages)[keyof typeof NamingConventionMessages],\n NamingConventionOptions\n>({\n meta: {\n name: 'naming-convention',\n description: 'Enforce consistent token naming conventions',\n messages: {\n INVALID_FORMAT: \"Token '{{name}}' does not match '{{format}}' format\",\n INVALID_SEGMENT:\n \"Segment '{{segment}}' in token '{{name}}' does not match '{{format}}' format\",\n },\n },\n defaultOptions: { format: 'kebab-case', allowNumericSegments: true },\n create({ tokens, options, report }) {\n const format = options.format ?? 'kebab-case'\n const ignore = options.ignore ?? []\n const customPattern = options.pattern\n const allowNumericSegments = options.allowNumericSegments ?? true\n\n // Use custom pattern if provided, otherwise use built-in format\n let segmentPattern: RegExp\n if (customPattern) {\n segmentPattern = new RegExp(customPattern)\n } else {\n segmentPattern = PATTERNS[format] ?? DEFAULT_PATTERN\n }\n\n // Pattern for pure numeric segments (common in design systems: spacing.0, spacing.1)\n const numericPattern = /^\\d+$/\n\n for (const token of Object.values(tokens)) {\n // Skip ignored tokens\n if (ignore.length > 0 && matchesGlob(token.name, ignore)) {\n continue\n }\n\n // Check each path segment\n const segments = token.path\n let hasError = false\n\n for (const segment of segments) {\n // Allow pure numeric segments if option is enabled\n if (allowNumericSegments && numericPattern.test(segment)) {\n continue\n }\n\n if (!segmentPattern.test(segment)) {\n report({\n token,\n messageId: 'INVALID_SEGMENT',\n data: { name: token.name, segment, format: customPattern ?? format },\n })\n hasError = true\n break\n }\n }\n\n // If no segment errors, also check full name for custom patterns\n if (!hasError && customPattern && !segmentPattern.test(token.name)) {\n report({\n token,\n messageId: 'INVALID_FORMAT',\n data: { name: token.name, format: customPattern },\n })\n }\n }\n },\n})\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Rule: no-deprecated-usage\n *\n * Warns when tokens reference deprecated tokens.\n */\n\nimport { createRule } from '@lint/create-rule'\nimport { extractReferences, matchesGlob } from '@lint/utils'\n\nexport const NoDeprecatedUsageMessages = {\n REFERENCES_DEPRECATED: 'REFERENCES_DEPRECATED',\n} as const\n\nexport type NoDeprecatedUsageOptions = {\n /** Token name patterns to ignore (glob patterns) */\n ignore?: string[]\n}\n\nexport const noDeprecatedUsage = createRule<\n (typeof NoDeprecatedUsageMessages)[keyof typeof NoDeprecatedUsageMessages],\n NoDeprecatedUsageOptions\n>({\n meta: {\n name: 'no-deprecated-usage',\n description: 'Disallow references to deprecated tokens',\n messages: {\n REFERENCES_DEPRECATED: \"Token '{{name}}' references deprecated token '{{ref}}'. {{reason}}\",\n },\n },\n defaultOptions: {},\n create({ tokens, options, report }) {\n const ignore = options.ignore ?? []\n\n // Build set of deprecated tokens\n const deprecatedTokens = new Map<string, string | true>()\n for (const token of Object.values(tokens)) {\n if (token.$deprecated) {\n const reason = typeof token.$deprecated === 'string' ? token.$deprecated : ''\n deprecatedTokens.set(token.name, reason || true)\n }\n }\n\n // If no deprecated tokens, nothing to check\n if (deprecatedTokens.size === 0) {\n return\n }\n\n for (const token of Object.values(tokens)) {\n // Skip ignored tokens\n if (ignore.length > 0 && matchesGlob(token.name, ignore)) {\n continue\n }\n\n // Skip deprecated tokens themselves\n if (deprecatedTokens.has(token.name)) {\n continue\n }\n\n // Extract references from original value\n const refs = extractReferences(token.originalValue)\n\n for (const ref of refs) {\n const deprecation = deprecatedTokens.get(ref)\n if (deprecation) {\n const reason = deprecation === true ? '' : `(${deprecation})`\n report({\n token,\n messageId: 'REFERENCES_DEPRECATED',\n data: { name: token.name, ref, reason },\n })\n }\n }\n }\n },\n})\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Rule: no-duplicate-values\n *\n * Detects tokens with duplicate values (excluding aliases).\n */\n\nimport { createRule } from '@lint/create-rule'\nimport { matchesGlob } from '@lint/utils'\n\nexport const NoDuplicateValuesMessages = {\n DUPLICATE_VALUE: 'DUPLICATE_VALUE',\n} as const\n\nexport type NoDuplicateValuesOptions = {\n /** Token name patterns to ignore (glob patterns) */\n ignore?: string[]\n /** Only check specific token types */\n types?: string[]\n}\n\nfunction valueKey(value: unknown): string {\n if (value === null) {\n return 'null'\n }\n if (value === undefined) {\n return 'undefined'\n }\n if (typeof value === 'object') {\n return JSON.stringify(sortKeys(value))\n }\n return String(value)\n}\n\nfunction sortKeys(obj: unknown): unknown {\n if (Array.isArray(obj)) {\n return obj.map(sortKeys)\n }\n if (typeof obj === 'object' && obj !== null) {\n const sorted: Record<string, unknown> = {}\n for (const key of Object.keys(obj).sort()) {\n sorted[key] = sortKeys((obj as Record<string, unknown>)[key])\n }\n return sorted\n }\n return obj\n}\n\nexport const noDuplicateValues = createRule<\n (typeof NoDuplicateValuesMessages)[keyof typeof NoDuplicateValuesMessages],\n NoDuplicateValuesOptions\n>({\n meta: {\n name: 'no-duplicate-values',\n description: 'Detect tokens with duplicate values (excluding aliases)',\n messages: {\n DUPLICATE_VALUE:\n \"Token '{{name}}' has the same value as '{{duplicate}}'. Consider using an alias instead.\",\n },\n },\n defaultOptions: {},\n create({ tokens, options, report }) {\n const ignore = options.ignore ?? []\n const types = options.types\n\n const valueMap = new Map<string, (typeof tokens)[string][]>()\n\n for (const token of Object.values(tokens)) {\n if (ignore.length > 0 && matchesGlob(token.name, ignore)) {\n continue\n }\n\n if (token._isAlias) {\n continue\n }\n\n if (types && types.length > 0 && !types.includes(token.$type ?? '')) {\n continue\n }\n\n const key = valueKey(token.$value)\n const existing = valueMap.get(key)\n if (existing) {\n existing.push(token)\n } else {\n valueMap.set(key, [token])\n }\n }\n\n for (const tokenList of valueMap.values()) {\n if (tokenList.length > 1) {\n const first = tokenList[0]\n if (!first) {\n continue\n }\n\n for (let i = 1; i < tokenList.length; i++) {\n const current = tokenList[i]\n if (current) {\n report({\n token: current,\n messageId: 'DUPLICATE_VALUE',\n data: { name: current.name, duplicate: first.name },\n })\n }\n }\n }\n }\n },\n})\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Path schema matcher implementation\n */\n\nimport { matchesGlob } from '@lint/utils'\nimport type { ResolvedToken } from '@tokens/types'\n\nimport type { PathSchemaConfig, SegmentDefinition, TransitionRule } from './types'\n\nexport type Violation = {\n type: 'INVALID_PATH' | 'UNKNOWN_SEGMENT' | 'FORBIDDEN_TRANSITION'\n data: Record<string, string | number>\n}\n\ntype Pattern = string | string[] | RegExp\n\ntype CompiledPattern = Array<\n { type: 'segment'; name: string } | { type: 'literal'; value: string } | { type: 'wildcard' }\n>\n\ntype CompiledTransition = {\n from: Pattern\n to: Pattern\n allow: boolean\n}\n\nexport { matchesGlob }\n\n/**\n * Compiles and validates token paths against a schema\n */\nexport class PathSchemaMatcher {\n private segments: Record<string, SegmentDefinition>\n private pathPatterns: CompiledPattern[]\n private transitionRules: CompiledTransition[]\n\n constructor(config: PathSchemaConfig) {\n this.segments = config.segments ?? {}\n this.pathPatterns = this.compilePaths(config.paths ?? [], this.segments)\n this.transitionRules = this.compileTransitions(config.transitions ?? [])\n }\n\n /**\n * Validate a token against the schema\n */\n validate(token: ResolvedToken): Violation[] {\n const violations: Violation[] = []\n const pathSegments = token.path\n const hasPaths = this.pathPatterns.length > 0\n const hasTransitions = this.transitionRules.length > 0\n\n // Check transitions if defined\n if (hasTransitions) {\n const transitionViolations = this.validateTransitions(pathSegments, token.name)\n violations.push(...transitionViolations)\n }\n\n // Check against path patterns if defined\n if (hasPaths) {\n const matchesAny = this.pathPatterns.some((p) => this.matchPattern(p, pathSegments))\n if (!matchesAny) {\n violations.push({\n type: 'INVALID_PATH',\n data: { path: token.name },\n })\n }\n }\n\n return violations\n }\n\n /**\n * Validate transitions between segments.\n *\n * Deny rules are checked independently (any match = violation).\n * Allow rules use OR semantics: at least one must match.\n */\n private validateTransitions(segments: string[], tokenName: string): Violation[] {\n const violations: Violation[] = []\n\n for (let i = 0; i < segments.length - 1; i++) {\n const from = segments[i]\n const to = segments[i + 1]\n\n if (!from || !to) {\n continue\n }\n\n const applicableRules = this.transitionRules.filter((r) => this.matchesPattern(from, r.from))\n\n if (applicableRules.length === 0) {\n continue\n }\n\n const denyRules = applicableRules.filter((r) => r.allow === false)\n const allowRules = applicableRules.filter((r) => r.allow !== false)\n\n for (const rule of denyRules) {\n if (this.matchesPattern(to, rule.to)) {\n violations.push({\n type: 'FORBIDDEN_TRANSITION',\n data: { from, to, path: tokenName },\n })\n }\n }\n\n if (allowRules.length > 0) {\n const anyAllowMatches = allowRules.some((r) => this.matchesPattern(to, r.to))\n if (!anyAllowMatches) {\n violations.push({\n type: 'FORBIDDEN_TRANSITION',\n data: { from, to, path: tokenName },\n })\n }\n }\n }\n\n return violations\n }\n\n /**\n * Check if a value matches a pattern\n */\n private matchesPattern(value: string, pattern: Pattern): boolean {\n if (typeof pattern === 'string') {\n return value === pattern\n }\n if (Array.isArray(pattern)) {\n return pattern.includes(value)\n }\n return pattern.test(value)\n }\n\n /**\n * Compile path patterns into matcher structures\n */\n private compilePaths(\n patterns: string[],\n segments: Record<string, SegmentDefinition>,\n ): CompiledPattern[] {\n return patterns.map((p) => this.parsePattern(p, segments))\n }\n\n /**\n * Parse a path pattern string into compiled form\n * - `{name}` is a segment placeholder\n * - `*` is a wildcard that matches any single segment\n * - `.` is the path separator (implicit between segments)\n */\n private parsePattern(\n pattern: string,\n _segments: Record<string, SegmentDefinition>,\n ): CompiledPattern {\n const parts: CompiledPattern = []\n const regex = /\\{(\\w+)\\}|(\\*)|([^{}*]+)/g\n let match\n\n while ((match = regex.exec(pattern)) !== null) {\n if (match[1]) {\n parts.push({ type: 'segment', name: match[1] })\n } else if (match[2]) {\n parts.push({ type: 'wildcard' })\n } else if (match[3]) {\n parts.push({ type: 'literal', value: match[3] })\n }\n }\n\n return parts\n }\n\n /**\n * Match path segments against a compiled pattern using dynamic programming.\n * Supports optional segments via DP table.\n *\n * DP[i][j] = can we match path[0..i) with pattern[0..j)?\n */\n private matchPattern(pattern: CompiledPattern, pathSegments: string[]): boolean {\n // Extract pattern parts that consume segments (segments + wildcards)\n // But include literals that are NOT just path separators (single dots)\n const patternParts = pattern.filter((p) => {\n if (p.type === 'segment' || p.type === 'wildcard') {\n return true\n }\n if (p.type === 'literal') {\n // Keep literals that are more than just separators (e.g., '.palette.')\n // Single '.' or sequences of '.' are path separators, not meaningful literals\n return p.value !== '.' && !/^\\.+$/.test(p.value)\n }\n return false\n })\n const pathLen = pathSegments.length\n const patternLen = patternParts.length\n\n // DP table: dp[i][j] = can we match first i path segments with first j pattern parts?\n // Initialize with false values\n const dp: boolean[][] = []\n for (let i = 0; i <= pathLen; i++) {\n dp[i] = []\n for (let j = 0; j <= patternLen; j++) {\n dp[i]![j] = false\n }\n }\n\n // Base case: empty path matches empty pattern\n dp[0]![0] = true\n\n // Fill DP table\n for (let i = 0; i <= pathLen; i++) {\n for (let j = 0; j <= patternLen; j++) {\n const currentState = dp[i]![j]\n if (!currentState) {\n continue\n }\n\n // If we've consumed all path segments, we can still skip remaining optional pattern parts\n if (i === pathLen) {\n // Can skip remaining optional pattern parts\n if (j < patternLen && this.isPartOptional(patternParts[j]!)) {\n dp[i]![j + 1] = true\n }\n continue\n }\n\n // If we've consumed all pattern parts, we can only continue if path is also exhausted\n if (j === patternLen) {\n if (i === pathLen) {\n dp[i]![j] = true\n }\n continue\n }\n\n const part = patternParts[j]!\n\n // ALWAYS try to match current path segment with current pattern part first\n if (i < pathLen && this.matchPatternPart(part, pathSegments[i]!)) {\n dp[i + 1]![j + 1] = true\n }\n\n // THEN try skipping current pattern part if it's optional\n // (this is separate from matching - both can be valid)\n if (this.isPartOptional(part)) {\n dp[i]![j + 1] = true\n }\n }\n }\n\n // Path matches if we can reach any state where both path and pattern are consumed\n return dp[pathLen]![patternLen] ?? false\n }\n\n /**\n * Check if a pattern part is optional based on its segment definition\n */\n private isPartOptional(part: { type: string; name?: string }): boolean {\n if (part.type !== 'segment' || !part.name) {\n return false // Wildcards and literals are not optional\n }\n const segmentDef = this.segments[part.name]\n return segmentDef?.optional ?? false\n }\n\n /**\n * Match a single pattern part against a path segment value\n */\n private matchPatternPart(\n part: { type: string; name?: string; value?: string },\n value: string,\n ): boolean {\n if (part.type === 'wildcard') {\n return true\n }\n\n if (part.type === 'literal' && part.value !== undefined) {\n // Strip leading/trailing dots from literal for comparison\n // e.g., '.palette.' should match 'palette'\n const literalValue = part.value.replace(/^\\.+|\\.+$/g, '')\n return literalValue === value\n }\n\n if (part.type === 'segment' && part.name) {\n const segment = this.segments[part.name]\n if (!segment) {\n return true\n }\n return this.matchesSegmentDefinition(value, segment)\n }\n\n return false\n }\n\n /**\n * Check if a value matches a segment definition\n */\n private matchesSegmentDefinition(value: string, definition: SegmentDefinition): boolean {\n const { values } = definition\n if (Array.isArray(values)) {\n return values.some((v) => (typeof v === 'string' ? v === value : v.test(value)))\n }\n return values.test(value)\n }\n\n /**\n * Compile transition rules\n */\n private compileTransitions(transitions: TransitionRule[]): CompiledTransition[] {\n return transitions.map((t) => ({\n from: t.from,\n to: t.to,\n allow: t.allow ?? true,\n }))\n }\n}\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Rule: path-schema\n *\n * Enforces token path structure using segment definitions and patterns.\n */\n\nimport { createRule } from '@lint/create-rule'\n\nimport { PathSchemaMatcher, matchesGlob } from './matcher'\nimport type { PathSchemaConfig } from './types'\n\nexport { type PathSchemaConfig, type SegmentDefinition, type TransitionRule } from './types'\n\nexport const PathSchemaMessages = {\n INVALID_PATH: 'INVALID_PATH',\n UNKNOWN_SEGMENT: 'UNKNOWN_SEGMENT',\n FORBIDDEN_TRANSITION: 'FORBIDDEN_TRANSITION',\n} as const\n\nexport const pathSchema = createRule<\n (typeof PathSchemaMessages)[keyof typeof PathSchemaMessages],\n PathSchemaConfig\n>({\n meta: {\n name: 'path-schema',\n description: 'Enforce token path segment structure',\n messages: {\n INVALID_PATH: \"Token path '{{path}}' does not match any defined pattern\",\n UNKNOWN_SEGMENT: \"Segment '{{segment}}' at position {{position}} in '{{path}}' is not valid\",\n FORBIDDEN_TRANSITION: \"Segment '{{to}}' cannot follow '{{from}}' in path '{{path}}'\",\n },\n },\n defaultOptions: {\n segments: {},\n paths: [],\n transitions: [],\n },\n create({ tokens, options, report }) {\n const ignore = options.ignore ?? []\n\n // Skip if no patterns or transitions defined\n if (\n (!options.paths || options.paths.length === 0) &&\n (!options.transitions || options.transitions.length === 0)\n ) {\n return\n }\n\n const matcher = new PathSchemaMatcher(options)\n\n for (const token of Object.values(tokens)) {\n // Skip ignored tokens\n if (ignore.length > 0 && matchesGlob(token.name, ignore)) {\n continue\n }\n\n const violations = matcher.validate(token)\n\n for (const violation of violations) {\n report({\n token,\n messageId: violation.type,\n data: violation.data as Record<string, string>,\n })\n }\n }\n },\n})\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Rule: require-description\n *\n * Requires tokens to have descriptions.\n */\n\nimport { createRule } from '@lint/create-rule'\nimport { matchesGlob } from '@lint/utils'\n\nexport const RequireDescriptionMessages = {\n MISSING_DESCRIPTION: 'MISSING_DESCRIPTION',\n TOO_SHORT: 'TOO_SHORT',\n} as const\n\nexport type RequireDescriptionOptions = {\n /** Minimum length for description. Default: 1 */\n minLength?: number\n /** Token name patterns to ignore (glob patterns) */\n ignore?: string[]\n}\n\nexport const requireDescription = createRule<\n (typeof RequireDescriptionMessages)[keyof typeof RequireDescriptionMessages],\n RequireDescriptionOptions\n>({\n meta: {\n name: 'require-description',\n description: 'Require tokens to have descriptions',\n messages: {\n MISSING_DESCRIPTION: \"Token '{{name}}' is missing a description\",\n TOO_SHORT: \"Token '{{name}}' description is too short ({{length}} chars, min {{minLength}})\",\n },\n },\n defaultOptions: { minLength: 1 },\n create({ tokens, options, report }) {\n const minLength = options.minLength ?? 1\n const ignore = options.ignore ?? []\n\n for (const token of Object.values(tokens)) {\n // Skip ignored tokens\n if (ignore.length > 0 && matchesGlob(token.name, ignore)) {\n continue\n }\n\n if (!token.$description) {\n report({\n token,\n messageId: 'MISSING_DESCRIPTION',\n data: { name: token.name },\n })\n } else if (token.$description.length < minLength) {\n report({\n token,\n messageId: 'TOO_SHORT',\n data: {\n name: token.name,\n length: token.$description.length,\n minLength,\n },\n })\n }\n }\n },\n})\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Built-in lint rules and dispersa plugin\n */\n\nimport type { LintPlugin, LintConfig } from '@lint/types'\n\nimport type { NamingConventionOptions } from './naming-convention'\nimport { namingConvention } from './naming-convention'\nimport type { NoDeprecatedUsageOptions } from './no-deprecated-usage'\nimport { noDeprecatedUsage } from './no-deprecated-usage'\nimport type { NoDuplicateValuesOptions } from './no-duplicate-values'\nimport { noDuplicateValues } from './no-duplicate-values'\nimport type { PathSchemaConfig } from './path-schema'\nimport { pathSchema } from './path-schema'\nimport type { RequireDescriptionOptions } from './require-description'\nimport { requireDescription } from './require-description'\n\n// Re-export rules for direct use\nexport { requireDescription } from './require-description'\nexport { namingConvention } from './naming-convention'\nexport { noDeprecatedUsage } from './no-deprecated-usage'\nexport { noDuplicateValues } from './no-duplicate-values'\nexport {\n pathSchema,\n type PathSchemaConfig,\n type SegmentDefinition,\n type TransitionRule,\n} from './path-schema'\n\n// Export option types for plugin authors\nexport type { RequireDescriptionOptions } from './require-description'\nexport type { NamingConventionOptions } from './naming-convention'\nexport type { NoDeprecatedUsageOptions } from './no-deprecated-usage'\nexport type { NoDuplicateValuesOptions } from './no-duplicate-values'\n\n/**\n * Builds the dispersa plugin with its predefined configs.\n *\n * Uses a factory to encapsulate the self-referential setup:\n * configs reference the plugin, and the plugin carries configs.\n * The returned objects are fully formed -- no external mutation.\n */\nfunction buildDispersaPlugin() {\n const rules = {\n 'require-description': requireDescription,\n 'naming-convention': namingConvention,\n 'no-deprecated-usage': noDeprecatedUsage,\n 'no-duplicate-values': noDuplicateValues,\n 'path-schema': pathSchema,\n }\n\n const plugin: LintPlugin = { meta: { name: 'dispersa' }, rules, configs: {} }\n\n const recommended: LintConfig = {\n plugins: { dispersa: plugin },\n rules: {\n 'dispersa/require-description': 'warn',\n 'dispersa/naming-convention': ['error', { format: 'kebab-case' }],\n 'dispersa/no-deprecated-usage': 'warn',\n },\n }\n\n const strict: LintConfig = {\n plugins: { dispersa: plugin },\n rules: {\n 'dispersa/require-description': 'error',\n 'dispersa/naming-convention': ['error', { format: 'kebab-case' }],\n 'dispersa/no-deprecated-usage': 'error',\n 'dispersa/no-duplicate-values': 'error',\n },\n }\n\n const minimal: LintConfig = {\n plugins: { dispersa: plugin },\n rules: {\n 'dispersa/no-deprecated-usage': 'warn',\n },\n }\n\n plugin.configs = { recommended, strict, minimal }\n\n return { plugin, recommended, strict, minimal } as const\n}\n\nconst {\n plugin: dispersaPlugin,\n recommended: recommendedConfig,\n strict: strictConfig,\n minimal: minimalConfig,\n} = buildDispersaPlugin()\n\n/**\n * Built-in Dispersa lint plugin\n *\n * Provides core lint rules for design token validation.\n *\n * @example\n * ```typescript\n * import { dispersaPlugin } from 'dispersa/lint'\n *\n * const config = {\n * plugins: { dispersa: dispersaPlugin },\n * rules: {\n * 'dispersa/require-description': 'warn',\n * 'dispersa/naming-convention': ['error', { format: 'kebab-case' }],\n * },\n * }\n * ```\n */\nexport { dispersaPlugin }\n\n/** Recommended lint configuration */\nexport { recommendedConfig }\n\n/** Strict lint configuration */\nexport { strictConfig }\n\n/** Minimal lint configuration */\nexport { minimalConfig }\n\n// ============================================================================\n// Declaration Merging: Register dispersa's built-in rules in the type registry\n// ============================================================================\n\ndeclare module '../types' {\n interface RulesRegistry {\n 'dispersa/require-description': RequireDescriptionOptions\n 'dispersa/naming-convention': NamingConventionOptions\n 'dispersa/no-deprecated-usage': NoDeprecatedUsageOptions\n 'dispersa/no-duplicate-values': NoDuplicateValuesOptions\n 'dispersa/path-schema': PathSchemaConfig\n }\n}\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Lint output formatter interface and utilities\n */\n\nimport type { LintIssue, LintResult, LintFormatter } from '@lint/types'\n\n/**\n * Format lint results as JSON\n */\nexport const formatLintJson: LintFormatter = (result: LintResult): string => {\n return JSON.stringify(result, null, 2)\n}\n\n/**\n * Format lint results in a human-readable stylish format\n */\nexport const formatLintStylish: LintFormatter = (result: LintResult): string => {\n const lines: string[] = []\n\n if (result.issues.length === 0) {\n return '✓ No lint issues found'\n }\n\n // Group issues by token\n const byToken = new Map<string, LintIssue[]>()\n for (const issue of result.issues) {\n const existing = byToken.get(issue.tokenName) ?? []\n existing.push(issue)\n byToken.set(issue.tokenName, existing)\n }\n\n // Output issues\n for (const [tokenName, issues] of byToken) {\n lines.push(``)\n lines.push(` ${tokenName}`)\n for (const issue of issues) {\n const severity = issue.severity === 'error' ? '✖' : '⚠'\n const label = issue.severity === 'error' ? 'error' : 'warning'\n lines.push(` ${severity} ${label}: ${issue.message} [${issue.ruleId}]`)\n }\n }\n\n // Summary\n lines.push(``)\n if (result.errorCount > 0 || result.warningCount > 0) {\n const parts: string[] = []\n if (result.errorCount > 0) {\n parts.push(`${result.errorCount} error${result.errorCount === 1 ? '' : 's'}`)\n }\n if (result.warningCount > 0) {\n parts.push(`${result.warningCount} warning${result.warningCount === 1 ? '' : 's'}`)\n }\n lines.push(`✖ ${parts.join(', ')}`)\n }\n\n return lines.join('\\n')\n}\n\n/**\n * Format lint results for CI output (compact, parseable)\n */\nexport const formatLintCompact: LintFormatter = (result: LintResult): string => {\n const lines: string[] = []\n\n for (const issue of result.issues) {\n const severity = issue.severity.toUpperCase()\n lines.push(`${severity}: ${issue.ruleId} - ${issue.message} (token: ${issue.tokenName})`)\n }\n\n if (result.errorCount > 0 || result.warningCount > 0) {\n lines.push(`SUMMARY: ${result.errorCount} errors, ${result.warningCount} warnings`)\n }\n\n return lines.join('\\n')\n}\n"]}
package/dist/lint.js CHANGED
@@ -728,7 +728,15 @@ var PathSchemaMatcher = class {
728
728
  * DP[i][j] = can we match path[0..i) with pattern[0..j)?
729
729
  */
730
730
  matchPattern(pattern, pathSegments) {
731
- const patternParts = pattern.filter((p) => p.type === "segment" || p.type === "wildcard");
731
+ const patternParts = pattern.filter((p) => {
732
+ if (p.type === "segment" || p.type === "wildcard") {
733
+ return true;
734
+ }
735
+ if (p.type === "literal") {
736
+ return p.value !== "." && !/^\.+$/.test(p.value);
737
+ }
738
+ return false;
739
+ });
732
740
  const pathLen = pathSegments.length;
733
741
  const patternLen = patternParts.length;
734
742
  const dp = [];
@@ -785,6 +793,10 @@ var PathSchemaMatcher = class {
785
793
  if (part.type === "wildcard") {
786
794
  return true;
787
795
  }
796
+ if (part.type === "literal" && part.value !== void 0) {
797
+ const literalValue = part.value.replace(/^\.+|\.+$/g, "");
798
+ return literalValue === value;
799
+ }
788
800
  if (part.type === "segment" && part.name) {
789
801
  const segment = this.segments[part.name];
790
802
  if (!segment) {
package/dist/lint.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lint/create-rule.ts","../src/shared/errors/index.ts","../src/lint/plugin-loader.ts","../src/lint/lint-runner.ts","../src/lint/utils/glob-matcher.ts","../src/lint/utils/reference-extractor.ts","../src/lint/rules/naming-convention.ts","../src/lint/rules/no-deprecated-usage.ts","../src/lint/rules/no-duplicate-values.ts","../src/lint/rules/path-schema/matcher.ts","../src/lint/rules/path-schema/index.ts","../src/lint/rules/require-description.ts","../src/lint/rules/index.ts","../src/cli/formatters/lint-formatter.ts"],"names":["require"],"mappings":"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","file":"lint.js","sourcesContent":["/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Factory function for creating type-safe lint rules\n *\n * Use `createRule()` to define rules with full TypeScript inference\n * for message IDs and options.\n */\n\nimport type { LintRule } from './types'\n\n/**\n * Factory function for creating type-safe lint rules\n *\n * This function provides no runtime behavior - it simply returns the rule\n * as-is. Its purpose is to provide type inference and autocomplete for\n * message IDs and options.\n *\n * @template MessageIds - Union type of message IDs this rule can produce\n * @template Options - Rule-specific options type\n *\n * @param rule - The rule definition\n * @returns The same rule definition with full type inference\n *\n * @example\n * ```typescript\n * import { createRule } from 'dispersa/lint'\n *\n * export const requireDescription = createRule<\n * 'MISSING_DESCRIPTION' | 'TOO_SHORT',\n * { minLength?: number }\n * >({\n * meta: {\n * name: 'require-description',\n * description: 'Require tokens to have descriptions',\n * messages: {\n * MISSING_DESCRIPTION: \"Token '{{name}}' is missing a description\",\n * TOO_SHORT: \"Token '{{name}}' description is too short ({{length}} chars, min {{minLength}})\",\n * },\n * },\n * defaultOptions: { minLength: 10 },\n * create({ tokens, report, options }) {\n * for (const token of Object.values(tokens)) {\n * if (!token.$description) {\n * report({ token, messageId: 'MISSING_DESCRIPTION', data: { name: token.name } })\n * } else if (token.$description.length < options.minLength) {\n * report({\n * token,\n * messageId: 'TOO_SHORT',\n * data: { name: token.name, length: token.$description.length, minLength: options.minLength },\n * })\n * }\n * }\n * },\n * })\n * ```\n */\nexport function createRule<\n MessageIds extends string,\n Options extends Record<string, unknown> = Record<string, never>,\n>(rule: LintRule<MessageIds, Options>): LintRule<MessageIds, Options> {\n return rule\n}\n\n/**\n * Helper type for extracting options type from a rule\n *\n * @example\n * ```typescript\n * const myRule = createRule<'MSG', { format: string }>({ ... })\n * type MyOptions = RuleOptions<typeof myRule> // { format: string }\n * ```\n */\nexport type RuleOptions<T extends LintRule> = T extends LintRule<string, infer O> ? O : never\n\n/**\n * Helper type for extracting message IDs from a rule\n *\n * @example\n * ```typescript\n * const myRule = createRule<'MSG1' | 'MSG2', { format: string }>({ ... })\n * type MyMessages = RuleMessages<typeof myRule> // 'MSG1' | 'MSG2'\n * ```\n */\nexport type RuleMessages<T extends LintRule> =\n T extends LintRule<infer M, Record<string, unknown>> ? M : never\n","/**\n * @fileoverview Custom error classes for Dispersa\n *\n * Error classes are intentionally kept as simple value objects with no\n * imports from utility modules. Suggestion formatting is done at call\n * sites to keep the error hierarchy dependency-free.\n */\n\n/**\n * Base error class for all Dispersa errors\n */\nexport class DispersaError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'DispersaError'\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, this.constructor)\n }\n }\n}\n\n/**\n * Thrown when a token reference cannot be resolved\n *\n * @param referenceName - The token name that could not be found\n * @param suggestions - Similar token names for \"did you mean?\" hints\n * @param message - Optional custom message (overrides auto-generated message)\n */\nexport class TokenReferenceError extends DispersaError {\n constructor(\n public referenceName: string,\n public suggestions: string[] = [],\n message?: string,\n ) {\n const hint = TokenReferenceError.formatHint(suggestions)\n super(\n message ??\n `Token reference resolution failed: '${referenceName}'. Token does not exist.${hint}`,\n )\n this.name = 'TokenReferenceError'\n }\n\n private static formatHint(suggestions: string[]): string {\n if (suggestions.length === 0) {\n return ''\n }\n if (suggestions.length === 1) {\n return ` Did you mean \"${suggestions[0]}\"?`\n }\n const quoted = suggestions.map((s) => `\"${s}\"`)\n const last = quoted.pop()!\n return ` Did you mean ${quoted.join(', ')} or ${last}?`\n }\n}\n\n/**\n * Thrown when a circular reference is detected\n */\nexport class CircularReferenceError extends DispersaError {\n constructor(\n public tokenName: string,\n public referencePath: string[],\n ) {\n super(\n `Token resolution failed: '${tokenName}'. Circular reference detected in path: ${referencePath.join(' -> ')}`,\n )\n this.name = 'CircularReferenceError'\n }\n}\n\n/**\n * Thrown when validation fails\n */\nexport class ValidationError extends DispersaError {\n constructor(\n message: string,\n public errors: { message: string; path?: string }[],\n ) {\n super(message)\n this.name = 'ValidationError'\n }\n}\n\n/**\n * Thrown when file operations fail\n */\nexport class FileOperationError extends DispersaError {\n constructor(\n public operation: 'read' | 'write',\n public filePath: string,\n public originalError: Error,\n ) {\n super(`Failed to ${operation} file: ${filePath}. ${originalError.message}`)\n this.name = 'FileOperationError'\n }\n}\n\n/**\n * Thrown when a build configuration is invalid\n */\nexport class ConfigurationError extends DispersaError {\n constructor(message: string) {\n super(message)\n this.name = 'ConfigurationError'\n }\n}\n\n/**\n * Thrown when base permutation cannot be determined\n */\nexport class BasePermutationError extends DispersaError {\n constructor(\n message = 'Base permutation determination failed. Define a default modifier in resolver.',\n ) {\n super(message)\n this.name = 'BasePermutationError'\n }\n}\n\n/**\n * Thrown when an unknown modifier or context is used\n *\n * @param modifierName - Name of the modifier that failed validation\n * @param contextValue - The invalid context value (if applicable)\n * @param availableValues - Valid options (context names or modifier names) for the error message\n */\nexport class ModifierError extends DispersaError {\n constructor(\n public modifierName: string,\n public contextValue?: string,\n public availableValues: string[] = [],\n ) {\n const available = availableValues.length > 0 ? ` Available: ${availableValues.join(', ')}.` : ''\n\n const message =\n contextValue != null && contextValue !== ''\n ? `Modifier validation failed: '${modifierName}'. Invalid context '${contextValue}'.${available}`\n : `Modifier validation failed: '${modifierName}'. Modifier not defined in resolver.${available}`\n super(message)\n this.name = 'ModifierError'\n }\n}\n\n/**\n * Thrown when lint errors are found and failOnError is true\n *\n * @param issues - Array of lint issues that caused the error\n */\nexport class LintError extends DispersaError {\n constructor(\n public issues: Array<{\n ruleId: string\n severity: 'error' | 'warn'\n message: string\n tokenName: string\n tokenPath: string[]\n }>,\n ) {\n const errorCount = issues.filter((i) => i.severity === 'error').length\n const warningCount = issues.filter((i) => i.severity === 'warn').length\n super(`Lint failed with ${errorCount} error(s) and ${warningCount} warning(s).`)\n this.name = 'LintError'\n }\n}\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Plugin loader for lint plugins\n *\n * Supports loading plugins from:\n * - Inline plugin objects\n * - String module paths (package names or file paths)\n */\n\nimport { createRequire } from 'node:module'\nimport { isAbsolute, resolve } from 'node:path'\nimport process from 'node:process'\n\nimport { ConfigurationError } from '@shared/errors'\nimport { createJiti } from 'jiti'\n\nimport type { LintPlugin } from './types'\n\nexport type PluginLoaderOptions = {\n /**\n * Base directory for resolving relative plugin paths\n * @default process.cwd()\n */\n cwd?: string\n}\n\n/**\n * Loads lint plugins from various sources\n *\n * Handles:\n * - Inline `LintPlugin` objects (returned as-is)\n * - Package names (e.g., '@dispersa/lint-plugin-a11y')\n * - Relative file paths (e.g., './plugins/my-plugin.ts')\n * - Absolute file paths\n *\n * @security **Warning**: Loading plugins from external packages or file paths\n * executes arbitrary code. Only load plugins from trusted sources.\n * For programmatic usage, prefer passing plugin objects directly rather than\n * strings that trigger dynamic imports.\n *\n * @example\n * ```typescript\n * const loader = new PluginLoader({ cwd: process.cwd() })\n *\n * // Load from inline object\n * const plugin1 = await loader.load(myPlugin)\n *\n * // Load from package\n * const plugin2 = await loader.load('@dispersa/lint-plugin-a11y')\n *\n * // Load from file\n * const plugin3 = await loader.load('./plugins/custom.ts')\n * ```\n */\nexport class PluginLoader {\n private cwd: string\n private jiti: ReturnType<typeof createJiti> | null = null\n private cache: Map<string, LintPlugin> = new Map()\n\n constructor(options: PluginLoaderOptions = {}) {\n this.cwd = options.cwd ?? process.cwd()\n }\n\n /**\n * Load a plugin from an inline object or module path\n *\n * @param source - Plugin object or module path string\n * @returns Loaded plugin\n * @throws {ConfigurationError} If plugin cannot be loaded or is invalid\n */\n async load(source: LintPlugin | string): Promise<LintPlugin> {\n // Inline plugin object - return as-is\n if (this.isPluginObject(source)) {\n this.validatePlugin(source)\n return source\n }\n\n // String path - load module\n const modulePath = source as string\n const cached = this.cache.get(modulePath)\n if (cached) {\n return cached\n }\n\n const plugin = await this.loadFromModule(modulePath)\n this.validatePlugin(plugin)\n this.cache.set(modulePath, plugin)\n return plugin\n }\n\n /**\n * Load multiple plugins\n *\n * @param plugins - Record of namespace to plugin source\n * @returns Record of namespace to loaded plugin\n */\n async loadAll(plugins: Record<string, LintPlugin | string>): Promise<Record<string, LintPlugin>> {\n const entries = Object.entries(plugins)\n const loaded = await Promise.all(\n entries.map(async ([namespace, source]) => [namespace, await this.load(source)] as const),\n )\n return Object.fromEntries(loaded)\n }\n\n /**\n * Check if source is an inline plugin object\n */\n private isPluginObject(source: LintPlugin | string): source is LintPlugin {\n return typeof source !== 'string'\n }\n\n /**\n * Load a plugin from a module path\n */\n private async loadFromModule(modulePath: string): Promise<LintPlugin> {\n // Resolve relative paths from cwd\n const resolvedPath = isAbsolute(modulePath) ? modulePath : resolve(this.cwd, modulePath)\n\n // Check if it's a file path or package name\n const isFilePath =\n modulePath.startsWith('./') || modulePath.startsWith('../') || isAbsolute(modulePath)\n\n try {\n if (isFilePath) {\n return await this.loadFromFile(resolvedPath)\n }\n return await this.loadFromPackage(modulePath)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n throw new ConfigurationError(`Failed to load lint plugin '${modulePath}': ${message}`)\n }\n }\n\n /**\n * Load a plugin from a file path using jiti (supports TypeScript)\n */\n private async loadFromFile(filePath: string): Promise<LintPlugin> {\n this.jiti ??= createJiti(this.cwd, {\n interopDefault: true,\n })\n\n const loaded = await this.jiti(filePath)\n const plugin = this.extractPlugin(loaded)\n\n if (!plugin) {\n throw new ConfigurationError(`Plugin file '${filePath}' does not export a valid LintPlugin`)\n }\n\n return plugin\n }\n\n /**\n * Load a plugin from a package name\n */\n private async loadFromPackage(packageName: string): Promise<LintPlugin> {\n // Try to require the package\n const require = createRequire(this.cwd)\n\n let resolvedPath: string\n try {\n resolvedPath = require.resolve(packageName, { paths: [this.cwd] })\n } catch {\n // Fallback: try from this module's location\n try {\n resolvedPath = require.resolve(packageName)\n } catch {\n throw new ConfigurationError(\n `Cannot find package '${packageName}'. Make sure it is installed.`,\n )\n }\n }\n\n // Use jiti to support ESM/CJS interoperability\n this.jiti ??= createJiti(this.cwd, {\n interopDefault: true,\n })\n\n const loaded = await this.jiti(resolvedPath)\n const plugin = this.extractPlugin(loaded)\n\n if (!plugin) {\n throw new ConfigurationError(`Package '${packageName}' does not export a valid LintPlugin`)\n }\n\n return plugin\n }\n\n /**\n * Extract plugin from loaded module\n *\n * Supports multiple export patterns:\n * - export default plugin\n * - export const plugin = {...}\n * - module.exports = plugin (CJS)\n */\n private extractPlugin(loaded: unknown): LintPlugin | null {\n if (!loaded || typeof loaded !== 'object') {\n return null\n }\n\n const module = loaded as Record<string, unknown>\n\n // Priority 1: default export\n if (module.default && this.isValidPluginStructure(module.default)) {\n return module.default as LintPlugin\n }\n\n // Priority 2: named export 'plugin'\n if (module.plugin && this.isValidPluginStructure(module.plugin)) {\n return module.plugin as LintPlugin\n }\n\n // Priority 3: module is the plugin itself (CJS module.exports = plugin)\n if (this.isValidPluginStructure(loaded)) {\n return loaded as LintPlugin\n }\n\n return null\n }\n\n /**\n * Check if object has required plugin structure\n */\n private isValidPluginStructure(obj: unknown): boolean {\n if (!obj || typeof obj !== 'object') {\n return false\n }\n\n const plugin = obj as Record<string, unknown>\n const rules = plugin.rules as Record<string, unknown> | undefined\n\n if (\n plugin.meta === undefined ||\n typeof plugin.meta !== 'object' ||\n !(plugin.meta as Record<string, unknown>).name ||\n rules === undefined ||\n Object.keys(rules).length === 0\n ) {\n return false\n }\n\n return true\n }\n\n /**\n * Validate a loaded plugin\n */\n private validatePlugin(plugin: LintPlugin): void {\n if (!plugin.meta) {\n throw new ConfigurationError('Lint plugin must have a meta property with name')\n }\n\n if (!plugin.meta.name) {\n throw new ConfigurationError('Lint plugin meta.name is required')\n }\n\n if (\n !plugin.rules ||\n typeof plugin.rules !== 'object' ||\n Object.keys(plugin.rules).length === 0\n ) {\n throw new ConfigurationError(\n `Lint plugin '${plugin.meta.name}' must have a non-empty rules object`,\n )\n }\n\n // Validate each rule\n for (const [ruleName, rule] of Object.entries(plugin.rules)) {\n if (!rule.meta) {\n throw new ConfigurationError(\n `Rule '${ruleName}' in plugin '${plugin.meta.name}' is missing meta property`,\n )\n }\n if (!rule.meta.messages || typeof rule.meta.messages !== 'object') {\n throw new ConfigurationError(\n `Rule '${ruleName}' in plugin '${plugin.meta.name}' is missing meta.messages`,\n )\n }\n if (typeof rule.create !== 'function') {\n throw new ConfigurationError(\n `Rule '${ruleName}' in plugin '${plugin.meta.name}' is missing create function`,\n )\n }\n }\n }\n\n /**\n * Clear the plugin cache\n */\n clearCache(): void {\n this.cache.clear()\n }\n}\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Lint runner that executes rules in parallel against tokens\n *\n * The lint runner is responsible for:\n * - Loading plugins and resolving rule configurations\n * - Executing rules in parallel for performance\n * - Collecting and aggregating lint issues\n * - Interpolating message templates with data\n */\n\nimport type { InternalResolvedTokens, TokenType } from '@tokens/types'\n\nimport { PluginLoader } from './plugin-loader'\nimport type {\n AnyLintRule,\n LintConfig,\n LintIssue,\n LintPlugin,\n LintReportDescriptor,\n LintResult,\n LintRuleContext,\n ResolvedLintConfig,\n ResolvedRuleConfig,\n RuleConfig,\n} from './types'\n\nexport type LintRunnerOptions = LintConfig & {\n /** Callback for runner warnings (e.g. unknown rule). Defaults to console.warn. */\n onWarn?: (message: string) => void\n}\n\n/**\n * Executes lint rules against a set of tokens\n *\n * @example\n * ```typescript\n * const config: LintConfig = {\n * plugins: {\n * dispersa: dispersaPlugin,\n * },\n * rules: {\n * 'dispersa/require-description': 'warn',\n * 'dispersa/naming-convention': ['error', { format: 'kebab-case' }],\n * },\n * }\n *\n * const runner = new LintRunner(config)\n * const result = await runner.run(tokens)\n *\n * console.log(`Found ${result.errorCount} errors, ${result.warningCount} warnings`)\n * ```\n */\nexport class LintRunner {\n private config: LintRunnerOptions\n private pluginLoader: PluginLoader\n private resolvedConfig: ResolvedLintConfig | null = null\n private warn: (message: string) => void\n\n constructor(config: LintRunnerOptions) {\n this.config = config\n this.pluginLoader = new PluginLoader()\n this.warn = config.onWarn ?? console.warn\n }\n\n /**\n * Run all configured rules against the provided tokens\n *\n * Rules are executed in parallel for performance. Issues are collected\n * and returned with counts by severity.\n *\n * @param tokens - Resolved tokens to lint\n * @returns Lint result with issues and counts\n */\n async run(tokens: InternalResolvedTokens): Promise<LintResult> {\n this.resolvedConfig ??= await this.resolveConfig()\n\n const { rules, plugins } = this.resolvedConfig\n const issues: LintIssue[] = []\n\n if (Object.keys(rules).length === 0) {\n return { issues: [], errorCount: 0, warningCount: 0 }\n }\n\n const rulePromises = Object.entries(rules).map(async ([ruleId, ruleConfig]) => {\n const { severity, options } = ruleConfig\n\n const rule = this.resolveRule(ruleId, plugins)\n if (!rule) {\n this.warn(`[lint] Unknown rule '${ruleId}' - no plugin provides this rule`)\n return []\n }\n\n const reports: LintReportDescriptor<string>[] = []\n const applicableTokens = this.filterTokensByAppliesTo(tokens, rule.meta.appliesTo)\n const mergedOptions = rule.defaultOptions ? { ...rule.defaultOptions, ...options } : options\n\n const context: LintRuleContext<string, Record<string, unknown>> = {\n id: ruleId,\n options: mergedOptions,\n tokens: applicableTokens,\n report: (descriptor) => {\n reports.push(descriptor)\n },\n }\n\n try {\n await rule.create(context)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return [\n {\n ruleId: 'lint/rule-error',\n severity: 'error' as const,\n message: `Rule '${ruleId}' failed: ${message}`,\n tokenName: '(rule execution)',\n tokenPath: [],\n },\n ]\n }\n\n return reports.map((report) => {\n const messageTemplate = rule.meta.messages[report.messageId]\n const message = messageTemplate\n ? this.interpolateMessage(messageTemplate, report.data)\n : report.messageId\n\n return {\n ruleId,\n severity,\n message,\n tokenName: report.token.name,\n tokenPath: report.token.path,\n }\n })\n })\n\n const allIssues = await Promise.all(rulePromises)\n issues.push(...allIssues.flat())\n\n const errorCount = issues.filter((i) => i.severity === 'error').length\n const warningCount = issues.filter((i) => i.severity === 'warn').length\n\n return { issues, errorCount, warningCount }\n }\n\n /**\n * Resolve configuration: load plugins, parse rule configs\n */\n private async resolveConfig(): Promise<ResolvedLintConfig> {\n const { plugins: pluginSources = {}, rules: ruleConfigs = {} } = this.config\n\n const plugins = await this.pluginLoader.loadAll(pluginSources)\n\n const rules: Record<string, ResolvedRuleConfig> = {}\n\n for (const [ruleId, config] of Object.entries(ruleConfigs)) {\n const resolved = this.resolveRuleConfig(config)\n if (resolved) {\n rules[ruleId] = resolved\n }\n }\n\n return {\n enabled: true,\n failOnError: this.config.failOnError ?? true,\n plugins,\n rules,\n }\n }\n\n private filterTokensByAppliesTo(\n tokens: InternalResolvedTokens,\n appliesTo: TokenType[] | 'all' | undefined,\n ): InternalResolvedTokens {\n if (!appliesTo || appliesTo === 'all') {\n return tokens\n }\n\n const filtered: InternalResolvedTokens = {}\n for (const [name, token] of Object.entries(tokens)) {\n if (token.$type && appliesTo.includes(token.$type)) {\n filtered[name] = token\n }\n }\n return filtered\n }\n\n /**\n * Parse rule configuration into resolved format\n */\n private resolveRuleConfig(config: RuleConfig): ResolvedRuleConfig | null {\n // Shorthand: severity only\n if (typeof config === 'string') {\n if (config === 'off') {\n return null\n }\n return { severity: config, options: {} }\n }\n\n // Longhand: [severity, options]\n const [severity, options = {}] = config\n if (severity === 'off') {\n return null\n }\n\n return { severity, options }\n }\n\n /**\n * Resolve a rule from plugins by rule ID\n *\n * Rule IDs are formatted as 'namespace/rule-name'\n */\n private resolveRule(ruleId: string, plugins: Record<string, LintPlugin>): AnyLintRule | null {\n const separatorIndex = ruleId.indexOf('/')\n if (separatorIndex === -1) {\n return null\n }\n\n const namespace = ruleId.slice(0, separatorIndex)\n const ruleName = ruleId.slice(separatorIndex + 1)\n\n const plugin = plugins[namespace]\n if (!plugin) {\n return null\n }\n\n return plugin.rules[ruleName] ?? null\n }\n\n /**\n * Interpolate message template with data\n *\n * Replaces {{key}} placeholders with values from data\n */\n private interpolateMessage(template: string, data?: Record<string, string | number>): string {\n if (!data) {\n return template\n }\n\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => {\n const value = data[key]\n return value !== undefined ? String(value) : `{{${key}}}`\n })\n }\n\n /**\n * Clear the plugin cache\n */\n clearCache(): void {\n this.pluginLoader.clearCache()\n this.resolvedConfig = null\n }\n}\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Shared glob pattern matching utilities for lint rules\n *\n * Provides bounded caching to prevent memory leaks in long-running processes.\n */\n\nconst MAX_CACHE_SIZE = 1000\n\nconst cache = new Map<string, RegExp>()\n\n/**\n * Convert a glob pattern to a RegExp\n *\n * Supports `*` as a wildcard that matches any characters.\n * Results are cached with a bounded cache to prevent memory leaks.\n *\n * @param pattern - Glob pattern (e.g., 'color-*', '*.primary')\n * @returns Compiled RegExp\n *\n * @example\n * ```typescript\n * const regex = globToRegex('color-*')\n * regex.test('color-primary') // true\n * regex.test('spacing-base') // false\n * ```\n */\nexport function globToRegex(pattern: string): RegExp {\n const cached = cache.get(pattern)\n if (cached) {\n cache.delete(pattern)\n cache.set(pattern, cached)\n return cached\n }\n\n const regex = new RegExp(\n '^' +\n pattern\n .split('*')\n .map((part) => part.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n .join('.*') +\n '$',\n )\n\n if (cache.size >= MAX_CACHE_SIZE) {\n const oldest = cache.keys().next().value\n if (oldest !== undefined) {\n cache.delete(oldest)\n }\n }\n\n cache.set(pattern, regex)\n return regex\n}\n\n/**\n * Check if a name matches any of the given glob patterns\n *\n * @param name - String to test\n * @param patterns - Array of glob patterns\n * @returns true if name matches any pattern\n *\n * @example\n * ```typescript\n * matchesGlob('color-primary', ['color-*', 'spacing-*']) // true\n * matchesGlob('typography-base', ['color-*']) // false\n * ```\n */\nexport function matchesGlob(name: string, patterns: string[]): boolean {\n return patterns.some((pattern) => globToRegex(pattern).test(name))\n}\n\n/**\n * Clear the glob pattern cache\n *\n * Useful for testing or when memory needs to be reclaimed.\n */\nexport function clearGlobCache(): void {\n cache.clear()\n}\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Utility for extracting token references from values\n *\n * Used by rules that need to detect references to other tokens,\n * such as no-deprecated-usage.\n */\n\nconst ALIAS_PATTERN = /\\{([^}]+)\\}/g\n\n/**\n * Extract all token references from a value\n *\n * Recursively traverses objects and arrays to find all references\n * in the form `{token.name}`.\n *\n * @param value - Value to extract references from\n * @returns Array of referenced token names\n *\n * @example\n * ```typescript\n * extractReferences('{color.primary}') // ['color.primary']\n * extractReferences('{color.base.primary}') // ['color.base.primary']\n * extractReferences('border: {border.width} solid {color.border}') // ['border.width', 'color.border']\n * extractReferences({ value: '{spacing.md}', nested: { ref: '{spacing.lg}' } }) // ['spacing.md', 'spacing.lg']\n * ```\n */\nexport function extractReferences(value: unknown): string[] {\n const refs: string[] = []\n\n if (typeof value === 'string') {\n let match\n ALIAS_PATTERN.lastIndex = 0\n while ((match = ALIAS_PATTERN.exec(value)) !== null) {\n if (match[1]) {\n refs.push(match[1])\n }\n }\n } else if (Array.isArray(value)) {\n for (const item of value) {\n refs.push(...extractReferences(item))\n }\n } else if (typeof value === 'object' && value !== null) {\n for (const v of Object.values(value as Record<string, unknown>)) {\n refs.push(...extractReferences(v))\n }\n }\n\n return refs\n}\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Rule: naming-convention\n *\n * Enforces consistent token naming conventions.\n */\n\nimport { createRule } from '@lint/create-rule'\nimport { matchesGlob } from '@lint/utils'\n\nexport const NamingConventionMessages = {\n INVALID_FORMAT: 'INVALID_FORMAT',\n INVALID_SEGMENT: 'INVALID_SEGMENT',\n} as const\n\nexport type NamingConventionOptions = {\n /**\n * Naming format to enforce\n * - 'kebab-case': color-brand-primary, red-500, blue-600\n * - 'camelCase': colorBrandPrimary\n * - 'PascalCase': ColorBrandPrimary\n * - 'snake_case': color_brand_primary\n * - 'screaming-snake': COLOR_BRAND_PRIMARY\n */\n format?: 'kebab-case' | 'camelCase' | 'PascalCase' | 'snake_case' | 'screaming-snake'\n /** Token name patterns to ignore (glob patterns) */\n ignore?: string[]\n /** Custom regex pattern to validate against */\n pattern?: string\n /**\n * Allow purely numeric path segments (e.g., spacing.0, spacing.1)\n * Common in design system scales. Default: true\n */\n allowNumericSegments?: boolean\n}\n\nconst PATTERNS: Record<string, RegExp> = {\n 'kebab-case': /^([a-z][a-z0-9]*)(-[a-z0-9]+)*$/,\n camelCase: /^[a-z][a-zA-Z0-9]*$/,\n PascalCase: /^[A-Z][a-zA-Z0-9]*$/,\n snake_case: /^([a-z][a-z0-9]*)(_[a-z0-9]+)*$/,\n 'screaming-snake': /^([A-Z][A-Z0-9]*)(_[A-Z0-9]+)*$/,\n}\n\nconst DEFAULT_PATTERN = /^[a-z][a-z0-9]*(-[a-z][a-z0-9]*)*$/\n\nexport const namingConvention = createRule<\n (typeof NamingConventionMessages)[keyof typeof NamingConventionMessages],\n NamingConventionOptions\n>({\n meta: {\n name: 'naming-convention',\n description: 'Enforce consistent token naming conventions',\n messages: {\n INVALID_FORMAT: \"Token '{{name}}' does not match '{{format}}' format\",\n INVALID_SEGMENT:\n \"Segment '{{segment}}' in token '{{name}}' does not match '{{format}}' format\",\n },\n },\n defaultOptions: { format: 'kebab-case', allowNumericSegments: true },\n create({ tokens, options, report }) {\n const format = options.format ?? 'kebab-case'\n const ignore = options.ignore ?? []\n const customPattern = options.pattern\n const allowNumericSegments = options.allowNumericSegments ?? true\n\n // Use custom pattern if provided, otherwise use built-in format\n let segmentPattern: RegExp\n if (customPattern) {\n segmentPattern = new RegExp(customPattern)\n } else {\n segmentPattern = PATTERNS[format] ?? DEFAULT_PATTERN\n }\n\n // Pattern for pure numeric segments (common in design systems: spacing.0, spacing.1)\n const numericPattern = /^\\d+$/\n\n for (const token of Object.values(tokens)) {\n // Skip ignored tokens\n if (ignore.length > 0 && matchesGlob(token.name, ignore)) {\n continue\n }\n\n // Check each path segment\n const segments = token.path\n let hasError = false\n\n for (const segment of segments) {\n // Allow pure numeric segments if option is enabled\n if (allowNumericSegments && numericPattern.test(segment)) {\n continue\n }\n\n if (!segmentPattern.test(segment)) {\n report({\n token,\n messageId: 'INVALID_SEGMENT',\n data: { name: token.name, segment, format: customPattern ?? format },\n })\n hasError = true\n break\n }\n }\n\n // If no segment errors, also check full name for custom patterns\n if (!hasError && customPattern && !segmentPattern.test(token.name)) {\n report({\n token,\n messageId: 'INVALID_FORMAT',\n data: { name: token.name, format: customPattern },\n })\n }\n }\n },\n})\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Rule: no-deprecated-usage\n *\n * Warns when tokens reference deprecated tokens.\n */\n\nimport { createRule } from '@lint/create-rule'\nimport { extractReferences, matchesGlob } from '@lint/utils'\n\nexport const NoDeprecatedUsageMessages = {\n REFERENCES_DEPRECATED: 'REFERENCES_DEPRECATED',\n} as const\n\nexport type NoDeprecatedUsageOptions = {\n /** Token name patterns to ignore (glob patterns) */\n ignore?: string[]\n}\n\nexport const noDeprecatedUsage = createRule<\n (typeof NoDeprecatedUsageMessages)[keyof typeof NoDeprecatedUsageMessages],\n NoDeprecatedUsageOptions\n>({\n meta: {\n name: 'no-deprecated-usage',\n description: 'Disallow references to deprecated tokens',\n messages: {\n REFERENCES_DEPRECATED: \"Token '{{name}}' references deprecated token '{{ref}}'. {{reason}}\",\n },\n },\n defaultOptions: {},\n create({ tokens, options, report }) {\n const ignore = options.ignore ?? []\n\n // Build set of deprecated tokens\n const deprecatedTokens = new Map<string, string | true>()\n for (const token of Object.values(tokens)) {\n if (token.$deprecated) {\n const reason = typeof token.$deprecated === 'string' ? token.$deprecated : ''\n deprecatedTokens.set(token.name, reason || true)\n }\n }\n\n // If no deprecated tokens, nothing to check\n if (deprecatedTokens.size === 0) {\n return\n }\n\n for (const token of Object.values(tokens)) {\n // Skip ignored tokens\n if (ignore.length > 0 && matchesGlob(token.name, ignore)) {\n continue\n }\n\n // Skip deprecated tokens themselves\n if (deprecatedTokens.has(token.name)) {\n continue\n }\n\n // Extract references from original value\n const refs = extractReferences(token.originalValue)\n\n for (const ref of refs) {\n const deprecation = deprecatedTokens.get(ref)\n if (deprecation) {\n const reason = deprecation === true ? '' : `(${deprecation})`\n report({\n token,\n messageId: 'REFERENCES_DEPRECATED',\n data: { name: token.name, ref, reason },\n })\n }\n }\n }\n },\n})\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Rule: no-duplicate-values\n *\n * Detects tokens with duplicate values (excluding aliases).\n */\n\nimport { createRule } from '@lint/create-rule'\nimport { matchesGlob } from '@lint/utils'\n\nexport const NoDuplicateValuesMessages = {\n DUPLICATE_VALUE: 'DUPLICATE_VALUE',\n} as const\n\nexport type NoDuplicateValuesOptions = {\n /** Token name patterns to ignore (glob patterns) */\n ignore?: string[]\n /** Only check specific token types */\n types?: string[]\n}\n\nfunction valueKey(value: unknown): string {\n if (value === null) {\n return 'null'\n }\n if (value === undefined) {\n return 'undefined'\n }\n if (typeof value === 'object') {\n return JSON.stringify(sortKeys(value))\n }\n return String(value)\n}\n\nfunction sortKeys(obj: unknown): unknown {\n if (Array.isArray(obj)) {\n return obj.map(sortKeys)\n }\n if (typeof obj === 'object' && obj !== null) {\n const sorted: Record<string, unknown> = {}\n for (const key of Object.keys(obj).sort()) {\n sorted[key] = sortKeys((obj as Record<string, unknown>)[key])\n }\n return sorted\n }\n return obj\n}\n\nexport const noDuplicateValues = createRule<\n (typeof NoDuplicateValuesMessages)[keyof typeof NoDuplicateValuesMessages],\n NoDuplicateValuesOptions\n>({\n meta: {\n name: 'no-duplicate-values',\n description: 'Detect tokens with duplicate values (excluding aliases)',\n messages: {\n DUPLICATE_VALUE:\n \"Token '{{name}}' has the same value as '{{duplicate}}'. Consider using an alias instead.\",\n },\n },\n defaultOptions: {},\n create({ tokens, options, report }) {\n const ignore = options.ignore ?? []\n const types = options.types\n\n const valueMap = new Map<string, (typeof tokens)[string][]>()\n\n for (const token of Object.values(tokens)) {\n if (ignore.length > 0 && matchesGlob(token.name, ignore)) {\n continue\n }\n\n if (token._isAlias) {\n continue\n }\n\n if (types && types.length > 0 && !types.includes(token.$type ?? '')) {\n continue\n }\n\n const key = valueKey(token.$value)\n const existing = valueMap.get(key)\n if (existing) {\n existing.push(token)\n } else {\n valueMap.set(key, [token])\n }\n }\n\n for (const tokenList of valueMap.values()) {\n if (tokenList.length > 1) {\n const first = tokenList[0]\n if (!first) {\n continue\n }\n\n for (let i = 1; i < tokenList.length; i++) {\n const current = tokenList[i]\n if (current) {\n report({\n token: current,\n messageId: 'DUPLICATE_VALUE',\n data: { name: current.name, duplicate: first.name },\n })\n }\n }\n }\n }\n },\n})\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Path schema matcher implementation\n */\n\nimport { matchesGlob } from '@lint/utils'\nimport type { ResolvedToken } from '@tokens/types'\n\nimport type { PathSchemaConfig, SegmentDefinition, TransitionRule } from './types'\n\nexport type Violation = {\n type: 'INVALID_PATH' | 'UNKNOWN_SEGMENT' | 'FORBIDDEN_TRANSITION'\n data: Record<string, string | number>\n}\n\ntype Pattern = string | string[] | RegExp\n\ntype CompiledPattern = Array<\n { type: 'segment'; name: string } | { type: 'literal'; value: string } | { type: 'wildcard' }\n>\n\ntype CompiledTransition = {\n from: Pattern\n to: Pattern\n allow: boolean\n}\n\nexport { matchesGlob }\n\n/**\n * Compiles and validates token paths against a schema\n */\nexport class PathSchemaMatcher {\n private segments: Record<string, SegmentDefinition>\n private pathPatterns: CompiledPattern[]\n private transitionRules: CompiledTransition[]\n\n constructor(config: PathSchemaConfig) {\n this.segments = config.segments ?? {}\n this.pathPatterns = this.compilePaths(config.paths ?? [], this.segments)\n this.transitionRules = this.compileTransitions(config.transitions ?? [])\n }\n\n /**\n * Validate a token against the schema\n */\n validate(token: ResolvedToken): Violation[] {\n const violations: Violation[] = []\n const pathSegments = token.path\n const hasPaths = this.pathPatterns.length > 0\n const hasTransitions = this.transitionRules.length > 0\n\n // Check transitions if defined\n if (hasTransitions) {\n const transitionViolations = this.validateTransitions(pathSegments, token.name)\n violations.push(...transitionViolations)\n }\n\n // Check against path patterns if defined\n if (hasPaths) {\n const matchesAny = this.pathPatterns.some((p) => this.matchPattern(p, pathSegments))\n if (!matchesAny) {\n violations.push({\n type: 'INVALID_PATH',\n data: { path: token.name },\n })\n }\n }\n\n return violations\n }\n\n /**\n * Validate transitions between segments.\n *\n * Deny rules are checked independently (any match = violation).\n * Allow rules use OR semantics: at least one must match.\n */\n private validateTransitions(segments: string[], tokenName: string): Violation[] {\n const violations: Violation[] = []\n\n for (let i = 0; i < segments.length - 1; i++) {\n const from = segments[i]\n const to = segments[i + 1]\n\n if (!from || !to) {\n continue\n }\n\n const applicableRules = this.transitionRules.filter((r) => this.matchesPattern(from, r.from))\n\n if (applicableRules.length === 0) {\n continue\n }\n\n const denyRules = applicableRules.filter((r) => r.allow === false)\n const allowRules = applicableRules.filter((r) => r.allow !== false)\n\n for (const rule of denyRules) {\n if (this.matchesPattern(to, rule.to)) {\n violations.push({\n type: 'FORBIDDEN_TRANSITION',\n data: { from, to, path: tokenName },\n })\n }\n }\n\n if (allowRules.length > 0) {\n const anyAllowMatches = allowRules.some((r) => this.matchesPattern(to, r.to))\n if (!anyAllowMatches) {\n violations.push({\n type: 'FORBIDDEN_TRANSITION',\n data: { from, to, path: tokenName },\n })\n }\n }\n }\n\n return violations\n }\n\n /**\n * Check if a value matches a pattern\n */\n private matchesPattern(value: string, pattern: Pattern): boolean {\n if (typeof pattern === 'string') {\n return value === pattern\n }\n if (Array.isArray(pattern)) {\n return pattern.includes(value)\n }\n return pattern.test(value)\n }\n\n /**\n * Compile path patterns into matcher structures\n */\n private compilePaths(\n patterns: string[],\n segments: Record<string, SegmentDefinition>,\n ): CompiledPattern[] {\n return patterns.map((p) => this.parsePattern(p, segments))\n }\n\n /**\n * Parse a path pattern string into compiled form\n * - `{name}` is a segment placeholder\n * - `*` is a wildcard that matches any single segment\n * - `.` is the path separator (implicit between segments)\n */\n private parsePattern(\n pattern: string,\n _segments: Record<string, SegmentDefinition>,\n ): CompiledPattern {\n const parts: CompiledPattern = []\n const regex = /\\{(\\w+)\\}|(\\*)|([^{}*]+)/g\n let match\n\n while ((match = regex.exec(pattern)) !== null) {\n if (match[1]) {\n parts.push({ type: 'segment', name: match[1] })\n } else if (match[2]) {\n parts.push({ type: 'wildcard' })\n } else if (match[3]) {\n parts.push({ type: 'literal', value: match[3] })\n }\n }\n\n return parts\n }\n\n /**\n * Match path segments against a compiled pattern using dynamic programming.\n * Supports optional segments via DP table.\n *\n * DP[i][j] = can we match path[0..i) with pattern[0..j)?\n */\n private matchPattern(pattern: CompiledPattern, pathSegments: string[]): boolean {\n // Extract pattern parts that consume segments (segments + wildcards)\n const patternParts = pattern.filter((p) => p.type === 'segment' || p.type === 'wildcard')\n const pathLen = pathSegments.length\n const patternLen = patternParts.length\n\n // DP table: dp[i][j] = can we match first i path segments with first j pattern parts?\n // Initialize with false values\n const dp: boolean[][] = []\n for (let i = 0; i <= pathLen; i++) {\n dp[i] = []\n for (let j = 0; j <= patternLen; j++) {\n dp[i]![j] = false\n }\n }\n\n // Base case: empty path matches empty pattern\n dp[0]![0] = true\n\n // Fill DP table\n for (let i = 0; i <= pathLen; i++) {\n for (let j = 0; j <= patternLen; j++) {\n const currentState = dp[i]![j]\n if (!currentState) {\n continue\n }\n\n // If we've consumed all path segments, we can still skip remaining optional pattern parts\n if (i === pathLen) {\n // Can skip remaining optional pattern parts\n if (j < patternLen && this.isPartOptional(patternParts[j]!)) {\n dp[i]![j + 1] = true\n }\n continue\n }\n\n // If we've consumed all pattern parts, we can only continue if path is also exhausted\n if (j === patternLen) {\n if (i === pathLen) {\n dp[i]![j] = true\n }\n continue\n }\n\n const part = patternParts[j]!\n\n // ALWAYS try to match current path segment with current pattern part first\n if (i < pathLen && this.matchPatternPart(part, pathSegments[i]!)) {\n dp[i + 1]![j + 1] = true\n }\n\n // THEN try skipping current pattern part if it's optional\n // (this is separate from matching - both can be valid)\n if (this.isPartOptional(part)) {\n dp[i]![j + 1] = true\n }\n }\n }\n\n // Path matches if we can reach any state where both path and pattern are consumed\n return dp[pathLen]![patternLen] ?? false\n }\n\n /**\n * Check if a pattern part is optional based on its segment definition\n */\n private isPartOptional(part: { type: string; name?: string }): boolean {\n if (part.type !== 'segment' || !part.name) {\n return false // Wildcards are not optional\n }\n const segmentDef = this.segments[part.name]\n return segmentDef?.optional ?? false\n }\n\n /**\n * Match a single pattern part against a path segment value\n */\n private matchPatternPart(\n part: { type: string; name?: string; value?: string },\n value: string,\n ): boolean {\n if (part.type === 'wildcard') {\n return true\n }\n\n if (part.type === 'segment' && part.name) {\n const segment = this.segments[part.name]\n if (!segment) {\n return true\n }\n return this.matchesSegmentDefinition(value, segment)\n }\n\n return false\n }\n\n /**\n * Check if a value matches a segment definition\n */\n private matchesSegmentDefinition(value: string, definition: SegmentDefinition): boolean {\n const { values } = definition\n if (Array.isArray(values)) {\n return values.some((v) => (typeof v === 'string' ? v === value : v.test(value)))\n }\n return values.test(value)\n }\n\n /**\n * Compile transition rules\n */\n private compileTransitions(transitions: TransitionRule[]): CompiledTransition[] {\n return transitions.map((t) => ({\n from: t.from,\n to: t.to,\n allow: t.allow ?? true,\n }))\n }\n}\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Rule: path-schema\n *\n * Enforces token path structure using segment definitions and patterns.\n */\n\nimport { createRule } from '@lint/create-rule'\n\nimport { PathSchemaMatcher, matchesGlob } from './matcher'\nimport type { PathSchemaConfig } from './types'\n\nexport { type PathSchemaConfig, type SegmentDefinition, type TransitionRule } from './types'\n\nexport const PathSchemaMessages = {\n INVALID_PATH: 'INVALID_PATH',\n UNKNOWN_SEGMENT: 'UNKNOWN_SEGMENT',\n FORBIDDEN_TRANSITION: 'FORBIDDEN_TRANSITION',\n} as const\n\nexport const pathSchema = createRule<\n (typeof PathSchemaMessages)[keyof typeof PathSchemaMessages],\n PathSchemaConfig\n>({\n meta: {\n name: 'path-schema',\n description: 'Enforce token path segment structure',\n messages: {\n INVALID_PATH: \"Token path '{{path}}' does not match any defined pattern\",\n UNKNOWN_SEGMENT: \"Segment '{{segment}}' at position {{position}} in '{{path}}' is not valid\",\n FORBIDDEN_TRANSITION: \"Segment '{{to}}' cannot follow '{{from}}' in path '{{path}}'\",\n },\n },\n defaultOptions: {\n segments: {},\n paths: [],\n transitions: [],\n },\n create({ tokens, options, report }) {\n const ignore = options.ignore ?? []\n\n // Skip if no patterns or transitions defined\n if (\n (!options.paths || options.paths.length === 0) &&\n (!options.transitions || options.transitions.length === 0)\n ) {\n return\n }\n\n const matcher = new PathSchemaMatcher(options)\n\n for (const token of Object.values(tokens)) {\n // Skip ignored tokens\n if (ignore.length > 0 && matchesGlob(token.name, ignore)) {\n continue\n }\n\n const violations = matcher.validate(token)\n\n for (const violation of violations) {\n report({\n token,\n messageId: violation.type,\n data: violation.data as Record<string, string>,\n })\n }\n }\n },\n})\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Rule: require-description\n *\n * Requires tokens to have descriptions.\n */\n\nimport { createRule } from '@lint/create-rule'\nimport { matchesGlob } from '@lint/utils'\n\nexport const RequireDescriptionMessages = {\n MISSING_DESCRIPTION: 'MISSING_DESCRIPTION',\n TOO_SHORT: 'TOO_SHORT',\n} as const\n\nexport type RequireDescriptionOptions = {\n /** Minimum length for description. Default: 1 */\n minLength?: number\n /** Token name patterns to ignore (glob patterns) */\n ignore?: string[]\n}\n\nexport const requireDescription = createRule<\n (typeof RequireDescriptionMessages)[keyof typeof RequireDescriptionMessages],\n RequireDescriptionOptions\n>({\n meta: {\n name: 'require-description',\n description: 'Require tokens to have descriptions',\n messages: {\n MISSING_DESCRIPTION: \"Token '{{name}}' is missing a description\",\n TOO_SHORT: \"Token '{{name}}' description is too short ({{length}} chars, min {{minLength}})\",\n },\n },\n defaultOptions: { minLength: 1 },\n create({ tokens, options, report }) {\n const minLength = options.minLength ?? 1\n const ignore = options.ignore ?? []\n\n for (const token of Object.values(tokens)) {\n // Skip ignored tokens\n if (ignore.length > 0 && matchesGlob(token.name, ignore)) {\n continue\n }\n\n if (!token.$description) {\n report({\n token,\n messageId: 'MISSING_DESCRIPTION',\n data: { name: token.name },\n })\n } else if (token.$description.length < minLength) {\n report({\n token,\n messageId: 'TOO_SHORT',\n data: {\n name: token.name,\n length: token.$description.length,\n minLength,\n },\n })\n }\n }\n },\n})\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Built-in lint rules and dispersa plugin\n */\n\nimport type { LintPlugin, LintConfig } from '@lint/types'\n\nimport type { NamingConventionOptions } from './naming-convention'\nimport { namingConvention } from './naming-convention'\nimport type { NoDeprecatedUsageOptions } from './no-deprecated-usage'\nimport { noDeprecatedUsage } from './no-deprecated-usage'\nimport type { NoDuplicateValuesOptions } from './no-duplicate-values'\nimport { noDuplicateValues } from './no-duplicate-values'\nimport type { PathSchemaConfig } from './path-schema'\nimport { pathSchema } from './path-schema'\nimport type { RequireDescriptionOptions } from './require-description'\nimport { requireDescription } from './require-description'\n\n// Re-export rules for direct use\nexport { requireDescription } from './require-description'\nexport { namingConvention } from './naming-convention'\nexport { noDeprecatedUsage } from './no-deprecated-usage'\nexport { noDuplicateValues } from './no-duplicate-values'\nexport {\n pathSchema,\n type PathSchemaConfig,\n type SegmentDefinition,\n type TransitionRule,\n} from './path-schema'\n\n// Export option types for plugin authors\nexport type { RequireDescriptionOptions } from './require-description'\nexport type { NamingConventionOptions } from './naming-convention'\nexport type { NoDeprecatedUsageOptions } from './no-deprecated-usage'\nexport type { NoDuplicateValuesOptions } from './no-duplicate-values'\n\n/**\n * Builds the dispersa plugin with its predefined configs.\n *\n * Uses a factory to encapsulate the self-referential setup:\n * configs reference the plugin, and the plugin carries configs.\n * The returned objects are fully formed -- no external mutation.\n */\nfunction buildDispersaPlugin() {\n const rules = {\n 'require-description': requireDescription,\n 'naming-convention': namingConvention,\n 'no-deprecated-usage': noDeprecatedUsage,\n 'no-duplicate-values': noDuplicateValues,\n 'path-schema': pathSchema,\n }\n\n const plugin: LintPlugin = { meta: { name: 'dispersa' }, rules, configs: {} }\n\n const recommended: LintConfig = {\n plugins: { dispersa: plugin },\n rules: {\n 'dispersa/require-description': 'warn',\n 'dispersa/naming-convention': ['error', { format: 'kebab-case' }],\n 'dispersa/no-deprecated-usage': 'warn',\n },\n }\n\n const strict: LintConfig = {\n plugins: { dispersa: plugin },\n rules: {\n 'dispersa/require-description': 'error',\n 'dispersa/naming-convention': ['error', { format: 'kebab-case' }],\n 'dispersa/no-deprecated-usage': 'error',\n 'dispersa/no-duplicate-values': 'error',\n },\n }\n\n const minimal: LintConfig = {\n plugins: { dispersa: plugin },\n rules: {\n 'dispersa/no-deprecated-usage': 'warn',\n },\n }\n\n plugin.configs = { recommended, strict, minimal }\n\n return { plugin, recommended, strict, minimal } as const\n}\n\nconst {\n plugin: dispersaPlugin,\n recommended: recommendedConfig,\n strict: strictConfig,\n minimal: minimalConfig,\n} = buildDispersaPlugin()\n\n/**\n * Built-in Dispersa lint plugin\n *\n * Provides core lint rules for design token validation.\n *\n * @example\n * ```typescript\n * import { dispersaPlugin } from 'dispersa/lint'\n *\n * const config = {\n * plugins: { dispersa: dispersaPlugin },\n * rules: {\n * 'dispersa/require-description': 'warn',\n * 'dispersa/naming-convention': ['error', { format: 'kebab-case' }],\n * },\n * }\n * ```\n */\nexport { dispersaPlugin }\n\n/** Recommended lint configuration */\nexport { recommendedConfig }\n\n/** Strict lint configuration */\nexport { strictConfig }\n\n/** Minimal lint configuration */\nexport { minimalConfig }\n\n// ============================================================================\n// Declaration Merging: Register dispersa's built-in rules in the type registry\n// ============================================================================\n\ndeclare module '../types' {\n interface RulesRegistry {\n 'dispersa/require-description': RequireDescriptionOptions\n 'dispersa/naming-convention': NamingConventionOptions\n 'dispersa/no-deprecated-usage': NoDeprecatedUsageOptions\n 'dispersa/no-duplicate-values': NoDuplicateValuesOptions\n 'dispersa/path-schema': PathSchemaConfig\n }\n}\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Lint output formatter interface and utilities\n */\n\nimport type { LintIssue, LintResult, LintFormatter } from '@lint/types'\n\n/**\n * Format lint results as JSON\n */\nexport const formatLintJson: LintFormatter = (result: LintResult): string => {\n return JSON.stringify(result, null, 2)\n}\n\n/**\n * Format lint results in a human-readable stylish format\n */\nexport const formatLintStylish: LintFormatter = (result: LintResult): string => {\n const lines: string[] = []\n\n if (result.issues.length === 0) {\n return '✓ No lint issues found'\n }\n\n // Group issues by token\n const byToken = new Map<string, LintIssue[]>()\n for (const issue of result.issues) {\n const existing = byToken.get(issue.tokenName) ?? []\n existing.push(issue)\n byToken.set(issue.tokenName, existing)\n }\n\n // Output issues\n for (const [tokenName, issues] of byToken) {\n lines.push(``)\n lines.push(` ${tokenName}`)\n for (const issue of issues) {\n const severity = issue.severity === 'error' ? '✖' : '⚠'\n const label = issue.severity === 'error' ? 'error' : 'warning'\n lines.push(` ${severity} ${label}: ${issue.message} [${issue.ruleId}]`)\n }\n }\n\n // Summary\n lines.push(``)\n if (result.errorCount > 0 || result.warningCount > 0) {\n const parts: string[] = []\n if (result.errorCount > 0) {\n parts.push(`${result.errorCount} error${result.errorCount === 1 ? '' : 's'}`)\n }\n if (result.warningCount > 0) {\n parts.push(`${result.warningCount} warning${result.warningCount === 1 ? '' : 's'}`)\n }\n lines.push(`✖ ${parts.join(', ')}`)\n }\n\n return lines.join('\\n')\n}\n\n/**\n * Format lint results for CI output (compact, parseable)\n */\nexport const formatLintCompact: LintFormatter = (result: LintResult): string => {\n const lines: string[] = []\n\n for (const issue of result.issues) {\n const severity = issue.severity.toUpperCase()\n lines.push(`${severity}: ${issue.ruleId} - ${issue.message} (token: ${issue.tokenName})`)\n }\n\n if (result.errorCount > 0 || result.warningCount > 0) {\n lines.push(`SUMMARY: ${result.errorCount} errors, ${result.warningCount} warnings`)\n }\n\n return lines.join('\\n')\n}\n"]}
1
+ {"version":3,"sources":["../src/lint/create-rule.ts","../src/shared/errors/index.ts","../src/lint/plugin-loader.ts","../src/lint/lint-runner.ts","../src/lint/utils/glob-matcher.ts","../src/lint/utils/reference-extractor.ts","../src/lint/rules/naming-convention.ts","../src/lint/rules/no-deprecated-usage.ts","../src/lint/rules/no-duplicate-values.ts","../src/lint/rules/path-schema/matcher.ts","../src/lint/rules/path-schema/index.ts","../src/lint/rules/require-description.ts","../src/lint/rules/index.ts","../src/cli/formatters/lint-formatter.ts"],"names":["require"],"mappings":"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","file":"lint.js","sourcesContent":["/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Factory function for creating type-safe lint rules\n *\n * Use `createRule()` to define rules with full TypeScript inference\n * for message IDs and options.\n */\n\nimport type { LintRule } from './types'\n\n/**\n * Factory function for creating type-safe lint rules\n *\n * This function provides no runtime behavior - it simply returns the rule\n * as-is. Its purpose is to provide type inference and autocomplete for\n * message IDs and options.\n *\n * @template MessageIds - Union type of message IDs this rule can produce\n * @template Options - Rule-specific options type\n *\n * @param rule - The rule definition\n * @returns The same rule definition with full type inference\n *\n * @example\n * ```typescript\n * import { createRule } from 'dispersa/lint'\n *\n * export const requireDescription = createRule<\n * 'MISSING_DESCRIPTION' | 'TOO_SHORT',\n * { minLength?: number }\n * >({\n * meta: {\n * name: 'require-description',\n * description: 'Require tokens to have descriptions',\n * messages: {\n * MISSING_DESCRIPTION: \"Token '{{name}}' is missing a description\",\n * TOO_SHORT: \"Token '{{name}}' description is too short ({{length}} chars, min {{minLength}})\",\n * },\n * },\n * defaultOptions: { minLength: 10 },\n * create({ tokens, report, options }) {\n * for (const token of Object.values(tokens)) {\n * if (!token.$description) {\n * report({ token, messageId: 'MISSING_DESCRIPTION', data: { name: token.name } })\n * } else if (token.$description.length < options.minLength) {\n * report({\n * token,\n * messageId: 'TOO_SHORT',\n * data: { name: token.name, length: token.$description.length, minLength: options.minLength },\n * })\n * }\n * }\n * },\n * })\n * ```\n */\nexport function createRule<\n MessageIds extends string,\n Options extends Record<string, unknown> = Record<string, never>,\n>(rule: LintRule<MessageIds, Options>): LintRule<MessageIds, Options> {\n return rule\n}\n\n/**\n * Helper type for extracting options type from a rule\n *\n * @example\n * ```typescript\n * const myRule = createRule<'MSG', { format: string }>({ ... })\n * type MyOptions = RuleOptions<typeof myRule> // { format: string }\n * ```\n */\nexport type RuleOptions<T extends LintRule> = T extends LintRule<string, infer O> ? O : never\n\n/**\n * Helper type for extracting message IDs from a rule\n *\n * @example\n * ```typescript\n * const myRule = createRule<'MSG1' | 'MSG2', { format: string }>({ ... })\n * type MyMessages = RuleMessages<typeof myRule> // 'MSG1' | 'MSG2'\n * ```\n */\nexport type RuleMessages<T extends LintRule> =\n T extends LintRule<infer M, Record<string, unknown>> ? M : never\n","/**\n * @fileoverview Custom error classes for Dispersa\n *\n * Error classes are intentionally kept as simple value objects with no\n * imports from utility modules. Suggestion formatting is done at call\n * sites to keep the error hierarchy dependency-free.\n */\n\n/**\n * Base error class for all Dispersa errors\n */\nexport class DispersaError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'DispersaError'\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, this.constructor)\n }\n }\n}\n\n/**\n * Thrown when a token reference cannot be resolved\n *\n * @param referenceName - The token name that could not be found\n * @param suggestions - Similar token names for \"did you mean?\" hints\n * @param message - Optional custom message (overrides auto-generated message)\n */\nexport class TokenReferenceError extends DispersaError {\n constructor(\n public referenceName: string,\n public suggestions: string[] = [],\n message?: string,\n ) {\n const hint = TokenReferenceError.formatHint(suggestions)\n super(\n message ??\n `Token reference resolution failed: '${referenceName}'. Token does not exist.${hint}`,\n )\n this.name = 'TokenReferenceError'\n }\n\n private static formatHint(suggestions: string[]): string {\n if (suggestions.length === 0) {\n return ''\n }\n if (suggestions.length === 1) {\n return ` Did you mean \"${suggestions[0]}\"?`\n }\n const quoted = suggestions.map((s) => `\"${s}\"`)\n const last = quoted.pop()!\n return ` Did you mean ${quoted.join(', ')} or ${last}?`\n }\n}\n\n/**\n * Thrown when a circular reference is detected\n */\nexport class CircularReferenceError extends DispersaError {\n constructor(\n public tokenName: string,\n public referencePath: string[],\n ) {\n super(\n `Token resolution failed: '${tokenName}'. Circular reference detected in path: ${referencePath.join(' -> ')}`,\n )\n this.name = 'CircularReferenceError'\n }\n}\n\n/**\n * Thrown when validation fails\n */\nexport class ValidationError extends DispersaError {\n constructor(\n message: string,\n public errors: { message: string; path?: string }[],\n ) {\n super(message)\n this.name = 'ValidationError'\n }\n}\n\n/**\n * Thrown when file operations fail\n */\nexport class FileOperationError extends DispersaError {\n constructor(\n public operation: 'read' | 'write',\n public filePath: string,\n public originalError: Error,\n ) {\n super(`Failed to ${operation} file: ${filePath}. ${originalError.message}`)\n this.name = 'FileOperationError'\n }\n}\n\n/**\n * Thrown when a build configuration is invalid\n */\nexport class ConfigurationError extends DispersaError {\n constructor(message: string) {\n super(message)\n this.name = 'ConfigurationError'\n }\n}\n\n/**\n * Thrown when base permutation cannot be determined\n */\nexport class BasePermutationError extends DispersaError {\n constructor(\n message = 'Base permutation determination failed. Define a default modifier in resolver.',\n ) {\n super(message)\n this.name = 'BasePermutationError'\n }\n}\n\n/**\n * Thrown when an unknown modifier or context is used\n *\n * @param modifierName - Name of the modifier that failed validation\n * @param contextValue - The invalid context value (if applicable)\n * @param availableValues - Valid options (context names or modifier names) for the error message\n */\nexport class ModifierError extends DispersaError {\n constructor(\n public modifierName: string,\n public contextValue?: string,\n public availableValues: string[] = [],\n ) {\n const available = availableValues.length > 0 ? ` Available: ${availableValues.join(', ')}.` : ''\n\n const message =\n contextValue != null && contextValue !== ''\n ? `Modifier validation failed: '${modifierName}'. Invalid context '${contextValue}'.${available}`\n : `Modifier validation failed: '${modifierName}'. Modifier not defined in resolver.${available}`\n super(message)\n this.name = 'ModifierError'\n }\n}\n\n/**\n * Thrown when lint errors are found and failOnError is true\n *\n * @param issues - Array of lint issues that caused the error\n */\nexport class LintError extends DispersaError {\n constructor(\n public issues: Array<{\n ruleId: string\n severity: 'error' | 'warn'\n message: string\n tokenName: string\n tokenPath: string[]\n }>,\n ) {\n const errorCount = issues.filter((i) => i.severity === 'error').length\n const warningCount = issues.filter((i) => i.severity === 'warn').length\n super(`Lint failed with ${errorCount} error(s) and ${warningCount} warning(s).`)\n this.name = 'LintError'\n }\n}\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Plugin loader for lint plugins\n *\n * Supports loading plugins from:\n * - Inline plugin objects\n * - String module paths (package names or file paths)\n */\n\nimport { createRequire } from 'node:module'\nimport { isAbsolute, resolve } from 'node:path'\nimport process from 'node:process'\n\nimport { ConfigurationError } from '@shared/errors'\nimport { createJiti } from 'jiti'\n\nimport type { LintPlugin } from './types'\n\nexport type PluginLoaderOptions = {\n /**\n * Base directory for resolving relative plugin paths\n * @default process.cwd()\n */\n cwd?: string\n}\n\n/**\n * Loads lint plugins from various sources\n *\n * Handles:\n * - Inline `LintPlugin` objects (returned as-is)\n * - Package names (e.g., '@dispersa/lint-plugin-a11y')\n * - Relative file paths (e.g., './plugins/my-plugin.ts')\n * - Absolute file paths\n *\n * @security **Warning**: Loading plugins from external packages or file paths\n * executes arbitrary code. Only load plugins from trusted sources.\n * For programmatic usage, prefer passing plugin objects directly rather than\n * strings that trigger dynamic imports.\n *\n * @example\n * ```typescript\n * const loader = new PluginLoader({ cwd: process.cwd() })\n *\n * // Load from inline object\n * const plugin1 = await loader.load(myPlugin)\n *\n * // Load from package\n * const plugin2 = await loader.load('@dispersa/lint-plugin-a11y')\n *\n * // Load from file\n * const plugin3 = await loader.load('./plugins/custom.ts')\n * ```\n */\nexport class PluginLoader {\n private cwd: string\n private jiti: ReturnType<typeof createJiti> | null = null\n private cache: Map<string, LintPlugin> = new Map()\n\n constructor(options: PluginLoaderOptions = {}) {\n this.cwd = options.cwd ?? process.cwd()\n }\n\n /**\n * Load a plugin from an inline object or module path\n *\n * @param source - Plugin object or module path string\n * @returns Loaded plugin\n * @throws {ConfigurationError} If plugin cannot be loaded or is invalid\n */\n async load(source: LintPlugin | string): Promise<LintPlugin> {\n // Inline plugin object - return as-is\n if (this.isPluginObject(source)) {\n this.validatePlugin(source)\n return source\n }\n\n // String path - load module\n const modulePath = source as string\n const cached = this.cache.get(modulePath)\n if (cached) {\n return cached\n }\n\n const plugin = await this.loadFromModule(modulePath)\n this.validatePlugin(plugin)\n this.cache.set(modulePath, plugin)\n return plugin\n }\n\n /**\n * Load multiple plugins\n *\n * @param plugins - Record of namespace to plugin source\n * @returns Record of namespace to loaded plugin\n */\n async loadAll(plugins: Record<string, LintPlugin | string>): Promise<Record<string, LintPlugin>> {\n const entries = Object.entries(plugins)\n const loaded = await Promise.all(\n entries.map(async ([namespace, source]) => [namespace, await this.load(source)] as const),\n )\n return Object.fromEntries(loaded)\n }\n\n /**\n * Check if source is an inline plugin object\n */\n private isPluginObject(source: LintPlugin | string): source is LintPlugin {\n return typeof source !== 'string'\n }\n\n /**\n * Load a plugin from a module path\n */\n private async loadFromModule(modulePath: string): Promise<LintPlugin> {\n // Resolve relative paths from cwd\n const resolvedPath = isAbsolute(modulePath) ? modulePath : resolve(this.cwd, modulePath)\n\n // Check if it's a file path or package name\n const isFilePath =\n modulePath.startsWith('./') || modulePath.startsWith('../') || isAbsolute(modulePath)\n\n try {\n if (isFilePath) {\n return await this.loadFromFile(resolvedPath)\n }\n return await this.loadFromPackage(modulePath)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n throw new ConfigurationError(`Failed to load lint plugin '${modulePath}': ${message}`)\n }\n }\n\n /**\n * Load a plugin from a file path using jiti (supports TypeScript)\n */\n private async loadFromFile(filePath: string): Promise<LintPlugin> {\n this.jiti ??= createJiti(this.cwd, {\n interopDefault: true,\n })\n\n const loaded = await this.jiti(filePath)\n const plugin = this.extractPlugin(loaded)\n\n if (!plugin) {\n throw new ConfigurationError(`Plugin file '${filePath}' does not export a valid LintPlugin`)\n }\n\n return plugin\n }\n\n /**\n * Load a plugin from a package name\n */\n private async loadFromPackage(packageName: string): Promise<LintPlugin> {\n // Try to require the package\n const require = createRequire(this.cwd)\n\n let resolvedPath: string\n try {\n resolvedPath = require.resolve(packageName, { paths: [this.cwd] })\n } catch {\n // Fallback: try from this module's location\n try {\n resolvedPath = require.resolve(packageName)\n } catch {\n throw new ConfigurationError(\n `Cannot find package '${packageName}'. Make sure it is installed.`,\n )\n }\n }\n\n // Use jiti to support ESM/CJS interoperability\n this.jiti ??= createJiti(this.cwd, {\n interopDefault: true,\n })\n\n const loaded = await this.jiti(resolvedPath)\n const plugin = this.extractPlugin(loaded)\n\n if (!plugin) {\n throw new ConfigurationError(`Package '${packageName}' does not export a valid LintPlugin`)\n }\n\n return plugin\n }\n\n /**\n * Extract plugin from loaded module\n *\n * Supports multiple export patterns:\n * - export default plugin\n * - export const plugin = {...}\n * - module.exports = plugin (CJS)\n */\n private extractPlugin(loaded: unknown): LintPlugin | null {\n if (!loaded || typeof loaded !== 'object') {\n return null\n }\n\n const module = loaded as Record<string, unknown>\n\n // Priority 1: default export\n if (module.default && this.isValidPluginStructure(module.default)) {\n return module.default as LintPlugin\n }\n\n // Priority 2: named export 'plugin'\n if (module.plugin && this.isValidPluginStructure(module.plugin)) {\n return module.plugin as LintPlugin\n }\n\n // Priority 3: module is the plugin itself (CJS module.exports = plugin)\n if (this.isValidPluginStructure(loaded)) {\n return loaded as LintPlugin\n }\n\n return null\n }\n\n /**\n * Check if object has required plugin structure\n */\n private isValidPluginStructure(obj: unknown): boolean {\n if (!obj || typeof obj !== 'object') {\n return false\n }\n\n const plugin = obj as Record<string, unknown>\n const rules = plugin.rules as Record<string, unknown> | undefined\n\n if (\n plugin.meta === undefined ||\n typeof plugin.meta !== 'object' ||\n !(plugin.meta as Record<string, unknown>).name ||\n rules === undefined ||\n Object.keys(rules).length === 0\n ) {\n return false\n }\n\n return true\n }\n\n /**\n * Validate a loaded plugin\n */\n private validatePlugin(plugin: LintPlugin): void {\n if (!plugin.meta) {\n throw new ConfigurationError('Lint plugin must have a meta property with name')\n }\n\n if (!plugin.meta.name) {\n throw new ConfigurationError('Lint plugin meta.name is required')\n }\n\n if (\n !plugin.rules ||\n typeof plugin.rules !== 'object' ||\n Object.keys(plugin.rules).length === 0\n ) {\n throw new ConfigurationError(\n `Lint plugin '${plugin.meta.name}' must have a non-empty rules object`,\n )\n }\n\n // Validate each rule\n for (const [ruleName, rule] of Object.entries(plugin.rules)) {\n if (!rule.meta) {\n throw new ConfigurationError(\n `Rule '${ruleName}' in plugin '${plugin.meta.name}' is missing meta property`,\n )\n }\n if (!rule.meta.messages || typeof rule.meta.messages !== 'object') {\n throw new ConfigurationError(\n `Rule '${ruleName}' in plugin '${plugin.meta.name}' is missing meta.messages`,\n )\n }\n if (typeof rule.create !== 'function') {\n throw new ConfigurationError(\n `Rule '${ruleName}' in plugin '${plugin.meta.name}' is missing create function`,\n )\n }\n }\n }\n\n /**\n * Clear the plugin cache\n */\n clearCache(): void {\n this.cache.clear()\n }\n}\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Lint runner that executes rules in parallel against tokens\n *\n * The lint runner is responsible for:\n * - Loading plugins and resolving rule configurations\n * - Executing rules in parallel for performance\n * - Collecting and aggregating lint issues\n * - Interpolating message templates with data\n */\n\nimport type { InternalResolvedTokens, TokenType } from '@tokens/types'\n\nimport { PluginLoader } from './plugin-loader'\nimport type {\n AnyLintRule,\n LintConfig,\n LintIssue,\n LintPlugin,\n LintReportDescriptor,\n LintResult,\n LintRuleContext,\n ResolvedLintConfig,\n ResolvedRuleConfig,\n RuleConfig,\n} from './types'\n\nexport type LintRunnerOptions = LintConfig & {\n /** Callback for runner warnings (e.g. unknown rule). Defaults to console.warn. */\n onWarn?: (message: string) => void\n}\n\n/**\n * Executes lint rules against a set of tokens\n *\n * @example\n * ```typescript\n * const config: LintConfig = {\n * plugins: {\n * dispersa: dispersaPlugin,\n * },\n * rules: {\n * 'dispersa/require-description': 'warn',\n * 'dispersa/naming-convention': ['error', { format: 'kebab-case' }],\n * },\n * }\n *\n * const runner = new LintRunner(config)\n * const result = await runner.run(tokens)\n *\n * console.log(`Found ${result.errorCount} errors, ${result.warningCount} warnings`)\n * ```\n */\nexport class LintRunner {\n private config: LintRunnerOptions\n private pluginLoader: PluginLoader\n private resolvedConfig: ResolvedLintConfig | null = null\n private warn: (message: string) => void\n\n constructor(config: LintRunnerOptions) {\n this.config = config\n this.pluginLoader = new PluginLoader()\n this.warn = config.onWarn ?? console.warn\n }\n\n /**\n * Run all configured rules against the provided tokens\n *\n * Rules are executed in parallel for performance. Issues are collected\n * and returned with counts by severity.\n *\n * @param tokens - Resolved tokens to lint\n * @returns Lint result with issues and counts\n */\n async run(tokens: InternalResolvedTokens): Promise<LintResult> {\n this.resolvedConfig ??= await this.resolveConfig()\n\n const { rules, plugins } = this.resolvedConfig\n const issues: LintIssue[] = []\n\n if (Object.keys(rules).length === 0) {\n return { issues: [], errorCount: 0, warningCount: 0 }\n }\n\n const rulePromises = Object.entries(rules).map(async ([ruleId, ruleConfig]) => {\n const { severity, options } = ruleConfig\n\n const rule = this.resolveRule(ruleId, plugins)\n if (!rule) {\n this.warn(`[lint] Unknown rule '${ruleId}' - no plugin provides this rule`)\n return []\n }\n\n const reports: LintReportDescriptor<string>[] = []\n const applicableTokens = this.filterTokensByAppliesTo(tokens, rule.meta.appliesTo)\n const mergedOptions = rule.defaultOptions ? { ...rule.defaultOptions, ...options } : options\n\n const context: LintRuleContext<string, Record<string, unknown>> = {\n id: ruleId,\n options: mergedOptions,\n tokens: applicableTokens,\n report: (descriptor) => {\n reports.push(descriptor)\n },\n }\n\n try {\n await rule.create(context)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return [\n {\n ruleId: 'lint/rule-error',\n severity: 'error' as const,\n message: `Rule '${ruleId}' failed: ${message}`,\n tokenName: '(rule execution)',\n tokenPath: [],\n },\n ]\n }\n\n return reports.map((report) => {\n const messageTemplate = rule.meta.messages[report.messageId]\n const message = messageTemplate\n ? this.interpolateMessage(messageTemplate, report.data)\n : report.messageId\n\n return {\n ruleId,\n severity,\n message,\n tokenName: report.token.name,\n tokenPath: report.token.path,\n }\n })\n })\n\n const allIssues = await Promise.all(rulePromises)\n issues.push(...allIssues.flat())\n\n const errorCount = issues.filter((i) => i.severity === 'error').length\n const warningCount = issues.filter((i) => i.severity === 'warn').length\n\n return { issues, errorCount, warningCount }\n }\n\n /**\n * Resolve configuration: load plugins, parse rule configs\n */\n private async resolveConfig(): Promise<ResolvedLintConfig> {\n const { plugins: pluginSources = {}, rules: ruleConfigs = {} } = this.config\n\n const plugins = await this.pluginLoader.loadAll(pluginSources)\n\n const rules: Record<string, ResolvedRuleConfig> = {}\n\n for (const [ruleId, config] of Object.entries(ruleConfigs)) {\n const resolved = this.resolveRuleConfig(config)\n if (resolved) {\n rules[ruleId] = resolved\n }\n }\n\n return {\n enabled: true,\n failOnError: this.config.failOnError ?? true,\n plugins,\n rules,\n }\n }\n\n private filterTokensByAppliesTo(\n tokens: InternalResolvedTokens,\n appliesTo: TokenType[] | 'all' | undefined,\n ): InternalResolvedTokens {\n if (!appliesTo || appliesTo === 'all') {\n return tokens\n }\n\n const filtered: InternalResolvedTokens = {}\n for (const [name, token] of Object.entries(tokens)) {\n if (token.$type && appliesTo.includes(token.$type)) {\n filtered[name] = token\n }\n }\n return filtered\n }\n\n /**\n * Parse rule configuration into resolved format\n */\n private resolveRuleConfig(config: RuleConfig): ResolvedRuleConfig | null {\n // Shorthand: severity only\n if (typeof config === 'string') {\n if (config === 'off') {\n return null\n }\n return { severity: config, options: {} }\n }\n\n // Longhand: [severity, options]\n const [severity, options = {}] = config\n if (severity === 'off') {\n return null\n }\n\n return { severity, options }\n }\n\n /**\n * Resolve a rule from plugins by rule ID\n *\n * Rule IDs are formatted as 'namespace/rule-name'\n */\n private resolveRule(ruleId: string, plugins: Record<string, LintPlugin>): AnyLintRule | null {\n const separatorIndex = ruleId.indexOf('/')\n if (separatorIndex === -1) {\n return null\n }\n\n const namespace = ruleId.slice(0, separatorIndex)\n const ruleName = ruleId.slice(separatorIndex + 1)\n\n const plugin = plugins[namespace]\n if (!plugin) {\n return null\n }\n\n return plugin.rules[ruleName] ?? null\n }\n\n /**\n * Interpolate message template with data\n *\n * Replaces {{key}} placeholders with values from data\n */\n private interpolateMessage(template: string, data?: Record<string, string | number>): string {\n if (!data) {\n return template\n }\n\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => {\n const value = data[key]\n return value !== undefined ? String(value) : `{{${key}}}`\n })\n }\n\n /**\n * Clear the plugin cache\n */\n clearCache(): void {\n this.pluginLoader.clearCache()\n this.resolvedConfig = null\n }\n}\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Shared glob pattern matching utilities for lint rules\n *\n * Provides bounded caching to prevent memory leaks in long-running processes.\n */\n\nconst MAX_CACHE_SIZE = 1000\n\nconst cache = new Map<string, RegExp>()\n\n/**\n * Convert a glob pattern to a RegExp\n *\n * Supports `*` as a wildcard that matches any characters.\n * Results are cached with a bounded cache to prevent memory leaks.\n *\n * @param pattern - Glob pattern (e.g., 'color-*', '*.primary')\n * @returns Compiled RegExp\n *\n * @example\n * ```typescript\n * const regex = globToRegex('color-*')\n * regex.test('color-primary') // true\n * regex.test('spacing-base') // false\n * ```\n */\nexport function globToRegex(pattern: string): RegExp {\n const cached = cache.get(pattern)\n if (cached) {\n cache.delete(pattern)\n cache.set(pattern, cached)\n return cached\n }\n\n const regex = new RegExp(\n '^' +\n pattern\n .split('*')\n .map((part) => part.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n .join('.*') +\n '$',\n )\n\n if (cache.size >= MAX_CACHE_SIZE) {\n const oldest = cache.keys().next().value\n if (oldest !== undefined) {\n cache.delete(oldest)\n }\n }\n\n cache.set(pattern, regex)\n return regex\n}\n\n/**\n * Check if a name matches any of the given glob patterns\n *\n * @param name - String to test\n * @param patterns - Array of glob patterns\n * @returns true if name matches any pattern\n *\n * @example\n * ```typescript\n * matchesGlob('color-primary', ['color-*', 'spacing-*']) // true\n * matchesGlob('typography-base', ['color-*']) // false\n * ```\n */\nexport function matchesGlob(name: string, patterns: string[]): boolean {\n return patterns.some((pattern) => globToRegex(pattern).test(name))\n}\n\n/**\n * Clear the glob pattern cache\n *\n * Useful for testing or when memory needs to be reclaimed.\n */\nexport function clearGlobCache(): void {\n cache.clear()\n}\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Utility for extracting token references from values\n *\n * Used by rules that need to detect references to other tokens,\n * such as no-deprecated-usage.\n */\n\nconst ALIAS_PATTERN = /\\{([^}]+)\\}/g\n\n/**\n * Extract all token references from a value\n *\n * Recursively traverses objects and arrays to find all references\n * in the form `{token.name}`.\n *\n * @param value - Value to extract references from\n * @returns Array of referenced token names\n *\n * @example\n * ```typescript\n * extractReferences('{color.primary}') // ['color.primary']\n * extractReferences('{color.base.primary}') // ['color.base.primary']\n * extractReferences('border: {border.width} solid {color.border}') // ['border.width', 'color.border']\n * extractReferences({ value: '{spacing.md}', nested: { ref: '{spacing.lg}' } }) // ['spacing.md', 'spacing.lg']\n * ```\n */\nexport function extractReferences(value: unknown): string[] {\n const refs: string[] = []\n\n if (typeof value === 'string') {\n let match\n ALIAS_PATTERN.lastIndex = 0\n while ((match = ALIAS_PATTERN.exec(value)) !== null) {\n if (match[1]) {\n refs.push(match[1])\n }\n }\n } else if (Array.isArray(value)) {\n for (const item of value) {\n refs.push(...extractReferences(item))\n }\n } else if (typeof value === 'object' && value !== null) {\n for (const v of Object.values(value as Record<string, unknown>)) {\n refs.push(...extractReferences(v))\n }\n }\n\n return refs\n}\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Rule: naming-convention\n *\n * Enforces consistent token naming conventions.\n */\n\nimport { createRule } from '@lint/create-rule'\nimport { matchesGlob } from '@lint/utils'\n\nexport const NamingConventionMessages = {\n INVALID_FORMAT: 'INVALID_FORMAT',\n INVALID_SEGMENT: 'INVALID_SEGMENT',\n} as const\n\nexport type NamingConventionOptions = {\n /**\n * Naming format to enforce\n * - 'kebab-case': color-brand-primary, red-500, blue-600\n * - 'camelCase': colorBrandPrimary\n * - 'PascalCase': ColorBrandPrimary\n * - 'snake_case': color_brand_primary\n * - 'screaming-snake': COLOR_BRAND_PRIMARY\n */\n format?: 'kebab-case' | 'camelCase' | 'PascalCase' | 'snake_case' | 'screaming-snake'\n /** Token name patterns to ignore (glob patterns) */\n ignore?: string[]\n /** Custom regex pattern to validate against */\n pattern?: string\n /**\n * Allow purely numeric path segments (e.g., spacing.0, spacing.1)\n * Common in design system scales. Default: true\n */\n allowNumericSegments?: boolean\n}\n\nconst PATTERNS: Record<string, RegExp> = {\n 'kebab-case': /^([a-z][a-z0-9]*)(-[a-z0-9]+)*$/,\n camelCase: /^[a-z][a-zA-Z0-9]*$/,\n PascalCase: /^[A-Z][a-zA-Z0-9]*$/,\n snake_case: /^([a-z][a-z0-9]*)(_[a-z0-9]+)*$/,\n 'screaming-snake': /^([A-Z][A-Z0-9]*)(_[A-Z0-9]+)*$/,\n}\n\nconst DEFAULT_PATTERN = /^[a-z][a-z0-9]*(-[a-z][a-z0-9]*)*$/\n\nexport const namingConvention = createRule<\n (typeof NamingConventionMessages)[keyof typeof NamingConventionMessages],\n NamingConventionOptions\n>({\n meta: {\n name: 'naming-convention',\n description: 'Enforce consistent token naming conventions',\n messages: {\n INVALID_FORMAT: \"Token '{{name}}' does not match '{{format}}' format\",\n INVALID_SEGMENT:\n \"Segment '{{segment}}' in token '{{name}}' does not match '{{format}}' format\",\n },\n },\n defaultOptions: { format: 'kebab-case', allowNumericSegments: true },\n create({ tokens, options, report }) {\n const format = options.format ?? 'kebab-case'\n const ignore = options.ignore ?? []\n const customPattern = options.pattern\n const allowNumericSegments = options.allowNumericSegments ?? true\n\n // Use custom pattern if provided, otherwise use built-in format\n let segmentPattern: RegExp\n if (customPattern) {\n segmentPattern = new RegExp(customPattern)\n } else {\n segmentPattern = PATTERNS[format] ?? DEFAULT_PATTERN\n }\n\n // Pattern for pure numeric segments (common in design systems: spacing.0, spacing.1)\n const numericPattern = /^\\d+$/\n\n for (const token of Object.values(tokens)) {\n // Skip ignored tokens\n if (ignore.length > 0 && matchesGlob(token.name, ignore)) {\n continue\n }\n\n // Check each path segment\n const segments = token.path\n let hasError = false\n\n for (const segment of segments) {\n // Allow pure numeric segments if option is enabled\n if (allowNumericSegments && numericPattern.test(segment)) {\n continue\n }\n\n if (!segmentPattern.test(segment)) {\n report({\n token,\n messageId: 'INVALID_SEGMENT',\n data: { name: token.name, segment, format: customPattern ?? format },\n })\n hasError = true\n break\n }\n }\n\n // If no segment errors, also check full name for custom patterns\n if (!hasError && customPattern && !segmentPattern.test(token.name)) {\n report({\n token,\n messageId: 'INVALID_FORMAT',\n data: { name: token.name, format: customPattern },\n })\n }\n }\n },\n})\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Rule: no-deprecated-usage\n *\n * Warns when tokens reference deprecated tokens.\n */\n\nimport { createRule } from '@lint/create-rule'\nimport { extractReferences, matchesGlob } from '@lint/utils'\n\nexport const NoDeprecatedUsageMessages = {\n REFERENCES_DEPRECATED: 'REFERENCES_DEPRECATED',\n} as const\n\nexport type NoDeprecatedUsageOptions = {\n /** Token name patterns to ignore (glob patterns) */\n ignore?: string[]\n}\n\nexport const noDeprecatedUsage = createRule<\n (typeof NoDeprecatedUsageMessages)[keyof typeof NoDeprecatedUsageMessages],\n NoDeprecatedUsageOptions\n>({\n meta: {\n name: 'no-deprecated-usage',\n description: 'Disallow references to deprecated tokens',\n messages: {\n REFERENCES_DEPRECATED: \"Token '{{name}}' references deprecated token '{{ref}}'. {{reason}}\",\n },\n },\n defaultOptions: {},\n create({ tokens, options, report }) {\n const ignore = options.ignore ?? []\n\n // Build set of deprecated tokens\n const deprecatedTokens = new Map<string, string | true>()\n for (const token of Object.values(tokens)) {\n if (token.$deprecated) {\n const reason = typeof token.$deprecated === 'string' ? token.$deprecated : ''\n deprecatedTokens.set(token.name, reason || true)\n }\n }\n\n // If no deprecated tokens, nothing to check\n if (deprecatedTokens.size === 0) {\n return\n }\n\n for (const token of Object.values(tokens)) {\n // Skip ignored tokens\n if (ignore.length > 0 && matchesGlob(token.name, ignore)) {\n continue\n }\n\n // Skip deprecated tokens themselves\n if (deprecatedTokens.has(token.name)) {\n continue\n }\n\n // Extract references from original value\n const refs = extractReferences(token.originalValue)\n\n for (const ref of refs) {\n const deprecation = deprecatedTokens.get(ref)\n if (deprecation) {\n const reason = deprecation === true ? '' : `(${deprecation})`\n report({\n token,\n messageId: 'REFERENCES_DEPRECATED',\n data: { name: token.name, ref, reason },\n })\n }\n }\n }\n },\n})\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Rule: no-duplicate-values\n *\n * Detects tokens with duplicate values (excluding aliases).\n */\n\nimport { createRule } from '@lint/create-rule'\nimport { matchesGlob } from '@lint/utils'\n\nexport const NoDuplicateValuesMessages = {\n DUPLICATE_VALUE: 'DUPLICATE_VALUE',\n} as const\n\nexport type NoDuplicateValuesOptions = {\n /** Token name patterns to ignore (glob patterns) */\n ignore?: string[]\n /** Only check specific token types */\n types?: string[]\n}\n\nfunction valueKey(value: unknown): string {\n if (value === null) {\n return 'null'\n }\n if (value === undefined) {\n return 'undefined'\n }\n if (typeof value === 'object') {\n return JSON.stringify(sortKeys(value))\n }\n return String(value)\n}\n\nfunction sortKeys(obj: unknown): unknown {\n if (Array.isArray(obj)) {\n return obj.map(sortKeys)\n }\n if (typeof obj === 'object' && obj !== null) {\n const sorted: Record<string, unknown> = {}\n for (const key of Object.keys(obj).sort()) {\n sorted[key] = sortKeys((obj as Record<string, unknown>)[key])\n }\n return sorted\n }\n return obj\n}\n\nexport const noDuplicateValues = createRule<\n (typeof NoDuplicateValuesMessages)[keyof typeof NoDuplicateValuesMessages],\n NoDuplicateValuesOptions\n>({\n meta: {\n name: 'no-duplicate-values',\n description: 'Detect tokens with duplicate values (excluding aliases)',\n messages: {\n DUPLICATE_VALUE:\n \"Token '{{name}}' has the same value as '{{duplicate}}'. Consider using an alias instead.\",\n },\n },\n defaultOptions: {},\n create({ tokens, options, report }) {\n const ignore = options.ignore ?? []\n const types = options.types\n\n const valueMap = new Map<string, (typeof tokens)[string][]>()\n\n for (const token of Object.values(tokens)) {\n if (ignore.length > 0 && matchesGlob(token.name, ignore)) {\n continue\n }\n\n if (token._isAlias) {\n continue\n }\n\n if (types && types.length > 0 && !types.includes(token.$type ?? '')) {\n continue\n }\n\n const key = valueKey(token.$value)\n const existing = valueMap.get(key)\n if (existing) {\n existing.push(token)\n } else {\n valueMap.set(key, [token])\n }\n }\n\n for (const tokenList of valueMap.values()) {\n if (tokenList.length > 1) {\n const first = tokenList[0]\n if (!first) {\n continue\n }\n\n for (let i = 1; i < tokenList.length; i++) {\n const current = tokenList[i]\n if (current) {\n report({\n token: current,\n messageId: 'DUPLICATE_VALUE',\n data: { name: current.name, duplicate: first.name },\n })\n }\n }\n }\n }\n },\n})\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Path schema matcher implementation\n */\n\nimport { matchesGlob } from '@lint/utils'\nimport type { ResolvedToken } from '@tokens/types'\n\nimport type { PathSchemaConfig, SegmentDefinition, TransitionRule } from './types'\n\nexport type Violation = {\n type: 'INVALID_PATH' | 'UNKNOWN_SEGMENT' | 'FORBIDDEN_TRANSITION'\n data: Record<string, string | number>\n}\n\ntype Pattern = string | string[] | RegExp\n\ntype CompiledPattern = Array<\n { type: 'segment'; name: string } | { type: 'literal'; value: string } | { type: 'wildcard' }\n>\n\ntype CompiledTransition = {\n from: Pattern\n to: Pattern\n allow: boolean\n}\n\nexport { matchesGlob }\n\n/**\n * Compiles and validates token paths against a schema\n */\nexport class PathSchemaMatcher {\n private segments: Record<string, SegmentDefinition>\n private pathPatterns: CompiledPattern[]\n private transitionRules: CompiledTransition[]\n\n constructor(config: PathSchemaConfig) {\n this.segments = config.segments ?? {}\n this.pathPatterns = this.compilePaths(config.paths ?? [], this.segments)\n this.transitionRules = this.compileTransitions(config.transitions ?? [])\n }\n\n /**\n * Validate a token against the schema\n */\n validate(token: ResolvedToken): Violation[] {\n const violations: Violation[] = []\n const pathSegments = token.path\n const hasPaths = this.pathPatterns.length > 0\n const hasTransitions = this.transitionRules.length > 0\n\n // Check transitions if defined\n if (hasTransitions) {\n const transitionViolations = this.validateTransitions(pathSegments, token.name)\n violations.push(...transitionViolations)\n }\n\n // Check against path patterns if defined\n if (hasPaths) {\n const matchesAny = this.pathPatterns.some((p) => this.matchPattern(p, pathSegments))\n if (!matchesAny) {\n violations.push({\n type: 'INVALID_PATH',\n data: { path: token.name },\n })\n }\n }\n\n return violations\n }\n\n /**\n * Validate transitions between segments.\n *\n * Deny rules are checked independently (any match = violation).\n * Allow rules use OR semantics: at least one must match.\n */\n private validateTransitions(segments: string[], tokenName: string): Violation[] {\n const violations: Violation[] = []\n\n for (let i = 0; i < segments.length - 1; i++) {\n const from = segments[i]\n const to = segments[i + 1]\n\n if (!from || !to) {\n continue\n }\n\n const applicableRules = this.transitionRules.filter((r) => this.matchesPattern(from, r.from))\n\n if (applicableRules.length === 0) {\n continue\n }\n\n const denyRules = applicableRules.filter((r) => r.allow === false)\n const allowRules = applicableRules.filter((r) => r.allow !== false)\n\n for (const rule of denyRules) {\n if (this.matchesPattern(to, rule.to)) {\n violations.push({\n type: 'FORBIDDEN_TRANSITION',\n data: { from, to, path: tokenName },\n })\n }\n }\n\n if (allowRules.length > 0) {\n const anyAllowMatches = allowRules.some((r) => this.matchesPattern(to, r.to))\n if (!anyAllowMatches) {\n violations.push({\n type: 'FORBIDDEN_TRANSITION',\n data: { from, to, path: tokenName },\n })\n }\n }\n }\n\n return violations\n }\n\n /**\n * Check if a value matches a pattern\n */\n private matchesPattern(value: string, pattern: Pattern): boolean {\n if (typeof pattern === 'string') {\n return value === pattern\n }\n if (Array.isArray(pattern)) {\n return pattern.includes(value)\n }\n return pattern.test(value)\n }\n\n /**\n * Compile path patterns into matcher structures\n */\n private compilePaths(\n patterns: string[],\n segments: Record<string, SegmentDefinition>,\n ): CompiledPattern[] {\n return patterns.map((p) => this.parsePattern(p, segments))\n }\n\n /**\n * Parse a path pattern string into compiled form\n * - `{name}` is a segment placeholder\n * - `*` is a wildcard that matches any single segment\n * - `.` is the path separator (implicit between segments)\n */\n private parsePattern(\n pattern: string,\n _segments: Record<string, SegmentDefinition>,\n ): CompiledPattern {\n const parts: CompiledPattern = []\n const regex = /\\{(\\w+)\\}|(\\*)|([^{}*]+)/g\n let match\n\n while ((match = regex.exec(pattern)) !== null) {\n if (match[1]) {\n parts.push({ type: 'segment', name: match[1] })\n } else if (match[2]) {\n parts.push({ type: 'wildcard' })\n } else if (match[3]) {\n parts.push({ type: 'literal', value: match[3] })\n }\n }\n\n return parts\n }\n\n /**\n * Match path segments against a compiled pattern using dynamic programming.\n * Supports optional segments via DP table.\n *\n * DP[i][j] = can we match path[0..i) with pattern[0..j)?\n */\n private matchPattern(pattern: CompiledPattern, pathSegments: string[]): boolean {\n // Extract pattern parts that consume segments (segments + wildcards)\n // But include literals that are NOT just path separators (single dots)\n const patternParts = pattern.filter((p) => {\n if (p.type === 'segment' || p.type === 'wildcard') {\n return true\n }\n if (p.type === 'literal') {\n // Keep literals that are more than just separators (e.g., '.palette.')\n // Single '.' or sequences of '.' are path separators, not meaningful literals\n return p.value !== '.' && !/^\\.+$/.test(p.value)\n }\n return false\n })\n const pathLen = pathSegments.length\n const patternLen = patternParts.length\n\n // DP table: dp[i][j] = can we match first i path segments with first j pattern parts?\n // Initialize with false values\n const dp: boolean[][] = []\n for (let i = 0; i <= pathLen; i++) {\n dp[i] = []\n for (let j = 0; j <= patternLen; j++) {\n dp[i]![j] = false\n }\n }\n\n // Base case: empty path matches empty pattern\n dp[0]![0] = true\n\n // Fill DP table\n for (let i = 0; i <= pathLen; i++) {\n for (let j = 0; j <= patternLen; j++) {\n const currentState = dp[i]![j]\n if (!currentState) {\n continue\n }\n\n // If we've consumed all path segments, we can still skip remaining optional pattern parts\n if (i === pathLen) {\n // Can skip remaining optional pattern parts\n if (j < patternLen && this.isPartOptional(patternParts[j]!)) {\n dp[i]![j + 1] = true\n }\n continue\n }\n\n // If we've consumed all pattern parts, we can only continue if path is also exhausted\n if (j === patternLen) {\n if (i === pathLen) {\n dp[i]![j] = true\n }\n continue\n }\n\n const part = patternParts[j]!\n\n // ALWAYS try to match current path segment with current pattern part first\n if (i < pathLen && this.matchPatternPart(part, pathSegments[i]!)) {\n dp[i + 1]![j + 1] = true\n }\n\n // THEN try skipping current pattern part if it's optional\n // (this is separate from matching - both can be valid)\n if (this.isPartOptional(part)) {\n dp[i]![j + 1] = true\n }\n }\n }\n\n // Path matches if we can reach any state where both path and pattern are consumed\n return dp[pathLen]![patternLen] ?? false\n }\n\n /**\n * Check if a pattern part is optional based on its segment definition\n */\n private isPartOptional(part: { type: string; name?: string }): boolean {\n if (part.type !== 'segment' || !part.name) {\n return false // Wildcards and literals are not optional\n }\n const segmentDef = this.segments[part.name]\n return segmentDef?.optional ?? false\n }\n\n /**\n * Match a single pattern part against a path segment value\n */\n private matchPatternPart(\n part: { type: string; name?: string; value?: string },\n value: string,\n ): boolean {\n if (part.type === 'wildcard') {\n return true\n }\n\n if (part.type === 'literal' && part.value !== undefined) {\n // Strip leading/trailing dots from literal for comparison\n // e.g., '.palette.' should match 'palette'\n const literalValue = part.value.replace(/^\\.+|\\.+$/g, '')\n return literalValue === value\n }\n\n if (part.type === 'segment' && part.name) {\n const segment = this.segments[part.name]\n if (!segment) {\n return true\n }\n return this.matchesSegmentDefinition(value, segment)\n }\n\n return false\n }\n\n /**\n * Check if a value matches a segment definition\n */\n private matchesSegmentDefinition(value: string, definition: SegmentDefinition): boolean {\n const { values } = definition\n if (Array.isArray(values)) {\n return values.some((v) => (typeof v === 'string' ? v === value : v.test(value)))\n }\n return values.test(value)\n }\n\n /**\n * Compile transition rules\n */\n private compileTransitions(transitions: TransitionRule[]): CompiledTransition[] {\n return transitions.map((t) => ({\n from: t.from,\n to: t.to,\n allow: t.allow ?? true,\n }))\n }\n}\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Rule: path-schema\n *\n * Enforces token path structure using segment definitions and patterns.\n */\n\nimport { createRule } from '@lint/create-rule'\n\nimport { PathSchemaMatcher, matchesGlob } from './matcher'\nimport type { PathSchemaConfig } from './types'\n\nexport { type PathSchemaConfig, type SegmentDefinition, type TransitionRule } from './types'\n\nexport const PathSchemaMessages = {\n INVALID_PATH: 'INVALID_PATH',\n UNKNOWN_SEGMENT: 'UNKNOWN_SEGMENT',\n FORBIDDEN_TRANSITION: 'FORBIDDEN_TRANSITION',\n} as const\n\nexport const pathSchema = createRule<\n (typeof PathSchemaMessages)[keyof typeof PathSchemaMessages],\n PathSchemaConfig\n>({\n meta: {\n name: 'path-schema',\n description: 'Enforce token path segment structure',\n messages: {\n INVALID_PATH: \"Token path '{{path}}' does not match any defined pattern\",\n UNKNOWN_SEGMENT: \"Segment '{{segment}}' at position {{position}} in '{{path}}' is not valid\",\n FORBIDDEN_TRANSITION: \"Segment '{{to}}' cannot follow '{{from}}' in path '{{path}}'\",\n },\n },\n defaultOptions: {\n segments: {},\n paths: [],\n transitions: [],\n },\n create({ tokens, options, report }) {\n const ignore = options.ignore ?? []\n\n // Skip if no patterns or transitions defined\n if (\n (!options.paths || options.paths.length === 0) &&\n (!options.transitions || options.transitions.length === 0)\n ) {\n return\n }\n\n const matcher = new PathSchemaMatcher(options)\n\n for (const token of Object.values(tokens)) {\n // Skip ignored tokens\n if (ignore.length > 0 && matchesGlob(token.name, ignore)) {\n continue\n }\n\n const violations = matcher.validate(token)\n\n for (const violation of violations) {\n report({\n token,\n messageId: violation.type,\n data: violation.data as Record<string, string>,\n })\n }\n }\n },\n})\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Rule: require-description\n *\n * Requires tokens to have descriptions.\n */\n\nimport { createRule } from '@lint/create-rule'\nimport { matchesGlob } from '@lint/utils'\n\nexport const RequireDescriptionMessages = {\n MISSING_DESCRIPTION: 'MISSING_DESCRIPTION',\n TOO_SHORT: 'TOO_SHORT',\n} as const\n\nexport type RequireDescriptionOptions = {\n /** Minimum length for description. Default: 1 */\n minLength?: number\n /** Token name patterns to ignore (glob patterns) */\n ignore?: string[]\n}\n\nexport const requireDescription = createRule<\n (typeof RequireDescriptionMessages)[keyof typeof RequireDescriptionMessages],\n RequireDescriptionOptions\n>({\n meta: {\n name: 'require-description',\n description: 'Require tokens to have descriptions',\n messages: {\n MISSING_DESCRIPTION: \"Token '{{name}}' is missing a description\",\n TOO_SHORT: \"Token '{{name}}' description is too short ({{length}} chars, min {{minLength}})\",\n },\n },\n defaultOptions: { minLength: 1 },\n create({ tokens, options, report }) {\n const minLength = options.minLength ?? 1\n const ignore = options.ignore ?? []\n\n for (const token of Object.values(tokens)) {\n // Skip ignored tokens\n if (ignore.length > 0 && matchesGlob(token.name, ignore)) {\n continue\n }\n\n if (!token.$description) {\n report({\n token,\n messageId: 'MISSING_DESCRIPTION',\n data: { name: token.name },\n })\n } else if (token.$description.length < minLength) {\n report({\n token,\n messageId: 'TOO_SHORT',\n data: {\n name: token.name,\n length: token.$description.length,\n minLength,\n },\n })\n }\n }\n },\n})\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Built-in lint rules and dispersa plugin\n */\n\nimport type { LintPlugin, LintConfig } from '@lint/types'\n\nimport type { NamingConventionOptions } from './naming-convention'\nimport { namingConvention } from './naming-convention'\nimport type { NoDeprecatedUsageOptions } from './no-deprecated-usage'\nimport { noDeprecatedUsage } from './no-deprecated-usage'\nimport type { NoDuplicateValuesOptions } from './no-duplicate-values'\nimport { noDuplicateValues } from './no-duplicate-values'\nimport type { PathSchemaConfig } from './path-schema'\nimport { pathSchema } from './path-schema'\nimport type { RequireDescriptionOptions } from './require-description'\nimport { requireDescription } from './require-description'\n\n// Re-export rules for direct use\nexport { requireDescription } from './require-description'\nexport { namingConvention } from './naming-convention'\nexport { noDeprecatedUsage } from './no-deprecated-usage'\nexport { noDuplicateValues } from './no-duplicate-values'\nexport {\n pathSchema,\n type PathSchemaConfig,\n type SegmentDefinition,\n type TransitionRule,\n} from './path-schema'\n\n// Export option types for plugin authors\nexport type { RequireDescriptionOptions } from './require-description'\nexport type { NamingConventionOptions } from './naming-convention'\nexport type { NoDeprecatedUsageOptions } from './no-deprecated-usage'\nexport type { NoDuplicateValuesOptions } from './no-duplicate-values'\n\n/**\n * Builds the dispersa plugin with its predefined configs.\n *\n * Uses a factory to encapsulate the self-referential setup:\n * configs reference the plugin, and the plugin carries configs.\n * The returned objects are fully formed -- no external mutation.\n */\nfunction buildDispersaPlugin() {\n const rules = {\n 'require-description': requireDescription,\n 'naming-convention': namingConvention,\n 'no-deprecated-usage': noDeprecatedUsage,\n 'no-duplicate-values': noDuplicateValues,\n 'path-schema': pathSchema,\n }\n\n const plugin: LintPlugin = { meta: { name: 'dispersa' }, rules, configs: {} }\n\n const recommended: LintConfig = {\n plugins: { dispersa: plugin },\n rules: {\n 'dispersa/require-description': 'warn',\n 'dispersa/naming-convention': ['error', { format: 'kebab-case' }],\n 'dispersa/no-deprecated-usage': 'warn',\n },\n }\n\n const strict: LintConfig = {\n plugins: { dispersa: plugin },\n rules: {\n 'dispersa/require-description': 'error',\n 'dispersa/naming-convention': ['error', { format: 'kebab-case' }],\n 'dispersa/no-deprecated-usage': 'error',\n 'dispersa/no-duplicate-values': 'error',\n },\n }\n\n const minimal: LintConfig = {\n plugins: { dispersa: plugin },\n rules: {\n 'dispersa/no-deprecated-usage': 'warn',\n },\n }\n\n plugin.configs = { recommended, strict, minimal }\n\n return { plugin, recommended, strict, minimal } as const\n}\n\nconst {\n plugin: dispersaPlugin,\n recommended: recommendedConfig,\n strict: strictConfig,\n minimal: minimalConfig,\n} = buildDispersaPlugin()\n\n/**\n * Built-in Dispersa lint plugin\n *\n * Provides core lint rules for design token validation.\n *\n * @example\n * ```typescript\n * import { dispersaPlugin } from 'dispersa/lint'\n *\n * const config = {\n * plugins: { dispersa: dispersaPlugin },\n * rules: {\n * 'dispersa/require-description': 'warn',\n * 'dispersa/naming-convention': ['error', { format: 'kebab-case' }],\n * },\n * }\n * ```\n */\nexport { dispersaPlugin }\n\n/** Recommended lint configuration */\nexport { recommendedConfig }\n\n/** Strict lint configuration */\nexport { strictConfig }\n\n/** Minimal lint configuration */\nexport { minimalConfig }\n\n// ============================================================================\n// Declaration Merging: Register dispersa's built-in rules in the type registry\n// ============================================================================\n\ndeclare module '../types' {\n interface RulesRegistry {\n 'dispersa/require-description': RequireDescriptionOptions\n 'dispersa/naming-convention': NamingConventionOptions\n 'dispersa/no-deprecated-usage': NoDeprecatedUsageOptions\n 'dispersa/no-duplicate-values': NoDuplicateValuesOptions\n 'dispersa/path-schema': PathSchemaConfig\n }\n}\n","/**\n * @license MIT\n * Copyright (c) 2025-present Dispersa\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @fileoverview Lint output formatter interface and utilities\n */\n\nimport type { LintIssue, LintResult, LintFormatter } from '@lint/types'\n\n/**\n * Format lint results as JSON\n */\nexport const formatLintJson: LintFormatter = (result: LintResult): string => {\n return JSON.stringify(result, null, 2)\n}\n\n/**\n * Format lint results in a human-readable stylish format\n */\nexport const formatLintStylish: LintFormatter = (result: LintResult): string => {\n const lines: string[] = []\n\n if (result.issues.length === 0) {\n return '✓ No lint issues found'\n }\n\n // Group issues by token\n const byToken = new Map<string, LintIssue[]>()\n for (const issue of result.issues) {\n const existing = byToken.get(issue.tokenName) ?? []\n existing.push(issue)\n byToken.set(issue.tokenName, existing)\n }\n\n // Output issues\n for (const [tokenName, issues] of byToken) {\n lines.push(``)\n lines.push(` ${tokenName}`)\n for (const issue of issues) {\n const severity = issue.severity === 'error' ? '✖' : '⚠'\n const label = issue.severity === 'error' ? 'error' : 'warning'\n lines.push(` ${severity} ${label}: ${issue.message} [${issue.ruleId}]`)\n }\n }\n\n // Summary\n lines.push(``)\n if (result.errorCount > 0 || result.warningCount > 0) {\n const parts: string[] = []\n if (result.errorCount > 0) {\n parts.push(`${result.errorCount} error${result.errorCount === 1 ? '' : 's'}`)\n }\n if (result.warningCount > 0) {\n parts.push(`${result.warningCount} warning${result.warningCount === 1 ? '' : 's'}`)\n }\n lines.push(`✖ ${parts.join(', ')}`)\n }\n\n return lines.join('\\n')\n}\n\n/**\n * Format lint results for CI output (compact, parseable)\n */\nexport const formatLintCompact: LintFormatter = (result: LintResult): string => {\n const lines: string[] = []\n\n for (const issue of result.issues) {\n const severity = issue.severity.toUpperCase()\n lines.push(`${severity}: ${issue.ruleId} - ${issue.message} (token: ${issue.tokenName})`)\n }\n\n if (result.errorCount > 0 || result.warningCount > 0) {\n lines.push(`SUMMARY: ${result.errorCount} errors, ${result.warningCount} warnings`)\n }\n\n return lines.join('\\n')\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dispersa",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Core library for processing DTCG design tokens",
5
5
  "author": "Tim Gesemann",
6
6
  "license": "MIT",
@@ -133,23 +133,23 @@
133
133
  "dist"
134
134
  ],
135
135
  "dependencies": {
136
- "ajv": "^8.17.1",
136
+ "ajv": "^8.18.0",
137
137
  "ajv-formats": "^3.0.1",
138
138
  "change-case": "^5.4.4",
139
139
  "culori": "^4.0.2",
140
- "fast-glob": "^3.3.2",
140
+ "fast-glob": "^3.3.3",
141
141
  "jiti": "^2.6.1",
142
142
  "json-ptr": "^3.1.1",
143
143
  "json-schema-to-ts": "^3.1.1",
144
- "prettier": "^3.6.2"
144
+ "prettier": "^3.8.1"
145
145
  },
146
146
  "devDependencies": {
147
147
  "@types/culori": "^4.0.1",
148
- "@types/node": "^22.10.2",
149
- "@vitest/coverage-v8": "^2.1.9",
150
- "tsup": "^8.3.5",
151
- "typescript": "^5.7.2",
152
- "vitest": "^2.1.8"
148
+ "@types/node": "^25.3.0",
149
+ "@vitest/coverage-v8": "^4.0.18",
150
+ "tsup": "^8.5.1",
151
+ "typescript": "^5.9.3",
152
+ "vitest": "^4.0.18"
153
153
  },
154
154
  "scripts": {
155
155
  "build": "tsup",