@typestyles/eslint-plugin 0.2.0 → 0.3.1

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/README.md CHANGED
@@ -76,6 +76,27 @@ Tracks `styles.component`, `styles.class`, `tokens.create`, `tokens.createTheme`
76
76
 
77
77
  > Bundler plugins (`@typestyles/vite`, etc.) also fail the build on duplicate `styles.component` / `styles.class` namespaces. ESLint catches the issue earlier in the editor.
78
78
 
79
+ ### `@typestyles/no-removed-public-classname` (opt-in)
80
+
81
+ Guards **publishable** design systems against semver-breaking semantic class renames. Compares the current project scan to a committed `.typestyles-public-classnames.json` snapshot (generate with `typestyles snapshot --write` from [`@typestyles/cli`](../cli)).
82
+
83
+ ```js
84
+ '@typestyles/no-removed-public-classname': [
85
+ 'error',
86
+ { snapshotFile: '.typestyles-public-classnames.json' },
87
+ ],
88
+ ```
89
+
90
+ Adding new class names never fails — only removals or renames do.
91
+
92
+ **Diagnostics** are reported once per ESLint run (on `Program:exit`), not at the specific `styles.component()` call site. Treat them as project-level semver checks, similar to `no-duplicate-namespace`.
93
+
94
+ **Static analysis limits** (best-effort, not exhaustive):
95
+
96
+ - Namespace must be a **string literal** — variables and template literals are skipped
97
+ - Only direct `styles.component()` / `binding.component()` calls are found
98
+ - Projects with multiple `createStyles({ scopeId })` configs only infer a default binding when all configs agree
99
+
79
100
  ## Enable individual rules
80
101
 
