@wistia/oxlint-config 0.0.1 → 0.3.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
@@ -1,2 +1,107 @@
1
- # oxlint-config
2
- Wistia's Oxlint configurations
1
+ # @wistia/oxlint-config
2
+
3
+ Wistia's Oxlint configurations. This is a shared config package for [oxlint](https://oxc.rs/docs/guide/usage/linter), a fast TypeScript/Javascript linter.
4
+
5
+ ## How to install
6
+
7
+ ```bash
8
+ yarn add -D @wistia/oxlint-config oxlint
9
+ ```
10
+
11
+ ## Quick start
12
+
13
+ Create an `.oxlintrc.json` in your project root:
14
+
15
+ **TypeScript project** (most common):
16
+
17
+ ```json
18
+ {
19
+ "$schema": "./node_modules/oxlint/configuration_schema.json",
20
+ "extends": ["./node_modules/@wistia/oxlint-config/configs/typescript.jsonc"]
21
+ }
22
+ ```
23
+
24
+ **JavaScript-only project:**
25
+
26
+ ```json
27
+ {
28
+ "$schema": "./node_modules/oxlint/configuration_schema.json",
29
+ "extends": ["./node_modules/@wistia/oxlint-config/configs/javascript.jsonc"]
30
+ }
31
+ ```
32
+
33
+ ## Available configs
34
+
35
+ ### Base configs
36
+
37
+ | Config | Description |
38
+ | -------------------------- | ---------------------------------------------------------------------- |
39
+ | `configs/javascript.jsonc` | Base config for any JavaScript project (base + import + promise rules) |
40
+ | `configs/typescript.jsonc` | TypeScript projects (includes all JavaScript rules) |
41
+
42
+ ### Feature configs
43
+
44
+ | Config | Description |
45
+ | --------------------------------- | --------------------------------------------------------------- |
46
+ | `configs/react.jsonc` | React component and accessibility rules (react + jsx-a11y) |
47
+ | `configs/node.jsonc` | Node.js-specific rules (native + eslint-plugin-n via jsPlugins) |
48
+ | `configs/vitest.jsonc` | Vitest testing rules (see note below) |
49
+ | `configs/playwright.jsonc` | Playwright E2E testing rules (via jsPlugins) |
50
+ | `configs/storybook.jsonc` | Storybook story conventions (via jsPlugins) |
51
+ | `configs/testing-library.jsonc` | Testing Library + jest-dom rules (via jsPlugins) |
52
+ | `configs/styled-components.jsonc` | Styled Components accessibility rules (via jsPlugins) |
53
+
54
+ **Note on jsPlugins configs:** Some configs use oxlint's [jsPlugins](https://oxc.rs/docs/guide/usage/linter/js-plugins) feature to load ESLint plugins for rules that don't have native oxlint equivalents. These configs require the corresponding ESLint plugin to be installed as a dev dependency in the consuming project. Check each config's rule file for the required `jsPlugins` specifiers.
55
+
56
+ **Note on vitest config:** Oxlint splits vitest-related rules across two internal plugin namespaces -- `vitest/` for vitest-specific rules and `jest/` for rules that originated in eslint-plugin-jest but apply equally to vitest. The `jest/` prefix is an oxlint naming convention; it does **not** mean Jest is required or that these rules are Jest-specific.
57
+
58
+ Configs are **additive** -- start with a base (`javascript` or `typescript`), then layer on feature configs as needed:
59
+
60
+ ````json
61
+ {
62
+ "$schema": "./node_modules/oxlint/configuration_schema.json",
63
+ "extends": [
64
+ "./node_modules/@wistia/oxlint-config/configs/typescript.jsonc",
65
+ "./node_modules/@wistia/oxlint-config/configs/react.jsonc",
66
+ "./node_modules/@wistia/oxlint-config/configs/vitest.jsonc"
67
+ ]
68
+ }
69
+
70
+ ## Overriding rules
71
+
72
+ Add a `rules` section to your `.oxlintrc.json` -- your rules take precedence over the shared config:
73
+
74
+ ```json
75
+ {
76
+ "$schema": "./node_modules/oxlint/configuration_schema.json",
77
+ "extends": [
78
+ "./node_modules/@wistia/oxlint-config/configs/typescript.jsonc"
79
+ ],
80
+ "rules": {
81
+ "eslint/no-console": "off",
82
+ "typescript/no-explicit-any": "off"
83
+ }
84
+ }
85
+ ````
86
+
87
+ ## Running oxlint
88
+
89
+ Add a script to your `package.json`:
90
+
91
+ ```json
92
+ {
93
+ "scripts": {
94
+ "lint": "oxlint ."
95
+ }
96
+ }
97
+ ```
98
+
99
+ Oxlint will automatically pick up `.oxlintrc.json` from your project root.
100
+
101
+ ## Guidelines for adding new rules
102
+
103
+ 1. Preference given for autofixable rules
104
+ 2. Should not contradict existing rules
105
+ 3. Person/team adding new rules handles upgrading consumers and fixing violations
106
+ 4. Rules should always be set to `error`, never `warn` (the latter are never fixed)
107
+ 5. Add short description of rule & link to rule definition in code comments
@@ -0,0 +1,13 @@
1
+ import { defineConfig } from 'oxlint';
2
+ import { baseRules } from '../rules/base.ts';
3
+ import { importRules } from '../rules/import.ts';
4
+ import { promiseRules } from '../rules/promise.ts';
5
+
6
+ export default defineConfig({
7
+ plugins: [...baseRules.plugins, ...importRules.plugins, ...promiseRules.plugins],
8
+ rules: {
9
+ ...baseRules.rules,
10
+ ...importRules.rules,
11
+ ...promiseRules.rules,
12
+ },
13
+ });
@@ -0,0 +1,8 @@
1
+ import { defineConfig } from 'oxlint';
2
+ import { nodeRules } from '../rules/node.ts';
3
+
4
+ export default defineConfig({
5
+ plugins: nodeRules.plugins,
6
+ jsPlugins: nodeRules.jsPlugins,
7
+ rules: nodeRules.rules,
8
+ });
@@ -0,0 +1,7 @@
1
+ import { defineConfig } from 'oxlint';
2
+ import { playwrightRules } from '../rules/playwright.ts';
3
+
4
+ export default defineConfig({
5
+ jsPlugins: playwrightRules.jsPlugins,
6
+ rules: playwrightRules.rules,
7
+ });
@@ -0,0 +1,11 @@
1
+ import { defineConfig } from 'oxlint';
2
+ import { reactRules } from '../rules/react.ts';
3
+ import { reactA11yRules } from '../rules/react-a11y.ts';
4
+
5
+ export default defineConfig({
6
+ plugins: [...reactRules.plugins, ...reactA11yRules.plugins],
7
+ rules: {
8
+ ...reactRules.rules,
9
+ ...reactA11yRules.rules,
10
+ },
11
+ });
@@ -0,0 +1,7 @@
1
+ import { defineConfig } from 'oxlint';
2
+ import { storybookRules } from '../rules/storybook.ts';
3
+
4
+ export default defineConfig({
5
+ jsPlugins: storybookRules.jsPlugins,
6
+ rules: storybookRules.rules,
7
+ });
@@ -0,0 +1,7 @@
1
+ import { defineConfig } from 'oxlint';
2
+ import { styledComponentsRules } from '../rules/styled-components.ts';
3
+
4
+ export default defineConfig({
5
+ jsPlugins: styledComponentsRules.jsPlugins,
6
+ rules: styledComponentsRules.rules,
7
+ });
@@ -0,0 +1,7 @@
1
+ import { defineConfig } from 'oxlint';
2
+ import { testingLibraryRules } from '../rules/testing-library.ts';
3
+
4
+ export default defineConfig({
5
+ jsPlugins: testingLibraryRules.jsPlugins,
6
+ rules: testingLibraryRules.rules,
7
+ });
@@ -0,0 +1,20 @@
1
+ import { defineConfig } from 'oxlint';
2
+ import { baseRules } from '../rules/base.ts';
3
+ import { importRules } from '../rules/import.ts';
4
+ import { promiseRules } from '../rules/promise.ts';
5
+ import { typescriptRules } from '../rules/typescript.ts';
6
+
7
+ export default defineConfig({
8
+ plugins: [
9
+ ...baseRules.plugins,
10
+ ...importRules.plugins,
11
+ ...promiseRules.plugins,
12
+ ...typescriptRules.plugins,
13
+ ],
14
+ rules: {
15
+ ...baseRules.rules,
16
+ ...importRules.rules,
17
+ ...promiseRules.rules,
18
+ ...typescriptRules.rules,
19
+ },
20
+ });
@@ -0,0 +1,8 @@
1
+ import { defineConfig } from 'oxlint';
2
+ import { vitestRules } from '../rules/vitest.ts';
3
+
4
+ export default defineConfig({
5
+ plugins: vitestRules.plugins,
6
+ jsPlugins: vitestRules.jsPlugins,
7
+ rules: vitestRules.rules,
8
+ });
package/index.ts ADDED
@@ -0,0 +1,27 @@
1
+ // Types
2
+ export type { RuleFile } from './types.ts';
3
+
4
+ // Rules
5
+ export { baseRules } from './rules/base.ts';
6
+ export { importRules } from './rules/import.ts';
7
+ export { promiseRules } from './rules/promise.ts';
8
+ export { typescriptRules } from './rules/typescript.ts';
9
+ export { reactRules } from './rules/react.ts';
10
+ export { reactA11yRules } from './rules/react-a11y.ts';
11
+ export { nodeRules } from './rules/node.ts';
12
+ export { vitestRules } from './rules/vitest.ts';
13
+ export { playwrightRules } from './rules/playwright.ts';
14
+ export { storybookRules } from './rules/storybook.ts';
15
+ export { styledComponentsRules } from './rules/styled-components.ts';
16
+ export { testingLibraryRules } from './rules/testing-library.ts';
17
+
18
+ // Configs
19
+ export { default as javascriptConfig } from './configs/javascript.ts';
20
+ export { default as typescriptConfig } from './configs/typescript.ts';
21
+ export { default as reactConfig } from './configs/react.ts';
22
+ export { default as nodeConfig } from './configs/node.ts';
23
+ export { default as vitestConfig } from './configs/vitest.ts';
24
+ export { default as playwrightConfig } from './configs/playwright.ts';
25
+ export { default as storybookConfig } from './configs/storybook.ts';
26
+ export { default as styledComponentsConfig } from './configs/styled-components.ts';
27
+ export { default as testingLibraryConfig } from './configs/testing-library.ts';
package/package.json CHANGED
@@ -1,18 +1,60 @@
1
1
  {
2
2
  "name": "@wistia/oxlint-config",
3
- "version": "0.0.1",
3
+ "version": "0.3.0",
4
4
  "description": "Wistia's Oxlint configurations",
5
5
  "packageManager": "yarn@4.13.0",
6
6
  "type": "module",
7
+ "files": [
8
+ "configs",
9
+ "rules",
10
+ "index.ts",
11
+ "types.ts"
12
+ ],
7
13
  "exports": {
8
- "./package.json": "./package.json"
14
+ "./package.json": "./package.json",
15
+ "./configs/*": "./configs/*",
16
+ "./rules/*": "./rules/*",
17
+ ".": "./index.ts",
18
+ "./javascript": "./configs/javascript.ts",
19
+ "./typescript": "./configs/typescript.ts",
20
+ "./react": "./configs/react.ts",
21
+ "./node": "./configs/node.ts",
22
+ "./vitest": "./configs/vitest.ts"
9
23
  },
10
24
  "scripts": {
11
- "test": "echo \"Error: no test specified\" && exit 1"
25
+ "changeset": "changeset",
26
+ "format": "oxfmt .",
27
+ "format:ci": "oxfmt --check .",
28
+ "outdated": "yarn upgrade-interactive",
29
+ "release": "changeset publish",
30
+ "test": "vitest run --exclude test/validate-configs.test.mts",
31
+ "typecheck": "tsc --noEmit",
32
+ "validate": "vitest run test/validate-configs.test.mts"
12
33
  },
13
34
  "peerDependencies": {
14
35
  "oxlint": ">= 1.0.0"
15
36
  },
37
+ "dependencies": {
38
+ "@vitest/eslint-plugin": "^1.6.14",
39
+ "eslint-plugin-jest-dom": "^5.5.0",
40
+ "eslint-plugin-n": "^17.24.0",
41
+ "eslint-plugin-no-only-tests": "^3.3.0",
42
+ "eslint-plugin-playwright": "^2.10.1",
43
+ "eslint-plugin-storybook": "^10.3.4",
44
+ "eslint-plugin-styled-components": "^0.0.0",
45
+ "eslint-plugin-styled-components-a11y": "^2.2.1",
46
+ "eslint-plugin-testing-library": "^7.16.2"
47
+ },
48
+ "devDependencies": {
49
+ "@changesets/changelog-github": "^0.6.0",
50
+ "@changesets/cli": "^2.30.0",
51
+ "eslint": "^10.2.0",
52
+ "oxfmt": "^0.43.0",
53
+ "oxlint": "^1.58.0",
54
+ "storybook": "^10.3.4",
55
+ "typescript": "^6.0.2",
56
+ "vitest": "^4.1.2"
57
+ },
16
58
  "engines": {
17
59
  "node": "^20.19.0 || ^22.13.0 || >=24"
18
60
  },