@dvukovic/style-guide 0.14.2 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -47,6 +47,8 @@ export default customDefineConfig({
47
47
  - `playwright()` - Playwright e2e testing
48
48
  - `mobx()` - MobX state management
49
49
  - `storybook()` - Storybook
50
+ - `tanstackQuery()` - TanStack Query
51
+ - `turbo()` - Turborepo
50
52
  - `packageJson()` - package.json linting
51
53
  - `packageJsonWorkspace()` - package.json linting for monorepos
52
54
 
@@ -1,6 +1,6 @@
1
1
  export function promptToolSelection(): Promise<string[]>;
2
2
  export function promptESLintOptions(): Promise<{
3
- extras: ("mobx" | "storybook")[];
3
+ extras: ("mobx" | "storybook" | "tanstackQuery" | "turbo")[];
4
4
  framework: "none" | "react" | "next";
5
5
  includeAws: boolean;
6
6
  includeNode: boolean;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * TanStack Query configuration
3
+ *
4
+ * @param {import("@eslint/config-helpers").ConfigWithExtends & { additionalFiles?: string[] }} [config]
5
+ * - Additional config
6
+ *
7
+ * @returns {import("@eslint/config-helpers").ConfigWithExtends} ESLint config
8
+ */
9
+ export function tanstackQuery(config?: import("@eslint/config-helpers").ConfigWithExtends & {
10
+ additionalFiles?: string[];
11
+ }): import("@eslint/config-helpers").ConfigWithExtends;
12
+ export const tanstackQueryConfig: import("@eslint/config-helpers").Config[];
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Turbo monorepo configuration
3
+ *
4
+ * @param {import("@eslint/config-helpers").ConfigWithExtends & { additionalFiles?: string[] }} [config]
5
+ * - Additional config
6
+ *
7
+ * @returns {import("@eslint/config-helpers").ConfigWithExtends} ESLint config
8
+ */
9
+ export function turbo(config?: import("@eslint/config-helpers").ConfigWithExtends & {
10
+ additionalFiles?: string[];
11
+ }): import("@eslint/config-helpers").ConfigWithExtends;
12
+ export const turboConfig: import("@eslint/config-helpers").Config[];
@@ -0,0 +1,6 @@
1
+ export const TS_FILES: string[];
2
+ export const REACT_FILES: string[];
3
+ export const ALL_JS_TS_FILES: string[];
4
+ export const TEST_FILES: string[];
5
+ export const NODE_FILES: string[];
6
+ export const STORY_FILES: string[];
@@ -18,6 +18,8 @@ export { node } from "./configs/node.js";
18
18
  export { playwright } from "./configs/playwright.js";
19
19
  export { react } from "./configs/react.js";
20
20
  export { storybook } from "./configs/storybook.js";
21
+ export { tanstackQuery } from "./configs/tanstack-query.js";
22
+ export { turbo } from "./configs/turbo.js";
21
23
  export { typescript } from "./configs/typescript.js";
22
24
  export { typescriptStrict } from "./configs/typescript-strict.js";
23
25
  export { vitest } from "./configs/vitest.js";
@@ -0,0 +1,2 @@
1
+ /** @type {import("@eslint/config-helpers").Config} */
2
+ export const tanstackQuery: import("@eslint/config-helpers").Config;
@@ -0,0 +1,2 @@
1
+ /** @type {import("@eslint/config-helpers").Config} */
2
+ export const turbo: import("@eslint/config-helpers").Config;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dvukovic/style-guide",
3
- "version": "0.14.2",
3
+ "version": "0.16.0",
4
4
  "description": "My own style guide",
5
5
  "repository": {
6
6
  "type": "git",
@@ -66,6 +66,7 @@
66
66
  "@next/eslint-plugin-next": "16.1.4",
67
67
  "@rimac-technology/eslint-plugin": "1.5.0",
68
68
  "@stylistic/eslint-plugin": "5.7.1",
69
+ "@tanstack/eslint-plugin-query": "5.91.4",
69
70
  "@typescript-eslint/parser": "8.53.1",
70
71
  "@vitest/eslint-plugin": "1.6.6",
71
72
  "eslint-plugin-baseline-js": "0.4.2",
@@ -84,6 +85,7 @@
84
85
  "eslint-plugin-sort-destructure-keys": "2.0.0",
85
86
  "eslint-plugin-sort-keys-fix": "1.1.2",
86
87
  "eslint-plugin-storybook": "10.2.0",
88
+ "eslint-plugin-turbo": "2.8.1",
87
89
  "eslint-plugin-typescript-sort-keys": "3.3.0",
88
90
  "eslint-plugin-unicorn": "62.0.0",
89
91
  "eslint-plugin-unused-imports": "4.3.0",
@@ -81,6 +81,16 @@ export function generateESLintConfig(options) {
81
81
  configs.push("storybook()")
82
82
  }
83
83
 
84
+ if (extras.includes("tanstackQuery")) {
85
+ imports.push("tanstackQuery")
86
+ configs.push("tanstackQuery()")
87
+ }
88
+
89
+ if (extras.includes("turbo")) {
90
+ imports.push("turbo")
91
+ configs.push("turbo()")
92
+ }
93
+
84
94
  if (isMonorepo) {
85
95
  imports.push("packageJsonWorkspace")
86
96
  configs.push("packageJsonWorkspace()")
@@ -147,6 +147,8 @@ export async function promptESLintOptions() {
147
147
  options: [
148
148
  { label: "MobX", value: "mobx" },
149
149
  { label: "Storybook", value: "storybook" },
150
+ { label: "TanStack Query", value: "tanstackQuery" },
151
+ { label: "Turbo", value: "turbo" },
150
152
  ],
151
153
  required: false,
152
154
  })
@@ -142,3 +142,4 @@ volta
142
142
  timeslot
143
143
  blackhill
144
144
  rcompare
145
+ turborepo
@@ -1,3 +1,4 @@
1
+ import { NODE_FILES } from "../file-patterns.js"
1
2
  import { sonarjsAws } from "../plugins/sonarjs-aws.js"
2
3
 
3
4
  export const awsConfig = [sonarjsAws]
@@ -15,15 +16,7 @@ export function aws(config) {
15
16
 
16
17
  return {
17
18
  extends: [...awsConfig, ...(extendsConfig ?? [])],
18
- files: files ?? [
19
- "**/*.js",
20
- "**/*.cjs",
21
- "**/*.mjs",
22
- "**/*.ts",
23
- "**/*.cts",
24
- "**/*.mts",
25
- ...(additionalFiles ?? []),
26
- ],
19
+ files: files ?? [...NODE_FILES, ...(additionalFiles ?? [])],
27
20
  ...rest,
28
21
  }
29
22
  }
@@ -1,3 +1,4 @@
1
+ import { ALL_JS_TS_FILES } from "../file-patterns.js"
1
2
  import { baseline } from "../plugins/baseline.js"
2
3
  import { dvukovic } from "../plugins/dvukovic.js"
3
4
  import { eslint } from "../plugins/eslint.js"
@@ -43,15 +44,7 @@ export function core(config) {
43
44
 
44
45
  return {
45
46
  extends: [...coreConfig, ...(extendsConfig ?? [])],
46
- files: files ?? [
47
- "**/*.js",
48
- ".*.js",
49
- "**/*.cjs",
50
- "**/*.mjs",
51
- "**/*.ts",
52
- "**/*.tsx",
53
- ...(additionalFiles ?? []),
54
- ],
47
+ files: files ?? [".*.js", ...ALL_JS_TS_FILES, ...(additionalFiles ?? [])],
55
48
  ...rest,
56
49
  }
57
50
  }
@@ -1,3 +1,4 @@
1
+ import { TEST_FILES } from "../file-patterns.js"
1
2
  import { jest as jestPlugin } from "../plugins/jest.js"
2
3
 
3
4
  /**
@@ -14,19 +15,7 @@ export function jest(config) {
14
15
 
15
16
  return {
16
17
  extends: [...jestConfig, ...(extendsConfig ?? [])],
17
- files: files ?? [
18
- "**/*.test.js",
19
- "**/*.test.ts",
20
- "**/*.spec.js",
21
- "**/*.spec.ts",
22
- "**/*.unit.test.js",
23
- "**/*.unit.test.ts",
24
- "**/*.int.test.js",
25
- "**/*.int.test.ts",
26
- "**/*.integration.test.js",
27
- "**/*.integration.test.ts",
28
- ...(additionalFiles ?? []),
29
- ],
18
+ files: files ?? [...TEST_FILES, ...(additionalFiles ?? [])],
30
19
  ...rest,
31
20
  }
32
21
  }
@@ -1,3 +1,4 @@
1
+ import { ALL_JS_TS_FILES } from "../file-patterns.js"
1
2
  import { mobx as mobxPlugin } from "../plugins/mobx.js"
2
3
 
3
4
  export const mobxConfig = [mobxPlugin]
@@ -15,7 +16,7 @@ export function mobx(config) {
15
16
 
16
17
  return {
17
18
  extends: [...mobxConfig, ...(extendsConfig ?? [])],
18
- files: files ?? ["**/*.js", "**/*.ts", "**/*.jsx", "**/*.tsx", ...(additionalFiles ?? [])],
19
+ files: files ?? [...ALL_JS_TS_FILES, "**/*.jsx", ...(additionalFiles ?? [])],
19
20
  ...rest,
20
21
  }
21
22
  }
@@ -1,3 +1,4 @@
1
+ import { ALL_JS_TS_FILES } from "../file-patterns.js"
1
2
  import { next as nextPlugin } from "../plugins/next.js"
2
3
 
3
4
  export const nextConfig = [nextPlugin]
@@ -15,7 +16,7 @@ export function next(config) {
15
16
 
16
17
  return {
17
18
  extends: [...nextConfig, ...(extendsConfig ?? [])],
18
- files: files ?? ["**/*.js", "**/*.ts", "**/*.jsx", "**/*.tsx", ...(additionalFiles ?? [])],
19
+ files: files ?? [...ALL_JS_TS_FILES, "**/*.jsx", ...(additionalFiles ?? [])],
19
20
  ...rest,
20
21
  }
21
22
  }
@@ -1,3 +1,4 @@
1
+ import { NODE_FILES } from "../file-patterns.js"
1
2
  import { nodeN } from "../plugins/n.js"
2
3
  import { securityNode } from "../plugins/security-node.js"
3
4
 
@@ -16,15 +17,7 @@ export function node(config) {
16
17
 
17
18
  return {
18
19
  extends: [...nodeConfig, ...(extendsConfig ?? [])],
19
- files: files ?? [
20
- "**/*.js",
21
- "**/*.cjs",
22
- "**/*.mjs",
23
- "**/*.ts",
24
- "**/*.cts",
25
- "**/*.mts",
26
- ...(additionalFiles ?? []),
27
- ],
20
+ files: files ?? [...NODE_FILES, ...(additionalFiles ?? [])],
28
21
  ...rest,
29
22
  }
30
23
  }
@@ -1,3 +1,4 @@
1
+ import { TEST_FILES } from "../file-patterns.js"
1
2
  import { playwright as playwrightPlugin } from "../plugins/playwright.js"
2
3
 
3
4
  export const playwrightConfig = [playwrightPlugin]
@@ -15,19 +16,7 @@ export function playwright(config) {
15
16
 
16
17
  return {
17
18
  extends: [...playwrightConfig, ...(extendsConfig ?? [])],
18
- files: files ?? [
19
- "**/*.test.js",
20
- "**/*.test.ts",
21
- "**/*.spec.js",
22
- "**/*.spec.ts",
23
- "**/*.unit.test.js",
24
- "**/*.unit.test.ts",
25
- "**/*.int.test.js",
26
- "**/*.int.test.ts",
27
- "**/*.integration.test.js",
28
- "**/*.integration.test.ts",
29
- ...(additionalFiles ?? []),
30
- ],
19
+ files: files ?? [...TEST_FILES, ...(additionalFiles ?? [])],
31
20
  ...rest,
32
21
  }
33
22
  }
@@ -1,3 +1,4 @@
1
+ import { REACT_FILES } from "../file-patterns.js"
1
2
  import { react as reactPlugin } from "../plugins/react.js"
2
3
  import { reactHooks as reactHooksPlugin } from "../plugins/react-hooks.js"
3
4
 
@@ -16,7 +17,7 @@ export function react(config) {
16
17
 
17
18
  return {
18
19
  extends: [...reactConfig, ...(extendsConfig ?? [])],
19
- files: files ?? ["**/*.jsx", "**/*.tsx", ...(additionalFiles ?? [])],
20
+ files: files ?? [...REACT_FILES, ...(additionalFiles ?? [])],
20
21
  ...rest,
21
22
  }
22
23
  }
@@ -1,3 +1,4 @@
1
+ import { STORY_FILES } from "../file-patterns.js"
1
2
  import { storybook as storybookPlugin } from "../plugins/storybook.js"
2
3
 
3
4
  /**
@@ -25,13 +26,7 @@ export function storybook(config) {
25
26
 
26
27
  return {
27
28
  extends: [...storybookConfig, ...(extendsConfig ?? [])],
28
- files: files ?? [
29
- "**/*.stories.js",
30
- "**/*.stories.ts",
31
- "**/*.stories.jsx",
32
- "**/*.stories.tsx",
33
- ...(additionalFiles ?? []),
34
- ],
29
+ files: files ?? [...STORY_FILES, ...(additionalFiles ?? [])],
35
30
  ...rest,
