@tenphi/eslint-plugin-tasty 1.17.0 → 1.17.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
@@ -257,7 +257,7 @@ not matched.
257
257
  | `tasty/prefer-shorthand-property` | warn | Use Tasty shorthand instead of native CSS properties (`backgroundColor` → `fill`, `paddingBlock` → `blockPadding`, etc.). Report-only warnings explain how to override one part through a token, with concrete min/max dimension examples. Extension warnings point at the base component and are skipped over bases you cannot edit (see `ownedSources`; [details](docs/rules/prefer-shorthand-property.md)) |
258
258
  | `tasty/no-raw-color-values` | warn | Raw hex/rgb/`okhsl`/`okhst`/`oklch`/named colors instead of `#color` tokens |
259
259
  | `tasty/no-raw-transition-duration` | warn | Hardcoded `transition` duration (`fill 0.2s`) in Tasty styles or a local `tasty()` component's `transition` prop. Suggests a configured duration token or the implicit per-name timing; zero and delays are left alone |
260
- | `tasty/no-runtime-styles-mutation` | warn | Render-time JavaScript in Tasty style values (props, state, hook results, parameters, local bindings, calls, computed keys); use states and tokens instead. Module-scope constants, imports, `undefined` and static `mergeStyles(...)` calls are fixed at load and allowed |
260
+ | `tasty/no-runtime-styles-mutation` | warn | Render-time JavaScript in Tasty style values (props, state, hook results, parameters, local bindings, calls, computed keys); use states and tokens instead. A style object no function encloses is built once at load and not checked; inside a function, module-scope constants, imports, `undefined` and static `mergeStyles(...)` calls are fixed at load and allowed |
261
261
  | `tasty/no-style-spread` | warn | Object or array spreads inside runtime Tasty styles; recommends `mergeStyles` for multiple root spreads; intentional spreads need a per-line suppression and reason |
262
262
  | `tasty/no-style-prop` | warn | `style` on recognized Tasty components; use token references and the `tokens` prop. The `elements` option covers every component or element, so it can replace React's `style` restriction; `values: 'static'` reports only static styles. Tasty syntax in `style` is always reported ([details](docs/rules/no-style-prop.md)) |
263
263
  | `tasty/no-classname-prop` | warn | `className` on recognized Tasty components; keep styling in Tasty or use `data-element` for sub-elements ([details](docs/rules/no-classname-prop.md)) |
@@ -85,10 +85,28 @@ var no_runtime_styles_mutation_default = createRule({
85
85
  checkValue(prop.value, property, childIsStateMap);
86
86
  }
87
87
  }
88
+ /**
89
+ * Whether an object is built once, while the module loads: no function
90
+ * encloses it, and neither does an instance field, which runs per
91
+ * instance. Every value in it is then fixed at load, calls included.
92
+ */
93
+ function isBuiltAtLoad(node) {
94
+ for (let current = node.parent; current; current = current.parent) switch (current.type) {
95
+ case "FunctionDeclaration":
96
+ case "FunctionExpression":
97
+ case "ArrowFunctionExpression": return false;
98
+ case "PropertyDefinition":
99
+ case "AccessorProperty":
100
+ if (!current.static) return false;
101
+ break;
102
+ }
103
+ return true;
104
+ }
88
105
  function handleStyleObject(node) {
89
106
  const styleCtx = ctx.getStyleContext(node);
90
107
  if (!styleCtx || styleCtx.isStaticCall) return;
91
108
  if (ctx.getRootStyleObject(node) !== node) return;
109
+ if (isBuiltAtLoad(node)) return;
92
110
  checkProperties(node);
93
111
  }
