@zayne-labs/eslint-config 0.13.11 → 0.13.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +6 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/constants/defaults.js.map +1 -1
- package/dist/{index-D_rhwt8F.d.ts → index-B8a2EaF4.d.ts} +125 -57
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/jsxRules-BAjKnxGs.js.map +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js.map +1 -1
- package/package.json +37 -37
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsxRules-BAjKnxGs.js","names":[],"sources":["../src/rules/react/utils.ts","../src/rules/react/jsxRules.ts"],"sourcesContent":["/* eslint-disable ts-eslint/no-unsafe-enum-comparison -- Ignore, I don't want the enum to be bundled */\nimport type { TSESTree } from \"@typescript-eslint/types\";\n\nexport const stringifyJsx = (\n\tnode:\n\t\t| TSESTree.JSXClosingElement\n\t\t| TSESTree.JSXClosingFragment\n\t\t| TSESTree.JSXIdentifier\n\t\t| TSESTree.JSXMemberExpression\n\t\t| TSESTree.JSXNamespacedName\n\t\t| TSESTree.JSXOpeningElement\n\t\t| TSESTree.JSXOpeningFragment\n\t\t| TSESTree.JSXText\n): string => {\n\tswitch (node.type) {\n\t\tcase \"JSXClosingElement\": {\n\t\t\t// Closing tags like \"</div>\"\n\t\t\treturn `</${stringifyJsx(node.name)}>`;\n\t\t}\n\t\tcase \"JSXClosingFragment\": {\n\t\t\t// Fragment closing syntax \"</>\"\n\t\t\treturn \"</>\";\n\t\t}\n\t\tcase \"JSXIdentifier\": {\n\t\t\t// Simple element names like \"div\" or component names like \"Button\"\n\t\t\treturn node.name;\n\t\t}\n\t\tcase \"JSXMemberExpression\": {\n\t\t\t// Dot-notation components like \"React.Fragment\" or \"Namespace.Component\"\n\t\t\treturn `${stringifyJsx(node.object)}.${stringifyJsx(node.property)}`;\n\t\t}\n\t\tcase \"JSXNamespacedName\": {\n\t\t\t// XML-style namespaced elements like \"svg:path\"\n\t\t\treturn `${node.namespace.name}:${node.name.name}`;\n\t\t}\n\t\tcase \"JSXOpeningElement\": {\n\t\t\t// Opening tags like \"<div>\"\n\t\t\treturn `<${stringifyJsx(node.name)}>`;\n\t\t}\n\t\tcase \"JSXOpeningFragment\": {\n\t\t\t// Fragment opening syntax \"<>\"\n\t\t\treturn \"<>\";\n\t\t}\n\t\tcase \"JSXText\": {\n\t\t\t// Text content inside JSX\n\t\t\treturn node.value;\n\t\t}\n\t\tdefault: {\n\t\t\treturn \"\";\n\t\t}\n\t}\n};\n","/* eslint-disable ts-eslint/no-unsafe-enum-comparison -- Ignore, I don't want the enum to be bundled */\n/* eslint-disable unicorn/consistent-function-scoping -- Ignore */\nimport eslintReactKit, { type RuleFunction } from \"@eslint-react/kit\";\nimport type { ESLintUtils } from \"@typescript-eslint/utils\";\nimport type { RuleContext } from \"@typescript-eslint/utils/ts-eslint\";\nimport { stringifyJsx } from \"./utils\";\n\ntype OptionsShortHand = readonly [\"always\" | \"never\" | null];\n\ntype MessageID = \"default\";\n\ntype RuleDefinition<TRuleContext = RuleContext<MessageID, OptionsShortHand>> = (\n\tcontext: TRuleContext,\n\ttoolkit: Parameters<RuleFunction>[1]\n) => ESLintUtils.RuleListener;\n\ntype RuleWithMetaAndName = Omit<ESLintUtils.RuleWithMetaAndName<OptionsShortHand, MessageID>, \"create\">;\n\nconst jsxShorthandBoolean = (): RuleDefinition => (context) => {\n\tconst policy = (context.options[0] ?? \"never\") satisfies OptionsShortHand[0];\n\n\treturn {\n\t\tJSXAttribute: (node) => {\n\t\t\tconst { value } = node;\n\t\t\tconst propName = stringifyJsx(node.name);\n\n\t\t\tswitch (true) {\n\t\t\t\tcase policy === \"always\"\n\t\t\t\t\t&& value?.type === \"JSXExpressionContainer\"\n\t\t\t\t\t&& value.expression.type === \"Literal\"\n\t\t\t\t\t&& value.expression.value === true: {\n\t\t\t\t\tcontext.report({\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tmessage: `Omit attribute value for '${propName}'.`,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfix: (fixer) => fixer.removeRange([node.name.range[1], value.range[1]]),\n\t\t\t\t\t\tmessageId: \"default\",\n\t\t\t\t\t\tnode,\n\t\t\t\t\t});\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase policy === \"never\" && value == null: {\n\t\t\t\t\tcontext.report({\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tmessage: `Set attribute value for '${propName}'.`,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfix: (fixer) => fixer.insertTextAfter(node.name, `={true}`),\n\t\t\t\t\t\tmessageId: \"default\",\n\t\t\t\t\t\tnode: node.value ?? node,\n\t\t\t\t\t});\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault: {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t};\n};\n\nconst jsxShorthandBooleanMeta = {\n\tmeta: {\n\t\tdefaultOptions: [\"never\"],\n\t\tdocs: {\n\t\t\tdescription:\n\t\t\t\t\"Enforces whether to use shorthand syntax for boolean attributes (e.g., 'disabled') or not\",\n\t\t},\n\t\tfixable: \"code\",\n\t\thasSuggestions: true,\n\t\tmessages: {\n\t\t\tdefault: \"{{message}}\",\n\t\t},\n\t\tschema: [\n\t\t\t{\n\t\t\t\tenum: [\"always\", \"never\"],\n\t\t\t\ttype: \"string\",\n\t\t\t},\n\t\t],\n\t\ttype: \"suggestion\",\n\t},\n\tname: \"jsx-shorthand-boolean\",\n} as const satisfies RuleWithMetaAndName;\n\nconst jsxShorthandFragment = (): RuleDefinition => (context, toolkit) => {\n\tconst policy = (context.options[0] ?? \"always\") satisfies OptionsShortHand[0];\n\n\tswitch (policy) {\n\t\tcase \"always\": {\n\t\t\treturn {\n\t\t\t\tJSXElement: (node) => {\n\t\t\t\t\tif (node.openingElement.attributes.length > 0) return;\n\n\t\t\t\t\tconst name = stringifyJsx(node.openingElement.name);\n\n\t\t\t\t\tconst isFragmentNode = name === \"Fragment\" || name === \"React.Fragment\";\n\n\t\t\t\t\tconst variableToCheck = name.split(\".\")[0] ?? name;\n\n\t\t\t\t\tconst isFragment =\n\t\t\t\t\t\tisFragmentNode\n\t\t\t\t\t\t&& toolkit.is.APIFromReact(\n\t\t\t\t\t\t\tvariableToCheck,\n\t\t\t\t\t\t\tcontext.sourceCode.getScope(node.openingElement)\n\t\t\t\t\t\t);\n\n\t\t\t\t\tif (!isFragment) return;\n\n\t\t\t\t\tcontext.report({\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tmessage: \"Use fragment shorthand syntax instead of 'Fragment' component.\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfix: (fixer) => {\n\t\t\t\t\t\t\tif (node.closingElement == null) {\n\t\t\t\t\t\t\t\treturn [];\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t\tfixer.replaceTextRange(\n\t\t\t\t\t\t\t\t\t[node.openingElement.range[0], node.openingElement.range[1]],\n\t\t\t\t\t\t\t\t\t\"<\"\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\tfixer.replaceTextRange(\n\t\t\t\t\t\t\t\t\t[node.closingElement.range[0], node.closingElement.range[1]],\n\t\t\t\t\t\t\t\t\t\"</>\"\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t];\n\t\t\t\t\t\t},\n\t\t\t\t\t\tmessageId: \"default\",\n\t\t\t\t\t\tnode,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tcase \"never\": {\n\t\t\treturn {\n\t\t\t\tJSXFragment: (node) => {\n\t\t\t\t\tcontext.report({\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tmessage: \"Use 'Fragment' component instead of fragment shorthand syntax.\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfix: (fixer) => {\n\t\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t\tfixer.replaceTextRange(\n\t\t\t\t\t\t\t\t\t[node.openingFragment.range[0], node.openingFragment.range[1]],\n\t\t\t\t\t\t\t\t\t`<Fragment>`\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\tfixer.replaceTextRange(\n\t\t\t\t\t\t\t\t\t[node.closingFragment.range[0], node.closingFragment.range[1]],\n\t\t\t\t\t\t\t\t\t`</Fragment>`\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t];\n\t\t\t\t\t\t},\n\t\t\t\t\t\tmessageId: \"default\",\n\t\t\t\t\t\tnode,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tdefault: {\n\t\t\treturn {};\n\t\t}\n\t}\n};\n\nconst jsxShorthandFragmentMeta = {\n\tmeta: {\n\t\t...jsxShorthandBooleanMeta.meta,\n\t\tdefaultOptions: [\"always\"],\n\t\tdocs: {\n\t\t\tdescription: \"Enforces whether to use fragment shorthand syntax (<>...</>) or not\",\n\t\t},\n\t},\n\tname: \"jsx-shorthand-fragment\",\n} as const satisfies RuleWithMetaAndName;\n\nconst RuleMetaArray = [jsxShorthandBooleanMeta, jsxShorthandFragmentMeta];\n\nexport const getCustomJsxPlugin = () => {\n\tconst plugin = eslintReactKit()\n\t\t.use(jsxShorthandBoolean as () => RuleDefinition<RuleContext<\"default\", readonly unknown[]>>)\n\t\t.use(jsxShorthandFragment as () => RuleDefinition<RuleContext<\"default\", readonly unknown[]>>)\n\t\t.getPlugin();\n\n\tfor (const ruleMeta of RuleMetaArray) {\n\t\tconst rule = plugin.rules?.[ruleMeta.name];\n\n\t\trule?.meta && Object.assign(rule.meta, ruleMeta.meta);\n\t}\n\n\treturn plugin;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"jsxRules-BAjKnxGs.js","names":[],"sources":["../src/rules/react/utils.ts","../src/rules/react/jsxRules.ts"],"sourcesContent":["/* eslint-disable ts-eslint/no-unsafe-enum-comparison -- Ignore, I don't want the enum to be bundled */\nimport type { TSESTree } from \"@typescript-eslint/types\";\n\nexport const stringifyJsx = (\n\tnode:\n\t\t| TSESTree.JSXClosingElement\n\t\t| TSESTree.JSXClosingFragment\n\t\t| TSESTree.JSXIdentifier\n\t\t| TSESTree.JSXMemberExpression\n\t\t| TSESTree.JSXNamespacedName\n\t\t| TSESTree.JSXOpeningElement\n\t\t| TSESTree.JSXOpeningFragment\n\t\t| TSESTree.JSXText\n): string => {\n\tswitch (node.type) {\n\t\tcase \"JSXClosingElement\": {\n\t\t\t// Closing tags like \"</div>\"\n\t\t\treturn `</${stringifyJsx(node.name)}>`;\n\t\t}\n\t\tcase \"JSXClosingFragment\": {\n\t\t\t// Fragment closing syntax \"</>\"\n\t\t\treturn \"</>\";\n\t\t}\n\t\tcase \"JSXIdentifier\": {\n\t\t\t// Simple element names like \"div\" or component names like \"Button\"\n\t\t\treturn node.name;\n\t\t}\n\t\tcase \"JSXMemberExpression\": {\n\t\t\t// Dot-notation components like \"React.Fragment\" or \"Namespace.Component\"\n\t\t\treturn `${stringifyJsx(node.object)}.${stringifyJsx(node.property)}`;\n\t\t}\n\t\tcase \"JSXNamespacedName\": {\n\t\t\t// XML-style namespaced elements like \"svg:path\"\n\t\t\treturn `${node.namespace.name}:${node.name.name}`;\n\t\t}\n\t\tcase \"JSXOpeningElement\": {\n\t\t\t// Opening tags like \"<div>\"\n\t\t\treturn `<${stringifyJsx(node.name)}>`;\n\t\t}\n\t\tcase \"JSXOpeningFragment\": {\n\t\t\t// Fragment opening syntax \"<>\"\n\t\t\treturn \"<>\";\n\t\t}\n\t\tcase \"JSXText\": {\n\t\t\t// Text content inside JSX\n\t\t\treturn node.value;\n\t\t}\n\t\tdefault: {\n\t\t\treturn \"\";\n\t\t}\n\t}\n};\n","/* eslint-disable ts-eslint/no-unsafe-enum-comparison -- Ignore, I don't want the enum to be bundled */\n/* eslint-disable unicorn/consistent-function-scoping -- Ignore */\nimport eslintReactKit, { type RuleFunction } from \"@eslint-react/kit\";\nimport type { ESLintUtils } from \"@typescript-eslint/utils\";\nimport type { RuleContext } from \"@typescript-eslint/utils/ts-eslint\";\nimport { stringifyJsx } from \"./utils\";\n\ntype OptionsShortHand = readonly [\"always\" | \"never\" | null];\n\ntype MessageID = \"default\";\n\ntype RuleDefinition<TRuleContext = RuleContext<MessageID, OptionsShortHand>> = (\n\tcontext: TRuleContext,\n\ttoolkit: Parameters<RuleFunction>[1]\n) => ESLintUtils.RuleListener;\n\ntype RuleWithMetaAndName = Omit<ESLintUtils.RuleWithMetaAndName<OptionsShortHand, MessageID>, \"create\">;\n\nconst jsxShorthandBoolean = (): RuleDefinition => (context) => {\n\tconst policy = (context.options[0] ?? \"never\") satisfies OptionsShortHand[0];\n\n\treturn {\n\t\tJSXAttribute: (node) => {\n\t\t\tconst { value } = node;\n\t\t\tconst propName = stringifyJsx(node.name);\n\n\t\t\tswitch (true) {\n\t\t\t\tcase policy === \"always\"\n\t\t\t\t\t&& value?.type === \"JSXExpressionContainer\"\n\t\t\t\t\t&& value.expression.type === \"Literal\"\n\t\t\t\t\t&& value.expression.value === true: {\n\t\t\t\t\tcontext.report({\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tmessage: `Omit attribute value for '${propName}'.`,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfix: (fixer) => fixer.removeRange([node.name.range[1], value.range[1]]),\n\t\t\t\t\t\tmessageId: \"default\",\n\t\t\t\t\t\tnode,\n\t\t\t\t\t});\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase policy === \"never\" && value == null: {\n\t\t\t\t\tcontext.report({\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tmessage: `Set attribute value for '${propName}'.`,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfix: (fixer) => fixer.insertTextAfter(node.name, `={true}`),\n\t\t\t\t\t\tmessageId: \"default\",\n\t\t\t\t\t\tnode: node.value ?? node,\n\t\t\t\t\t});\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault: {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t};\n};\n\nconst jsxShorthandBooleanMeta = {\n\tmeta: {\n\t\tdefaultOptions: [\"never\"],\n\t\tdocs: {\n\t\t\tdescription:\n\t\t\t\t\"Enforces whether to use shorthand syntax for boolean attributes (e.g., 'disabled') or not\",\n\t\t},\n\t\tfixable: \"code\",\n\t\thasSuggestions: true,\n\t\tmessages: {\n\t\t\tdefault: \"{{message}}\",\n\t\t},\n\t\tschema: [\n\t\t\t{\n\t\t\t\tenum: [\"always\", \"never\"],\n\t\t\t\ttype: \"string\",\n\t\t\t},\n\t\t],\n\t\ttype: \"suggestion\",\n\t},\n\tname: \"jsx-shorthand-boolean\",\n} as const satisfies RuleWithMetaAndName;\n\nconst jsxShorthandFragment = (): RuleDefinition => (context, toolkit) => {\n\tconst policy = (context.options[0] ?? \"always\") satisfies OptionsShortHand[0];\n\n\tswitch (policy) {\n\t\tcase \"always\": {\n\t\t\treturn {\n\t\t\t\tJSXElement: (node) => {\n\t\t\t\t\tif (node.openingElement.attributes.length > 0) return;\n\n\t\t\t\t\tconst name = stringifyJsx(node.openingElement.name);\n\n\t\t\t\t\tconst isFragmentNode = name === \"Fragment\" || name === \"React.Fragment\";\n\n\t\t\t\t\tconst variableToCheck = name.split(\".\")[0] ?? name;\n\n\t\t\t\t\tconst isFragment =\n\t\t\t\t\t\tisFragmentNode\n\t\t\t\t\t\t&& toolkit.is.APIFromReact(\n\t\t\t\t\t\t\tvariableToCheck,\n\t\t\t\t\t\t\tcontext.sourceCode.getScope(node.openingElement)\n\t\t\t\t\t\t);\n\n\t\t\t\t\tif (!isFragment) return;\n\n\t\t\t\t\tcontext.report({\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tmessage: \"Use fragment shorthand syntax instead of 'Fragment' component.\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfix: (fixer) => {\n\t\t\t\t\t\t\tif (node.closingElement == null) {\n\t\t\t\t\t\t\t\treturn [];\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t\tfixer.replaceTextRange(\n\t\t\t\t\t\t\t\t\t[node.openingElement.range[0], node.openingElement.range[1]],\n\t\t\t\t\t\t\t\t\t\"<\"\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\tfixer.replaceTextRange(\n\t\t\t\t\t\t\t\t\t[node.closingElement.range[0], node.closingElement.range[1]],\n\t\t\t\t\t\t\t\t\t\"</>\"\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t];\n\t\t\t\t\t\t},\n\t\t\t\t\t\tmessageId: \"default\",\n\t\t\t\t\t\tnode,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tcase \"never\": {\n\t\t\treturn {\n\t\t\t\tJSXFragment: (node) => {\n\t\t\t\t\tcontext.report({\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tmessage: \"Use 'Fragment' component instead of fragment shorthand syntax.\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfix: (fixer) => {\n\t\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t\tfixer.replaceTextRange(\n\t\t\t\t\t\t\t\t\t[node.openingFragment.range[0], node.openingFragment.range[1]],\n\t\t\t\t\t\t\t\t\t`<Fragment>`\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\tfixer.replaceTextRange(\n\t\t\t\t\t\t\t\t\t[node.closingFragment.range[0], node.closingFragment.range[1]],\n\t\t\t\t\t\t\t\t\t`</Fragment>`\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t];\n\t\t\t\t\t\t},\n\t\t\t\t\t\tmessageId: \"default\",\n\t\t\t\t\t\tnode,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tdefault: {\n\t\t\treturn {};\n\t\t}\n\t}\n};\n\nconst jsxShorthandFragmentMeta = {\n\tmeta: {\n\t\t...jsxShorthandBooleanMeta.meta,\n\t\tdefaultOptions: [\"always\"],\n\t\tdocs: {\n\t\t\tdescription: \"Enforces whether to use fragment shorthand syntax (<>...</>) or not\",\n\t\t},\n\t},\n\tname: \"jsx-shorthand-fragment\",\n} as const satisfies RuleWithMetaAndName;\n\nconst RuleMetaArray = [jsxShorthandBooleanMeta, jsxShorthandFragmentMeta];\n\nexport const getCustomJsxPlugin = () => {\n\tconst plugin = eslintReactKit()\n\t\t.use(jsxShorthandBoolean as () => RuleDefinition<RuleContext<\"default\", readonly unknown[]>>)\n\t\t.use(jsxShorthandFragment as () => RuleDefinition<RuleContext<\"default\", readonly unknown[]>>)\n\t\t.getPlugin();\n\n\tfor (const ruleMeta of RuleMetaArray) {\n\t\tconst rule = plugin.rules?.[ruleMeta.name];\n\n\t\trule?.meta && Object.assign(rule.meta, ruleMeta.meta);\n\t}\n\n\treturn plugin;\n};\n"],"mappings":"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"}
|
package/dist/utils.d.ts
CHANGED
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":[],"sources":["../src/utils.ts"],"sourcesContent":["import { fileURLToPath } from \"node:url\";\nimport { isFunction, isObjectAndNotArray, type Awaitable } from \"@zayne-labs/toolkit-type-helpers\";\nimport type { ESLint } from \"eslint\";\nimport { isPackageExists } from \"local-pkg\";\nimport type { TypedFlatConfigItem } from \"./types\";\n\nexport const isObject = <TObject extends object>(value: unknown): value is TObject => {\n\treturn isObjectAndNotArray(value);\n};\n\n/**\n * @description - Combine array and non-array configs into a single array.\n */\nexport const combine = async (\n\t...configs: Array<Awaitable<TypedFlatConfigItem | TypedFlatConfigItem[]>>\n): Promise<TypedFlatConfigItem[]> => {\n\t// eslint-disable-next-line ts-eslint/await-thenable -- False positive\n\tconst resolved = await Promise.all(configs);\n\n\treturn resolved.flat();\n};\n\nexport const interopDefault = async <TModule>(\n\tmodule: Awaitable<TModule>\n): Promise<TModule extends { default: infer TDefaultExport } ? TDefaultExport : TModule> => {\n\tconst resolved = await module;\n\n\t// eslint-disable-next-line ts-eslint/no-unnecessary-condition -- casting is necessary to prevent assignability ts issues at call-site\n\treturn (resolved as { default: never }).default ?? resolved;\n};\n\n/**\n * @description - Rename plugin prefixes in a rule object.\n * Accepts a map of prefixes to rename.\n *\n * @example\n * ```ts\n * import { renameRules } from '@zayne-labs/eslint-config'\n *\n * export default [{\n * rules: renameRules(\n * {\n * '@typescript-eslint/indent': 'error'\n * },\n * { '@typescript-eslint': 'ts-eslint' }\n * )\n * }]\n * ```\n */\nexport const renameRules = (\n\trules: Record<string, unknown> | undefined,\n\trenameMap: Record<string, string>,\n\tseparator = \"/\"\n): TypedFlatConfigItem[\"rules\"] | undefined => {\n\tif (!rules) return;\n\n\tconst renamedRulesEntries = Object.entries(rules).map(([ruleName, ruleValue]) => {\n\t\tfor (const [oldRulePrefix, newRulePrefix] of Object.entries(renameMap)) {\n\t\t\tconst oldRulePrefixWithSeparator = `${oldRulePrefix}${separator}`;\n\n\t\t\tif (!ruleName.startsWith(oldRulePrefixWithSeparator)) continue;\n\n\t\t\tconst restOfRuleNameWithoutSeparator = ruleName.slice(oldRulePrefixWithSeparator.length);\n\n\t\t\t// == Skip if rule name still contains separator, which signifies a nested rule prefix that we don't want to rename\n\t\t\tif (restOfRuleNameWithoutSeparator.includes(separator)) continue;\n\n\t\t\tconst newRuleName = `${newRulePrefix}${separator}${restOfRuleNameWithoutSeparator}`;\n\n\t\t\treturn [newRuleName, ruleValue];\n\t\t}\n\n\t\treturn [ruleName, ruleValue];\n\t});\n\n\treturn Object.fromEntries(renamedRulesEntries) as TypedFlatConfigItem[\"rules\"];\n};\n\nexport const renamePlugins = (\n\tplugins: Record<string, unknown> | undefined,\n\trenameMap: Record<string, string>\n): Record<string, ESLint.Plugin> | undefined => {\n\tif (!plugins) return;\n\n\tconst renamedPluginEntries = Object.entries(plugins).map(([pluginName, pluginValue]) => {\n\t\tif (pluginName in renameMap) {\n\t\t\tconst newPluginName = renameMap[pluginName];\n\n\t\t\treturn [newPluginName, pluginValue];\n\t\t}\n\n\t\treturn [pluginName, pluginValue];\n\t});\n\n\treturn Object.fromEntries(renamedPluginEntries) as Record<string, ESLint.Plugin>;\n};\n\ntype OverrideConfigsOptions = {\n\tconfigArray: TypedFlatConfigItem[];\n\toverrides: TypedFlatConfigItem | ((config: TypedFlatConfigItem) => TypedFlatConfigItem);\n};\n\nconst getResolvedOverrides = (options: {\n\tconfigItem: TypedFlatConfigItem;\n\toverrides: OverrideConfigsOptions[\"overrides\"] | undefined;\n}) => {\n\tconst { configItem, overrides } = options;\n\n\treturn isFunction(overrides) ? overrides(configItem) : overrides;\n};\n\n/**\n * @description - Override configurations in a flat configs array with either a static config object or a function that returns a config object\n * @param options - Configuration options\n * @param options.configs - Array of flat config items to override\n * @param options.overrides - Either a config object to merge or a function that takes a config and returns overrides\n * @returns Array of merged config items with overrides applied\n *\n * @example\n * ```ts\n * import { overrideConfigs } from '@zayne-labs/eslint-config'\n *\n * // Override with static config\n * overrideConfigs({\n * configArray: existingConfigs,\n * overrides: {\n * rules: {\n * 'no-console': 'error'\n * }\n * }\n * })\n *\n * // Override with function\n * overrideConfigs({\n * configArray: existingConfigs,\n * overrides: (config) => ({\n * ...config,\n * rules: {\n * ...config.rules,\n * 'no-console': 'error'\n * }\n * })\n * })\n * ```\n */\nexport const overrideConfigs = (options: OverrideConfigsOptions): TypedFlatConfigItem[] => {\n\tconst { configArray, overrides } = options;\n\n\treturn configArray.map((configItem) => ({\n\t\t...configItem,\n\t\t...getResolvedOverrides({ configItem, overrides }),\n\t}));\n};\n\ntype RenamePluginInConfigsOptions = {\n\tconfigArray: OverrideConfigsOptions[\"configArray\"];\n\toverrides?: OverrideConfigsOptions[\"overrides\"];\n\trenameMap: Record<string, string>;\n};\n\n/**\n * @description - Rename plugin names and rules in a flat configs array\n *\n * @param options - Configuration options\n * @param options.configArray - Array of flat config items to process\n * @param options.overrides - Optional config overrides to apply\n * @param options.renameMap - Map of old plugin names to new names\n *\n * @example\n * ```ts\n * import { renamePluginInConfigs } from '@zayne-labs/eslint-config'\n * import someConfigs from './some-configs'\n *\n * renamePluginInConfigs({\n * configArray: someConfigs,\n * renameMap: {\n * '@typescript-eslint': 'ts-eslint',\n * 'import-x': 'import',\n * }\n * })\n * ```\n */\n\nexport const renamePluginInConfigs = (options: RenamePluginInConfigsOptions): TypedFlatConfigItem[] => {\n\tconst { configArray, overrides, renameMap } = options;\n\n\tconst renamedConfigs = overrideConfigs({\n\t\tconfigArray,\n\t\toverrides: (configItem) => ({\n\t\t\t...getResolvedOverrides({ configItem, overrides }),\n\n\t\t\t...(isObject(configItem.plugins) && {\n\t\t\t\tplugins: renamePlugins(configItem.plugins, renameMap),\n\t\t\t}),\n\t\t\t...(isObject(configItem.rules) && {\n\t\t\t\trules: renameRules(configItem.rules, renameMap),\n\t\t\t}),\n\t\t}),\n\t});\n\n\treturn renamedConfigs;\n};\n\nconst scopeUrl = fileURLToPath(new URL(\".\", import.meta.url));\nconst isCwdInScope = isPackageExists(\"@zayne-labs/eslint-config\");\n\nexport const isPackageInScope = (name: string): boolean => isPackageExists(name, { paths: [scopeUrl] });\n\n/**\n * @description\n * - Ensures that packages are installed in the current scope.\n * - If they are not installed, and the user is in a TTY, and the user is not in a CI environment,\n * and the user is in the same scope as this package, then prompt the user to\n * install the packages.\n *\n * @param packages - The packages to ensure are installed.\n */\nexport const ensurePackages = async (packages: Array<string | undefined>): Promise<void> => {\n\tif (process.env.CI || !process.stdout.isTTY || !isCwdInScope) return;\n\n\tconst nonExistingPackages = packages.filter((pkg) => pkg && !isPackageInScope(pkg));\n\n\tif (nonExistingPackages.length === 0) return;\n\n\tconst clackPrompt = await import(\"@clack/prompts\");\n\n\tconst result = await clackPrompt.confirm({\n\t\tmessage: `${nonExistingPackages.length === 1 ? \"Package\" : \"Packages\"} required for this config: ${nonExistingPackages.join(\", \")}. Do you want to install ${nonExistingPackages.length === 1 ? \"it\" : \"them\"}?`,\n\t});\n\n\tif (!result) return;\n\n\tconst antfuPkg = await import(\"@antfu/install-pkg\");\n\n\tawait antfuPkg.installPackage(nonExistingPackages as string[], { dev: true });\n};\n\nexport const resolveOptions = <TObject>(option: boolean | TObject | undefined) => {\n\treturn isObject(option) ? option : ({} as TObject);\n};\n\nexport const parserPlain = {\n\tmeta: {\n\t\tname: \"parser-plain\",\n\t},\n\tparseForESLint: (code: string) => ({\n\t\tast: {\n\t\t\tbody: [],\n\t\t\tcomments: [],\n\t\t\tloc: { end: code.length, start: 0 },\n\t\t\trange: [0, code.length],\n\t\t\ttokens: [],\n\t\t\ttype: \"Program\",\n\t\t},\n\t\tscopeManager: null,\n\t\tservices: { isPlain: true },\n\t\tvisitorKeys: {\n\t\t\tProgram: [],\n\t\t},\n\t}),\n};\n\nexport const isInEditorEnv = (): boolean => {\n\tif (process.env.CI) {\n\t\treturn false;\n\t}\n\n\tif (isInGitHooksOrLintStaged()) {\n\t\treturn false;\n\t}\n\n\treturn (\n\t\tBoolean(process.env.VSCODE_PID)\n\t\t|| Boolean(process.env.VSCODE_CWD)\n\t\t|| Boolean(process.env.JETBRAINS_IDE)\n\t\t|| Boolean(process.env.VIM)\n\t\t|| Boolean(process.env.NVIM)\n\t\t|| (Boolean(process.env.ZED_ENVIRONMENT) && !process.env.ZED_TERM)\n\t);\n};\n\nexport const isInGitHooksOrLintStaged = (): boolean => {\n\treturn (\n\t\tBoolean(process.env.GIT_PARAMS)\n\t\t|| Boolean(process.env.VSCODE_GIT_COMMAND)\n\t\t|| Boolean(process.env.npm_lifecycle_script?.startsWith(\"lint-staged\"))\n\t);\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","names":[],"sources":["../src/utils.ts"],"sourcesContent":["import { fileURLToPath } from \"node:url\";\nimport { isFunction, isObjectAndNotArray, type Awaitable } from \"@zayne-labs/toolkit-type-helpers\";\nimport type { ESLint } from \"eslint\";\nimport { isPackageExists } from \"local-pkg\";\nimport type { TypedFlatConfigItem } from \"./types\";\n\nexport const isObject = <TObject extends object>(value: unknown): value is TObject => {\n\treturn isObjectAndNotArray(value);\n};\n\n/**\n * @description - Combine array and non-array configs into a single array.\n */\nexport const combine = async (\n\t...configs: Array<Awaitable<TypedFlatConfigItem | TypedFlatConfigItem[]>>\n): Promise<TypedFlatConfigItem[]> => {\n\t// eslint-disable-next-line ts-eslint/await-thenable -- False positive\n\tconst resolved = await Promise.all(configs);\n\n\treturn resolved.flat();\n};\n\nexport const interopDefault = async <TModule>(\n\tmodule: Awaitable<TModule>\n): Promise<TModule extends { default: infer TDefaultExport } ? TDefaultExport : TModule> => {\n\tconst resolved = await module;\n\n\t// eslint-disable-next-line ts-eslint/no-unnecessary-condition -- casting is necessary to prevent assignability ts issues at call-site\n\treturn (resolved as { default: never }).default ?? resolved;\n};\n\n/**\n * @description - Rename plugin prefixes in a rule object.\n * Accepts a map of prefixes to rename.\n *\n * @example\n * ```ts\n * import { renameRules } from '@zayne-labs/eslint-config'\n *\n * export default [{\n * rules: renameRules(\n * {\n * '@typescript-eslint/indent': 'error'\n * },\n * { '@typescript-eslint': 'ts-eslint' }\n * )\n * }]\n * ```\n */\nexport const renameRules = (\n\trules: Record<string, unknown> | undefined,\n\trenameMap: Record<string, string>,\n\tseparator = \"/\"\n): TypedFlatConfigItem[\"rules\"] | undefined => {\n\tif (!rules) return;\n\n\tconst renamedRulesEntries = Object.entries(rules).map(([ruleName, ruleValue]) => {\n\t\tfor (const [oldRulePrefix, newRulePrefix] of Object.entries(renameMap)) {\n\t\t\tconst oldRulePrefixWithSeparator = `${oldRulePrefix}${separator}`;\n\n\t\t\tif (!ruleName.startsWith(oldRulePrefixWithSeparator)) continue;\n\n\t\t\tconst restOfRuleNameWithoutSeparator = ruleName.slice(oldRulePrefixWithSeparator.length);\n\n\t\t\t// == Skip if rule name still contains separator, which signifies a nested rule prefix that we don't want to rename\n\t\t\tif (restOfRuleNameWithoutSeparator.includes(separator)) continue;\n\n\t\t\tconst newRuleName = `${newRulePrefix}${separator}${restOfRuleNameWithoutSeparator}`;\n\n\t\t\treturn [newRuleName, ruleValue];\n\t\t}\n\n\t\treturn [ruleName, ruleValue];\n\t});\n\n\treturn Object.fromEntries(renamedRulesEntries) as TypedFlatConfigItem[\"rules\"];\n};\n\nexport const renamePlugins = (\n\tplugins: Record<string, unknown> | undefined,\n\trenameMap: Record<string, string>\n): Record<string, ESLint.Plugin> | undefined => {\n\tif (!plugins) return;\n\n\tconst renamedPluginEntries = Object.entries(plugins).map(([pluginName, pluginValue]) => {\n\t\tif (pluginName in renameMap) {\n\t\t\tconst newPluginName = renameMap[pluginName];\n\n\t\t\treturn [newPluginName, pluginValue];\n\t\t}\n\n\t\treturn [pluginName, pluginValue];\n\t});\n\n\treturn Object.fromEntries(renamedPluginEntries) as Record<string, ESLint.Plugin>;\n};\n\ntype OverrideConfigsOptions = {\n\tconfigArray: TypedFlatConfigItem[];\n\toverrides: TypedFlatConfigItem | ((config: TypedFlatConfigItem) => TypedFlatConfigItem);\n};\n\nconst getResolvedOverrides = (options: {\n\tconfigItem: TypedFlatConfigItem;\n\toverrides: OverrideConfigsOptions[\"overrides\"] | undefined;\n}) => {\n\tconst { configItem, overrides } = options;\n\n\treturn isFunction(overrides) ? overrides(configItem) : overrides;\n};\n\n/**\n * @description - Override configurations in a flat configs array with either a static config object or a function that returns a config object\n * @param options - Configuration options\n * @param options.configs - Array of flat config items to override\n * @param options.overrides - Either a config object to merge or a function that takes a config and returns overrides\n * @returns Array of merged config items with overrides applied\n *\n * @example\n * ```ts\n * import { overrideConfigs } from '@zayne-labs/eslint-config'\n *\n * // Override with static config\n * overrideConfigs({\n * configArray: existingConfigs,\n * overrides: {\n * rules: {\n * 'no-console': 'error'\n * }\n * }\n * })\n *\n * // Override with function\n * overrideConfigs({\n * configArray: existingConfigs,\n * overrides: (config) => ({\n * ...config,\n * rules: {\n * ...config.rules,\n * 'no-console': 'error'\n * }\n * })\n * })\n * ```\n */\nexport const overrideConfigs = (options: OverrideConfigsOptions): TypedFlatConfigItem[] => {\n\tconst { configArray, overrides } = options;\n\n\treturn configArray.map((configItem) => ({\n\t\t...configItem,\n\t\t...getResolvedOverrides({ configItem, overrides }),\n\t}));\n};\n\ntype RenamePluginInConfigsOptions = {\n\tconfigArray: OverrideConfigsOptions[\"configArray\"];\n\toverrides?: OverrideConfigsOptions[\"overrides\"];\n\trenameMap: Record<string, string>;\n};\n\n/**\n * @description - Rename plugin names and rules in a flat configs array\n *\n * @param options - Configuration options\n * @param options.configArray - Array of flat config items to process\n * @param options.overrides - Optional config overrides to apply\n * @param options.renameMap - Map of old plugin names to new names\n *\n * @example\n * ```ts\n * import { renamePluginInConfigs } from '@zayne-labs/eslint-config'\n * import someConfigs from './some-configs'\n *\n * renamePluginInConfigs({\n * configArray: someConfigs,\n * renameMap: {\n * '@typescript-eslint': 'ts-eslint',\n * 'import-x': 'import',\n * }\n * })\n * ```\n */\n\nexport const renamePluginInConfigs = (options: RenamePluginInConfigsOptions): TypedFlatConfigItem[] => {\n\tconst { configArray, overrides, renameMap } = options;\n\n\tconst renamedConfigs = overrideConfigs({\n\t\tconfigArray,\n\t\toverrides: (configItem) => ({\n\t\t\t...getResolvedOverrides({ configItem, overrides }),\n\n\t\t\t...(isObject(configItem.plugins) && {\n\t\t\t\tplugins: renamePlugins(configItem.plugins, renameMap),\n\t\t\t}),\n\t\t\t...(isObject(configItem.rules) && {\n\t\t\t\trules: renameRules(configItem.rules, renameMap),\n\t\t\t}),\n\t\t}),\n\t});\n\n\treturn renamedConfigs;\n};\n\nconst scopeUrl = fileURLToPath(new URL(\".\", import.meta.url));\nconst isCwdInScope = isPackageExists(\"@zayne-labs/eslint-config\");\n\nexport const isPackageInScope = (name: string): boolean => isPackageExists(name, { paths: [scopeUrl] });\n\n/**\n * @description\n * - Ensures that packages are installed in the current scope.\n * - If they are not installed, and the user is in a TTY, and the user is not in a CI environment,\n * and the user is in the same scope as this package, then prompt the user to\n * install the packages.\n *\n * @param packages - The packages to ensure are installed.\n */\nexport const ensurePackages = async (packages: Array<string | undefined>): Promise<void> => {\n\tif (process.env.CI || !process.stdout.isTTY || !isCwdInScope) return;\n\n\tconst nonExistingPackages = packages.filter((pkg) => pkg && !isPackageInScope(pkg));\n\n\tif (nonExistingPackages.length === 0) return;\n\n\tconst clackPrompt = await import(\"@clack/prompts\");\n\n\tconst result = await clackPrompt.confirm({\n\t\tmessage: `${nonExistingPackages.length === 1 ? \"Package\" : \"Packages\"} required for this config: ${nonExistingPackages.join(\", \")}. Do you want to install ${nonExistingPackages.length === 1 ? \"it\" : \"them\"}?`,\n\t});\n\n\tif (!result) return;\n\n\tconst antfuPkg = await import(\"@antfu/install-pkg\");\n\n\tawait antfuPkg.installPackage(nonExistingPackages as string[], { dev: true });\n};\n\nexport const resolveOptions = <TObject>(option: boolean | TObject | undefined) => {\n\treturn isObject(option) ? option : ({} as TObject);\n};\n\nexport const parserPlain = {\n\tmeta: {\n\t\tname: \"parser-plain\",\n\t},\n\tparseForESLint: (code: string) => ({\n\t\tast: {\n\t\t\tbody: [],\n\t\t\tcomments: [],\n\t\t\tloc: { end: code.length, start: 0 },\n\t\t\trange: [0, code.length],\n\t\t\ttokens: [],\n\t\t\ttype: \"Program\",\n\t\t},\n\t\tscopeManager: null,\n\t\tservices: { isPlain: true },\n\t\tvisitorKeys: {\n\t\t\tProgram: [],\n\t\t},\n\t}),\n};\n\nexport const isInEditorEnv = (): boolean => {\n\tif (process.env.CI) {\n\t\treturn false;\n\t}\n\n\tif (isInGitHooksOrLintStaged()) {\n\t\treturn false;\n\t}\n\n\treturn (\n\t\tBoolean(process.env.VSCODE_PID)\n\t\t|| Boolean(process.env.VSCODE_CWD)\n\t\t|| Boolean(process.env.JETBRAINS_IDE)\n\t\t|| Boolean(process.env.VIM)\n\t\t|| Boolean(process.env.NVIM)\n\t\t|| (Boolean(process.env.ZED_ENVIRONMENT) && !process.env.ZED_TERM)\n\t);\n};\n\nexport const isInGitHooksOrLintStaged = (): boolean => {\n\treturn (\n\t\tBoolean(process.env.GIT_PARAMS)\n\t\t|| Boolean(process.env.VSCODE_GIT_COMMAND)\n\t\t|| Boolean(process.env.npm_lifecycle_script?.startsWith(\"lint-staged\"))\n\t);\n};\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zayne-labs/eslint-config",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.13.
|
|
4
|
+
"version": "0.13.13",
|
|
5
5
|
"description": "Zayne Labs' ESLint config preset",
|
|
6
6
|
"author": "Ryan Zayne",
|
|
7
7
|
"license": "MIT",
|
|
@@ -29,13 +29,13 @@
|
|
|
29
29
|
"node": ">=20.x"
|
|
30
30
|
},
|
|
31
31
|
"peerDependencies": {
|
|
32
|
-
"@eslint-react/eslint-plugin": "^5.
|
|
33
|
-
"@next/eslint-plugin-next": "^16.2.
|
|
34
|
-
"@tanstack/eslint-plugin-query": "^5.100.
|
|
35
|
-
"@tanstack/eslint-plugin-router": "^1.
|
|
32
|
+
"@eslint-react/eslint-plugin": "^5.8.1",
|
|
33
|
+
"@next/eslint-plugin-next": "^16.2.6",
|
|
34
|
+
"@tanstack/eslint-plugin-query": "^5.100.11",
|
|
35
|
+
"@tanstack/eslint-plugin-router": "^1.162.0",
|
|
36
36
|
"astro-eslint-parser": "^1.4.0",
|
|
37
|
-
"eslint": "^10.
|
|
38
|
-
"eslint-config-expo": "^55.0.
|
|
37
|
+
"eslint": "^10.4.0",
|
|
38
|
+
"eslint-config-expo": "^55.0.1",
|
|
39
39
|
"eslint-plugin-astro": "^1.7.0",
|
|
40
40
|
"eslint-plugin-better-tailwindcss": "^4.5.0",
|
|
41
41
|
"eslint-plugin-depend": "^1.5.0",
|
|
@@ -43,13 +43,13 @@
|
|
|
43
43
|
"eslint-plugin-jsx-a11y": "^6.10.2",
|
|
44
44
|
"eslint-plugin-react-hooks": "^7.1.1",
|
|
45
45
|
"eslint-plugin-react-refresh": "^0.5.2",
|
|
46
|
-
"eslint-plugin-react-you-might-not-need-an-effect": "^0.10.
|
|
46
|
+
"eslint-plugin-react-you-might-not-need-an-effect": "^0.10.1",
|
|
47
47
|
"eslint-plugin-solid": "^0.14.5",
|
|
48
48
|
"eslint-plugin-svelte": "^3.17.1",
|
|
49
|
-
"eslint-plugin-vue": "^10.9.
|
|
49
|
+
"eslint-plugin-vue": "^10.9.1",
|
|
50
50
|
"eslint-plugin-vuejs-accessibility": "^2.5.0",
|
|
51
51
|
"eslint-processor-vue-blocks": "^2.0.0",
|
|
52
|
-
"svelte-eslint-parser": "^1.6.
|
|
52
|
+
"svelte-eslint-parser": "^1.6.1",
|
|
53
53
|
"vue-eslint-parser": "^10.4.0"
|
|
54
54
|
},
|
|
55
55
|
"peerDependenciesMeta": {
|
|
@@ -119,16 +119,16 @@
|
|
|
119
119
|
},
|
|
120
120
|
"dependencies": {
|
|
121
121
|
"@antfu/install-pkg": "1.1.0",
|
|
122
|
-
"@clack/prompts": "1.
|
|
122
|
+
"@clack/prompts": "1.4.0",
|
|
123
123
|
"@eslint-community/eslint-plugin-eslint-comments": "4.7.1",
|
|
124
|
-
"@eslint-react/kit": "5.
|
|
125
|
-
"@eslint/compat": "2.0
|
|
124
|
+
"@eslint-react/kit": "5.8.1",
|
|
125
|
+
"@eslint/compat": "2.1.0",
|
|
126
126
|
"@eslint/js": "10.0.1",
|
|
127
127
|
"@eslint/markdown": "8.0.1",
|
|
128
128
|
"@stylistic/eslint-plugin": "5.10.0",
|
|
129
|
-
"@zayne-labs/toolkit-core": "0.12.
|
|
130
|
-
"@zayne-labs/toolkit-type-helpers": "0.12.
|
|
131
|
-
"ansis": "4.
|
|
129
|
+
"@zayne-labs/toolkit-core": "0.12.54",
|
|
130
|
+
"@zayne-labs/toolkit-type-helpers": "0.12.54",
|
|
131
|
+
"ansis": "4.3.0",
|
|
132
132
|
"cac": "7.0.0",
|
|
133
133
|
"eslint-config-flat-gitignore": "2.3.0",
|
|
134
134
|
"eslint-flat-config-utils": "3.2.0",
|
|
@@ -138,7 +138,7 @@
|
|
|
138
138
|
"eslint-plugin-import-x": "4.16.2",
|
|
139
139
|
"eslint-plugin-jsdoc": "62.9.0",
|
|
140
140
|
"eslint-plugin-jsonc": "3.1.2",
|
|
141
|
-
"eslint-plugin-n": "
|
|
141
|
+
"eslint-plugin-n": "18.0.1",
|
|
142
142
|
"eslint-plugin-perfectionist": "5.9.0",
|
|
143
143
|
"eslint-plugin-pnpm": "1.6.0",
|
|
144
144
|
"eslint-plugin-security": "4.0.0",
|
|
@@ -151,27 +151,27 @@
|
|
|
151
151
|
"parse-gitignore": "2.0.0",
|
|
152
152
|
"pnpm-workspace-yaml": "^1.6.0",
|
|
153
153
|
"toml-eslint-parser": "1.0.3",
|
|
154
|
-
"typescript-eslint": "8.59.
|
|
154
|
+
"typescript-eslint": "8.59.4",
|
|
155
155
|
"yaml-eslint-parser": "2.0.0"
|
|
156
156
|
},
|
|
157
157
|
"devDependencies": {
|
|
158
158
|
"@arethetypeswrong/cli": "0.18.2",
|
|
159
159
|
"@changesets/cli": "2.31.0",
|
|
160
|
-
"@eslint-react/eslint-plugin": "^5.
|
|
161
|
-
"@next/eslint-plugin-next": "^16.2.
|
|
162
|
-
"@tanstack/eslint-plugin-query": "^5.100.
|
|
163
|
-
"@tanstack/eslint-plugin-router": "^1.
|
|
160
|
+
"@eslint-react/eslint-plugin": "^5.8.1",
|
|
161
|
+
"@next/eslint-plugin-next": "^16.2.6",
|
|
162
|
+
"@tanstack/eslint-plugin-query": "^5.100.11",
|
|
163
|
+
"@tanstack/eslint-plugin-router": "^1.162.0",
|
|
164
164
|
"@total-typescript/ts-reset": "0.6.1",
|
|
165
165
|
"@types/eslint-plugin-jsx-a11y": "6.10.1",
|
|
166
|
-
"@types/node": "25.
|
|
167
|
-
"@typescript-eslint/parser": "8.59.
|
|
168
|
-
"@typescript-eslint/types": "8.59.
|
|
169
|
-
"@typescript-eslint/utils": "8.59.
|
|
166
|
+
"@types/node": "25.9.0",
|
|
167
|
+
"@typescript-eslint/parser": "8.59.4",
|
|
168
|
+
"@typescript-eslint/types": "8.59.4",
|
|
169
|
+
"@typescript-eslint/utils": "8.59.4",
|
|
170
170
|
"astro-eslint-parser": "^1.4.0",
|
|
171
171
|
"concurrently": "9.2.1",
|
|
172
172
|
"cross-env": "10.1.0",
|
|
173
|
-
"eslint": "^10.
|
|
174
|
-
"eslint-config-expo": "^55.0.
|
|
173
|
+
"eslint": "^10.4.0",
|
|
174
|
+
"eslint-config-expo": "^55.0.1",
|
|
175
175
|
"eslint-plugin-astro": "^1.7.0",
|
|
176
176
|
"eslint-plugin-better-tailwindcss": "^4.5.0",
|
|
177
177
|
"eslint-plugin-depend": "^1.5.0",
|
|
@@ -179,25 +179,25 @@
|
|
|
179
179
|
"eslint-plugin-jsx-a11y": "^6.10.2",
|
|
180
180
|
"eslint-plugin-react-hooks": "^7.1.1",
|
|
181
181
|
"eslint-plugin-react-refresh": "^0.5.2",
|
|
182
|
-
"eslint-plugin-react-you-might-not-need-an-effect": "^0.10.
|
|
182
|
+
"eslint-plugin-react-you-might-not-need-an-effect": "^0.10.1",
|
|
183
183
|
"eslint-plugin-solid": "^0.14.5",
|
|
184
184
|
"eslint-plugin-svelte": "^3.17.1",
|
|
185
|
-
"eslint-plugin-vue": "^10.9.
|
|
185
|
+
"eslint-plugin-vue": "^10.9.1",
|
|
186
186
|
"eslint-plugin-vuejs-accessibility": "^2.5.0",
|
|
187
187
|
"eslint-processor-vue-blocks": "^2.0.0",
|
|
188
188
|
"eslint-typegen": "2.3.1",
|
|
189
189
|
"find-up-simple": "1.0.1",
|
|
190
190
|
"husky": "9.1.7",
|
|
191
|
-
"pkg-pr-new": "0.0.
|
|
191
|
+
"pkg-pr-new": "0.0.74",
|
|
192
192
|
"prettier": "^3.8.3",
|
|
193
|
-
"publint": "0.3.
|
|
194
|
-
"svelte-eslint-parser": "^1.6.
|
|
195
|
-
"tailwindcss": "4.
|
|
196
|
-
"tsdown": "0.
|
|
197
|
-
"tsx": "4.
|
|
193
|
+
"publint": "0.3.21",
|
|
194
|
+
"svelte-eslint-parser": "^1.6.1",
|
|
195
|
+
"tailwindcss": "4.3.0",
|
|
196
|
+
"tsdown": "0.22.0",
|
|
197
|
+
"tsx": "4.22.2",
|
|
198
198
|
"typescript": "6.0.3",
|
|
199
199
|
"vue-eslint-parser": "^10.4.0",
|
|
200
|
-
"@zayne-labs/tsconfig": "0.13.
|
|
200
|
+
"@zayne-labs/tsconfig": "0.13.13"
|
|
201
201
|
},
|
|
202
202
|
"publishConfig": {
|
|
203
203
|
"access": "public",
|