36
31
  }
37
32
  }
@@ -0,0 +1,22 @@
1
+ import { ALL_JS_TS_FILES } from "../file-patterns.js"
2
+ import { tanstackQuery as tanstackQueryPlugin } from "../plugins/tanstack-query.js"
3
+
4
+ export const tanstackQueryConfig = [tanstackQueryPlugin]
5
+
6
+ /**
7
+ * TanStack Query configuration
8
+ *
9
+ * @param {import("@eslint/config-helpers").ConfigWithExtends & { additionalFiles?: string[] }} [config]
10
+ * - Additional config
11
+ *
12
+ * @returns {import("@eslint/config-helpers").ConfigWithExtends} ESLint config
13
+ */
14
+ export function tanstackQuery(config) {
15
+ const { additionalFiles, extends: extendsConfig, files, ...rest } = config ?? {}
16
+
17
+ return {
18
+ extends: [...tanstackQueryConfig, ...(extendsConfig ?? [])],
19
+ files: files ?? [...ALL_JS_TS_FILES, "**/*.jsx", ...(additionalFiles ?? [])],
20
+ ...rest,
21
+ }
22
+ }
@@ -0,0 +1,22 @@
1
+ import { ALL_JS_TS_FILES } from "../file-patterns.js"
2
+ import { turbo as turboPlugin } from "../plugins/turbo.js"
3
+
4
+ export const turboConfig = [turboPlugin]
5
+
6
+ /**
7
+ * Turbo monorepo configuration
8
+ *
9
+ * @param {import("@eslint/config-helpers").ConfigWithExtends & { additionalFiles?: string[] }} [config]
10
+ * - Additional config
11
+ *
12
+ * @returns {import("@eslint/config-helpers").ConfigWithExtends} ESLint config
13
+ */
14
+ export function turbo(config) {
15
+ const { additionalFiles, extends: extendsConfig, files, ...rest } = config ?? {}
16
+
17
+ return {
18
+ extends: [...turboConfig, ...(extendsConfig ?? [])],
19
+ files: files ?? [...ALL_JS_TS_FILES, "**/*.jsx", ...(additionalFiles ?? [])],
20
+ ...rest,
21
+ }
22
+ }
@@ -1,5 +1,7 @@
1
1
  import typescriptEslint from "typescript-eslint"