81
102
  ```js
@@ -108,11 +129,12 @@ export const typestylesAppConfig = tseslint.config(
108
129
 
109
130
  ## Related packages
110
131
 
111
- | Package | Role |
112
- | ----------------------------------- | ------------------------------------- |
113
- | [`typestyles`](../typestyles) | Core library the rules analyze |
114
- | [`@typestyles/migrate`](../migrate) | Codemods — run ESLint after migrating |
115
- | [`@typestyles/vite`](../vite) | Build-time duplicate namespace checks |
132
+ | Package | Role |
133
+ | ----------------------------------- | ------------------------------------------ |
134
+ | [`typestyles`](../typestyles) | Core library the rules analyze |
135
+ | [`@typestyles/migrate`](../migrate) | Codemods — run ESLint after migrating |
136
+ | [`@typestyles/cli`](../cli) | `typestyles snapshot` and future CLI tools |
137
+ | [`@typestyles/vite`](../vite) | Build-time duplicate namespace checks |
116
138
 
117
139
  ## License
118
140
 
package/dist/index.cjs CHANGED
@@ -3,6 +3,12 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var utils = require('@typescript-eslint/utils');
6
+ var path = require('path');
7
+ var cli = require('@typestyles/cli');
8
+
9
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
10
+
11
+ var path__default = /*#__PURE__*/_interopDefault(path);
6
12
 
7
13
  // src/utils/create-rule.ts
8
14
  var createRule = utils.ESLintUtils.RuleCreator(
@@ -582,6 +588,68 @@ var noInvalidUnitlessValue = createRule({
582
588
  };
583
589
  }
584
590
  });
591
+ var comparisonDone = false;
592
+ var cachedRemoved = [];
593
+ var reportsEmitted = false;
594
+ function resolveRemovedClassNames(context, options) {
595
+ if (comparisonDone) return cachedRemoved;
596
+ const rootDir = path__default.default.resolve(options?.rootDir ?? context.cwd ?? process.cwd());
597
+ const snapshotPath = path__default.default.resolve(rootDir, options?.snapshotFile ?? cli.PUBLIC_CLASSNAMES_SNAPSHOT);
598
+ const snapshot = cli.loadPublicClassNamesSnapshot(snapshotPath);
599
+ if (!snapshot) {
600
+ comparisonDone = true;
601
+ cachedRemoved = [];
602
+ return cachedRemoved;
603
+ }
604
+ const current = cli.collectPublicClassNamesSync({ rootDir });
605
+ cachedRemoved = cli.diffRemovedPublicClassNames(snapshot, current);
606
+ comparisonDone = true;
607
+ return cachedRemoved;
608
+ }
609
+ var noRemovedPublicClassname = createRule({
610
+ name: "no-removed-public-classname",
611
+ meta: {
612
+ type: "problem",
613
+ docs: {
614
+ description: "Disallow removing or renaming semantic class names listed in `.typestyles-public-classnames.json`"
615
+ },
616
+ messages: {
617
+ removed: "Public class name `{{className}}` was removed or renamed. This is a breaking change \u2014 restore the name or regenerate the snapshot with `typestyles snapshot --write` after a deliberate semver bump."
618
+ },
619
+ schema: [
620
+ {
621
+ type: "object",
622
+ properties: {
623
+ snapshotFile: { type: "string" },
624
+ rootDir: { type: "string" }
625
+ },
626
+ additionalProperties: false
627
+ }
628
+ ]
629
+ },
630
+ defaultOptions: [{}],
631
+ create(context, [options]) {
632
+ const rootDir = path__default.default.resolve(options?.rootDir ?? context.cwd ?? process.cwd());
633
+ const snapshotPath = path__default.default.resolve(rootDir, options?.snapshotFile ?? cli.PUBLIC_CLASSNAMES_SNAPSHOT);
634
+ if (!cli.loadPublicClassNamesSnapshot(snapshotPath)) {
635
+ return {};
636
+ }
637
+ return {
638
+ "Program:exit"(node) {
639
+ if (reportsEmitted) return;
640
+ reportsEmitted = true;
641
+ const removed = resolveRemovedClassNames(context, options);
642
+ for (const entry of removed) {
643
+ context.report({
644
+ node,
645
+ messageId: "removed",
646
+ data: { className: entry.className }
647
+ });
648
+ }
649
+ }
650
+ };
651
+ }
652
+ });
585
653
 
586
654
  // src/rules/no-shorthand-longhand-conflict.ts
587
655
  var noShorthandLonghandConflict = createRule({
@@ -633,7 +701,8 @@ var rules = {
633
701
  "no-default-scope-in-package": noDefaultScopeInPackage,
634
702
  "no-shorthand-longhand-conflict": noShorthandLonghandConflict,
635
703
  "no-invalid-unitless-value": noInvalidUnitlessValue,
636
- "no-duplicate-namespace": noDuplicateNamespace
704
+ "no-duplicate-namespace": noDuplicateNamespace,
705
+ "no-removed-public-classname": noRemovedPublicClassname
637
706
  };
638
707
  var plugin = {
639
708
  meta: {
@@ -674,6 +743,7 @@ exports.default = src_default;
674
743
  exports.noDefaultScopeInPackage = noDefaultScopeInPackage;
675
744
  exports.noDuplicateNamespace = noDuplicateNamespace;
676
745
  exports.noInvalidUnitlessValue = noInvalidUnitlessValue;
746
+ exports.noRemovedPublicClassname = noRemovedPublicClassname;
677
747
  exports.noShorthandLonghandConflict = noShorthandLonghandConflict;
678
748
  exports.rules = rules;
679
749
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/create-rule.ts","../src/rules/no-default-scope-in-package.ts","../src/utils/style-calls.ts","../src/rules/no-duplicate-namespace.ts","../src/utils/css-properties.ts","../src/utils/style-ast.ts","../src/rules/no-invalid-unitless-value.ts","../src/rules/no-shorthand-longhand-conflict.ts","../src/index.ts"],"names":["ESLintUtils","memberPropertyName"],"mappings":"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","file":"index.cjs","sourcesContent":["import { ESLintUtils } from '@typescript-eslint/utils';\n\nexport const createRule = ESLintUtils.RuleCreator(\n (name) => `https://typestyles.dev/docs/eslint#${name}`,\n);\n","import type { TSESTree } from '@typescript-eslint/utils';\nimport { createRule } from '../utils/create-rule';\n\nfunction memberPropertyName(node: TSESTree.MemberExpression): string | null {\n if (node.property.type === 'Identifier' && !node.computed) return node.property.name;\n if (node.property.type === 'Literal' && typeof node.property.value === 'string') {\n return node.property.value;\n }\n return null;\n}\n\nfunction isDefaultStylesCall(node: TSESTree.CallExpression): boolean {\n const { callee } = node;\n if (callee.type !== 'MemberExpression') return false;\n const method = memberPropertyName(callee);\n if (method !== 'class' && method !== 'component') return false;\n\n if (callee.object.type === 'Identifier') {\n return callee.object.name === 'styles';\n }\n return false;\n}\n\nexport const noDefaultScopeInPackage = createRule({\n name: 'no-default-scope-in-package',\n meta: {\n type: 'suggestion',\n docs: {\n description:\n 'Require a scoped styles factory (`createTypeStyles`/`createStyles` with `scopeId`) instead of the default `styles` export in publishable packages',\n },\n messages: {\n unscopedInPackage:\n 'Using the default `styles.{{method}}()` in a published package risks class-name collisions. Use `createTypeStyles({ scopeId: pkg.name })` or `createStyles({ scopeId })` instead.',\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n CallExpression(node) {\n if (!isDefaultStylesCall(node)) return;\n\n const method = memberPropertyName(node.callee as TSESTree.MemberExpression);\n\n context.report({\n node: node.callee,\n messageId: 'unscopedInPackage',\n data: { method: method ?? 'class' },\n });\n },\n };\n },\n});\n","import type { TSESTree } from '@typescript-eslint/utils';\n\nexport type NamespaceKind =\n | 'styles.class'\n | 'styles.component'\n | 'styles.hashClass'\n | 'tokens.create'\n | 'tokens.createTheme'\n | 'createTheme'\n | 'keyframes.create'\n | 'global.style'\n | 'global.fontFace';\n\nexport interface NamespaceCall {\n kind: NamespaceKind;\n /** Logical namespace key used for duplicate detection. */\n key: string;\n /** AST node for the namespace string literal (for reporting). */\n nameNode: TSESTree.StringLiteral;\n}\n\nfunction memberPropertyName(node: TSESTree.MemberExpression): string | null {\n if (node.property.type === 'Identifier' && !node.computed) return node.property.name;\n if (node.property.type === 'Literal' && typeof node.property.value === 'string') {\n return node.property.value;\n }\n return null;\n}\n\nfunction calleeRootName(node: TSESTree.CallExpression['callee']): string | null {\n if (node.type === 'Identifier') return node.name;\n if (node.type === 'MemberExpression') {\n if (node.object.type === 'Identifier') return node.object.name;\n if (node.object.type === 'MemberExpression') {\n const inner = memberPropertyName(node.object);\n const outer = calleeRootName(node.object);\n if (outer && inner) return `${outer}.${inner}`;\n }\n }\n return null;\n}\n\nfunction isMemberCall(\n callee: TSESTree.CallExpression['callee'],\n objectName: string,\n method: string,\n): boolean {\n if (callee.type !== 'MemberExpression') return false;\n const methodName = memberPropertyName(callee);\n if (methodName !== method) return false;\n if (callee.object.type === 'Identifier') return callee.object.name === objectName;\n return false;\n}\n\nfunction firstStringArg(args: TSESTree.CallExpressionArgument[]): TSESTree.StringLiteral | null {\n const first = args[0];\n if (!first || first.type === 'SpreadElement') return null;\n if (first.type === 'Literal' && typeof first.value === 'string') return first;\n return null;\n}\n\n/**\n * Detect TypeStyles namespace registrations from call expressions.\n * Matches API shape (e.g. `styles.class('card', …)`) regardless of import alias.\n */\nexport function getNamespaceCall(node: TSESTree.CallExpression): NamespaceCall | null {\n const { callee, arguments: args } = node;\n\n if (isMemberCall(callee, 'styles', 'class')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'styles.class', key: `.${nameNode.value}-`, nameNode };\n }\n\n if (isMemberCall(callee, 'styles', 'component')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'styles.component', key: `.${nameNode.value}-`, nameNode };\n }\n\n if (isMemberCall(callee, 'styles', 'hashClass')) {\n const first = args[0];\n if (!first || first.type === 'SpreadElement') return null;\n if (first.type === 'Literal' && typeof first.value === 'string') {\n return { kind: 'styles.hashClass', key: `.${first.value}-`, nameNode: first };\n }\n const label = args[1];\n if (label?.type === 'Literal' && typeof label.value === 'string') {\n return { kind: 'styles.hashClass', key: `.${label.value}-`, nameNode: label };\n }\n return null;\n }\n\n if (isMemberCall(callee, 'tokens', 'create')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'tokens.create', key: `tokens:${nameNode.value}`, nameNode };\n }\n\n if (isMemberCall(callee, 'tokens', 'createTheme')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'tokens.createTheme', key: `theme:${nameNode.value}`, nameNode };\n }\n\n if (callee.type === 'Identifier' && callee.name === 'createTheme') {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'createTheme', key: `theme:${nameNode.value}`, nameNode };\n }\n\n if (isMemberCall(callee, 'keyframes', 'create')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'keyframes.create', key: `keyframes:${nameNode.value}`, nameNode };\n }\n\n if (isMemberCall(callee, 'global', 'style')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'global.style', key: nameNode.value, nameNode };\n }\n\n if (isMemberCall(callee, 'global', 'fontFace')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'global.fontFace', key: `font-face:${nameNode.value}`, nameNode };\n }\n\n // `myStyles.class` / `myTokens.create` from createStyles/createTokens bindings\n if (callee.type === 'MemberExpression') {\n const method = memberPropertyName(callee);\n const root = calleeRootName(callee);\n if (method === 'class' && root) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'styles.class', key: `.${nameNode.value}-`, nameNode };\n }\n if (method === 'component' && root) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'styles.component', key: `.${nameNode.value}-`, nameNode };\n }\n if (method === 'create' && root?.endsWith('tokens')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'tokens.create', key: `tokens:${nameNode.value}`, nameNode };\n }\n }\n\n return null;\n}\n\n/** Extract style object literals passed to TypeStyles style APIs. */\nexport function getStyleObjectArguments(\n node: TSESTree.CallExpression,\n): TSESTree.ObjectExpression[] {\n const { callee, arguments: args } = node;\n const objects: TSESTree.ObjectExpression[] = [];\n\n const pushObject = (arg: TSESTree.CallExpressionArgument | undefined) => {\n if (!arg || arg.type === 'SpreadElement') return;\n if (arg.type === 'ObjectExpression') objects.push(arg);\n if (arg.type === 'ArrowFunctionExpression' && arg.body.type === 'ObjectExpression') {\n objects.push(arg.body);\n }\n };\n\n if (callee.type === 'MemberExpression') {\n const method = memberPropertyName(callee);\n if (method === 'class' || method === 'component') {\n pushObject(args[1]);\n return objects;\n }\n if (method === 'hashClass') {\n const first = args[0];\n if (first && first.type !== 'SpreadElement' && first.type === 'ObjectExpression') {\n objects.push(first);\n }\n return objects;\n }\n }\n\n return objects;\n}\n","import { createRule } from '../utils/create-rule';\nimport { getNamespaceCall } from '../utils/style-calls';\n\ninterface NamespaceLocation {\n filename: string;\n line: number;\n column: number;\n}\n\n/** Cross-file registry for a single ESLint CLI run (best-effort; not shared across workers). */\nconst namespaceRegistry = new Map<string, NamespaceLocation>();\n\n/** @internal Test hook */\nexport function resetNamespaceRegistry(): void {\n namespaceRegistry.clear();\n}\n\nexport const noDuplicateNamespace = createRule({\n name: 'no-duplicate-namespace',\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Disallow reusing the same TypeStyles namespace (`styles.class`, `styles.component`, `tokens.create`, …) across the project',\n },\n messages: {\n duplicateInFile:\n 'Namespace `{{name}}` ({{kind}}) is already registered in this file at line {{line}}.',\n duplicateAcrossFiles:\n 'Namespace `{{name}}` ({{kind}}) is already registered in `{{otherFile}}` at line {{line}}.',\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const fileSeen = new Map<string, { line: number; column: number }>();\n const filename = context.filename;\n\n return {\n CallExpression(node) {\n const call = getNamespaceCall(node);\n if (!call) return;\n\n const displayName =\n call.kind === 'styles.class' || call.kind === 'styles.component'\n ? call.nameNode.value\n : call.nameNode.value;\n\n const line = call.nameNode.loc?.start.line ?? node.loc?.start.line ?? 0;\n const column = call.nameNode.loc?.start.column ?? node.loc?.start.column ?? 0;\n\n const priorInFile = fileSeen.get(call.key);\n if (priorInFile) {\n context.report({\n node: call.nameNode,\n messageId: 'duplicateInFile',\n data: {\n name: displayName,\n kind: call.kind,\n line: String(priorInFile.line),\n },\n });\n return;\n }\n fileSeen.set(call.key, { line, column });\n\n const priorGlobal = namespaceRegistry.get(call.key);\n if (priorGlobal && priorGlobal.filename !== filename) {\n context.report({\n node: call.nameNode,\n messageId: 'duplicateAcrossFiles',\n data: {\n name: displayName,\n kind: call.kind,\n otherFile: priorGlobal.filename,\n line: String(priorGlobal.line),\n },\n });\n return;\n }\n\n if (!priorGlobal) {\n namespaceRegistry.set(call.key, { filename, line, column });\n }\n },\n };\n },\n});\n","/**\n * CSS properties that accept unitless numbers in TypeStyles serialization.\n * Keep in sync with `packages/typestyles/src/css.ts`.\n */\nexport const UNITLESS_PROPERTIES = new Set([\n 'animationIterationCount',\n 'aspectRatio',\n 'borderImageOutset',\n 'borderImageSlice',\n 'borderImageWidth',\n 'boxFlex',\n 'boxFlexGroup',\n 'boxOrdinalGroup',\n 'columnCount',\n 'columns',\n 'flex',\n 'flexGrow',\n 'flexPositive',\n 'flexShrink',\n 'flexNegative',\n 'flexOrder',\n 'fontSizeAdjust',\n 'fontWeight',\n 'gridArea',\n 'gridColumn',\n 'gridColumnEnd',\n 'gridColumnSpan',\n 'gridColumnStart',\n 'gridRow',\n 'gridRowEnd',\n 'gridRowSpan',\n 'gridRowStart',\n 'initialLetter',\n 'lineClamp',\n 'lineHeight',\n 'maskBorderOutset',\n 'maskBorderSlice',\n 'maskBorderWidth',\n 'opacity',\n 'order',\n 'orphans',\n 'scale',\n 'tabSize',\n 'widows',\n 'zIndex',\n 'zoom',\n 'fillOpacity',\n 'floodOpacity',\n 'stopOpacity',\n 'strokeDasharray',\n 'strokeDashoffset',\n 'strokeMiterlimit',\n 'strokeOpacity',\n 'strokeWidth',\n]);\n\nconst VENDOR_PREFIX_RE = /^(Webkit|Moz|ms|O)([A-Z])(.*)$/;\n\nexport function isUnitlessProperty(prop: string): boolean {\n if (UNITLESS_PROPERTIES.has(prop)) return true;\n const match = VENDOR_PREFIX_RE.exec(prop);\n if (match) {\n return UNITLESS_PROPERTIES.has(match[2].toLowerCase() + match[3]);\n }\n return false;\n}\n\n/** Shorthand property → longhands that must not appear in the same style object. */\nexport const SHORTHAND_TO_LONGHANDS: Readonly<Record<string, readonly string[]>> = {\n padding: [\n 'paddingTop',\n 'paddingRight',\n 'paddingBottom',\n 'paddingLeft',\n 'paddingInline',\n 'paddingBlock',\n 'paddingInlineStart',\n 'paddingInlineEnd',\n 'paddingBlockStart',\n 'paddingBlockEnd',\n ],\n margin: [\n 'marginTop',\n 'marginRight',\n 'marginBottom',\n 'marginLeft',\n 'marginInline',\n 'marginBlock',\n 'marginInlineStart',\n 'marginInlineEnd',\n 'marginBlockStart',\n 'marginBlockEnd',\n ],\n border: [\n 'borderWidth',\n 'borderStyle',\n 'borderColor',\n 'borderTop',\n 'borderRight',\n 'borderBottom',\n 'borderLeft',\n 'borderInline',\n 'borderBlock',\n ],\n borderWidth: [\n 'borderTopWidth',\n 'borderRightWidth',\n 'borderBottomWidth',\n 'borderLeftWidth',\n 'borderInlineWidth',\n 'borderBlockWidth',\n ],\n borderStyle: ['borderTopStyle', 'borderRightStyle', 'borderBottomStyle', 'borderLeftStyle'],\n borderColor: ['borderTopColor', 'borderRightColor', 'borderBottomColor', 'borderLeftColor'],\n borderTop: ['borderTopWidth', 'borderTopStyle', 'borderTopColor'],\n borderRight: ['borderRightWidth', 'borderRightStyle', 'borderRightColor'],\n borderBottom: ['borderBottomWidth', 'borderBottomStyle', 'borderBottomColor'],\n borderLeft: ['borderLeftWidth', 'borderLeftStyle', 'borderLeftColor'],\n background: [\n 'backgroundColor',\n 'backgroundImage',\n 'backgroundPosition',\n 'backgroundSize',\n 'backgroundRepeat',\n 'backgroundAttachment',\n 'backgroundOrigin',\n 'backgroundClip',\n ],\n font: ['fontStyle', 'fontVariant', 'fontWeight', 'fontSize', 'lineHeight', 'fontFamily'],\n flex: ['flexGrow', 'flexShrink', 'flexBasis'],\n gap: ['rowGap', 'columnGap'],\n overflow: ['overflowX', 'overflowY'],\n transition: [\n 'transitionProperty',\n 'transitionDuration',\n 'transitionTimingFunction',\n 'transitionDelay',\n ],\n animation: [\n 'animationName',\n 'animationDuration',\n 'animationTimingFunction',\n 'animationDelay',\n 'animationIterationCount',\n 'animationDirection',\n 'animationFillMode',\n 'animationPlayState',\n ],\n outline: ['outlineWidth', 'outlineStyle', 'outlineColor'],\n listStyle: ['listStyleType', 'listStylePosition', 'listStyleImage'],\n grid: [\n 'gridTemplateRows',\n 'gridTemplateColumns',\n 'gridTemplateAreas',\n 'gridAutoRows',\n 'gridAutoColumns',\n 'gridAutoFlow',\n ],\n gridTemplate: ['gridTemplateRows', 'gridTemplateColumns', 'gridTemplateAreas'],\n inset: ['top', 'right', 'bottom', 'left'],\n insetBlock: ['insetBlockStart', 'insetBlockEnd'],\n insetInline: ['insetInlineStart', 'insetInlineEnd'],\n};\n\n/** Bare numeric strings (no CSS unit) that emit invalid CSS when serialized. */\nexport const BARE_NUMBER_STRING_RE = /^-?\\d+(\\.\\d+)?$/;\n\nexport function findShorthandLonghandConflicts(\n propertyNames: readonly string[],\n): Array<{ shorthand: string; longhand: string }> {\n const keys = new Set(propertyNames);\n const seen = new Set<string>();\n const conflicts: Array<{ shorthand: string; longhand: string }> = [];\n\n for (const key of keys) {\n const longhands = SHORTHAND_TO_LONGHANDS[key];\n if (longhands) {\n for (const longhand of longhands) {\n if (keys.has(longhand)) {\n const id = `${key}|${longhand}`;\n if (!seen.has(id)) {\n seen.add(id);\n conflicts.push({ shorthand: key, longhand });\n }\n }\n }\n }\n }\n\n return conflicts;\n}\n","import type { TSESTree } from '@typescript-eslint/utils';\n\nconst NESTED_SELECTOR_KEY_RE = /^(&|@|\\[)/;\n\n/** Keys that wrap nested style objects in component configs. */\nconst COMPONENT_STRUCTURAL_KEYS = new Set([\n 'base',\n 'variants',\n 'defaultVariants',\n 'compoundVariants',\n 'slots',\n]);\n\nexport function getStaticPropertyKey(prop: TSESTree.Property): string | null {\n if (prop.computed) return null;\n if (prop.key.type === 'Identifier') return prop.key.name;\n if (prop.key.type === 'Literal' && typeof prop.key.value === 'string') return prop.key.value;\n return null;\n}\n\nexport function isCssPropertyKey(key: string): boolean {\n if (NESTED_SELECTOR_KEY_RE.test(key)) return false;\n if (COMPONENT_STRUCTURAL_KEYS.has(key)) return false;\n return /^[a-zA-Z]/.test(key);\n}\n\n/**\n * Collect CSS property names declared at the top level of a style object literal.\n */\nexport function collectCssPropertyNames(obj: TSESTree.ObjectExpression): string[] {\n const names: string[] = [];\n for (const prop of obj.properties) {\n if (prop.type !== 'Property') continue;\n const key = getStaticPropertyKey(prop);\n if (key && isCssPropertyKey(key)) names.push(key);\n }\n return names;\n}\n\n/**\n * Visit each style object literal in a TypeStyles style/config tree.\n * Recurses into pseudos, at-rules, component `base` / `variants`, and slot objects.\n */\nexport function visitStyleObjectLiterals(\n node: TSESTree.ObjectExpression,\n onStyleObject: (obj: TSESTree.ObjectExpression) => void,\n): void {\n onStyleObject(node);\n\n for (const prop of node.properties) {\n if (prop.type !== 'Property') continue;\n const key = getStaticPropertyKey(prop);\n if (!key) continue;\n\n if (NESTED_SELECTOR_KEY_RE.test(key)) {\n if (prop.value.type === 'ObjectExpression') {\n visitStyleObjectLiterals(prop.value, onStyleObject);\n }\n continue;\n }\n\n if (key === 'variants' && prop.value.type === 'ObjectExpression') {\n for (const groupProp of prop.value.properties) {\n if (groupProp.type !== 'Property' || groupProp.value.type !== 'ObjectExpression') continue;\n for (const optionProp of groupProp.value.properties) {\n if (optionProp.type === 'Property' && optionProp.value.type === 'ObjectExpression') {\n visitStyleObjectLiterals(optionProp.value, onStyleObject);\n }\n }\n }\n continue;\n }\n\n if (key === 'compoundVariants' && prop.value.type === 'ArrayExpression') {\n for (const element of prop.value.elements) {\n if (!element || element.type !== 'ObjectExpression') continue;\n for (const cvProp of element.properties) {\n if (cvProp.type !== 'Property') continue;\n const cvKey = getStaticPropertyKey(cvProp);\n if (cvKey === 'css' && cvProp.value.type === 'ObjectExpression') {\n visitStyleObjectLiterals(cvProp.value, onStyleObject);\n }\n }\n }\n continue;\n }\n\n if (\n (COMPONENT_STRUCTURAL_KEYS.has(key) || prop.value.type === 'ObjectExpression') &&\n prop.value.type === 'ObjectExpression'\n ) {\n visitStyleObjectLiterals(prop.value, onStyleObject);\n }\n }\n}\n\nexport function getStringLiteralValue(node: TSESTree.Node): string | null {\n if (node.type === 'Literal' && typeof node.value === 'string') return node.value;\n return null;\n}\n\nexport function getNumericLiteralValue(node: TSESTree.Node): number | null {\n if (node.type === 'Literal' && typeof node.value === 'number') return node.value;\n return null;\n}\n","import type { TSESTree } from '@typescript-eslint/utils';\nimport { createRule } from '../utils/create-rule';\nimport { BARE_NUMBER_STRING_RE, isUnitlessProperty } from '../utils/css-properties';\nimport {\n getNumericLiteralValue,\n getStaticPropertyKey,\n getStringLiteralValue,\n isCssPropertyKey,\n visitStyleObjectLiterals,\n} from '../utils/style-ast';\nimport { getStyleObjectArguments } from '../utils/style-calls';\n\nexport const noInvalidUnitlessValue = createRule({\n name: 'no-invalid-unitless-value',\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Disallow bare numeric strings on properties that require CSS units (TypeStyles only auto-appends `px` to numbers, not strings)',\n },\n messages: {\n bareNumberString:\n '`{{property}}` is set to bare number string `{{value}}`, which emits invalid CSS. Use a number (`{{numeric}}`) or a value with units (`{{value}}px`).',\n suspiciousUnitlessNumber:\n '`{{property}}` is unitless in CSS — numeric `{{value}}` is emitted without a unit. Use a ratio (e.g. `1.5`) or an explicit length (`\"24px\"`).',\n },\n schema: [\n {\n type: 'object',\n properties: {\n checkSuspiciousUnitlessNumbers: { type: 'boolean' },\n },\n additionalProperties: false,\n },\n ],\n },\n defaultOptions: [{ checkSuspiciousUnitlessNumbers: true }],\n create(context, [options]) {\n /** Properties where a large integer usually means the author meant a length, not a unitless ratio. */\n const SUSPICIOUS_UNITLESS_PROPERTIES = new Set(['lineHeight']);\n\n function checkStyleObject(obj: TSESTree.ObjectExpression) {\n for (const prop of obj.properties) {\n if (prop.type !== 'Property') continue;\n const key = getStaticPropertyKey(prop);\n if (!key || !isCssPropertyKey(key)) continue;\n\n const stringValue = getStringLiteralValue(prop.value);\n if (stringValue && BARE_NUMBER_STRING_RE.test(stringValue) && !isUnitlessProperty(key)) {\n context.report({\n node: prop.value,\n messageId: 'bareNumberString',\n data: {\n property: key,\n value: stringValue,\n numeric: stringValue,\n },\n });\n continue;\n }\n\n if (options.checkSuspiciousUnitlessNumbers && SUSPICIOUS_UNITLESS_PROPERTIES.has(key)) {\n const num = getNumericLiteralValue(prop.value);\n if (num != null && num >= 8 && Number.isInteger(num)) {\n context.report({\n node: prop.value,\n messageId: 'suspiciousUnitlessNumber',\n data: { property: key, value: String(num) },\n });\n }\n }\n }\n }\n\n return {\n CallExpression(node) {\n for (const styleObj of getStyleObjectArguments(node)) {\n visitStyleObjectLiterals(styleObj, checkStyleObject);\n }\n },\n ObjectExpression(node) {\n const parent = node.parent;\n if (\n parent?.type === 'Property' &&\n (parent.key.type === 'Identifier' || parent.key.type === 'Literal')\n ) {\n const parentKey =\n parent.key.type === 'Identifier'\n ? parent.key.name\n : typeof parent.key.value === 'string'\n ? parent.key.value\n : null;\n if (parentKey === 'from' || parentKey === 'to' || /^\\d+%$/.test(parentKey ?? '')) {\n visitStyleObjectLiterals(node, checkStyleObject);\n }\n }\n },\n };\n },\n});\n","import type { TSESTree } from '@typescript-eslint/utils';\nimport { createRule } from '../utils/create-rule';\nimport { findShorthandLonghandConflicts } from '../utils/css-properties';\nimport { collectCssPropertyNames, visitStyleObjectLiterals } from '../utils/style-ast';\nimport { getStyleObjectArguments } from '../utils/style-calls';\n\nexport const noShorthandLonghandConflict = createRule({\n name: 'no-shorthand-longhand-conflict',\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Disallow mixing CSS shorthand and longhand properties in the same TypeStyles style object',\n },\n messages: {\n conflict:\n '`{{shorthand}}` and `{{longhand}}` must not appear in the same style object — the longhand is ignored or overridden unpredictably.',\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n function checkStyleObject(obj: TSESTree.ObjectExpression) {\n const propertyNames = collectCssPropertyNames(obj);\n const conflicts = findShorthandLonghandConflicts(propertyNames);\n for (const { shorthand, longhand } of conflicts) {\n context.report({\n node: obj,\n messageId: 'conflict',\n data: { shorthand, longhand },\n });\n }\n }\n\n return {\n CallExpression(node) {\n for (const styleObj of getStyleObjectArguments(node)) {\n visitStyleObjectLiterals(styleObj, checkStyleObject);\n }\n },\n ObjectExpression(node) {\n // Keyframe stops: `{ from: { opacity: 0 }, to: { opacity: 1 } }`\n const parent = node.parent;\n if (\n parent?.type === 'Property' &&\n (parent.key.type === 'Identifier' || parent.key.type === 'Literal')\n ) {\n const parentKey =\n parent.key.type === 'Identifier'\n ? parent.key.name\n : typeof parent.key.value === 'string'\n ? parent.key.value\n : null;\n if (parentKey === 'from' || parentKey === 'to' || /^\\d+%$/.test(parentKey ?? '')) {\n visitStyleObjectLiterals(node, checkStyleObject);\n }\n }\n },\n };\n },\n});\n","import { noDefaultScopeInPackage } from './rules/no-default-scope-in-package';\nimport { noDuplicateNamespace } from './rules/no-duplicate-namespace';\nimport { noInvalidUnitlessValue } from './rules/no-invalid-unitless-value';\nimport { noShorthandLonghandConflict } from './rules/no-shorthand-longhand-conflict';\n\nexport const rules = {\n 'no-default-scope-in-package': noDefaultScopeInPackage,\n 'no-shorthand-longhand-conflict': noShorthandLonghandConflict,\n 'no-invalid-unitless-value': noInvalidUnitlessValue,\n 'no-duplicate-namespace': noDuplicateNamespace,\n};\n\nexport {\n noDefaultScopeInPackage,\n noShorthandLonghandConflict,\n noInvalidUnitlessValue,\n noDuplicateNamespace,\n};\n\nconst plugin = {\n meta: {\n name: '@typestyles/eslint-plugin',\n version: '0.1.0',\n },\n rules,\n};\n\n/** Flat-config preset for TypeStyles projects. */\nexport const configs = {\n recommended: {\n plugins: {\n '@typestyles': plugin,\n },\n rules: {\n '@typestyles/no-shorthand-longhand-conflict': 'error',\n '@typestyles/no-invalid-unitless-value': 'error',\n '@typestyles/no-duplicate-namespace': 'error',\n },\n },\n /** Preset for publishable packages — adds `no-default-scope-in-package`. */\n package: {\n plugins: {\n '@typestyles': plugin,\n },\n rules: {\n '@typestyles/no-shorthand-longhand-conflict': 'error',\n '@typestyles/no-invalid-unitless-value': 'error',\n '@typestyles/no-duplicate-namespace': 'error',\n '@typestyles/no-default-scope-in-package': 'error',\n },\n },\n};\n\nObject.assign(plugin, { configs });\n\nexport default plugin;\n"]}
1
+ {"version":3,"sources":["../src/utils/create-rule.ts","../src/rules/no-default-scope-in-package.ts","../src/utils/style-calls.ts","../src/rules/no-duplicate-namespace.ts","../src/utils/css-properties.ts","../src/utils/style-ast.ts","../src/rules/no-invalid-unitless-value.ts","../src/rules/no-removed-public-classname.ts","../src/rules/no-shorthand-longhand-conflict.ts","../src/index.ts"],"names":["ESLintUtils","memberPropertyName","path","PUBLIC_CLASSNAMES_SNAPSHOT","loadPublicClassNamesSnapshot","collectPublicClassNamesSync","diffRemovedPublicClassNames"],"mappings":"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","file":"index.cjs","sourcesContent":["import { ESLintUtils } from '@typescript-eslint/utils';\n\nexport const createRule = ESLintUtils.RuleCreator(\n (name) => `https://typestyles.dev/docs/eslint#${name}`,\n);\n","import type { TSESTree } from '@typescript-eslint/utils';\nimport { createRule } from '../utils/create-rule';\n\nfunction memberPropertyName(node: TSESTree.MemberExpression): string | null {\n if (node.property.type === 'Identifier' && !node.computed) return node.property.name;\n if (node.property.type === 'Literal' && typeof node.property.value === 'string') {\n return node.property.value;\n }\n return null;\n}\n\nfunction isDefaultStylesCall(node: TSESTree.CallExpression): boolean {\n const { callee } = node;\n if (callee.type !== 'MemberExpression') return false;\n const method = memberPropertyName(callee);\n if (method !== 'class' && method !== 'component') return false;\n\n if (callee.object.type === 'Identifier') {\n return callee.object.name === 'styles';\n }\n return false;\n}\n\nexport const noDefaultScopeInPackage = createRule({\n name: 'no-default-scope-in-package',\n meta: {\n type: 'suggestion',\n docs: {\n description:\n 'Require a scoped styles factory (`createTypeStyles`/`createStyles` with `scopeId`) instead of the default `styles` export in publishable packages',\n },\n messages: {\n unscopedInPackage:\n 'Using the default `styles.{{method}}()` in a published package risks class-name collisions. Use `createTypeStyles({ scopeId: pkg.name })` or `createStyles({ scopeId })` instead.',\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n CallExpression(node) {\n if (!isDefaultStylesCall(node)) return;\n\n const method = memberPropertyName(node.callee as TSESTree.MemberExpression);\n\n context.report({\n node: node.callee,\n messageId: 'unscopedInPackage',\n data: { method: method ?? 'class' },\n });\n },\n };\n },\n});\n","import type { TSESTree } from '@typescript-eslint/utils';\n\nexport type NamespaceKind =\n | 'styles.class'\n | 'styles.component'\n | 'styles.hashClass'\n | 'tokens.create'\n | 'tokens.createTheme'\n | 'createTheme'\n | 'keyframes.create'\n | 'global.style'\n | 'global.fontFace';\n\nexport interface NamespaceCall {\n kind: NamespaceKind;\n /** Logical namespace key used for duplicate detection. */\n key: string;\n /** AST node for the namespace string literal (for reporting). */\n nameNode: TSESTree.StringLiteral;\n}\n\nfunction memberPropertyName(node: TSESTree.MemberExpression): string | null {\n if (node.property.type === 'Identifier' && !node.computed) return node.property.name;\n if (node.property.type === 'Literal' && typeof node.property.value === 'string') {\n return node.property.value;\n }\n return null;\n}\n\nfunction calleeRootName(node: TSESTree.CallExpression['callee']): string | null {\n if (node.type === 'Identifier') return node.name;\n if (node.type === 'MemberExpression') {\n if (node.object.type === 'Identifier') return node.object.name;\n if (node.object.type === 'MemberExpression') {\n const inner = memberPropertyName(node.object);\n const outer = calleeRootName(node.object);\n if (outer && inner) return `${outer}.${inner}`;\n }\n }\n return null;\n}\n\nfunction isMemberCall(\n callee: TSESTree.CallExpression['callee'],\n objectName: string,\n method: string,\n): boolean {\n if (callee.type !== 'MemberExpression') return false;\n const methodName = memberPropertyName(callee);\n if (methodName !== method) return false;\n if (callee.object.type === 'Identifier') return callee.object.name === objectName;\n return false;\n}\n\nfunction firstStringArg(args: TSESTree.CallExpressionArgument[]): TSESTree.StringLiteral | null {\n const first = args[0];\n if (!first || first.type === 'SpreadElement') return null;\n if (first.type === 'Literal' && typeof first.value === 'string') return first;\n return null;\n}\n\n/**\n * Detect TypeStyles namespace registrations from call expressions.\n * Matches API shape (e.g. `styles.class('card', …)`) regardless of import alias.\n */\nexport function getNamespaceCall(node: TSESTree.CallExpression): NamespaceCall | null {\n const { callee, arguments: args } = node;\n\n if (isMemberCall(callee, 'styles', 'class')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'styles.class', key: `.${nameNode.value}-`, nameNode };\n }\n\n if (isMemberCall(callee, 'styles', 'component')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'styles.component', key: `.${nameNode.value}-`, nameNode };\n }\n\n if (isMemberCall(callee, 'styles', 'hashClass')) {\n const first = args[0];\n if (!first || first.type === 'SpreadElement') return null;\n if (first.type === 'Literal' && typeof first.value === 'string') {\n return { kind: 'styles.hashClass', key: `.${first.value}-`, nameNode: first };\n }\n const label = args[1];\n if (label?.type === 'Literal' && typeof label.value === 'string') {\n return { kind: 'styles.hashClass', key: `.${label.value}-`, nameNode: label };\n }\n return null;\n }\n\n if (isMemberCall(callee, 'tokens', 'create')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'tokens.create', key: `tokens:${nameNode.value}`, nameNode };\n }\n\n if (isMemberCall(callee, 'tokens', 'createTheme')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'tokens.createTheme', key: `theme:${nameNode.value}`, nameNode };\n }\n\n if (callee.type === 'Identifier' && callee.name === 'createTheme') {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'createTheme', key: `theme:${nameNode.value}`, nameNode };\n }\n\n if (isMemberCall(callee, 'keyframes', 'create')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'keyframes.create', key: `keyframes:${nameNode.value}`, nameNode };\n }\n\n if (isMemberCall(callee, 'global', 'style')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'global.style', key: nameNode.value, nameNode };\n }\n\n if (isMemberCall(callee, 'global', 'fontFace')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'global.fontFace', key: `font-face:${nameNode.value}`, nameNode };\n }\n\n // `myStyles.class` / `myTokens.create` from createStyles/createTokens bindings\n if (callee.type === 'MemberExpression') {\n const method = memberPropertyName(callee);\n const root = calleeRootName(callee);\n if (method === 'class' && root) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'styles.class', key: `.${nameNode.value}-`, nameNode };\n }\n if (method === 'component' && root) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'styles.component', key: `.${nameNode.value}-`, nameNode };\n }\n if (method === 'create' && root?.endsWith('tokens')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'tokens.create', key: `tokens:${nameNode.value}`, nameNode };\n }\n }\n\n return null;\n}\n\n/** Extract style object literals passed to TypeStyles style APIs. */\nexport function getStyleObjectArguments(\n node: TSESTree.CallExpression,\n): TSESTree.ObjectExpression[] {\n const { callee, arguments: args } = node;\n const objects: TSESTree.ObjectExpression[] = [];\n\n const pushObject = (arg: TSESTree.CallExpressionArgument | undefined) => {\n if (!arg || arg.type === 'SpreadElement') return;\n if (arg.type === 'ObjectExpression') objects.push(arg);\n if (arg.type === 'ArrowFunctionExpression' && arg.body.type === 'ObjectExpression') {\n objects.push(arg.body);\n }\n };\n\n if (callee.type === 'MemberExpression') {\n const method = memberPropertyName(callee);\n if (method === 'class' || method === 'component') {\n pushObject(args[1]);\n return objects;\n }\n if (method === 'hashClass') {\n const first = args[0];\n if (first && first.type !== 'SpreadElement' && first.type === 'ObjectExpression') {\n objects.push(first);\n }\n return objects;\n }\n }\n\n return objects;\n}\n","import { createRule } from '../utils/create-rule';\nimport { getNamespaceCall } from '../utils/style-calls';\n\ninterface NamespaceLocation {\n filename: string;\n line: number;\n column: number;\n}\n\n/** Cross-file registry for a single ESLint CLI run (best-effort; not shared across workers). */\nconst namespaceRegistry = new Map<string, NamespaceLocation>();\n\n/** @internal Test hook */\nexport function resetNamespaceRegistry(): void {\n namespaceRegistry.clear();\n}\n\nexport const noDuplicateNamespace = createRule({\n name: 'no-duplicate-namespace',\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Disallow reusing the same TypeStyles namespace (`styles.class`, `styles.component`, `tokens.create`, …) across the project',\n },\n messages: {\n duplicateInFile:\n 'Namespace `{{name}}` ({{kind}}) is already registered in this file at line {{line}}.',\n duplicateAcrossFiles:\n 'Namespace `{{name}}` ({{kind}}) is already registered in `{{otherFile}}` at line {{line}}.',\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const fileSeen = new Map<string, { line: number; column: number }>();\n const filename = context.filename;\n\n return {\n CallExpression(node) {\n const call = getNamespaceCall(node);\n if (!call) return;\n\n const displayName =\n call.kind === 'styles.class' || call.kind === 'styles.component'\n ? call.nameNode.value\n : call.nameNode.value;\n\n const line = call.nameNode.loc?.start.line ?? node.loc?.start.line ?? 0;\n const column = call.nameNode.loc?.start.column ?? node.loc?.start.column ?? 0;\n\n const priorInFile = fileSeen.get(call.key);\n if (priorInFile) {\n context.report({\n node: call.nameNode,\n messageId: 'duplicateInFile',\n data: {\n name: displayName,\n kind: call.kind,\n line: String(priorInFile.line),\n },\n });\n return;\n }\n fileSeen.set(call.key, { line, column });\n\n const priorGlobal = namespaceRegistry.get(call.key);\n if (priorGlobal && priorGlobal.filename !== filename) {\n context.report({\n node: call.nameNode,\n messageId: 'duplicateAcrossFiles',\n data: {\n name: displayName,\n kind: call.kind,\n otherFile: priorGlobal.filename,\n line: String(priorGlobal.line),\n },\n });\n return;\n }\n\n if (!priorGlobal) {\n namespaceRegistry.set(call.key, { filename, line, column });\n }\n },\n };\n },\n});\n","/**\n * CSS properties that accept unitless numbers in TypeStyles serialization.\n * Keep in sync with `packages/typestyles/src/css.ts`.\n */\nexport const UNITLESS_PROPERTIES = new Set([\n 'animationIterationCount',\n 'aspectRatio',\n 'borderImageOutset',\n 'borderImageSlice',\n 'borderImageWidth',\n 'boxFlex',\n 'boxFlexGroup',\n 'boxOrdinalGroup',\n 'columnCount',\n 'columns',\n 'flex',\n 'flexGrow',\n 'flexPositive',\n 'flexShrink',\n 'flexNegative',\n 'flexOrder',\n 'fontSizeAdjust',\n 'fontWeight',\n 'gridArea',\n 'gridColumn',\n 'gridColumnEnd',\n 'gridColumnSpan',\n 'gridColumnStart',\n 'gridRow',\n 'gridRowEnd',\n 'gridRowSpan',\n 'gridRowStart',\n 'initialLetter',\n 'lineClamp',\n 'lineHeight',\n 'maskBorderOutset',\n 'maskBorderSlice',\n 'maskBorderWidth',\n 'opacity',\n 'order',\n 'orphans',\n 'scale',\n 'tabSize',\n 'widows',\n 'zIndex',\n 'zoom',\n 'fillOpacity',\n 'floodOpacity',\n 'stopOpacity',\n 'strokeDasharray',\n 'strokeDashoffset',\n 'strokeMiterlimit',\n 'strokeOpacity',\n 'strokeWidth',\n]);\n\nconst VENDOR_PREFIX_RE = /^(Webkit|Moz|ms|O)([A-Z])(.*)$/;\n\nexport function isUnitlessProperty(prop: string): boolean {\n if (UNITLESS_PROPERTIES.has(prop)) return true;\n const match = VENDOR_PREFIX_RE.exec(prop);\n if (match) {\n return UNITLESS_PROPERTIES.has(match[2].toLowerCase() + match[3]);\n }\n return false;\n}\n\n/** Shorthand property → longhands that must not appear in the same style object. */\nexport const SHORTHAND_TO_LONGHANDS: Readonly<Record<string, readonly string[]>> = {\n padding: [\n 'paddingTop',\n 'paddingRight',\n 'paddingBottom',\n 'paddingLeft',\n 'paddingInline',\n 'paddingBlock',\n 'paddingInlineStart',\n 'paddingInlineEnd',\n 'paddingBlockStart',\n 'paddingBlockEnd',\n ],\n margin: [\n 'marginTop',\n 'marginRight',\n 'marginBottom',\n 'marginLeft',\n 'marginInline',\n 'marginBlock',\n 'marginInlineStart',\n 'marginInlineEnd',\n 'marginBlockStart',\n 'marginBlockEnd',\n ],\n border: [\n 'borderWidth',\n 'borderStyle',\n 'borderColor',\n 'borderTop',\n 'borderRight',\n 'borderBottom',\n 'borderLeft',\n 'borderInline',\n 'borderBlock',\n ],\n borderWidth: [\n 'borderTopWidth',\n 'borderRightWidth',\n 'borderBottomWidth',\n 'borderLeftWidth',\n 'borderInlineWidth',\n 'borderBlockWidth',\n ],\n borderStyle: ['borderTopStyle', 'borderRightStyle', 'borderBottomStyle', 'borderLeftStyle'],\n borderColor: ['borderTopColor', 'borderRightColor', 'borderBottomColor', 'borderLeftColor'],\n borderTop: ['borderTopWidth', 'borderTopStyle', 'borderTopColor'],\n borderRight: ['borderRightWidth', 'borderRightStyle', 'borderRightColor'],\n borderBottom: ['borderBottomWidth', 'borderBottomStyle', 'borderBottomColor'],\n borderLeft: ['borderLeftWidth', 'borderLeftStyle', 'borderLeftColor'],\n background: [\n 'backgroundColor',\n 'backgroundImage',\n 'backgroundPosition',\n 'backgroundSize',\n 'backgroundRepeat',\n 'backgroundAttachment',\n 'backgroundOrigin',\n 'backgroundClip',\n ],\n font: ['fontStyle', 'fontVariant', 'fontWeight', 'fontSize', 'lineHeight', 'fontFamily'],\n flex: ['flexGrow', 'flexShrink', 'flexBasis'],\n gap: ['rowGap', 'columnGap'],\n overflow: ['overflowX', 'overflowY'],\n transition: [\n 'transitionProperty',\n 'transitionDuration',\n 'transitionTimingFunction',\n 'transitionDelay',\n ],\n animation: [\n 'animationName',\n 'animationDuration',\n 'animationTimingFunction',\n 'animationDelay',\n 'animationIterationCount',\n 'animationDirection',\n 'animationFillMode',\n 'animationPlayState',\n ],\n outline: ['outlineWidth', 'outlineStyle', 'outlineColor'],\n listStyle: ['listStyleType', 'listStylePosition', 'listStyleImage'],\n grid: [\n 'gridTemplateRows',\n 'gridTemplateColumns',\n 'gridTemplateAreas',\n 'gridAutoRows',\n 'gridAutoColumns',\n 'gridAutoFlow',\n ],\n gridTemplate: ['gridTemplateRows', 'gridTemplateColumns', 'gridTemplateAreas'],\n inset: ['top', 'right', 'bottom', 'left'],\n insetBlock: ['insetBlockStart', 'insetBlockEnd'],\n insetInline: ['insetInlineStart', 'insetInlineEnd'],\n};\n\n/** Bare numeric strings (no CSS unit) that emit invalid CSS when serialized. */\nexport const BARE_NUMBER_STRING_RE = /^-?\\d+(\\.\\d+)?$/;\n\nexport function findShorthandLonghandConflicts(\n propertyNames: readonly string[],\n): Array<{ shorthand: string; longhand: string }> {\n const keys = new Set(propertyNames);\n const seen = new Set<string>();\n const conflicts: Array<{ shorthand: string; longhand: string }> = [];\n\n for (const key of keys) {\n const longhands = SHORTHAND_TO_LONGHANDS[key];\n if (longhands) {\n for (const longhand of longhands) {\n if (keys.has(longhand)) {\n const id = `${key}|${longhand}`;\n if (!seen.has(id)) {\n seen.add(id);\n conflicts.push({ shorthand: key, longhand });\n }\n }\n }\n }\n }\n\n return conflicts;\n}\n","import type { TSESTree } from '@typescript-eslint/utils';\n\nconst NESTED_SELECTOR_KEY_RE = /^(&|@|\\[)/;\n\n/** Keys that wrap nested style objects in component configs. */\nconst COMPONENT_STRUCTURAL_KEYS = new Set([\n 'base',\n 'variants',\n 'defaultVariants',\n 'compoundVariants',\n 'slots',\n]);\n\nexport function getStaticPropertyKey(prop: TSESTree.Property): string | null {\n if (prop.computed) return null;\n if (prop.key.type === 'Identifier') return prop.key.name;\n if (prop.key.type === 'Literal' && typeof prop.key.value === 'string') return prop.key.value;\n return null;\n}\n\nexport function isCssPropertyKey(key: string): boolean {\n if (NESTED_SELECTOR_KEY_RE.test(key)) return false;\n if (COMPONENT_STRUCTURAL_KEYS.has(key)) return false;\n return /^[a-zA-Z]/.test(key);\n}\n\n/**\n * Collect CSS property names declared at the top level of a style object literal.\n */\nexport function collectCssPropertyNames(obj: TSESTree.ObjectExpression): string[] {\n const names: string[] = [];\n for (const prop of obj.properties) {\n if (prop.type !== 'Property') continue;\n const key = getStaticPropertyKey(prop);\n if (key && isCssPropertyKey(key)) names.push(key);\n }\n return names;\n}\n\n/**\n * Visit each style object literal in a TypeStyles style/config tree.\n * Recurses into pseudos, at-rules, component `base` / `variants`, and slot objects.\n */\nexport function visitStyleObjectLiterals(\n node: TSESTree.ObjectExpression,\n onStyleObject: (obj: TSESTree.ObjectExpression) => void,\n): void {\n onStyleObject(node);\n\n for (const prop of node.properties) {\n if (prop.type !== 'Property') continue;\n const key = getStaticPropertyKey(prop);\n if (!key) continue;\n\n if (NESTED_SELECTOR_KEY_RE.test(key)) {\n if (prop.value.type === 'ObjectExpression') {\n visitStyleObjectLiterals(prop.value, onStyleObject);\n }\n continue;\n }\n\n if (key === 'variants' && prop.value.type === 'ObjectExpression') {\n for (const groupProp of prop.value.properties) {\n if (groupProp.type !== 'Property' || groupProp.value.type !== 'ObjectExpression') continue;\n for (const optionProp of groupProp.value.properties) {\n if (optionProp.type === 'Property' && optionProp.value.type === 'ObjectExpression') {\n visitStyleObjectLiterals(optionProp.value, onStyleObject);\n }\n }\n }\n continue;\n }\n\n if (key === 'compoundVariants' && prop.value.type === 'ArrayExpression') {\n for (const element of prop.value.elements) {\n if (!element || element.type !== 'ObjectExpression') continue;\n for (const cvProp of element.properties) {\n if (cvProp.type !== 'Property') continue;\n const cvKey = getStaticPropertyKey(cvProp);\n if (cvKey === 'css' && cvProp.value.type === 'ObjectExpression') {\n visitStyleObjectLiterals(cvProp.value, onStyleObject);\n }\n }\n }\n continue;\n }\n\n if (\n (COMPONENT_STRUCTURAL_KEYS.has(key) || prop.value.type === 'ObjectExpression') &&\n prop.value.type === 'ObjectExpression'\n ) {\n visitStyleObjectLiterals(prop.value, onStyleObject);\n }\n }\n}\n\nexport function getStringLiteralValue(node: TSESTree.Node): string | null {\n if (node.type === 'Literal' && typeof node.value === 'string') return node.value;\n return null;\n}\n\nexport function getNumericLiteralValue(node: TSESTree.Node): number | null {\n if (node.type === 'Literal' && typeof node.value === 'number') return node.value;\n return null;\n}\n","import type { TSESTree } from '@typescript-eslint/utils';\nimport { createRule } from '../utils/create-rule';\nimport { BARE_NUMBER_STRING_RE, isUnitlessProperty } from '../utils/css-properties';\nimport {\n getNumericLiteralValue,\n getStaticPropertyKey,\n getStringLiteralValue,\n isCssPropertyKey,\n visitStyleObjectLiterals,\n} from '../utils/style-ast';\nimport { getStyleObjectArguments } from '../utils/style-calls';\n\nexport const noInvalidUnitlessValue = createRule({\n name: 'no-invalid-unitless-value',\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Disallow bare numeric strings on properties that require CSS units (TypeStyles only auto-appends `px` to numbers, not strings)',\n },\n messages: {\n bareNumberString:\n '`{{property}}` is set to bare number string `{{value}}`, which emits invalid CSS. Use a number (`{{numeric}}`) or a value with units (`{{value}}px`).',\n suspiciousUnitlessNumber:\n '`{{property}}` is unitless in CSS — numeric `{{value}}` is emitted without a unit. Use a ratio (e.g. `1.5`) or an explicit length (`\"24px\"`).',\n },\n schema: [\n {\n type: 'object',\n properties: {\n checkSuspiciousUnitlessNumbers: { type: 'boolean' },\n },\n additionalProperties: false,\n },\n ],\n },\n defaultOptions: [{ checkSuspiciousUnitlessNumbers: true }],\n create(context, [options]) {\n /** Properties where a large integer usually means the author meant a length, not a unitless ratio. */\n const SUSPICIOUS_UNITLESS_PROPERTIES = new Set(['lineHeight']);\n\n function checkStyleObject(obj: TSESTree.ObjectExpression) {\n for (const prop of obj.properties) {\n if (prop.type !== 'Property') continue;\n const key = getStaticPropertyKey(prop);\n if (!key || !isCssPropertyKey(key)) continue;\n\n const stringValue = getStringLiteralValue(prop.value);\n if (stringValue && BARE_NUMBER_STRING_RE.test(stringValue) && !isUnitlessProperty(key)) {\n context.report({\n node: prop.value,\n messageId: 'bareNumberString',\n data: {\n property: key,\n value: stringValue,\n numeric: stringValue,\n },\n });\n continue;\n }\n\n if (options.checkSuspiciousUnitlessNumbers && SUSPICIOUS_UNITLESS_PROPERTIES.has(key)) {\n const num = getNumericLiteralValue(prop.value);\n if (num != null && num >= 8 && Number.isInteger(num)) {\n context.report({\n node: prop.value,\n messageId: 'suspiciousUnitlessNumber',\n data: { property: key, value: String(num) },\n });\n }\n }\n }\n }\n\n return {\n CallExpression(node) {\n for (const styleObj of getStyleObjectArguments(node)) {\n visitStyleObjectLiterals(styleObj, checkStyleObject);\n }\n },\n ObjectExpression(node) {\n const parent = node.parent;\n if (\n parent?.type === 'Property' &&\n (parent.key.type === 'Identifier' || parent.key.type === 'Literal')\n ) {\n const parentKey =\n parent.key.type === 'Identifier'\n ? parent.key.name\n : typeof parent.key.value === 'string'\n ? parent.key.value\n : null;\n if (parentKey === 'from' || parentKey === 'to' || /^\\d+%$/.test(parentKey ?? '')) {\n visitStyleObjectLiterals(node, checkStyleObject);\n }\n }\n },\n };\n },\n});\n","import path from 'node:path';\nimport { createRule } from '../utils/create-rule';\nimport {\n PUBLIC_CLASSNAMES_SNAPSHOT,\n collectPublicClassNamesSync,\n diffRemovedPublicClassNames,\n loadPublicClassNamesSnapshot,\n type PublicClassNameEntry,\n} from '@typestyles/cli';\n\ntype RuleOptions = [\n {\n snapshotFile?: string;\n rootDir?: string;\n }?,\n];\n\nlet comparisonDone = false;\nlet cachedRemoved: PublicClassNameEntry[] = [];\nlet reportsEmitted = false;\n\n/** @internal Test hook */\nexport function resetRemovedPublicClassnameState(): void {\n comparisonDone = false;\n cachedRemoved = [];\n reportsEmitted = false;\n}\n\nfunction resolveRemovedClassNames(\n context: Parameters<NonNullable<ReturnType<typeof createRule>['create']>>[0],\n options: RuleOptions[0],\n): PublicClassNameEntry[] {\n if (comparisonDone) return cachedRemoved;\n\n const rootDir = path.resolve(options?.rootDir ?? context.cwd ?? process.cwd());\n const snapshotPath = path.resolve(rootDir, options?.snapshotFile ?? PUBLIC_CLASSNAMES_SNAPSHOT);\n const snapshot = loadPublicClassNamesSnapshot(snapshotPath);\n if (!snapshot) {\n comparisonDone = true;\n cachedRemoved = [];\n return cachedRemoved;\n }\n\n const current = collectPublicClassNamesSync({ rootDir });\n cachedRemoved = diffRemovedPublicClassNames(snapshot, current);\n comparisonDone = true;\n return cachedRemoved;\n}\n\nexport const noRemovedPublicClassname = createRule<RuleOptions, 'removed'>({\n name: 'no-removed-public-classname',\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Disallow removing or renaming semantic class names listed in `.typestyles-public-classnames.json`',\n },\n messages: {\n removed:\n 'Public class name `{{className}}` was removed or renamed. This is a breaking change — restore the name or regenerate the snapshot with `typestyles snapshot --write` after a deliberate semver bump.',\n },\n schema: [\n {\n type: 'object',\n properties: {\n snapshotFile: { type: 'string' },\n rootDir: { type: 'string' },\n },\n additionalProperties: false,\n },\n ],\n },\n defaultOptions: [{}],\n create(context, [options]) {\n const rootDir = path.resolve(options?.rootDir ?? context.cwd ?? process.cwd());\n const snapshotPath = path.resolve(rootDir, options?.snapshotFile ?? PUBLIC_CLASSNAMES_SNAPSHOT);\n if (!loadPublicClassNamesSnapshot(snapshotPath)) {\n return {};\n }\n\n return {\n 'Program:exit'(node) {\n if (reportsEmitted) return;\n reportsEmitted = true;\n\n const removed = resolveRemovedClassNames(context, options);\n for (const entry of removed) {\n context.report({\n node,\n messageId: 'removed',\n data: { className: entry.className },\n });\n }\n },\n };\n },\n});\n","import type { TSESTree } from '@typescript-eslint/utils';\nimport { createRule } from '../utils/create-rule';\nimport { findShorthandLonghandConflicts } from '../utils/css-properties';\nimport { collectCssPropertyNames, visitStyleObjectLiterals } from '../utils/style-ast';\nimport { getStyleObjectArguments } from '../utils/style-calls';\n\nexport const noShorthandLonghandConflict = createRule({\n name: 'no-shorthand-longhand-conflict',\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Disallow mixing CSS shorthand and longhand properties in the same TypeStyles style object',\n },\n messages: {\n conflict:\n '`{{shorthand}}` and `{{longhand}}` must not appear in the same style object — the longhand is ignored or overridden unpredictably.',\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n function checkStyleObject(obj: TSESTree.ObjectExpression) {\n const propertyNames = collectCssPropertyNames(obj);\n const conflicts = findShorthandLonghandConflicts(propertyNames);\n for (const { shorthand, longhand } of conflicts) {\n context.report({\n node: obj,\n messageId: 'conflict',\n data: { shorthand, longhand },\n });\n }\n }\n\n return {\n CallExpression(node) {\n for (const styleObj of getStyleObjectArguments(node)) {\n visitStyleObjectLiterals(styleObj, checkStyleObject);\n }\n },\n ObjectExpression(node) {\n // Keyframe stops: `{ from: { opacity: 0 }, to: { opacity: 1 } }`\n const parent = node.parent;\n if (\n parent?.type === 'Property' &&\n (parent.key.type === 'Identifier' || parent.key.type === 'Literal')\n ) {\n const parentKey =\n parent.key.type === 'Identifier'\n ? parent.key.name\n : typeof parent.key.value === 'string'\n ? parent.key.value\n : null;\n if (parentKey === 'from' || parentKey === 'to' || /^\\d+%$/.test(parentKey ?? '')) {\n visitStyleObjectLiterals(node, checkStyleObject);\n }\n }\n },\n };\n },\n});\n","import { noDefaultScopeInPackage } from './rules/no-default-scope-in-package';\nimport { noDuplicateNamespace } from './rules/no-duplicate-namespace';\nimport { noInvalidUnitlessValue } from './rules/no-invalid-unitless-value';\nimport { noRemovedPublicClassname } from './rules/no-removed-public-classname';\nimport { noShorthandLonghandConflict } from './rules/no-shorthand-longhand-conflict';\n\nexport const rules = {\n 'no-default-scope-in-package': noDefaultScopeInPackage,\n 'no-shorthand-longhand-conflict': noShorthandLonghandConflict,\n 'no-invalid-unitless-value': noInvalidUnitlessValue,\n 'no-duplicate-namespace': noDuplicateNamespace,\n 'no-removed-public-classname': noRemovedPublicClassname,\n};\n\nexport {\n noDefaultScopeInPackage,\n noShorthandLonghandConflict,\n noInvalidUnitlessValue,\n noDuplicateNamespace,\n noRemovedPublicClassname,\n};\n\nconst plugin = {\n meta: {\n name: '@typestyles/eslint-plugin',\n version: '0.1.0',\n },\n rules,\n};\n\n/** Flat-config preset for TypeStyles projects. */\nexport const configs = {\n recommended: {\n plugins: {\n '@typestyles': plugin,\n },\n rules: {\n '@typestyles/no-shorthand-longhand-conflict': 'error',\n '@typestyles/no-invalid-unitless-value': 'error',\n '@typestyles/no-duplicate-namespace': 'error',\n },\n },\n /** Preset for publishable packages — adds `no-default-scope-in-package`. */\n package: {\n plugins: {\n '@typestyles': plugin,\n },\n rules: {\n '@typestyles/no-shorthand-longhand-conflict': 'error',\n '@typestyles/no-invalid-unitless-value': 'error',\n '@typestyles/no-duplicate-namespace': 'error',\n '@typestyles/no-default-scope-in-package': 'error',\n },\n },\n};\n\nObject.assign(plugin, { configs });\n\nexport default plugin;\n"]}
package/dist/index.d.cts CHANGED
@@ -14,6 +14,16 @@ declare const noInvalidUnitlessValue: _typescript_eslint_utils_ts_eslint.RuleMod
14
14
  name: string;
