@zayne-labs/eslint-config 0.8.2 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/index.js ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import "../dist/cli/index.js";
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,304 @@
1
+ import { defineEnumDeep } from "@zayne-labs/toolkit-type-helpers";
2
+ import process from "node:process";
3
+ import * as p$4 from "@clack/prompts";
4
+ import * as p$3 from "@clack/prompts";
5
+ import * as p$2 from "@clack/prompts";
6
+ import * as p$1 from "@clack/prompts";
7
+ import * as p from "@clack/prompts";
8
+ import c, { green } from "ansis";
9
+ import { cac } from "cac";
10
+ import fs from "node:fs";
11
+ import path from "node:path";
12
+ import fsp from "node:fs/promises";
13
+ import { execSync } from "node:child_process";
14
+ import parse from "parse-gitignore";
15
+
16
+ //#region package.json
17
+ var version = "0.9.1";
18
+
19
+ //#endregion
20
+ //#region src/cli/constants.ts
21
+ const vscodeSettingsString = `
22
+ // Auto fix
23
+ // "editor.codeActionsOnSave": {
24
+ // "source.fixAll.eslint": "explicit",
25
+ // },
26
+
27
+ // Enable eslint for all supported languages
28
+ "eslint.validate": [
29
+ "javascript",
30
+ "javascriptreact",
31
+ "typescript",
32
+ "typescriptreact",
33
+ "vue",
34
+ "html",
35
+ "markdown",
36
+ "json",
37
+ "json5",
38
+ "jsonc",
39
+ "yaml",
40
+ "toml",
41
+ "xml",
42
+ "gql",
43
+ "graphql",
44
+ "astro",
45
+ "svelte",
46
+ "css",
47
+ "less",
48
+ "scss",
49
+ "postcss"
50
+ ]
51
+ `;
52
+ const frameworkOptions = [
53
+ {
54
+ label: c.green("Vue"),
55
+ value: "vue"
56
+ },
57
+ {
58
+ label: c.cyan("React"),
59
+ value: "react"
60
+ },
61
+ {
62
+ label: c.red("Svelte"),
63
+ value: "svelte"
64
+ },
65
+ {
66
+ label: c.magenta("Astro"),
67
+ value: "astro"
68
+ },
69
+ {
70
+ label: c.cyan("Solid"),
71
+ value: "solid"
72
+ },
73
+ {
74
+ label: c.blue("Slidev"),
75
+ value: "slidev"
76
+ }
77
+ ];
78
+ const frameworks = frameworkOptions.map(({ value }) => value);
79
+ const extraOptions = [];
80
+ const extra = extraOptions.map(({ value }) => value);
81
+ const dependenciesMap = defineEnumDeep({
82
+ astro: ["eslint-plugin-astro", "astro-eslint-parser"],
83
+ react: [
84
+ "@eslint-react/eslint-plugin",
85
+ "eslint-plugin-react-hooks",
86
+ "eslint-plugin-react-refresh"
87
+ ],
88
+ slidev: [],
89
+ solid: ["eslint-plugin-solid"],
90
+ svelte: ["eslint-plugin-svelte", "svelte-eslint-parser"],
91
+ vue: [
92
+ "eslint-plugin-vue",
93
+ "eslint-processor-vue-blocks",
94
+ "vue-eslint-parser"
95
+ ]
96
+ });
97
+
98
+ //#endregion
99
+ //#region src/cli/utils.ts
100
+ function isGitClean() {
101
+ try {
102
+ execSync("git diff-index --quiet HEAD --");
103
+ return true;
104
+ } catch {
105
+ return false;
106
+ }
107
+ }
108
+ function getEslintConfigContent(mainConfig, additionalConfigs) {
109
+ const additionalConfigsStr = additionalConfigs?.map((config) => `,{\n${config}\n}`);
110
+ return `
111
+ import { zayne } from '@zayne-labs/eslint-config'
112
+
113
+ export default zayne({
114
+ ${mainConfig}
115
+ }${additionalConfigsStr})
116
+ `.trimStart();
117
+ }
118
+
119
+ //#endregion
120
+ //#region src/cli/stages/update-eslint-files.ts
121
+ async function updateEslintFiles(result) {
122
+ const cwd = process.cwd();
123
+ const pathESLintIgnore = path.join(cwd, ".eslintignore");
124
+ const pathPackageJSON = path.join(cwd, "package.json");
125
+ const pkgContent = await fsp.readFile(pathPackageJSON, "utf8");
126
+ const pkg = JSON.parse(pkgContent);
127
+ const configFileName = pkg.type === "module" ? "eslint.config.js" : "eslint.config.mjs";
128
+ const pathFlatConfig = path.join(cwd, configFileName);
129
+ const eslintIgnores = [];
130
+ if (fs.existsSync(pathESLintIgnore)) {
131
+ p$4.log.step(c.cyan`Migrating existing .eslintignore`);
132
+ const content = await fsp.readFile(pathESLintIgnore, "utf8");
133
+ const parsed = parse(content);
134
+ const globs = parsed.globs();
135
+ for (const glob of globs) {
136
+ if (glob.type === "ignore") eslintIgnores.push(...glob.patterns);
137
+ if (glob.type === "unignore") eslintIgnores.push(...glob.patterns.map((pattern) => `!${pattern}`));
138
+ }
139
+ }
140
+ const configLines = [];
141
+ if (eslintIgnores.length > 0) configLines.push(`ignores: ${JSON.stringify(eslintIgnores)},`);
142
+ for (const framework of result.frameworks) configLines.push(`${framework}: true,`);
143
+ const mainConfig = configLines.map((i) => ` ${i}`).join("\n");
144
+ const additionalConfig = [];
145
+ const eslintConfigContent = getEslintConfigContent(mainConfig, additionalConfig);
146
+ await fsp.writeFile(pathFlatConfig, eslintConfigContent);
147
+ p$4.log.success(c.green`Created ${configFileName}`);
148
+ const files = fs.readdirSync(cwd);
149
+ const legacyConfig = [];
150
+ files.forEach((file) => {
151
+ if (/eslint|prettier/.test(file) && !/eslint\.config\./.test(file)) legacyConfig.push(file);
152
+ });
153
+ if (legacyConfig.length > 0) p$4.note(c.dim(legacyConfig.join(", ")), "You can now remove those files manually");
154
+ }
155
+
156
+ //#endregion
157
+ //#region src/cli/constants-generated.ts
158
+ const versionsMap = {
159
+ "@eslint-react/eslint-plugin": "^1.38.4",
160
+ "astro-eslint-parser": "^1.2.2",
161
+ eslint: "^9.24.0",
162
+ "eslint-plugin-astro": "^1.3.1",
163
+ "eslint-plugin-react-hooks": "^5.2.0",
164
+ "eslint-plugin-react-refresh": "^0.4.19",
165
+ "eslint-plugin-solid": "^0.14.5",
166
+ "eslint-plugin-svelte": "^3.3.3",
167
+ "prettier-plugin-astro": "^0.14.1",
168
+ "prettier-plugin-slidev": "^1.0.5",
169
+ "svelte-eslint-parser": "^1.1.0"
170
+ };
171
+
172
+ //#endregion
173
+ //#region src/cli/stages/update-package-json.ts
174
+ async function updatePackageJson(result) {
175
+ const cwd = process.cwd();
176
+ const pathPackageJSON = path.join(cwd, "package.json");
177
+ p$3.log.step(c.cyan`Bumping @zayne-labs/eslint-config to v${version}`);
178
+ const pkgContent = await fsp.readFile(pathPackageJSON, "utf8");
179
+ const pkg = JSON.parse(pkgContent);
180
+ pkg.devDependencies ??= {};
181
+ pkg.devDependencies["@zayne-labs/eslint-config"] = `^${version}`;
182
+ pkg.devDependencies.eslint ??= versionsMap.eslint;
183
+ const addedPackages = [];
184
+ for (const framework of result.frameworks) {
185
+ const deps = dependenciesMap[framework];
186
+ if (!deps) continue;
187
+ deps.forEach((f) => {
188
+ pkg.devDependencies[f] = versionsMap[f];
189
+ addedPackages.push(f);
190
+ });
191
+ }
192
+ if (addedPackages.length > 0) p$3.note(c.dim(addedPackages.join(", ")), "Added packages");
193
+ await fsp.writeFile(pathPackageJSON, JSON.stringify(pkg, null, 2));
194
+ p$3.log.success(c.green`Changes wrote to package.json`);
195
+ }
196
+
197
+ //#endregion
198
+ //#region src/cli/stages/update-vscode-settings.ts
199
+ async function updateVscodeSettings(result) {
200
+ const cwd = process.cwd();
201
+ if (!result.updateVscodeSettings) return;
202
+ const dotVscodePath = path.join(cwd, ".vscode");
203
+ const settingsPath = path.join(dotVscodePath, "settings.json");
204
+ if (!fs.existsSync(dotVscodePath)) await fsp.mkdir(dotVscodePath, { recursive: true });
205
+ if (!fs.existsSync(settingsPath)) {
206
+ await fsp.writeFile(settingsPath, `{${vscodeSettingsString}}\n`, "utf8");
207
+ p$2.log.success(green`Created .vscode/settings.json`);
208
+ } else {
209
+ let settingsContent = await fsp.readFile(settingsPath, "utf8");
210
+ settingsContent = settingsContent.trim().replace(/\s*\}$/, "");
211
+ settingsContent += settingsContent.endsWith(",") || settingsContent.endsWith("{") ? "" : ",";
212
+ settingsContent += `${vscodeSettingsString}}\n`;
213
+ await fsp.writeFile(settingsPath, settingsContent, "utf8");
214
+ p$2.log.success(green`Updated .vscode/settings.json`);
215
+ }
216
+ }
217
+
218
+ //#endregion
219
+ //#region src/cli/run.ts
220
+ async function run(options = {}) {
221
+ const argSkipPrompt = Boolean(process.env.SKIP_PROMPT) || options.yes;
222
+ const argTemplate = options.frameworks?.map((m) => m.trim()).filter(Boolean);
223
+ const argExtra = options.extra?.map((m) => m.trim()).filter(Boolean);
224
+ if (fs.existsSync(path.join(process.cwd(), "eslint.config.js"))) {
225
+ p$1.log.warn(c.yellow`eslint.config.js already exists, migration wizard exited.`);
226
+ return process.exit(1);
227
+ }
228
+ let result = {
229
+ extra: argExtra ?? [],
230
+ frameworks: argTemplate ?? [],
231
+ uncommittedConfirmed: false,
232
+ updateVscodeSettings: true
233
+ };
234
+ if (!argSkipPrompt) {
235
+ result = await p$1.group({
236
+ uncommittedConfirmed: () => {
237
+ if (isGitClean()) return Promise.resolve(true);
238
+ return p$1.confirm({
239
+ initialValue: false,
240
+ message: "There are uncommitted changes in the current repository, are you sure to continue?"
241
+ });
242
+ },
243
+ frameworks: ({ results }) => {
244
+ const isArgTemplateValid = (argTemplate?.length ?? 0) > 0 && (argTemplate ?? []).filter((element) => !frameworks.includes(element)).length === 0;
245
+ if (!results.uncommittedConfirmed || isArgTemplateValid) return;
246
+ const message = argTemplate ? `"${argTemplate}" isn't a valid template. Please choose from below: ` : "Select a framework:";
247
+ return p$1.multiselect({
248
+ message: c.reset(message),
249
+ options: frameworkOptions,
250
+ required: false
251
+ });
252
+ },
253
+ extra: ({ results }) => {
254
+ const isArgExtraValid = (argExtra?.length ?? 0) > 0 && (argExtra ?? []).filter((element) => !extra.includes(element)).length === 0;
255
+ if (!results.uncommittedConfirmed || isArgExtraValid) return;
256
+ const message = argExtra ? `"${argExtra}" isn't a valid extra util. Please choose from below: ` : "Select a extra utils:";
257
+ return p$1.multiselect({
258
+ message: c.reset(message),
259
+ options: extraOptions,
260
+ required: false
261
+ });
262
+ },
263
+ updateVscodeSettings: ({ results }) => {
264
+ if (!results.uncommittedConfirmed) return;
265
+ return p$1.confirm({
266
+ initialValue: true,
267
+ message: "Update .vscode/settings.json for better VS Code experience?"
268
+ });
269
+ }
270
+ }, { onCancel: () => {
271
+ p$1.cancel("Operation cancelled.");
272
+ process.exit(0);
273
+ } });
274
+ if (!result.uncommittedConfirmed) return process.exit(1);
275
+ }
276
+ await updatePackageJson(result);
277
+ await updateEslintFiles(result);
278
+ await updateVscodeSettings(result);
279
+ p$1.log.success(c.green`Setup completed`);
280
+ p$1.outro(`Now you can update the dependencies by run ${c.blue("pnpm install")} and run ${c.blue("eslint --fix")}\n`);
281
+ }
282
+
283
+ //#endregion
284
+ //#region src/cli/index.ts
285
+ function header() {
286
+ p.intro(`${c.green`@zayne-labs/eslint-config `}${c.dim`v${version}`}`);
287
+ }
288
+ const cli = cac("@zayne-labs/eslint-config");
289
+ cli.command("", "Run the initialization or migration").option("--yes, -y", "Skip prompts and use default values", { default: false }).option("--template, -t <template>", "Use the framework template for optimal customization: vue / react / svelte / astro", { type: [] }).option("--extra, -e <extra>", "Use the extra utils: formatter / perfectionist / unocss", { type: [] }).action(async (args) => {
290
+ header();
291
+ try {
292
+ await run(args);
293
+ } catch (error) {
294
+ p.log.error(c.inverse.red(" Failed to migrate "));
295
+ p.log.error(c.red`✘ ${String(error)}`);
296
+ process.exit(1);
297
+ }
298
+ });
299
+ cli.help();
300
+ cli.version(version);
301
+ cli.parse();
302
+
303
+ //#endregion
304
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["frameworkOptions: Array<PromItem<FrameworkOption>>","frameworks: FrameworkOption[]","extraOptions: Array<PromItem<ExtraLibrariesOption>>","extra: ExtraLibrariesOption[]","mainConfig: string","additionalConfigs?: string[]","result: PromptResult","eslintIgnores: string[]","pattern: string","configLines: string[]","additionalConfig: string[]","eslintConfigContent: string","legacyConfig: string[]","result: PromptResult","addedPackages: string[]","result: PromptResult","dotVscodePath: string","settingsPath: string","options: CliRunOptions","result: PromptResult","args: CliRunOptions"],"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":["{\n\t\"name\": \"@zayne-labs/eslint-config\",\n\t\"type\": \"module\",\n\t\"version\": \"0.9.1\",\n\t\"description\": \"Zayne Labs' ESLint config preset\",\n\t\"author\": \"Ryan Zayne\",\n\t\"license\": \"MIT\",\n\t\"homepage\": \"https://github.com/zayne-labs/config#readme\",\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"git+https://github.com/zayne-labs/config.git\"\n\t},\n\t\"bugs\": {\n\t\t\"url\": \"https://github.com/zayne-labs/config/issues\"\n\t},\n\t\"keywords\": [],\n\t\"sideEffects\": false,\n\t\"exports\": {\n\t\t\".\": \"./dist/index.js\"\n\t},\n\t\"bin\": \"./bin/index.js\",\n\t\"files\": [\n\t\t\"bin\",\n\t\t\"dist\"\n\t],\n\t\"engines\": {\n\t\t\"node\": \">=18.x\"\n\t},\n\t\"scripts\": {\n\t\t\"build\": \"pnpm typegen && tsdown\",\n\t\t\"build:dev\": \"pnpm typegen && cross-env NODE_ENV=development tsdown\",\n\t\t\"lint:attw\": \"attw --pack . --ignore-rules=cjs-resolves-to-esm\",\n\t\t\"lint:eslint\": \"eslint . --max-warnings 0\",\n\t\t\"lint:format\": \"prettier --cache --write .\",\n\t\t\"lint:packages\": \"pnpm dedupe --check\",\n\t\t\"lint:publint\": \"publint --strict .\",\n\t\t\"lint:type-check\": \"pnpm typegen && tsc --pretty -p tsconfig.json\",\n\t\t\"release\": \"pnpm publish --no-git-checks\",\n\t\t\"release:test\": \"pnpx pkg-pr-new publish\",\n\t\t\"typegen\": \"tsx scripts/typegen.ts\",\n\t\t\"version-package\": \"changeset version\"\n\t},\n\t\"peerDependencies\": {\n\t\t\"@eslint-react/eslint-plugin\": \">=1.15.0\",\n\t\t\"@next/eslint-plugin-next\": \">=14.2.15\",\n\t\t\"@tanstack/eslint-plugin-query\": \">=5.59.7\",\n\t\t\"@zayne-labs/toolkit-type-helpers\": \"^0.9.34\",\n\t\t\"astro-eslint-parser\": \">=1.0.2\",\n\t\t\"eslint\": \">=9.12.0\",\n\t\t\"eslint-plugin-astro\": \">=1.2.0\",\n\t\t\"eslint-plugin-depend\": \">=1.2.0\",\n\t\t\"eslint-plugin-pnpm\": \">=0.3.1\",\n\t\t\"eslint-plugin-react-hooks\": \">=5.0.0\",\n\t\t\"eslint-plugin-react-refresh\": \">=0.4.12\",\n\t\t\"eslint-plugin-solid\": \">=0.14.3\",\n\t\t\"eslint-plugin-svelte\": \">=2.35.1\",\n\t\t\"eslint-plugin-tailwindcss\": \">=3.17.4\",\n\t\t\"eslint-plugin-vue\": \">=9.28.0\",\n\t\t\"eslint-processor-vue-blocks\": \">=0.1.2\",\n\t\t\"vue-eslint-parser\": \">=9.4.3\"\n\t},\n\t\"peerDependenciesMeta\": {\n\t\t\"@eslint-react/eslint-plugin\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"@next/eslint-plugin-next\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"@tanstack/eslint-plugin-query\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"astro-eslint-parser\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"eslint-plugin-astro\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"eslint-plugin-depend\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"eslint-plugin-pnpm\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"eslint-plugin-react-hooks\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"eslint-plugin-react-refresh\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"eslint-plugin-solid\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"eslint-plugin-svelte\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"eslint-plugin-tailwindcss\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"eslint-plugin-vue\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"eslint-processor-vue-blocks\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"vue-eslint-parser\": {\n\t\t\t\"optional\": true\n\t\t}\n\t},\n\t\"dependencies\": {\n\t\t\"@antfu/install-pkg\": \"1.1.0\",\n\t\t\"@clack/prompts\": \"0.10.1\",\n\t\t\"@eslint-community/eslint-plugin-eslint-comments\": \"4.5.0\",\n\t\t\"@eslint/compat\": \"1.2.9\",\n\t\t\"@eslint/js\": \"9.26.0\",\n\t\t\"@stylistic/eslint-plugin\": \"4.2.0\",\n\t\t\"ansis\": \"^4.0.0\",\n\t\t\"cac\": \"^6.7.14\",\n\t\t\"eslint-config-flat-gitignore\": \"2.1.0\",\n\t\t\"eslint-flat-config-utils\": \"2.0.1\",\n\t\t\"eslint-import-resolver-typescript\": \"4.3.4\",\n\t\t\"eslint-merge-processors\": \"^2.0.0\",\n\t\t\"eslint-plugin-import-x\": \"4.11.1\",\n\t\t\"eslint-plugin-jsdoc\": \"50.6.17\",\n\t\t\"eslint-plugin-jsonc\": \"2.20.0\",\n\t\t\"eslint-plugin-n\": \"17.18.0\",\n\t\t\"eslint-plugin-perfectionist\": \"4.13.0\",\n\t\t\"eslint-plugin-security\": \"3.0.1\",\n\t\t\"eslint-plugin-solid\": \"^0.14.3\",\n\t\t\"eslint-plugin-toml\": \"^0.12.0\",\n\t\t\"eslint-plugin-unicorn\": \"59.0.1\",\n\t\t\"eslint-plugin-yml\": \"^1.17.0\",\n\t\t\"globals\": \"16.1.0\",\n\t\t\"jsonc-eslint-parser\": \"2.4.0\",\n\t\t\"local-pkg\": \"1.1.1\",\n\t\t\"parse-gitignore\": \"^2.0.0\",\n\t\t\"toml-eslint-parser\": \"0.10.0\",\n\t\t\"typescript-eslint\": \"8.32.1\",\n\t\t\"yaml-eslint-parser\": \"1.3.0\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@arethetypeswrong/cli\": \"0.18.1\",\n\t\t\"@changesets/cli\": \"2.29.4\",\n\t\t\"@eslint-react/eslint-plugin\": \"1.49.0\",\n\t\t\"@next/eslint-plugin-next\": \"15.3.2\",\n\t\t\"@size-limit/esbuild-why\": \"11.2.0\",\n\t\t\"@size-limit/preset-small-lib\": \"11.2.0\",\n\t\t\"@tanstack/eslint-plugin-query\": \"5.74.7\",\n\t\t\"@total-typescript/ts-reset\": \"0.6.1\",\n\t\t\"@types/eslint-plugin-security\": \"3.0.0\",\n\t\t\"@types/eslint-plugin-tailwindcss\": \"3.17.0\",\n\t\t\"@types/node\": \"22.15.18\",\n\t\t\"@zayne-labs/toolkit-type-helpers\": \"^0.9.42\",\n\t\t\"@zayne-labs/tsconfig\": \"workspace:*\",\n\t\t\"astro-eslint-parser\": \"1.2.2\",\n\t\t\"concurrently\": \"9.1.2\",\n\t\t\"cross-env\": \"7.0.3\",\n\t\t\"eslint\": \"9.26.0\",\n\t\t\"eslint-plugin-astro\": \"1.3.1\",\n\t\t\"eslint-plugin-depend\": \"1.2.0\",\n\t\t\"eslint-plugin-pnpm\": \"^0.3.1\",\n\t\t\"eslint-plugin-react-hooks\": \"5.2.0\",\n\t\t\"eslint-plugin-react-refresh\": \"0.4.20\",\n\t\t\"eslint-plugin-solid\": \"0.14.5\",\n\t\t\"eslint-plugin-svelte\": \"3.6.0\",\n\t\t\"eslint-plugin-tailwindcss\": \"3.18.0\",\n\t\t\"eslint-plugin-vue\": \"10.1.0\",\n\t\t\"eslint-processor-vue-blocks\": \"2.0.0\",\n\t\t\"eslint-typegen\": \"2.2.0\",\n\t\t\"husky\": \"9.1.7\",\n\t\t\"lint-staged\": \"16.0.0\",\n\t\t\"pkg-pr-new\": \"0.0.49\",\n\t\t\"prettier\": \"3.5.3\",\n\t\t\"publint\": \"0.3.12\",\n\t\t\"size-limit\": \"11.2.0\",\n\t\t\"tailwindcss\": \"3.4.17\",\n\t\t\"tsdown\": \"^0.11.9\",\n\t\t\"tsx\": \"4.19.4\",\n\t\t\"typescript\": \"5.8.3\",\n\t\t\"vue-eslint-parser\": \"10.1.3\"\n\t},\n\t\"publishConfig\": {\n\t\t\"access\": \"public\",\n\t\t\"registry\": \"https://registry.npmjs.org/\",\n\t\t\"provenance\": true\n\t}\n}\n","import { defineEnumDeep } from \"@zayne-labs/toolkit-type-helpers\";\nimport type { ExtraLibrariesOption, FrameworkOption, PromItem } from \"./types\";\n\nimport c from \"ansis\";\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<FrameworkOption>> = [\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\t{\n\t\tlabel: c.blue(\"Slidev\"),\n\t\tvalue: \"slidev\",\n\t},\n];\n\nexport const frameworks: FrameworkOption[] = frameworkOptions.map(({ value }) => value);\n\nexport const extraOptions: Array<PromItem<ExtraLibrariesOption>> = [\n\t// {\n\t// \tlabel: c.cyan(\"UnoCSS\"),\n\t// \tvalue: \"unocss\",\n\t// },\n];\n\nexport const extra: ExtraLibrariesOption[] = extraOptions.map(({ value }) => value);\n\nexport const dependenciesMap = defineEnumDeep({\n\tastro: [\"eslint-plugin-astro\", \"astro-eslint-parser\"],\n\treact: [\"@eslint-react/eslint-plugin\", \"eslint-plugin-react-hooks\", \"eslint-plugin-react-refresh\"],\n\tslidev: [],\n\tsolid: [\"eslint-plugin-solid\"],\n\tsvelte: [\"eslint-plugin-svelte\", \"svelte-eslint-parser\"],\n\tvue: [\"eslint-plugin-vue\", \"eslint-processor-vue-blocks\", \"vue-eslint-parser\"],\n});\n","import { execSync } from \"node:child_process\";\n\nexport function 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 function 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\";\nimport type { PromptResult } from \"../types\";\nimport { getEslintConfigContent } from \"../utils\";\n\n// @ts-expect-error missing types\nimport parse from \"parse-gitignore\";\n\nexport async function updateEslintFiles(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\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\tfor (const framework of result.frameworks) {\n\t\tconfigLines.push(`${framework}: true,`);\n\t}\n\n\tconst mainConfig = configLines.map((i) => ` ${i}`).join(\"\\n\");\n\tconst additionalConfig: string[] = [];\n\n\tconst eslintConfigContent: string = getEslintConfigContent(mainConfig, additionalConfig);\n\n\tawait fsp.writeFile(pathFlatConfig, eslintConfigContent);\n\tp.log.success(c.green`Created ${configFileName}`);\n\n\tconst files = fs.readdirSync(cwd);\n\tconst legacyConfig: string[] = [];\n\tfiles.forEach((file) => {\n\t\tif (/eslint|prettier/.test(file) && !/eslint\\.config\\./.test(file)) {\n\t\t\tlegacyConfig.push(file);\n\t\t}\n\t});\n\n\tif (legacyConfig.length > 0) {\n\t\tp.note(c.dim(legacyConfig.join(\", \")), \"You can now remove those files manually\");\n\t}\n}\n","export const versionsMap = {\n\t\"@eslint-react/eslint-plugin\": \"^1.38.4\",\n\t\"astro-eslint-parser\": \"^1.2.2\",\n\teslint: \"^9.24.0\",\n\t\"eslint-plugin-astro\": \"^1.3.1\",\n\t\"eslint-plugin-react-hooks\": \"^5.2.0\",\n\t\"eslint-plugin-react-refresh\": \"^0.4.19\",\n\t\"eslint-plugin-solid\": \"^0.14.5\",\n\t\"eslint-plugin-svelte\": \"^3.3.3\",\n\t\"prettier-plugin-astro\": \"^0.14.1\",\n\t\"prettier-plugin-slidev\": \"^1.0.5\",\n\t\"svelte-eslint-parser\": \"^1.1.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 async function updatePackageJson(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 framework of result.frameworks) {\n\t\tconst deps = dependenciesMap[framework];\n\n\t\t// eslint-disable-next-line ts-eslint/no-unnecessary-condition -- Allow\n\t\tif (!deps) continue;\n\n\t\tdeps.forEach((f) => {\n\t\t\t// eslint-disable-next-line ts-eslint/no-non-null-assertion -- Allow\n\t\t\tpkg.devDependencies![f] = versionsMap[f as keyof typeof versionsMap];\n\t\t\taddedPackages.push(f);\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 { green } from \"ansis\";\nimport { vscodeSettingsString } from \"../constants\";\nimport type { PromptResult } from \"../types\";\n\nexport async function updateVscodeSettings(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(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(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 { ExtraLibrariesOption, FrameworkOption, 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 async function run(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 ExtraLibrariesOption[],\n\t\tframeworks: (argTemplate ?? []) as FrameworkOption[],\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\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 = argTemplate\n\t\t\t\t\t\t? `\"${argTemplate}\" isn't a valid template. Please choose from below: `\n\t\t\t\t\t\t: \"Select a framework:\";\n\n\t\t\t\t\treturn p.multiselect<FrameworkOption>({\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\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 = argExtra\n\t\t\t\t\t\t? `\"${argExtra}\" isn't a valid extra util. Please choose from below: `\n\t\t\t\t\t\t: \"Select a extra utils:\";\n\n\t\t\t\t\treturn p.multiselect<ExtraLibrariesOption>({\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\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\tp.outro(\n\t\t`Now you can update the dependencies by run ${c.blue(\"pnpm install\")} and run ${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 { type CliRunOptions, run } from \"./run\";\n\nfunction header(): void {\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: formatter / perfectionist / unocss\", { type: [] })\n\t.action(async (args: CliRunOptions) => {\n\t\theader();\n\t\ttry {\n\t\t\tawait run(args);\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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"}