2
2
 
3
+ import { TS_FILES } from "../file-patterns.js"
4
+
3
5
  /** @type {import("@eslint/config-helpers").Config[]} */
4
6
  export const typescriptStrictConfig = [
5
7
  {
@@ -43,7 +45,7 @@ export function typescriptStrict(config) {
43
45
 
44
46
  return {
45
47
  extends: [...typescriptStrictConfig, ...(extendsConfig ?? [])],
46
- files: files ?? ["**/*.ts", "**/*.tsx", "**/*.cts", "**/*.mts", ...(additionalFiles ?? [])],
48
+ files: files ?? [...TS_FILES, "**/*.tsx", ...(additionalFiles ?? [])],
47
49
  ...rest,
48
50
  }
49
51
  }
@@ -1,5 +1,6 @@
1
1
  import tseslint from "typescript-eslint"
2
2
 
3
+ import { ALL_JS_TS_FILES, TS_FILES } from "../file-patterns.js"
3
4
  import { typescriptEslint } from "../plugins/typescript-eslint.js"
4
5
  import { typescriptSortKeys } from "../plugins/typescript-sort-keys.js"
5
6
 
@@ -16,11 +17,11 @@ export const typescriptConfig = [
16
17
  },
17
18
  },
18
19
  {
19
- files: ["**/*.ts", "**/*.tsx"],
20
+ files: [...TS_FILES, "**/*.tsx"],
20
21
  ...typescriptEslint,
21
22
  },
22
23
  {
23
- files: ["**/*.ts", "**/*.tsx"],
24
+ files: [...TS_FILES, "**/*.tsx"],
24
25
  ...typescriptSortKeys,
25
26
  },
26
27
  ]
