@conorroberts/utils 0.0.71 → 0.0.73

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -49,6 +49,8 @@
49
49
  "conorroberts/jsx-component-pascal-case": "error",
50
50
  "conorroberts/pretty-props": "error",
51
51
  "conorroberts/no-array-type": "error",
52
+ "conorroberts/no-iife": "error",
53
+ "typescript/no-confusing-void-expression": "error",
52
54
  "react/self-closing-comp": [
53
55
  "deny",
54
56
  {
@@ -71,4 +73,4 @@
71
73
  }
72
74
  }
73
75
  ]
74
- }
76
+ }
@@ -85,7 +85,7 @@ const expressionContainsJsx$2 = (root) => {
85
85
  }
86
86
  return false;
87
87
  };
88
- const rule$11 = defineRule({
88
+ const rule$12 = defineRule({
89
89
  meta: {
90
90
  type: "problem",
91
91
  docs: {
@@ -148,11 +148,11 @@ const rule$11 = defineRule({
148
148
  };
149
149
  }
150
150
  });
151
- const jsxComponentPascalCaseRule = rule$11;
151
+ const jsxComponentPascalCaseRule = rule$12;
152
152
 
153
153
  //#endregion
154
154
  //#region src/oxlint-plugins/no-array-type.js
155
- const rule$10 = defineRule({
155
+ const rule$11 = defineRule({
156
156
  meta: {
157
157
  type: "problem",
158
158
  docs: {
@@ -171,7 +171,7 @@ const rule$10 = defineRule({
171
171
  } };
172
172
  }
173
173
  });
174
- const noArrayTypeRule = rule$10;
174
+ const noArrayTypeRule = rule$11;
175
175
 
176
176
  //#endregion
177
177
  //#region src/oxlint-plugins/no-component-date-instantiation.js
@@ -246,7 +246,7 @@ const isDateInstantiation = (node) => {
246
246
  if (node.callee.type === "Identifier" && node.callee.name === "Date") return true;
247
247
  return false;
248
248
  };
249
- const rule$9 = defineRule({
249
+ const rule$10 = defineRule({
250
250
  meta: {
251
251
  type: "problem",
252
252
  docs: {
@@ -323,7 +323,7 @@ const rule$9 = defineRule({
323
323
  };
324
324
  }
325
325
  });
326
- const noComponentDateInstantiationRule = rule$9;
326
+ const noComponentDateInstantiationRule = rule$10;
327
327
 
328
328
  //#endregion
329
329
  //#region src/oxlint-plugins/no-inline-components.js
@@ -540,7 +540,7 @@ const createNestedFunctionMessage = (childName, parentName) => `JSX-returning ${
540
540
  * @param {string} name
541
541
  */
542
542
  const createIIFEMessage = (name) => `JSX-returning ${describeNested(name)} should not be declared as an immediately invoked function expression (IIFE). Extract it to a named function at module scope.`;
543
- const rule$8 = defineRule({
543
+ const rule$9 = defineRule({
544
544
  meta: {
545
545
  type: "problem",
546
546
  docs: {
@@ -688,7 +688,7 @@ const rule$8 = defineRule({
688
688
  };
689
689
  }
690
690
  });
691
- const noInlineComponentsRule = rule$8;
691
+ const noInlineComponentsRule = rule$9;
692
692
 
693
693
  //#endregion
694
694
  //#region src/oxlint-plugins/no-component-pure-functions.js
@@ -932,7 +932,7 @@ const isPureFunction = (node) => {
932
932
  if (accessesEnclosingScope(node, collectLocalNames(node))) return false;
933
933
  return true;
934
934
  };
935
- const rule$7 = defineRule({
935
+ const rule$8 = defineRule({
936
936
  meta: {
937
937
  type: "suggestion",
938
938
  docs: {
@@ -964,12 +964,12 @@ const rule$7 = defineRule({
964
964
  } };
965
965
  }
966
966
  });
967
- const noComponentPureFunctionsRule = rule$7;
967
+ const noComponentPureFunctionsRule = rule$8;
968
968
 
969
969
  //#endregion
970
970
  //#region src/oxlint-plugins/no-delete.js
971
971
  /** @typedef {import("oxlint").ESTree.Node} ESTNode */
972
- const rule$6 = defineRule({
972
+ const rule$7 = defineRule({
973
973
  meta: {
974
974
  type: "problem",
975
975
  docs: {
@@ -988,7 +988,7 @@ const rule$6 = defineRule({
988
988
  } };
989
989
  }
990
990
  });
991
- const noDeleteRule = rule$6;
991
+ const noDeleteRule = rule$7;
992
992
 
993
993
  //#endregion
994
994
  //#region src/oxlint-plugins/no-emoji.js
@@ -1018,7 +1018,7 @@ const getEmojiPreview = (text) => {
1018
1018
  const preview = uniqueEmojis.slice(0, 3).join(" ");
1019
1019
  return uniqueEmojis.length > 3 ? `${preview} ...` : preview;
1020
1020
  };
1021
- const rule$5 = defineRule({
1021
+ const rule$6 = defineRule({
1022
1022
  meta: {
1023
1023
  type: "problem",
1024
1024
  docs: {
@@ -1069,12 +1069,12 @@ const rule$5 = defineRule({
1069
1069
  };
1070
1070
  }
1071
1071
  });
1072
- const noEmojiRule = rule$5;
1072
+ const noEmojiRule = rule$6;
1073
1073
 
1074
1074
  //#endregion
1075
1075
  //#region src/oxlint-plugins/no-finally.js
1076
1076
  /** @typedef {import("oxlint").ESTree.Node} ESTNode */
1077
- const rule$4 = defineRule({
1077
+ const rule$5 = defineRule({
1078
1078
  meta: {
1079
1079
  type: "problem",
1080
1080
  docs: {
@@ -1093,7 +1093,32 @@ const rule$4 = defineRule({
1093
1093
  } };
1094
1094
  }
1095
1095
  });
1096
- const noFinallyRule = rule$4;
1096
+ const noFinallyRule = rule$5;
1097
+
1098
+ //#endregion
1099
+ //#region src/oxlint-plugins/no-iife.js
1100
+ /** @typedef {import("oxlint").ESTree.Node} ESTNode */
1101
+ const rule$4 = defineRule({
1102
+ meta: {
1103
+ type: "problem",
1104
+ docs: {
1105
+ description: "Disallow Immediately Invoked Function Expressions (IIFE)",
1106
+ recommended: true
1107
+ },
1108
+ schema: []
1109
+ },
1110
+ createOnce(context) {
1111
+ return { CallExpression(node) {
1112
+ if (node.type !== "CallExpression") return;
1113
+ const { callee } = node;
1114
+ if (callee.type === "FunctionExpression" || callee.type === "ArrowFunctionExpression") context.report({
1115
+ node,
1116
+ message: "Immediately Invoked Function Expressions (IIFE) are disallowed. Use a regular function declaration or block scope instead."
1117
+ });
1118
+ } };
1119
+ }
1120
+ });
1121
+ const noIifeRule = rule$4;
1097
1122
 
1098
1123
  //#endregion
1099
1124
  //#region src/oxlint-plugins/no-react-namespace.js
@@ -1461,6 +1486,7 @@ const plugin = definePlugin({
1461
1486
  "no-delete": noDeleteRule,
1462
1487
  "no-emoji": noEmojiRule,
1463
1488
  "no-finally": noFinallyRule,
1489
+ "no-iife": noIifeRule,
1464
1490
  "no-inline-components": noInlineComponentsRule,
1465
1491
  "no-react-namespace": noReactNamespaceRule,
1466
1492
  "no-switch": noSwitchRule,
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["JSX_NODE_TYPES","FUNCTION_NODE_TYPES","isNode","isFunctionLike","getFunctionName","expressionContainsJsx","rule","rule","FUNCTION_NODE_TYPES","isNode","isFunctionLike","isComponentName","getFunctionName","rule","JSX_NODE_TYPES","FUNCTION_NODE_TYPES","isNode","isFunctionLike","getEnclosingFunction","expressionContainsJsx","rule","FUNCTION_NODE_TYPES","isNode","isFunctionLike","rule","getEnclosingFunction","rule","rule","rule","rule","rule","rule"],"sources":["../../src/oxlint-plugins/jsx-component-pascal-case.js","../../src/oxlint-plugins/no-array-type.js","../../src/oxlint-plugins/no-component-date-instantiation.js","../../src/oxlint-plugins/no-inline-components.js","../../src/oxlint-plugins/no-component-pure-functions.js","../../src/oxlint-plugins/no-delete.js","../../src/oxlint-plugins/no-emoji.js","../../src/oxlint-plugins/no-finally.js","../../src/oxlint-plugins/no-react-namespace.js","../../src/oxlint-plugins/no-switch-plugin.js","../../src/oxlint-plugins/no-top-level-let.js","../../src/oxlint-plugins/no-type-cast.js","../../src/oxlint-plugins/pretty-props.js","../../src/oxlint-plugins/index.js"],"sourcesContent":["import { defineRule } from \"oxlint\";\n\n/**\n * @typedef {import(\"oxlint\").Context} RuleContext\n * @typedef {import(\"oxlint\").ESTree.Node} ESTNode\n * @typedef {import(\"oxlint\").ESTree.Expression} ESTExpression\n * @typedef {import(\"oxlint\").ESTree.ReturnStatement} ReturnStatementNode\n * @typedef {import(\"oxlint\").ESTree.Function | import(\"oxlint\").ESTree.ArrowFunctionExpression} FunctionLikeNode\n */\n\n/**\n * @typedef {object} FunctionContext\n * @property {FunctionLikeNode} node\n * @property {string} name\n * @property {boolean} returnsJsx\n */\n\nconst JSX_NODE_TYPES = new Set([\"JSXElement\", \"JSXFragment\"]);\nconst FUNCTION_NODE_TYPES = new Set([\"FunctionDeclaration\", \"FunctionExpression\", \"ArrowFunctionExpression\"]);\n\n/**\n * @param {unknown} node\n * @returns {node is ESTNode & { type: string }}\n */\nconst isNode = (node) => Boolean(node && typeof node === \"object\" && \"type\" in node);\n\n/**\n * @param {unknown} node\n * @returns {node is FunctionLikeNode}\n */\nconst isFunctionLike = (node) => isNode(node) && FUNCTION_NODE_TYPES.has(node.type);\n\n/**\n * @param {unknown} name\n * @returns {name is string}\n */\nconst isPascalCase = (name) => typeof name === \"string\" && /^[A-Z]/.test(name);\n\n/**\n * Check if a name is a valid higher-order component name (starts with \"with\")\n * @param {unknown} name\n * @returns {name is string}\n */\nconst isHOCName = (name) => typeof name === \"string\" && /^with[A-Z]/.test(name);\n\n/**\n * @param {FunctionLikeNode} node\n */\nconst getFunctionName = (node) => {\n if (node.type === \"FunctionDeclaration\" && node.id && node.id.type === \"Identifier\") {\n return node.id.name;\n }\n\n if ((node.type === \"FunctionExpression\" || node.type === \"ArrowFunctionExpression\") && node.id) {\n if (node.id.type === \"Identifier\") return node.id.name;\n }\n\n const parent = node.parent;\n if (!parent || !isNode(parent)) return \"\";\n\n if (parent.type === \"VariableDeclarator\") {\n return parent.id && parent.id.type === \"Identifier\" ? parent.id.name : \"\";\n }\n\n if (parent.type === \"AssignmentExpression\") {\n return parent.left && parent.left.type === \"Identifier\" ? parent.left.name : \"\";\n }\n\n // Don't enforce naming for functions used as object property values or JSX props\n // These are often callbacks or configuration options, not standalone components\n if (parent.type === \"Property\" || parent.type === \"MethodDefinition\") {\n return \"\";\n }\n\n // Handle functions passed as arguments to calls (e.g., useCallback, useMemo)\n if (parent.type === \"CallExpression\") {\n const callParent = parent.parent;\n if (callParent && isNode(callParent)) {\n if (callParent.type === \"VariableDeclarator\") {\n return callParent.id && callParent.id.type === \"Identifier\" ? callParent.id.name : \"\";\n }\n if (callParent.type === \"AssignmentExpression\") {\n return callParent.left && callParent.left.type === \"Identifier\" ? callParent.left.name : \"\";\n }\n }\n }\n\n return \"\";\n};\n\n/**\n * @param {ESTExpression | null | undefined} root\n */\nconst expressionContainsJsx = (root) => {\n if (!root || !isNode(root)) return false;\n\n const stack = [root];\n\n while (stack.length > 0) {\n const current = stack.pop();\n if (!current || !isNode(current)) continue;\n\n if (JSX_NODE_TYPES.has(current.type)) {\n return true;\n }\n\n if (FUNCTION_NODE_TYPES.has(current.type) && current !== root) {\n continue;\n }\n\n for (const key of Object.keys(current)) {\n if (key === \"parent\") continue;\n\n const value = current[key];\n if (!value) continue;\n\n if (Array.isArray(value)) {\n for (const element of value) {\n if (isNode(element)) {\n stack.push(element);\n }\n }\n } else if (isNode(value)) {\n stack.push(value);\n }\n }\n }\n\n return false;\n};\n\nconst rule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description: \"Enforce PascalCase naming for functions that return JSX elements (components).\",\n recommended: false,\n },\n schema: [],\n },\n\n createOnce(context) {\n /** @type {FunctionContext[]} */\n const functionStack = [];\n\n const currentFunction = () => functionStack[functionStack.length - 1] ?? null;\n\n /**\n * @param {FunctionLikeNode} node\n */\n const enterFunction = (node) => {\n const name = getFunctionName(node);\n\n /** @type {FunctionContext} */\n const fnCtx = {\n node,\n name,\n returnsJsx: false,\n };\n\n functionStack.push(fnCtx);\n\n if (node.type === \"ArrowFunctionExpression\" && node.body && node.body.type !== \"BlockStatement\") {\n if (expressionContainsJsx(node.body)) {\n fnCtx.returnsJsx = true;\n }\n }\n };\n\n const exitFunction = () => {\n const fnCtx = functionStack.pop();\n if (!fnCtx) return;\n\n // Allow PascalCase or HOC naming (withXxx)\n if (fnCtx.returnsJsx && fnCtx.name && !isPascalCase(fnCtx.name) && !isHOCName(fnCtx.name)) {\n context.report({\n node: fnCtx.node,\n message: `Function '${fnCtx.name}' returns JSX and should use PascalCase naming (e.g., '${fnCtx.name.charAt(0).toUpperCase()}${fnCtx.name.slice(1)}').`,\n });\n }\n };\n\n /** @param {ReturnStatementNode} node */\n const handleReturnStatement = (node) => {\n const fnCtx = currentFunction();\n if (!fnCtx) return;\n\n const argument = node.argument;\n if (!argument || isFunctionLike(argument)) return;\n\n if (expressionContainsJsx(argument)) {\n fnCtx.returnsJsx = true;\n }\n };\n\n return /** @type {import(\"oxlint\").VisitorWithHooks} */ ({\n FunctionDeclaration(node) {\n if (isFunctionLike(node)) enterFunction(node);\n },\n \"FunctionDeclaration:exit\": exitFunction,\n FunctionExpression(node) {\n if (isFunctionLike(node)) enterFunction(node);\n },\n \"FunctionExpression:exit\": exitFunction,\n ArrowFunctionExpression(node) {\n if (isFunctionLike(node)) enterFunction(node);\n },\n \"ArrowFunctionExpression:exit\": exitFunction,\n ReturnStatement(node) {\n if (node.type === \"ReturnStatement\") handleReturnStatement(node);\n },\n });\n },\n});\n\nexport const jsxComponentPascalCaseRule = rule;\n\n","import { defineRule } from \"oxlint\";\n\nconst rule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow Array<T> type syntax in favor of T[] syntax\",\n recommended: true,\n },\n schema: [],\n },\n createOnce(context) {\n return {\n TSTypeReference(node) {\n if (node.type !== \"TSTypeReference\") return;\n\n // Check if this is an Array type reference\n if (node.typeName?.type === \"Identifier\" && node.typeName.name === \"Array\" && node.typeParameters) {\n context.report({\n node,\n message: \"Use T[] syntax instead of Array<T>\",\n });\n }\n },\n };\n },\n});\n\nexport const noArrayTypeRule = rule;\n","import { defineRule } from \"oxlint\";\n\n/**\n * @typedef {import(\"oxlint\").Context} RuleContext\n * @typedef {import(\"oxlint\").ESTree.Node} ESTNode\n * @typedef {import(\"oxlint\").ESTree.NewExpression} NewExpressionNode\n * @typedef {import(\"oxlint\").ESTree.ReturnStatement} ReturnStatementNode\n * @typedef {import(\"oxlint\").ESTree.Function | import(\"oxlint\").ESTree.ArrowFunctionExpression} FunctionLikeNode\n */\n\n/**\n * @typedef {object} FunctionContext\n * @property {FunctionLikeNode} node\n * @property {FunctionContext | null} parent\n * @property {string} name\n * @property {boolean} returnsJsx\n * @property {NewExpressionNode[]} dateInstantiations\n */\n\nconst FUNCTION_NODE_TYPES = new Set([\"FunctionDeclaration\", \"FunctionExpression\", \"ArrowFunctionExpression\"]);\n\n/**\n * @param {unknown} node\n * @returns {node is ESTNode & { type: string }}\n */\nconst isNode = (node) => Boolean(node && typeof node === \"object\" && \"type\" in node);\n\n/**\n * @param {unknown} node\n * @returns {node is FunctionLikeNode}\n */\nconst isFunctionLike = (node) => isNode(node) && FUNCTION_NODE_TYPES.has(node.type);\n\n/**\n * Check if a function name follows React component naming convention (PascalCase)\n * @param {unknown} name\n * @returns {name is string}\n */\nconst isComponentName = (name) => typeof name === \"string\" && /^[A-Z]/.test(name);\n\n/**\n * Get the name of a function node\n * @param {FunctionLikeNode} node\n * @returns {string}\n */\nconst getFunctionName = (node) => {\n if (node.type === \"FunctionDeclaration\" && node.id && node.id.type === \"Identifier\") {\n return node.id.name;\n }\n\n if ((node.type === \"FunctionExpression\" || node.type === \"ArrowFunctionExpression\") && node.id) {\n if (node.id.type === \"Identifier\") return node.id.name;\n }\n\n const parent = node.parent;\n if (!parent || !isNode(parent)) return \"\";\n\n if (parent.type === \"VariableDeclarator\") {\n return parent.id && parent.id.type === \"Identifier\" ? parent.id.name : \"\";\n }\n\n if (parent.type === \"AssignmentExpression\") {\n return parent.left && parent.left.type === \"Identifier\" ? parent.left.name : \"\";\n }\n\n if (parent.type === \"Property\" || parent.type === \"MethodDefinition\") {\n return parent.key && parent.key.type === \"Identifier\" ? parent.key.name : \"\";\n }\n\n return \"\";\n};\n\n/**\n * Check if a node is a JSX element or fragment\n * @param {ESTNode | null | undefined} node\n * @returns {boolean}\n */\nconst isJSXNode = (node) => {\n if (!node || !isNode(node)) return false;\n return node.type === \"JSXElement\" || node.type === \"JSXFragment\";\n};\n\n/**\n * Check if a NewExpression is creating a Date instance\n * @param {NewExpressionNode} node\n * @returns {boolean}\n */\nconst isDateInstantiation = (node) => {\n if (node.callee.type === \"Identifier\" && node.callee.name === \"Date\") {\n return true;\n }\n return false;\n};\n\nconst rule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow Date instantiation in the top scope of React components. Date instances declared on every render are bad because they change every render.\",\n recommended: true,\n },\n schema: [],\n },\n createOnce(context) {\n /** @type {FunctionContext[]} */\n const functionStack = [];\n\n const currentFunction = () => functionStack[functionStack.length - 1] ?? null;\n\n /**\n * @param {FunctionLikeNode} node\n */\n const enterFunction = (node) => {\n const parent = currentFunction();\n /** @type {FunctionContext} */\n const fnCtx = {\n node,\n parent,\n name: getFunctionName(node),\n returnsJsx: false,\n dateInstantiations: [],\n };\n\n functionStack.push(fnCtx);\n\n // Check for arrow functions with expression body that returns JSX\n if (node.type === \"ArrowFunctionExpression\" && node.body && node.body.type !== \"BlockStatement\") {\n if (isJSXNode(node.body)) {\n fnCtx.returnsJsx = true;\n }\n }\n };\n\n const exitFunction = () => {\n const fnCtx = functionStack.pop();\n if (!fnCtx) return;\n\n // Only report if this is a React component (PascalCase name + returns JSX)\n if (!fnCtx.returnsJsx) return;\n if (!isComponentName(fnCtx.name)) return;\n\n // Report all Date instantiations in the top scope of this component\n for (const dateNode of fnCtx.dateInstantiations) {\n context.report({\n node: dateNode,\n message: `Avoid instantiating Date in the top scope of component '${fnCtx.name}'. Date instances change on every render. Move it inside an effect, event handler, or use useMemo/useCallback.`,\n });\n }\n };\n\n /** @param {ReturnStatementNode} node */\n const handleReturnStatement = (node) => {\n const fnCtx = currentFunction();\n if (!fnCtx) return;\n\n const argument = node.argument;\n if (!argument) return;\n\n if (isJSXNode(argument)) {\n fnCtx.returnsJsx = true;\n }\n };\n\n /** @param {NewExpressionNode} node */\n const handleNewExpression = (node) => {\n if (!isDateInstantiation(node)) return;\n\n const fnCtx = currentFunction();\n if (!fnCtx) return;\n\n // Record this Date instantiation - we'll check if it's in top scope when the function exits\n fnCtx.dateInstantiations.push(node);\n };\n\n return /** @type {import(\"oxlint\").VisitorWithHooks} */ ({\n FunctionDeclaration(node) {\n if (isFunctionLike(node)) enterFunction(node);\n },\n \"FunctionDeclaration:exit\": exitFunction,\n FunctionExpression(node) {\n if (isFunctionLike(node)) enterFunction(node);\n },\n \"FunctionExpression:exit\": exitFunction,\n ArrowFunctionExpression(node) {\n if (isFunctionLike(node)) enterFunction(node);\n },\n \"ArrowFunctionExpression:exit\": exitFunction,\n ReturnStatement(node) {\n if (node.type === \"ReturnStatement\") handleReturnStatement(node);\n },\n NewExpression(node) {\n if (node.type === \"NewExpression\") handleNewExpression(node);\n },\n });\n },\n});\n\nexport const noComponentDateInstantiationRule = rule;\n\n","import { defineRule } from \"oxlint\";\n\n/**\n * @typedef {import(\"oxlint\").Context} RuleContext\n * @typedef {import(\"oxlint\").ESTree.Node} ESTNode\n * @typedef {import(\"oxlint\").ESTree.Expression} ESTExpression\n * @typedef {import(\"oxlint\").ESTree.Pattern} ESTPattern\n * @typedef {import(\"oxlint\").ESTree.ReturnStatement} ReturnStatementNode\n * @typedef {import(\"oxlint\").ESTree.VariableDeclarator} VariableDeclaratorNode\n * @typedef {import(\"oxlint\").ESTree.AssignmentExpression} AssignmentExpressionNode\n * @typedef {import(\"oxlint\").ESTree.Function | import(\"oxlint\").ESTree.ArrowFunctionExpression} FunctionLikeNode\n */\n\n/**\n * @typedef {object} RecordedAssignment\n * @property {ESTExpression} node\n * @property {string[]} names\n */\n\n/**\n * @typedef {object} NestedFunctionRecord\n * @property {FunctionLikeNode} node\n * @property {string} name\n */\n\n/**\n * @typedef {object} FunctionContext\n * @property {FunctionLikeNode} node\n * @property {FunctionContext | null} parent\n * @property {string} name\n * @property {boolean} returnsJsx\n * @property {Set<string>} jsxBindingNames\n * @property {RecordedAssignment[]} jsxAssignments\n * @property {NestedFunctionRecord[]} nestedJsxChildren\n */\n\nconst JSX_NODE_TYPES = new Set([\"JSXElement\", \"JSXFragment\"]);\nconst FUNCTION_NODE_TYPES = new Set([\"FunctionDeclaration\", \"FunctionExpression\", \"ArrowFunctionExpression\"]);\n\n/**\n * @param {unknown} name\n * @returns {name is string}\n */\nexport const isComponentName = (name) => typeof name === \"string\" && /^[A-Z]/.test(name);\n\n/**\n * @param {unknown} name\n * @returns {name is string}\n */\nexport const isHookName = (name) => typeof name === \"string\" && name.startsWith(\"use\");\n\n/**\n * @param {unknown} node\n * @returns {node is ESTNode & { type: string }}\n */\nconst isNode = (node) => Boolean(node && typeof node === \"object\" && \"type\" in node);\n\n/**\n * @param {unknown} node\n * @returns {node is FunctionLikeNode}\n */\nconst isFunctionLike = (node) => isNode(node) && FUNCTION_NODE_TYPES.has(node.type);\n\n/**\n * @param {ESTNode | null | undefined} node\n * @returns {FunctionLikeNode | null}\n */\nexport const getEnclosingFunction = (node) => {\n const findFunction = (current) => {\n if (!current) return null;\n if (isFunctionLike(current)) {\n return current;\n }\n return findFunction(isNode(current) ? current.parent ?? null : null);\n };\n return findFunction(isNode(node) ? node.parent ?? null : null);\n};\n\n/**\n * @param {FunctionLikeNode} node\n */\nconst isFunctionUsedAsJsxProp = (node) => {\n const checkJsxProp = (current) => {\n if (!current) return false;\n if (current.type === \"JSXAttribute\") {\n return true;\n }\n if (isFunctionLike(current)) {\n return false;\n }\n return checkJsxProp(isNode(current) ? current.parent ?? null : null);\n };\n return checkJsxProp(isNode(node) ? node.parent ?? null : null);\n};\n\n/**\n * @param {FunctionLikeNode} node\n */\nconst isFunctionImmediatelyInvoked = (node) => {\n const parent = isNode(node) ? node.parent ?? null : null;\n if (!parent) return false;\n\n // Check if the function is the callee of a CallExpression (i.e., it's immediately invoked)\n if (parent.type === \"CallExpression\" && parent.callee === node) {\n return true;\n }\n\n return false;\n};\n\n/**\n * @param {ESTExpression | null | undefined} root\n */\nconst expressionContainsJsx = (root) => {\n if (!root || !isNode(root)) return false;\n\n const stack = [root];\n\n while (stack.length > 0) {\n const current = stack.pop();\n if (!current || !isNode(current)) continue;\n\n if (JSX_NODE_TYPES.has(current.type)) {\n return true;\n }\n\n if (FUNCTION_NODE_TYPES.has(current.type) && current !== root) {\n continue;\n }\n\n for (const key of Object.keys(current)) {\n if (key === \"parent\") continue;\n\n const value = current[key];\n if (!value) continue;\n\n if (Array.isArray(value)) {\n for (const element of value) {\n if (isNode(element)) {\n stack.push(element);\n }\n }\n } else if (isNode(value)) {\n stack.push(value);\n }\n }\n }\n\n return false;\n};\n\n/**\n * @param {ESTExpression | null | undefined} root\n * @param {Set<string>} bindingNames\n */\nconst expressionProducesJsx = (root, bindingNames) => {\n if (!root) return false;\n if (expressionContainsJsx(root)) return true;\n\n if (!isNode(root)) return false;\n\n const type = root.type;\n\n if (type === \"Identifier\") {\n return bindingNames.has(root.name);\n }\n\n if (type === \"ConditionalExpression\") {\n return expressionProducesJsx(root.consequent, bindingNames) || expressionProducesJsx(root.alternate, bindingNames);\n }\n\n if (type === \"LogicalExpression\") {\n return expressionProducesJsx(root.left, bindingNames) || expressionProducesJsx(root.right, bindingNames);\n }\n\n if (type === \"SequenceExpression\") {\n const expressions = root.expressions ?? [];\n const last = expressions[expressions.length - 1] ?? null;\n return expressionProducesJsx(last, bindingNames);\n }\n\n if (type === \"ArrayExpression\") {\n return root.elements.some((element) => {\n if (!element) return false;\n if (element.type === \"SpreadElement\") {\n return expressionProducesJsx(element.argument, bindingNames);\n }\n return expressionProducesJsx(element, bindingNames);\n });\n }\n\n if (type === \"ParenthesizedExpression\") {\n return expressionProducesJsx(root.expression, bindingNames);\n }\n\n if (type === \"AwaitExpression\" || type === \"UnaryExpression\" || type === \"UpdateExpression\") {\n return expressionProducesJsx(root.argument, bindingNames);\n }\n\n if (\n type === \"TSAsExpression\" ||\n type === \"TSTypeAssertion\" ||\n type === \"TSNonNullExpression\" ||\n type === \"ChainExpression\"\n ) {\n return expressionProducesJsx(root.expression, bindingNames);\n }\n\n if (type === \"CallExpression\") {\n return expressionProducesJsx(root.callee, bindingNames);\n }\n\n if (type === \"MemberExpression\") {\n return expressionProducesJsx(root.object, bindingNames);\n }\n\n return false;\n};\n\n/**\n * @param {ESTPattern | null | undefined} pattern\n * @param {string[]} names\n */\nconst collectBindingNames = (pattern, names) => {\n if (!pattern || !isNode(pattern)) return;\n\n const type = pattern.type;\n\n if (type === \"Identifier\") {\n names.push(pattern.name);\n return;\n }\n\n if (type === \"ArrayPattern\") {\n for (const element of pattern.elements) {\n if (!element) continue;\n if (element.type === \"RestElement\") {\n collectBindingNames(element.argument, names);\n } else {\n collectBindingNames(element, names);\n }\n }\n return;\n }\n\n if (type === \"ObjectPattern\") {\n for (const property of pattern.properties) {\n if (!property) continue;\n if (property.type === \"Property\") {\n collectBindingNames(property.value, names);\n } else if (property.type === \"RestElement\") {\n collectBindingNames(property.argument, names);\n }\n }\n return;\n }\n\n if (type === \"AssignmentPattern\") {\n collectBindingNames(pattern.left, names);\n return;\n }\n\n if (type === \"RestElement\") {\n collectBindingNames(pattern.argument, names);\n }\n};\n\n/**\n * @param {FunctionLikeNode} node\n */\nexport const getFunctionName = (node) => {\n if (node.type === \"FunctionDeclaration\" && node.id && node.id.type === \"Identifier\") {\n return node.id.name;\n }\n\n if ((node.type === \"FunctionExpression\" || node.type === \"ArrowFunctionExpression\") && node.id) {\n if (node.id.type === \"Identifier\") return node.id.name;\n }\n\n const parent = node.parent;\n if (!parent || !isNode(parent)) return \"\";\n\n if (parent.type === \"VariableDeclarator\") {\n return parent.id && parent.id.type === \"Identifier\" ? parent.id.name : \"\";\n }\n\n if (parent.type === \"AssignmentExpression\") {\n return parent.left && parent.left.type === \"Identifier\" ? parent.left.name : \"\";\n }\n\n if (parent.type === \"Property\" || parent.type === \"MethodDefinition\") {\n return parent.key && parent.key.type === \"Identifier\" ? parent.key.name : \"\";\n }\n\n // Handle functions passed as arguments to calls (e.g., useCallback, useMemo)\n if (parent.type === \"CallExpression\") {\n const callParent = parent.parent;\n if (callParent && isNode(callParent)) {\n if (callParent.type === \"VariableDeclarator\") {\n return callParent.id && callParent.id.type === \"Identifier\" ? callParent.id.name : \"\";\n }\n if (callParent.type === \"AssignmentExpression\") {\n return callParent.left && callParent.left.type === \"Identifier\" ? callParent.left.name : \"\";\n }\n }\n }\n\n return \"\";\n};\n\n/**\n * @param {string} name\n */\nconst describeFunction = (name) => (name ? `function '${name}'` : \"this function\");\n\n/**\n * @param {string} name\n */\nconst describeNested = (name) => (name ? `function '${name}'` : \"an anonymous function\");\n\n/**\n * @param {string[]} names\n * @param {string} fnName\n */\nconst createAssignmentMessage = (names, fnName) => {\n const target =\n names.length === 0\n ? \"local variables\"\n : names.length === 1\n ? `local '${names[0]}'`\n : `locals ${names.map((name) => `'${name}'`).join(\", \")}`;\n\n return `Avoid storing JSX in ${target} inside ${describeFunction(fnName)}; return the JSX directly instead.`;\n};\n\n/**\n * @param {string} childName\n * @param {string} parentName\n */\nconst createNestedFunctionMessage = (childName, parentName) =>\n `JSX-returning ${describeNested(childName)} should not be declared inside ${describeFunction(parentName)}. Extract it to module scope.`;\n\n/**\n * @param {string} name\n */\nconst createIIFEMessage = (name) =>\n `JSX-returning ${describeNested(name)} should not be declared as an immediately invoked function expression (IIFE). Extract it to a named function at module scope.`;\n\nconst rule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow JSX-returning functions and JSX-valued assignments within other functions that also return JSX.\",\n recommended: false,\n },\n schema: [],\n },\n\n createOnce(context) {\n /** @type {FunctionContext[]} */\n const functionStack = [];\n\n const currentFunction = () => functionStack[functionStack.length - 1] ?? null;\n\n /**\n * @param {FunctionLikeNode} node\n */\n const enterFunction = (node) => {\n const parent = currentFunction();\n /** @type {FunctionContext} */\n const fnCtx = {\n node,\n parent,\n name: getFunctionName(node),\n returnsJsx: false,\n jsxBindingNames: new Set(),\n jsxAssignments: [],\n nestedJsxChildren: [],\n };\n\n functionStack.push(fnCtx);\n\n if (node.type === \"ArrowFunctionExpression\" && node.body && node.body.type !== \"BlockStatement\") {\n if (expressionProducesJsx(node.body, fnCtx.jsxBindingNames)) {\n fnCtx.returnsJsx = true;\n }\n }\n };\n\n const exitFunction = () => {\n const fnCtx = functionStack.pop();\n if (!fnCtx) return;\n\n if (fnCtx.returnsJsx && isFunctionImmediatelyInvoked(fnCtx.node)) {\n context.report({\n node: fnCtx.node,\n message: createIIFEMessage(fnCtx.name),\n });\n return;\n }\n\n if (fnCtx.parent && fnCtx.returnsJsx && fnCtx.name && !isFunctionUsedAsJsxProp(fnCtx.node)) {\n fnCtx.parent.nestedJsxChildren.push({ node: fnCtx.node, name: fnCtx.name });\n }\n\n if (!fnCtx.returnsJsx) return;\n\n for (const assignment of fnCtx.jsxAssignments) {\n context.report({\n node: assignment.node,\n message: createAssignmentMessage(assignment.names, fnCtx.name),\n });\n }\n\n for (const nested of fnCtx.nestedJsxChildren) {\n context.report({\n node: nested.node,\n message: createNestedFunctionMessage(nested.name, fnCtx.name),\n });\n }\n };\n\n /** @param {ReturnStatementNode} node */\n const handleReturnStatement = (node) => {\n const fnCtx = currentFunction();\n if (!fnCtx) return;\n\n const argument = node.argument;\n if (!argument || isFunctionLike(argument)) return;\n\n if (expressionProducesJsx(argument, fnCtx.jsxBindingNames)) {\n fnCtx.returnsJsx = true;\n }\n };\n\n /** @param {VariableDeclaratorNode} node */\n const handleVariableDeclarator = (node) => {\n const fnCtx = currentFunction();\n if (!fnCtx) return;\n\n const init = node.init;\n if (!init || isFunctionLike(init)) return;\n if (!expressionContainsJsx(init)) return;\n\n const names = [];\n collectBindingNames(node.id, names);\n for (const name of names) {\n fnCtx.jsxBindingNames.add(name);\n }\n\n fnCtx.jsxAssignments.push({ node: init, names });\n };\n\n /** @param {AssignmentExpressionNode} node */\n const handleAssignmentExpression = (node) => {\n if (node.operator !== \"=\") return;\n\n const fnCtx = currentFunction();\n if (!fnCtx) return;\n\n const right = node.right;\n if (!right || isFunctionLike(right)) return;\n if (!expressionContainsJsx(right)) return;\n\n const names = [];\n if (node.left && node.left.type === \"Identifier\") {\n names.push(node.left.name);\n fnCtx.jsxBindingNames.add(node.left.name);\n }\n\n fnCtx.jsxAssignments.push({ node: right, names });\n };\n\n /**\n * @param {import(\"oxlint\").ESTree.CallExpression} node\n */\n const handleCallExpression = (node) => {\n const fnCtx = currentFunction();\n if (!fnCtx) return;\n\n // Check for array.push(<JSX>)\n if (\n node.callee &&\n node.callee.type === \"MemberExpression\" &&\n node.callee.property &&\n node.callee.property.type === \"Identifier\" &&\n node.callee.property.name === \"push\"\n ) {\n const arrayObject = node.callee.object;\n if (arrayObject && arrayObject.type === \"Identifier\") {\n const arrayName = arrayObject.name;\n\n // Check if any argument contains JSX\n const hasJsxArgument = node.arguments.some((arg) => {\n if (!arg || arg.type === \"SpreadElement\") return false;\n return expressionContainsJsx(arg);\n });\n\n if (hasJsxArgument) {\n fnCtx.jsxBindingNames.add(arrayName);\n fnCtx.jsxAssignments.push({ node: node, names: [arrayName] });\n }\n }\n }\n };\n\n return /** @type {import(\"oxlint\").VisitorWithHooks} */ ({\n FunctionDeclaration(node) {\n if (isFunctionLike(node)) enterFunction(node);\n },\n \"FunctionDeclaration:exit\": exitFunction,\n FunctionExpression(node) {\n if (isFunctionLike(node)) enterFunction(node);\n },\n \"FunctionExpression:exit\": exitFunction,\n ArrowFunctionExpression(node) {\n if (isFunctionLike(node)) enterFunction(node);\n },\n \"ArrowFunctionExpression:exit\": exitFunction,\n ReturnStatement(node) {\n if (node.type === \"ReturnStatement\") handleReturnStatement(node);\n },\n VariableDeclarator(node) {\n if (node.type === \"VariableDeclarator\") handleVariableDeclarator(node);\n },\n AssignmentExpression(node) {\n if (node.type === \"AssignmentExpression\") handleAssignmentExpression(node);\n },\n CallExpression(node) {\n if (node.type === \"CallExpression\") handleCallExpression(node);\n },\n });\n },\n});\n\nexport const noInlineComponentsRule = rule;\n\n","import { defineRule } from \"oxlint\";\nimport { getFunctionName, getEnclosingFunction, isComponentName } from \"./no-inline-components.js\";\n\n/**\n * @typedef {import(\"oxlint\").Context} RuleContext\n * @typedef {import(\"oxlint\").ESTree.Node} ESTNode\n * @typedef {import(\"oxlint\").ESTree.Function | import(\"oxlint\").ESTree.ArrowFunctionExpression} FunctionLikeNode\n * @typedef {import(\"oxlint\").ESTree.VariableDeclarator} VariableDeclaratorNode\n */\n\nconst FUNCTION_NODE_TYPES = new Set([\"FunctionDeclaration\", \"FunctionExpression\", \"ArrowFunctionExpression\"]);\n\n/**\n * @param {unknown} node\n * @returns {node is ESTNode & { type: string }}\n */\nconst isNode = (node) => Boolean(node && typeof node === \"object\" && \"type\" in node);\n\n/**\n * @param {unknown} node\n * @returns {node is FunctionLikeNode}\n */\nconst isFunctionLike = (node) => isNode(node) && FUNCTION_NODE_TYPES.has(node.type);\n\n/**\n * Checks if a node is a React Hook call (e.g., useState, useEffect, useCallback)\n * @param {ESTNode} node\n * @returns {boolean}\n */\nconst isReactHookCall = (node) => {\n if (node.type !== \"CallExpression\") return false;\n\n const callee = node.callee;\n if (!callee) return false;\n\n // Direct hook calls like useState()\n if (callee.type === \"Identifier\" && callee.name.startsWith(\"use\")) {\n return true;\n }\n\n // React.useState(), React.useEffect(), etc.\n if (\n callee.type === \"MemberExpression\" &&\n callee.object &&\n callee.object.type === \"Identifier\" &&\n callee.object.name === \"React\" &&\n callee.property &&\n callee.property.type === \"Identifier\" &&\n callee.property.name.startsWith(\"use\")\n ) {\n return true;\n }\n\n return false;\n};\n\n/**\n * Checks if a node contains JSX\n * @param {ESTNode} node\n * @returns {boolean}\n */\nconst containsJSX = (node) => {\n if (!node || !isNode(node)) return false;\n\n const stack = [node];\n\n while (stack.length > 0) {\n const current = stack.pop();\n if (!current || !isNode(current)) continue;\n\n if (current.type === \"JSXElement\" || current.type === \"JSXFragment\") {\n return true;\n }\n\n // Don't traverse into nested functions\n if (isFunctionLike(current) && current !== node) {\n continue;\n }\n\n for (const key of Object.keys(current)) {\n if (key === \"parent\") continue;\n\n const value = current[key];\n if (!value) continue;\n\n if (Array.isArray(value)) {\n for (const element of value) {\n if (isNode(element)) {\n stack.push(element);\n }\n }\n } else if (isNode(value)) {\n stack.push(value);\n }\n }\n }\n\n return false;\n};\n\n/**\n * Checks if a function accesses variables from its enclosing scope\n * (excluding function parameters and locally declared variables)\n * @param {FunctionLikeNode} node\n * @param {Set<string>} localNames - Names of local variables and parameters\n * @returns {boolean}\n */\nconst accessesEnclosingScope = (node, localNames) => {\n if (!node.body) return false;\n\n const body = node.body;\n\n // For arrow functions with expression bodies\n if (body.type !== \"BlockStatement\") {\n return checkExpressionForScopeAccess(body, localNames);\n }\n\n // For block statements\n return checkNodeForScopeAccess(body, localNames);\n};\n\n/**\n * @param {ESTNode} node\n * @param {Set<string>} localNames\n * @returns {boolean}\n */\nconst checkNodeForScopeAccess = (node, localNames) => {\n if (!node || !isNode(node)) return false;\n\n const stack = [node];\n\n while (stack.length > 0) {\n const current = stack.pop();\n if (!current || !isNode(current)) continue;\n\n // If we find an identifier reference, check if it's external\n if (current.type === \"Identifier\") {\n const parent = current.parent;\n\n // Skip if this identifier is part of a declaration\n if (\n parent &&\n isNode(parent) &&\n (parent.type === \"VariableDeclarator\" ||\n parent.type === \"FunctionDeclaration\" ||\n (parent.type === \"Property\" && parent.key === current))\n ) {\n continue;\n }\n\n // If the identifier is not in our local names, it's from enclosing scope\n if (!localNames.has(current.name)) {\n // Exclude global objects and common globals\n const globalNames = new Set([\n \"console\",\n \"Math\",\n \"Date\",\n \"JSON\",\n \"Object\",\n \"Array\",\n \"String\",\n \"Number\",\n \"Boolean\",\n \"parseInt\",\n \"parseFloat\",\n \"isNaN\",\n \"isFinite\",\n \"undefined\",\n \"null\",\n \"true\",\n \"false\",\n \"Infinity\",\n \"NaN\",\n \"Map\",\n \"Set\",\n \"WeakMap\",\n \"WeakSet\",\n \"Promise\",\n \"Symbol\",\n \"Error\",\n \"TypeError\",\n \"ReferenceError\",\n \"SyntaxError\",\n ]);\n\n if (!globalNames.has(current.name)) {\n return true;\n }\n }\n }\n\n // Don't traverse into nested functions\n if (isFunctionLike(current) && current !== node) {\n continue;\n }\n\n for (const key of Object.keys(current)) {\n if (key === \"parent\") continue;\n\n const value = current[key];\n if (!value) continue;\n\n if (Array.isArray(value)) {\n for (const element of value) {\n if (isNode(element)) {\n stack.push(element);\n }\n }\n } else if (isNode(value)) {\n stack.push(value);\n }\n }\n }\n\n return false;\n};\n\n/**\n * @param {ESTNode} node\n * @param {Set<string>} localNames\n * @returns {boolean}\n */\nconst checkExpressionForScopeAccess = (node, localNames) => {\n return checkNodeForScopeAccess(node, localNames);\n};\n\n/**\n * Collects all local variable names including parameters\n * @param {FunctionLikeNode} node\n * @returns {Set<string>}\n */\nconst collectLocalNames = (node) => {\n const names = new Set();\n\n // Add parameter names\n if (node.params) {\n for (const param of node.params) {\n collectPatternNames(param, names);\n }\n }\n\n // Add locally declared variables\n if (node.body && node.body.type === \"BlockStatement\") {\n for (const statement of node.body.body) {\n if (statement.type === \"VariableDeclaration\") {\n for (const declarator of statement.declarations) {\n collectPatternNames(declarator.id, names);\n }\n }\n }\n }\n\n return names;\n};\n\n/**\n * @param {import(\"oxlint\").ESTree.Pattern} pattern\n * @param {Set<string>} names\n */\nconst collectPatternNames = (pattern, names) => {\n if (!pattern || !isNode(pattern)) return;\n\n if (pattern.type === \"Identifier\") {\n names.add(pattern.name);\n return;\n }\n\n if (pattern.type === \"ArrayPattern\") {\n for (const element of pattern.elements) {\n if (!element) continue;\n if (element.type === \"RestElement\") {\n collectPatternNames(element.argument, names);\n } else {\n collectPatternNames(element, names);\n }\n }\n return;\n }\n\n if (pattern.type === \"ObjectPattern\") {\n for (const property of pattern.properties) {\n if (!property) continue;\n if (property.type === \"Property\") {\n collectPatternNames(property.value, names);\n } else if (property.type === \"RestElement\") {\n collectPatternNames(property.argument, names);\n }\n }\n return;\n }\n\n if (pattern.type === \"AssignmentPattern\") {\n collectPatternNames(pattern.left, names);\n return;\n }\n\n if (pattern.type === \"RestElement\") {\n collectPatternNames(pattern.argument, names);\n }\n};\n\n/**\n * Checks if a function is likely a React component\n * @param {FunctionLikeNode} node\n * @returns {boolean}\n */\nconst isReactComponent = (node) => {\n const name = getFunctionName(node);\n\n // Must start with capital letter\n if (!isComponentName(name)) {\n return false;\n }\n\n // Check if it returns JSX or uses hooks\n return containsJSX(node) || containsHooks(node);\n};\n\n/**\n * Checks if a function contains React Hook calls\n * @param {FunctionLikeNode} node\n * @returns {boolean}\n */\nconst containsHooks = (node) => {\n if (!node.body) return false;\n\n const stack = [node.body];\n\n while (stack.length > 0) {\n const current = stack.pop();\n if (!current || !isNode(current)) continue;\n\n if (isReactHookCall(current)) {\n return true;\n }\n\n // Don't traverse into nested functions\n if (isFunctionLike(current) && current !== node.body) {\n continue;\n }\n\n for (const key of Object.keys(current)) {\n if (key === \"parent\") continue;\n\n const value = current[key];\n if (!value) continue;\n\n if (Array.isArray(value)) {\n for (const element of value) {\n if (isNode(element)) {\n stack.push(element);\n }\n }\n } else if (isNode(value)) {\n stack.push(value);\n }\n }\n }\n\n return false;\n};\n\n/**\n * Checks if a function is wrapped in a React Hook (useCallback, useMemo, etc.)\n * @param {FunctionLikeNode} node\n * @returns {boolean}\n */\nconst isWrappedInHook = (node) => {\n const parent = node.parent;\n if (!parent || !isNode(parent)) return false;\n\n if (parent.type === \"CallExpression\" && isReactHookCall(parent)) {\n return true;\n }\n\n return false;\n};\n\n/**\n * Checks if a function is pure (doesn't access component scope, hooks, or JSX)\n * @param {FunctionLikeNode} node\n * @returns {boolean}\n */\nconst isPureFunction = (node) => {\n // Must not contain JSX\n if (containsJSX(node)) return false;\n\n // Must not contain hooks\n if (containsHooks(node)) return false;\n\n // Must not be wrapped in a hook like useCallback or useMemo\n if (isWrappedInHook(node)) return false;\n\n // Must not access variables from enclosing scope (except globals)\n const localNames = collectLocalNames(node);\n if (accessesEnclosingScope(node, localNames)) return false;\n\n return true;\n};\n\nconst rule = defineRule({\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Recommend extracting pure functions from React components to module scope for better performance and readability.\",\n recommended: false,\n },\n schema: [],\n },\n\n createOnce(context) {\n /**\n * @param {VariableDeclaratorNode} node\n */\n const handleVariableDeclarator = (node) => {\n // Only check arrow functions and function expressions\n const init = node.init;\n if (!init || !isFunctionLike(init)) return;\n\n // Get the enclosing function (should be a component)\n const enclosingFunction = getEnclosingFunction(node);\n if (!enclosingFunction) return;\n\n // The enclosing function must be a React component\n if (!isReactComponent(enclosingFunction)) return;\n\n // Check if the inner function is pure\n if (!isPureFunction(init)) return;\n\n const functionName = node.id && node.id.type === \"Identifier\" ? node.id.name : \"this function\";\n const componentName = getFunctionName(enclosingFunction);\n\n context.report({\n node: init,\n message: `Pure function '${functionName}' can be extracted outside of component '${componentName}' to improve performance and readability.`,\n });\n };\n\n return /** @type {import(\"oxlint\").VisitorWithHooks} */ ({\n VariableDeclarator(node) {\n if (node.type === \"VariableDeclarator\") handleVariableDeclarator(node);\n },\n });\n },\n});\n\nexport const noComponentPureFunctionsRule = rule;\n","import { defineRule } from \"oxlint\";\n\n/** @typedef {import(\"oxlint\").ESTree.Node} ESTNode */\n\nconst rule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow the 'delete' operator\",\n recommended: true,\n },\n schema: [],\n },\n createOnce(context) {\n return /** @type {import(\"oxlint\").VisitorWithHooks} */ ({\n /**\n * @param {ESTNode} node\n */\n UnaryExpression(node) {\n if (node.type !== \"UnaryExpression\") return;\n\n if (node.operator === \"delete\") {\n context.report({\n node,\n message:\n \"Use of 'delete' operator is disallowed. Use object destructuring or set properties to undefined instead.\",\n });\n }\n },\n });\n },\n});\n\nexport const noDeleteRule = rule;\n","import { defineRule } from \"oxlint\";\n\n/** @typedef {import(\"oxlint\").ESTree.Node} ESTNode */\n\n/**\n * Regex pattern to match emojis\n * Covers most common emoji ranges in Unicode\n */\nconst EMOJI_REGEX =\n /[\\u{1F300}-\\u{1F9FF}\\u{2600}-\\u{26FF}\\u{2700}-\\u{27BF}\\u{1F000}-\\u{1F02F}\\u{1F0A0}-\\u{1F0FF}\\u{1F100}-\\u{1F64F}\\u{1F680}-\\u{1F6FF}\\u{1F900}-\\u{1F9FF}\\u{1FA00}-\\u{1FA6F}\\u{1FA70}-\\u{1FAFF}\\u{FE00}-\\u{FE0F}\\u{203C}\\u{2049}\\u{20E3}\\u{2139}\\u{2194}-\\u{2199}\\u{21A9}-\\u{21AA}\\u{231A}-\\u{231B}\\u{2328}\\u{23CF}\\u{23E9}-\\u{23F3}\\u{23F8}-\\u{23FA}\\u{24C2}\\u{25AA}-\\u{25AB}\\u{25B6}\\u{25C0}\\u{25FB}-\\u{25FE}\\u{2600}-\\u{2604}\\u{260E}\\u{2611}\\u{2614}-\\u{2615}\\u{2618}\\u{261D}\\u{2620}\\u{2622}-\\u{2623}\\u{2626}\\u{262A}\\u{262E}-\\u{262F}\\u{2638}-\\u{263A}\\u{2640}\\u{2642}\\u{2648}-\\u{2653}\\u{265F}-\\u{2660}\\u{2663}\\u{2665}-\\u{2666}\\u{2668}\\u{267B}\\u{267E}-\\u{267F}\\u{2692}-\\u{2697}\\u{2699}\\u{269B}-\\u{269C}\\u{26A0}-\\u{26A1}\\u{26A7}\\u{26AA}-\\u{26AB}\\u{26B0}-\\u{26B1}\\u{26BD}-\\u{26BE}\\u{26C4}-\\u{26C5}\\u{26C8}\\u{26CE}\\u{26CF}\\u{26D1}\\u{26D3}-\\u{26D4}\\u{26E9}-\\u{26EA}\\u{26F0}-\\u{26F5}\\u{26F7}-\\u{26FA}\\u{26FD}\\u{2702}\\u{2705}\\u{2708}-\\u{270D}\\u{270F}\\u{2712}\\u{2714}\\u{2716}\\u{271D}\\u{2721}\\u{2728}\\u{2733}-\\u{2734}\\u{2744}\\u{2747}\\u{274C}\\u{274E}\\u{2753}-\\u{2755}\\u{2757}\\u{2763}-\\u{2764}\\u{2795}-\\u{2797}\\u{27A1}\\u{27B0}\\u{27BF}\\u{2934}-\\u{2935}\\u{2B05}-\\u{2B07}\\u{2B1B}-\\u{2B1C}\\u{2B50}\\u{2B55}\\u{3030}\\u{303D}\\u{3297}\\u{3299}]/gu;\n\n/**\n * Find emojis in a string\n * @param {string} text\n * @returns {RegExpMatchArray | null}\n */\nconst findEmojis = (text) => {\n return text.match(EMOJI_REGEX);\n};\n\n/**\n * Get a preview of the emoji found\n * @param {string} text\n * @returns {string}\n */\nconst getEmojiPreview = (text) => {\n const emojis = findEmojis(text);\n if (!emojis || emojis.length === 0) return \"\";\n\n const uniqueEmojis = [...new Set(emojis)];\n const preview = uniqueEmojis.slice(0, 3).join(\" \");\n\n return uniqueEmojis.length > 3 ? `${preview} ...` : preview;\n};\n\nconst rule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow the use of emojis in code. Use icons from a component library instead.\",\n recommended: true,\n },\n schema: [],\n },\n createOnce(context) {\n return /** @type {import(\"oxlint\").VisitorWithHooks} */ ({\n /**\n * Check string literals\n * @param {ESTNode} node\n */\n StringLiteral(node) {\n if (node.type !== \"StringLiteral\") return;\n\n const emojis = findEmojis(node.value);\n if (emojis && emojis.length > 0) {\n const preview = getEmojiPreview(node.value);\n context.report({\n node,\n message: `Emojis are not allowed in code. Found: ${preview}. Use icons from a component library instead.`,\n });\n }\n },\n\n /**\n * Check template literals\n * @param {ESTNode} node\n */\n TemplateLiteral(node) {\n if (node.type !== \"TemplateLiteral\") return;\n\n // Check each quasi (template string part)\n for (const quasi of node.quasis) {\n if (quasi.type !== \"TemplateElement\") continue;\n\n const text = quasi.value.raw;\n const emojis = findEmojis(text);\n\n if (emojis && emojis.length > 0) {\n const preview = getEmojiPreview(text);\n context.report({\n node: quasi,\n message: `Emojis are not allowed in code. Found: ${preview}. Use icons from a component library instead.`,\n });\n }\n }\n },\n\n /**\n * Check JSX text\n * @param {ESTNode} node\n */\n JSXText(node) {\n if (node.type !== \"JSXText\") return;\n\n const emojis = findEmojis(node.value);\n if (emojis && emojis.length > 0) {\n const preview = getEmojiPreview(node.value);\n context.report({\n node,\n message: `Emojis are not allowed in code. Found: ${preview}. Use icons from a component library instead.`,\n });\n }\n },\n });\n },\n});\n\nexport const noEmojiRule = rule;\n\n","import { defineRule } from \"oxlint\";\n\n/** @typedef {import(\"oxlint\").ESTree.Node} ESTNode */\n\nconst rule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow 'finally' blocks in try/catch/finally statements\",\n recommended: true,\n },\n schema: [],\n },\n createOnce(context) {\n return /** @type {import(\"oxlint\").VisitorWithHooks} */ ({\n /**\n * @param {ESTNode} node\n */\n TryStatement(node) {\n if (node.type !== \"TryStatement\") return;\n\n if (node.finalizer) {\n context.report({\n node: node.finalizer,\n message: \"Use of 'finally' blocks is disallowed. Handle cleanup explicitly in try/catch blocks instead.\",\n });\n }\n },\n });\n },\n});\n\nexport const noFinallyRule = rule;\n\n","import { defineRule } from \"oxlint\";\n\n/** @typedef {import(\"oxlint\").ESTree.Node} ESTNode */\n\n/**\n * Check if a MemberExpression is accessing the React namespace\n * @param {ESTNode} node\n * @returns {boolean}\n */\nconst isReactNamespaceAccess = (node) => {\n if (node.type !== \"MemberExpression\") return false;\n\n const object = node.object;\n if (!object || object.type !== \"Identifier\" || object.name !== \"React\") {\n return false;\n }\n\n return true;\n};\n\n/**\n * Check if this is a type annotation context (TypeScript)\n * @param {ESTNode} node\n * @returns {boolean}\n */\nconst isTypeContext = (node) => {\n const checkParent = (current) => {\n if (!current) return false;\n\n // Type annotation contexts where React namespace is allowed\n const typeContextTypes = new Set([\n \"TSTypeReference\",\n \"TSTypeAnnotation\",\n \"TSTypeParameterInstantiation\",\n \"TSInterfaceHeritage\",\n \"TSTypeQuery\",\n \"TSTypeAliasDeclaration\",\n \"TSInterfaceDeclaration\",\n \"TSTypeLiteral\",\n \"TSPropertySignature\",\n \"TSIndexSignature\",\n \"TSMethodSignature\",\n \"TSCallSignatureDeclaration\",\n \"TSConstructSignatureDeclaration\",\n \"TSExpressionWithTypeArguments\",\n ]);\n\n if (typeContextTypes.has(current.type)) {\n return true;\n }\n\n // Stop at statement or expression boundaries\n if (\n current.type === \"ExpressionStatement\" ||\n current.type === \"VariableDeclarator\" ||\n current.type === \"CallExpression\" ||\n current.type === \"ReturnStatement\"\n ) {\n return false;\n }\n\n return checkParent(current.parent);\n };\n\n return checkParent(node.parent);\n};\n\nconst rule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow using the React namespace for accessing React APIs. Use destructured imports instead (e.g., import { useState } from 'react').\",\n recommended: true,\n },\n schema: [],\n },\n createOnce(context) {\n return /** @type {import(\"oxlint\").VisitorWithHooks} */ ({\n /**\n * @param {ESTNode} node\n */\n MemberExpression(node) {\n if (node.type !== \"MemberExpression\") return;\n\n if (!isReactNamespaceAccess(node)) return;\n\n // Allow React namespace in type annotations\n if (isTypeContext(node)) return;\n\n const propertyName = node.property && node.property.type === \"Identifier\" ? node.property.name : \"property\";\n\n context.report({\n node,\n message: `Avoid using 'React.${propertyName}'. Import '${propertyName}' directly from 'react' instead (e.g., import { ${propertyName} } from 'react').`,\n });\n },\n });\n },\n});\n\nexport const noReactNamespaceRule = rule;\n\n","import { defineRule } from \"oxlint\";\n\n/** @typedef {import(\"oxlint\").ESTree.Node} ESTNode */\n\nexport const noSwitchRule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow switch/case statements\",\n recommended: true,\n },\n schema: [],\n },\n createOnce(context) {\n return /** @type {import(\"oxlint\").VisitorWithHooks} */ ({\n /**\n * @param {ESTNode} node\n */\n SwitchStatement(node) {\n if (node.type !== \"SwitchStatement\") return;\n\n context.report({\n node,\n message: \"Use of switch/case is disallowed. Use object map or if/else instead.\",\n });\n },\n });\n },\n});\n","import { defineRule } from \"oxlint\";\n\n/** @typedef {import(\"oxlint\").ESTree.Node} ESTNode */\n\n/**\n * Get the enclosing function node for a given node\n * @param {ESTNode} node\n * @returns {ESTNode | null}\n */\nconst getEnclosingFunction = (node) => {\n const findFunction = (current) => {\n if (!current) return null;\n if (\n current.type === \"FunctionDeclaration\" ||\n current.type === \"FunctionExpression\" ||\n current.type === \"ArrowFunctionExpression\"\n ) {\n return current;\n }\n return findFunction(current.parent);\n };\n return findFunction(node.parent);\n};\n\n/**\n * Check if a node is inside a loop\n * @param {ESTNode} node\n * @param {ESTNode} stopAt - Stop searching when we reach this node\n * @returns {boolean}\n */\nconst isInsideLoop = (node, stopAt) => {\n const checkLoop = (current) => {\n if (!current || current === stopAt) return false;\n if (\n current.type === \"ForStatement\" ||\n current.type === \"ForInStatement\" ||\n current.type === \"ForOfStatement\" ||\n current.type === \"WhileStatement\" ||\n current.type === \"DoWhileStatement\"\n ) {\n return true;\n }\n return checkLoop(current.parent);\n };\n return checkLoop(node.parent);\n};\n\nconst rule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow top-level `let` declarations inside functions to prevent conditional reassignment.\",\n recommended: false,\n },\n schema: [],\n },\n\n createOnce(context) {\n return /** @type {import(\"oxlint\").VisitorWithHooks} */ ({\n /**\n * @param {ESTNode} rawNode\n */\n VariableDeclaration(rawNode) {\n if (rawNode.type !== \"VariableDeclaration\") return;\n const node = rawNode;\n\n if (node.kind !== \"let\") return;\n\n const fn = getEnclosingFunction(node);\n if (\n !fn ||\n (fn.type !== \"FunctionDeclaration\" &&\n fn.type !== \"FunctionExpression\" &&\n fn.type !== \"ArrowFunctionExpression\")\n ) {\n return;\n }\n\n const parent = node.parent;\n if (!parent || parent.type !== \"BlockStatement\" || parent.parent !== fn) return;\n\n // Allow let declarations inside loops\n if (isInsideLoop(node, fn)) return;\n\n context.report({\n node,\n message:\n \"Avoid using `let` at the top level of functions; prefer `const` with extracted functions to avoid conditional reassignment. Extract conditional logic into a separate function that returns the appropriate value.\",\n });\n },\n });\n },\n});\n\nexport const noTopLevelLetRule = rule;\n\n","import { defineRule } from \"oxlint\";\n\n/** @typedef {import(\"oxlint\").ESTree.Node} ESTNode */\n\nconst rule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow TypeScript type assertions (`as` and angle-bracket syntax) to prevent unsafe type casting.\",\n recommended: false,\n },\n schema: [],\n },\n\n createOnce(context) {\n return /** @type {import(\"oxlint\").VisitorWithHooks} */ ({\n /**\n * @param {ESTNode} rawNode\n */\n TSAsExpression(rawNode) {\n if (rawNode.type !== \"TSAsExpression\") return;\n\n // Allow \"as const\" assertions\n if (\n rawNode.typeAnnotation.type === \"TSTypeReference\" &&\n rawNode.typeAnnotation.typeName.type === \"Identifier\" &&\n rawNode.typeAnnotation.typeName.name === \"const\"\n ) {\n return;\n }\n\n context.report({\n node: rawNode,\n message:\n \"Type casting with `as` is not permitted. Use runtime validation with valibot or refactor to avoid type casting.\",\n });\n },\n\n /**\n * @param {ESTNode} rawNode\n */\n TSTypeAssertion(rawNode) {\n if (rawNode.type !== \"TSTypeAssertion\") return;\n\n context.report({\n node: rawNode,\n message:\n \"Type casting with angle brackets `<Type>` is not permitted. Use runtime validation with valibot or refactor to avoid type casting.\",\n });\n },\n\n /**\n * @param {ESTNode} rawNode\n */\n TSNonNullExpression(rawNode) {\n if (rawNode.type !== \"TSNonNullExpression\") return;\n\n context.report({\n node: rawNode,\n message:\n \"Non-null assertion operator `!` is not permitted. Handle null/undefined cases explicitly or use optional chaining.\",\n });\n },\n });\n },\n});\n\nexport const noTypeCastRule = rule;\n\n","import { defineRule } from \"oxlint\";\n\n/**\n * @typedef {import(\"oxlint\").Context} RuleContext\n * @typedef {import(\"oxlint\").ESTree.Node} ESTNode\n * @typedef {import(\"oxlint\").ESTree.Expression} ESTExpression\n * @typedef {import(\"oxlint\").ESTree.Function | import(\"oxlint\").ESTree.ArrowFunctionExpression} FunctionLikeNode\n */\n\nconst JSX_NODE_TYPES = new Set([\"JSXElement\", \"JSXFragment\"]);\nconst FUNCTION_NODE_TYPES = new Set([\"FunctionDeclaration\", \"FunctionExpression\", \"ArrowFunctionExpression\"]);\n\n/**\n * @param {unknown} node\n * @returns {node is ESTNode & { type: string }}\n */\nconst isNode = (node) => Boolean(node && typeof node === \"object\" && \"type\" in node);\n\n/**\n * @param {unknown} node\n * @returns {node is FunctionLikeNode}\n */\nconst isFunctionLike = (node) => isNode(node) && FUNCTION_NODE_TYPES.has(node.type);\n\n/**\n * Check if an expression contains JSX\n * @param {ESTExpression | null | undefined} root\n */\nconst expressionContainsJsx = (root) => {\n if (!root || !isNode(root)) return false;\n\n const stack = [root];\n\n while (stack.length > 0) {\n const current = stack.pop();\n if (!current || !isNode(current)) continue;\n\n if (JSX_NODE_TYPES.has(current.type)) {\n return true;\n }\n\n if (FUNCTION_NODE_TYPES.has(current.type) && current !== root) {\n continue;\n }\n\n for (const key of Object.keys(current)) {\n if (key === \"parent\") continue;\n\n const value = current[key];\n if (!value) continue;\n\n if (Array.isArray(value)) {\n for (const element of value) {\n if (isNode(element)) {\n stack.push(element);\n }\n }\n } else if (isNode(value)) {\n stack.push(value);\n }\n }\n }\n\n return false;\n};\n\n/**\n * Check if a function returns JSX\n * @param {FunctionLikeNode} node\n */\nconst functionReturnsJsx = (node) => {\n // Check arrow functions with expression body\n if (node.type === \"ArrowFunctionExpression\" && node.body && node.body.type !== \"BlockStatement\") {\n return expressionContainsJsx(node.body);\n }\n\n // Check for return statements in function body\n const body = node.body;\n if (!body || body.type !== \"BlockStatement\") return false;\n\n const stack = [body];\n while (stack.length > 0) {\n const current = stack.pop();\n if (!current || !isNode(current)) continue;\n\n if (current.type === \"ReturnStatement\") {\n const argument = current.argument;\n if (argument && expressionContainsJsx(argument)) {\n return true;\n }\n }\n\n // Don't traverse into nested functions\n if (FUNCTION_NODE_TYPES.has(current.type) && current !== body) {\n continue;\n }\n\n for (const key of Object.keys(current)) {\n if (key === \"parent\") continue;\n\n const value = current[key];\n if (!value) continue;\n\n if (Array.isArray(value)) {\n for (const element of value) {\n if (isNode(element)) {\n stack.push(element);\n }\n }\n } else if (isNode(value)) {\n stack.push(value);\n }\n }\n }\n\n return false;\n};\n\nconst rule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description: \"Enforce consistent props parameter naming and disallow destructuring in component parameters.\",\n recommended: false,\n },\n schema: [],\n },\n\n createOnce(context) {\n /**\n * Check if a node is at the top level of the file (module scope)\n * @param {FunctionLikeNode} node\n * @returns {boolean}\n */\n const isTopLevel = (node) => {\n let current = node.parent;\n\n while (current && isNode(current)) {\n // If we hit a Program node, we're at the top level\n if (current.type === \"Program\") {\n return true;\n }\n\n // FunctionDeclarations at the Program level will have Program as parent\n if (node.type === \"FunctionDeclaration\" && current.type === \"Program\") {\n return true;\n }\n\n // For variable declarations: const MyComponent = () => {}\n // The hierarchy is: ArrowFunction -> VariableDeclarator -> VariableDeclaration -> Program\n if (current.type === \"VariableDeclaration\") {\n const parent = current.parent;\n if (parent && isNode(parent) && parent.type === \"Program\") {\n return true;\n }\n }\n\n // If we encounter a function, we're inside a nested function\n if (FUNCTION_NODE_TYPES.has(current.type)) {\n return false;\n }\n\n current = current.parent;\n }\n\n return false;\n };\n\n /**\n * Check if a function is a top-level React component (PascalCase naming at top level)\n * @param {FunctionLikeNode} node\n * @returns {boolean}\n */\n const isTopLevelReactComponent = (node) => {\n // First check if it's at the top level\n if (!isTopLevel(node)) {\n return false;\n }\n\n // Check for named functions (FunctionDeclaration, FunctionExpression with id)\n if (node.id?.name) {\n const firstChar = node.id.name.charAt(0);\n return firstChar === firstChar.toUpperCase();\n }\n\n // For arrow functions and anonymous function expressions, check the parent context\n // to see if they're assigned to a PascalCase variable\n const parent = node.parent;\n if (!parent || !isNode(parent)) {\n return false;\n }\n\n // Check for variable declarations: const MyComponent = () => {}\n if (parent.type === \"VariableDeclarator\" && parent.id && \"name\" in parent.id) {\n const name = parent.id.name;\n if (typeof name === \"string\") {\n const firstChar = name.charAt(0);\n return firstChar === firstChar.toUpperCase();\n }\n }\n\n return false;\n };\n\n /**\n * @param {FunctionLikeNode} node\n */\n const checkFunction = (node) => {\n // Only check functions that return JSX (React components)\n if (!functionReturnsJsx(node)) {\n return;\n }\n\n // Only check functions that are top-level React components (PascalCase naming at top level)\n if (!isTopLevelReactComponent(node)) {\n return;\n }\n\n const params = node.params;\n if (!params || params.length === 0) {\n return;\n }\n\n const firstParam = params[0];\n if (!firstParam || !isNode(firstParam)) {\n return;\n }\n\n // Check if the first parameter is destructured\n if (firstParam.type === \"ObjectPattern\" || firstParam.type === \"ArrayPattern\") {\n context.report({\n node: firstParam,\n message:\n \"Props should not be destructured in the component parameter. Use 'props' instead and destructure inside the component body.\",\n });\n return;\n }\n\n // Check if the first parameter is an Identifier and is named 'props'\n if (firstParam.type === \"Identifier\") {\n if (firstParam.name !== \"props\") {\n context.report({\n node: firstParam,\n message: `Props parameter should be named 'props', not '${firstParam.name}'.`,\n });\n }\n }\n };\n\n return /** @type {import(\"oxlint\").VisitorWithHooks} */ ({\n FunctionDeclaration(node) {\n if (isFunctionLike(node)) checkFunction(node);\n },\n FunctionExpression(node) {\n if (isFunctionLike(node)) checkFunction(node);\n },\n ArrowFunctionExpression(node) {\n if (isFunctionLike(node)) checkFunction(node);\n },\n });\n },\n});\n\nexport const prettyPropsRule = rule;\n","import { definePlugin } from \"oxlint\";\n\nimport { jsxComponentPascalCaseRule } from \"./jsx-component-pascal-case.js\";\nimport { noArrayTypeRule } from \"./no-array-type.js\";\nimport { noComponentDateInstantiationRule } from \"./no-component-date-instantiation.js\";\nimport { noComponentPureFunctionsRule } from \"./no-component-pure-functions.js\";\nimport { noDeleteRule } from \"./no-delete.js\";\nimport { noEmojiRule } from \"./no-emoji.js\";\nimport { noFinallyRule } from \"./no-finally.js\";\nimport { noInlineComponentsRule } from \"./no-inline-components.js\";\nimport { noReactNamespaceRule } from \"./no-react-namespace.js\";\nimport { noSwitchRule } from \"./no-switch-plugin.js\";\nimport { noTopLevelLetRule } from \"./no-top-level-let.js\";\nimport { noTypeCastRule } from \"./no-type-cast.js\";\nimport { prettyPropsRule } from \"./pretty-props.js\";\n\nconst plugin = definePlugin({\n meta: {\n name: \"conorroberts\",\n },\n rules: {\n \"jsx-component-pascal-case\": jsxComponentPascalCaseRule,\n \"no-array-type\": noArrayTypeRule,\n \"no-component-date-instantiation\": noComponentDateInstantiationRule,\n \"no-component-pure-functions\": noComponentPureFunctionsRule,\n \"no-delete\": noDeleteRule,\n \"no-emoji\": noEmojiRule,\n \"no-finally\": noFinallyRule,\n \"no-inline-components\": noInlineComponentsRule,\n \"no-react-namespace\": noReactNamespaceRule,\n \"no-switch\": noSwitchRule,\n \"no-top-level-let\": noTopLevelLetRule,\n \"no-type-cast\": noTypeCastRule,\n \"pretty-props\": prettyPropsRule,\n },\n});\n\nexport default plugin;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["JSX_NODE_TYPES","FUNCTION_NODE_TYPES","isNode","isFunctionLike","getFunctionName","expressionContainsJsx","rule","rule","FUNCTION_NODE_TYPES","isNode","isFunctionLike","isComponentName","getFunctionName","rule","JSX_NODE_TYPES","FUNCTION_NODE_TYPES","isNode","isFunctionLike","getEnclosingFunction","expressionContainsJsx","rule","FUNCTION_NODE_TYPES","isNode","isFunctionLike","rule","getEnclosingFunction","rule","rule","rule","rule","rule","rule","rule"],"sources":["../../src/oxlint-plugins/jsx-component-pascal-case.js","../../src/oxlint-plugins/no-array-type.js","../../src/oxlint-plugins/no-component-date-instantiation.js","../../src/oxlint-plugins/no-inline-components.js","../../src/oxlint-plugins/no-component-pure-functions.js","../../src/oxlint-plugins/no-delete.js","../../src/oxlint-plugins/no-emoji.js","../../src/oxlint-plugins/no-finally.js","../../src/oxlint-plugins/no-iife.js","../../src/oxlint-plugins/no-react-namespace.js","../../src/oxlint-plugins/no-switch-plugin.js","../../src/oxlint-plugins/no-top-level-let.js","../../src/oxlint-plugins/no-type-cast.js","../../src/oxlint-plugins/pretty-props.js","../../src/oxlint-plugins/index.js"],"sourcesContent":["import { defineRule } from \"oxlint\";\n\n/**\n * @typedef {import(\"oxlint\").Context} RuleContext\n * @typedef {import(\"oxlint\").ESTree.Node} ESTNode\n * @typedef {import(\"oxlint\").ESTree.Expression} ESTExpression\n * @typedef {import(\"oxlint\").ESTree.ReturnStatement} ReturnStatementNode\n * @typedef {import(\"oxlint\").ESTree.Function | import(\"oxlint\").ESTree.ArrowFunctionExpression} FunctionLikeNode\n */\n\n/**\n * @typedef {object} FunctionContext\n * @property {FunctionLikeNode} node\n * @property {string} name\n * @property {boolean} returnsJsx\n */\n\nconst JSX_NODE_TYPES = new Set([\"JSXElement\", \"JSXFragment\"]);\nconst FUNCTION_NODE_TYPES = new Set([\"FunctionDeclaration\", \"FunctionExpression\", \"ArrowFunctionExpression\"]);\n\n/**\n * @param {unknown} node\n * @returns {node is ESTNode & { type: string }}\n */\nconst isNode = (node) => Boolean(node && typeof node === \"object\" && \"type\" in node);\n\n/**\n * @param {unknown} node\n * @returns {node is FunctionLikeNode}\n */\nconst isFunctionLike = (node) => isNode(node) && FUNCTION_NODE_TYPES.has(node.type);\n\n/**\n * @param {unknown} name\n * @returns {name is string}\n */\nconst isPascalCase = (name) => typeof name === \"string\" && /^[A-Z]/.test(name);\n\n/**\n * Check if a name is a valid higher-order component name (starts with \"with\")\n * @param {unknown} name\n * @returns {name is string}\n */\nconst isHOCName = (name) => typeof name === \"string\" && /^with[A-Z]/.test(name);\n\n/**\n * @param {FunctionLikeNode} node\n */\nconst getFunctionName = (node) => {\n if (node.type === \"FunctionDeclaration\" && node.id && node.id.type === \"Identifier\") {\n return node.id.name;\n }\n\n if ((node.type === \"FunctionExpression\" || node.type === \"ArrowFunctionExpression\") && node.id) {\n if (node.id.type === \"Identifier\") return node.id.name;\n }\n\n const parent = node.parent;\n if (!parent || !isNode(parent)) return \"\";\n\n if (parent.type === \"VariableDeclarator\") {\n return parent.id && parent.id.type === \"Identifier\" ? parent.id.name : \"\";\n }\n\n if (parent.type === \"AssignmentExpression\") {\n return parent.left && parent.left.type === \"Identifier\" ? parent.left.name : \"\";\n }\n\n // Don't enforce naming for functions used as object property values or JSX props\n // These are often callbacks or configuration options, not standalone components\n if (parent.type === \"Property\" || parent.type === \"MethodDefinition\") {\n return \"\";\n }\n\n // Handle functions passed as arguments to calls (e.g., useCallback, useMemo)\n if (parent.type === \"CallExpression\") {\n const callParent = parent.parent;\n if (callParent && isNode(callParent)) {\n if (callParent.type === \"VariableDeclarator\") {\n return callParent.id && callParent.id.type === \"Identifier\" ? callParent.id.name : \"\";\n }\n if (callParent.type === \"AssignmentExpression\") {\n return callParent.left && callParent.left.type === \"Identifier\" ? callParent.left.name : \"\";\n }\n }\n }\n\n return \"\";\n};\n\n/**\n * @param {ESTExpression | null | undefined} root\n */\nconst expressionContainsJsx = (root) => {\n if (!root || !isNode(root)) return false;\n\n const stack = [root];\n\n while (stack.length > 0) {\n const current = stack.pop();\n if (!current || !isNode(current)) continue;\n\n if (JSX_NODE_TYPES.has(current.type)) {\n return true;\n }\n\n if (FUNCTION_NODE_TYPES.has(current.type) && current !== root) {\n continue;\n }\n\n for (const key of Object.keys(current)) {\n if (key === \"parent\") continue;\n\n const value = current[key];\n if (!value) continue;\n\n if (Array.isArray(value)) {\n for (const element of value) {\n if (isNode(element)) {\n stack.push(element);\n }\n }\n } else if (isNode(value)) {\n stack.push(value);\n }\n }\n }\n\n return false;\n};\n\nconst rule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description: \"Enforce PascalCase naming for functions that return JSX elements (components).\",\n recommended: false,\n },\n schema: [],\n },\n\n createOnce(context) {\n /** @type {FunctionContext[]} */\n const functionStack = [];\n\n const currentFunction = () => functionStack[functionStack.length - 1] ?? null;\n\n /**\n * @param {FunctionLikeNode} node\n */\n const enterFunction = (node) => {\n const name = getFunctionName(node);\n\n /** @type {FunctionContext} */\n const fnCtx = {\n node,\n name,\n returnsJsx: false,\n };\n\n functionStack.push(fnCtx);\n\n if (node.type === \"ArrowFunctionExpression\" && node.body && node.body.type !== \"BlockStatement\") {\n if (expressionContainsJsx(node.body)) {\n fnCtx.returnsJsx = true;\n }\n }\n };\n\n const exitFunction = () => {\n const fnCtx = functionStack.pop();\n if (!fnCtx) return;\n\n // Allow PascalCase or HOC naming (withXxx)\n if (fnCtx.returnsJsx && fnCtx.name && !isPascalCase(fnCtx.name) && !isHOCName(fnCtx.name)) {\n context.report({\n node: fnCtx.node,\n message: `Function '${fnCtx.name}' returns JSX and should use PascalCase naming (e.g., '${fnCtx.name.charAt(0).toUpperCase()}${fnCtx.name.slice(1)}').`,\n });\n }\n };\n\n /** @param {ReturnStatementNode} node */\n const handleReturnStatement = (node) => {\n const fnCtx = currentFunction();\n if (!fnCtx) return;\n\n const argument = node.argument;\n if (!argument || isFunctionLike(argument)) return;\n\n if (expressionContainsJsx(argument)) {\n fnCtx.returnsJsx = true;\n }\n };\n\n return /** @type {import(\"oxlint\").VisitorWithHooks} */ ({\n FunctionDeclaration(node) {\n if (isFunctionLike(node)) enterFunction(node);\n },\n \"FunctionDeclaration:exit\": exitFunction,\n FunctionExpression(node) {\n if (isFunctionLike(node)) enterFunction(node);\n },\n \"FunctionExpression:exit\": exitFunction,\n ArrowFunctionExpression(node) {\n if (isFunctionLike(node)) enterFunction(node);\n },\n \"ArrowFunctionExpression:exit\": exitFunction,\n ReturnStatement(node) {\n if (node.type === \"ReturnStatement\") handleReturnStatement(node);\n },\n });\n },\n});\n\nexport const jsxComponentPascalCaseRule = rule;\n\n","import { defineRule } from \"oxlint\";\n\nconst rule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow Array<T> type syntax in favor of T[] syntax\",\n recommended: true,\n },\n schema: [],\n },\n createOnce(context) {\n return {\n TSTypeReference(node) {\n if (node.type !== \"TSTypeReference\") return;\n\n // Check if this is an Array type reference\n if (node.typeName?.type === \"Identifier\" && node.typeName.name === \"Array\" && node.typeParameters) {\n context.report({\n node,\n message: \"Use T[] syntax instead of Array<T>\",\n });\n }\n },\n };\n },\n});\n\nexport const noArrayTypeRule = rule;\n","import { defineRule } from \"oxlint\";\n\n/**\n * @typedef {import(\"oxlint\").Context} RuleContext\n * @typedef {import(\"oxlint\").ESTree.Node} ESTNode\n * @typedef {import(\"oxlint\").ESTree.NewExpression} NewExpressionNode\n * @typedef {import(\"oxlint\").ESTree.ReturnStatement} ReturnStatementNode\n * @typedef {import(\"oxlint\").ESTree.Function | import(\"oxlint\").ESTree.ArrowFunctionExpression} FunctionLikeNode\n */\n\n/**\n * @typedef {object} FunctionContext\n * @property {FunctionLikeNode} node\n * @property {FunctionContext | null} parent\n * @property {string} name\n * @property {boolean} returnsJsx\n * @property {NewExpressionNode[]} dateInstantiations\n */\n\nconst FUNCTION_NODE_TYPES = new Set([\"FunctionDeclaration\", \"FunctionExpression\", \"ArrowFunctionExpression\"]);\n\n/**\n * @param {unknown} node\n * @returns {node is ESTNode & { type: string }}\n */\nconst isNode = (node) => Boolean(node && typeof node === \"object\" && \"type\" in node);\n\n/**\n * @param {unknown} node\n * @returns {node is FunctionLikeNode}\n */\nconst isFunctionLike = (node) => isNode(node) && FUNCTION_NODE_TYPES.has(node.type);\n\n/**\n * Check if a function name follows React component naming convention (PascalCase)\n * @param {unknown} name\n * @returns {name is string}\n */\nconst isComponentName = (name) => typeof name === \"string\" && /^[A-Z]/.test(name);\n\n/**\n * Get the name of a function node\n * @param {FunctionLikeNode} node\n * @returns {string}\n */\nconst getFunctionName = (node) => {\n if (node.type === \"FunctionDeclaration\" && node.id && node.id.type === \"Identifier\") {\n return node.id.name;\n }\n\n if ((node.type === \"FunctionExpression\" || node.type === \"ArrowFunctionExpression\") && node.id) {\n if (node.id.type === \"Identifier\") return node.id.name;\n }\n\n const parent = node.parent;\n if (!parent || !isNode(parent)) return \"\";\n\n if (parent.type === \"VariableDeclarator\") {\n return parent.id && parent.id.type === \"Identifier\" ? parent.id.name : \"\";\n }\n\n if (parent.type === \"AssignmentExpression\") {\n return parent.left && parent.left.type === \"Identifier\" ? parent.left.name : \"\";\n }\n\n if (parent.type === \"Property\" || parent.type === \"MethodDefinition\") {\n return parent.key && parent.key.type === \"Identifier\" ? parent.key.name : \"\";\n }\n\n return \"\";\n};\n\n/**\n * Check if a node is a JSX element or fragment\n * @param {ESTNode | null | undefined} node\n * @returns {boolean}\n */\nconst isJSXNode = (node) => {\n if (!node || !isNode(node)) return false;\n return node.type === \"JSXElement\" || node.type === \"JSXFragment\";\n};\n\n/**\n * Check if a NewExpression is creating a Date instance\n * @param {NewExpressionNode} node\n * @returns {boolean}\n */\nconst isDateInstantiation = (node) => {\n if (node.callee.type === \"Identifier\" && node.callee.name === \"Date\") {\n return true;\n }\n return false;\n};\n\nconst rule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow Date instantiation in the top scope of React components. Date instances declared on every render are bad because they change every render.\",\n recommended: true,\n },\n schema: [],\n },\n createOnce(context) {\n /** @type {FunctionContext[]} */\n const functionStack = [];\n\n const currentFunction = () => functionStack[functionStack.length - 1] ?? null;\n\n /**\n * @param {FunctionLikeNode} node\n */\n const enterFunction = (node) => {\n const parent = currentFunction();\n /** @type {FunctionContext} */\n const fnCtx = {\n node,\n parent,\n name: getFunctionName(node),\n returnsJsx: false,\n dateInstantiations: [],\n };\n\n functionStack.push(fnCtx);\n\n // Check for arrow functions with expression body that returns JSX\n if (node.type === \"ArrowFunctionExpression\" && node.body && node.body.type !== \"BlockStatement\") {\n if (isJSXNode(node.body)) {\n fnCtx.returnsJsx = true;\n }\n }\n };\n\n const exitFunction = () => {\n const fnCtx = functionStack.pop();\n if (!fnCtx) return;\n\n // Only report if this is a React component (PascalCase name + returns JSX)\n if (!fnCtx.returnsJsx) return;\n if (!isComponentName(fnCtx.name)) return;\n\n // Report all Date instantiations in the top scope of this component\n for (const dateNode of fnCtx.dateInstantiations) {\n context.report({\n node: dateNode,\n message: `Avoid instantiating Date in the top scope of component '${fnCtx.name}'. Date instances change on every render. Move it inside an effect, event handler, or use useMemo/useCallback.`,\n });\n }\n };\n\n /** @param {ReturnStatementNode} node */\n const handleReturnStatement = (node) => {\n const fnCtx = currentFunction();\n if (!fnCtx) return;\n\n const argument = node.argument;\n if (!argument) return;\n\n if (isJSXNode(argument)) {\n fnCtx.returnsJsx = true;\n }\n };\n\n /** @param {NewExpressionNode} node */\n const handleNewExpression = (node) => {\n if (!isDateInstantiation(node)) return;\n\n const fnCtx = currentFunction();\n if (!fnCtx) return;\n\n // Record this Date instantiation - we'll check if it's in top scope when the function exits\n fnCtx.dateInstantiations.push(node);\n };\n\n return /** @type {import(\"oxlint\").VisitorWithHooks} */ ({\n FunctionDeclaration(node) {\n if (isFunctionLike(node)) enterFunction(node);\n },\n \"FunctionDeclaration:exit\": exitFunction,\n FunctionExpression(node) {\n if (isFunctionLike(node)) enterFunction(node);\n },\n \"FunctionExpression:exit\": exitFunction,\n ArrowFunctionExpression(node) {\n if (isFunctionLike(node)) enterFunction(node);\n },\n \"ArrowFunctionExpression:exit\": exitFunction,\n ReturnStatement(node) {\n if (node.type === \"ReturnStatement\") handleReturnStatement(node);\n },\n NewExpression(node) {\n if (node.type === \"NewExpression\") handleNewExpression(node);\n },\n });\n },\n});\n\nexport const noComponentDateInstantiationRule = rule;\n\n","import { defineRule } from \"oxlint\";\n\n/**\n * @typedef {import(\"oxlint\").Context} RuleContext\n * @typedef {import(\"oxlint\").ESTree.Node} ESTNode\n * @typedef {import(\"oxlint\").ESTree.Expression} ESTExpression\n * @typedef {import(\"oxlint\").ESTree.Pattern} ESTPattern\n * @typedef {import(\"oxlint\").ESTree.ReturnStatement} ReturnStatementNode\n * @typedef {import(\"oxlint\").ESTree.VariableDeclarator} VariableDeclaratorNode\n * @typedef {import(\"oxlint\").ESTree.AssignmentExpression} AssignmentExpressionNode\n * @typedef {import(\"oxlint\").ESTree.Function | import(\"oxlint\").ESTree.ArrowFunctionExpression} FunctionLikeNode\n */\n\n/**\n * @typedef {object} RecordedAssignment\n * @property {ESTExpression} node\n * @property {string[]} names\n */\n\n/**\n * @typedef {object} NestedFunctionRecord\n * @property {FunctionLikeNode} node\n * @property {string} name\n */\n\n/**\n * @typedef {object} FunctionContext\n * @property {FunctionLikeNode} node\n * @property {FunctionContext | null} parent\n * @property {string} name\n * @property {boolean} returnsJsx\n * @property {Set<string>} jsxBindingNames\n * @property {RecordedAssignment[]} jsxAssignments\n * @property {NestedFunctionRecord[]} nestedJsxChildren\n */\n\nconst JSX_NODE_TYPES = new Set([\"JSXElement\", \"JSXFragment\"]);\nconst FUNCTION_NODE_TYPES = new Set([\"FunctionDeclaration\", \"FunctionExpression\", \"ArrowFunctionExpression\"]);\n\n/**\n * @param {unknown} name\n * @returns {name is string}\n */\nexport const isComponentName = (name) => typeof name === \"string\" && /^[A-Z]/.test(name);\n\n/**\n * @param {unknown} name\n * @returns {name is string}\n */\nexport const isHookName = (name) => typeof name === \"string\" && name.startsWith(\"use\");\n\n/**\n * @param {unknown} node\n * @returns {node is ESTNode & { type: string }}\n */\nconst isNode = (node) => Boolean(node && typeof node === \"object\" && \"type\" in node);\n\n/**\n * @param {unknown} node\n * @returns {node is FunctionLikeNode}\n */\nconst isFunctionLike = (node) => isNode(node) && FUNCTION_NODE_TYPES.has(node.type);\n\n/**\n * @param {ESTNode | null | undefined} node\n * @returns {FunctionLikeNode | null}\n */\nexport const getEnclosingFunction = (node) => {\n const findFunction = (current) => {\n if (!current) return null;\n if (isFunctionLike(current)) {\n return current;\n }\n return findFunction(isNode(current) ? current.parent ?? null : null);\n };\n return findFunction(isNode(node) ? node.parent ?? null : null);\n};\n\n/**\n * @param {FunctionLikeNode} node\n */\nconst isFunctionUsedAsJsxProp = (node) => {\n const checkJsxProp = (current) => {\n if (!current) return false;\n if (current.type === \"JSXAttribute\") {\n return true;\n }\n if (isFunctionLike(current)) {\n return false;\n }\n return checkJsxProp(isNode(current) ? current.parent ?? null : null);\n };\n return checkJsxProp(isNode(node) ? node.parent ?? null : null);\n};\n\n/**\n * @param {FunctionLikeNode} node\n */\nconst isFunctionImmediatelyInvoked = (node) => {\n const parent = isNode(node) ? node.parent ?? null : null;\n if (!parent) return false;\n\n // Check if the function is the callee of a CallExpression (i.e., it's immediately invoked)\n if (parent.type === \"CallExpression\" && parent.callee === node) {\n return true;\n }\n\n return false;\n};\n\n/**\n * @param {ESTExpression | null | undefined} root\n */\nconst expressionContainsJsx = (root) => {\n if (!root || !isNode(root)) return false;\n\n const stack = [root];\n\n while (stack.length > 0) {\n const current = stack.pop();\n if (!current || !isNode(current)) continue;\n\n if (JSX_NODE_TYPES.has(current.type)) {\n return true;\n }\n\n if (FUNCTION_NODE_TYPES.has(current.type) && current !== root) {\n continue;\n }\n\n for (const key of Object.keys(current)) {\n if (key === \"parent\") continue;\n\n const value = current[key];\n if (!value) continue;\n\n if (Array.isArray(value)) {\n for (const element of value) {\n if (isNode(element)) {\n stack.push(element);\n }\n }\n } else if (isNode(value)) {\n stack.push(value);\n }\n }\n }\n\n return false;\n};\n\n/**\n * @param {ESTExpression | null | undefined} root\n * @param {Set<string>} bindingNames\n */\nconst expressionProducesJsx = (root, bindingNames) => {\n if (!root) return false;\n if (expressionContainsJsx(root)) return true;\n\n if (!isNode(root)) return false;\n\n const type = root.type;\n\n if (type === \"Identifier\") {\n return bindingNames.has(root.name);\n }\n\n if (type === \"ConditionalExpression\") {\n return expressionProducesJsx(root.consequent, bindingNames) || expressionProducesJsx(root.alternate, bindingNames);\n }\n\n if (type === \"LogicalExpression\") {\n return expressionProducesJsx(root.left, bindingNames) || expressionProducesJsx(root.right, bindingNames);\n }\n\n if (type === \"SequenceExpression\") {\n const expressions = root.expressions ?? [];\n const last = expressions[expressions.length - 1] ?? null;\n return expressionProducesJsx(last, bindingNames);\n }\n\n if (type === \"ArrayExpression\") {\n return root.elements.some((element) => {\n if (!element) return false;\n if (element.type === \"SpreadElement\") {\n return expressionProducesJsx(element.argument, bindingNames);\n }\n return expressionProducesJsx(element, bindingNames);\n });\n }\n\n if (type === \"ParenthesizedExpression\") {\n return expressionProducesJsx(root.expression, bindingNames);\n }\n\n if (type === \"AwaitExpression\" || type === \"UnaryExpression\" || type === \"UpdateExpression\") {\n return expressionProducesJsx(root.argument, bindingNames);\n }\n\n if (\n type === \"TSAsExpression\" ||\n type === \"TSTypeAssertion\" ||\n type === \"TSNonNullExpression\" ||\n type === \"ChainExpression\"\n ) {\n return expressionProducesJsx(root.expression, bindingNames);\n }\n\n if (type === \"CallExpression\") {\n return expressionProducesJsx(root.callee, bindingNames);\n }\n\n if (type === \"MemberExpression\") {\n return expressionProducesJsx(root.object, bindingNames);\n }\n\n return false;\n};\n\n/**\n * @param {ESTPattern | null | undefined} pattern\n * @param {string[]} names\n */\nconst collectBindingNames = (pattern, names) => {\n if (!pattern || !isNode(pattern)) return;\n\n const type = pattern.type;\n\n if (type === \"Identifier\") {\n names.push(pattern.name);\n return;\n }\n\n if (type === \"ArrayPattern\") {\n for (const element of pattern.elements) {\n if (!element) continue;\n if (element.type === \"RestElement\") {\n collectBindingNames(element.argument, names);\n } else {\n collectBindingNames(element, names);\n }\n }\n return;\n }\n\n if (type === \"ObjectPattern\") {\n for (const property of pattern.properties) {\n if (!property) continue;\n if (property.type === \"Property\") {\n collectBindingNames(property.value, names);\n } else if (property.type === \"RestElement\") {\n collectBindingNames(property.argument, names);\n }\n }\n return;\n }\n\n if (type === \"AssignmentPattern\") {\n collectBindingNames(pattern.left, names);\n return;\n }\n\n if (type === \"RestElement\") {\n collectBindingNames(pattern.argument, names);\n }\n};\n\n/**\n * @param {FunctionLikeNode} node\n */\nexport const getFunctionName = (node) => {\n if (node.type === \"FunctionDeclaration\" && node.id && node.id.type === \"Identifier\") {\n return node.id.name;\n }\n\n if ((node.type === \"FunctionExpression\" || node.type === \"ArrowFunctionExpression\") && node.id) {\n if (node.id.type === \"Identifier\") return node.id.name;\n }\n\n const parent = node.parent;\n if (!parent || !isNode(parent)) return \"\";\n\n if (parent.type === \"VariableDeclarator\") {\n return parent.id && parent.id.type === \"Identifier\" ? parent.id.name : \"\";\n }\n\n if (parent.type === \"AssignmentExpression\") {\n return parent.left && parent.left.type === \"Identifier\" ? parent.left.name : \"\";\n }\n\n if (parent.type === \"Property\" || parent.type === \"MethodDefinition\") {\n return parent.key && parent.key.type === \"Identifier\" ? parent.key.name : \"\";\n }\n\n // Handle functions passed as arguments to calls (e.g., useCallback, useMemo)\n if (parent.type === \"CallExpression\") {\n const callParent = parent.parent;\n if (callParent && isNode(callParent)) {\n if (callParent.type === \"VariableDeclarator\") {\n return callParent.id && callParent.id.type === \"Identifier\" ? callParent.id.name : \"\";\n }\n if (callParent.type === \"AssignmentExpression\") {\n return callParent.left && callParent.left.type === \"Identifier\" ? callParent.left.name : \"\";\n }\n }\n }\n\n return \"\";\n};\n\n/**\n * @param {string} name\n */\nconst describeFunction = (name) => (name ? `function '${name}'` : \"this function\");\n\n/**\n * @param {string} name\n */\nconst describeNested = (name) => (name ? `function '${name}'` : \"an anonymous function\");\n\n/**\n * @param {string[]} names\n * @param {string} fnName\n */\nconst createAssignmentMessage = (names, fnName) => {\n const target =\n names.length === 0\n ? \"local variables\"\n : names.length === 1\n ? `local '${names[0]}'`\n : `locals ${names.map((name) => `'${name}'`).join(\", \")}`;\n\n return `Avoid storing JSX in ${target} inside ${describeFunction(fnName)}; return the JSX directly instead.`;\n};\n\n/**\n * @param {string} childName\n * @param {string} parentName\n */\nconst createNestedFunctionMessage = (childName, parentName) =>\n `JSX-returning ${describeNested(childName)} should not be declared inside ${describeFunction(parentName)}. Extract it to module scope.`;\n\n/**\n * @param {string} name\n */\nconst createIIFEMessage = (name) =>\n `JSX-returning ${describeNested(name)} should not be declared as an immediately invoked function expression (IIFE). Extract it to a named function at module scope.`;\n\nconst rule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow JSX-returning functions and JSX-valued assignments within other functions that also return JSX.\",\n recommended: false,\n },\n schema: [],\n },\n\n createOnce(context) {\n /** @type {FunctionContext[]} */\n const functionStack = [];\n\n const currentFunction = () => functionStack[functionStack.length - 1] ?? null;\n\n /**\n * @param {FunctionLikeNode} node\n */\n const enterFunction = (node) => {\n const parent = currentFunction();\n /** @type {FunctionContext} */\n const fnCtx = {\n node,\n parent,\n name: getFunctionName(node),\n returnsJsx: false,\n jsxBindingNames: new Set(),\n jsxAssignments: [],\n nestedJsxChildren: [],\n };\n\n functionStack.push(fnCtx);\n\n if (node.type === \"ArrowFunctionExpression\" && node.body && node.body.type !== \"BlockStatement\") {\n if (expressionProducesJsx(node.body, fnCtx.jsxBindingNames)) {\n fnCtx.returnsJsx = true;\n }\n }\n };\n\n const exitFunction = () => {\n const fnCtx = functionStack.pop();\n if (!fnCtx) return;\n\n if (fnCtx.returnsJsx && isFunctionImmediatelyInvoked(fnCtx.node)) {\n context.report({\n node: fnCtx.node,\n message: createIIFEMessage(fnCtx.name),\n });\n return;\n }\n\n if (fnCtx.parent && fnCtx.returnsJsx && fnCtx.name && !isFunctionUsedAsJsxProp(fnCtx.node)) {\n fnCtx.parent.nestedJsxChildren.push({ node: fnCtx.node, name: fnCtx.name });\n }\n\n if (!fnCtx.returnsJsx) return;\n\n for (const assignment of fnCtx.jsxAssignments) {\n context.report({\n node: assignment.node,\n message: createAssignmentMessage(assignment.names, fnCtx.name),\n });\n }\n\n for (const nested of fnCtx.nestedJsxChildren) {\n context.report({\n node: nested.node,\n message: createNestedFunctionMessage(nested.name, fnCtx.name),\n });\n }\n };\n\n /** @param {ReturnStatementNode} node */\n const handleReturnStatement = (node) => {\n const fnCtx = currentFunction();\n if (!fnCtx) return;\n\n const argument = node.argument;\n if (!argument || isFunctionLike(argument)) return;\n\n if (expressionProducesJsx(argument, fnCtx.jsxBindingNames)) {\n fnCtx.returnsJsx = true;\n }\n };\n\n /** @param {VariableDeclaratorNode} node */\n const handleVariableDeclarator = (node) => {\n const fnCtx = currentFunction();\n if (!fnCtx) return;\n\n const init = node.init;\n if (!init || isFunctionLike(init)) return;\n if (!expressionContainsJsx(init)) return;\n\n const names = [];\n collectBindingNames(node.id, names);\n for (const name of names) {\n fnCtx.jsxBindingNames.add(name);\n }\n\n fnCtx.jsxAssignments.push({ node: init, names });\n };\n\n /** @param {AssignmentExpressionNode} node */\n const handleAssignmentExpression = (node) => {\n if (node.operator !== \"=\") return;\n\n const fnCtx = currentFunction();\n if (!fnCtx) return;\n\n const right = node.right;\n if (!right || isFunctionLike(right)) return;\n if (!expressionContainsJsx(right)) return;\n\n const names = [];\n if (node.left && node.left.type === \"Identifier\") {\n names.push(node.left.name);\n fnCtx.jsxBindingNames.add(node.left.name);\n }\n\n fnCtx.jsxAssignments.push({ node: right, names });\n };\n\n /**\n * @param {import(\"oxlint\").ESTree.CallExpression} node\n */\n const handleCallExpression = (node) => {\n const fnCtx = currentFunction();\n if (!fnCtx) return;\n\n // Check for array.push(<JSX>)\n if (\n node.callee &&\n node.callee.type === \"MemberExpression\" &&\n node.callee.property &&\n node.callee.property.type === \"Identifier\" &&\n node.callee.property.name === \"push\"\n ) {\n const arrayObject = node.callee.object;\n if (arrayObject && arrayObject.type === \"Identifier\") {\n const arrayName = arrayObject.name;\n\n // Check if any argument contains JSX\n const hasJsxArgument = node.arguments.some((arg) => {\n if (!arg || arg.type === \"SpreadElement\") return false;\n return expressionContainsJsx(arg);\n });\n\n if (hasJsxArgument) {\n fnCtx.jsxBindingNames.add(arrayName);\n fnCtx.jsxAssignments.push({ node: node, names: [arrayName] });\n }\n }\n }\n };\n\n return /** @type {import(\"oxlint\").VisitorWithHooks} */ ({\n FunctionDeclaration(node) {\n if (isFunctionLike(node)) enterFunction(node);\n },\n \"FunctionDeclaration:exit\": exitFunction,\n FunctionExpression(node) {\n if (isFunctionLike(node)) enterFunction(node);\n },\n \"FunctionExpression:exit\": exitFunction,\n ArrowFunctionExpression(node) {\n if (isFunctionLike(node)) enterFunction(node);\n },\n \"ArrowFunctionExpression:exit\": exitFunction,\n ReturnStatement(node) {\n if (node.type === \"ReturnStatement\") handleReturnStatement(node);\n },\n VariableDeclarator(node) {\n if (node.type === \"VariableDeclarator\") handleVariableDeclarator(node);\n },\n AssignmentExpression(node) {\n if (node.type === \"AssignmentExpression\") handleAssignmentExpression(node);\n },\n CallExpression(node) {\n if (node.type === \"CallExpression\") handleCallExpression(node);\n },\n });\n },\n});\n\nexport const noInlineComponentsRule = rule;\n\n","import { defineRule } from \"oxlint\";\nimport { getFunctionName, getEnclosingFunction, isComponentName } from \"./no-inline-components.js\";\n\n/**\n * @typedef {import(\"oxlint\").Context} RuleContext\n * @typedef {import(\"oxlint\").ESTree.Node} ESTNode\n * @typedef {import(\"oxlint\").ESTree.Function | import(\"oxlint\").ESTree.ArrowFunctionExpression} FunctionLikeNode\n * @typedef {import(\"oxlint\").ESTree.VariableDeclarator} VariableDeclaratorNode\n */\n\nconst FUNCTION_NODE_TYPES = new Set([\"FunctionDeclaration\", \"FunctionExpression\", \"ArrowFunctionExpression\"]);\n\n/**\n * @param {unknown} node\n * @returns {node is ESTNode & { type: string }}\n */\nconst isNode = (node) => Boolean(node && typeof node === \"object\" && \"type\" in node);\n\n/**\n * @param {unknown} node\n * @returns {node is FunctionLikeNode}\n */\nconst isFunctionLike = (node) => isNode(node) && FUNCTION_NODE_TYPES.has(node.type);\n\n/**\n * Checks if a node is a React Hook call (e.g., useState, useEffect, useCallback)\n * @param {ESTNode} node\n * @returns {boolean}\n */\nconst isReactHookCall = (node) => {\n if (node.type !== \"CallExpression\") return false;\n\n const callee = node.callee;\n if (!callee) return false;\n\n // Direct hook calls like useState()\n if (callee.type === \"Identifier\" && callee.name.startsWith(\"use\")) {\n return true;\n }\n\n // React.useState(), React.useEffect(), etc.\n if (\n callee.type === \"MemberExpression\" &&\n callee.object &&\n callee.object.type === \"Identifier\" &&\n callee.object.name === \"React\" &&\n callee.property &&\n callee.property.type === \"Identifier\" &&\n callee.property.name.startsWith(\"use\")\n ) {\n return true;\n }\n\n return false;\n};\n\n/**\n * Checks if a node contains JSX\n * @param {ESTNode} node\n * @returns {boolean}\n */\nconst containsJSX = (node) => {\n if (!node || !isNode(node)) return false;\n\n const stack = [node];\n\n while (stack.length > 0) {\n const current = stack.pop();\n if (!current || !isNode(current)) continue;\n\n if (current.type === \"JSXElement\" || current.type === \"JSXFragment\") {\n return true;\n }\n\n // Don't traverse into nested functions\n if (isFunctionLike(current) && current !== node) {\n continue;\n }\n\n for (const key of Object.keys(current)) {\n if (key === \"parent\") continue;\n\n const value = current[key];\n if (!value) continue;\n\n if (Array.isArray(value)) {\n for (const element of value) {\n if (isNode(element)) {\n stack.push(element);\n }\n }\n } else if (isNode(value)) {\n stack.push(value);\n }\n }\n }\n\n return false;\n};\n\n/**\n * Checks if a function accesses variables from its enclosing scope\n * (excluding function parameters and locally declared variables)\n * @param {FunctionLikeNode} node\n * @param {Set<string>} localNames - Names of local variables and parameters\n * @returns {boolean}\n */\nconst accessesEnclosingScope = (node, localNames) => {\n if (!node.body) return false;\n\n const body = node.body;\n\n // For arrow functions with expression bodies\n if (body.type !== \"BlockStatement\") {\n return checkExpressionForScopeAccess(body, localNames);\n }\n\n // For block statements\n return checkNodeForScopeAccess(body, localNames);\n};\n\n/**\n * @param {ESTNode} node\n * @param {Set<string>} localNames\n * @returns {boolean}\n */\nconst checkNodeForScopeAccess = (node, localNames) => {\n if (!node || !isNode(node)) return false;\n\n const stack = [node];\n\n while (stack.length > 0) {\n const current = stack.pop();\n if (!current || !isNode(current)) continue;\n\n // If we find an identifier reference, check if it's external\n if (current.type === \"Identifier\") {\n const parent = current.parent;\n\n // Skip if this identifier is part of a declaration\n if (\n parent &&\n isNode(parent) &&\n (parent.type === \"VariableDeclarator\" ||\n parent.type === \"FunctionDeclaration\" ||\n (parent.type === \"Property\" && parent.key === current))\n ) {\n continue;\n }\n\n // If the identifier is not in our local names, it's from enclosing scope\n if (!localNames.has(current.name)) {\n // Exclude global objects and common globals\n const globalNames = new Set([\n \"console\",\n \"Math\",\n \"Date\",\n \"JSON\",\n \"Object\",\n \"Array\",\n \"String\",\n \"Number\",\n \"Boolean\",\n \"parseInt\",\n \"parseFloat\",\n \"isNaN\",\n \"isFinite\",\n \"undefined\",\n \"null\",\n \"true\",\n \"false\",\n \"Infinity\",\n \"NaN\",\n \"Map\",\n \"Set\",\n \"WeakMap\",\n \"WeakSet\",\n \"Promise\",\n \"Symbol\",\n \"Error\",\n \"TypeError\",\n \"ReferenceError\",\n \"SyntaxError\",\n ]);\n\n if (!globalNames.has(current.name)) {\n return true;\n }\n }\n }\n\n // Don't traverse into nested functions\n if (isFunctionLike(current) && current !== node) {\n continue;\n }\n\n for (const key of Object.keys(current)) {\n if (key === \"parent\") continue;\n\n const value = current[key];\n if (!value) continue;\n\n if (Array.isArray(value)) {\n for (const element of value) {\n if (isNode(element)) {\n stack.push(element);\n }\n }\n } else if (isNode(value)) {\n stack.push(value);\n }\n }\n }\n\n return false;\n};\n\n/**\n * @param {ESTNode} node\n * @param {Set<string>} localNames\n * @returns {boolean}\n */\nconst checkExpressionForScopeAccess = (node, localNames) => {\n return checkNodeForScopeAccess(node, localNames);\n};\n\n/**\n * Collects all local variable names including parameters\n * @param {FunctionLikeNode} node\n * @returns {Set<string>}\n */\nconst collectLocalNames = (node) => {\n const names = new Set();\n\n // Add parameter names\n if (node.params) {\n for (const param of node.params) {\n collectPatternNames(param, names);\n }\n }\n\n // Add locally declared variables\n if (node.body && node.body.type === \"BlockStatement\") {\n for (const statement of node.body.body) {\n if (statement.type === \"VariableDeclaration\") {\n for (const declarator of statement.declarations) {\n collectPatternNames(declarator.id, names);\n }\n }\n }\n }\n\n return names;\n};\n\n/**\n * @param {import(\"oxlint\").ESTree.Pattern} pattern\n * @param {Set<string>} names\n */\nconst collectPatternNames = (pattern, names) => {\n if (!pattern || !isNode(pattern)) return;\n\n if (pattern.type === \"Identifier\") {\n names.add(pattern.name);\n return;\n }\n\n if (pattern.type === \"ArrayPattern\") {\n for (const element of pattern.elements) {\n if (!element) continue;\n if (element.type === \"RestElement\") {\n collectPatternNames(element.argument, names);\n } else {\n collectPatternNames(element, names);\n }\n }\n return;\n }\n\n if (pattern.type === \"ObjectPattern\") {\n for (const property of pattern.properties) {\n if (!property) continue;\n if (property.type === \"Property\") {\n collectPatternNames(property.value, names);\n } else if (property.type === \"RestElement\") {\n collectPatternNames(property.argument, names);\n }\n }\n return;\n }\n\n if (pattern.type === \"AssignmentPattern\") {\n collectPatternNames(pattern.left, names);\n return;\n }\n\n if (pattern.type === \"RestElement\") {\n collectPatternNames(pattern.argument, names);\n }\n};\n\n/**\n * Checks if a function is likely a React component\n * @param {FunctionLikeNode} node\n * @returns {boolean}\n */\nconst isReactComponent = (node) => {\n const name = getFunctionName(node);\n\n // Must start with capital letter\n if (!isComponentName(name)) {\n return false;\n }\n\n // Check if it returns JSX or uses hooks\n return containsJSX(node) || containsHooks(node);\n};\n\n/**\n * Checks if a function contains React Hook calls\n * @param {FunctionLikeNode} node\n * @returns {boolean}\n */\nconst containsHooks = (node) => {\n if (!node.body) return false;\n\n const stack = [node.body];\n\n while (stack.length > 0) {\n const current = stack.pop();\n if (!current || !isNode(current)) continue;\n\n if (isReactHookCall(current)) {\n return true;\n }\n\n // Don't traverse into nested functions\n if (isFunctionLike(current) && current !== node.body) {\n continue;\n }\n\n for (const key of Object.keys(current)) {\n if (key === \"parent\") continue;\n\n const value = current[key];\n if (!value) continue;\n\n if (Array.isArray(value)) {\n for (const element of value) {\n if (isNode(element)) {\n stack.push(element);\n }\n }\n } else if (isNode(value)) {\n stack.push(value);\n }\n }\n }\n\n return false;\n};\n\n/**\n * Checks if a function is wrapped in a React Hook (useCallback, useMemo, etc.)\n * @param {FunctionLikeNode} node\n * @returns {boolean}\n */\nconst isWrappedInHook = (node) => {\n const parent = node.parent;\n if (!parent || !isNode(parent)) return false;\n\n if (parent.type === \"CallExpression\" && isReactHookCall(parent)) {\n return true;\n }\n\n return false;\n};\n\n/**\n * Checks if a function is pure (doesn't access component scope, hooks, or JSX)\n * @param {FunctionLikeNode} node\n * @returns {boolean}\n */\nconst isPureFunction = (node) => {\n // Must not contain JSX\n if (containsJSX(node)) return false;\n\n // Must not contain hooks\n if (containsHooks(node)) return false;\n\n // Must not be wrapped in a hook like useCallback or useMemo\n if (isWrappedInHook(node)) return false;\n\n // Must not access variables from enclosing scope (except globals)\n const localNames = collectLocalNames(node);\n if (accessesEnclosingScope(node, localNames)) return false;\n\n return true;\n};\n\nconst rule = defineRule({\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Recommend extracting pure functions from React components to module scope for better performance and readability.\",\n recommended: false,\n },\n schema: [],\n },\n\n createOnce(context) {\n /**\n * @param {VariableDeclaratorNode} node\n */\n const handleVariableDeclarator = (node) => {\n // Only check arrow functions and function expressions\n const init = node.init;\n if (!init || !isFunctionLike(init)) return;\n\n // Get the enclosing function (should be a component)\n const enclosingFunction = getEnclosingFunction(node);\n if (!enclosingFunction) return;\n\n // The enclosing function must be a React component\n if (!isReactComponent(enclosingFunction)) return;\n\n // Check if the inner function is pure\n if (!isPureFunction(init)) return;\n\n const functionName = node.id && node.id.type === \"Identifier\" ? node.id.name : \"this function\";\n const componentName = getFunctionName(enclosingFunction);\n\n context.report({\n node: init,\n message: `Pure function '${functionName}' can be extracted outside of component '${componentName}' to improve performance and readability.`,\n });\n };\n\n return /** @type {import(\"oxlint\").VisitorWithHooks} */ ({\n VariableDeclarator(node) {\n if (node.type === \"VariableDeclarator\") handleVariableDeclarator(node);\n },\n });\n },\n});\n\nexport const noComponentPureFunctionsRule = rule;\n","import { defineRule } from \"oxlint\";\n\n/** @typedef {import(\"oxlint\").ESTree.Node} ESTNode */\n\nconst rule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow the 'delete' operator\",\n recommended: true,\n },\n schema: [],\n },\n createOnce(context) {\n return /** @type {import(\"oxlint\").VisitorWithHooks} */ ({\n /**\n * @param {ESTNode} node\n */\n UnaryExpression(node) {\n if (node.type !== \"UnaryExpression\") return;\n\n if (node.operator === \"delete\") {\n context.report({\n node,\n message:\n \"Use of 'delete' operator is disallowed. Use object destructuring or set properties to undefined instead.\",\n });\n }\n },\n });\n },\n});\n\nexport const noDeleteRule = rule;\n","import { defineRule } from \"oxlint\";\n\n/** @typedef {import(\"oxlint\").ESTree.Node} ESTNode */\n\n/**\n * Regex pattern to match emojis\n * Covers most common emoji ranges in Unicode\n */\nconst EMOJI_REGEX =\n /[\\u{1F300}-\\u{1F9FF}\\u{2600}-\\u{26FF}\\u{2700}-\\u{27BF}\\u{1F000}-\\u{1F02F}\\u{1F0A0}-\\u{1F0FF}\\u{1F100}-\\u{1F64F}\\u{1F680}-\\u{1F6FF}\\u{1F900}-\\u{1F9FF}\\u{1FA00}-\\u{1FA6F}\\u{1FA70}-\\u{1FAFF}\\u{FE00}-\\u{FE0F}\\u{203C}\\u{2049}\\u{20E3}\\u{2139}\\u{2194}-\\u{2199}\\u{21A9}-\\u{21AA}\\u{231A}-\\u{231B}\\u{2328}\\u{23CF}\\u{23E9}-\\u{23F3}\\u{23F8}-\\u{23FA}\\u{24C2}\\u{25AA}-\\u{25AB}\\u{25B6}\\u{25C0}\\u{25FB}-\\u{25FE}\\u{2600}-\\u{2604}\\u{260E}\\u{2611}\\u{2614}-\\u{2615}\\u{2618}\\u{261D}\\u{2620}\\u{2622}-\\u{2623}\\u{2626}\\u{262A}\\u{262E}-\\u{262F}\\u{2638}-\\u{263A}\\u{2640}\\u{2642}\\u{2648}-\\u{2653}\\u{265F}-\\u{2660}\\u{2663}\\u{2665}-\\u{2666}\\u{2668}\\u{267B}\\u{267E}-\\u{267F}\\u{2692}-\\u{2697}\\u{2699}\\u{269B}-\\u{269C}\\u{26A0}-\\u{26A1}\\u{26A7}\\u{26AA}-\\u{26AB}\\u{26B0}-\\u{26B1}\\u{26BD}-\\u{26BE}\\u{26C4}-\\u{26C5}\\u{26C8}\\u{26CE}\\u{26CF}\\u{26D1}\\u{26D3}-\\u{26D4}\\u{26E9}-\\u{26EA}\\u{26F0}-\\u{26F5}\\u{26F7}-\\u{26FA}\\u{26FD}\\u{2702}\\u{2705}\\u{2708}-\\u{270D}\\u{270F}\\u{2712}\\u{2714}\\u{2716}\\u{271D}\\u{2721}\\u{2728}\\u{2733}-\\u{2734}\\u{2744}\\u{2747}\\u{274C}\\u{274E}\\u{2753}-\\u{2755}\\u{2757}\\u{2763}-\\u{2764}\\u{2795}-\\u{2797}\\u{27A1}\\u{27B0}\\u{27BF}\\u{2934}-\\u{2935}\\u{2B05}-\\u{2B07}\\u{2B1B}-\\u{2B1C}\\u{2B50}\\u{2B55}\\u{3030}\\u{303D}\\u{3297}\\u{3299}]/gu;\n\n/**\n * Find emojis in a string\n * @param {string} text\n * @returns {RegExpMatchArray | null}\n */\nconst findEmojis = (text) => {\n return text.match(EMOJI_REGEX);\n};\n\n/**\n * Get a preview of the emoji found\n * @param {string} text\n * @returns {string}\n */\nconst getEmojiPreview = (text) => {\n const emojis = findEmojis(text);\n if (!emojis || emojis.length === 0) return \"\";\n\n const uniqueEmojis = [...new Set(emojis)];\n const preview = uniqueEmojis.slice(0, 3).join(\" \");\n\n return uniqueEmojis.length > 3 ? `${preview} ...` : preview;\n};\n\nconst rule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow the use of emojis in code. Use icons from a component library instead.\",\n recommended: true,\n },\n schema: [],\n },\n createOnce(context) {\n return /** @type {import(\"oxlint\").VisitorWithHooks} */ ({\n /**\n * Check string literals\n * @param {ESTNode} node\n */\n StringLiteral(node) {\n if (node.type !== \"StringLiteral\") return;\n\n const emojis = findEmojis(node.value);\n if (emojis && emojis.length > 0) {\n const preview = getEmojiPreview(node.value);\n context.report({\n node,\n message: `Emojis are not allowed in code. Found: ${preview}. Use icons from a component library instead.`,\n });\n }\n },\n\n /**\n * Check template literals\n * @param {ESTNode} node\n */\n TemplateLiteral(node) {\n if (node.type !== \"TemplateLiteral\") return;\n\n // Check each quasi (template string part)\n for (const quasi of node.quasis) {\n if (quasi.type !== \"TemplateElement\") continue;\n\n const text = quasi.value.raw;\n const emojis = findEmojis(text);\n\n if (emojis && emojis.length > 0) {\n const preview = getEmojiPreview(text);\n context.report({\n node: quasi,\n message: `Emojis are not allowed in code. Found: ${preview}. Use icons from a component library instead.`,\n });\n }\n }\n },\n\n /**\n * Check JSX text\n * @param {ESTNode} node\n */\n JSXText(node) {\n if (node.type !== \"JSXText\") return;\n\n const emojis = findEmojis(node.value);\n if (emojis && emojis.length > 0) {\n const preview = getEmojiPreview(node.value);\n context.report({\n node,\n message: `Emojis are not allowed in code. Found: ${preview}. Use icons from a component library instead.`,\n });\n }\n },\n });\n },\n});\n\nexport const noEmojiRule = rule;\n\n","import { defineRule } from \"oxlint\";\n\n/** @typedef {import(\"oxlint\").ESTree.Node} ESTNode */\n\nconst rule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow 'finally' blocks in try/catch/finally statements\",\n recommended: true,\n },\n schema: [],\n },\n createOnce(context) {\n return /** @type {import(\"oxlint\").VisitorWithHooks} */ ({\n /**\n * @param {ESTNode} node\n */\n TryStatement(node) {\n if (node.type !== \"TryStatement\") return;\n\n if (node.finalizer) {\n context.report({\n node: node.finalizer,\n message: \"Use of 'finally' blocks is disallowed. Handle cleanup explicitly in try/catch blocks instead.\",\n });\n }\n },\n });\n },\n});\n\nexport const noFinallyRule = rule;\n\n","import { defineRule } from \"oxlint\";\r\n\r\n/** @typedef {import(\"oxlint\").ESTree.Node} ESTNode */\r\n\r\nconst rule = defineRule({\r\n meta: {\r\n type: \"problem\",\r\n docs: {\r\n description: \"Disallow Immediately Invoked Function Expressions (IIFE)\",\r\n recommended: true,\r\n },\r\n schema: [],\r\n },\r\n createOnce(context) {\r\n return /** @type {import(\"oxlint\").VisitorWithHooks} */ ({\r\n /**\r\n * @param {ESTNode} node\r\n */\r\n CallExpression(node) {\r\n if (node.type !== \"CallExpression\") return;\r\n\r\n const { callee } = node;\r\n\r\n // Check if callee is a FunctionExpression or ArrowFunctionExpression\r\n if (\r\n callee.type === \"FunctionExpression\" ||\r\n callee.type === \"ArrowFunctionExpression\"\r\n ) {\r\n context.report({\r\n node,\r\n message:\r\n \"Immediately Invoked Function Expressions (IIFE) are disallowed. Use a regular function declaration or block scope instead.\",\r\n });\r\n }\r\n },\r\n });\r\n },\r\n});\r\n\r\nexport const noIifeRule = rule;\r\n","import { defineRule } from \"oxlint\";\n\n/** @typedef {import(\"oxlint\").ESTree.Node} ESTNode */\n\n/**\n * Check if a MemberExpression is accessing the React namespace\n * @param {ESTNode} node\n * @returns {boolean}\n */\nconst isReactNamespaceAccess = (node) => {\n if (node.type !== \"MemberExpression\") return false;\n\n const object = node.object;\n if (!object || object.type !== \"Identifier\" || object.name !== \"React\") {\n return false;\n }\n\n return true;\n};\n\n/**\n * Check if this is a type annotation context (TypeScript)\n * @param {ESTNode} node\n * @returns {boolean}\n */\nconst isTypeContext = (node) => {\n const checkParent = (current) => {\n if (!current) return false;\n\n // Type annotation contexts where React namespace is allowed\n const typeContextTypes = new Set([\n \"TSTypeReference\",\n \"TSTypeAnnotation\",\n \"TSTypeParameterInstantiation\",\n \"TSInterfaceHeritage\",\n \"TSTypeQuery\",\n \"TSTypeAliasDeclaration\",\n \"TSInterfaceDeclaration\",\n \"TSTypeLiteral\",\n \"TSPropertySignature\",\n \"TSIndexSignature\",\n \"TSMethodSignature\",\n \"TSCallSignatureDeclaration\",\n \"TSConstructSignatureDeclaration\",\n \"TSExpressionWithTypeArguments\",\n ]);\n\n if (typeContextTypes.has(current.type)) {\n return true;\n }\n\n // Stop at statement or expression boundaries\n if (\n current.type === \"ExpressionStatement\" ||\n current.type === \"VariableDeclarator\" ||\n current.type === \"CallExpression\" ||\n current.type === \"ReturnStatement\"\n ) {\n return false;\n }\n\n return checkParent(current.parent);\n };\n\n return checkParent(node.parent);\n};\n\nconst rule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow using the React namespace for accessing React APIs. Use destructured imports instead (e.g., import { useState } from 'react').\",\n recommended: true,\n },\n schema: [],\n },\n createOnce(context) {\n return /** @type {import(\"oxlint\").VisitorWithHooks} */ ({\n /**\n * @param {ESTNode} node\n */\n MemberExpression(node) {\n if (node.type !== \"MemberExpression\") return;\n\n if (!isReactNamespaceAccess(node)) return;\n\n // Allow React namespace in type annotations\n if (isTypeContext(node)) return;\n\n const propertyName = node.property && node.property.type === \"Identifier\" ? node.property.name : \"property\";\n\n context.report({\n node,\n message: `Avoid using 'React.${propertyName}'. Import '${propertyName}' directly from 'react' instead (e.g., import { ${propertyName} } from 'react').`,\n });\n },\n });\n },\n});\n\nexport const noReactNamespaceRule = rule;\n\n","import { defineRule } from \"oxlint\";\n\n/** @typedef {import(\"oxlint\").ESTree.Node} ESTNode */\n\nexport const noSwitchRule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow switch/case statements\",\n recommended: true,\n },\n schema: [],\n },\n createOnce(context) {\n return /** @type {import(\"oxlint\").VisitorWithHooks} */ ({\n /**\n * @param {ESTNode} node\n */\n SwitchStatement(node) {\n if (node.type !== \"SwitchStatement\") return;\n\n context.report({\n node,\n message: \"Use of switch/case is disallowed. Use object map or if/else instead.\",\n });\n },\n });\n },\n});\n","import { defineRule } from \"oxlint\";\n\n/** @typedef {import(\"oxlint\").ESTree.Node} ESTNode */\n\n/**\n * Get the enclosing function node for a given node\n * @param {ESTNode} node\n * @returns {ESTNode | null}\n */\nconst getEnclosingFunction = (node) => {\n const findFunction = (current) => {\n if (!current) return null;\n if (\n current.type === \"FunctionDeclaration\" ||\n current.type === \"FunctionExpression\" ||\n current.type === \"ArrowFunctionExpression\"\n ) {\n return current;\n }\n return findFunction(current.parent);\n };\n return findFunction(node.parent);\n};\n\n/**\n * Check if a node is inside a loop\n * @param {ESTNode} node\n * @param {ESTNode} stopAt - Stop searching when we reach this node\n * @returns {boolean}\n */\nconst isInsideLoop = (node, stopAt) => {\n const checkLoop = (current) => {\n if (!current || current === stopAt) return false;\n if (\n current.type === \"ForStatement\" ||\n current.type === \"ForInStatement\" ||\n current.type === \"ForOfStatement\" ||\n current.type === \"WhileStatement\" ||\n current.type === \"DoWhileStatement\"\n ) {\n return true;\n }\n return checkLoop(current.parent);\n };\n return checkLoop(node.parent);\n};\n\nconst rule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow top-level `let` declarations inside functions to prevent conditional reassignment.\",\n recommended: false,\n },\n schema: [],\n },\n\n createOnce(context) {\n return /** @type {import(\"oxlint\").VisitorWithHooks} */ ({\n /**\n * @param {ESTNode} rawNode\n */\n VariableDeclaration(rawNode) {\n if (rawNode.type !== \"VariableDeclaration\") return;\n const node = rawNode;\n\n if (node.kind !== \"let\") return;\n\n const fn = getEnclosingFunction(node);\n if (\n !fn ||\n (fn.type !== \"FunctionDeclaration\" &&\n fn.type !== \"FunctionExpression\" &&\n fn.type !== \"ArrowFunctionExpression\")\n ) {\n return;\n }\n\n const parent = node.parent;\n if (!parent || parent.type !== \"BlockStatement\" || parent.parent !== fn) return;\n\n // Allow let declarations inside loops\n if (isInsideLoop(node, fn)) return;\n\n context.report({\n node,\n message:\n \"Avoid using `let` at the top level of functions; prefer `const` with extracted functions to avoid conditional reassignment. Extract conditional logic into a separate function that returns the appropriate value.\",\n });\n },\n });\n },\n});\n\nexport const noTopLevelLetRule = rule;\n\n","import { defineRule } from \"oxlint\";\n\n/** @typedef {import(\"oxlint\").ESTree.Node} ESTNode */\n\nconst rule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow TypeScript type assertions (`as` and angle-bracket syntax) to prevent unsafe type casting.\",\n recommended: false,\n },\n schema: [],\n },\n\n createOnce(context) {\n return /** @type {import(\"oxlint\").VisitorWithHooks} */ ({\n /**\n * @param {ESTNode} rawNode\n */\n TSAsExpression(rawNode) {\n if (rawNode.type !== \"TSAsExpression\") return;\n\n // Allow \"as const\" assertions\n if (\n rawNode.typeAnnotation.type === \"TSTypeReference\" &&\n rawNode.typeAnnotation.typeName.type === \"Identifier\" &&\n rawNode.typeAnnotation.typeName.name === \"const\"\n ) {\n return;\n }\n\n context.report({\n node: rawNode,\n message:\n \"Type casting with `as` is not permitted. Use runtime validation with valibot or refactor to avoid type casting.\",\n });\n },\n\n /**\n * @param {ESTNode} rawNode\n */\n TSTypeAssertion(rawNode) {\n if (rawNode.type !== \"TSTypeAssertion\") return;\n\n context.report({\n node: rawNode,\n message:\n \"Type casting with angle brackets `<Type>` is not permitted. Use runtime validation with valibot or refactor to avoid type casting.\",\n });\n },\n\n /**\n * @param {ESTNode} rawNode\n */\n TSNonNullExpression(rawNode) {\n if (rawNode.type !== \"TSNonNullExpression\") return;\n\n context.report({\n node: rawNode,\n message:\n \"Non-null assertion operator `!` is not permitted. Handle null/undefined cases explicitly or use optional chaining.\",\n });\n },\n });\n },\n});\n\nexport const noTypeCastRule = rule;\n\n","import { defineRule } from \"oxlint\";\n\n/**\n * @typedef {import(\"oxlint\").Context} RuleContext\n * @typedef {import(\"oxlint\").ESTree.Node} ESTNode\n * @typedef {import(\"oxlint\").ESTree.Expression} ESTExpression\n * @typedef {import(\"oxlint\").ESTree.Function | import(\"oxlint\").ESTree.ArrowFunctionExpression} FunctionLikeNode\n */\n\nconst JSX_NODE_TYPES = new Set([\"JSXElement\", \"JSXFragment\"]);\nconst FUNCTION_NODE_TYPES = new Set([\"FunctionDeclaration\", \"FunctionExpression\", \"ArrowFunctionExpression\"]);\n\n/**\n * @param {unknown} node\n * @returns {node is ESTNode & { type: string }}\n */\nconst isNode = (node) => Boolean(node && typeof node === \"object\" && \"type\" in node);\n\n/**\n * @param {unknown} node\n * @returns {node is FunctionLikeNode}\n */\nconst isFunctionLike = (node) => isNode(node) && FUNCTION_NODE_TYPES.has(node.type);\n\n/**\n * Check if an expression contains JSX\n * @param {ESTExpression | null | undefined} root\n */\nconst expressionContainsJsx = (root) => {\n if (!root || !isNode(root)) return false;\n\n const stack = [root];\n\n while (stack.length > 0) {\n const current = stack.pop();\n if (!current || !isNode(current)) continue;\n\n if (JSX_NODE_TYPES.has(current.type)) {\n return true;\n }\n\n if (FUNCTION_NODE_TYPES.has(current.type) && current !== root) {\n continue;\n }\n\n for (const key of Object.keys(current)) {\n if (key === \"parent\") continue;\n\n const value = current[key];\n if (!value) continue;\n\n if (Array.isArray(value)) {\n for (const element of value) {\n if (isNode(element)) {\n stack.push(element);\n }\n }\n } else if (isNode(value)) {\n stack.push(value);\n }\n }\n }\n\n return false;\n};\n\n/**\n * Check if a function returns JSX\n * @param {FunctionLikeNode} node\n */\nconst functionReturnsJsx = (node) => {\n // Check arrow functions with expression body\n if (node.type === \"ArrowFunctionExpression\" && node.body && node.body.type !== \"BlockStatement\") {\n return expressionContainsJsx(node.body);\n }\n\n // Check for return statements in function body\n const body = node.body;\n if (!body || body.type !== \"BlockStatement\") return false;\n\n const stack = [body];\n while (stack.length > 0) {\n const current = stack.pop();\n if (!current || !isNode(current)) continue;\n\n if (current.type === \"ReturnStatement\") {\n const argument = current.argument;\n if (argument && expressionContainsJsx(argument)) {\n return true;\n }\n }\n\n // Don't traverse into nested functions\n if (FUNCTION_NODE_TYPES.has(current.type) && current !== body) {\n continue;\n }\n\n for (const key of Object.keys(current)) {\n if (key === \"parent\") continue;\n\n const value = current[key];\n if (!value) continue;\n\n if (Array.isArray(value)) {\n for (const element of value) {\n if (isNode(element)) {\n stack.push(element);\n }\n }\n } else if (isNode(value)) {\n stack.push(value);\n }\n }\n }\n\n return false;\n};\n\nconst rule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description: \"Enforce consistent props parameter naming and disallow destructuring in component parameters.\",\n recommended: false,\n },\n schema: [],\n },\n\n createOnce(context) {\n /**\n * Check if a node is at the top level of the file (module scope)\n * @param {FunctionLikeNode} node\n * @returns {boolean}\n */\n const isTopLevel = (node) => {\n let current = node.parent;\n\n while (current && isNode(current)) {\n // If we hit a Program node, we're at the top level\n if (current.type === \"Program\") {\n return true;\n }\n\n // FunctionDeclarations at the Program level will have Program as parent\n if (node.type === \"FunctionDeclaration\" && current.type === \"Program\") {\n return true;\n }\n\n // For variable declarations: const MyComponent = () => {}\n // The hierarchy is: ArrowFunction -> VariableDeclarator -> VariableDeclaration -> Program\n if (current.type === \"VariableDeclaration\") {\n const parent = current.parent;\n if (parent && isNode(parent) && parent.type === \"Program\") {\n return true;\n }\n }\n\n // If we encounter a function, we're inside a nested function\n if (FUNCTION_NODE_TYPES.has(current.type)) {\n return false;\n }\n\n current = current.parent;\n }\n\n return false;\n };\n\n /**\n * Check if a function is a top-level React component (PascalCase naming at top level)\n * @param {FunctionLikeNode} node\n * @returns {boolean}\n */\n const isTopLevelReactComponent = (node) => {\n // First check if it's at the top level\n if (!isTopLevel(node)) {\n return false;\n }\n\n // Check for named functions (FunctionDeclaration, FunctionExpression with id)\n if (node.id?.name) {\n const firstChar = node.id.name.charAt(0);\n return firstChar === firstChar.toUpperCase();\n }\n\n // For arrow functions and anonymous function expressions, check the parent context\n // to see if they're assigned to a PascalCase variable\n const parent = node.parent;\n if (!parent || !isNode(parent)) {\n return false;\n }\n\n // Check for variable declarations: const MyComponent = () => {}\n if (parent.type === \"VariableDeclarator\" && parent.id && \"name\" in parent.id) {\n const name = parent.id.name;\n if (typeof name === \"string\") {\n const firstChar = name.charAt(0);\n return firstChar === firstChar.toUpperCase();\n }\n }\n\n return false;\n };\n\n /**\n * @param {FunctionLikeNode} node\n */\n const checkFunction = (node) => {\n // Only check functions that return JSX (React components)\n if (!functionReturnsJsx(node)) {\n return;\n }\n\n // Only check functions that are top-level React components (PascalCase naming at top level)\n if (!isTopLevelReactComponent(node)) {\n return;\n }\n\n const params = node.params;\n if (!params || params.length === 0) {\n return;\n }\n\n const firstParam = params[0];\n if (!firstParam || !isNode(firstParam)) {\n return;\n }\n\n // Check if the first parameter is destructured\n if (firstParam.type === \"ObjectPattern\" || firstParam.type === \"ArrayPattern\") {\n context.report({\n node: firstParam,\n message:\n \"Props should not be destructured in the component parameter. Use 'props' instead and destructure inside the component body.\",\n });\n return;\n }\n\n // Check if the first parameter is an Identifier and is named 'props'\n if (firstParam.type === \"Identifier\") {\n if (firstParam.name !== \"props\") {\n context.report({\n node: firstParam,\n message: `Props parameter should be named 'props', not '${firstParam.name}'.`,\n });\n }\n }\n };\n\n return /** @type {import(\"oxlint\").VisitorWithHooks} */ ({\n FunctionDeclaration(node) {\n if (isFunctionLike(node)) checkFunction(node);\n },\n FunctionExpression(node) {\n if (isFunctionLike(node)) checkFunction(node);\n },\n ArrowFunctionExpression(node) {\n if (isFunctionLike(node)) checkFunction(node);\n },\n });\n },\n});\n\nexport const prettyPropsRule = rule;\n","import { definePlugin } from \"oxlint\";\n\nimport { jsxComponentPascalCaseRule } from \"./jsx-component-pascal-case.js\";\nimport { noArrayTypeRule } from \"./no-array-type.js\";\nimport { noComponentDateInstantiationRule } from \"./no-component-date-instantiation.js\";\nimport { noComponentPureFunctionsRule } from \"./no-component-pure-functions.js\";\nimport { noDeleteRule } from \"./no-delete.js\";\nimport { noEmojiRule } from \"./no-emoji.js\";\nimport { noFinallyRule } from \"./no-finally.js\";\nimport { noIifeRule } from \"./no-iife.js\";\nimport { noInlineComponentsRule } from \"./no-inline-components.js\";\nimport { noReactNamespaceRule } from \"./no-react-namespace.js\";\nimport { noSwitchRule } from \"./no-switch-plugin.js\";\nimport { noTopLevelLetRule } from \"./no-top-level-let.js\";\nimport { noTypeCastRule } from \"./no-type-cast.js\";\nimport { prettyPropsRule } from \"./pretty-props.js\";\n\nconst plugin = definePlugin({\n meta: {\n name: \"conorroberts\",\n },\n rules: {\n \"jsx-component-pascal-case\": jsxComponentPascalCaseRule,\n \"no-array-type\": noArrayTypeRule,\n \"no-component-date-instantiation\": noComponentDateInstantiationRule,\n \"no-component-pure-functions\": noComponentPureFunctionsRule,\n \"no-delete\": noDeleteRule,\n \"no-emoji\": noEmojiRule,\n \"no-finally\": noFinallyRule,\n \"no-iife\": noIifeRule,\n \"no-inline-components\": noInlineComponentsRule,\n \"no-react-namespace\": noReactNamespaceRule,\n \"no-switch\": noSwitchRule,\n \"no-top-level-let\": noTopLevelLetRule,\n \"no-type-cast\": noTypeCastRule,\n \"pretty-props\": prettyPropsRule,\n },\n});\n\nexport default plugin;\n"],"mappings":";;;;;;;;;;;;;;;;AAiBA,MAAMA,mBAAiB,IAAI,IAAI,CAAC,cAAc,cAAc,CAAC;AAC7D,MAAMC,wBAAsB,IAAI,IAAI;CAAC;CAAuB;CAAsB;CAA0B,CAAC;;;;;AAM7G,MAAMC,YAAU,SAAS,QAAQ,QAAQ,OAAO,SAAS,YAAY,UAAU,KAAK;;;;;AAMpF,MAAMC,oBAAkB,SAASD,SAAO,KAAK,IAAID,sBAAoB,IAAI,KAAK,KAAK;;;;;AAMnF,MAAM,gBAAgB,SAAS,OAAO,SAAS,YAAY,SAAS,KAAK,KAAK;;;;;;AAO9E,MAAM,aAAa,SAAS,OAAO,SAAS,YAAY,aAAa,KAAK,KAAK;;;;AAK/E,MAAMG,qBAAmB,SAAS;AAChC,KAAI,KAAK,SAAS,yBAAyB,KAAK,MAAM,KAAK,GAAG,SAAS,aACrE,QAAO,KAAK,GAAG;AAGjB,MAAK,KAAK,SAAS,wBAAwB,KAAK,SAAS,8BAA8B,KAAK,IAC1F;MAAI,KAAK,GAAG,SAAS,aAAc,QAAO,KAAK,GAAG;;CAGpD,MAAM,SAAS,KAAK;AACpB,KAAI,CAAC,UAAU,CAACF,SAAO,OAAO,CAAE,QAAO;AAEvC,KAAI,OAAO,SAAS,qBAClB,QAAO,OAAO,MAAM,OAAO,GAAG,SAAS,eAAe,OAAO,GAAG,OAAO;AAGzE,KAAI,OAAO,SAAS,uBAClB,QAAO,OAAO,QAAQ,OAAO,KAAK,SAAS,eAAe,OAAO,KAAK,OAAO;AAK/E,KAAI,OAAO,SAAS,cAAc,OAAO,SAAS,mBAChD,QAAO;AAIT,KAAI,OAAO,SAAS,kBAAkB;EACpC,MAAM,aAAa,OAAO;AAC1B,MAAI,cAAcA,SAAO,WAAW,EAAE;AACpC,OAAI,WAAW,SAAS,qBACtB,QAAO,WAAW,MAAM,WAAW,GAAG,SAAS,eAAe,WAAW,GAAG,OAAO;AAErF,OAAI,WAAW,SAAS,uBACtB,QAAO,WAAW,QAAQ,WAAW,KAAK,SAAS,eAAe,WAAW,KAAK,OAAO;;;AAK/F,QAAO;;;;;AAMT,MAAMG,2BAAyB,SAAS;AACtC,KAAI,CAAC,QAAQ,CAACH,SAAO,KAAK,CAAE,QAAO;CAEnC,MAAM,QAAQ,CAAC,KAAK;AAEpB,QAAO,MAAM,SAAS,GAAG;EACvB,MAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,WAAW,CAACA,SAAO,QAAQ,CAAE;AAElC,MAAIF,iBAAe,IAAI,QAAQ,KAAK,CAClC,QAAO;AAGT,MAAIC,sBAAoB,IAAI,QAAQ,KAAK,IAAI,YAAY,KACvD;AAGF,OAAK,MAAM,OAAO,OAAO,KAAK,QAAQ,EAAE;AACtC,OAAI,QAAQ,SAAU;GAEtB,MAAM,QAAQ,QAAQ;AACtB,OAAI,CAAC,MAAO;AAEZ,OAAI,MAAM,QAAQ,MAAM,EACtB;SAAK,MAAM,WAAW,MACpB,KAAIC,SAAO,QAAQ,CACjB,OAAM,KAAK,QAAQ;cAGdA,SAAO,MAAM,CACtB,OAAM,KAAK,MAAM;;;AAKvB,QAAO;;AAGT,MAAMI,UAAO,WAAW;CACtB,MAAM;EACJ,MAAM;EACN,MAAM;GACJ,aAAa;GACb,aAAa;GACd;EACD,QAAQ,EAAE;EACX;CAED,WAAW,SAAS;;EAElB,MAAM,gBAAgB,EAAE;EAExB,MAAM,wBAAwB,cAAc,cAAc,SAAS,MAAM;;;;EAKzE,MAAM,iBAAiB,SAAS;;GAI9B,MAAM,QAAQ;IACZ;IACA,MALWF,kBAAgB,KAAK;IAMhC,YAAY;IACb;AAED,iBAAc,KAAK,MAAM;AAEzB,OAAI,KAAK,SAAS,6BAA6B,KAAK,QAAQ,KAAK,KAAK,SAAS,kBAC7E;QAAIC,wBAAsB,KAAK,KAAK,CAClC,OAAM,aAAa;;;EAKzB,MAAM,qBAAqB;GACzB,MAAM,QAAQ,cAAc,KAAK;AACjC,OAAI,CAAC,MAAO;AAGZ,OAAI,MAAM,cAAc,MAAM,QAAQ,CAAC,aAAa,MAAM,KAAK,IAAI,CAAC,UAAU,MAAM,KAAK,CACvF,SAAQ,OAAO;IACb,MAAM,MAAM;IACZ,SAAS,aAAa,MAAM,KAAK,yDAAyD,MAAM,KAAK,OAAO,EAAE,CAAC,aAAa,GAAG,MAAM,KAAK,MAAM,EAAE,CAAC;IACpJ,CAAC;;;EAKN,MAAM,yBAAyB,SAAS;GACtC,MAAM,QAAQ,iBAAiB;AAC/B,OAAI,CAAC,MAAO;GAEZ,MAAM,WAAW,KAAK;AACtB,OAAI,CAAC,YAAYF,iBAAe,SAAS,CAAE;AAE3C,OAAIE,wBAAsB,SAAS,CACjC,OAAM,aAAa;;AAIvB,SAAyD;GACvD,oBAAoB,MAAM;AACxB,QAAIF,iBAAe,KAAK,CAAE,eAAc,KAAK;;GAE/C,4BAA4B;GAC5B,mBAAmB,MAAM;AACvB,QAAIA,iBAAe,KAAK,CAAE,eAAc,KAAK;;GAE/C,2BAA2B;GAC3B,wBAAwB,MAAM;AAC5B,QAAIA,iBAAe,KAAK,CAAE,eAAc,KAAK;;GAE/C,gCAAgC;GAChC,gBAAgB,MAAM;AACpB,QAAI,KAAK,SAAS,kBAAmB,uBAAsB,KAAK;;GAEnE;;CAEJ,CAAC;AAEF,MAAa,6BAA6BG;;;;ACrN1C,MAAMC,UAAO,WAAW;CACtB,MAAM;EACJ,MAAM;EACN,MAAM;GACJ,aAAa;GACb,aAAa;GACd;EACD,QAAQ,EAAE;EACX;CACD,WAAW,SAAS;AAClB,SAAO,EACL,gBAAgB,MAAM;AACpB,OAAI,KAAK,SAAS,kBAAmB;AAGrC,OAAI,KAAK,UAAU,SAAS,gBAAgB,KAAK,SAAS,SAAS,WAAW,KAAK,eACjF,SAAQ,OAAO;IACb;IACA,SAAS;IACV,CAAC;KAGP;;CAEJ,CAAC;AAEF,MAAa,kBAAkBA;;;;;;;;;;;;;;;;;;;ACT/B,MAAMC,wBAAsB,IAAI,IAAI;CAAC;CAAuB;CAAsB;CAA0B,CAAC;;;;;AAM7G,MAAMC,YAAU,SAAS,QAAQ,QAAQ,OAAO,SAAS,YAAY,UAAU,KAAK;;;;;AAMpF,MAAMC,oBAAkB,SAASD,SAAO,KAAK,IAAID,sBAAoB,IAAI,KAAK,KAAK;;;;;;AAOnF,MAAMG,qBAAmB,SAAS,OAAO,SAAS,YAAY,SAAS,KAAK,KAAK;;;;;;AAOjF,MAAMC,qBAAmB,SAAS;AAChC,KAAI,KAAK,SAAS,yBAAyB,KAAK,MAAM,KAAK,GAAG,SAAS,aACrE,QAAO,KAAK,GAAG;AAGjB,MAAK,KAAK,SAAS,wBAAwB,KAAK,SAAS,8BAA8B,KAAK,IAC1F;MAAI,KAAK,GAAG,SAAS,aAAc,QAAO,KAAK,GAAG;;CAGpD,MAAM,SAAS,KAAK;AACpB,KAAI,CAAC,UAAU,CAACH,SAAO,OAAO,CAAE,QAAO;AAEvC,KAAI,OAAO,SAAS,qBAClB,QAAO,OAAO,MAAM,OAAO,GAAG,SAAS,eAAe,OAAO,GAAG,OAAO;AAGzE,KAAI,OAAO,SAAS,uBAClB,QAAO,OAAO,QAAQ,OAAO,KAAK,SAAS,eAAe,OAAO,KAAK,OAAO;AAG/E,KAAI,OAAO,SAAS,cAAc,OAAO,SAAS,mBAChD,QAAO,OAAO,OAAO,OAAO,IAAI,SAAS,eAAe,OAAO,IAAI,OAAO;AAG5E,QAAO;;;;;;;AAQT,MAAM,aAAa,SAAS;AAC1B,KAAI,CAAC,QAAQ,CAACA,SAAO,KAAK,CAAE,QAAO;AACnC,QAAO,KAAK,SAAS,gBAAgB,KAAK,SAAS;;;;;;;AAQrD,MAAM,uBAAuB,SAAS;AACpC,KAAI,KAAK,OAAO,SAAS,gBAAgB,KAAK,OAAO,SAAS,OAC5D,QAAO;AAET,QAAO;;AAGT,MAAMI,UAAO,WAAW;CACtB,MAAM;EACJ,MAAM;EACN,MAAM;GACJ,aACE;GACF,aAAa;GACd;EACD,QAAQ,EAAE;EACX;CACD,WAAW,SAAS;;EAElB,MAAM,gBAAgB,EAAE;EAExB,MAAM,wBAAwB,cAAc,cAAc,SAAS,MAAM;;;;EAKzE,MAAM,iBAAiB,SAAS;;GAG9B,MAAM,QAAQ;IACZ;IACA,QAJa,iBAAiB;IAK9B,MAAMD,kBAAgB,KAAK;IAC3B,YAAY;IACZ,oBAAoB,EAAE;IACvB;AAED,iBAAc,KAAK,MAAM;AAGzB,OAAI,KAAK,SAAS,6BAA6B,KAAK,QAAQ,KAAK,KAAK,SAAS,kBAC7E;QAAI,UAAU,KAAK,KAAK,CACtB,OAAM,aAAa;;;EAKzB,MAAM,qBAAqB;GACzB,MAAM,QAAQ,cAAc,KAAK;AACjC,OAAI,CAAC,MAAO;AAGZ,OAAI,CAAC,MAAM,WAAY;AACvB,OAAI,CAACD,kBAAgB,MAAM,KAAK,CAAE;AAGlC,QAAK,MAAM,YAAY,MAAM,mBAC3B,SAAQ,OAAO;IACb,MAAM;IACN,SAAS,2DAA2D,MAAM,KAAK;IAChF,CAAC;;;EAKN,MAAM,yBAAyB,SAAS;GACtC,MAAM,QAAQ,iBAAiB;AAC/B,OAAI,CAAC,MAAO;GAEZ,MAAM,WAAW,KAAK;AACtB,OAAI,CAAC,SAAU;AAEf,OAAI,UAAU,SAAS,CACrB,OAAM,aAAa;;;EAKvB,MAAM,uBAAuB,SAAS;AACpC,OAAI,CAAC,oBAAoB,KAAK,CAAE;GAEhC,MAAM,QAAQ,iBAAiB;AAC/B,OAAI,CAAC,MAAO;AAGZ,SAAM,mBAAmB,KAAK,KAAK;;AAGrC,SAAyD;GACvD,oBAAoB,MAAM;AACxB,QAAID,iBAAe,KAAK,CAAE,eAAc,KAAK;;GAE/C,4BAA4B;GAC5B,mBAAmB,MAAM;AACvB,QAAIA,iBAAe,KAAK,CAAE,eAAc,KAAK;;GAE/C,2BAA2B;GAC3B,wBAAwB,MAAM;AAC5B,QAAIA,iBAAe,KAAK,CAAE,eAAc,KAAK;;GAE/C,gCAAgC;GAChC,gBAAgB,MAAM;AACpB,QAAI,KAAK,SAAS,kBAAmB,uBAAsB,KAAK;;GAElE,cAAc,MAAM;AAClB,QAAI,KAAK,SAAS,gBAAiB,qBAAoB,KAAK;;GAE/D;;CAEJ,CAAC;AAEF,MAAa,mCAAmCG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AClKhD,MAAMC,mBAAiB,IAAI,IAAI,CAAC,cAAc,cAAc,CAAC;AAC7D,MAAMC,wBAAsB,IAAI,IAAI;CAAC;CAAuB;CAAsB;CAA0B,CAAC;;;;;AAM7G,MAAa,mBAAmB,SAAS,OAAO,SAAS,YAAY,SAAS,KAAK,KAAK;;;;;AAYxF,MAAMC,YAAU,SAAS,QAAQ,QAAQ,OAAO,SAAS,YAAY,UAAU,KAAK;;;;;AAMpF,MAAMC,oBAAkB,SAASD,SAAO,KAAK,IAAID,sBAAoB,IAAI,KAAK,KAAK;;;;;AAMnF,MAAaG,0BAAwB,SAAS;CAC5C,MAAM,gBAAgB,YAAY;AAChC,MAAI,CAAC,QAAS,QAAO;AACrB,MAAID,iBAAe,QAAQ,CACzB,QAAO;AAET,SAAO,aAAaD,SAAO,QAAQ,GAAG,QAAQ,UAAU,OAAO,KAAK;;AAEtE,QAAO,aAAaA,SAAO,KAAK,GAAG,KAAK,UAAU,OAAO,KAAK;;;;;AAMhE,MAAM,2BAA2B,SAAS;CACxC,MAAM,gBAAgB,YAAY;AAChC,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,QAAQ,SAAS,eACnB,QAAO;AAET,MAAIC,iBAAe,QAAQ,CACzB,QAAO;AAET,SAAO,aAAaD,SAAO,QAAQ,GAAG,QAAQ,UAAU,OAAO,KAAK;;AAEtE,QAAO,aAAaA,SAAO,KAAK,GAAG,KAAK,UAAU,OAAO,KAAK;;;;;AAMhE,MAAM,gCAAgC,SAAS;CAC7C,MAAM,SAASA,SAAO,KAAK,GAAG,KAAK,UAAU,OAAO;AACpD,KAAI,CAAC,OAAQ,QAAO;AAGpB,KAAI,OAAO,SAAS,oBAAoB,OAAO,WAAW,KACxD,QAAO;AAGT,QAAO;;;;;AAMT,MAAMG,2BAAyB,SAAS;AACtC,KAAI,CAAC,QAAQ,CAACH,SAAO,KAAK,CAAE,QAAO;CAEnC,MAAM,QAAQ,CAAC,KAAK;AAEpB,QAAO,MAAM,SAAS,GAAG;EACvB,MAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,WAAW,CAACA,SAAO,QAAQ,CAAE;AAElC,MAAIF,iBAAe,IAAI,QAAQ,KAAK,CAClC,QAAO;AAGT,MAAIC,sBAAoB,IAAI,QAAQ,KAAK,IAAI,YAAY,KACvD;AAGF,OAAK,MAAM,OAAO,OAAO,KAAK,QAAQ,EAAE;AACtC,OAAI,QAAQ,SAAU;GAEtB,MAAM,QAAQ,QAAQ;AACtB,OAAI,CAAC,MAAO;AAEZ,OAAI,MAAM,QAAQ,MAAM,EACtB;SAAK,MAAM,WAAW,MACpB,KAAIC,SAAO,QAAQ,CACjB,OAAM,KAAK,QAAQ;cAGdA,SAAO,MAAM,CACtB,OAAM,KAAK,MAAM;;;AAKvB,QAAO;;;;;;AAOT,MAAM,yBAAyB,MAAM,iBAAiB;AACpD,KAAI,CAAC,KAAM,QAAO;AAClB,KAAIG,wBAAsB,KAAK,CAAE,QAAO;AAExC,KAAI,CAACH,SAAO,KAAK,CAAE,QAAO;CAE1B,MAAM,OAAO,KAAK;AAElB,KAAI,SAAS,aACX,QAAO,aAAa,IAAI,KAAK,KAAK;AAGpC,KAAI,SAAS,wBACX,QAAO,sBAAsB,KAAK,YAAY,aAAa,IAAI,sBAAsB,KAAK,WAAW,aAAa;AAGpH,KAAI,SAAS,oBACX,QAAO,sBAAsB,KAAK,MAAM,aAAa,IAAI,sBAAsB,KAAK,OAAO,aAAa;AAG1G,KAAI,SAAS,sBAAsB;EACjC,MAAM,cAAc,KAAK,eAAe,EAAE;AAE1C,SAAO,sBADM,YAAY,YAAY,SAAS,MAAM,MACjB,aAAa;;AAGlD,KAAI,SAAS,kBACX,QAAO,KAAK,SAAS,MAAM,YAAY;AACrC,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,QAAQ,SAAS,gBACnB,QAAO,sBAAsB,QAAQ,UAAU,aAAa;AAE9D,SAAO,sBAAsB,SAAS,aAAa;GACnD;AAGJ,KAAI,SAAS,0BACX,QAAO,sBAAsB,KAAK,YAAY,aAAa;AAG7D,KAAI,SAAS,qBAAqB,SAAS,qBAAqB,SAAS,mBACvE,QAAO,sBAAsB,KAAK,UAAU,aAAa;AAG3D,KACE,SAAS,oBACT,SAAS,qBACT,SAAS,yBACT,SAAS,kBAET,QAAO,sBAAsB,KAAK,YAAY,aAAa;AAG7D,KAAI,SAAS,iBACX,QAAO,sBAAsB,KAAK,QAAQ,aAAa;AAGzD,KAAI,SAAS,mBACX,QAAO,sBAAsB,KAAK,QAAQ,aAAa;AAGzD,QAAO;;;;;;AAOT,MAAM,uBAAuB,SAAS,UAAU;AAC9C,KAAI,CAAC,WAAW,CAACA,SAAO,QAAQ,CAAE;CAElC,MAAM,OAAO,QAAQ;AAErB,KAAI,SAAS,cAAc;AACzB,QAAM,KAAK,QAAQ,KAAK;AACxB;;AAGF,KAAI,SAAS,gBAAgB;AAC3B,OAAK,MAAM,WAAW,QAAQ,UAAU;AACtC,OAAI,CAAC,QAAS;AACd,OAAI,QAAQ,SAAS,cACnB,qBAAoB,QAAQ,UAAU,MAAM;OAE5C,qBAAoB,SAAS,MAAM;;AAGvC;;AAGF,KAAI,SAAS,iBAAiB;AAC5B,OAAK,MAAM,YAAY,QAAQ,YAAY;AACzC,OAAI,CAAC,SAAU;AACf,OAAI,SAAS,SAAS,WACpB,qBAAoB,SAAS,OAAO,MAAM;YACjC,SAAS,SAAS,cAC3B,qBAAoB,SAAS,UAAU,MAAM;;AAGjD;;AAGF,KAAI,SAAS,qBAAqB;AAChC,sBAAoB,QAAQ,MAAM,MAAM;AACxC;;AAGF,KAAI,SAAS,cACX,qBAAoB,QAAQ,UAAU,MAAM;;;;;AAOhD,MAAa,mBAAmB,SAAS;AACvC,KAAI,KAAK,SAAS,yBAAyB,KAAK,MAAM,KAAK,GAAG,SAAS,aACrE,QAAO,KAAK,GAAG;AAGjB,MAAK,KAAK,SAAS,wBAAwB,KAAK,SAAS,8BAA8B,KAAK,IAC1F;MAAI,KAAK,GAAG,SAAS,aAAc,QAAO,KAAK,GAAG;;CAGpD,MAAM,SAAS,KAAK;AACpB,KAAI,CAAC,UAAU,CAACA,SAAO,OAAO,CAAE,QAAO;AAEvC,KAAI,OAAO,SAAS,qBAClB,QAAO,OAAO,MAAM,OAAO,GAAG,SAAS,eAAe,OAAO,GAAG,OAAO;AAGzE,KAAI,OAAO,SAAS,uBAClB,QAAO,OAAO,QAAQ,OAAO,KAAK,SAAS,eAAe,OAAO,KAAK,OAAO;AAG/E,KAAI,OAAO,SAAS,cAAc,OAAO,SAAS,mBAChD,QAAO,OAAO,OAAO,OAAO,IAAI,SAAS,eAAe,OAAO,IAAI,OAAO;AAI5E,KAAI,OAAO,SAAS,kBAAkB;EACpC,MAAM,aAAa,OAAO;AAC1B,MAAI,cAAcA,SAAO,WAAW,EAAE;AACpC,OAAI,WAAW,SAAS,qBACtB,QAAO,WAAW,MAAM,WAAW,GAAG,SAAS,eAAe,WAAW,GAAG,OAAO;AAErF,OAAI,WAAW,SAAS,uBACtB,QAAO,WAAW,QAAQ,WAAW,KAAK,SAAS,eAAe,WAAW,KAAK,OAAO;;;AAK/F,QAAO;;;;;AAMT,MAAM,oBAAoB,SAAU,OAAO,aAAa,KAAK,KAAK;;;;AAKlE,MAAM,kBAAkB,SAAU,OAAO,aAAa,KAAK,KAAK;;;;;AAMhE,MAAM,2BAA2B,OAAO,WAAW;AAQjD,QAAO,wBANL,MAAM,WAAW,IACb,oBACA,MAAM,WAAW,IACf,UAAU,MAAM,GAAG,KACnB,UAAU,MAAM,KAAK,SAAS,IAAI,KAAK,GAAG,CAAC,KAAK,KAAK,GAEvB,UAAU,iBAAiB,OAAO,CAAC;;;;;;AAO3E,MAAM,+BAA+B,WAAW,eAC9C,iBAAiB,eAAe,UAAU,CAAC,iCAAiC,iBAAiB,WAAW,CAAC;;;;AAK3G,MAAM,qBAAqB,SACzB,iBAAiB,eAAe,KAAK,CAAC;AAExC,MAAMI,SAAO,WAAW;CACtB,MAAM;EACJ,MAAM;EACN,MAAM;GACJ,aACE;GACF,aAAa;GACd;EACD,QAAQ,EAAE;EACX;CAED,WAAW,SAAS;;EAElB,MAAM,gBAAgB,EAAE;EAExB,MAAM,wBAAwB,cAAc,cAAc,SAAS,MAAM;;;;EAKzE,MAAM,iBAAiB,SAAS;;GAG9B,MAAM,QAAQ;IACZ;IACA,QAJa,iBAAiB;IAK9B,MAAM,gBAAgB,KAAK;IAC3B,YAAY;IACZ,iCAAiB,IAAI,KAAK;IAC1B,gBAAgB,EAAE;IAClB,mBAAmB,EAAE;IACtB;AAED,iBAAc,KAAK,MAAM;AAEzB,OAAI,KAAK,SAAS,6BAA6B,KAAK,QAAQ,KAAK,KAAK,SAAS,kBAC7E;QAAI,sBAAsB,KAAK,MAAM,MAAM,gBAAgB,CACzD,OAAM,aAAa;;;EAKzB,MAAM,qBAAqB;GACzB,MAAM,QAAQ,cAAc,KAAK;AACjC,OAAI,CAAC,MAAO;AAEZ,OAAI,MAAM,cAAc,6BAA6B,MAAM,KAAK,EAAE;AAChE,YAAQ,OAAO;KACb,MAAM,MAAM;KACZ,SAAS,kBAAkB,MAAM,KAAK;KACvC,CAAC;AACF;;AAGF,OAAI,MAAM,UAAU,MAAM,cAAc,MAAM,QAAQ,CAAC,wBAAwB,MAAM,KAAK,CACxF,OAAM,OAAO,kBAAkB,KAAK;IAAE,MAAM,MAAM;IAAM,MAAM,MAAM;IAAM,CAAC;AAG7E,OAAI,CAAC,MAAM,WAAY;AAEvB,QAAK,MAAM,cAAc,MAAM,eAC7B,SAAQ,OAAO;IACb,MAAM,WAAW;IACjB,SAAS,wBAAwB,WAAW,OAAO,MAAM,KAAK;IAC/D,CAAC;AAGJ,QAAK,MAAM,UAAU,MAAM,kBACzB,SAAQ,OAAO;IACb,MAAM,OAAO;IACb,SAAS,4BAA4B,OAAO,MAAM,MAAM,KAAK;IAC9D,CAAC;;;EAKN,MAAM,yBAAyB,SAAS;GACtC,MAAM,QAAQ,iBAAiB;AAC/B,OAAI,CAAC,MAAO;GAEZ,MAAM,WAAW,KAAK;AACtB,OAAI,CAAC,YAAYH,iBAAe,SAAS,CAAE;AAE3C,OAAI,sBAAsB,UAAU,MAAM,gBAAgB,CACxD,OAAM,aAAa;;;EAKvB,MAAM,4BAA4B,SAAS;GACzC,MAAM,QAAQ,iBAAiB;AAC/B,OAAI,CAAC,MAAO;GAEZ,MAAM,OAAO,KAAK;AAClB,OAAI,CAAC,QAAQA,iBAAe,KAAK,CAAE;AACnC,OAAI,CAACE,wBAAsB,KAAK,CAAE;GAElC,MAAM,QAAQ,EAAE;AAChB,uBAAoB,KAAK,IAAI,MAAM;AACnC,QAAK,MAAM,QAAQ,MACjB,OAAM,gBAAgB,IAAI,KAAK;AAGjC,SAAM,eAAe,KAAK;IAAE,MAAM;IAAM;IAAO,CAAC;;;EAIlD,MAAM,8BAA8B,SAAS;AAC3C,OAAI,KAAK,aAAa,IAAK;GAE3B,MAAM,QAAQ,iBAAiB;AAC/B,OAAI,CAAC,MAAO;GAEZ,MAAM,QAAQ,KAAK;AACnB,OAAI,CAAC,SAASF,iBAAe,MAAM,CAAE;AACrC,OAAI,CAACE,wBAAsB,MAAM,CAAE;GAEnC,MAAM,QAAQ,EAAE;AAChB,OAAI,KAAK,QAAQ,KAAK,KAAK,SAAS,cAAc;AAChD,UAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,UAAM,gBAAgB,IAAI,KAAK,KAAK,KAAK;;AAG3C,SAAM,eAAe,KAAK;IAAE,MAAM;IAAO;IAAO,CAAC;;;;;EAMnD,MAAM,wBAAwB,SAAS;GACrC,MAAM,QAAQ,iBAAiB;AAC/B,OAAI,CAAC,MAAO;AAGZ,OACE,KAAK,UACL,KAAK,OAAO,SAAS,sBACrB,KAAK,OAAO,YACZ,KAAK,OAAO,SAAS,SAAS,gBAC9B,KAAK,OAAO,SAAS,SAAS,QAC9B;IACA,MAAM,cAAc,KAAK,OAAO;AAChC,QAAI,eAAe,YAAY,SAAS,cAAc;KACpD,MAAM,YAAY,YAAY;AAQ9B,SALuB,KAAK,UAAU,MAAM,QAAQ;AAClD,UAAI,CAAC,OAAO,IAAI,SAAS,gBAAiB,QAAO;AACjD,aAAOA,wBAAsB,IAAI;OACjC,EAEkB;AAClB,YAAM,gBAAgB,IAAI,UAAU;AACpC,YAAM,eAAe,KAAK;OAAQ;OAAM,OAAO,CAAC,UAAU;OAAE,CAAC;;;;;AAMrE,SAAyD;GACvD,oBAAoB,MAAM;AACxB,QAAIF,iBAAe,KAAK,CAAE,eAAc,KAAK;;GAE/C,4BAA4B;GAC5B,mBAAmB,MAAM;AACvB,QAAIA,iBAAe,KAAK,CAAE,eAAc,KAAK;;GAE/C,2BAA2B;GAC3B,wBAAwB,MAAM;AAC5B,QAAIA,iBAAe,KAAK,CAAE,eAAc,KAAK;;GAE/C,gCAAgC;GAChC,gBAAgB,MAAM;AACpB,QAAI,KAAK,SAAS,kBAAmB,uBAAsB,KAAK;;GAElE,mBAAmB,MAAM;AACvB,QAAI,KAAK,SAAS,qBAAsB,0BAAyB,KAAK;;GAExE,qBAAqB,MAAM;AACzB,QAAI,KAAK,SAAS,uBAAwB,4BAA2B,KAAK;;GAE5E,eAAe,MAAM;AACnB,QAAI,KAAK,SAAS,iBAAkB,sBAAqB,KAAK;;GAEjE;;CAEJ,CAAC;AAEF,MAAa,yBAAyBG;;;;;;;;;;AC9gBtC,MAAMC,wBAAsB,IAAI,IAAI;CAAC;CAAuB;CAAsB;CAA0B,CAAC;;;;;AAM7G,MAAMC,YAAU,SAAS,QAAQ,QAAQ,OAAO,SAAS,YAAY,UAAU,KAAK;;;;;AAMpF,MAAMC,oBAAkB,SAASD,SAAO,KAAK,IAAID,sBAAoB,IAAI,KAAK,KAAK;;;;;;AAOnF,MAAM,mBAAmB,SAAS;AAChC,KAAI,KAAK,SAAS,iBAAkB,QAAO;CAE3C,MAAM,SAAS,KAAK;AACpB,KAAI,CAAC,OAAQ,QAAO;AAGpB,KAAI,OAAO,SAAS,gBAAgB,OAAO,KAAK,WAAW,MAAM,CAC/D,QAAO;AAIT,KACE,OAAO,SAAS,sBAChB,OAAO,UACP,OAAO,OAAO,SAAS,gBACvB,OAAO,OAAO,SAAS,WACvB,OAAO,YACP,OAAO,SAAS,SAAS,gBACzB,OAAO,SAAS,KAAK,WAAW,MAAM,CAEtC,QAAO;AAGT,QAAO;;;;;;;AAQT,MAAM,eAAe,SAAS;AAC5B,KAAI,CAAC,QAAQ,CAACC,SAAO,KAAK,CAAE,QAAO;CAEnC,MAAM,QAAQ,CAAC,KAAK;AAEpB,QAAO,MAAM,SAAS,GAAG;EACvB,MAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,WAAW,CAACA,SAAO,QAAQ,CAAE;AAElC,MAAI,QAAQ,SAAS,gBAAgB,QAAQ,SAAS,cACpD,QAAO;AAIT,MAAIC,iBAAe,QAAQ,IAAI,YAAY,KACzC;AAGF,OAAK,MAAM,OAAO,OAAO,KAAK,QAAQ,EAAE;AACtC,OAAI,QAAQ,SAAU;GAEtB,MAAM,QAAQ,QAAQ;AACtB,OAAI,CAAC,MAAO;AAEZ,OAAI,MAAM,QAAQ,MAAM,EACtB;SAAK,MAAM,WAAW,MACpB,KAAID,SAAO,QAAQ,CACjB,OAAM,KAAK,QAAQ;cAGdA,SAAO,MAAM,CACtB,OAAM,KAAK,MAAM;;;AAKvB,QAAO;;;;;;;;;AAUT,MAAM,0BAA0B,MAAM,eAAe;AACnD,KAAI,CAAC,KAAK,KAAM,QAAO;CAEvB,MAAM,OAAO,KAAK;AAGlB,KAAI,KAAK,SAAS,iBAChB,QAAO,8BAA8B,MAAM,WAAW;AAIxD,QAAO,wBAAwB,MAAM,WAAW;;;;;;;AAQlD,MAAM,2BAA2B,MAAM,eAAe;AACpD,KAAI,CAAC,QAAQ,CAACA,SAAO,KAAK,CAAE,QAAO;CAEnC,MAAM,QAAQ,CAAC,KAAK;AAEpB,QAAO,MAAM,SAAS,GAAG;EACvB,MAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,WAAW,CAACA,SAAO,QAAQ,CAAE;AAGlC,MAAI,QAAQ,SAAS,cAAc;GACjC,MAAM,SAAS,QAAQ;AAGvB,OACE,UACAA,SAAO,OAAO,KACb,OAAO,SAAS,wBACf,OAAO,SAAS,yBACf,OAAO,SAAS,cAAc,OAAO,QAAQ,SAEhD;AAIF,OAAI,CAAC,WAAW,IAAI,QAAQ,KAAK,EAkC/B;QAAI,CAhCgB,IAAI,IAAI;KAC1B;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACD,CAAC,CAEe,IAAI,QAAQ,KAAK,CAChC,QAAO;;;AAMb,MAAIC,iBAAe,QAAQ,IAAI,YAAY,KACzC;AAGF,OAAK,MAAM,OAAO,OAAO,KAAK,QAAQ,EAAE;AACtC,OAAI,QAAQ,SAAU;GAEtB,MAAM,QAAQ,QAAQ;AACtB,OAAI,CAAC,MAAO;AAEZ,OAAI,MAAM,QAAQ,MAAM,EACtB;SAAK,MAAM,WAAW,MACpB,KAAID,SAAO,QAAQ,CACjB,OAAM,KAAK,QAAQ;cAGdA,SAAO,MAAM,CACtB,OAAM,KAAK,MAAM;;;AAKvB,QAAO;;;;;;;AAQT,MAAM,iCAAiC,MAAM,eAAe;AAC1D,QAAO,wBAAwB,MAAM,WAAW;;;;;;;AAQlD,MAAM,qBAAqB,SAAS;CAClC,MAAM,wBAAQ,IAAI,KAAK;AAGvB,KAAI,KAAK,OACP,MAAK,MAAM,SAAS,KAAK,OACvB,qBAAoB,OAAO,MAAM;AAKrC,KAAI,KAAK,QAAQ,KAAK,KAAK,SAAS,kBAClC;OAAK,MAAM,aAAa,KAAK,KAAK,KAChC,KAAI,UAAU,SAAS,sBACrB,MAAK,MAAM,cAAc,UAAU,aACjC,qBAAoB,WAAW,IAAI,MAAM;;AAMjD,QAAO;;;;;;AAOT,MAAM,uBAAuB,SAAS,UAAU;AAC9C,KAAI,CAAC,WAAW,CAACA,SAAO,QAAQ,CAAE;AAElC,KAAI,QAAQ,SAAS,cAAc;AACjC,QAAM,IAAI,QAAQ,KAAK;AACvB;;AAGF,KAAI,QAAQ,SAAS,gBAAgB;AACnC,OAAK,MAAM,WAAW,QAAQ,UAAU;AACtC,OAAI,CAAC,QAAS;AACd,OAAI,QAAQ,SAAS,cACnB,qBAAoB,QAAQ,UAAU,MAAM;OAE5C,qBAAoB,SAAS,MAAM;;AAGvC;;AAGF,KAAI,QAAQ,SAAS,iBAAiB;AACpC,OAAK,MAAM,YAAY,QAAQ,YAAY;AACzC,OAAI,CAAC,SAAU;AACf,OAAI,SAAS,SAAS,WACpB,qBAAoB,SAAS,OAAO,MAAM;YACjC,SAAS,SAAS,cAC3B,qBAAoB,SAAS,UAAU,MAAM;;AAGjD;;AAGF,KAAI,QAAQ,SAAS,qBAAqB;AACxC,sBAAoB,QAAQ,MAAM,MAAM;AACxC;;AAGF,KAAI,QAAQ,SAAS,cACnB,qBAAoB,QAAQ,UAAU,MAAM;;;;;;;AAShD,MAAM,oBAAoB,SAAS;AAIjC,KAAI,CAAC,gBAHQ,gBAAgB,KAAK,CAGR,CACxB,QAAO;AAIT,QAAO,YAAY,KAAK,IAAI,cAAc,KAAK;;;;;;;AAQjD,MAAM,iBAAiB,SAAS;AAC9B,KAAI,CAAC,KAAK,KAAM,QAAO;CAEvB,MAAM,QAAQ,CAAC,KAAK,KAAK;AAEzB,QAAO,MAAM,SAAS,GAAG;EACvB,MAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,WAAW,CAACA,SAAO,QAAQ,CAAE;AAElC,MAAI,gBAAgB,QAAQ,CAC1B,QAAO;AAIT,MAAIC,iBAAe,QAAQ,IAAI,YAAY,KAAK,KAC9C;AAGF,OAAK,MAAM,OAAO,OAAO,KAAK,QAAQ,EAAE;AACtC,OAAI,QAAQ,SAAU;GAEtB,MAAM,QAAQ,QAAQ;AACtB,OAAI,CAAC,MAAO;AAEZ,OAAI,MAAM,QAAQ,MAAM,EACtB;SAAK,MAAM,WAAW,MACpB,KAAID,SAAO,QAAQ,CACjB,OAAM,KAAK,QAAQ;cAGdA,SAAO,MAAM,CACtB,OAAM,KAAK,MAAM;;;AAKvB,QAAO;;;;;;;AAQT,MAAM,mBAAmB,SAAS;CAChC,MAAM,SAAS,KAAK;AACpB,KAAI,CAAC,UAAU,CAACA,SAAO,OAAO,CAAE,QAAO;AAEvC,KAAI,OAAO,SAAS,oBAAoB,gBAAgB,OAAO,CAC7D,QAAO;AAGT,QAAO;;;;;;;AAQT,MAAM,kBAAkB,SAAS;AAE/B,KAAI,YAAY,KAAK,CAAE,QAAO;AAG9B,KAAI,cAAc,KAAK,CAAE,QAAO;AAGhC,KAAI,gBAAgB,KAAK,CAAE,QAAO;AAIlC,KAAI,uBAAuB,MADR,kBAAkB,KAAK,CACE,CAAE,QAAO;AAErD,QAAO;;AAGT,MAAME,SAAO,WAAW;CACtB,MAAM;EACJ,MAAM;EACN,MAAM;GACJ,aACE;GACF,aAAa;GACd;EACD,QAAQ,EAAE;EACX;CAED,WAAW,SAAS;;;;EAIlB,MAAM,4BAA4B,SAAS;GAEzC,MAAM,OAAO,KAAK;AAClB,OAAI,CAAC,QAAQ,CAACD,iBAAe,KAAK,CAAE;GAGpC,MAAM,oBAAoBE,uBAAqB,KAAK;AACpD,OAAI,CAAC,kBAAmB;AAGxB,OAAI,CAAC,iBAAiB,kBAAkB,CAAE;AAG1C,OAAI,CAAC,eAAe,KAAK,CAAE;GAE3B,MAAM,eAAe,KAAK,MAAM,KAAK,GAAG,SAAS,eAAe,KAAK,GAAG,OAAO;GAC/E,MAAM,gBAAgB,gBAAgB,kBAAkB;AAExD,WAAQ,OAAO;IACb,MAAM;IACN,SAAS,kBAAkB,aAAa,2CAA2C,cAAc;IAClG,CAAC;;AAGJ,SAAyD,EACvD,mBAAmB,MAAM;AACvB,OAAI,KAAK,SAAS,qBAAsB,0BAAyB,KAAK;KAEzE;;CAEJ,CAAC;AAEF,MAAa,+BAA+BD;;;;;AC3b5C,MAAME,SAAO,WAAW;CACtB,MAAM;EACJ,MAAM;EACN,MAAM;GACJ,aAAa;GACb,aAAa;GACd;EACD,QAAQ,EAAE;EACX;CACD,WAAW,SAAS;AAClB,SAAyD,EAIvD,gBAAgB,MAAM;AACpB,OAAI,KAAK,SAAS,kBAAmB;AAErC,OAAI,KAAK,aAAa,SACpB,SAAQ,OAAO;IACb;IACA,SACE;IACH,CAAC;KAGP;;CAEJ,CAAC;AAEF,MAAa,eAAeA;;;;;;;;;ACzB5B,MAAM,cACJ;;;;;;AAOF,MAAM,cAAc,SAAS;AAC3B,QAAO,KAAK,MAAM,YAAY;;;;;;;AAQhC,MAAM,mBAAmB,SAAS;CAChC,MAAM,SAAS,WAAW,KAAK;AAC/B,KAAI,CAAC,UAAU,OAAO,WAAW,EAAG,QAAO;CAE3C,MAAM,eAAe,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC;CACzC,MAAM,UAAU,aAAa,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI;AAElD,QAAO,aAAa,SAAS,IAAI,GAAG,QAAQ,QAAQ;;AAGtD,MAAMC,SAAO,WAAW;CACtB,MAAM;EACJ,MAAM;EACN,MAAM;GACJ,aAAa;GACb,aAAa;GACd;EACD,QAAQ,EAAE;EACX;CACD,WAAW,SAAS;AAClB,SAAyD;GAKvD,cAAc,MAAM;AAClB,QAAI,KAAK,SAAS,gBAAiB;IAEnC,MAAM,SAAS,WAAW,KAAK,MAAM;AACrC,QAAI,UAAU,OAAO,SAAS,GAAG;KAC/B,MAAM,UAAU,gBAAgB,KAAK,MAAM;AAC3C,aAAQ,OAAO;MACb;MACA,SAAS,0CAA0C,QAAQ;MAC5D,CAAC;;;GAQN,gBAAgB,MAAM;AACpB,QAAI,KAAK,SAAS,kBAAmB;AAGrC,SAAK,MAAM,SAAS,KAAK,QAAQ;AAC/B,SAAI,MAAM,SAAS,kBAAmB;KAEtC,MAAM,OAAO,MAAM,MAAM;KACzB,MAAM,SAAS,WAAW,KAAK;AAE/B,SAAI,UAAU,OAAO,SAAS,GAAG;MAC/B,MAAM,UAAU,gBAAgB,KAAK;AACrC,cAAQ,OAAO;OACb,MAAM;OACN,SAAS,0CAA0C,QAAQ;OAC5D,CAAC;;;;GASR,QAAQ,MAAM;AACZ,QAAI,KAAK,SAAS,UAAW;IAE7B,MAAM,SAAS,WAAW,KAAK,MAAM;AACrC,QAAI,UAAU,OAAO,SAAS,GAAG;KAC/B,MAAM,UAAU,gBAAgB,KAAK,MAAM;AAC3C,aAAQ,OAAO;MACb;MACA,SAAS,0CAA0C,QAAQ;MAC5D,CAAC;;;GAGP;;CAEJ,CAAC;AAEF,MAAa,cAAcA;;;;;ACvG3B,MAAMC,SAAO,WAAW;CACtB,MAAM;EACJ,MAAM;EACN,MAAM;GACJ,aAAa;GACb,aAAa;GACd;EACD,QAAQ,EAAE;EACX;CACD,WAAW,SAAS;AAClB,SAAyD,EAIvD,aAAa,MAAM;AACjB,OAAI,KAAK,SAAS,eAAgB;AAElC,OAAI,KAAK,UACP,SAAQ,OAAO;IACb,MAAM,KAAK;IACX,SAAS;IACV,CAAC;KAGP;;CAEJ,CAAC;AAEF,MAAa,gBAAgBA;;;;;AC5B7B,MAAMC,SAAO,WAAW;CACtB,MAAM;EACJ,MAAM;EACN,MAAM;GACJ,aAAa;GACb,aAAa;GACd;EACD,QAAQ,EAAE;EACX;CACD,WAAW,SAAS;AAClB,SAAyD,EAIvD,eAAe,MAAM;AACnB,OAAI,KAAK,SAAS,iBAAkB;GAEpC,MAAM,EAAE,WAAW;AAGnB,OACE,OAAO,SAAS,wBAChB,OAAO,SAAS,0BAEhB,SAAQ,OAAO;IACb;IACA,SACE;IACH,CAAC;KAGP;;CAEJ,CAAC;AAEF,MAAa,aAAaA;;;;;;;;;;AC9B1B,MAAM,0BAA0B,SAAS;AACvC,KAAI,KAAK,SAAS,mBAAoB,QAAO;CAE7C,MAAM,SAAS,KAAK;AACpB,KAAI,CAAC,UAAU,OAAO,SAAS,gBAAgB,OAAO,SAAS,QAC7D,QAAO;AAGT,QAAO;;;;;;;AAQT,MAAM,iBAAiB,SAAS;CAC9B,MAAM,eAAe,YAAY;AAC/B,MAAI,CAAC,QAAS,QAAO;AAoBrB,MAjByB,IAAI,IAAI;GAC/B;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAAC,CAEmB,IAAI,QAAQ,KAAK,CACpC,QAAO;AAIT,MACE,QAAQ,SAAS,yBACjB,QAAQ,SAAS,wBACjB,QAAQ,SAAS,oBACjB,QAAQ,SAAS,kBAEjB,QAAO;AAGT,SAAO,YAAY,QAAQ,OAAO;;AAGpC,QAAO,YAAY,KAAK,OAAO;;AAGjC,MAAMC,SAAO,WAAW;CACtB,MAAM;EACJ,MAAM;EACN,MAAM;GACJ,aACE;GACF,aAAa;GACd;EACD,QAAQ,EAAE;EACX;CACD,WAAW,SAAS;AAClB,SAAyD,EAIvD,iBAAiB,MAAM;AACrB,OAAI,KAAK,SAAS,mBAAoB;AAEtC,OAAI,CAAC,uBAAuB,KAAK,CAAE;AAGnC,OAAI,cAAc,KAAK,CAAE;GAEzB,MAAM,eAAe,KAAK,YAAY,KAAK,SAAS,SAAS,eAAe,KAAK,SAAS,OAAO;AAEjG,WAAQ,OAAO;IACb;IACA,SAAS,sBAAsB,aAAa,aAAa,aAAa,kDAAkD,aAAa;IACtI,CAAC;KAEL;;CAEJ,CAAC;AAEF,MAAa,uBAAuBA;;;;;ACjGpC,MAAa,eAAe,WAAW;CACrC,MAAM;EACJ,MAAM;EACN,MAAM;GACJ,aAAa;GACb,aAAa;GACd;EACD,QAAQ,EAAE;EACX;CACD,WAAW,SAAS;AAClB,SAAyD,EAIvD,gBAAgB,MAAM;AACpB,OAAI,KAAK,SAAS,kBAAmB;AAErC,WAAQ,OAAO;IACb;IACA,SAAS;IACV,CAAC;KAEL;;CAEJ,CAAC;;;;;;;;;;ACnBF,MAAM,wBAAwB,SAAS;CACrC,MAAM,gBAAgB,YAAY;AAChC,MAAI,CAAC,QAAS,QAAO;AACrB,MACE,QAAQ,SAAS,yBACjB,QAAQ,SAAS,wBACjB,QAAQ,SAAS,0BAEjB,QAAO;AAET,SAAO,aAAa,QAAQ,OAAO;;AAErC,QAAO,aAAa,KAAK,OAAO;;;;;;;;AASlC,MAAM,gBAAgB,MAAM,WAAW;CACrC,MAAM,aAAa,YAAY;AAC7B,MAAI,CAAC,WAAW,YAAY,OAAQ,QAAO;AAC3C,MACE,QAAQ,SAAS,kBACjB,QAAQ,SAAS,oBACjB,QAAQ,SAAS,oBACjB,QAAQ,SAAS,oBACjB,QAAQ,SAAS,mBAEjB,QAAO;AAET,SAAO,UAAU,QAAQ,OAAO;;AAElC,QAAO,UAAU,KAAK,OAAO;;AAG/B,MAAMC,SAAO,WAAW;CACtB,MAAM;EACJ,MAAM;EACN,MAAM;GACJ,aAAa;GACb,aAAa;GACd;EACD,QAAQ,EAAE;EACX;CAED,WAAW,SAAS;AAClB,SAAyD,EAIvD,oBAAoB,SAAS;AAC3B,OAAI,QAAQ,SAAS,sBAAuB;GAC5C,MAAM,OAAO;AAEb,OAAI,KAAK,SAAS,MAAO;GAEzB,MAAM,KAAK,qBAAqB,KAAK;AACrC,OACE,CAAC,MACA,GAAG,SAAS,yBACX,GAAG,SAAS,wBACZ,GAAG,SAAS,0BAEd;GAGF,MAAM,SAAS,KAAK;AACpB,OAAI,CAAC,UAAU,OAAO,SAAS,oBAAoB,OAAO,WAAW,GAAI;AAGzE,OAAI,aAAa,MAAM,GAAG,CAAE;AAE5B,WAAQ,OAAO;IACb;IACA,SACE;IACH,CAAC;KAEL;;CAEJ,CAAC;AAEF,MAAa,oBAAoBA;;;;;AC1FjC,MAAMC,SAAO,WAAW;CACtB,MAAM;EACJ,MAAM;EACN,MAAM;GACJ,aACE;GACF,aAAa;GACd;EACD,QAAQ,EAAE;EACX;CAED,WAAW,SAAS;AAClB,SAAyD;GAIvD,eAAe,SAAS;AACtB,QAAI,QAAQ,SAAS,iBAAkB;AAGvC,QACE,QAAQ,eAAe,SAAS,qBAChC,QAAQ,eAAe,SAAS,SAAS,gBACzC,QAAQ,eAAe,SAAS,SAAS,QAEzC;AAGF,YAAQ,OAAO;KACb,MAAM;KACN,SACE;KACH,CAAC;;GAMJ,gBAAgB,SAAS;AACvB,QAAI,QAAQ,SAAS,kBAAmB;AAExC,YAAQ,OAAO;KACb,MAAM;KACN,SACE;KACH,CAAC;;GAMJ,oBAAoB,SAAS;AAC3B,QAAI,QAAQ,SAAS,sBAAuB;AAE5C,YAAQ,OAAO;KACb,MAAM;KACN,SACE;KACH,CAAC;;GAEL;;CAEJ,CAAC;AAEF,MAAa,iBAAiBA;;;;;;;;;;AC3D9B,MAAM,iBAAiB,IAAI,IAAI,CAAC,cAAc,cAAc,CAAC;AAC7D,MAAM,sBAAsB,IAAI,IAAI;CAAC;CAAuB;CAAsB;CAA0B,CAAC;;;;;AAM7G,MAAM,UAAU,SAAS,QAAQ,QAAQ,OAAO,SAAS,YAAY,UAAU,KAAK;;;;;AAMpF,MAAM,kBAAkB,SAAS,OAAO,KAAK,IAAI,oBAAoB,IAAI,KAAK,KAAK;;;;;AAMnF,MAAM,yBAAyB,SAAS;AACtC,KAAI,CAAC,QAAQ,CAAC,OAAO,KAAK,CAAE,QAAO;CAEnC,MAAM,QAAQ,CAAC,KAAK;AAEpB,QAAO,MAAM,SAAS,GAAG;EACvB,MAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,WAAW,CAAC,OAAO,QAAQ,CAAE;AAElC,MAAI,eAAe,IAAI,QAAQ,KAAK,CAClC,QAAO;AAGT,MAAI,oBAAoB,IAAI,QAAQ,KAAK,IAAI,YAAY,KACvD;AAGF,OAAK,MAAM,OAAO,OAAO,KAAK,QAAQ,EAAE;AACtC,OAAI,QAAQ,SAAU;GAEtB,MAAM,QAAQ,QAAQ;AACtB,OAAI,CAAC,MAAO;AAEZ,OAAI,MAAM,QAAQ,MAAM,EACtB;SAAK,MAAM,WAAW,MACpB,KAAI,OAAO,QAAQ,CACjB,OAAM,KAAK,QAAQ;cAGd,OAAO,MAAM,CACtB,OAAM,KAAK,MAAM;;;AAKvB,QAAO;;;;;;AAOT,MAAM,sBAAsB,SAAS;AAEnC,KAAI,KAAK,SAAS,6BAA6B,KAAK,QAAQ,KAAK,KAAK,SAAS,iBAC7E,QAAO,sBAAsB,KAAK,KAAK;CAIzC,MAAM,OAAO,KAAK;AAClB,KAAI,CAAC,QAAQ,KAAK,SAAS,iBAAkB,QAAO;CAEpD,MAAM,QAAQ,CAAC,KAAK;AACpB,QAAO,MAAM,SAAS,GAAG;EACvB,MAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,WAAW,CAAC,OAAO,QAAQ,CAAE;AAElC,MAAI,QAAQ,SAAS,mBAAmB;GACtC,MAAM,WAAW,QAAQ;AACzB,OAAI,YAAY,sBAAsB,SAAS,CAC7C,QAAO;;AAKX,MAAI,oBAAoB,IAAI,QAAQ,KAAK,IAAI,YAAY,KACvD;AAGF,OAAK,MAAM,OAAO,OAAO,KAAK,QAAQ,EAAE;AACtC,OAAI,QAAQ,SAAU;GAEtB,MAAM,QAAQ,QAAQ;AACtB,OAAI,CAAC,MAAO;AAEZ,OAAI,MAAM,QAAQ,MAAM,EACtB;SAAK,MAAM,WAAW,MACpB,KAAI,OAAO,QAAQ,CACjB,OAAM,KAAK,QAAQ;cAGd,OAAO,MAAM,CACtB,OAAM,KAAK,MAAM;;;AAKvB,QAAO;;AAGT,MAAM,OAAO,WAAW;CACtB,MAAM;EACJ,MAAM;EACN,MAAM;GACJ,aAAa;GACb,aAAa;GACd;EACD,QAAQ,EAAE;EACX;CAED,WAAW,SAAS;;;;;;EAMlB,MAAM,cAAc,SAAS;GAC3B,IAAI,UAAU,KAAK;AAEnB,UAAO,WAAW,OAAO,QAAQ,EAAE;AAEjC,QAAI,QAAQ,SAAS,UACnB,QAAO;AAIT,QAAI,KAAK,SAAS,yBAAyB,QAAQ,SAAS,UAC1D,QAAO;AAKT,QAAI,QAAQ,SAAS,uBAAuB;KAC1C,MAAM,SAAS,QAAQ;AACvB,SAAI,UAAU,OAAO,OAAO,IAAI,OAAO,SAAS,UAC9C,QAAO;;AAKX,QAAI,oBAAoB,IAAI,QAAQ,KAAK,CACvC,QAAO;AAGT,cAAU,QAAQ;;AAGpB,UAAO;;;;;;;EAQT,MAAM,4BAA4B,SAAS;AAEzC,OAAI,CAAC,WAAW,KAAK,CACnB,QAAO;AAIT,OAAI,KAAK,IAAI,MAAM;IACjB,MAAM,YAAY,KAAK,GAAG,KAAK,OAAO,EAAE;AACxC,WAAO,cAAc,UAAU,aAAa;;GAK9C,MAAM,SAAS,KAAK;AACpB,OAAI,CAAC,UAAU,CAAC,OAAO,OAAO,CAC5B,QAAO;AAIT,OAAI,OAAO,SAAS,wBAAwB,OAAO,MAAM,UAAU,OAAO,IAAI;IAC5E,MAAM,OAAO,OAAO,GAAG;AACvB,QAAI,OAAO,SAAS,UAAU;KAC5B,MAAM,YAAY,KAAK,OAAO,EAAE;AAChC,YAAO,cAAc,UAAU,aAAa;;;AAIhD,UAAO;;;;;EAMT,MAAM,iBAAiB,SAAS;AAE9B,OAAI,CAAC,mBAAmB,KAAK,CAC3B;AAIF,OAAI,CAAC,yBAAyB,KAAK,CACjC;GAGF,MAAM,SAAS,KAAK;AACpB,OAAI,CAAC,UAAU,OAAO,WAAW,EAC/B;GAGF,MAAM,aAAa,OAAO;AAC1B,OAAI,CAAC,cAAc,CAAC,OAAO,WAAW,CACpC;AAIF,OAAI,WAAW,SAAS,mBAAmB,WAAW,SAAS,gBAAgB;AAC7E,YAAQ,OAAO;KACb,MAAM;KACN,SACE;KACH,CAAC;AACF;;AAIF,OAAI,WAAW,SAAS,cACtB;QAAI,WAAW,SAAS,QACtB,SAAQ,OAAO;KACb,MAAM;KACN,SAAS,iDAAiD,WAAW,KAAK;KAC3E,CAAC;;;AAKR,SAAyD;GACvD,oBAAoB,MAAM;AACxB,QAAI,eAAe,KAAK,CAAE,eAAc,KAAK;;GAE/C,mBAAmB,MAAM;AACvB,QAAI,eAAe,KAAK,CAAE,eAAc,KAAK;;GAE/C,wBAAwB,MAAM;AAC5B,QAAI,eAAe,KAAK,CAAE,eAAc,KAAK;;GAEhD;;CAEJ,CAAC;AAEF,MAAa,kBAAkB;;;;ACtP/B,MAAM,SAAS,aAAa;CAC1B,MAAM,EACJ,MAAM,gBACP;CACD,OAAO;EACL,6BAA6B;EAC7B,iBAAiB;EACjB,mCAAmC;EACnC,+BAA+B;EAC/B,aAAa;EACb,YAAY;EACZ,cAAc;EACd,WAAW;EACX,wBAAwB;EACxB,sBAAsB;EACtB,aAAa;EACb,oBAAoB;EACpB,gBAAgB;EAChB,gBAAgB;EACjB;CACF,CAAC;AAEF,6BAAe"}
package/package.json CHANGED
@@ -50,7 +50,7 @@
50
50
  "typescript": "5.9.3",
51
51
  "vitest": "4.0.15"
52
52
  },
53
- "version": "0.0.71",
53
+ "version": "0.0.73",
54
54
  "scripts": {
55
55
  "dev": "tsdown --watch",
56
56
  "build": "tsc --noEmit && tsdown",