@zayne-labs/eslint-config 0.13.13 → 0.13.14

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 CHANGED
@@ -10,7 +10,7 @@ import fsp from "node:fs/promises";
10
10
  import parse from "parse-gitignore";
11
11
  import { execSync } from "node:child_process";
12
12
  //#region package.json
13
- var version = "0.13.13";
13
+ var version = "0.13.14";
14
14
  //#endregion
15
15
  //#region src/cli/constants.ts
16
16
  const vscodeSettingsString = `
@@ -137,19 +137,19 @@ const updateEslintFiles = async (result) => {
137
137
  //#endregion
138
138
  //#region src/cli/constants-generated.ts
139
139
  const versionsMap = defineEnum({
140
- "@eslint-react/eslint-plugin": "^5.8.1",
140
+ "@eslint-react/eslint-plugin": "^5.8.9",
141
141
  "astro-eslint-parser": "^1.4.0",
142
- eslint: "^10.4.0",
142
+ eslint: "^10.4.1",
143
143
  "eslint-plugin-astro": "^1.7.0",
144
144
  "eslint-plugin-better-tailwindcss": "^4.5.0",
145
145
  "eslint-plugin-react-hooks": "^7.1.1",
146
146
  "eslint-plugin-react-refresh": "^0.5.2",
147
- "eslint-plugin-react-you-might-not-need-an-effect": "^0.10.1",
147
+ "eslint-plugin-react-you-might-not-need-an-effect": "^1.0.0",
148
148
  "eslint-plugin-solid": "^0.14.5",
149
- "eslint-plugin-svelte": "^3.17.1",
149
+ "eslint-plugin-svelte": "^3.19.0",
150
150
  "eslint-plugin-vue": "^10.9.1",
151
151
  "eslint-processor-vue-blocks": "^2.0.0",
152
- "svelte-eslint-parser": "^1.6.1",
152
+ "svelte-eslint-parser": "^1.7.0",
153
153
  "vue-eslint-parser": "^10.4.0"
154
154
  });
155
155
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../package.json","../../src/cli/constants.ts","../../src/cli/utils.ts","../../src/cli/stages/update-eslint-files.ts","../../src/cli/constants-generated.ts","../../src/cli/stages/update-package-json.ts","../../src/cli/stages/update-vscode-settings.ts","../../src/cli/run.ts","../../src/cli/index.ts"],"sourcesContent":["","import { defineEnumDeep } from \"@zayne-labs/toolkit-type-helpers\";\nimport c from \"ansis\";\nimport type { ExtraLibrariesOptionUnion, FrameworkOptionUnion, PromItem } from \"./types\";\n\nexport const vscodeSettingsString = `\n // Auto fix\n // \"editor.codeActionsOnSave\": {\n // \"source.fixAll.eslint\": \"explicit\",\n // },\n\n // Enable eslint for all supported languages\n \"eslint.validate\": [\n \"javascript\",\n \"javascriptreact\",\n \"typescript\",\n \"typescriptreact\",\n \"vue\",\n \"html\",\n \"markdown\",\n \"json\",\n \"json5\",\n \"jsonc\",\n \"yaml\",\n \"toml\",\n \"xml\",\n \"gql\",\n \"graphql\",\n \"astro\",\n \"svelte\",\n \"css\",\n \"less\",\n \"scss\",\n \"postcss\"\n ]\n`;\n\nexport const frameworkOptions: Array<PromItem<FrameworkOptionUnion>> = [\n\t{\n\t\tlabel: c.green(\"Vue\"),\n\t\tvalue: \"vue\",\n\t},\n\t{\n\t\tlabel: c.cyan(\"React\"),\n\t\tvalue: \"react\",\n\t},\n\t{\n\t\tlabel: c.red(\"Svelte\"),\n\t\tvalue: \"svelte\",\n\t},\n\t{\n\t\tlabel: c.magenta(\"Astro\"),\n\t\tvalue: \"astro\",\n\t},\n\t{\n\t\tlabel: c.cyan(\"Solid\"),\n\t\tvalue: \"solid\",\n\t},\n];\n\nexport const frameworks: FrameworkOptionUnion[] = frameworkOptions.map(({ value }) => value);\n\nexport const extraOptions: Array<PromItem<ExtraLibrariesOptionUnion>> = [\n\t{\n\t\tlabel: c.cyan(\"TailwindCSS (Better)\"),\n\t\tvalue: \"tailwindcss-better\",\n\t},\n];\n\nexport const extra = extraOptions.map(({ value }) => value);\n\nexport const dependenciesMap = defineEnumDeep({\n\tastro: [\"eslint-plugin-astro\", \"astro-eslint-parser\"],\n\treact: [\n\t\t\"@eslint-react/eslint-plugin\",\n\t\t\"eslint-plugin-react-hooks\",\n\t\t\"eslint-plugin-react-refresh\",\n\t\t\"eslint-plugin-react-you-might-not-need-an-effect\",\n\t],\n\tsolid: [\"eslint-plugin-solid\"],\n\tsvelte: [\"eslint-plugin-svelte\", \"svelte-eslint-parser\"],\n\t\"tailwindcss-better\": [\"eslint-plugin-better-tailwindcss\"],\n\tvue: [\"eslint-plugin-vue\", \"eslint-processor-vue-blocks\", \"vue-eslint-parser\"],\n}) satisfies Record<ExtraLibrariesOptionUnion | FrameworkOptionUnion, string[]>;\n","/* eslint-disable ts-eslint/restrict-template-expressions -- Ignore */\nimport { execSync } from \"node:child_process\";\n\nexport const isGitClean = (): boolean => {\n\ttry {\n\t\texecSync(\"git diff-index --quiet HEAD --\");\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n};\n\nexport const getEslintConfigContent = (mainConfig: string, additionalConfigs?: string[]): string => {\n\tconst additionalConfigsStr = additionalConfigs?.map((config) => `,{\\n${config}\\n}`);\n\n\treturn `\nimport { zayne } from '@zayne-labs/eslint-config'\n\nexport default zayne({\n${mainConfig}\n}${additionalConfigsStr})\n`.trimStart();\n};\n","/* eslint-disable max-depth -- Allow */\nimport fs from \"node:fs\";\nimport fsp from \"node:fs/promises\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport * as p from \"@clack/prompts\";\nimport c from \"ansis\";\n// @ts-expect-error missing types\nimport parse from \"parse-gitignore\";\nimport type { PromptResult } from \"../types\";\nimport { getEslintConfigContent } from \"../utils\";\n\nexport const updateEslintFiles = async (result: PromptResult): Promise<void> => {\n\tconst cwd = process.cwd();\n\tconst pathESLintIgnore = path.join(cwd, \".eslintignore\");\n\tconst pathPackageJSON = path.join(cwd, \"package.json\");\n\n\tconst pkgContent = await fsp.readFile(pathPackageJSON, \"utf8\");\n\tconst pkg = JSON.parse(pkgContent) as Record<string, unknown>;\n\n\tconst configFileName = pkg.type === \"module\" ? \"eslint.config.js\" : \"eslint.config.mjs\";\n\tconst pathFlatConfig = path.join(cwd, configFileName);\n\n\tconst eslintIgnores: string[] = [];\n\n\tif (fs.existsSync(pathESLintIgnore)) {\n\t\tp.log.step(c.cyan`Migrating existing .eslintignore`);\n\n\t\tconst content = await fsp.readFile(pathESLintIgnore, \"utf8\");\n\t\tconst parsed = parse(content);\n\t\tconst globs = parsed.globs();\n\n\t\tfor (const glob of globs) {\n\t\t\tif (glob.type === \"ignore\") {\n\t\t\t\teslintIgnores.push(...(glob.patterns as string[]));\n\t\t\t}\n\n\t\t\tif (glob.type === \"unignore\") {\n\t\t\t\teslintIgnores.push(...(glob.patterns.map((pattern: string) => `!${pattern}`) as string[]));\n\t\t\t}\n\t\t}\n\t}\n\n\tconst configLines: string[] = [];\n\n\tif (eslintIgnores.length > 0) {\n\t\tconfigLines.push(`ignores: ${JSON.stringify(eslintIgnores)},`);\n\t}\n\n\tif (result.extra.includes(\"tailwindcssBetter\")) {\n\t\tconfigLines.push(`tailwindcssBetter: true,`);\n\t}\n\n\tfor (const framework of result.frameworks) {\n\t\tconfigLines.push(`${framework}: true,`);\n\t}\n\n\tconst mainConfig = configLines.map((line) => ` ${line}`).join(\"\\n\");\n\n\tconst additionalConfig: string[] = [];\n\n\tconst eslintConfigContent: string = getEslintConfigContent(mainConfig, additionalConfig);\n\n\tawait fsp.writeFile(pathFlatConfig, eslintConfigContent);\n\n\tp.log.success(c.green`Created ${configFileName}`);\n};\n","import { defineEnum } from \"@zayne-labs/toolkit-type-helpers\";\n\nexport const versionsMap = defineEnum({\n\t\"@eslint-react/eslint-plugin\": \"^5.8.1\",\n\t\"astro-eslint-parser\": \"^1.4.0\",\n\teslint: \"^10.4.0\",\n\t\"eslint-plugin-astro\": \"^1.7.0\",\n\t\"eslint-plugin-better-tailwindcss\": \"^4.5.0\",\n\t\"eslint-plugin-react-hooks\": \"^7.1.1\",\n\t\"eslint-plugin-react-refresh\": \"^0.5.2\",\n\t\"eslint-plugin-react-you-might-not-need-an-effect\": \"^0.10.1\",\n\t\"eslint-plugin-solid\": \"^0.14.5\",\n\t\"eslint-plugin-svelte\": \"^3.17.1\",\n\t\"eslint-plugin-vue\": \"^10.9.1\",\n\t\"eslint-processor-vue-blocks\": \"^2.0.0\",\n\t\"svelte-eslint-parser\": \"^1.6.1\",\n\t\"vue-eslint-parser\": \"^10.4.0\",\n});\n","import fsp from \"node:fs/promises\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport * as p from \"@clack/prompts\";\nimport c from \"ansis\";\nimport { version } from \"../../../package.json\";\nimport { dependenciesMap } from \"../constants\";\nimport { versionsMap } from \"../constants-generated\";\nimport type { PromptResult } from \"../types\";\n\nexport const updatePackageJson = async (result: PromptResult): Promise<void> => {\n\tconst cwd = process.cwd();\n\n\tconst pathPackageJSON = path.join(cwd, \"package.json\");\n\n\tp.log.step(c.cyan`Bumping @zayne-labs/eslint-config to v${version}`);\n\n\tconst pkgContent = await fsp.readFile(pathPackageJSON, \"utf8\");\n\tconst pkg = JSON.parse(pkgContent) as Record<string, Record<string, string | undefined> | undefined>;\n\n\tpkg.devDependencies ??= {};\n\tpkg.devDependencies[\"@zayne-labs/eslint-config\"] = `^${version}`;\n\tpkg.devDependencies.eslint ??= versionsMap.eslint;\n\n\tconst addedPackages: string[] = [];\n\n\tfor (const item of result.extra) {\n\t\tswitch (item) {\n\t\t\t// eslint-disable-next-line ts-eslint/no-unnecessary-condition -- Ignore\n\t\t\tcase \"tailwindcss-better\": {\n\t\t\t\tdependenciesMap[\"tailwindcss-better\"].forEach((depName) => {\n\t\t\t\t\tpkg.devDependencies\n\t\t\t\t\t\t&& (pkg.devDependencies[depName] = versionsMap[depName as keyof typeof versionsMap]);\n\n\t\t\t\t\taddedPackages.push(depName);\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\titem satisfies never;\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const framework of result.frameworks) {\n\t\tconst dependencies = dependenciesMap[framework];\n\n\t\t// eslint-disable-next-line ts-eslint/no-unnecessary-condition -- Allow\n\t\tif (!dependencies) continue;\n\n\t\tdependencies.forEach((dependency) => {\n\t\t\tif (!pkg.devDependencies) return;\n\n\t\t\tpkg.devDependencies[dependency] = versionsMap[dependency as keyof typeof versionsMap];\n\t\t\taddedPackages.push(dependency);\n\t\t});\n\t}\n\n\tif (addedPackages.length > 0) {\n\t\tp.note(c.dim(addedPackages.join(\", \")), \"Added packages\");\n\t}\n\n\tawait fsp.writeFile(pathPackageJSON, JSON.stringify(pkg, null, 2));\n\n\tp.log.success(c.green`Changes wrote to package.json`);\n};\n","import fs from \"node:fs\";\nimport fsp from \"node:fs/promises\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport * as p from \"@clack/prompts\";\nimport * as ansis from \"ansis\";\nimport { vscodeSettingsString } from \"../constants\";\nimport type { PromptResult } from \"../types\";\n\nexport const updateVscodeSettings = async (result: PromptResult): Promise<void> => {\n\tconst cwd = process.cwd();\n\n\tif (!result.updateVscodeSettings) return;\n\n\tconst dotVscodePath: string = path.join(cwd, \".vscode\");\n\tconst settingsPath: string = path.join(dotVscodePath, \"settings.json\");\n\n\tif (!fs.existsSync(dotVscodePath)) await fsp.mkdir(dotVscodePath, { recursive: true });\n\n\tif (!fs.existsSync(settingsPath)) {\n\t\tawait fsp.writeFile(settingsPath, `{${vscodeSettingsString}}\\n`, \"utf8\");\n\t\tp.log.success(ansis.green`Created .vscode/settings.json`);\n\t} else {\n\t\tlet settingsContent = await fsp.readFile(settingsPath, \"utf8\");\n\n\t\tsettingsContent = settingsContent.trim().replace(/\\s*\\}$/, \"\");\n\t\tsettingsContent += settingsContent.endsWith(\",\") || settingsContent.endsWith(\"{\") ? \"\" : \",\";\n\t\tsettingsContent += `${vscodeSettingsString}}\\n`;\n\n\t\tawait fsp.writeFile(settingsPath, settingsContent, \"utf8\");\n\t\tp.log.success(ansis.green`Updated .vscode/settings.json`);\n\t}\n};\n","/* eslint-disable perfectionist/sort-objects -- Ignore */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport * as p from \"@clack/prompts\";\nimport c from \"ansis\";\nimport { extra, extraOptions, frameworkOptions, frameworks } from \"./constants\";\nimport { updateEslintFiles } from \"./stages/update-eslint-files\";\nimport { updatePackageJson } from \"./stages/update-package-json\";\nimport { updateVscodeSettings } from \"./stages/update-vscode-settings\";\nimport type { ExtraLibrariesOptionUnion, FrameworkOptionUnion, PromptResult } from \"./types\";\nimport { isGitClean } from \"./utils\";\n\nexport type CliRunOptions = {\n\t/**\n\t * Use the extra utils: formatter / perfectionist / unocss\n\t */\n\textra?: string[];\n\t/**\n\t * Use the framework template for optimal customization: vue / react / svelte / astro\n\t */\n\tframeworks?: string[];\n\t/**\n\t * Skip prompts and use default values\n\t */\n\tyes?: boolean;\n};\n\nexport const runCli = async (options: CliRunOptions = {}): Promise<void> => {\n\tconst argSkipPrompt = Boolean(process.env.SKIP_PROMPT) || options.yes;\n\tconst argTemplate = options.frameworks?.map((m) => m.trim()).filter(Boolean);\n\tconst argExtra = options.extra?.map((m) => m.trim()).filter(Boolean);\n\n\tif (fs.existsSync(path.join(process.cwd(), \"eslint.config.js\"))) {\n\t\tp.log.warn(c.yellow`eslint.config.js already exists, migration wizard exited.`);\n\n\t\treturn process.exit(1);\n\t}\n\n\t// Set default value for promptResult if `argSkipPrompt` is enabled\n\tlet result: PromptResult = {\n\t\textra: (argExtra ?? []) as ExtraLibrariesOptionUnion[],\n\t\tframeworks: (argTemplate ?? []) as FrameworkOptionUnion[],\n\t\tuncommittedConfirmed: false,\n\t\tupdateVscodeSettings: true,\n\t};\n\n\tif (!argSkipPrompt) {\n\t\tresult = (await p.group(\n\t\t\t{\n\t\t\t\tuncommittedConfirmed: () => {\n\t\t\t\t\tif (isGitClean()) {\n\t\t\t\t\t\treturn Promise.resolve(true);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn p.confirm({\n\t\t\t\t\t\tinitialValue: false,\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\"There are uncommitted changes in the current repository, are you sure to continue?\",\n\t\t\t\t\t});\n\t\t\t\t},\n\n\t\t\t\tframeworks: ({ results }) => {\n\t\t\t\t\tconst isArgTemplateValid =\n\t\t\t\t\t\t(argTemplate?.length ?? 0) > 0\n\t\t\t\t\t\t&& (argTemplate ?? []).filter((element) => !frameworks.includes(element)).length === 0;\n\n\t\t\t\t\tif (!results.uncommittedConfirmed || isArgTemplateValid) return;\n\n\t\t\t\t\tconst message =\n\t\t\t\t\t\targTemplate ?\n\t\t\t\t\t\t\t`\"${JSON.stringify(argTemplate)}\" isn't a valid template. Please choose from below: `\n\t\t\t\t\t\t:\t\"Select a framework:\";\n\n\t\t\t\t\treturn p.multiselect<FrameworkOptionUnion>({\n\t\t\t\t\t\tmessage: c.reset(message),\n\t\t\t\t\t\toptions: frameworkOptions,\n\t\t\t\t\t\trequired: false,\n\t\t\t\t\t});\n\t\t\t\t},\n\n\t\t\t\textra: ({ results }) => {\n\t\t\t\t\tconst isArgExtraValid =\n\t\t\t\t\t\t(argExtra?.length ?? 0) > 0\n\t\t\t\t\t\t&& (argExtra ?? []).filter((element) => !extra.includes(element)).length === 0;\n\n\t\t\t\t\tif (!results.uncommittedConfirmed || isArgExtraValid) return;\n\n\t\t\t\t\tconst message =\n\t\t\t\t\t\targExtra ?\n\t\t\t\t\t\t\t`\"${JSON.stringify(argExtra)}\" isn't a valid extra util. Please choose from below: `\n\t\t\t\t\t\t:\t\"Select an extra util:\";\n\n\t\t\t\t\treturn p.multiselect<ExtraLibrariesOptionUnion>({\n\t\t\t\t\t\tmessage: c.reset(message),\n\t\t\t\t\t\toptions: extraOptions,\n\t\t\t\t\t\trequired: false,\n\t\t\t\t\t});\n\t\t\t\t},\n\n\t\t\t\tupdateVscodeSettings: ({ results }) => {\n\t\t\t\t\tif (!results.uncommittedConfirmed) return;\n\n\t\t\t\t\treturn p.confirm({\n\t\t\t\t\t\tinitialValue: true,\n\t\t\t\t\t\tmessage: \"Update .vscode/settings.json for better VS Code experience?\",\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tonCancel: () => {\n\t\t\t\t\tp.cancel(\"Operation cancelled.\");\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t},\n\t\t\t}\n\t\t)) as PromptResult;\n\n\t\tif (!result.uncommittedConfirmed) {\n\t\t\treturn process.exit(1);\n\t\t}\n\t}\n\n\tawait updatePackageJson(result);\n\tawait updateEslintFiles(result);\n\tawait updateVscodeSettings(result);\n\n\tp.log.success(c.green`Setup completed`);\n\n\tp.outro(\n\t\t`Now you can update the dependencies by running ${c.blue(\"pnpm install\")} and also ${c.blue(\"eslint --fix\")}\\n`\n\t);\n};\n","import process from \"node:process\";\nimport * as p from \"@clack/prompts\";\nimport c from \"ansis\";\nimport { cac } from \"cac\";\nimport { version } from \"../../package.json\";\nimport { runCli, type CliRunOptions } from \"./run\";\n\nconst header = () => {\n\tp.intro(`${c.green`@zayne-labs/eslint-config `}${c.dim`v${version}`}`);\n};\n\nconst cli = cac(\"@zayne-labs/eslint-config\");\n\ncli.command(\"\", \"Run the initialization or migration\")\n\t.option(\"--yes, -y\", \"Skip prompts and use default values\", { default: false })\n\t.option(\n\t\t\"--template, -t <template>\",\n\t\t\"Use the framework template for optimal customization: vue / react / svelte / astro\",\n\t\t{ type: [] }\n\t)\n\t.option(\"--extra, -e <extra>\", \"Use the extra utils: tailwindcss\", { type: [] })\n\t.action(async (options: CliRunOptions) => {\n\t\theader();\n\t\ttry {\n\t\t\tawait runCli(options);\n\t\t} catch (error) {\n\t\t\tp.log.error(c.inverse.red(\" Failed to migrate \"));\n\t\t\tp.log.error(c.red`✘ ${String(error)}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n\ncli.help();\ncli.version(version);\ncli.parse();\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../package.json","../../src/cli/constants.ts","../../src/cli/utils.ts","../../src/cli/stages/update-eslint-files.ts","../../src/cli/constants-generated.ts","../../src/cli/stages/update-package-json.ts","../../src/cli/stages/update-vscode-settings.ts","../../src/cli/run.ts","../../src/cli/index.ts"],"sourcesContent":["","import { defineEnumDeep } from \"@zayne-labs/toolkit-type-helpers\";\nimport c from \"ansis\";\nimport type { ExtraLibrariesOptionUnion, FrameworkOptionUnion, PromItem } from \"./types\";\n\nexport const vscodeSettingsString = `\n // Auto fix\n // \"editor.codeActionsOnSave\": {\n // \"source.fixAll.eslint\": \"explicit\",\n // },\n\n // Enable eslint for all supported languages\n \"eslint.validate\": [\n \"javascript\",\n \"javascriptreact\",\n \"typescript\",\n \"typescriptreact\",\n \"vue\",\n \"html\",\n \"markdown\",\n \"json\",\n \"json5\",\n \"jsonc\",\n \"yaml\",\n \"toml\",\n \"xml\",\n \"gql\",\n \"graphql\",\n \"astro\",\n \"svelte\",\n \"css\",\n \"less\",\n \"scss\",\n \"postcss\"\n ]\n`;\n\nexport const frameworkOptions: Array<PromItem<FrameworkOptionUnion>> = [\n\t{\n\t\tlabel: c.green(\"Vue\"),\n\t\tvalue: \"vue\",\n\t},\n\t{\n\t\tlabel: c.cyan(\"React\"),\n\t\tvalue: \"react\",\n\t},\n\t{\n\t\tlabel: c.red(\"Svelte\"),\n\t\tvalue: \"svelte\",\n\t},\n\t{\n\t\tlabel: c.magenta(\"Astro\"),\n\t\tvalue: \"astro\",\n\t},\n\t{\n\t\tlabel: c.cyan(\"Solid\"),\n\t\tvalue: \"solid\",\n\t},\n];\n\nexport const frameworks: FrameworkOptionUnion[] = frameworkOptions.map(({ value }) => value);\n\nexport const extraOptions: Array<PromItem<ExtraLibrariesOptionUnion>> = [\n\t{\n\t\tlabel: c.cyan(\"TailwindCSS (Better)\"),\n\t\tvalue: \"tailwindcss-better\",\n\t},\n];\n\nexport const extra = extraOptions.map(({ value }) => value);\n\nexport const dependenciesMap = defineEnumDeep({\n\tastro: [\"eslint-plugin-astro\", \"astro-eslint-parser\"],\n\treact: [\n\t\t\"@eslint-react/eslint-plugin\",\n\t\t\"eslint-plugin-react-hooks\",\n\t\t\"eslint-plugin-react-refresh\",\n\t\t\"eslint-plugin-react-you-might-not-need-an-effect\",\n\t],\n\tsolid: [\"eslint-plugin-solid\"],\n\tsvelte: [\"eslint-plugin-svelte\", \"svelte-eslint-parser\"],\n\t\"tailwindcss-better\": [\"eslint-plugin-better-tailwindcss\"],\n\tvue: [\"eslint-plugin-vue\", \"eslint-processor-vue-blocks\", \"vue-eslint-parser\"],\n}) satisfies Record<ExtraLibrariesOptionUnion | FrameworkOptionUnion, string[]>;\n","/* eslint-disable ts-eslint/restrict-template-expressions -- Ignore */\nimport { execSync } from \"node:child_process\";\n\nexport const isGitClean = (): boolean => {\n\ttry {\n\t\texecSync(\"git diff-index --quiet HEAD --\");\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n};\n\nexport const getEslintConfigContent = (mainConfig: string, additionalConfigs?: string[]): string => {\n\tconst additionalConfigsStr = additionalConfigs?.map((config) => `,{\\n${config}\\n}`);\n\n\treturn `\nimport { zayne } from '@zayne-labs/eslint-config'\n\nexport default zayne({\n${mainConfig}\n}${additionalConfigsStr})\n`.trimStart();\n};\n","/* eslint-disable max-depth -- Allow */\nimport fs from \"node:fs\";\nimport fsp from \"node:fs/promises\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport * as p from \"@clack/prompts\";\nimport c from \"ansis\";\n// @ts-expect-error missing types\nimport parse from \"parse-gitignore\";\nimport type { PromptResult } from \"../types\";\nimport { getEslintConfigContent } from \"../utils\";\n\nexport const updateEslintFiles = async (result: PromptResult): Promise<void> => {\n\tconst cwd = process.cwd();\n\tconst pathESLintIgnore = path.join(cwd, \".eslintignore\");\n\tconst pathPackageJSON = path.join(cwd, \"package.json\");\n\n\tconst pkgContent = await fsp.readFile(pathPackageJSON, \"utf8\");\n\tconst pkg = JSON.parse(pkgContent) as Record<string, unknown>;\n\n\tconst configFileName = pkg.type === \"module\" ? \"eslint.config.js\" : \"eslint.config.mjs\";\n\tconst pathFlatConfig = path.join(cwd, configFileName);\n\n\tconst eslintIgnores: string[] = [];\n\n\tif (fs.existsSync(pathESLintIgnore)) {\n\t\tp.log.step(c.cyan`Migrating existing .eslintignore`);\n\n\t\tconst content = await fsp.readFile(pathESLintIgnore, \"utf8\");\n\t\tconst parsed = parse(content);\n\t\tconst globs = parsed.globs();\n\n\t\tfor (const glob of globs) {\n\t\t\tif (glob.type === \"ignore\") {\n\t\t\t\teslintIgnores.push(...(glob.patterns as string[]));\n\t\t\t}\n\n\t\t\tif (glob.type === \"unignore\") {\n\t\t\t\teslintIgnores.push(...(glob.patterns.map((pattern: string) => `!${pattern}`) as string[]));\n\t\t\t}\n\t\t}\n\t}\n\n\tconst configLines: string[] = [];\n\n\tif (eslintIgnores.length > 0) {\n\t\tconfigLines.push(`ignores: ${JSON.stringify(eslintIgnores)},`);\n\t}\n\n\tif (result.extra.includes(\"tailwindcssBetter\")) {\n\t\tconfigLines.push(`tailwindcssBetter: true,`);\n\t}\n\n\tfor (const framework of result.frameworks) {\n\t\tconfigLines.push(`${framework}: true,`);\n\t}\n\n\tconst mainConfig = configLines.map((line) => ` ${line}`).join(\"\\n\");\n\n\tconst additionalConfig: string[] = [];\n\n\tconst eslintConfigContent: string = getEslintConfigContent(mainConfig, additionalConfig);\n\n\tawait fsp.writeFile(pathFlatConfig, eslintConfigContent);\n\n\tp.log.success(c.green`Created ${configFileName}`);\n};\n","import { defineEnum } from \"@zayne-labs/toolkit-type-helpers\";\n\nexport const versionsMap = defineEnum({\n\t\"@eslint-react/eslint-plugin\": \"^5.8.9\",\n\t\"astro-eslint-parser\": \"^1.4.0\",\n\teslint: \"^10.4.1\",\n\t\"eslint-plugin-astro\": \"^1.7.0\",\n\t\"eslint-plugin-better-tailwindcss\": \"^4.5.0\",\n\t\"eslint-plugin-react-hooks\": \"^7.1.1\",\n\t\"eslint-plugin-react-refresh\": \"^0.5.2\",\n\t\"eslint-plugin-react-you-might-not-need-an-effect\": \"^1.0.0\",\n\t\"eslint-plugin-solid\": \"^0.14.5\",\n\t\"eslint-plugin-svelte\": \"^3.19.0\",\n\t\"eslint-plugin-vue\": \"^10.9.1\",\n\t\"eslint-processor-vue-blocks\": \"^2.0.0\",\n\t\"svelte-eslint-parser\": \"^1.7.0\",\n\t\"vue-eslint-parser\": \"^10.4.0\",\n});\n","import fsp from \"node:fs/promises\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport * as p from \"@clack/prompts\";\nimport c from \"ansis\";\nimport { version } from \"../../../package.json\";\nimport { dependenciesMap } from \"../constants\";\nimport { versionsMap } from \"../constants-generated\";\nimport type { PromptResult } from \"../types\";\n\nexport const updatePackageJson = async (result: PromptResult): Promise<void> => {\n\tconst cwd = process.cwd();\n\n\tconst pathPackageJSON = path.join(cwd, \"package.json\");\n\n\tp.log.step(c.cyan`Bumping @zayne-labs/eslint-config to v${version}`);\n\n\tconst pkgContent = await fsp.readFile(pathPackageJSON, \"utf8\");\n\tconst pkg = JSON.parse(pkgContent) as Record<string, Record<string, string | undefined> | undefined>;\n\n\tpkg.devDependencies ??= {};\n\tpkg.devDependencies[\"@zayne-labs/eslint-config\"] = `^${version}`;\n\tpkg.devDependencies.eslint ??= versionsMap.eslint;\n\n\tconst addedPackages: string[] = [];\n\n\tfor (const item of result.extra) {\n\t\tswitch (item) {\n\t\t\t// eslint-disable-next-line ts-eslint/no-unnecessary-condition -- Ignore\n\t\t\tcase \"tailwindcss-better\": {\n\t\t\t\tdependenciesMap[\"tailwindcss-better\"].forEach((depName) => {\n\t\t\t\t\tpkg.devDependencies\n\t\t\t\t\t\t&& (pkg.devDependencies[depName] = versionsMap[depName as keyof typeof versionsMap]);\n\n\t\t\t\t\taddedPackages.push(depName);\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\titem satisfies never;\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const framework of result.frameworks) {\n\t\tconst dependencies = dependenciesMap[framework];\n\n\t\t// eslint-disable-next-line ts-eslint/no-unnecessary-condition -- Allow\n\t\tif (!dependencies) continue;\n\n\t\tdependencies.forEach((dependency) => {\n\t\t\tif (!pkg.devDependencies) return;\n\n\t\t\tpkg.devDependencies[dependency] = versionsMap[dependency as keyof typeof versionsMap];\n\t\t\taddedPackages.push(dependency);\n\t\t});\n\t}\n\n\tif (addedPackages.length > 0) {\n\t\tp.note(c.dim(addedPackages.join(\", \")), \"Added packages\");\n\t}\n\n\tawait fsp.writeFile(pathPackageJSON, JSON.stringify(pkg, null, 2));\n\n\tp.log.success(c.green`Changes wrote to package.json`);\n};\n","import fs from \"node:fs\";\nimport fsp from \"node:fs/promises\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport * as p from \"@clack/prompts\";\nimport * as ansis from \"ansis\";\nimport { vscodeSettingsString } from \"../constants\";\nimport type { PromptResult } from \"../types\";\n\nexport const updateVscodeSettings = async (result: PromptResult): Promise<void> => {\n\tconst cwd = process.cwd();\n\n\tif (!result.updateVscodeSettings) return;\n\n\tconst dotVscodePath: string = path.join(cwd, \".vscode\");\n\tconst settingsPath: string = path.join(dotVscodePath, \"settings.json\");\n\n\tif (!fs.existsSync(dotVscodePath)) await fsp.mkdir(dotVscodePath, { recursive: true });\n\n\tif (!fs.existsSync(settingsPath)) {\n\t\tawait fsp.writeFile(settingsPath, `{${vscodeSettingsString}}\\n`, \"utf8\");\n\t\tp.log.success(ansis.green`Created .vscode/settings.json`);\n\t} else {\n\t\tlet settingsContent = await fsp.readFile(settingsPath, \"utf8\");\n\n\t\tsettingsContent = settingsContent.trim().replace(/\\s*\\}$/, \"\");\n\t\tsettingsContent += settingsContent.endsWith(\",\") || settingsContent.endsWith(\"{\") ? \"\" : \",\";\n\t\tsettingsContent += `${vscodeSettingsString}}\\n`;\n\n\t\tawait fsp.writeFile(settingsPath, settingsContent, \"utf8\");\n\t\tp.log.success(ansis.green`Updated .vscode/settings.json`);\n\t}\n};\n","/* eslint-disable perfectionist/sort-objects -- Ignore */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport * as p from \"@clack/prompts\";\nimport c from \"ansis\";\nimport { extra, extraOptions, frameworkOptions, frameworks } from \"./constants\";\nimport { updateEslintFiles } from \"./stages/update-eslint-files\";\nimport { updatePackageJson } from \"./stages/update-package-json\";\nimport { updateVscodeSettings } from \"./stages/update-vscode-settings\";\nimport type { ExtraLibrariesOptionUnion, FrameworkOptionUnion, PromptResult } from \"./types\";\nimport { isGitClean } from \"./utils\";\n\nexport type CliRunOptions = {\n\t/**\n\t * Use the extra utils: formatter / perfectionist / unocss\n\t */\n\textra?: string[];\n\t/**\n\t * Use the framework template for optimal customization: vue / react / svelte / astro\n\t */\n\tframeworks?: string[];\n\t/**\n\t * Skip prompts and use default values\n\t */\n\tyes?: boolean;\n};\n\nexport const runCli = async (options: CliRunOptions = {}): Promise<void> => {\n\tconst argSkipPrompt = Boolean(process.env.SKIP_PROMPT) || options.yes;\n\tconst argTemplate = options.frameworks?.map((m) => m.trim()).filter(Boolean);\n\tconst argExtra = options.extra?.map((m) => m.trim()).filter(Boolean);\n\n\tif (fs.existsSync(path.join(process.cwd(), \"eslint.config.js\"))) {\n\t\tp.log.warn(c.yellow`eslint.config.js already exists, migration wizard exited.`);\n\n\t\treturn process.exit(1);\n\t}\n\n\t// Set default value for promptResult if `argSkipPrompt` is enabled\n\tlet result: PromptResult = {\n\t\textra: (argExtra ?? []) as ExtraLibrariesOptionUnion[],\n\t\tframeworks: (argTemplate ?? []) as FrameworkOptionUnion[],\n\t\tuncommittedConfirmed: false,\n\t\tupdateVscodeSettings: true,\n\t};\n\n\tif (!argSkipPrompt) {\n\t\tresult = (await p.group(\n\t\t\t{\n\t\t\t\tuncommittedConfirmed: () => {\n\t\t\t\t\tif (isGitClean()) {\n\t\t\t\t\t\treturn Promise.resolve(true);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn p.confirm({\n\t\t\t\t\t\tinitialValue: false,\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\"There are uncommitted changes in the current repository, are you sure to continue?\",\n\t\t\t\t\t});\n\t\t\t\t},\n\n\t\t\t\tframeworks: ({ results }) => {\n\t\t\t\t\tconst isArgTemplateValid =\n\t\t\t\t\t\t(argTemplate?.length ?? 0) > 0\n\t\t\t\t\t\t&& (argTemplate ?? []).filter((element) => !frameworks.includes(element)).length === 0;\n\n\t\t\t\t\tif (!results.uncommittedConfirmed || isArgTemplateValid) return;\n\n\t\t\t\t\tconst message =\n\t\t\t\t\t\targTemplate ?\n\t\t\t\t\t\t\t`\"${JSON.stringify(argTemplate)}\" isn't a valid template. Please choose from below: `\n\t\t\t\t\t\t:\t\"Select a framework:\";\n\n\t\t\t\t\treturn p.multiselect<FrameworkOptionUnion>({\n\t\t\t\t\t\tmessage: c.reset(message),\n\t\t\t\t\t\toptions: frameworkOptions,\n\t\t\t\t\t\trequired: false,\n\t\t\t\t\t});\n\t\t\t\t},\n\n\t\t\t\textra: ({ results }) => {\n\t\t\t\t\tconst isArgExtraValid =\n\t\t\t\t\t\t(argExtra?.length ?? 0) > 0\n\t\t\t\t\t\t&& (argExtra ?? []).filter((element) => !extra.includes(element)).length === 0;\n\n\t\t\t\t\tif (!results.uncommittedConfirmed || isArgExtraValid) return;\n\n\t\t\t\t\tconst message =\n\t\t\t\t\t\targExtra ?\n\t\t\t\t\t\t\t`\"${JSON.stringify(argExtra)}\" isn't a valid extra util. Please choose from below: `\n\t\t\t\t\t\t:\t\"Select an extra util:\";\n\n\t\t\t\t\treturn p.multiselect<ExtraLibrariesOptionUnion>({\n\t\t\t\t\t\tmessage: c.reset(message),\n\t\t\t\t\t\toptions: extraOptions,\n\t\t\t\t\t\trequired: false,\n\t\t\t\t\t});\n\t\t\t\t},\n\n\t\t\t\tupdateVscodeSettings: ({ results }) => {\n\t\t\t\t\tif (!results.uncommittedConfirmed) return;\n\n\t\t\t\t\treturn p.confirm({\n\t\t\t\t\t\tinitialValue: true,\n\t\t\t\t\t\tmessage: \"Update .vscode/settings.json for better VS Code experience?\",\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tonCancel: () => {\n\t\t\t\t\tp.cancel(\"Operation cancelled.\");\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t},\n\t\t\t}\n\t\t)) as PromptResult;\n\n\t\tif (!result.uncommittedConfirmed) {\n\t\t\treturn process.exit(1);\n\t\t}\n\t}\n\n\tawait updatePackageJson(result);\n\tawait updateEslintFiles(result);\n\tawait updateVscodeSettings(result);\n\n\tp.log.success(c.green`Setup completed`);\n\n\tp.outro(\n\t\t`Now you can update the dependencies by running ${c.blue(\"pnpm install\")} and also ${c.blue(\"eslint --fix\")}\\n`\n\t);\n};\n","import process from \"node:process\";\nimport * as p from \"@clack/prompts\";\nimport c from \"ansis\";\nimport { cac } from \"cac\";\nimport { version } from \"../../package.json\";\nimport { runCli, type CliRunOptions } from \"./run\";\n\nconst header = () => {\n\tp.intro(`${c.green`@zayne-labs/eslint-config `}${c.dim`v${version}`}`);\n};\n\nconst cli = cac(\"@zayne-labs/eslint-config\");\n\ncli.command(\"\", \"Run the initialization or migration\")\n\t.option(\"--yes, -y\", \"Skip prompts and use default values\", { default: false })\n\t.option(\n\t\t\"--template, -t <template>\",\n\t\t\"Use the framework template for optimal customization: vue / react / svelte / astro\",\n\t\t{ type: [] }\n\t)\n\t.option(\"--extra, -e <extra>\", \"Use the extra utils: tailwindcss\", { type: [] })\n\t.action(async (options: CliRunOptions) => {\n\t\theader();\n\t\ttry {\n\t\t\tawait runCli(options);\n\t\t} catch (error) {\n\t\t\tp.log.error(c.inverse.red(\" Failed to migrate \"));\n\t\t\tp.log.error(c.red`✘ ${String(error)}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n\ncli.help();\ncli.version(version);\ncli.parse();\n"],"mappings":"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"}
@@ -3532,6 +3532,11 @@ interface RuleOptions {
3532
3532
  * @see https://react.dev/learn/you-might-not-need-an-effect#sharing-logic-between-event-handlers
3533
3533
  */
3534
3534
  'react-you-might-not-need-an-effect/no-event-handler'?: Linter.RuleEntry<[]>;
3535
+ /**
3536
+ * Disallow subscribing to an external store in an effect.
3537
+ * @see https://react.dev/learn/you-might-not-need-an-effect#subscribing-to-an-external-store
3538
+ */
3539
+ 'react-you-might-not-need-an-effect/no-external-store-subscription'?: Linter.RuleEntry<[]>;
3535
3540
  /**
3536
3541
  * Disallow initializing state in an effect.
3537
3542
  * @see https://tkdodo.eu/blog/avoiding-hydration-mismatches-with-use-sync-external-store
@@ -3701,7 +3706,7 @@ interface RuleOptions {
3701
3706
  */
3702
3707
  'react/jsx-shorthand-fragment'?: Linter.RuleEntry<ReactJsxShorthandFragment>;
3703
3708
  /**
3704
- * Enforces the context name to be a valid component name with the suffix 'Context'.
3709
+ * Enforces identifier names assigned from `createContext` calls to be a valid component name with the suffix `Context`.
3705
3710
  * @see https://eslint-react.xyz/docs/rules/naming-convention-context-name
3706
3711
  */
3707
3712
  'react/naming-convention-context-name'?: Linter.RuleEntry<[]>;
@@ -3781,7 +3786,7 @@ interface RuleOptions {
3781
3786
  */
3782
3787
  'react/no-context-provider'?: Linter.RuleEntry<[]>;
3783
3788
  /**
3784
- * Disallows 'createRef' in function components.
3789
+ * Disallows 'createRef' in function components and Hooks.
3785
3790
  * @see https://eslint-react.xyz/docs/rules/no-create-ref
3786
3791
  */
3787
3792
  'react/no-create-ref'?: Linter.RuleEntry<[]>;
@@ -3906,7 +3911,7 @@ interface RuleOptions {
3906
3911
  */
3907
3912
  'react/no-unused-props'?: Linter.RuleEntry<[]>;
3908
3913
  /**
3909
- * Warns about state variables that are defined but never used, or only used in effects.
3914
+ * Warns about state variables that are defined but never used.
3910
3915
  * @see https://eslint-react.xyz/docs/rules/no-unused-state
3911
3916
  */
3912
3917
  'react/no-unused-state'?: Linter.RuleEntry<[]>;
@@ -4076,7 +4081,7 @@ interface RuleOptions {
4076
4081
  */
4077
4082
  'react/x-no-context-provider'?: Linter.RuleEntry<[]>;
4078
4083
  /**
4079
- * Disallows 'createRef' in function components.
4084
+ * Disallows 'createRef' in function components and Hooks.
4080
4085
  * @see https://eslint-react.xyz/docs/rules/no-create-ref
4081
4086
  */
4082
4087
  'react/x-no-create-ref'?: Linter.RuleEntry<[]>;
@@ -4201,7 +4206,7 @@ interface RuleOptions {
4201
4206
  */
4202
4207
  'react/x-no-unused-props'?: Linter.RuleEntry<[]>;
4203
4208
  /**
4204
- * Warns about state variables that are defined but never used, or only used in effects.
4209
+ * Warns about state variables that are defined but never used.
4205
4210
  * @see https://eslint-react.xyz/docs/rules/no-unused-state
4206
4211
  */
4207
4212
  'react/x-no-unused-state'?: Linter.RuleEntry<[]>;
@@ -21134,4 +21139,4 @@ interface OptionsConfig extends OptionsComponentExts, OptionsComponentExtsTypeAw
21134
21139
  type ExtractOptions<TUnion> = Extract<TUnion, object>;
21135
21140
  //#endregion
21136
21141
  export { RuleOptions as A, OptionsTypeScriptErasableOnly as C, OptionsVue as D, OptionsTypescript as E, TypedFlatConfigItem as O, OptionsTanstack as S, OptionsTypeScriptWithTypes as T, OptionsReact as _, OptionsConfig as a, OptionsTailwindCSS as b, OptionsHasJsx as c, OptionsJSX as d, OptionsMarkdown as f, OptionsPnpm as g, OptionsOverridesMultiple as h, OptionsComponentExtsTypeAware as i, ConfigNames as k, OptionsHasTypeScript as l, OptionsOverrides as m, OptionsAppType as n, OptionsE18e as o, OptionsNode as p, OptionsComponentExts as r, OptionsFiles as s, ExtractOptions as t, OptionsIsInEditor as u, OptionsRegExp as v, OptionsTypeScriptParserOptions as w, OptionsTailwindCSSBetter as x, OptionsStylistic as y };
21137
- //# sourceMappingURL=index-B8a2EaF4.d.ts.map
21142
+ //# sourceMappingURL=index-BCpY0GFi.d.ts.map
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { A as RuleOptions, C as OptionsTypeScriptErasableOnly, D as OptionsVue, E as OptionsTypescript, O as TypedFlatConfigItem, S as OptionsTanstack, T as OptionsTypeScriptWithTypes, _ as OptionsReact, a as OptionsConfig, b as OptionsTailwindCSS, c as OptionsHasJsx, d as OptionsJSX, f as OptionsMarkdown, g as OptionsPnpm, h as OptionsOverridesMultiple, i as OptionsComponentExtsTypeAware, k as ConfigNames, l as OptionsHasTypeScript, m as OptionsOverrides, n as OptionsAppType, o as OptionsE18e, p as OptionsNode, r as OptionsComponentExts, s as OptionsFiles, t as ExtractOptions, u as OptionsIsInEditor, v as OptionsRegExp, w as OptionsTypeScriptParserOptions, x as OptionsTailwindCSSBetter, y as OptionsStylistic } from "./index-B8a2EaF4.js";
1
+ import { A as RuleOptions, C as OptionsTypeScriptErasableOnly, D as OptionsVue, E as OptionsTypescript, O as TypedFlatConfigItem, S as OptionsTanstack, T as OptionsTypeScriptWithTypes, _ as OptionsReact, a as OptionsConfig, b as OptionsTailwindCSS, c as OptionsHasJsx, d as OptionsJSX, f as OptionsMarkdown, g as OptionsPnpm, h as OptionsOverridesMultiple, i as OptionsComponentExtsTypeAware, k as ConfigNames, l as OptionsHasTypeScript, m as OptionsOverrides, n as OptionsAppType, o as OptionsE18e, p as OptionsNode, r as OptionsComponentExts, s as OptionsFiles, t as ExtractOptions, u as OptionsIsInEditor, v as OptionsRegExp, w as OptionsTypeScriptParserOptions, x as OptionsTailwindCSSBetter, y as OptionsStylistic } from "./index-BCpY0GFi.js";
2
2
  import { Awaitable } from "@zayne-labs/toolkit-type-helpers";
3
3
  import { FlatConfigComposer } from "eslint-flat-config-utils";
4
4
  import { Linter } from "eslint";
package/dist/index.js CHANGED
@@ -980,7 +980,7 @@ const react = async (options = {}) => {
980
980
  ]);
981
981
  const [eslintPluginReact, eslintPluginCustomJsxRules, eslintReactHooks, eslintPluginReactRefresh, eslintPluginReactYouMightNotNeedAnEffect, eslintPluginNextjs] = await Promise.all([
982
982
  enableReact ? interopDefault(import("@eslint-react/eslint-plugin")) : void 0,
983
- enableReact ? interopDefault(import("./jsxRules-BAjKnxGs.js")) : void 0,
983
+ enableReact ? interopDefault(import("./jsxRules-ScZVboN0.js")) : void 0,
984
984
  enableReact ? interopDefault(import("eslint-plugin-react-hooks")) : void 0,
985
985
  refresh ? interopDefault(import("eslint-plugin-react-refresh")) : void 0,
986
986
  youMightNotNeedAnEffect ? interopDefault(import("eslint-plugin-react-you-might-not-need-an-effect")) : void 0,
@@ -106,4 +106,4 @@ const getCustomJsxPlugin = () => {
106
106
  //#endregion
107
107
  export { getCustomJsxPlugin };
108
108
 
109
- //# sourceMappingURL=jsxRules-BAjKnxGs.js.map
109
+ //# sourceMappingURL=jsxRules-ScZVboN0.js.map
@@ -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-ScZVboN0.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
@@ -1,4 +1,4 @@
1
- import { O as TypedFlatConfigItem } from "./index-B8a2EaF4.js";
1
+ import { O as TypedFlatConfigItem } from "./index-BCpY0GFi.js";
2
2
  import { Awaitable } from "@zayne-labs/toolkit-type-helpers";
3
3
  import { ESLint } from "eslint";
4
4
 
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.13",
4
+ "version": "0.13.14",
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.8.1",
33
- "@next/eslint-plugin-next": "^16.2.6",
34
- "@tanstack/eslint-plugin-query": "^5.100.11",
32
+ "@eslint-react/eslint-plugin": "^5.8.9",
33
+ "@next/eslint-plugin-next": "^16.2.7",
34
+ "@tanstack/eslint-plugin-query": "^5.100.14",
35
35
  "@tanstack/eslint-plugin-router": "^1.162.0",
36
36
  "astro-eslint-parser": "^1.4.0",
37
- "eslint": "^10.4.0",
38
- "eslint-config-expo": "^55.0.1",
37
+ "eslint": "^10.4.1",
38
+ "eslint-config-expo": "^56.0.4",
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.1",
46
+ "eslint-plugin-react-you-might-not-need-an-effect": "^1.0.0",
47
47
  "eslint-plugin-solid": "^0.14.5",
48
- "eslint-plugin-svelte": "^3.17.1",
48
+ "eslint-plugin-svelte": "^3.19.0",
49
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.1",
52
+ "svelte-eslint-parser": "^1.7.0",
53
53
  "vue-eslint-parser": "^10.4.0"
54
54
  },
55
55
  "peerDependenciesMeta": {
@@ -119,59 +119,59 @@
119
119
  },
120
120
  "dependencies": {
121
121
  "@antfu/install-pkg": "1.1.0",
122
- "@clack/prompts": "1.4.0",
123
- "@eslint-community/eslint-plugin-eslint-comments": "4.7.1",
124
- "@eslint-react/kit": "5.8.1",
122
+ "@clack/prompts": "1.5.0",
123
+ "@eslint-community/eslint-plugin-eslint-comments": "4.7.2",
124
+ "@eslint-react/kit": "5.8.9",
125
125
  "@eslint/compat": "2.1.0",
126
126
  "@eslint/js": "10.0.1",
127
- "@eslint/markdown": "8.0.1",
127
+ "@eslint/markdown": "8.0.2",
128
128
  "@stylistic/eslint-plugin": "5.10.0",
129
- "@zayne-labs/toolkit-core": "0.12.54",
130
- "@zayne-labs/toolkit-type-helpers": "0.12.54",
131
- "ansis": "4.3.0",
129
+ "@zayne-labs/toolkit-core": "0.12.55",
130
+ "@zayne-labs/toolkit-type-helpers": "0.12.55",
131
+ "ansis": "4.3.1",
132
132
  "cac": "7.0.0",
133
133
  "eslint-config-flat-gitignore": "2.3.0",
134
134
  "eslint-flat-config-utils": "3.2.0",
135
- "eslint-import-resolver-typescript": "4.4.4",
135
+ "eslint-import-resolver-typescript": "4.4.5",
136
136
  "eslint-merge-processors": "2.0.0",
137
137
  "eslint-plugin-command": "^3.5.2",
138
138
  "eslint-plugin-import-x": "4.16.2",
139
- "eslint-plugin-jsdoc": "62.9.0",
140
- "eslint-plugin-jsonc": "3.1.2",
139
+ "eslint-plugin-jsdoc": "63.0.1",
140
+ "eslint-plugin-jsonc": "3.2.0",
141
141
  "eslint-plugin-n": "18.0.1",
142
142
  "eslint-plugin-perfectionist": "5.9.0",
143
- "eslint-plugin-pnpm": "1.6.0",
143
+ "eslint-plugin-pnpm": "1.6.1",
144
144
  "eslint-plugin-security": "4.0.0",
145
- "eslint-plugin-toml": "1.3.1",
145
+ "eslint-plugin-toml": "1.4.0",
146
146
  "eslint-plugin-unicorn": "64.0.0",
147
- "eslint-plugin-yml": "3.3.2",
147
+ "eslint-plugin-yml": "3.4.0",
148
148
  "globals": "17.6.0",
149
149
  "jsonc-eslint-parser": "3.1.0",
150
- "local-pkg": "1.1.2",
150
+ "local-pkg": "1.2.1",
151
151
  "parse-gitignore": "2.0.0",
152
- "pnpm-workspace-yaml": "^1.6.0",
152
+ "pnpm-workspace-yaml": "^1.6.1",
153
153
  "toml-eslint-parser": "1.0.3",
154
- "typescript-eslint": "8.59.4",
154
+ "typescript-eslint": "8.60.1",
155
155
  "yaml-eslint-parser": "2.0.0"
156
156
  },
157
157
  "devDependencies": {
158
- "@arethetypeswrong/cli": "0.18.2",
158
+ "@arethetypeswrong/cli": "0.18.3",
159
159
  "@changesets/cli": "2.31.0",
160
- "@eslint-react/eslint-plugin": "^5.8.1",
161
- "@next/eslint-plugin-next": "^16.2.6",
162
- "@tanstack/eslint-plugin-query": "^5.100.11",
160
+ "@eslint-react/eslint-plugin": "^5.8.9",
161
+ "@next/eslint-plugin-next": "^16.2.7",
162
+ "@tanstack/eslint-plugin-query": "^5.100.14",
163
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.9.0",
167
- "@typescript-eslint/parser": "8.59.4",
168
- "@typescript-eslint/types": "8.59.4",
169
- "@typescript-eslint/utils": "8.59.4",
166
+ "@types/node": "25.9.1",
167
+ "@typescript-eslint/parser": "8.60.1",
168
+ "@typescript-eslint/types": "8.60.1",
169
+ "@typescript-eslint/utils": "8.60.1",
170
170
  "astro-eslint-parser": "^1.4.0",
171
- "concurrently": "9.2.1",
171
+ "concurrently": "10.0.1",
172
172
  "cross-env": "10.1.0",
173
- "eslint": "^10.4.0",
174
- "eslint-config-expo": "^55.0.1",
173
+ "eslint": "^10.4.1",
174
+ "eslint-config-expo": "^56.0.4",
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.1",
182
+ "eslint-plugin-react-you-might-not-need-an-effect": "^1.0.0",
183
183
  "eslint-plugin-solid": "^0.14.5",
184
- "eslint-plugin-svelte": "^3.17.1",
184
+ "eslint-plugin-svelte": "^3.19.0",
185
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.74",
191
+ "pkg-pr-new": "0.0.75",
192
192
  "prettier": "^3.8.3",
193
193
  "publint": "0.3.21",
194
- "svelte-eslint-parser": "^1.6.1",
194
+ "svelte-eslint-parser": "^1.7.0",
195
195
  "tailwindcss": "4.3.0",
196
- "tsdown": "0.22.0",
197
- "tsx": "4.22.2",
196
+ "tsdown": "0.22.1",
197
+ "tsx": "4.22.4",
198
198
  "typescript": "6.0.3",
199
199
  "vue-eslint-parser": "^10.4.0",
200
- "@zayne-labs/tsconfig": "0.13.13"
200
+ "@zayne-labs/tsconfig": "0.13.14"
201
201
  },
202
202
  "publishConfig": {
203
203
  "access": "public",