@@ -38,15 +39,7 @@ export function typescript(config) {
38
39
 
39
40
  return {
40
41
  extends: [...typescriptConfig, ...(extendsConfig ?? [])],
41
- files: files ?? [
42
- "**/*.js",
43
- "**/*.ts",
44
- "**/*.tsx",
45
- "**/*.cjs",
46
- "**/*.cts",
47
- "**/*.mts",
48
- ...(additionalFiles ?? []),
49
- ],
42
+ files: files ?? [...ALL_JS_TS_FILES, ...(additionalFiles ?? [])],
50
43
  ...rest,
51
44
  }
52
45
  }
@@ -1,3 +1,4 @@
1
+ import { TEST_FILES } from "../file-patterns.js"
1
2
  import { vitest as vitestPlugin } from "../plugins/vitest.js"
2
3
 
3
4
  export const vitestConfig = [vitestPlugin]
@@ -15,19 +16,7 @@ export function vitest(config) {
15
16
 
16
17
  return {
17
18
  extends: [...vitestConfig, ...(extendsConfig ?? [])],
18
- files: files ?? [
19
- "**/*.test.js",
20
- "**/*.test.ts",
21
- "**/*.spec.js",
22
- "**/*.spec.ts",
23
- "**/*.unit.test.js",
24
- "**/*.unit.test.ts",
25
- "**/*.int.test.js",
26
- "**/*.int.test.ts",
27
- "**/*.integration.test.js",
28
- "**/*.integration.test.ts",
29
- ...(additionalFiles ?? []),
30
- ],
19
+ files: files ?? [...TEST_FILES, ...(additionalFiles ?? [])],
31
20
  ...rest,
32
21
  }
33
22
  }
