@tsrx/eslint-plugin 0.5.2 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.d.ts +4 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -5
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -48,4 +48,4 @@ example, Ripple-specific `track()` placement and DOM event guidance should be
|
|
|
48
48
|
provided by Ripple-owned tooling rather than applied to every TSRX target.
|
|
49
49
|
|
|
50
50
|
See the [TSRX documentation](https://tsrx.dev/) and
|
|
51
|
-
[`@tsrx/eslint-parser`](
|
|
51
|
+
[`@tsrx/eslint-parser`](https://github.com/tsrx-org/tsrx/tree/main/packages/eslint-parser).
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import * as _$eslint from "eslint";
|
|
2
|
-
|
|
3
1
|
//#region src/index.d.ts
|
|
4
2
|
declare const plugin: {
|
|
5
3
|
meta: {
|
|
@@ -7,10 +5,10 @@ declare const plugin: {
|
|
|
7
5
|
version: string;
|
|
8
6
|
};
|
|
9
7
|
rules: {
|
|
10
|
-
'no-return-in-component':
|
|
11
|
-
'control-flow-jsx':
|
|
12
|
-
'valid-for-of-key':
|
|
13
|
-
'require-statement-container-body':
|
|
8
|
+
'no-return-in-component': import("eslint").Rule.RuleModule;
|
|
9
|
+
'control-flow-jsx': import("eslint").Rule.RuleModule;
|
|
10
|
+
'valid-for-of-key': import("eslint").Rule.RuleModule;
|
|
11
|
+
'require-statement-container-body': import("eslint").Rule.RuleModule;
|
|
14
12
|
};
|
|
15
13
|
configs: any;
|
|
16
14
|
};
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":";cAMM;;;;;;;;;;;EAWU"}
|
package/dist/index.js
CHANGED
|
@@ -17,7 +17,7 @@ const rule$3 = {
|
|
|
17
17
|
};
|
|
18
18
|
//#endregion
|
|
19
19
|
//#region src/utils/tsrx.ts
|
|
20
|
-
const NESTED_BOUNDARY_TYPES$1 = new Set([
|
|
20
|
+
const NESTED_BOUNDARY_TYPES$1 = /* @__PURE__ */ new Set([
|
|
21
21
|
"FunctionDeclaration",
|
|
22
22
|
"FunctionExpression",
|
|
23
23
|
"ArrowFunctionExpression",
|
|
@@ -54,7 +54,7 @@ function containsNativeTsrxReturn(node) {
|
|
|
54
54
|
}
|
|
55
55
|
//#endregion
|
|
56
56
|
//#region src/rules/control-flow-jsx.ts
|
|
57
|
-
const NESTED_BOUNDARY_TYPES = new Set([
|
|
57
|
+
const NESTED_BOUNDARY_TYPES = /* @__PURE__ */ new Set([
|
|
58
58
|
"FunctionDeclaration",
|
|
59
59
|
"FunctionExpression",
|
|
60
60
|
"ArrowFunctionExpression",
|
|
@@ -188,9 +188,7 @@ const rule$1 = {
|
|
|
188
188
|
traverse(node.consequent);
|
|
189
189
|
traverse(node.alternate);
|
|
190
190
|
break;
|
|
191
|
-
case "TemplateLiteral":
|
|
192
|
-
node.expressions.forEach(traverse);
|
|
193
|
-
break;
|
|
191
|
+
case "TemplateLiteral": node.expressions.forEach(traverse);
|
|
194
192
|
}
|
|
195
193
|
};
|
|
196
194
|
traverse(node.key);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["rule","NESTED_BOUNDARY_TYPES","functionNode","rule","rule","noReturnInComponent","controlFlowJsx","validForOfKey","requireStatementContainerBody"],"sources":["../src/rules/no-return-in-component.ts","../src/utils/tsrx.ts","../src/rules/control-flow-jsx.ts","../src/rules/valid-for-of-key.ts","../src/rules/require-statement-container-body.ts","../src/index.ts"],"sourcesContent":["import type { Rule } from 'eslint';\n\nconst rule: Rule.RuleModule = {\n\tmeta: {\n\t\ttype: 'problem',\n\t\tdocs: {\n\t\t\tdescription: 'Deprecated: TSRX components are functions that return native TSRX expressions.',\n\t\t\trecommended: false,\n\t\t},\n\t\tdeprecated: true,\n\t\tmessages: {\n\t\t\tnoReturn: 'TSRX components should return native TSRX expressions.',\n\t\t},\n\t\tschema: [],\n\t},\n\tcreate(context) {\n\t\tvoid context;\n\t\treturn {};\n\t},\n};\n\nexport default rule;\n","import type * as AST from '@tsrx/core/types/estree';\n\ntype AnyNode = AST.Node & Record<string, any>;\n\nconst NESTED_BOUNDARY_TYPES = new Set([\n\t'FunctionDeclaration',\n\t'FunctionExpression',\n\t'ArrowFunctionExpression',\n\t'ClassDeclaration',\n\t'ClassExpression',\n\t'MethodDefinition',\n\t'PropertyDefinition',\n\t'StaticBlock',\n]);\n\nexport function isNativeTsrxJsxNode(node: AST.Node | null | undefined): boolean {\n\tif (!node) return false;\n\n\tif (\n\t\tnode.type === ('JSXCodeBlock' as string) ||\n\t\tnode.type === ('JSXIfExpression' as string) ||\n\t\tnode.type === ('JSXForExpression' as string) ||\n\t\tnode.type === ('JSXSwitchExpression' as string) ||\n\t\tnode.type === ('JSXTryExpression' as string)\n\t) {\n\t\treturn true;\n\t}\n\n\treturn (\n\t\t(node.type === ('JSXElement' as string) ||\n\t\t\tnode.type === ('JSXFragment' as string) ||\n\t\t\tnode.type === ('JSXStyleElement' as string)) &&\n\t\t!!(node as AnyNode).metadata?.native_tsrx\n\t);\n}\n\nexport function functionReturnsNativeTsrx(node: AST.Node): boolean {\n\tconst functionNode = node as AnyNode;\n\tconst body = functionNode.body as AnyNode | undefined;\n\n\tif (!body) {\n\t\treturn false;\n\t}\n\n\tif (isNativeTsrxJsxNode(body)) {\n\t\treturn true;\n\t}\n\n\tif (body.type !== 'BlockStatement') {\n\t\treturn false;\n\t}\n\n\treturn containsNativeTsrxReturn(body);\n}\n\nfunction containsNativeTsrxReturn(node: AnyNode): boolean {\n\tif (!node || typeof node !== 'object') {\n\t\treturn false;\n\t}\n\n\tif (node.type === 'ReturnStatement' && isNativeTsrxJsxNode(node.argument)) {\n\t\treturn true;\n\t}\n\n\tif (node.type !== 'BlockStatement' && NESTED_BOUNDARY_TYPES.has(node.type)) {\n\t\treturn false;\n\t}\n\n\tfor (const key of Object.keys(node)) {\n\t\tif (key === 'parent' || key === 'loc' || key === 'range') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst value = node[key];\n\t\tif (Array.isArray(value)) {\n\t\t\tfor (const child of value) {\n\t\t\t\tif (child?.type && containsNativeTsrxReturn(child)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (value?.type && containsNativeTsrxReturn(value)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n","import type { Rule } from 'eslint';\nimport type * as AST from '@tsrx/core/types/estree';\nimport { functionReturnsNativeTsrx } from '../utils/tsrx.js';\n\nconst NESTED_BOUNDARY_TYPES = new Set([\n\t'FunctionDeclaration',\n\t'FunctionExpression',\n\t'ArrowFunctionExpression',\n\t'ClassDeclaration',\n\t'ClassExpression',\n\t'MethodDefinition',\n\t'PropertyDefinition',\n]);\n\nconst rule: Rule.RuleModule = {\n\tmeta: {\n\t\ttype: 'problem',\n\t\tdocs: {\n\t\t\tdescription: 'Require template output in @for blocks',\n\t\t\trecommended: true,\n\t\t},\n\t\tmessages: {\n\t\t\trequireJsxInLoop:\n\t\t\t\t'@for blocks in returned TSRX should contain template output. Render an element, fragment, or nested template directive.',\n\t\t},\n\t\tschema: [],\n\t},\n\tcreate(context) {\n\t\tlet insideComponent = 0;\n\t\tlet nonComponentFunctionDepth = 0;\n\t\tconst functionStack: boolean[] = [];\n\n\t\tfunction containsTemplateOutput(node: AST.Node, visited: Set<AST.Node> = new Set()): boolean {\n\t\t\tif (!node) return false;\n\n\t\t\t// Avoid infinite loops from circular references\n\t\t\tif (visited.has(node)) return false;\n\t\t\tvisited.add(node);\n\n\t\t\tif (visited.size > 1 && NESTED_BOUNDARY_TYPES.has(node.type)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tnode.type === ('JSXElement' as string) ||\n\t\t\t\tnode.type === ('JSXFragment' as string) ||\n\t\t\t\tnode.type === ('JSXStyleElement' as string) ||\n\t\t\t\tnode.type === ('JSXIfExpression' as string) ||\n\t\t\t\tnode.type === ('JSXForExpression' as string) ||\n\t\t\t\tnode.type === ('JSXSwitchExpression' as string) ||\n\t\t\t\tnode.type === ('JSXTryExpression' as string)\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (node.type === ('JSXCodeBlock' as string)) {\n\t\t\t\tconst render = (node as any).render;\n\t\t\t\treturn !!render && containsTemplateOutput(render, visited);\n\t\t\t}\n\n\t\t\tconst keys = Object.keys(node);\n\t\t\tfor (const key of keys) {\n\t\t\t\tif (key === 'parent' || key === 'loc' || key === 'range') {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst value = (node as any)[key];\n\t\t\t\tif (value && typeof value === 'object') {\n\t\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\t\tfor (const item of value) {\n\t\t\t\t\t\t\tif (item && typeof item === 'object' && containsTemplateOutput(item, visited)) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (value.type && containsTemplateOutput(value, visited)) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\treturn {\n\t\t\tFunctionDeclaration: enterFunction,\n\t\t\t'FunctionDeclaration:exit': exitFunction,\n\t\t\tFunctionExpression: enterFunction,\n\t\t\t'FunctionExpression:exit': exitFunction,\n\t\t\tArrowFunctionExpression: enterFunction,\n\t\t\t'ArrowFunctionExpression:exit': exitFunction,\n\n\t\t\tJSXForExpression(node: AST.Node) {\n\t\t\t\tif (insideComponent === 0 || nonComponentFunctionDepth > 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst body = (node as any).body;\n\t\t\t\tif (!body || containsTemplateOutput(body)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcontext.report({\n\t\t\t\t\tnode,\n\t\t\t\t\tmessageId: 'requireJsxInLoop',\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\n\t\tfunction enterFunction(node: AST.Node) {\n\t\t\tconst isComponent = functionReturnsNativeTsrx(node);\n\t\t\tfunctionStack.push(isComponent);\n\n\t\t\tif (isComponent) {\n\t\t\t\tinsideComponent++;\n\t\t\t} else if (insideComponent > 0) {\n\t\t\t\tnonComponentFunctionDepth++;\n\t\t\t}\n\t\t}\n\n\t\tfunction exitFunction() {\n\t\t\tconst isComponent = functionStack.pop();\n\n\t\t\tif (isComponent) {\n\t\t\t\tinsideComponent--;\n\t\t\t} else if (insideComponent > 0) {\n\t\t\t\tnonComponentFunctionDepth--;\n\t\t\t}\n\t\t}\n\t},\n};\n\nexport default rule;\n","import type { Rule } from 'eslint';\nimport type * as AST from '@tsrx/core/types/estree';\nimport type { Scope } from 'eslint';\n\nconst rule: Rule.RuleModule = {\n\tmeta: {\n\t\ttype: 'problem',\n\t\tdocs: {\n\t\t\tdescription: 'Ensure variables used in for..of key expression are defined',\n\t\t\trecommended: true,\n\t\t},\n\t\tmessages: {\n\t\t\tundefinedVariable: \"Variable '{{name}}' is not defined.\",\n\t\t},\n\t\tschema: [],\n\t},\n\tcreate(context) {\n\t\tconst checkForOfKey = (node: AST.ForOfStatement | AST.JSXForExpression) => {\n\t\t\tif (!node.key) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst checkIdentifier = (identifier: AST.Identifier) => {\n\t\t\t\tconst scope = context.sourceCode.getScope(node);\n\t\t\t\tconst variable = findVariable(scope, identifier.name);\n\n\t\t\t\tif (!variable) {\n\t\t\t\t\tcontext.report({\n\t\t\t\t\t\tnode: identifier,\n\t\t\t\t\t\tmessageId: 'undefinedVariable',\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tname: identifier.name,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst traverse = (node: AST.Node) => {\n\t\t\t\tif (!node) return;\n\n\t\t\t\tswitch (node.type) {\n\t\t\t\t\tcase 'Identifier':\n\t\t\t\t\t\tcheckIdentifier(node);\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'MemberExpression':\n\t\t\t\t\t\ttraverse(node.object);\n\n\t\t\t\t\t\tif (node.computed) {\n\t\t\t\t\t\t\ttraverse(node.property);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'BinaryExpression':\n\t\t\t\t\tcase 'LogicalExpression':\n\t\t\t\t\t\ttraverse(node.left);\n\t\t\t\t\t\ttraverse(node.right);\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'UnaryExpression':\n\t\t\t\t\t\ttraverse(node.argument);\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'CallExpression':\n\t\t\t\t\t\ttraverse(node.callee);\n\t\t\t\t\t\tnode.arguments.forEach(traverse);\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'ArrayExpression':\n\t\t\t\t\t\t(node.elements as (AST.Expression | AST.SpreadElement)[]).forEach(traverse);\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'ObjectExpression':\n\t\t\t\t\t\tnode.properties.forEach((prop: AST.Property | AST.SpreadElement) => {\n\t\t\t\t\t\t\tif (prop.type === 'Property') {\n\t\t\t\t\t\t\t\tif (prop.computed) {\n\t\t\t\t\t\t\t\t\ttraverse(prop.key);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\ttraverse(prop.value);\n\t\t\t\t\t\t\t} else if (prop.type === 'SpreadElement') {\n\t\t\t\t\t\t\t\ttraverse(prop.argument);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'ConditionalExpression':\n\t\t\t\t\t\ttraverse(node.test);\n\t\t\t\t\t\ttraverse(node.consequent);\n\t\t\t\t\t\ttraverse(node.alternate);\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'TemplateLiteral':\n\t\t\t\t\t\tnode.expressions.forEach(traverse);\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\ttraverse(node.key);\n\t\t};\n\n\t\t// `@for (... ; key X)` loops parse to `JSXForExpression`, while the bare\n\t\t// `for (... ; key X)` form parses to `ForOfStatement`. Both carry the same\n\t\t// `key` shape, so validate either node type.\n\t\treturn {\n\t\t\tForOfStatement: checkForOfKey,\n\t\t\tJSXForExpression: checkForOfKey,\n\t\t};\n\t},\n};\n\nfunction findVariable(scope: Scope.Scope, name: string) {\n\tlet currentScope: Scope.Scope | null = scope;\n\n\twhile (currentScope) {\n\t\tconst variable = currentScope.variables.find((v: { name: string }) => v.name === name);\n\n\t\tif (variable) {\n\t\t\treturn variable;\n\t\t}\n\n\t\t// Also check references for global variables or variables defined in the loop itself (like the loop variable)\n\t\t// The loop variable might not be in the 'variables' list of the surrounding scope yet if we are inside the loop statement\n\t\t// But for 'for-of', the loop variable is in a special scope or the upper scope.\n\t\t// Let's rely on standard scope analysis.\n\n\t\t// Special case: check if the variable is the loop variable itself (left side of for-of)\n\t\t// The scope analysis might handle this, but let's be sure.\n\n\t\tcurrentScope = currentScope.upper;\n\t}\n\n\t// If not found in scopes, it might be a global variable.\n\t// ESLint scope analysis usually includes globals in the global scope.\n\t// However, if we are in a module, we might need to check if it's an implicit global or defined elsewhere.\n\t// For now, let's assume standard scope resolution works.\n\n\treturn null;\n}\n\nexport default rule;\n","import type { Rule } from 'eslint';\nimport type * as AST from '@tsrx/core/types/estree';\n\ntype AnyNode = AST.Node & Record<string, any>;\n\nconst MESSAGE =\n\t\"This function body contains TSRX template output, but it is a normal JavaScript block. Add '@' before the opening brace to use a TSRX statement container.\";\n\nfunction is_template_output_statement(node: AnyNode | null | undefined): boolean {\n\tif (!node) return false;\n\n\tif (\n\t\tnode.type === ('JSXElement' as string) ||\n\t\tnode.type === ('JSXFragment' as string) ||\n\t\tnode.type === ('JSXStyleElement' as string) ||\n\t\tnode.type === ('JSXIfExpression' as string) ||\n\t\tnode.type === ('JSXForExpression' as string) ||\n\t\tnode.type === ('JSXSwitchExpression' as string) ||\n\t\tnode.type === ('JSXTryExpression' as string)\n\t) {\n\t\treturn true;\n\t}\n\n\treturn (\n\t\tnode.type === 'ExpressionStatement' &&\n\t\tis_template_output_statement((node as AnyNode).expression)\n\t);\n}\n\nfunction is_ignored_statement(node: AnyNode | null | undefined): boolean {\n\treturn !node || node.type === 'EmptyStatement';\n}\n\nfunction get_forgotten_output_statement(node: AST.Node): AnyNode | null {\n\tconst body = (node as AnyNode).body;\n\tif (!body || body.type !== 'BlockStatement') {\n\t\treturn null;\n\t}\n\n\tlet target: AnyNode | null = null;\n\tlet target_index = -1;\n\tconst statements = body.body || [];\n\tfor (let index = 0; index < statements.length; index++) {\n\t\tconst statement = statements[index] as AnyNode;\n\t\tif (is_template_output_statement(statement)) {\n\t\t\tif (target_index !== -1) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\ttarget = statement;\n\t\t\ttarget_index = index;\n\t\t}\n\t}\n\n\tif (!target) {\n\t\treturn null;\n\t}\n\n\tfor (const statement of statements.slice(target_index + 1)) {\n\t\tif (!is_ignored_statement(statement as AnyNode)) {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\treturn target;\n}\n\nconst rule: Rule.RuleModule = {\n\tmeta: {\n\t\ttype: 'problem',\n\t\tdocs: {\n\t\t\tdescription: 'Require @{...} for TSRX component bodies with setup and template output.',\n\t\t},\n\t\tfixable: 'code',\n\t\tmessages: {\n\t\t\trequireStatementContainerBody: MESSAGE,\n\t\t},\n\t\tschema: [],\n\t},\n\tcreate(context) {\n\t\tfunction check_function(node: AST.Node) {\n\t\t\tif (!(node as AnyNode).returnType) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst forgotten_output = get_forgotten_output_statement(node);\n\t\t\tif (!forgotten_output) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst body = (node as AnyNode).body;\n\t\t\tcontext.report({\n\t\t\t\tnode: forgotten_output,\n\t\t\t\tmessageId: 'requireStatementContainerBody',\n\t\t\t\tfix(fixer) {\n\t\t\t\t\treturn fixer.insertTextBefore(body, '@');\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\tFunctionDeclaration: check_function,\n\t\t\tFunctionExpression: check_function,\n\t\t\tArrowFunctionExpression: check_function,\n\t\t};\n\t},\n};\n\nexport default rule;\n","import { createRequire } from 'module';\nimport noReturnInComponent from './rules/no-return-in-component.js';\nimport controlFlowJsx from './rules/control-flow-jsx.js';\nimport validForOfKey from './rules/valid-for-of-key.js';\nimport requireStatementContainerBody from './rules/require-statement-container-body.js';\n\nconst plugin = {\n\tmeta: {\n\t\tname: '@tsrx/eslint-plugin',\n\t\tversion: '0.1.3',\n\t},\n\trules: {\n\t\t'no-return-in-component': noReturnInComponent,\n\t\t'control-flow-jsx': controlFlowJsx,\n\t\t'valid-for-of-key': validForOfKey,\n\t\t'require-statement-container-body': requireStatementContainerBody,\n\t},\n\tconfigs: {} as any,\n};\n\n// Try to load optional parsers\nconst require = createRequire(import.meta.url);\n\nlet tsrxParser: any;\nlet tsParser: any;\n\ntry {\n\ttsrxParser = require('@tsrx/eslint-parser');\n} catch {\n\t// @tsrx/eslint-parser is optional\n\ttsrxParser = null;\n}\n\ntry {\n\ttsParser = require('@typescript-eslint/parser');\n} catch {\n\t// @typescript-eslint/parser is optional\n\ttsParser = null;\n}\n\n// Helper to create config objects\nfunction createConfig(name: string, files: string[], parser: any, isTsrx: boolean) {\n\tconst rules: Record<string, string> = {\n\t\t'tsrx/control-flow-jsx': 'error',\n\t\t'tsrx/valid-for-of-key': 'error',\n\t};\n\n\tif (isTsrx) {\n\t\trules['tsrx/require-statement-container-body'] = 'error';\n\t}\n\n\tconst config: any = {\n\t\tname,\n\t\tfiles,\n\t\tplugins: {\n\t\t\ttsrx: plugin,\n\t\t},\n\t\trules,\n\t};\n\n\t// Only add parser if it's available\n\tif (parser) {\n\t\tconfig.languageOptions = {\n\t\t\tparser,\n\t\t\tparserOptions: {\n\t\t\t\tecmaVersion: 'latest',\n\t\t\t\tsourceType: 'module',\n\t\t\t},\n\t\t};\n\t}\n\n\treturn config;\n}\n\n// Recommended configuration (flat config format)\nplugin.configs.recommended = [\n\tcreateConfig('tsrx/recommended-tsrx-files', ['**/*.tsrx'], tsrxParser, true),\n\tcreateConfig('tsrx/recommended-typescript-files', ['**/*.ts', '**/*.tsx'], tsParser, false),\n\t{\n\t\tname: 'tsrx/ignores',\n\t\tignores: ['**/*.d.ts', '**/node_modules/**', '**/dist/**', '**/build/**'],\n\t},\n];\n\n// Strict configuration (flat config format)\nplugin.configs.strict = [\n\tcreateConfig('tsrx/strict-tsrx-files', ['**/*.tsrx'], tsrxParser, true),\n\tcreateConfig('tsrx/strict-typescript-files', ['**/*.ts', '**/*.tsx'], tsParser, false),\n\t{\n\t\tname: 'tsrx/ignores',\n\t\tignores: ['**/*.d.ts', '**/node_modules/**', '**/dist/**', '**/build/**'],\n\t},\n];\n\nexport default plugin;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["rule","NESTED_BOUNDARY_TYPES","functionNode","rule","rule","noReturnInComponent","controlFlowJsx","validForOfKey","requireStatementContainerBody"],"sources":["../src/rules/no-return-in-component.ts","../src/utils/tsrx.ts","../src/rules/control-flow-jsx.ts","../src/rules/valid-for-of-key.ts","../src/rules/require-statement-container-body.ts","../src/index.ts"],"sourcesContent":["import type { Rule } from 'eslint';\n\nconst rule: Rule.RuleModule = {\n\tmeta: {\n\t\ttype: 'problem',\n\t\tdocs: {\n\t\t\tdescription: 'Deprecated: TSRX components are functions that return native TSRX expressions.',\n\t\t\trecommended: false,\n\t\t},\n\t\tdeprecated: true,\n\t\tmessages: {\n\t\t\tnoReturn: 'TSRX components should return native TSRX expressions.',\n\t\t},\n\t\tschema: [],\n\t},\n\tcreate(context) {\n\t\tvoid context;\n\t\treturn {};\n\t},\n};\n\nexport default rule;\n","import type * as AST from '@tsrx/core/types/estree';\n\ntype AnyNode = AST.Node & Record<string, any>;\n\nconst NESTED_BOUNDARY_TYPES = new Set([\n\t'FunctionDeclaration',\n\t'FunctionExpression',\n\t'ArrowFunctionExpression',\n\t'ClassDeclaration',\n\t'ClassExpression',\n\t'MethodDefinition',\n\t'PropertyDefinition',\n\t'StaticBlock',\n]);\n\nexport function isNativeTsrxJsxNode(node: AST.Node | null | undefined): boolean {\n\tif (!node) return false;\n\n\tif (\n\t\tnode.type === ('JSXCodeBlock' as string) ||\n\t\tnode.type === ('JSXIfExpression' as string) ||\n\t\tnode.type === ('JSXForExpression' as string) ||\n\t\tnode.type === ('JSXSwitchExpression' as string) ||\n\t\tnode.type === ('JSXTryExpression' as string)\n\t) {\n\t\treturn true;\n\t}\n\n\treturn (\n\t\t(node.type === ('JSXElement' as string) ||\n\t\t\tnode.type === ('JSXFragment' as string) ||\n\t\t\tnode.type === ('JSXStyleElement' as string)) &&\n\t\t!!(node as AnyNode).metadata?.native_tsrx\n\t);\n}\n\nexport function functionReturnsNativeTsrx(node: AST.Node): boolean {\n\tconst functionNode = node as AnyNode;\n\tconst body = functionNode.body as AnyNode | undefined;\n\n\tif (!body) {\n\t\treturn false;\n\t}\n\n\tif (isNativeTsrxJsxNode(body)) {\n\t\treturn true;\n\t}\n\n\tif (body.type !== 'BlockStatement') {\n\t\treturn false;\n\t}\n\n\treturn containsNativeTsrxReturn(body);\n}\n\nfunction containsNativeTsrxReturn(node: AnyNode): boolean {\n\tif (!node || typeof node !== 'object') {\n\t\treturn false;\n\t}\n\n\tif (node.type === 'ReturnStatement' && isNativeTsrxJsxNode(node.argument)) {\n\t\treturn true;\n\t}\n\n\tif (node.type !== 'BlockStatement' && NESTED_BOUNDARY_TYPES.has(node.type)) {\n\t\treturn false;\n\t}\n\n\tfor (const key of Object.keys(node)) {\n\t\tif (key === 'parent' || key === 'loc' || key === 'range') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst value = node[key];\n\t\tif (Array.isArray(value)) {\n\t\t\tfor (const child of value) {\n\t\t\t\tif (child?.type && containsNativeTsrxReturn(child)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (value?.type && containsNativeTsrxReturn(value)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n","import type { Rule } from 'eslint';\nimport type * as AST from '@tsrx/core/types/estree';\nimport { functionReturnsNativeTsrx } from '../utils/tsrx.js';\n\nconst NESTED_BOUNDARY_TYPES = new Set([\n\t'FunctionDeclaration',\n\t'FunctionExpression',\n\t'ArrowFunctionExpression',\n\t'ClassDeclaration',\n\t'ClassExpression',\n\t'MethodDefinition',\n\t'PropertyDefinition',\n]);\n\nconst rule: Rule.RuleModule = {\n\tmeta: {\n\t\ttype: 'problem',\n\t\tdocs: {\n\t\t\tdescription: 'Require template output in @for blocks',\n\t\t\trecommended: true,\n\t\t},\n\t\tmessages: {\n\t\t\trequireJsxInLoop:\n\t\t\t\t'@for blocks in returned TSRX should contain template output. Render an element, fragment, or nested template directive.',\n\t\t},\n\t\tschema: [],\n\t},\n\tcreate(context) {\n\t\tlet insideComponent = 0;\n\t\tlet nonComponentFunctionDepth = 0;\n\t\tconst functionStack: boolean[] = [];\n\n\t\tfunction containsTemplateOutput(node: AST.Node, visited: Set<AST.Node> = new Set()): boolean {\n\t\t\tif (!node) return false;\n\n\t\t\t// Avoid infinite loops from circular references\n\t\t\tif (visited.has(node)) return false;\n\t\t\tvisited.add(node);\n\n\t\t\tif (visited.size > 1 && NESTED_BOUNDARY_TYPES.has(node.type)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tnode.type === ('JSXElement' as string) ||\n\t\t\t\tnode.type === ('JSXFragment' as string) ||\n\t\t\t\tnode.type === ('JSXStyleElement' as string) ||\n\t\t\t\tnode.type === ('JSXIfExpression' as string) ||\n\t\t\t\tnode.type === ('JSXForExpression' as string) ||\n\t\t\t\tnode.type === ('JSXSwitchExpression' as string) ||\n\t\t\t\tnode.type === ('JSXTryExpression' as string)\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (node.type === ('JSXCodeBlock' as string)) {\n\t\t\t\tconst render = (node as any).render;\n\t\t\t\treturn !!render && containsTemplateOutput(render, visited);\n\t\t\t}\n\n\t\t\tconst keys = Object.keys(node);\n\t\t\tfor (const key of keys) {\n\t\t\t\tif (key === 'parent' || key === 'loc' || key === 'range') {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst value = (node as any)[key];\n\t\t\t\tif (value && typeof value === 'object') {\n\t\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\t\tfor (const item of value) {\n\t\t\t\t\t\t\tif (item && typeof item === 'object' && containsTemplateOutput(item, visited)) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (value.type && containsTemplateOutput(value, visited)) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\treturn {\n\t\t\tFunctionDeclaration: enterFunction,\n\t\t\t'FunctionDeclaration:exit': exitFunction,\n\t\t\tFunctionExpression: enterFunction,\n\t\t\t'FunctionExpression:exit': exitFunction,\n\t\t\tArrowFunctionExpression: enterFunction,\n\t\t\t'ArrowFunctionExpression:exit': exitFunction,\n\n\t\t\tJSXForExpression(node: AST.Node) {\n\t\t\t\tif (insideComponent === 0 || nonComponentFunctionDepth > 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst body = (node as any).body;\n\t\t\t\tif (!body || containsTemplateOutput(body)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcontext.report({\n\t\t\t\t\tnode,\n\t\t\t\t\tmessageId: 'requireJsxInLoop',\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\n\t\tfunction enterFunction(node: AST.Node) {\n\t\t\tconst isComponent = functionReturnsNativeTsrx(node);\n\t\t\tfunctionStack.push(isComponent);\n\n\t\t\tif (isComponent) {\n\t\t\t\tinsideComponent++;\n\t\t\t} else if (insideComponent > 0) {\n\t\t\t\tnonComponentFunctionDepth++;\n\t\t\t}\n\t\t}\n\n\t\tfunction exitFunction() {\n\t\t\tconst isComponent = functionStack.pop();\n\n\t\t\tif (isComponent) {\n\t\t\t\tinsideComponent--;\n\t\t\t} else if (insideComponent > 0) {\n\t\t\t\tnonComponentFunctionDepth--;\n\t\t\t}\n\t\t}\n\t},\n};\n\nexport default rule;\n","import type { Rule } from 'eslint';\nimport type * as AST from '@tsrx/core/types/estree';\nimport type { Scope } from 'eslint';\n\nconst rule: Rule.RuleModule = {\n\tmeta: {\n\t\ttype: 'problem',\n\t\tdocs: {\n\t\t\tdescription: 'Ensure variables used in for..of key expression are defined',\n\t\t\trecommended: true,\n\t\t},\n\t\tmessages: {\n\t\t\tundefinedVariable: \"Variable '{{name}}' is not defined.\",\n\t\t},\n\t\tschema: [],\n\t},\n\tcreate(context) {\n\t\tconst checkForOfKey = (node: AST.ForOfStatement | AST.JSXForExpression) => {\n\t\t\tif (!node.key) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst checkIdentifier = (identifier: AST.Identifier) => {\n\t\t\t\tconst scope = context.sourceCode.getScope(node);\n\t\t\t\tconst variable = findVariable(scope, identifier.name);\n\n\t\t\t\tif (!variable) {\n\t\t\t\t\tcontext.report({\n\t\t\t\t\t\tnode: identifier,\n\t\t\t\t\t\tmessageId: 'undefinedVariable',\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tname: identifier.name,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst traverse = (node: AST.Node) => {\n\t\t\t\tif (!node) return;\n\n\t\t\t\tswitch (node.type) {\n\t\t\t\t\tcase 'Identifier':\n\t\t\t\t\t\tcheckIdentifier(node);\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'MemberExpression':\n\t\t\t\t\t\ttraverse(node.object);\n\n\t\t\t\t\t\tif (node.computed) {\n\t\t\t\t\t\t\ttraverse(node.property);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'BinaryExpression':\n\t\t\t\t\tcase 'LogicalExpression':\n\t\t\t\t\t\ttraverse(node.left);\n\t\t\t\t\t\ttraverse(node.right);\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'UnaryExpression':\n\t\t\t\t\t\ttraverse(node.argument);\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'CallExpression':\n\t\t\t\t\t\ttraverse(node.callee);\n\t\t\t\t\t\tnode.arguments.forEach(traverse);\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'ArrayExpression':\n\t\t\t\t\t\t(node.elements as (AST.Expression | AST.SpreadElement)[]).forEach(traverse);\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'ObjectExpression':\n\t\t\t\t\t\tnode.properties.forEach((prop: AST.Property | AST.SpreadElement) => {\n\t\t\t\t\t\t\tif (prop.type === 'Property') {\n\t\t\t\t\t\t\t\tif (prop.computed) {\n\t\t\t\t\t\t\t\t\ttraverse(prop.key);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\ttraverse(prop.value);\n\t\t\t\t\t\t\t} else if (prop.type === 'SpreadElement') {\n\t\t\t\t\t\t\t\ttraverse(prop.argument);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'ConditionalExpression':\n\t\t\t\t\t\ttraverse(node.test);\n\t\t\t\t\t\ttraverse(node.consequent);\n\t\t\t\t\t\ttraverse(node.alternate);\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'TemplateLiteral':\n\t\t\t\t\t\tnode.expressions.forEach(traverse);\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\ttraverse(node.key);\n\t\t};\n\n\t\t// `@for (... ; key X)` loops parse to `JSXForExpression`, while the bare\n\t\t// `for (... ; key X)` form parses to `ForOfStatement`. Both carry the same\n\t\t// `key` shape, so validate either node type.\n\t\treturn {\n\t\t\tForOfStatement: checkForOfKey,\n\t\t\tJSXForExpression: checkForOfKey,\n\t\t};\n\t},\n};\n\nfunction findVariable(scope: Scope.Scope, name: string) {\n\tlet currentScope: Scope.Scope | null = scope;\n\n\twhile (currentScope) {\n\t\tconst variable = currentScope.variables.find((v: { name: string }) => v.name === name);\n\n\t\tif (variable) {\n\t\t\treturn variable;\n\t\t}\n\n\t\t// Also check references for global variables or variables defined in the loop itself (like the loop variable)\n\t\t// The loop variable might not be in the 'variables' list of the surrounding scope yet if we are inside the loop statement\n\t\t// But for 'for-of', the loop variable is in a special scope or the upper scope.\n\t\t// Let's rely on standard scope analysis.\n\n\t\t// Special case: check if the variable is the loop variable itself (left side of for-of)\n\t\t// The scope analysis might handle this, but let's be sure.\n\n\t\tcurrentScope = currentScope.upper;\n\t}\n\n\t// If not found in scopes, it might be a global variable.\n\t// ESLint scope analysis usually includes globals in the global scope.\n\t// However, if we are in a module, we might need to check if it's an implicit global or defined elsewhere.\n\t// For now, let's assume standard scope resolution works.\n\n\treturn null;\n}\n\nexport default rule;\n","import type { Rule } from 'eslint';\nimport type * as AST from '@tsrx/core/types/estree';\n\ntype AnyNode = AST.Node & Record<string, any>;\n\nconst MESSAGE =\n\t\"This function body contains TSRX template output, but it is a normal JavaScript block. Add '@' before the opening brace to use a TSRX statement container.\";\n\nfunction is_template_output_statement(node: AnyNode | null | undefined): boolean {\n\tif (!node) return false;\n\n\tif (\n\t\tnode.type === ('JSXElement' as string) ||\n\t\tnode.type === ('JSXFragment' as string) ||\n\t\tnode.type === ('JSXStyleElement' as string) ||\n\t\tnode.type === ('JSXIfExpression' as string) ||\n\t\tnode.type === ('JSXForExpression' as string) ||\n\t\tnode.type === ('JSXSwitchExpression' as string) ||\n\t\tnode.type === ('JSXTryExpression' as string)\n\t) {\n\t\treturn true;\n\t}\n\n\treturn (\n\t\tnode.type === 'ExpressionStatement' &&\n\t\tis_template_output_statement((node as AnyNode).expression)\n\t);\n}\n\nfunction is_ignored_statement(node: AnyNode | null | undefined): boolean {\n\treturn !node || node.type === 'EmptyStatement';\n}\n\nfunction get_forgotten_output_statement(node: AST.Node): AnyNode | null {\n\tconst body = (node as AnyNode).body;\n\tif (!body || body.type !== 'BlockStatement') {\n\t\treturn null;\n\t}\n\n\tlet target: AnyNode | null = null;\n\tlet target_index = -1;\n\tconst statements = body.body || [];\n\tfor (let index = 0; index < statements.length; index++) {\n\t\tconst statement = statements[index] as AnyNode;\n\t\tif (is_template_output_statement(statement)) {\n\t\t\tif (target_index !== -1) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\ttarget = statement;\n\t\t\ttarget_index = index;\n\t\t}\n\t}\n\n\tif (!target) {\n\t\treturn null;\n\t}\n\n\tfor (const statement of statements.slice(target_index + 1)) {\n\t\tif (!is_ignored_statement(statement as AnyNode)) {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\treturn target;\n}\n\nconst rule: Rule.RuleModule = {\n\tmeta: {\n\t\ttype: 'problem',\n\t\tdocs: {\n\t\t\tdescription: 'Require @{...} for TSRX component bodies with setup and template output.',\n\t\t},\n\t\tfixable: 'code',\n\t\tmessages: {\n\t\t\trequireStatementContainerBody: MESSAGE,\n\t\t},\n\t\tschema: [],\n\t},\n\tcreate(context) {\n\t\tfunction check_function(node: AST.Node) {\n\t\t\tif (!(node as AnyNode).returnType) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst forgotten_output = get_forgotten_output_statement(node);\n\t\t\tif (!forgotten_output) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst body = (node as AnyNode).body;\n\t\t\tcontext.report({\n\t\t\t\tnode: forgotten_output,\n\t\t\t\tmessageId: 'requireStatementContainerBody',\n\t\t\t\tfix(fixer) {\n\t\t\t\t\treturn fixer.insertTextBefore(body, '@');\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\tFunctionDeclaration: check_function,\n\t\t\tFunctionExpression: check_function,\n\t\t\tArrowFunctionExpression: check_function,\n\t\t};\n\t},\n};\n\nexport default rule;\n","import { createRequire } from 'module';\nimport noReturnInComponent from './rules/no-return-in-component.js';\nimport controlFlowJsx from './rules/control-flow-jsx.js';\nimport validForOfKey from './rules/valid-for-of-key.js';\nimport requireStatementContainerBody from './rules/require-statement-container-body.js';\n\nconst plugin = {\n\tmeta: {\n\t\tname: '@tsrx/eslint-plugin',\n\t\tversion: '0.1.3',\n\t},\n\trules: {\n\t\t'no-return-in-component': noReturnInComponent,\n\t\t'control-flow-jsx': controlFlowJsx,\n\t\t'valid-for-of-key': validForOfKey,\n\t\t'require-statement-container-body': requireStatementContainerBody,\n\t},\n\tconfigs: {} as any,\n};\n\n// Try to load optional parsers\nconst require = createRequire(import.meta.url);\n\nlet tsrxParser: any;\nlet tsParser: any;\n\ntry {\n\ttsrxParser = require('@tsrx/eslint-parser');\n} catch {\n\t// @tsrx/eslint-parser is optional\n\ttsrxParser = null;\n}\n\ntry {\n\ttsParser = require('@typescript-eslint/parser');\n} catch {\n\t// @typescript-eslint/parser is optional\n\ttsParser = null;\n}\n\n// Helper to create config objects\nfunction createConfig(name: string, files: string[], parser: any, isTsrx: boolean) {\n\tconst rules: Record<string, string> = {\n\t\t'tsrx/control-flow-jsx': 'error',\n\t\t'tsrx/valid-for-of-key': 'error',\n\t};\n\n\tif (isTsrx) {\n\t\trules['tsrx/require-statement-container-body'] = 'error';\n\t}\n\n\tconst config: any = {\n\t\tname,\n\t\tfiles,\n\t\tplugins: {\n\t\t\ttsrx: plugin,\n\t\t},\n\t\trules,\n\t};\n\n\t// Only add parser if it's available\n\tif (parser) {\n\t\tconfig.languageOptions = {\n\t\t\tparser,\n\t\t\tparserOptions: {\n\t\t\t\tecmaVersion: 'latest',\n\t\t\t\tsourceType: 'module',\n\t\t\t},\n\t\t};\n\t}\n\n\treturn config;\n}\n\n// Recommended configuration (flat config format)\nplugin.configs.recommended = [\n\tcreateConfig('tsrx/recommended-tsrx-files', ['**/*.tsrx'], tsrxParser, true),\n\tcreateConfig('tsrx/recommended-typescript-files', ['**/*.ts', '**/*.tsx'], tsParser, false),\n\t{\n\t\tname: 'tsrx/ignores',\n\t\tignores: ['**/*.d.ts', '**/node_modules/**', '**/dist/**', '**/build/**'],\n\t},\n];\n\n// Strict configuration (flat config format)\nplugin.configs.strict = [\n\tcreateConfig('tsrx/strict-tsrx-files', ['**/*.tsrx'], tsrxParser, true),\n\tcreateConfig('tsrx/strict-typescript-files', ['**/*.ts', '**/*.tsx'], tsParser, false),\n\t{\n\t\tname: 'tsrx/ignores',\n\t\tignores: ['**/*.d.ts', '**/node_modules/**', '**/dist/**', '**/build/**'],\n\t},\n];\n\nexport default plugin;\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tsrx/eslint-plugin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "ESLint plugin for TSRX",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/index.ts",
|
|
@@ -33,18 +33,18 @@
|
|
|
33
33
|
"peerDependencies": {
|
|
34
34
|
"eslint": ">=9.0.0",
|
|
35
35
|
"@typescript-eslint/parser": "^8.56.1",
|
|
36
|
-
"@tsrx/eslint-parser": "0.
|
|
36
|
+
"@tsrx/eslint-parser": "0.6.0"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"@types/eslint": "^9.6.1",
|
|
40
40
|
"@types/node": "^24.3.0",
|
|
41
41
|
"@typescript-eslint/parser": "^8.56.1",
|
|
42
42
|
"eslint": "^10.3.0",
|
|
43
|
-
"tsdown": "^0.
|
|
43
|
+
"tsdown": "^0.23.0",
|
|
44
44
|
"typescript": "^5.9.3",
|
|
45
45
|
"vitest": "^4.1.6",
|
|
46
|
-
"@tsrx/eslint-parser": "0.
|
|
47
|
-
"@tsrx/core": "0.5.
|
|
46
|
+
"@tsrx/eslint-parser": "0.6.0",
|
|
47
|
+
"@tsrx/core": "0.5.3"
|
|
48
48
|
},
|
|
49
49
|
"engines": {
|
|
50
50
|
"node": ">=22.0.0"
|