15
15
  };
16
16
 
17
+ type RuleOptions = [
18
+ {
19
+ snapshotFile?: string;
20
+ rootDir?: string;
21
+ }?
22
+ ];
23
+ declare const noRemovedPublicClassname: _typescript_eslint_utils_ts_eslint.RuleModule<"removed", RuleOptions, unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
24
+ name: string;
25
+ };
26
+
17
27
  declare const noShorthandLonghandConflict: _typescript_eslint_utils_ts_eslint.RuleModule<"conflict", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
18
28
  name: string;
19
29
  };
@@ -33,6 +43,12 @@ declare const rules: {
33
43
  'no-duplicate-namespace': _typescript_eslint_utils_ts_eslint.RuleModule<"duplicateInFile" | "duplicateAcrossFiles", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
34
44
  name: string;
35
45
  };
46
+ 'no-removed-public-classname': _typescript_eslint_utils_ts_eslint.RuleModule<"removed", [({
47
+ snapshotFile?: string;
48
+ rootDir?: string;
49
+ } | undefined)?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
50
+ name: string;
51
+ };
36
52
  };
37
53
 
38
54
  declare const plugin: {
@@ -55,6 +71,12 @@ declare const plugin: {
55
71
  'no-duplicate-namespace': _typescript_eslint_utils_ts_eslint.RuleModule<"duplicateInFile" | "duplicateAcrossFiles", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
56
72
  name: string;
57
73
  };
74
+ 'no-removed-public-classname': _typescript_eslint_utils_ts_eslint.RuleModule<"removed", [({
75
+ snapshotFile?: string;
76
+ rootDir?: string;
77
+ } | undefined)?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
78
+ name: string;
79
+ };
58
80
  };