@@ -0,0 +1,29 @@
1
+ const JS_FILES = ["**/*.js", "**/*.cjs", "**/*.mjs"]
2
+
3
+ export const TS_FILES = ["**/*.ts", "**/*.cts", "**/*.mts"]
4
+
5
+ export const REACT_FILES = ["**/*.jsx", "**/*.tsx"]
6
+
7
+ export const ALL_JS_TS_FILES = [...JS_FILES, ...TS_FILES, ...REACT_FILES]
8
+
9
+ export const TEST_FILES = [
10
+ "**/*.test.js",
11
+ "**/*.test.ts",
12
+ "**/*.spec.js",
13
+ "**/*.spec.ts",
14
+ "**/*.unit.test.js",
15
+ "**/*.unit.test.ts",
16
+ "**/*.int.test.js",
17
+ "**/*.int.test.ts",
18
+ "**/*.integration.test.js",
19
+ "**/*.integration.test.ts",
20
+ ]
21
+
22
+ export const NODE_FILES = [...JS_FILES, ...TS_FILES]
23
+
24
+ export const STORY_FILES = [
25
+ "**/*.stories.js",
26
+ "**/*.stories.ts",
27
+ "**/*.stories.jsx",
28
+ "**/*.stories.tsx",
29
+ ]
@@ -37,6 +37,8 @@ export { packageJson, packageJsonWorkspace } from "./configs/package-json.js"
37
37
  export { playwright } from "./configs/playwright.js"
38
38
  export { react } from "./configs/react.js"
39
39
  export { storybook } from "./configs/storybook.js"
40
+ export { tanstackQuery } from "./configs/tanstack-query.js"
41
+ export { turbo } from "./configs/turbo.js"
40
42
  export { typescript } from "./configs/typescript.js"
41
43
  export { typescriptStrict } from "./configs/typescript-strict.js"
42
44
  export { vitest } from "./configs/vitest.js"
@@ -0,0 +1,13 @@
1
+ import tanstackQueryPlugin from "@tanstack/eslint-plugin-query"
2
+
3
+ /** @type {import("@eslint/config-helpers").Config} */
4
+ export const tanstackQuery = {
5
+ plugins: {
6
+ "@tanstack/query": tanstackQueryPlugin,
7
+ },
8
+ rules: {
9
+ "@tanstack/query/exhaustive-deps": "error",
10
+ "@tanstack/query/no-rest-destructuring": "error",
11
+ "@tanstack/query/stable-query-client": "error",
12
+ },
13
+ }
@@ -0,0 +1,11 @@
1
+ import plugin from "eslint-plugin-turbo"
2
+
3
+ /** @type {import("@eslint/config-helpers").Config} */
4
+ export const turbo = {
5
+ plugins: {
6
+ turbo: plugin,
7
+ },
8
+ rules: {
9
+ "turbo/no-undeclared-env-vars": "error",
10
+ },
11
+ }