94
112
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"no-runtime-styles-mutation.js","names":[],"sources":["../../src/rules/no-runtime-styles-mutation.ts"],"sourcesContent":["import type { TSESTree } from '@typescript-eslint/utils';\nimport { createRule } from '../create-rule.js';\nimport { TastyContext, styleObjectListeners } from '../context.js';\nimport { SPECIAL_STYLE_KEYS } from '../constants.js';\nimport { getKeyName, isStaticValue, unwrapExpression } from '../utils.js';\n\ntype MessageIds = 'dynamicStyleValue' | 'dynamicStyleKey';\n\nexport default createRule<[], MessageIds>({\n name: 'no-runtime-styles-mutation',\n meta: {\n type: 'suggestion',\n docs: {\n description: 'Warn when style objects contain JavaScript-computed values',\n },\n messages: {\n dynamicStyleValue:\n \"Prefer a static style value for '{{property}}'. Use states with mods, tokens, or styleProps for dynamic behavior. For necessary JavaScript computation, explicitly disable tasty/no-runtime-styles-mutation on this line with a reason.\",\n dynamicStyleKey:\n \"Prefer a static style key for '{{property}}'. Define states as literal keys instead of computing them in JavaScript. For necessary generated keys, explicitly disable tasty/no-runtime-styles-mutation on this line with a reason.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const ctx = new TastyContext(context);\n\n /**\n * Whether a value is fixed once the module has loaded, so Tasty generates\n * its CSS once, exactly as for a literal: literals and `undefined`, module\n * `const` bindings and imports (and their members), and templates,\n * operators and `mergeStyles(...)` calls built only from those. Anything\n * that reaches render-time scope — props, state, hook results, parameters,\n * a local `let` — is not.\n */\n function isLoadTimeValue(node: TSESTree.Node): boolean {\n const value = unwrapExpression(node);\n if (isStaticValue(value)) return true;\n\n switch (value.type) {\n case 'Identifier':\n return isLoadTimeBinding(value);\n case 'ChainExpression':\n return isLoadTimeValue(value.expression);\n case 'MemberExpression':\n return (\n isLoadTimeValue(value.object) &&\n (!value.computed || isLoadTimeValue(value.property))\n );\n case 'TemplateLiteral':\n return value.expressions.every(isLoadTimeValue);\n case 'UnaryExpression':\n return value.operator !== 'delete' && isLoadTimeValue(value.argument);\n case 'BinaryExpression':\n case 'LogicalExpression':\n return (\n value.left.type !== 'PrivateIdentifier' &&\n isLoadTimeValue(value.left) &&\n isLoadTimeValue(value.right)\n );\n case 'ConditionalExpression':\n return (\n isLoadTimeValue(value.test) &&\n isLoadTimeValue(value.consequent) &&\n isLoadTimeValue(value.alternate)\n );\n case 'ArrayExpression':\n return value.elements.every(\n (element) =>\n element === null ||\n isLoadTimeValue(\n element.type === 'SpreadElement' ? element.argument : element,\n ),\n );\n case 'CallExpression':\n // Object-literal arguments are style objects of their own, and this\n // rule checks their values where they stand.\n return (\n ctx.isMergeStylesCall(value) &&\n value.arguments.every((arg) => {\n const argument = unwrapExpression(\n arg.type === 'SpreadElement' ? arg.argument : arg,\n );\n return (\n argument.type === 'ObjectExpression' ||\n isLoadTimeValue(argument)\n );\n })\n );\n default:\n return false;\n }\n }\n\n /**\n * A module-scope `const`, enum or import, or a render-scope `const` object;\n * `undefined` when not shadowed.\n */\n function isLoadTimeBinding(node: TSESTree.Identifier): boolean {\n let scope: ReturnType<typeof context.sourceCode.getScope> | null =\n context.sourceCode.getScope(node);\n while (scope && !scope.set.has(node.name)) scope = scope.upper;\n const variable = scope?.set.get(node.name);\n\n if (!scope || !variable || variable.defs.length === 0) {\n return node.name === 'undefined';\n }\n if (scope.type !== 'module' && scope.type !== 'global') {\n // A render-scope `const` object passed on as styles is a style object\n // of its own; its values are checked where it is written.\n return variable.defs.every(\n (def) =>\n def.type === 'Variable' &&\n def.parent.kind === 'const' &&\n def.node.init !== null &&\n unwrapExpression(def.node.init).type === 'ObjectExpression',\n );\n }\n\n return variable.defs.every(\n (def) =>\n def.type === 'ImportBinding' ||\n def.type === 'TSEnumName' ||\n (def.type === 'Variable' && def.parent.kind === 'const'),\n );\n }\n\n function checkValue(\n node: TSESTree.Node,\n property: string,\n isStateMap = false,\n ): void {\n const value = unwrapExpression(node);\n\n if (value.type === 'ObjectExpression') {\n checkProperties(value, property, isStateMap);\n } else if (value.type === 'ArrayExpression') {\n for (const element of value.elements) {\n // A separate rule reports spreads, including array spreads.\n if (element && element.type !== 'SpreadElement') {\n checkValue(element, property);\n }\n }\n } else if (!isLoadTimeValue(value)) {\n context.report({\n node: value,\n messageId: 'dynamicStyleValue',\n data: { property },\n });\n }\n }\n\n function checkProperties(\n node: TSESTree.ObjectExpression,\n parentProperty = '(style)',\n isStateMap = false,\n ): void {\n for (const prop of node.properties) {\n // Spreads have their own warning and explicit per-line suppression.\n if (prop.type === 'SpreadElement') continue;\n\n // At-rule definitions have their own shape and may legitimately be\n // assembled as JavaScript objects (for example, shared keyframes).\n const key = !prop.computed ? getKeyName(prop.key) : null;\n if (key && SPECIAL_STYLE_KEYS.has(key)) continue;\n\n const property =\n isStateMap || prop.computed\n ? parentProperty\n : (key ?? parentProperty);\n\n if (prop.computed && !isLoadTimeValue(prop.key)) {\n context.report({\n node: prop.key,\n messageId: 'dynamicStyleKey',\n data: { property },\n });\n }\n\n const value = unwrapExpression(prop.value);\n const childIsStateMap =\n value.type === 'ObjectExpression' && ctx.isStateMap(value, prop);\n checkValue(prop.value, property, childIsStateMap);\n }\n }\n\n function handleStyleObject(node: TSESTree.ObjectExpression): void {\n const styleCtx = ctx.getStyleContext(node);\n // tastyStatic has a stricter build-time error for dynamic values.\n if (!styleCtx || styleCtx.isStaticCall) return;\n // Walk the full tree once; sub-element objects also match AST selectors.\n if (ctx.getRootStyleObject(node) !== node) return;\n\n checkProperties(node);\n }\n\n return {\n ImportDeclaration(node) {\n ctx.trackImport(node);\n },\n ...styleObjectListeners(handleStyleObject),\n };\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"no-runtime-styles-mutation.js","names":[],"sources":["../../src/rules/no-runtime-styles-mutation.ts"],"sourcesContent":["import type { TSESTree } from '@typescript-eslint/utils';\nimport { createRule } from '../create-rule.js';\nimport { TastyContext, styleObjectListeners } from '../context.js';\nimport { SPECIAL_STYLE_KEYS } from '../constants.js';\nimport { getKeyName, isStaticValue, unwrapExpression } from '../utils.js';\n\ntype MessageIds = 'dynamicStyleValue' | 'dynamicStyleKey';\n\nexport default createRule<[], MessageIds>({\n name: 'no-runtime-styles-mutation',\n meta: {\n type: 'suggestion',\n docs: {\n description: 'Warn when style objects contain JavaScript-computed values',\n },\n messages: {\n dynamicStyleValue:\n \"Prefer a static style value for '{{property}}'. Use states with mods, tokens, or styleProps for dynamic behavior. For necessary JavaScript computation, explicitly disable tasty/no-runtime-styles-mutation on this line with a reason.\",\n dynamicStyleKey:\n \"Prefer a static style key for '{{property}}'. Define states as literal keys instead of computing them in JavaScript. For necessary generated keys, explicitly disable tasty/no-runtime-styles-mutation on this line with a reason.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const ctx = new TastyContext(context);\n\n /**\n * Whether a value is fixed once the module has loaded, so Tasty generates\n * its CSS once, exactly as for a literal: literals and `undefined`, module\n * `const` bindings and imports (and their members), and templates,\n * operators and `mergeStyles(...)` calls built only from those. Anything\n * that reaches render-time scope — props, state, hook results, parameters,\n * a local `let` — is not.\n */\n function isLoadTimeValue(node: TSESTree.Node): boolean {\n const value = unwrapExpression(node);\n if (isStaticValue(value)) return true;\n\n switch (value.type) {\n case 'Identifier':\n return isLoadTimeBinding(value);\n case 'ChainExpression':\n return isLoadTimeValue(value.expression);\n case 'MemberExpression':\n return (\n isLoadTimeValue(value.object) &&\n (!value.computed || isLoadTimeValue(value.property))\n );\n case 'TemplateLiteral':\n return value.expressions.every(isLoadTimeValue);\n case 'UnaryExpression':\n return value.operator !== 'delete' && isLoadTimeValue(value.argument);\n case 'BinaryExpression':\n case 'LogicalExpression':\n return (\n value.left.type !== 'PrivateIdentifier' &&\n isLoadTimeValue(value.left) &&\n isLoadTimeValue(value.right)\n );\n case 'ConditionalExpression':\n return (\n isLoadTimeValue(value.test) &&\n isLoadTimeValue(value.consequent) &&\n isLoadTimeValue(value.alternate)\n );\n case 'ArrayExpression':\n return value.elements.every(\n (element) =>\n element === null ||\n isLoadTimeValue(\n element.type === 'SpreadElement' ? element.argument : element,\n ),\n );\n case 'CallExpression':\n // Object-literal arguments are style objects of their own, and this\n // rule checks their values where they stand.\n return (\n ctx.isMergeStylesCall(value) &&\n value.arguments.every((arg) => {\n const argument = unwrapExpression(\n arg.type === 'SpreadElement' ? arg.argument : arg,\n );\n return (\n argument.type === 'ObjectExpression' ||\n isLoadTimeValue(argument)\n );\n })\n );\n default:\n return false;\n }\n }\n\n /**\n * A module-scope `const`, enum or import, or a render-scope `const` object;\n * `undefined` when not shadowed.\n */\n function isLoadTimeBinding(node: TSESTree.Identifier): boolean {\n let scope: ReturnType<typeof context.sourceCode.getScope> | null =\n context.sourceCode.getScope(node);\n while (scope && !scope.set.has(node.name)) scope = scope.upper;\n const variable = scope?.set.get(node.name);\n\n if (!scope || !variable || variable.defs.length === 0) {\n return node.name === 'undefined';\n }\n if (scope.type !== 'module' && scope.type !== 'global') {\n // A render-scope `const` object passed on as styles is a style object\n // of its own; its values are checked where it is written.\n return variable.defs.every(\n (def) =>\n def.type === 'Variable' &&\n def.parent.kind === 'const' &&\n def.node.init !== null &&\n unwrapExpression(def.node.init).type === 'ObjectExpression',\n );\n }\n\n return variable.defs.every(\n (def) =>\n def.type === 'ImportBinding' ||\n def.type === 'TSEnumName' ||\n (def.type === 'Variable' && def.parent.kind === 'const'),\n );\n }\n\n function checkValue(\n node: TSESTree.Node,\n property: string,\n isStateMap = false,\n ): void {\n const value = unwrapExpression(node);\n\n if (value.type === 'ObjectExpression') {\n checkProperties(value, property, isStateMap);\n } else if (value.type === 'ArrayExpression') {\n for (const element of value.elements) {\n // A separate rule reports spreads, including array spreads.\n if (element && element.type !== 'SpreadElement') {\n checkValue(element, property);\n }\n }\n } else if (!isLoadTimeValue(value)) {\n context.report({\n node: value,\n messageId: 'dynamicStyleValue',\n data: { property },\n });\n }\n }\n\n function checkProperties(\n node: TSESTree.ObjectExpression,\n parentProperty = '(style)',\n isStateMap = false,\n ): void {\n for (const prop of node.properties) {\n // Spreads have their own warning and explicit per-line suppression.\n if (prop.type === 'SpreadElement') continue;\n\n // At-rule definitions have their own shape and may legitimately be\n // assembled as JavaScript objects (for example, shared keyframes).\n const key = !prop.computed ? getKeyName(prop.key) : null;\n if (key && SPECIAL_STYLE_KEYS.has(key)) continue;\n\n const property =\n isStateMap || prop.computed\n ? parentProperty\n : (key ?? parentProperty);\n\n if (prop.computed && !isLoadTimeValue(prop.key)) {\n context.report({\n node: prop.key,\n messageId: 'dynamicStyleKey',\n data: { property },\n });\n }\n\n const value = unwrapExpression(prop.value);\n const childIsStateMap =\n value.type === 'ObjectExpression' && ctx.isStateMap(value, prop);\n checkValue(prop.value, property, childIsStateMap);\n }\n }\n\n /**\n * Whether an object is built once, while the module loads: no function\n * encloses it, and neither does an instance field, which runs per\n * instance. Every value in it is then fixed at load, calls included.\n */\n function isBuiltAtLoad(node: TSESTree.Node): boolean {\n for (let current = node.parent; current; current = current.parent) {\n switch (current.type) {\n case 'FunctionDeclaration':\n case 'FunctionExpression':\n case 'ArrowFunctionExpression':\n return false;\n case 'PropertyDefinition':\n case 'AccessorProperty':\n if (!current.static) return false;\n break;\n }\n }\n return true;\n }\n\n function handleStyleObject(node: TSESTree.ObjectExpression): void {\n const styleCtx = ctx.getStyleContext(node);\n // tastyStatic has a stricter build-time error for dynamic values.\n if (!styleCtx || styleCtx.isStaticCall) return;\n // Walk the full tree once; sub-element objects also match AST selectors.\n if (ctx.getRootStyleObject(node) !== node) return;\n if (isBuiltAtLoad(node)) return;\n\n checkProperties(node);\n }\n\n return {\n ImportDeclaration(node) {\n ctx.trackImport(node);\n },\n ...styleObjectListeners(handleStyleObject),\n };\n },\n});\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tenphi/eslint-plugin-tasty",
3
- "version": "1.17.0",
3
+ "version": "1.17.1",
4
4
  "description": "ESLint plugin for validating tasty() and tastyStatic() style objects",
5
5
  "type": "module",
6
6
  "exports": {