59
81
  };
60
82
  /** Flat-config preset for TypeStyles projects. */
@@ -81,6 +103,12 @@ declare const configs: {
81
103
  'no-duplicate-namespace': _typescript_eslint_utils_ts_eslint.RuleModule<"duplicateInFile" | "duplicateAcrossFiles", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
82
104
  name: string;
83
105
  };
106
+ 'no-removed-public-classname': _typescript_eslint_utils_ts_eslint.RuleModule<"removed", [({
107
+ snapshotFile?: string;
108
+ rootDir?: string;
109
+ } | undefined)?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
110
+ name: string;
111
+ };
84
112
  };
85
113
  };
86
114
  };
@@ -113,6 +141,12 @@ declare const configs: {
113
141
  'no-duplicate-namespace': _typescript_eslint_utils_ts_eslint.RuleModule<"duplicateInFile" | "duplicateAcrossFiles", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
114
142
  name: string;
115
143
  };
144
+ 'no-removed-public-classname': _typescript_eslint_utils_ts_eslint.RuleModule<"removed", [({
145
+ snapshotFile?: string;
146
+ rootDir?: string;
147
+ } | undefined)?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
148
+ name: string;
149
+ };
116
150
  };
117
151
  };
118
152
  };
@@ -125,4 +159,4 @@ declare const configs: {
125
159
  };
126
160
  };
127
161
 
128
- export { configs, plugin as default, noDefaultScopeInPackage, noDuplicateNamespace, noInvalidUnitlessValue, noShorthandLonghandConflict, rules };
162
+ export { configs, plugin as default, noDefaultScopeInPackage, noDuplicateNamespace, noInvalidUnitlessValue, noRemovedPublicClassname, noShorthandLonghandConflict, rules };
package/dist/index.d.ts CHANGED
@@ -14,6 +14,16 @@ declare const noInvalidUnitlessValue: _typescript_eslint_utils_ts_eslint.RuleMod
14
14
  name: string;
15
15
  };
16
16
 
17
+ type RuleOptions = [
18
+ {
19
+ snapshotFile?: string;
20
+ rootDir?: string;
21
+ }?
22
+ ];
23
+ declare const noRemovedPublicClassname: _typescript_eslint_utils_ts_eslint.RuleModule<"removed", RuleOptions, unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
24
+ name: string;
25
+ };
26
+
17
27
  declare const noShorthandLonghandConflict: _typescript_eslint_utils_ts_eslint.RuleModule<"conflict", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
18
28
  name: string;
19
29
  };
@@ -33,6 +43,12 @@ declare const rules: {
33
43
  'no-duplicate-namespace': _typescript_eslint_utils_ts_eslint.RuleModule<"duplicateInFile" | "duplicateAcrossFiles", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
34
44
  name: string;
35
45
  };
46
+ 'no-removed-public-classname': _typescript_eslint_utils_ts_eslint.RuleModule<"removed", [({
47
+ snapshotFile?: string;
48
+ rootDir?: string;
49
+ } | undefined)?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
50
+ name: string;
51
+ };
36
52
  };
37
53
 
38
54
  declare const plugin: {
@@ -55,6 +71,12 @@ declare const plugin: {
55
71
  'no-duplicate-namespace': _typescript_eslint_utils_ts_eslint.RuleModule<"duplicateInFile" | "duplicateAcrossFiles", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
56
72
  name: string;
57
73
  };
74
+ 'no-removed-public-classname': _typescript_eslint_utils_ts_eslint.RuleModule<"removed", [({
75
+ snapshotFile?: string;
76
+ rootDir?: string;
77
+ } | undefined)?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
78
+ name: string;
79
+ };
58
80
  };
59
81
  };
60
82
  /** Flat-config preset for TypeStyles projects. */
@@ -81,6 +103,12 @@ declare const configs: {
81
103
  'no-duplicate-namespace': _typescript_eslint_utils_ts_eslint.RuleModule<"duplicateInFile" | "duplicateAcrossFiles", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
82
104
  name: string;
83
105
  };
106
+ 'no-removed-public-classname': _typescript_eslint_utils_ts_eslint.RuleModule<"removed", [({
107
+ snapshotFile?: string;
108
+ rootDir?: string;
109
+ } | undefined)?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
110
+ name: string;
111
+ };
84
112
  };
85
113
  };
86
114
  };
@@ -113,6 +141,12 @@ declare const configs: {
113
141
  'no-duplicate-namespace': _typescript_eslint_utils_ts_eslint.RuleModule<"duplicateInFile" | "duplicateAcrossFiles", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
114
142
  name: string;
115
143
  };
144
+ 'no-removed-public-classname': _typescript_eslint_utils_ts_eslint.RuleModule<"removed", [({
145
+ snapshotFile?: string;
146
+ rootDir?: string;
147
+ } | undefined)?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
148
+ name: string;
149
+ };
116
150
  };
117
151
  };
118
152
  };
@@ -125,4 +159,4 @@ declare const configs: {
125
159
  };
126
160
  };
127
161
 
128
- export { configs, plugin as default, noDefaultScopeInPackage, noDuplicateNamespace, noInvalidUnitlessValue, noShorthandLonghandConflict, rules };
162
+ export { configs, plugin as default, noDefaultScopeInPackage, noDuplicateNamespace, noInvalidUnitlessValue, noRemovedPublicClassname, noShorthandLonghandConflict, rules };
package/dist/index.js CHANGED
@@ -1,4 +1,6 @@
1
1
  import { ESLintUtils } from '@typescript-eslint/utils';
2
+ import path from 'path';
3
+ import { PUBLIC_CLASSNAMES_SNAPSHOT, loadPublicClassNamesSnapshot, collectPublicClassNamesSync, diffRemovedPublicClassNames } from '@typestyles/cli';
2
4
 
3
5
  // src/utils/create-rule.ts
4
6
  var createRule = ESLintUtils.RuleCreator(
@@ -578,6 +580,68 @@ var noInvalidUnitlessValue = createRule({
578
580
  };
579
581
  }
580
582
  });
583
+ var comparisonDone = false;
584
+ var cachedRemoved = [];
585
+ var reportsEmitted = false;
586
+ function resolveRemovedClassNames(context, options) {
587
+ if (comparisonDone) return cachedRemoved;
588
+ const rootDir = path.resolve(options?.rootDir ?? context.cwd ?? process.cwd());
589
+ const snapshotPath = path.resolve(rootDir, options?.snapshotFile ?? PUBLIC_CLASSNAMES_SNAPSHOT);
590
+ const snapshot = loadPublicClassNamesSnapshot(snapshotPath);
591
+ if (!snapshot) {
592
+ comparisonDone = true;
593
+ cachedRemoved = [];
594
+ return cachedRemoved;
595
+ }
596
+ const current = collectPublicClassNamesSync({ rootDir });
597
+ cachedRemoved = diffRemovedPublicClassNames(snapshot, current);
598
+ comparisonDone = true;
599
+ return cachedRemoved;
600
+ }
601
+ var noRemovedPublicClassname = createRule({
602
+ name: "no-removed-public-classname",
603
+ meta: {
604
+ type: "problem",
605
+ docs: {
606
+ description: "Disallow removing or renaming semantic class names listed in `.typestyles-public-classnames.json`"
607
+ },
608
+ messages: {
609
+ removed: "Public class name `{{className}}` was removed or renamed. This is a breaking change \u2014 restore the name or regenerate the snapshot with `typestyles snapshot --write` after a deliberate semver bump."
610
+ },
611
+ schema: [
612
+ {
613
+ type: "object",
614
+ properties: {
615
+ snapshotFile: { type: "string" },
616
+ rootDir: { type: "string" }
617
+ },
618
+ additionalProperties: false
619
+ }
620
+ ]
621
+ },
622
+ defaultOptions: [{}],
623
+ create(context, [options]) {
624
+ const rootDir = path.resolve(options?.rootDir ?? context.cwd ?? process.cwd());
625
+ const snapshotPath = path.resolve(rootDir, options?.snapshotFile ?? PUBLIC_CLASSNAMES_SNAPSHOT);
626
+ if (!loadPublicClassNamesSnapshot(snapshotPath)) {
627
+ return {};
628
+ }
629
+ return {
630
+ "Program:exit"(node) {
631
+ if (reportsEmitted) return;
632
+ reportsEmitted = true;
633
+ const removed = resolveRemovedClassNames(context, options);
634
+ for (const entry of removed) {
635
+ context.report({
636
+ node,
637
+ messageId: "removed",
638
+ data: { className: entry.className }
639
+ });
640
+ }
641
+ }
642
+ };
643
+ }
644
+ });
581
645
 
582
646
  // src/rules/no-shorthand-longhand-conflict.ts
583
647
  var noShorthandLonghandConflict = createRule({
@@ -629,7 +693,8 @@ var rules = {
629
693
  "no-default-scope-in-package": noDefaultScopeInPackage,
630
694
  "no-shorthand-longhand-conflict": noShorthandLonghandConflict,
631
695
  "no-invalid-unitless-value": noInvalidUnitlessValue,
632
- "no-duplicate-namespace": noDuplicateNamespace
696
+ "no-duplicate-namespace": noDuplicateNamespace,
697
+ "no-removed-public-classname": noRemovedPublicClassname
633
698
  };
634
699
  var plugin = {
635
700
  meta: {
@@ -665,6 +730,6 @@ var configs = {
665
730
  Object.assign(plugin, { configs });
666
731
  var src_default = plugin;
667
732
 
668
- export { configs, src_default as default, noDefaultScopeInPackage, noDuplicateNamespace, noInvalidUnitlessValue, noShorthandLonghandConflict, rules };
733
+ export { configs, src_default as default, noDefaultScopeInPackage, noDuplicateNamespace, noInvalidUnitlessValue, noRemovedPublicClassname, noShorthandLonghandConflict, rules };
669
734
  //# sourceMappingURL=index.js.map
670
735
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/create-rule.ts","../src/rules/no-default-scope-in-package.ts","../src/utils/style-calls.ts","../src/rules/no-duplicate-namespace.ts","../src/utils/css-properties.ts","../src/utils/style-ast.ts","../src/rules/no-invalid-unitless-value.ts","../src/rules/no-shorthand-longhand-conflict.ts","../src/index.ts"],"names":["memberPropertyName"],"mappings":"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","file":"index.js","sourcesContent":["import { ESLintUtils } from '@typescript-eslint/utils';\n\nexport const createRule = ESLintUtils.RuleCreator(\n (name) => `https://typestyles.dev/docs/eslint#${name}`,\n);\n","import type { TSESTree } from '@typescript-eslint/utils';\nimport { createRule } from '../utils/create-rule';\n\nfunction memberPropertyName(node: TSESTree.MemberExpression): string | null {\n if (node.property.type === 'Identifier' && !node.computed) return node.property.name;\n if (node.property.type === 'Literal' && typeof node.property.value === 'string') {\n return node.property.value;\n }\n return null;\n}\n\nfunction isDefaultStylesCall(node: TSESTree.CallExpression): boolean {\n const { callee } = node;\n if (callee.type !== 'MemberExpression') return false;\n const method = memberPropertyName(callee);\n if (method !== 'class' && method !== 'component') return false;\n\n if (callee.object.type === 'Identifier') {\n return callee.object.name === 'styles';\n }\n return false;\n}\n\nexport const noDefaultScopeInPackage = createRule({\n name: 'no-default-scope-in-package',\n meta: {\n type: 'suggestion',\n docs: {\n description:\n 'Require a scoped styles factory (`createTypeStyles`/`createStyles` with `scopeId`) instead of the default `styles` export in publishable packages',\n },\n messages: {\n unscopedInPackage:\n 'Using the default `styles.{{method}}()` in a published package risks class-name collisions. Use `createTypeStyles({ scopeId: pkg.name })` or `createStyles({ scopeId })` instead.',\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n CallExpression(node) {\n if (!isDefaultStylesCall(node)) return;\n\n const method = memberPropertyName(node.callee as TSESTree.MemberExpression);\n\n context.report({\n node: node.callee,\n messageId: 'unscopedInPackage',\n data: { method: method ?? 'class' },\n });\n },\n };\n },\n});\n","import type { TSESTree } from '@typescript-eslint/utils';\n\nexport type NamespaceKind =\n | 'styles.class'\n | 'styles.component'\n | 'styles.hashClass'\n | 'tokens.create'\n | 'tokens.createTheme'\n | 'createTheme'\n | 'keyframes.create'\n | 'global.style'\n | 'global.fontFace';\n\nexport interface NamespaceCall {\n kind: NamespaceKind;\n /** Logical namespace key used for duplicate detection. */\n key: string;\n /** AST node for the namespace string literal (for reporting). */\n nameNode: TSESTree.StringLiteral;\n}\n\nfunction memberPropertyName(node: TSESTree.MemberExpression): string | null {\n if (node.property.type === 'Identifier' && !node.computed) return node.property.name;\n if (node.property.type === 'Literal' && typeof node.property.value === 'string') {\n return node.property.value;\n }\n return null;\n}\n\nfunction calleeRootName(node: TSESTree.CallExpression['callee']): string | null {\n if (node.type === 'Identifier') return node.name;\n if (node.type === 'MemberExpression') {\n if (node.object.type === 'Identifier') return node.object.name;\n if (node.object.type === 'MemberExpression') {\n const inner = memberPropertyName(node.object);\n const outer = calleeRootName(node.object);\n if (outer && inner) return `${outer}.${inner}`;\n }\n }\n return null;\n}\n\nfunction isMemberCall(\n callee: TSESTree.CallExpression['callee'],\n objectName: string,\n method: string,\n): boolean {\n if (callee.type !== 'MemberExpression') return false;\n const methodName = memberPropertyName(callee);\n if (methodName !== method) return false;\n if (callee.object.type === 'Identifier') return callee.object.name === objectName;\n return false;\n}\n\nfunction firstStringArg(args: TSESTree.CallExpressionArgument[]): TSESTree.StringLiteral | null {\n const first = args[0];\n if (!first || first.type === 'SpreadElement') return null;\n if (first.type === 'Literal' && typeof first.value === 'string') return first;\n return null;\n}\n\n/**\n * Detect TypeStyles namespace registrations from call expressions.\n * Matches API shape (e.g. `styles.class('card', …)`) regardless of import alias.\n */\nexport function getNamespaceCall(node: TSESTree.CallExpression): NamespaceCall | null {\n const { callee, arguments: args } = node;\n\n if (isMemberCall(callee, 'styles', 'class')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'styles.class', key: `.${nameNode.value}-`, nameNode };\n }\n\n if (isMemberCall(callee, 'styles', 'component')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'styles.component', key: `.${nameNode.value}-`, nameNode };\n }\n\n if (isMemberCall(callee, 'styles', 'hashClass')) {\n const first = args[0];\n if (!first || first.type === 'SpreadElement') return null;\n if (first.type === 'Literal' && typeof first.value === 'string') {\n return { kind: 'styles.hashClass', key: `.${first.value}-`, nameNode: first };\n }\n const label = args[1];\n if (label?.type === 'Literal' && typeof label.value === 'string') {\n return { kind: 'styles.hashClass', key: `.${label.value}-`, nameNode: label };\n }\n return null;\n }\n\n if (isMemberCall(callee, 'tokens', 'create')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'tokens.create', key: `tokens:${nameNode.value}`, nameNode };\n }\n\n if (isMemberCall(callee, 'tokens', 'createTheme')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'tokens.createTheme', key: `theme:${nameNode.value}`, nameNode };\n }\n\n if (callee.type === 'Identifier' && callee.name === 'createTheme') {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'createTheme', key: `theme:${nameNode.value}`, nameNode };\n }\n\n if (isMemberCall(callee, 'keyframes', 'create')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'keyframes.create', key: `keyframes:${nameNode.value}`, nameNode };\n }\n\n if (isMemberCall(callee, 'global', 'style')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'global.style', key: nameNode.value, nameNode };\n }\n\n if (isMemberCall(callee, 'global', 'fontFace')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'global.fontFace', key: `font-face:${nameNode.value}`, nameNode };\n }\n\n // `myStyles.class` / `myTokens.create` from createStyles/createTokens bindings\n if (callee.type === 'MemberExpression') {\n const method = memberPropertyName(callee);\n const root = calleeRootName(callee);\n if (method === 'class' && root) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'styles.class', key: `.${nameNode.value}-`, nameNode };\n }\n if (method === 'component' && root) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'styles.component', key: `.${nameNode.value}-`, nameNode };\n }\n if (method === 'create' && root?.endsWith('tokens')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'tokens.create', key: `tokens:${nameNode.value}`, nameNode };\n }\n }\n\n return null;\n}\n\n/** Extract style object literals passed to TypeStyles style APIs. */\nexport function getStyleObjectArguments(\n node: TSESTree.CallExpression,\n): TSESTree.ObjectExpression[] {\n const { callee, arguments: args } = node;\n const objects: TSESTree.ObjectExpression[] = [];\n\n const pushObject = (arg: TSESTree.CallExpressionArgument | undefined) => {\n if (!arg || arg.type === 'SpreadElement') return;\n if (arg.type === 'ObjectExpression') objects.push(arg);\n if (arg.type === 'ArrowFunctionExpression' && arg.body.type === 'ObjectExpression') {\n objects.push(arg.body);\n }\n };\n\n if (callee.type === 'MemberExpression') {\n const method = memberPropertyName(callee);\n if (method === 'class' || method === 'component') {\n pushObject(args[1]);\n return objects;\n }\n if (method === 'hashClass') {\n const first = args[0];\n if (first && first.type !== 'SpreadElement' && first.type === 'ObjectExpression') {\n objects.push(first);\n }\n return objects;\n }\n }\n\n return objects;\n}\n","import { createRule } from '../utils/create-rule';\nimport { getNamespaceCall } from '../utils/style-calls';\n\ninterface NamespaceLocation {\n filename: string;\n line: number;\n column: number;\n}\n\n/** Cross-file registry for a single ESLint CLI run (best-effort; not shared across workers). */\nconst namespaceRegistry = new Map<string, NamespaceLocation>();\n\n/** @internal Test hook */\nexport function resetNamespaceRegistry(): void {\n namespaceRegistry.clear();\n}\n\nexport const noDuplicateNamespace = createRule({\n name: 'no-duplicate-namespace',\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Disallow reusing the same TypeStyles namespace (`styles.class`, `styles.component`, `tokens.create`, …) across the project',\n },\n messages: {\n duplicateInFile:\n 'Namespace `{{name}}` ({{kind}}) is already registered in this file at line {{line}}.',\n duplicateAcrossFiles:\n 'Namespace `{{name}}` ({{kind}}) is already registered in `{{otherFile}}` at line {{line}}.',\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const fileSeen = new Map<string, { line: number; column: number }>();\n const filename = context.filename;\n\n return {\n CallExpression(node) {\n const call = getNamespaceCall(node);\n if (!call) return;\n\n const displayName =\n call.kind === 'styles.class' || call.kind === 'styles.component'\n ? call.nameNode.value\n : call.nameNode.value;\n\n const line = call.nameNode.loc?.start.line ?? node.loc?.start.line ?? 0;\n const column = call.nameNode.loc?.start.column ?? node.loc?.start.column ?? 0;\n\n const priorInFile = fileSeen.get(call.key);\n if (priorInFile) {\n context.report({\n node: call.nameNode,\n messageId: 'duplicateInFile',\n data: {\n name: displayName,\n kind: call.kind,\n line: String(priorInFile.line),\n },\n });\n return;\n }\n fileSeen.set(call.key, { line, column });\n\n const priorGlobal = namespaceRegistry.get(call.key);\n if (priorGlobal && priorGlobal.filename !== filename) {\n context.report({\n node: call.nameNode,\n messageId: 'duplicateAcrossFiles',\n data: {\n name: displayName,\n kind: call.kind,\n otherFile: priorGlobal.filename,\n line: String(priorGlobal.line),\n },\n });\n return;\n }\n\n if (!priorGlobal) {\n namespaceRegistry.set(call.key, { filename, line, column });\n }\n },\n };\n },\n});\n","/**\n * CSS properties that accept unitless numbers in TypeStyles serialization.\n * Keep in sync with `packages/typestyles/src/css.ts`.\n */\nexport const UNITLESS_PROPERTIES = new Set([\n 'animationIterationCount',\n 'aspectRatio',\n 'borderImageOutset',\n 'borderImageSlice',\n 'borderImageWidth',\n 'boxFlex',\n 'boxFlexGroup',\n 'boxOrdinalGroup',\n 'columnCount',\n 'columns',\n 'flex',\n 'flexGrow',\n 'flexPositive',\n 'flexShrink',\n 'flexNegative',\n 'flexOrder',\n 'fontSizeAdjust',\n 'fontWeight',\n 'gridArea',\n 'gridColumn',\n 'gridColumnEnd',\n 'gridColumnSpan',\n 'gridColumnStart',\n 'gridRow',\n 'gridRowEnd',\n 'gridRowSpan',\n 'gridRowStart',\n 'initialLetter',\n 'lineClamp',\n 'lineHeight',\n 'maskBorderOutset',\n 'maskBorderSlice',\n 'maskBorderWidth',\n 'opacity',\n 'order',\n 'orphans',\n 'scale',\n 'tabSize',\n 'widows',\n 'zIndex',\n 'zoom',\n 'fillOpacity',\n 'floodOpacity',\n 'stopOpacity',\n 'strokeDasharray',\n 'strokeDashoffset',\n 'strokeMiterlimit',\n 'strokeOpacity',\n 'strokeWidth',\n]);\n\nconst VENDOR_PREFIX_RE = /^(Webkit|Moz|ms|O)([A-Z])(.*)$/;\n\nexport function isUnitlessProperty(prop: string): boolean {\n if (UNITLESS_PROPERTIES.has(prop)) return true;\n const match = VENDOR_PREFIX_RE.exec(prop);\n if (match) {\n return UNITLESS_PROPERTIES.has(match[2].toLowerCase() + match[3]);\n }\n return false;\n}\n\n/** Shorthand property → longhands that must not appear in the same style object. */\nexport const SHORTHAND_TO_LONGHANDS: Readonly<Record<string, readonly string[]>> = {\n padding: [\n 'paddingTop',\n 'paddingRight',\n 'paddingBottom',\n 'paddingLeft',\n 'paddingInline',\n 'paddingBlock',\n 'paddingInlineStart',\n 'paddingInlineEnd',\n 'paddingBlockStart',\n 'paddingBlockEnd',\n ],\n margin: [\n 'marginTop',\n 'marginRight',\n 'marginBottom',\n 'marginLeft',\n 'marginInline',\n 'marginBlock',\n 'marginInlineStart',\n 'marginInlineEnd',\n 'marginBlockStart',\n 'marginBlockEnd',\n ],\n border: [\n 'borderWidth',\n 'borderStyle',\n 'borderColor',\n 'borderTop',\n 'borderRight',\n 'borderBottom',\n 'borderLeft',\n 'borderInline',\n 'borderBlock',\n ],\n borderWidth: [\n 'borderTopWidth',\n 'borderRightWidth',\n 'borderBottomWidth',\n 'borderLeftWidth',\n 'borderInlineWidth',\n 'borderBlockWidth',\n ],\n borderStyle: ['borderTopStyle', 'borderRightStyle', 'borderBottomStyle', 'borderLeftStyle'],\n borderColor: ['borderTopColor', 'borderRightColor', 'borderBottomColor', 'borderLeftColor'],\n borderTop: ['borderTopWidth', 'borderTopStyle', 'borderTopColor'],\n borderRight: ['borderRightWidth', 'borderRightStyle', 'borderRightColor'],\n borderBottom: ['borderBottomWidth', 'borderBottomStyle', 'borderBottomColor'],\n borderLeft: ['borderLeftWidth', 'borderLeftStyle', 'borderLeftColor'],\n background: [\n 'backgroundColor',\n 'backgroundImage',\n 'backgroundPosition',\n 'backgroundSize',\n 'backgroundRepeat',\n 'backgroundAttachment',\n 'backgroundOrigin',\n 'backgroundClip',\n ],\n font: ['fontStyle', 'fontVariant', 'fontWeight', 'fontSize', 'lineHeight', 'fontFamily'],\n flex: ['flexGrow', 'flexShrink', 'flexBasis'],\n gap: ['rowGap', 'columnGap'],\n overflow: ['overflowX', 'overflowY'],\n transition: [\n 'transitionProperty',\n 'transitionDuration',\n 'transitionTimingFunction',\n 'transitionDelay',\n ],\n animation: [\n 'animationName',\n 'animationDuration',\n 'animationTimingFunction',\n 'animationDelay',\n 'animationIterationCount',\n 'animationDirection',\n 'animationFillMode',\n 'animationPlayState',\n ],\n outline: ['outlineWidth', 'outlineStyle', 'outlineColor'],\n listStyle: ['listStyleType', 'listStylePosition', 'listStyleImage'],\n grid: [\n 'gridTemplateRows',\n 'gridTemplateColumns',\n 'gridTemplateAreas',\n 'gridAutoRows',\n 'gridAutoColumns',\n 'gridAutoFlow',\n ],\n gridTemplate: ['gridTemplateRows', 'gridTemplateColumns', 'gridTemplateAreas'],\n inset: ['top', 'right', 'bottom', 'left'],\n insetBlock: ['insetBlockStart', 'insetBlockEnd'],\n insetInline: ['insetInlineStart', 'insetInlineEnd'],\n};\n\n/** Bare numeric strings (no CSS unit) that emit invalid CSS when serialized. */\nexport const BARE_NUMBER_STRING_RE = /^-?\\d+(\\.\\d+)?$/;\n\nexport function findShorthandLonghandConflicts(\n propertyNames: readonly string[],\n): Array<{ shorthand: string; longhand: string }> {\n const keys = new Set(propertyNames);\n const seen = new Set<string>();\n const conflicts: Array<{ shorthand: string; longhand: string }> = [];\n\n for (const key of keys) {\n const longhands = SHORTHAND_TO_LONGHANDS[key];\n if (longhands) {\n for (const longhand of longhands) {\n if (keys.has(longhand)) {\n const id = `${key}|${longhand}`;\n if (!seen.has(id)) {\n seen.add(id);\n conflicts.push({ shorthand: key, longhand });\n }\n }\n }\n }\n }\n\n return conflicts;\n}\n","import type { TSESTree } from '@typescript-eslint/utils';\n\nconst NESTED_SELECTOR_KEY_RE = /^(&|@|\\[)/;\n\n/** Keys that wrap nested style objects in component configs. */\nconst COMPONENT_STRUCTURAL_KEYS = new Set([\n 'base',\n 'variants',\n 'defaultVariants',\n 'compoundVariants',\n 'slots',\n]);\n\nexport function getStaticPropertyKey(prop: TSESTree.Property): string | null {\n if (prop.computed) return null;\n if (prop.key.type === 'Identifier') return prop.key.name;\n if (prop.key.type === 'Literal' && typeof prop.key.value === 'string') return prop.key.value;\n return null;\n}\n\nexport function isCssPropertyKey(key: string): boolean {\n if (NESTED_SELECTOR_KEY_RE.test(key)) return false;\n if (COMPONENT_STRUCTURAL_KEYS.has(key)) return false;\n return /^[a-zA-Z]/.test(key);\n}\n\n/**\n * Collect CSS property names declared at the top level of a style object literal.\n */\nexport function collectCssPropertyNames(obj: TSESTree.ObjectExpression): string[] {\n const names: string[] = [];\n for (const prop of obj.properties) {\n if (prop.type !== 'Property') continue;\n const key = getStaticPropertyKey(prop);\n if (key && isCssPropertyKey(key)) names.push(key);\n }\n return names;\n}\n\n/**\n * Visit each style object literal in a TypeStyles style/config tree.\n * Recurses into pseudos, at-rules, component `base` / `variants`, and slot objects.\n */\nexport function visitStyleObjectLiterals(\n node: TSESTree.ObjectExpression,\n onStyleObject: (obj: TSESTree.ObjectExpression) => void,\n): void {\n onStyleObject(node);\n\n for (const prop of node.properties) {\n if (prop.type !== 'Property') continue;\n const key = getStaticPropertyKey(prop);\n if (!key) continue;\n\n if (NESTED_SELECTOR_KEY_RE.test(key)) {\n if (prop.value.type === 'ObjectExpression') {\n visitStyleObjectLiterals(prop.value, onStyleObject);\n }\n continue;\n }\n\n if (key === 'variants' && prop.value.type === 'ObjectExpression') {\n for (const groupProp of prop.value.properties) {\n if (groupProp.type !== 'Property' || groupProp.value.type !== 'ObjectExpression') continue;\n for (const optionProp of groupProp.value.properties) {\n if (optionProp.type === 'Property' && optionProp.value.type === 'ObjectExpression') {\n visitStyleObjectLiterals(optionProp.value, onStyleObject);\n }\n }\n }\n continue;\n }\n\n if (key === 'compoundVariants' && prop.value.type === 'ArrayExpression') {\n for (const element of prop.value.elements) {\n if (!element || element.type !== 'ObjectExpression') continue;\n for (const cvProp of element.properties) {\n if (cvProp.type !== 'Property') continue;\n const cvKey = getStaticPropertyKey(cvProp);\n if (cvKey === 'css' && cvProp.value.type === 'ObjectExpression') {\n visitStyleObjectLiterals(cvProp.value, onStyleObject);\n }\n }\n }\n continue;\n }\n\n if (\n (COMPONENT_STRUCTURAL_KEYS.has(key) || prop.value.type === 'ObjectExpression') &&\n prop.value.type === 'ObjectExpression'\n ) {\n visitStyleObjectLiterals(prop.value, onStyleObject);\n }\n }\n}\n\nexport function getStringLiteralValue(node: TSESTree.Node): string | null {\n if (node.type === 'Literal' && typeof node.value === 'string') return node.value;\n return null;\n}\n\nexport function getNumericLiteralValue(node: TSESTree.Node): number | null {\n if (node.type === 'Literal' && typeof node.value === 'number') return node.value;\n return null;\n}\n","import type { TSESTree } from '@typescript-eslint/utils';\nimport { createRule } from '../utils/create-rule';\nimport { BARE_NUMBER_STRING_RE, isUnitlessProperty } from '../utils/css-properties';\nimport {\n getNumericLiteralValue,\n getStaticPropertyKey,\n getStringLiteralValue,\n isCssPropertyKey,\n visitStyleObjectLiterals,\n} from '../utils/style-ast';\nimport { getStyleObjectArguments } from '../utils/style-calls';\n\nexport const noInvalidUnitlessValue = createRule({\n name: 'no-invalid-unitless-value',\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Disallow bare numeric strings on properties that require CSS units (TypeStyles only auto-appends `px` to numbers, not strings)',\n },\n messages: {\n bareNumberString:\n '`{{property}}` is set to bare number string `{{value}}`, which emits invalid CSS. Use a number (`{{numeric}}`) or a value with units (`{{value}}px`).',\n suspiciousUnitlessNumber:\n '`{{property}}` is unitless in CSS — numeric `{{value}}` is emitted without a unit. Use a ratio (e.g. `1.5`) or an explicit length (`\"24px\"`).',\n },\n schema: [\n {\n type: 'object',\n properties: {\n checkSuspiciousUnitlessNumbers: { type: 'boolean' },\n },\n additionalProperties: false,\n },\n ],\n },\n defaultOptions: [{ checkSuspiciousUnitlessNumbers: true }],\n create(context, [options]) {\n /** Properties where a large integer usually means the author meant a length, not a unitless ratio. */\n const SUSPICIOUS_UNITLESS_PROPERTIES = new Set(['lineHeight']);\n\n function checkStyleObject(obj: TSESTree.ObjectExpression) {\n for (const prop of obj.properties) {\n if (prop.type !== 'Property') continue;\n const key = getStaticPropertyKey(prop);\n if (!key || !isCssPropertyKey(key)) continue;\n\n const stringValue = getStringLiteralValue(prop.value);\n if (stringValue && BARE_NUMBER_STRING_RE.test(stringValue) && !isUnitlessProperty(key)) {\n context.report({\n node: prop.value,\n messageId: 'bareNumberString',\n data: {\n property: key,\n value: stringValue,\n numeric: stringValue,\n },\n });\n continue;\n }\n\n if (options.checkSuspiciousUnitlessNumbers && SUSPICIOUS_UNITLESS_PROPERTIES.has(key)) {\n const num = getNumericLiteralValue(prop.value);\n if (num != null && num >= 8 && Number.isInteger(num)) {\n context.report({\n node: prop.value,\n messageId: 'suspiciousUnitlessNumber',\n data: { property: key, value: String(num) },\n });\n }\n }\n }\n }\n\n return {\n CallExpression(node) {\n for (const styleObj of getStyleObjectArguments(node)) {\n visitStyleObjectLiterals(styleObj, checkStyleObject);\n }\n },\n ObjectExpression(node) {\n const parent = node.parent;\n if (\n parent?.type === 'Property' &&\n (parent.key.type === 'Identifier' || parent.key.type === 'Literal')\n ) {\n const parentKey =\n parent.key.type === 'Identifier'\n ? parent.key.name\n : typeof parent.key.value === 'string'\n ? parent.key.value\n : null;\n if (parentKey === 'from' || parentKey === 'to' || /^\\d+%$/.test(parentKey ?? '')) {\n visitStyleObjectLiterals(node, checkStyleObject);\n }\n }\n },\n };\n },\n});\n","import type { TSESTree } from '@typescript-eslint/utils';\nimport { createRule } from '../utils/create-rule';\nimport { findShorthandLonghandConflicts } from '../utils/css-properties';\nimport { collectCssPropertyNames, visitStyleObjectLiterals } from '../utils/style-ast';\nimport { getStyleObjectArguments } from '../utils/style-calls';\n\nexport const noShorthandLonghandConflict = createRule({\n name: 'no-shorthand-longhand-conflict',\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Disallow mixing CSS shorthand and longhand properties in the same TypeStyles style object',\n },\n messages: {\n conflict:\n '`{{shorthand}}` and `{{longhand}}` must not appear in the same style object — the longhand is ignored or overridden unpredictably.',\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n function checkStyleObject(obj: TSESTree.ObjectExpression) {\n const propertyNames = collectCssPropertyNames(obj);\n const conflicts = findShorthandLonghandConflicts(propertyNames);\n for (const { shorthand, longhand } of conflicts) {\n context.report({\n node: obj,\n messageId: 'conflict',\n data: { shorthand, longhand },\n });\n }\n }\n\n return {\n CallExpression(node) {\n for (const styleObj of getStyleObjectArguments(node)) {\n visitStyleObjectLiterals(styleObj, checkStyleObject);\n }\n },\n ObjectExpression(node) {\n // Keyframe stops: `{ from: { opacity: 0 }, to: { opacity: 1 } }`\n const parent = node.parent;\n if (\n parent?.type === 'Property' &&\n (parent.key.type === 'Identifier' || parent.key.type === 'Literal')\n ) {\n const parentKey =\n parent.key.type === 'Identifier'\n ? parent.key.name\n : typeof parent.key.value === 'string'\n ? parent.key.value\n : null;\n if (parentKey === 'from' || parentKey === 'to' || /^\\d+%$/.test(parentKey ?? '')) {\n visitStyleObjectLiterals(node, checkStyleObject);\n }\n }\n },\n };\n },\n});\n","import { noDefaultScopeInPackage } from './rules/no-default-scope-in-package';\nimport { noDuplicateNamespace } from './rules/no-duplicate-namespace';\nimport { noInvalidUnitlessValue } from './rules/no-invalid-unitless-value';\nimport { noShorthandLonghandConflict } from './rules/no-shorthand-longhand-conflict';\n\nexport const rules = {\n 'no-default-scope-in-package': noDefaultScopeInPackage,\n 'no-shorthand-longhand-conflict': noShorthandLonghandConflict,\n 'no-invalid-unitless-value': noInvalidUnitlessValue,\n 'no-duplicate-namespace': noDuplicateNamespace,\n};\n\nexport {\n noDefaultScopeInPackage,\n noShorthandLonghandConflict,\n noInvalidUnitlessValue,\n noDuplicateNamespace,\n};\n\nconst plugin = {\n meta: {\n name: '@typestyles/eslint-plugin',\n version: '0.1.0',\n },\n rules,\n};\n\n/** Flat-config preset for TypeStyles projects. */\nexport const configs = {\n recommended: {\n plugins: {\n '@typestyles': plugin,\n },\n rules: {\n '@typestyles/no-shorthand-longhand-conflict': 'error',\n '@typestyles/no-invalid-unitless-value': 'error',\n '@typestyles/no-duplicate-namespace': 'error',\n },\n },\n /** Preset for publishable packages — adds `no-default-scope-in-package`. */\n package: {\n plugins: {\n '@typestyles': plugin,\n },\n rules: {\n '@typestyles/no-shorthand-longhand-conflict': 'error',\n '@typestyles/no-invalid-unitless-value': 'error',\n '@typestyles/no-duplicate-namespace': 'error',\n '@typestyles/no-default-scope-in-package': 'error',\n },\n },\n};\n\nObject.assign(plugin, { configs });\n\nexport default plugin;\n"]}
1
+ {"version":3,"sources":["../src/utils/create-rule.ts","../src/rules/no-default-scope-in-package.ts","../src/utils/style-calls.ts","../src/rules/no-duplicate-namespace.ts","../src/utils/css-properties.ts","../src/utils/style-ast.ts","../src/rules/no-invalid-unitless-value.ts","../src/rules/no-removed-public-classname.ts","../src/rules/no-shorthand-longhand-conflict.ts","../src/index.ts"],"names":["memberPropertyName"],"mappings":"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","file":"index.js","sourcesContent":["import { ESLintUtils } from '@typescript-eslint/utils';\n\nexport const createRule = ESLintUtils.RuleCreator(\n (name) => `https://typestyles.dev/docs/eslint#${name}`,\n);\n","import type { TSESTree } from '@typescript-eslint/utils';\nimport { createRule } from '../utils/create-rule';\n\nfunction memberPropertyName(node: TSESTree.MemberExpression): string | null {\n if (node.property.type === 'Identifier' && !node.computed) return node.property.name;\n if (node.property.type === 'Literal' && typeof node.property.value === 'string') {\n return node.property.value;\n }\n return null;\n}\n\nfunction isDefaultStylesCall(node: TSESTree.CallExpression): boolean {\n const { callee } = node;\n if (callee.type !== 'MemberExpression') return false;\n const method = memberPropertyName(callee);\n if (method !== 'class' && method !== 'component') return false;\n\n if (callee.object.type === 'Identifier') {\n return callee.object.name === 'styles';\n }\n return false;\n}\n\nexport const noDefaultScopeInPackage = createRule({\n name: 'no-default-scope-in-package',\n meta: {\n type: 'suggestion',\n docs: {\n description:\n 'Require a scoped styles factory (`createTypeStyles`/`createStyles` with `scopeId`) instead of the default `styles` export in publishable packages',\n },\n messages: {\n unscopedInPackage:\n 'Using the default `styles.{{method}}()` in a published package risks class-name collisions. Use `createTypeStyles({ scopeId: pkg.name })` or `createStyles({ scopeId })` instead.',\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n CallExpression(node) {\n if (!isDefaultStylesCall(node)) return;\n\n const method = memberPropertyName(node.callee as TSESTree.MemberExpression);\n\n context.report({\n node: node.callee,\n messageId: 'unscopedInPackage',\n data: { method: method ?? 'class' },\n });\n },\n };\n },\n});\n","import type { TSESTree } from '@typescript-eslint/utils';\n\nexport type NamespaceKind =\n | 'styles.class'\n | 'styles.component'\n | 'styles.hashClass'\n | 'tokens.create'\n | 'tokens.createTheme'\n | 'createTheme'\n | 'keyframes.create'\n | 'global.style'\n | 'global.fontFace';\n\nexport interface NamespaceCall {\n kind: NamespaceKind;\n /** Logical namespace key used for duplicate detection. */\n key: string;\n /** AST node for the namespace string literal (for reporting). */\n nameNode: TSESTree.StringLiteral;\n}\n\nfunction memberPropertyName(node: TSESTree.MemberExpression): string | null {\n if (node.property.type === 'Identifier' && !node.computed) return node.property.name;\n if (node.property.type === 'Literal' && typeof node.property.value === 'string') {\n return node.property.value;\n }\n return null;\n}\n\nfunction calleeRootName(node: TSESTree.CallExpression['callee']): string | null {\n if (node.type === 'Identifier') return node.name;\n if (node.type === 'MemberExpression') {\n if (node.object.type === 'Identifier') return node.object.name;\n if (node.object.type === 'MemberExpression') {\n const inner = memberPropertyName(node.object);\n const outer = calleeRootName(node.object);\n if (outer && inner) return `${outer}.${inner}`;\n }\n }\n return null;\n}\n\nfunction isMemberCall(\n callee: TSESTree.CallExpression['callee'],\n objectName: string,\n method: string,\n): boolean {\n if (callee.type !== 'MemberExpression') return false;\n const methodName = memberPropertyName(callee);\n if (methodName !== method) return false;\n if (callee.object.type === 'Identifier') return callee.object.name === objectName;\n return false;\n}\n\nfunction firstStringArg(args: TSESTree.CallExpressionArgument[]): TSESTree.StringLiteral | null {\n const first = args[0];\n if (!first || first.type === 'SpreadElement') return null;\n if (first.type === 'Literal' && typeof first.value === 'string') return first;\n return null;\n}\n\n/**\n * Detect TypeStyles namespace registrations from call expressions.\n * Matches API shape (e.g. `styles.class('card', …)`) regardless of import alias.\n */\nexport function getNamespaceCall(node: TSESTree.CallExpression): NamespaceCall | null {\n const { callee, arguments: args } = node;\n\n if (isMemberCall(callee, 'styles', 'class')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'styles.class', key: `.${nameNode.value}-`, nameNode };\n }\n\n if (isMemberCall(callee, 'styles', 'component')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'styles.component', key: `.${nameNode.value}-`, nameNode };\n }\n\n if (isMemberCall(callee, 'styles', 'hashClass')) {\n const first = args[0];\n if (!first || first.type === 'SpreadElement') return null;\n if (first.type === 'Literal' && typeof first.value === 'string') {\n return { kind: 'styles.hashClass', key: `.${first.value}-`, nameNode: first };\n }\n const label = args[1];\n if (label?.type === 'Literal' && typeof label.value === 'string') {\n return { kind: 'styles.hashClass', key: `.${label.value}-`, nameNode: label };\n }\n return null;\n }\n\n if (isMemberCall(callee, 'tokens', 'create')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'tokens.create', key: `tokens:${nameNode.value}`, nameNode };\n }\n\n if (isMemberCall(callee, 'tokens', 'createTheme')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'tokens.createTheme', key: `theme:${nameNode.value}`, nameNode };\n }\n\n if (callee.type === 'Identifier' && callee.name === 'createTheme') {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'createTheme', key: `theme:${nameNode.value}`, nameNode };\n }\n\n if (isMemberCall(callee, 'keyframes', 'create')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'keyframes.create', key: `keyframes:${nameNode.value}`, nameNode };\n }\n\n if (isMemberCall(callee, 'global', 'style')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'global.style', key: nameNode.value, nameNode };\n }\n\n if (isMemberCall(callee, 'global', 'fontFace')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'global.fontFace', key: `font-face:${nameNode.value}`, nameNode };\n }\n\n // `myStyles.class` / `myTokens.create` from createStyles/createTokens bindings\n if (callee.type === 'MemberExpression') {\n const method = memberPropertyName(callee);\n const root = calleeRootName(callee);\n if (method === 'class' && root) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'styles.class', key: `.${nameNode.value}-`, nameNode };\n }\n if (method === 'component' && root) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'styles.component', key: `.${nameNode.value}-`, nameNode };\n }\n if (method === 'create' && root?.endsWith('tokens')) {\n const nameNode = firstStringArg(args);\n if (!nameNode) return null;\n return { kind: 'tokens.create', key: `tokens:${nameNode.value}`, nameNode };\n }\n }\n\n return null;\n}\n\n/** Extract style object literals passed to TypeStyles style APIs. */\nexport function getStyleObjectArguments(\n node: TSESTree.CallExpression,\n): TSESTree.ObjectExpression[] {\n const { callee, arguments: args } = node;\n const objects: TSESTree.ObjectExpression[] = [];\n\n const pushObject = (arg: TSESTree.CallExpressionArgument | undefined) => {\n if (!arg || arg.type === 'SpreadElement') return;\n if (arg.type === 'ObjectExpression') objects.push(arg);\n if (arg.type === 'ArrowFunctionExpression' && arg.body.type === 'ObjectExpression') {\n objects.push(arg.body);\n }\n };\n\n if (callee.type === 'MemberExpression') {\n const method = memberPropertyName(callee);\n if (method === 'class' || method === 'component') {\n pushObject(args[1]);\n return objects;\n }\n if (method === 'hashClass') {\n const first = args[0];\n if (first && first.type !== 'SpreadElement' && first.type === 'ObjectExpression') {\n objects.push(first);\n }\n return objects;\n }\n }\n\n return objects;\n}\n","import { createRule } from '../utils/create-rule';\nimport { getNamespaceCall } from '../utils/style-calls';\n\ninterface NamespaceLocation {\n filename: string;\n line: number;\n column: number;\n}\n\n/** Cross-file registry for a single ESLint CLI run (best-effort; not shared across workers). */\nconst namespaceRegistry = new Map<string, NamespaceLocation>();\n\n/** @internal Test hook */\nexport function resetNamespaceRegistry(): void {\n namespaceRegistry.clear();\n}\n\nexport const noDuplicateNamespace = createRule({\n name: 'no-duplicate-namespace',\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Disallow reusing the same TypeStyles namespace (`styles.class`, `styles.component`, `tokens.create`, …) across the project',\n },\n messages: {\n duplicateInFile:\n 'Namespace `{{name}}` ({{kind}}) is already registered in this file at line {{line}}.',\n duplicateAcrossFiles:\n 'Namespace `{{name}}` ({{kind}}) is already registered in `{{otherFile}}` at line {{line}}.',\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const fileSeen = new Map<string, { line: number; column: number }>();\n const filename = context.filename;\n\n return {\n CallExpression(node) {\n const call = getNamespaceCall(node);\n if (!call) return;\n\n const displayName =\n call.kind === 'styles.class' || call.kind === 'styles.component'\n ? call.nameNode.value\n : call.nameNode.value;\n\n const line = call.nameNode.loc?.start.line ?? node.loc?.start.line ?? 0;\n const column = call.nameNode.loc?.start.column ?? node.loc?.start.column ?? 0;\n\n const priorInFile = fileSeen.get(call.key);\n if (priorInFile) {\n context.report({\n node: call.nameNode,\n messageId: 'duplicateInFile',\n data: {\n name: displayName,\n kind: call.kind,\n line: String(priorInFile.line),\n },\n });\n return;\n }\n fileSeen.set(call.key, { line, column });\n\n const priorGlobal = namespaceRegistry.get(call.key);\n if (priorGlobal && priorGlobal.filename !== filename) {\n context.report({\n node: call.nameNode,\n messageId: 'duplicateAcrossFiles',\n data: {\n name: displayName,\n kind: call.kind,\n otherFile: priorGlobal.filename,\n line: String(priorGlobal.line),\n },\n });\n return;\n }\n\n if (!priorGlobal) {\n namespaceRegistry.set(call.key, { filename, line, column });\n }\n },\n };\n },\n});\n","/**\n * CSS properties that accept unitless numbers in TypeStyles serialization.\n * Keep in sync with `packages/typestyles/src/css.ts`.\n */\nexport const UNITLESS_PROPERTIES = new Set([\n 'animationIterationCount',\n 'aspectRatio',\n 'borderImageOutset',\n 'borderImageSlice',\n 'borderImageWidth',\n 'boxFlex',\n 'boxFlexGroup',\n 'boxOrdinalGroup',\n 'columnCount',\n 'columns',\n 'flex',\n 'flexGrow',\n 'flexPositive',\n 'flexShrink',\n 'flexNegative',\n 'flexOrder',\n 'fontSizeAdjust',\n 'fontWeight',\n 'gridArea',\n 'gridColumn',\n 'gridColumnEnd',\n 'gridColumnSpan',\n 'gridColumnStart',\n 'gridRow',\n 'gridRowEnd',\n 'gridRowSpan',\n 'gridRowStart',\n 'initialLetter',\n 'lineClamp',\n 'lineHeight',\n 'maskBorderOutset',\n 'maskBorderSlice',\n 'maskBorderWidth',\n 'opacity',\n 'order',\n 'orphans',\n 'scale',\n 'tabSize',\n 'widows',\n 'zIndex',\n 'zoom',\n 'fillOpacity',\n 'floodOpacity',\n 'stopOpacity',\n 'strokeDasharray',\n 'strokeDashoffset',\n 'strokeMiterlimit',\n 'strokeOpacity',\n 'strokeWidth',\n]);\n\nconst VENDOR_PREFIX_RE = /^(Webkit|Moz|ms|O)([A-Z])(.*)$/;\n\nexport function isUnitlessProperty(prop: string): boolean {\n if (UNITLESS_PROPERTIES.has(prop)) return true;\n const match = VENDOR_PREFIX_RE.exec(prop);\n if (match) {\n return UNITLESS_PROPERTIES.has(match[2].toLowerCase() + match[3]);\n }\n return false;\n}\n\n/** Shorthand property → longhands that must not appear in the same style object. */\nexport const SHORTHAND_TO_LONGHANDS: Readonly<Record<string, readonly string[]>> = {\n padding: [\n 'paddingTop',\n 'paddingRight',\n 'paddingBottom',\n 'paddingLeft',\n 'paddingInline',\n 'paddingBlock',\n 'paddingInlineStart',\n 'paddingInlineEnd',\n 'paddingBlockStart',\n 'paddingBlockEnd',\n ],\n margin: [\n 'marginTop',\n 'marginRight',\n 'marginBottom',\n 'marginLeft',\n 'marginInline',\n 'marginBlock',\n 'marginInlineStart',\n 'marginInlineEnd',\n 'marginBlockStart',\n 'marginBlockEnd',\n ],\n border: [\n 'borderWidth',\n 'borderStyle',\n 'borderColor',\n 'borderTop',\n 'borderRight',\n 'borderBottom',\n 'borderLeft',\n 'borderInline',\n 'borderBlock',\n ],\n borderWidth: [\n 'borderTopWidth',\n 'borderRightWidth',\n 'borderBottomWidth',\n 'borderLeftWidth',\n 'borderInlineWidth',\n 'borderBlockWidth',\n ],\n borderStyle: ['borderTopStyle', 'borderRightStyle', 'borderBottomStyle', 'borderLeftStyle'],\n borderColor: ['borderTopColor', 'borderRightColor', 'borderBottomColor', 'borderLeftColor'],\n borderTop: ['borderTopWidth', 'borderTopStyle', 'borderTopColor'],\n borderRight: ['borderRightWidth', 'borderRightStyle', 'borderRightColor'],\n borderBottom: ['borderBottomWidth', 'borderBottomStyle', 'borderBottomColor'],\n borderLeft: ['borderLeftWidth', 'borderLeftStyle', 'borderLeftColor'],\n background: [\n 'backgroundColor',\n 'backgroundImage',\n 'backgroundPosition',\n 'backgroundSize',\n 'backgroundRepeat',\n 'backgroundAttachment',\n 'backgroundOrigin',\n 'backgroundClip',\n ],\n font: ['fontStyle', 'fontVariant', 'fontWeight', 'fontSize', 'lineHeight', 'fontFamily'],\n flex: ['flexGrow', 'flexShrink', 'flexBasis'],\n gap: ['rowGap', 'columnGap'],\n overflow: ['overflowX', 'overflowY'],\n transition: [\n 'transitionProperty',\n 'transitionDuration',\n 'transitionTimingFunction',\n 'transitionDelay',\n ],\n animation: [\n 'animationName',\n 'animationDuration',\n 'animationTimingFunction',\n 'animationDelay',\n 'animationIterationCount',\n 'animationDirection',\n 'animationFillMode',\n 'animationPlayState',\n ],\n outline: ['outlineWidth', 'outlineStyle', 'outlineColor'],\n listStyle: ['listStyleType', 'listStylePosition', 'listStyleImage'],\n grid: [\n 'gridTemplateRows',\n 'gridTemplateColumns',\n 'gridTemplateAreas',\n 'gridAutoRows',\n 'gridAutoColumns',\n 'gridAutoFlow',\n ],\n gridTemplate: ['gridTemplateRows', 'gridTemplateColumns', 'gridTemplateAreas'],\n inset: ['top', 'right', 'bottom', 'left'],\n insetBlock: ['insetBlockStart', 'insetBlockEnd'],\n insetInline: ['insetInlineStart', 'insetInlineEnd'],\n};\n\n/** Bare numeric strings (no CSS unit) that emit invalid CSS when serialized. */\nexport const BARE_NUMBER_STRING_RE = /^-?\\d+(\\.\\d+)?$/;\n\nexport function findShorthandLonghandConflicts(\n propertyNames: readonly string[],\n): Array<{ shorthand: string; longhand: string }> {\n const keys = new Set(propertyNames);\n const seen = new Set<string>();\n const conflicts: Array<{ shorthand: string; longhand: string }> = [];\n\n for (const key of keys) {\n const longhands = SHORTHAND_TO_LONGHANDS[key];\n if (longhands) {\n for (const longhand of longhands) {\n if (keys.has(longhand)) {\n const id = `${key}|${longhand}`;\n if (!seen.has(id)) {\n seen.add(id);\n conflicts.push({ shorthand: key, longhand });\n }\n }\n }\n }\n }\n\n return conflicts;\n}\n","import type { TSESTree } from '@typescript-eslint/utils';\n\nconst NESTED_SELECTOR_KEY_RE = /^(&|@|\\[)/;\n\n/** Keys that wrap nested style objects in component configs. */\nconst COMPONENT_STRUCTURAL_KEYS = new Set([\n 'base',\n 'variants',\n 'defaultVariants',\n 'compoundVariants',\n 'slots',\n]);\n\nexport function getStaticPropertyKey(prop: TSESTree.Property): string | null {\n if (prop.computed) return null;\n if (prop.key.type === 'Identifier') return prop.key.name;\n if (prop.key.type === 'Literal' && typeof prop.key.value === 'string') return prop.key.value;\n return null;\n}\n\nexport function isCssPropertyKey(key: string): boolean {\n if (NESTED_SELECTOR_KEY_RE.test(key)) return false;\n if (COMPONENT_STRUCTURAL_KEYS.has(key)) return false;\n return /^[a-zA-Z]/.test(key);\n}\n\n/**\n * Collect CSS property names declared at the top level of a style object literal.\n */\nexport function collectCssPropertyNames(obj: TSESTree.ObjectExpression): string[] {\n const names: string[] = [];\n for (const prop of obj.properties) {\n if (prop.type !== 'Property') continue;\n const key = getStaticPropertyKey(prop);\n if (key && isCssPropertyKey(key)) names.push(key);\n }\n return names;\n}\n\n/**\n * Visit each style object literal in a TypeStyles style/config tree.\n * Recurses into pseudos, at-rules, component `base` / `variants`, and slot objects.\n */\nexport function visitStyleObjectLiterals(\n node: TSESTree.ObjectExpression,\n onStyleObject: (obj: TSESTree.ObjectExpression) => void,\n): void {\n onStyleObject(node);\n\n for (const prop of node.properties) {\n if (prop.type !== 'Property') continue;\n const key = getStaticPropertyKey(prop);\n if (!key) continue;\n\n if (NESTED_SELECTOR_KEY_RE.test(key)) {\n if (prop.value.type === 'ObjectExpression') {\n visitStyleObjectLiterals(prop.value, onStyleObject);\n }\n continue;\n }\n\n if (key === 'variants' && prop.value.type === 'ObjectExpression') {\n for (const groupProp of prop.value.properties) {\n if (groupProp.type !== 'Property' || groupProp.value.type !== 'ObjectExpression') continue;\n for (const optionProp of groupProp.value.properties) {\n if (optionProp.type === 'Property' && optionProp.value.type === 'ObjectExpression') {\n visitStyleObjectLiterals(optionProp.value, onStyleObject);\n }\n }\n }\n continue;\n }\n\n if (key === 'compoundVariants' && prop.value.type === 'ArrayExpression') {\n for (const element of prop.value.elements) {\n if (!element || element.type !== 'ObjectExpression') continue;\n for (const cvProp of element.properties) {\n if (cvProp.type !== 'Property') continue;\n const cvKey = getStaticPropertyKey(cvProp);\n if (cvKey === 'css' && cvProp.value.type === 'ObjectExpression') {\n visitStyleObjectLiterals(cvProp.value, onStyleObject);\n }\n }\n }\n continue;\n }\n\n if (\n (COMPONENT_STRUCTURAL_KEYS.has(key) || prop.value.type === 'ObjectExpression') &&\n prop.value.type === 'ObjectExpression'\n ) {\n visitStyleObjectLiterals(prop.value, onStyleObject);\n }\n }\n}\n\nexport function getStringLiteralValue(node: TSESTree.Node): string | null {\n if (node.type === 'Literal' && typeof node.value === 'string') return node.value;\n return null;\n}\n\nexport function getNumericLiteralValue(node: TSESTree.Node): number | null {\n if (node.type === 'Literal' && typeof node.value === 'number') return node.value;\n return null;\n}\n","import type { TSESTree } from '@typescript-eslint/utils';\nimport { createRule } from '../utils/create-rule';\nimport { BARE_NUMBER_STRING_RE, isUnitlessProperty } from '../utils/css-properties';\nimport {\n getNumericLiteralValue,\n getStaticPropertyKey,\n getStringLiteralValue,\n isCssPropertyKey,\n visitStyleObjectLiterals,\n} from '../utils/style-ast';\nimport { getStyleObjectArguments } from '../utils/style-calls';\n\nexport const noInvalidUnitlessValue = createRule({\n name: 'no-invalid-unitless-value',\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Disallow bare numeric strings on properties that require CSS units (TypeStyles only auto-appends `px` to numbers, not strings)',\n },\n messages: {\n bareNumberString:\n '`{{property}}` is set to bare number string `{{value}}`, which emits invalid CSS. Use a number (`{{numeric}}`) or a value with units (`{{value}}px`).',\n suspiciousUnitlessNumber:\n '`{{property}}` is unitless in CSS — numeric `{{value}}` is emitted without a unit. Use a ratio (e.g. `1.5`) or an explicit length (`\"24px\"`).',\n },\n schema: [\n {\n type: 'object',\n properties: {\n checkSuspiciousUnitlessNumbers: { type: 'boolean' },\n },\n additionalProperties: false,\n },\n ],\n },\n defaultOptions: [{ checkSuspiciousUnitlessNumbers: true }],\n create(context, [options]) {\n /** Properties where a large integer usually means the author meant a length, not a unitless ratio. */\n const SUSPICIOUS_UNITLESS_PROPERTIES = new Set(['lineHeight']);\n\n function checkStyleObject(obj: TSESTree.ObjectExpression) {\n for (const prop of obj.properties) {\n if (prop.type !== 'Property') continue;\n const key = getStaticPropertyKey(prop);\n if (!key || !isCssPropertyKey(key)) continue;\n\n const stringValue = getStringLiteralValue(prop.value);\n if (stringValue && BARE_NUMBER_STRING_RE.test(stringValue) && !isUnitlessProperty(key)) {\n context.report({\n node: prop.value,\n messageId: 'bareNumberString',\n data: {\n property: key,\n value: stringValue,\n numeric: stringValue,\n },\n });\n continue;\n }\n\n if (options.checkSuspiciousUnitlessNumbers && SUSPICIOUS_UNITLESS_PROPERTIES.has(key)) {\n const num = getNumericLiteralValue(prop.value);\n if (num != null && num >= 8 && Number.isInteger(num)) {\n context.report({\n node: prop.value,\n messageId: 'suspiciousUnitlessNumber',\n data: { property: key, value: String(num) },\n });\n }\n }\n }\n }\n\n return {\n CallExpression(node) {\n for (const styleObj of getStyleObjectArguments(node)) {\n visitStyleObjectLiterals(styleObj, checkStyleObject);\n }\n },\n ObjectExpression(node) {\n const parent = node.parent;\n if (\n parent?.type === 'Property' &&\n (parent.key.type === 'Identifier' || parent.key.type === 'Literal')\n ) {\n const parentKey =\n parent.key.type === 'Identifier'\n ? parent.key.name\n : typeof parent.key.value === 'string'\n ? parent.key.value\n : null;\n if (parentKey === 'from' || parentKey === 'to' || /^\\d+%$/.test(parentKey ?? '')) {\n visitStyleObjectLiterals(node, checkStyleObject);\n }\n }\n },\n };\n },\n});\n","import path from 'node:path';\nimport { createRule } from '../utils/create-rule';\nimport {\n PUBLIC_CLASSNAMES_SNAPSHOT,\n collectPublicClassNamesSync,\n diffRemovedPublicClassNames,\n loadPublicClassNamesSnapshot,\n type PublicClassNameEntry,\n} from '@typestyles/cli';\n\ntype RuleOptions = [\n {\n snapshotFile?: string;\n rootDir?: string;\n }?,\n];\n\nlet comparisonDone = false;\nlet cachedRemoved: PublicClassNameEntry[] = [];\nlet reportsEmitted = false;\n\n/** @internal Test hook */\nexport function resetRemovedPublicClassnameState(): void {\n comparisonDone = false;\n cachedRemoved = [];\n reportsEmitted = false;\n}\n\nfunction resolveRemovedClassNames(\n context: Parameters<NonNullable<ReturnType<typeof createRule>['create']>>[0],\n options: RuleOptions[0],\n): PublicClassNameEntry[] {\n if (comparisonDone) return cachedRemoved;\n\n const rootDir = path.resolve(options?.rootDir ?? context.cwd ?? process.cwd());\n const snapshotPath = path.resolve(rootDir, options?.snapshotFile ?? PUBLIC_CLASSNAMES_SNAPSHOT);\n const snapshot = loadPublicClassNamesSnapshot(snapshotPath);\n if (!snapshot) {\n comparisonDone = true;\n cachedRemoved = [];\n return cachedRemoved;\n }\n\n const current = collectPublicClassNamesSync({ rootDir });\n cachedRemoved = diffRemovedPublicClassNames(snapshot, current);\n comparisonDone = true;\n return cachedRemoved;\n}\n\nexport const noRemovedPublicClassname = createRule<RuleOptions, 'removed'>({\n name: 'no-removed-public-classname',\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Disallow removing or renaming semantic class names listed in `.typestyles-public-classnames.json`',\n },\n messages: {\n removed:\n 'Public class name `{{className}}` was removed or renamed. This is a breaking change — restore the name or regenerate the snapshot with `typestyles snapshot --write` after a deliberate semver bump.',\n },\n schema: [\n {\n type: 'object',\n properties: {\n snapshotFile: { type: 'string' },\n rootDir: { type: 'string' },\n },\n additionalProperties: false,\n },\n ],\n },\n defaultOptions: [{}],\n create(context, [options]) {\n const rootDir = path.resolve(options?.rootDir ?? context.cwd ?? process.cwd());\n const snapshotPath = path.resolve(rootDir, options?.snapshotFile ?? PUBLIC_CLASSNAMES_SNAPSHOT);\n if (!loadPublicClassNamesSnapshot(snapshotPath)) {\n return {};\n }\n\n return {\n 'Program:exit'(node) {\n if (reportsEmitted) return;\n reportsEmitted = true;\n\n const removed = resolveRemovedClassNames(context, options);\n for (const entry of removed) {\n context.report({\n node,\n messageId: 'removed',\n data: { className: entry.className },\n });\n }\n },\n };\n },\n});\n","import type { TSESTree } from '@typescript-eslint/utils';\nimport { createRule } from '../utils/create-rule';\nimport { findShorthandLonghandConflicts } from '../utils/css-properties';\nimport { collectCssPropertyNames, visitStyleObjectLiterals } from '../utils/style-ast';\nimport { getStyleObjectArguments } from '../utils/style-calls';\n\nexport const noShorthandLonghandConflict = createRule({\n name: 'no-shorthand-longhand-conflict',\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Disallow mixing CSS shorthand and longhand properties in the same TypeStyles style object',\n },\n messages: {\n conflict:\n '`{{shorthand}}` and `{{longhand}}` must not appear in the same style object — the longhand is ignored or overridden unpredictably.',\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n function checkStyleObject(obj: TSESTree.ObjectExpression) {\n const propertyNames = collectCssPropertyNames(obj);\n const conflicts = findShorthandLonghandConflicts(propertyNames);\n for (const { shorthand, longhand } of conflicts) {\n context.report({\n node: obj,\n messageId: 'conflict',\n data: { shorthand, longhand },\n });\n }\n }\n\n return {\n CallExpression(node) {\n for (const styleObj of getStyleObjectArguments(node)) {\n visitStyleObjectLiterals(styleObj, checkStyleObject);\n }\n },\n ObjectExpression(node) {\n // Keyframe stops: `{ from: { opacity: 0 }, to: { opacity: 1 } }`\n const parent = node.parent;\n if (\n parent?.type === 'Property' &&\n (parent.key.type === 'Identifier' || parent.key.type === 'Literal')\n ) {\n const parentKey =\n parent.key.type === 'Identifier'\n ? parent.key.name\n : typeof parent.key.value === 'string'\n ? parent.key.value\n : null;\n if (parentKey === 'from' || parentKey === 'to' || /^\\d+%$/.test(parentKey ?? '')) {\n visitStyleObjectLiterals(node, checkStyleObject);\n }\n }\n },\n };\n },\n});\n","import { noDefaultScopeInPackage } from './rules/no-default-scope-in-package';\nimport { noDuplicateNamespace } from './rules/no-duplicate-namespace';\nimport { noInvalidUnitlessValue } from './rules/no-invalid-unitless-value';\nimport { noRemovedPublicClassname } from './rules/no-removed-public-classname';\nimport { noShorthandLonghandConflict } from './rules/no-shorthand-longhand-conflict';\n\nexport const rules = {\n 'no-default-scope-in-package': noDefaultScopeInPackage,\n 'no-shorthand-longhand-conflict': noShorthandLonghandConflict,\n 'no-invalid-unitless-value': noInvalidUnitlessValue,\n 'no-duplicate-namespace': noDuplicateNamespace,\n 'no-removed-public-classname': noRemovedPublicClassname,\n};\n\nexport {\n noDefaultScopeInPackage,\n noShorthandLonghandConflict,\n noInvalidUnitlessValue,\n noDuplicateNamespace,\n noRemovedPublicClassname,\n};\n\nconst plugin = {\n meta: {\n name: '@typestyles/eslint-plugin',\n version: '0.1.0',\n },\n rules,\n};\n\n/** Flat-config preset for TypeStyles projects. */\nexport const configs = {\n recommended: {\n plugins: {\n '@typestyles': plugin,\n },\n rules: {\n '@typestyles/no-shorthand-longhand-conflict': 'error',\n '@typestyles/no-invalid-unitless-value': 'error',\n '@typestyles/no-duplicate-namespace': 'error',\n },\n },\n /** Preset for publishable packages — adds `no-default-scope-in-package`. */\n package: {\n plugins: {\n '@typestyles': plugin,\n },\n rules: {\n '@typestyles/no-shorthand-longhand-conflict': 'error',\n '@typestyles/no-invalid-unitless-value': 'error',\n '@typestyles/no-duplicate-namespace': 'error',\n '@typestyles/no-default-scope-in-package': 'error',\n },\n },\n};\n\nObject.assign(plugin, { configs });\n\nexport default plugin;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@typestyles/eslint-plugin",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "description": "ESLint rules for TypeStyles style objects and namespace usage",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -31,9 +31,11 @@
31
31
  "eslint": "^8.57.0 || ^9.0.0"
32
32
  },
33
33
  "dependencies": {
34
- "@typescript-eslint/utils": "^8.54.0"
34
+ "@typescript-eslint/utils": "^8.54.0",
35
+ "@typestyles/cli": "0.2.1"
35
36
  },
36
37
  "devDependencies": {
38
+ "@types/node": "^25.2.1",
37
39
  "@typescript-eslint/parser": "^8.54.0",
38
40
  "@typescript-eslint/rule-tester": "^8.54.0",
39
41
  "eslint": "^9.39.2",