@imranbarbhuiya/oxc-config 0.3.1 → 0.4.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.
Files changed (65) hide show
  1. package/README.md +12 -0
  2. package/dist/api-error.d.ts +0 -2
  3. package/dist/api-error.js +1 -2
  4. package/dist/central-icons.d.ts +0 -2
  5. package/dist/central-icons.js +1 -2
  6. package/dist/cli/index.js +1 -2
  7. package/dist/common.d.ts +0 -2
  8. package/dist/common.js +1 -2
  9. package/dist/config.d.ts +0 -2
  10. package/dist/config.js +1 -2
  11. package/dist/edge.d.ts +0 -2
  12. package/dist/edge.js +1 -2
  13. package/dist/effect-types-only.d.ts +0 -2
  14. package/dist/effect-types-only.js +1 -2
  15. package/dist/effect.d.ts +0 -2
  16. package/dist/effect.js +2 -2
  17. package/dist/effect.js.map +1 -1
  18. package/dist/i18n.d.ts +0 -2
  19. package/dist/i18n.js +1 -2
  20. package/dist/jsdoc.d.ts +0 -2
  21. package/dist/jsdoc.js +1 -2
  22. package/dist/module.d.ts +0 -2
  23. package/dist/module.js +1 -2
  24. package/dist/native-tailwind.d.ts +0 -2
  25. package/dist/native-tailwind.js +1 -2
  26. package/dist/native.d.ts +0 -2
  27. package/dist/native.js +1 -2
  28. package/dist/nest.d.ts +0 -2
  29. package/dist/nest.js +1 -2
  30. package/dist/next.d.ts +0 -2
  31. package/dist/next.js +1 -2
  32. package/dist/node.d.ts +0 -2
  33. package/dist/node.js +1 -2
  34. package/dist/oxfmt.d.ts +0 -2
  35. package/dist/oxfmt.js +1 -2
  36. package/dist/plugins/api-error.d.ts +0 -2
  37. package/dist/plugins/api-error.js +1 -2
  38. package/dist/plugins/central-icons.d.ts +0 -2
  39. package/dist/plugins/central-icons.js +1 -2
  40. package/dist/plugins/effect.d.ts +0 -2
  41. package/dist/plugins/effect.js +54 -2
  42. package/dist/plugins/effect.js.map +1 -1
  43. package/dist/plugins/i18n.d.ts +0 -2
  44. package/dist/plugins/i18n.js +1 -2
  45. package/dist/plugins/native-tailwind.d.ts +0 -2
  46. package/dist/plugins/native-tailwind.js +1 -2
  47. package/dist/plugins/nest.d.ts +0 -2
  48. package/dist/plugins/nest.js +1 -2
  49. package/dist/plugins/react.d.ts +0 -2
  50. package/dist/plugins/react.js +1 -2
  51. package/dist/plugins/restricted-syntax.d.ts +0 -2
  52. package/dist/plugins/restricted-syntax.js +1 -2
  53. package/dist/plugins/unistyles.d.ts +0 -2
  54. package/dist/plugins/unistyles.js +1 -2
  55. package/dist/react.d.ts +0 -2
  56. package/dist/react.js +1 -2
  57. package/dist/tailwind.d.ts +0 -2
  58. package/dist/tailwind.js +1 -2
  59. package/dist/tsdoc.d.ts +0 -2
  60. package/dist/tsdoc.js +1 -2
  61. package/dist/typescript.d.ts +0 -2
  62. package/dist/typescript.js +1 -2
  63. package/dist/unistyles.d.ts +0 -2
  64. package/dist/unistyles.js +1 -2
  65. package/package.json +15 -15
package/README.md CHANGED
@@ -152,6 +152,7 @@ The `effect-node` CLI preset extends `common`, `node`, `typescript`, `module` an
152
152
  - `mahir-effect/no-pipe-on-fn` flags `.pipe` on `Effect.fn(...)(...)`; pass combinators as extra arguments instead
153
153
  - `mahir-effect/no-throw-in-gen` flags `throw` directly inside `Effect.gen` / `Effect.fn` / `Effect.fnUntraced` generators
154
154
  - `mahir-effect/no-run-outside-edge` flags `Effect.runPromise`, `runSync`, `runFork` and the other `run*` functions outside `**/main.ts`, `**/*.test.ts` and `**/scripts/**`
155
+ - `mahir-effect/no-unsafe-sql` flags `sql.unsafe(...)` and `sql.literal(...)` whose first argument is not a constant string (a string literal or a template literal without `${}`). Interpolate values in the tagged template (`` sql`... ${value}` ``) and use `sql(identifier)` or a whitelist for identifiers and `ORDER BY`. `sql.unsafe('SELECT $1', [value])` is allowed. The `clientNames` option (default `['sql']`) lists the client names it checks, matched against `name.unsafe` and `this.name.unsafe`
155
156
  - `no-restricted-imports` rejects v3-era paths: `effect/Either`, `effect/unstable/*`, `@effect/platform`, `@effect/schema`, `@effect/rpc`, `@effect/cluster`, `@effect/sql` and their subpaths
156
157
  - `node-js/no-process-env` rejects `process.env`; use `Config`. It is off under `**/scripts/**`
157
158
 
@@ -176,6 +177,17 @@ export default defineConfig({
176
177
  });
177
178
  ```
178
179
 
180
+ Check SQL clients bound to other names:
181
+
182
+ ```ts
183
+ export default defineConfig({
184
+ extends: [common, node, typescript, module, effect],
185
+ rules: {
186
+ 'mahir-effect/no-unsafe-sql': [2, { clientNames: ['sql', 'db'] }],
187
+ },
188
+ });
189
+ ```
190
+
179
191
  `effect-types-only` is for UI packages that share types with an Effect backend but should not ship the Effect runtime. `mahir-effect/types-only-imports` flags value imports, value re-exports and dynamic imports of `effect`, `effect/*` and `@effect/*`. `import type`, `export type` and inline `type` specifiers are allowed. It does not use `no-restricted-imports`, so you can add your own entries:
180
192
 
181
193
  ```ts
@@ -1,4 +1,3 @@
1
- //#region src/api-error.d.ts
2
1
  declare const config: {
3
2
  plugins: ("eslint" | "react" | "unicorn" | "typescript" | "oxc" | "import" | "jsdoc" | "jest" | "vitest" | "jsx-a11y" | "nextjs" | "react-perf" | "promise" | "node" | "vue")[];
4
3
  jsPlugins: import("oxlint").ExternalPluginEntry[];
@@ -6,6 +5,5 @@ declare const config: {
6
5
  'mahir-api-error/require-api-error': number;
7
6
  };
8
7
  };
9
- //#endregion
10
8
  export { config as default };
11
9
  //# sourceMappingURL=api-error.d.ts.map
package/dist/api-error.js CHANGED
@@ -1,13 +1,12 @@
1
1
  import { localPlugin, nativePlugins } from "./config.js";
2
2
  import { defineConfig } from "oxlint";
3
3
 
4
- //#region src/api-error.ts
4
+ // src/api-error.ts
5
5
  const config = defineConfig({
6
6
  plugins: nativePlugins,
7
7
  jsPlugins: [localPlugin("mahir-api-error", "./plugins/api-error.js")],
8
8
  rules: { "mahir-api-error/require-api-error": 2 }
9
9
  });
10
10
 
11
- //#endregion
12
11
  export { config as default };
13
12
  //# sourceMappingURL=api-error.js.map
@@ -1,4 +1,3 @@
1
- //#region src/central-icons.d.ts
2
1
  declare const config: {
3
2
  plugins: ("eslint" | "react" | "unicorn" | "typescript" | "oxc" | "import" | "jsdoc" | "jest" | "vitest" | "jsx-a11y" | "nextjs" | "react-perf" | "promise" | "node" | "vue")[];
4
3
  jsPlugins: import("oxlint").ExternalPluginEntry[];
@@ -6,6 +5,5 @@ declare const config: {
6
5
  'mahir-central-icons/no-central-icons-barrel-import': number;
7
6
  };
8
7
  };
9
- //#endregion
10
8
  export { config as default };
11
9
  //# sourceMappingURL=central-icons.d.ts.map
@@ -1,13 +1,12 @@
1
1
  import { localPlugin, nativePlugins } from "./config.js";
2
2
  import { defineConfig } from "oxlint";
3
3
 
4
- //#region src/central-icons.ts
4
+ // src/central-icons.ts
5
5
  const config = defineConfig({
6
6
  plugins: nativePlugins,
7
7
  jsPlugins: [localPlugin("mahir-central-icons", "./plugins/central-icons.js")],
8
8
  rules: { "mahir-central-icons/no-central-icons-barrel-import": 2 }
9
9
  });
10
10
 
11
- //#endregion
12
11
  export { config as default };
13
12
  //# sourceMappingURL=central-icons.js.map
package/dist/cli/index.js CHANGED
@@ -6,7 +6,7 @@ import { parseArgs } from "node:util";
6
6
  import * as p from "@clack/prompts";
7
7
  import { addDevDependency, detectPackageManager } from "nypm";
8
8
 
9
- //#region src/cli/index.ts
9
+ // src/cli/index.ts
10
10
  const PACKAGE_NAME = "@imranbarbhuiya/oxc-config";
11
11
  const PRESETS = {
12
12
  nextjs: {
@@ -605,6 +605,5 @@ const runPrefix = pmName === "npm" ? "npm run" : pmName;
605
605
  p.outro(`Setup complete! Run \`${runPrefix} lint && ${runPrefix} format\``);
606
606
  process.exit(0);
607
607
 
608
- //#endregion
609
608
  export { };
610
609
  //# sourceMappingURL=index.js.map
package/dist/common.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- //#region src/common.d.ts
2
1
  declare const config: {
3
2
  plugins: ("eslint" | "react" | "unicorn" | "typescript" | "oxc" | "import" | "jsdoc" | "jest" | "vitest" | "jsx-a11y" | "nextjs" | "react-perf" | "promise" | "node" | "vue")[];
4
3
  jsPlugins: import("oxlint").ExternalPluginEntry[];
@@ -10,6 +9,5 @@ declare const config: {
10
9
  };
11
10
  rules: import("oxlint").DummyRuleMap;
12
11
  };
13
- //#endregion
14
12
  export { config as default };
15
13
  //# sourceMappingURL=common.d.ts.map
package/dist/common.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { localPlugin, nativePlugins } from "./config.js";
2
2
  import { defineConfig } from "oxlint";
3
3
 
4
- //#region src/common.ts
4
+ // src/common.ts
5
5
  const config = defineConfig({
6
6
  plugins: nativePlugins,
7
7
  jsPlugins: [localPlugin("mahir-restricted-syntax", "./plugins/restricted-syntax.js")],
@@ -239,6 +239,5 @@ const config = defineConfig({
239
239
  }
240
240
  });
241
241
 
242
- //#endregion
243
242
  export { config as default };
244
243
  //# sourceMappingURL=common.js.map
package/dist/config.d.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  import { ExternalPluginEntry, OxlintConfig } from "oxlint";
2
- //#region src/config.d.ts
3
2
  export declare const nativePlugins: NonNullable<OxlintConfig['plugins']>;
4
3
  export declare function packagePlugin(name: string, specifier: string): ExternalPluginEntry;
5
4
  export declare function localPlugin(name: string, path: string): ExternalPluginEntry;
@@ -7,5 +6,4 @@ export declare function matchesFileGlob(context: {
7
6
  cwd: string;
8
7
  filename: string;
9
8
  }, patterns: readonly string[]): boolean;
10
- //#endregion
11
9
  //# sourceMappingURL=config.d.ts.map
package/dist/config.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { isAbsolute, matchesGlob, relative } from "node:path";
2
2
  import { URL, fileURLToPath } from "node:url";
3
3
 
4
- //#region src/config.ts
4
+ // src/config.ts
5
5
  const nativePlugins = [
6
6
  "eslint",
7
7
  "typescript",
@@ -32,6 +32,5 @@ function matchesFileGlob(context, patterns) {
32
32
  return patterns.some((pattern) => matchesGlob(file, pattern));
33
33
  }
34
34
 
35
- //#endregion
36
35
  export { localPlugin, matchesFileGlob, nativePlugins, packagePlugin };
37
36
  //# sourceMappingURL=config.js.map
package/dist/edge.d.ts CHANGED
@@ -1,9 +1,7 @@
1
- //#region src/edge.d.ts
2
1
  declare const config: {
3
2
  plugins: ("eslint" | "react" | "unicorn" | "typescript" | "oxc" | "import" | "jsdoc" | "jest" | "vitest" | "jsx-a11y" | "nextjs" | "react-perf" | "promise" | "node" | "vue")[];
4
3
  jsPlugins: import("oxlint").ExternalPluginEntry[];
5
4
  rules: import("oxlint").DummyRuleMap;
6
5
  };
7
- //#endregion
8
6
  export { config as default };
9
7
  //# sourceMappingURL=edge.d.ts.map
package/dist/edge.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { nativePlugins, packagePlugin } from "./config.js";
2
2
  import { defineConfig } from "oxlint";
3
3
 
4
- //#region src/edge.ts
4
+ // src/edge.ts
5
5
  const config = defineConfig({
6
6
  plugins: nativePlugins,
7
7
  jsPlugins: [packagePlugin("node-js", "eslint-plugin-n")],
@@ -17,6 +17,5 @@ const config = defineConfig({
17
17
  }
18
18
  });
19
19
 
20
- //#endregion
21
20
  export { config as default };
22
21
  //# sourceMappingURL=edge.js.map
@@ -1,4 +1,3 @@
1
- //#region src/effect-types-only.d.ts
2
1
  declare const config: {
3
2
  plugins: ("eslint" | "react" | "unicorn" | "typescript" | "oxc" | "import" | "jsdoc" | "jest" | "vitest" | "jsx-a11y" | "nextjs" | "react-perf" | "promise" | "node" | "vue")[];
4
3
  jsPlugins: import("oxlint").ExternalPluginEntry[];
@@ -6,6 +5,5 @@ declare const config: {
6
5
  'mahir-effect/types-only-imports': number;
7
6
  };
8
7
  };
9
- //#endregion
10
8
  export { config as default };
11
9
  //# sourceMappingURL=effect-types-only.d.ts.map
@@ -1,13 +1,12 @@
1
1
  import { localPlugin, nativePlugins } from "./config.js";
2
2
  import { defineConfig } from "oxlint";
3
3
 
4
- //#region src/effect-types-only.ts
4
+ // src/effect-types-only.ts
5
5
  const config = defineConfig({
6
6
  plugins: nativePlugins,
7
7
  jsPlugins: [localPlugin("mahir-effect", "./plugins/effect.js")],
8
8
  rules: { "mahir-effect/types-only-imports": 2 }
9
9
  });
10
10
 
11
- //#endregion
12
11
  export { config as default };
13
12
  //# sourceMappingURL=effect-types-only.js.map
package/dist/effect.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- //#region src/effect.d.ts
2
1
  declare const config: {
3
2
  plugins: ("eslint" | "react" | "unicorn" | "typescript" | "oxc" | "import" | "jsdoc" | "jest" | "vitest" | "jsx-a11y" | "nextjs" | "react-perf" | "promise" | "node" | "vue")[];
4
3
  jsPlugins: import("oxlint").ExternalPluginEntry[];
@@ -10,6 +9,5 @@ declare const config: {
10
9
  };
11
10
  }[];
12
11
  };
13
- //#endregion
14
12
  export { config as default };
15
13
  //# sourceMappingURL=effect.d.ts.map
package/dist/effect.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { localPlugin, nativePlugins, packagePlugin } from "./config.js";
2
2
  import { defineConfig } from "oxlint";
3
3
 
4
- //#region src/effect.ts
4
+ // src/effect.ts
5
5
  const V3_MESSAGE = "This is an Effect v3 import path that does not exist in Effect v4.";
6
6
  const rules = {
7
7
  "mahir-effect/fn-name-matches": 2,
@@ -9,6 +9,7 @@ const rules = {
9
9
  "mahir-effect/no-pipe-on-fn": 2,
10
10
  "mahir-effect/no-run-outside-edge": 2,
11
11
  "mahir-effect/no-throw-in-gen": 2,
12
+ "mahir-effect/no-unsafe-sql": 2,
12
13
  "mahir-effect/return-yield-error": 2,
13
14
  "no-restricted-imports": [2, {
14
15
  paths: [
@@ -79,6 +80,5 @@ const config = defineConfig({
79
80
  }]
80
81
  });
81
82
 
82
- //#endregion
83
83
  export { config as default };
84
84
  //# sourceMappingURL=effect.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"effect.js","names":[],"sources":["../src/effect.ts"],"sourcesContent":["import { defineConfig } from 'oxlint';\n\nimport { localPlugin, nativePlugins, packagePlugin } from './config.js';\n\nimport type { OxlintConfig } from 'oxlint';\n\nconst V3_MESSAGE = 'This is an Effect v3 import path that does not exist in Effect v4.';\n\nconst rules: NonNullable<OxlintConfig['rules']> = {\n\t'mahir-effect/fn-name-matches': 2,\n\t'mahir-effect/no-gen-wrapper': 2,\n\t'mahir-effect/no-pipe-on-fn': 2,\n\t'mahir-effect/no-run-outside-edge': 2,\n\t'mahir-effect/no-throw-in-gen': 2,\n\t'mahir-effect/return-yield-error': 2,\n\t'no-restricted-imports': [\n\t\t2,\n\t\t{\n\t\t\tpaths: [\n\t\t\t\t{ name: 'effect/Either', message: 'Effect v4 replaced `effect/Either` with `effect/Result`.' },\n\t\t\t\t{ name: '@effect/platform', message: `${V3_MESSAGE} Import from \\`effect\\` or \\`effect/<module>\\`.` },\n\t\t\t\t{ name: '@effect/schema', message: `${V3_MESSAGE} Import \\`Schema\\` from \\`effect\\`.` },\n\t\t\t\t{ name: '@effect/rpc', message: `${V3_MESSAGE} Import from \\`effect/rpc\\`.` },\n\t\t\t\t{ name: '@effect/cluster', message: `${V3_MESSAGE} Import from \\`effect/cluster\\`.` },\n\t\t\t\t{ name: '@effect/sql', message: `${V3_MESSAGE} Import from \\`effect/sql\\`.` },\n\t\t\t],\n\t\t\tpatterns: [\n\t\t\t\t{\n\t\t\t\t\tgroup: ['effect/unstable/*'],\n\t\t\t\t\tmessage: 'Effect v4 dropped the `unstable` segment. Import from `effect/<module>`.',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tgroup: ['@effect/platform/*', '@effect/schema/*', '@effect/rpc/*', '@effect/cluster/*', '@effect/sql/*'],\n\t\t\t\t\tmessage: `${V3_MESSAGE} Import from \\`effect\\` or \\`effect/<module>\\`.`,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t],\n\t'node-js/no-process-env': 2,\n\t'func-names': [2, 'as-needed', { generators: 'never' }],\n\t'no-use-before-define': [\n\t\t2,\n\t\t{\n\t\t\tclasses: false,\n\t\t\tfunctions: false,\n\t\t\tvariables: true,\n\t\t},\n\t],\n\t'no-redeclare': 0,\n\t'promise/prefer-await-to-callbacks': 0,\n\t'promise/prefer-await-to-then': 0,\n\t'require-yield': 0,\n\t'unicorn/prefer-top-level-await': 0,\n\t'unicorn/throw-new-error': 0,\n};\n\nconst config = defineConfig({\n\tplugins: nativePlugins,\n\tjsPlugins: [localPlugin('mahir-effect', './plugins/effect.js'), packagePlugin('node-js', 'eslint-plugin-n')],\n\trules,\n\toverrides: [\n\t\t{\n\t\t\tfiles: ['**/scripts/**'],\n\t\t\trules: {\n\t\t\t\t'node-js/no-process-env': 0,\n\t\t\t},\n\t\t},\n\t],\n});\n\nexport default config;\n"],"mappings":";;;;AAMA,MAAM,aAAa;AAEnB,MAAM,QAA4C;CACjD,gCAAgC;CAChC,+BAA+B;CAC/B,8BAA8B;CAC9B,oCAAoC;CACpC,gCAAgC;CAChC,mCAAmC;CACnC,yBAAyB,CACxB,GACA;EACC,OAAO;GACN;IAAE,MAAM;IAAiB,SAAS;GAA2D;GAC7F;IAAE,MAAM;IAAoB,SAAS,GAAG,WAAW;GAAiD;GACpG;IAAE,MAAM;IAAkB,SAAS,GAAG,WAAW;GAAqC;GACtF;IAAE,MAAM;IAAe,SAAS,GAAG,WAAW;GAA8B;GAC5E;IAAE,MAAM;IAAmB,SAAS,GAAG,WAAW;GAAkC;GACpF;IAAE,MAAM;IAAe,SAAS,GAAG,WAAW;GAA8B;EAC7E;EACA,UAAU,CACT;GACC,OAAO,CAAC,mBAAmB;GAC3B,SAAS;EACV,GACA;GACC,OAAO;IAAC;IAAsB;IAAoB;IAAiB;IAAqB;GAAe;GACvG,SAAS,GAAG,WAAW;EACxB,CACD;CACD,CACD;CACA,0BAA0B;CAC1B,cAAc;EAAC;EAAG;EAAa,EAAE,YAAY,QAAQ;CAAC;CACtD,wBAAwB,CACvB,GACA;EACC,SAAS;EACT,WAAW;EACX,WAAW;CACZ,CACD;CACA,gBAAgB;CAChB,qCAAqC;CACrC,gCAAgC;CAChC,iBAAiB;CACjB,kCAAkC;CAClC,2BAA2B;AAC5B;AAEA,MAAM,SAAS,aAAa;CAC3B,SAAS;CACT,WAAW,CAAC,YAAY,gBAAgB,qBAAqB,GAAG,cAAc,WAAW,iBAAiB,CAAC;CAC3G;CACA,WAAW,CACV;EACC,OAAO,CAAC,eAAe;EACvB,OAAO,EACN,0BAA0B,EAC3B;CACD,CACD;AACD,CAAC"}
1
+ {"version":3,"file":"effect.js","names":[],"sources":["../src/effect.ts"],"sourcesContent":["import { defineConfig } from 'oxlint';\n\nimport { localPlugin, nativePlugins, packagePlugin } from './config.js';\n\nimport type { OxlintConfig } from 'oxlint';\n\nconst V3_MESSAGE = 'This is an Effect v3 import path that does not exist in Effect v4.';\n\nconst rules: NonNullable<OxlintConfig['rules']> = {\n\t'mahir-effect/fn-name-matches': 2,\n\t'mahir-effect/no-gen-wrapper': 2,\n\t'mahir-effect/no-pipe-on-fn': 2,\n\t'mahir-effect/no-run-outside-edge': 2,\n\t'mahir-effect/no-throw-in-gen': 2,\n\t'mahir-effect/no-unsafe-sql': 2,\n\t'mahir-effect/return-yield-error': 2,\n\t'no-restricted-imports': [\n\t\t2,\n\t\t{\n\t\t\tpaths: [\n\t\t\t\t{ name: 'effect/Either', message: 'Effect v4 replaced `effect/Either` with `effect/Result`.' },\n\t\t\t\t{ name: '@effect/platform', message: `${V3_MESSAGE} Import from \\`effect\\` or \\`effect/<module>\\`.` },\n\t\t\t\t{ name: '@effect/schema', message: `${V3_MESSAGE} Import \\`Schema\\` from \\`effect\\`.` },\n\t\t\t\t{ name: '@effect/rpc', message: `${V3_MESSAGE} Import from \\`effect/rpc\\`.` },\n\t\t\t\t{ name: '@effect/cluster', message: `${V3_MESSAGE} Import from \\`effect/cluster\\`.` },\n\t\t\t\t{ name: '@effect/sql', message: `${V3_MESSAGE} Import from \\`effect/sql\\`.` },\n\t\t\t],\n\t\t\tpatterns: [\n\t\t\t\t{\n\t\t\t\t\tgroup: ['effect/unstable/*'],\n\t\t\t\t\tmessage: 'Effect v4 dropped the `unstable` segment. Import from `effect/<module>`.',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tgroup: ['@effect/platform/*', '@effect/schema/*', '@effect/rpc/*', '@effect/cluster/*', '@effect/sql/*'],\n\t\t\t\t\tmessage: `${V3_MESSAGE} Import from \\`effect\\` or \\`effect/<module>\\`.`,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t],\n\t'node-js/no-process-env': 2,\n\t'func-names': [2, 'as-needed', { generators: 'never' }],\n\t'no-use-before-define': [\n\t\t2,\n\t\t{\n\t\t\tclasses: false,\n\t\t\tfunctions: false,\n\t\t\tvariables: true,\n\t\t},\n\t],\n\t'no-redeclare': 0,\n\t'promise/prefer-await-to-callbacks': 0,\n\t'promise/prefer-await-to-then': 0,\n\t'require-yield': 0,\n\t'unicorn/prefer-top-level-await': 0,\n\t'unicorn/throw-new-error': 0,\n};\n\nconst config = defineConfig({\n\tplugins: nativePlugins,\n\tjsPlugins: [localPlugin('mahir-effect', './plugins/effect.js'), packagePlugin('node-js', 'eslint-plugin-n')],\n\trules,\n\toverrides: [\n\t\t{\n\t\t\tfiles: ['**/scripts/**'],\n\t\t\trules: {\n\t\t\t\t'node-js/no-process-env': 0,\n\t\t\t},\n\t\t},\n\t],\n});\n\nexport default config;\n"],"mappings":";;;;AAMA,MAAM,aAAa;AAEnB,MAAM,QAA4C;CACjD,gCAAgC;CAChC,+BAA+B;CAC/B,8BAA8B;CAC9B,oCAAoC;CACpC,gCAAgC;CAChC,8BAA8B;CAC9B,mCAAmC;CACnC,yBAAyB,CACxB,GACA;EACC,OAAO;GACN;IAAE,MAAM;IAAiB,SAAS;GAA2D;GAC7F;IAAE,MAAM;IAAoB,SAAS,GAAG,WAAW;GAAiD;GACpG;IAAE,MAAM;IAAkB,SAAS,GAAG,WAAW;GAAqC;GACtF;IAAE,MAAM;IAAe,SAAS,GAAG,WAAW;GAA8B;GAC5E;IAAE,MAAM;IAAmB,SAAS,GAAG,WAAW;GAAkC;GACpF;IAAE,MAAM;IAAe,SAAS,GAAG,WAAW;GAA8B;EAC7E;EACA,UAAU,CACT;GACC,OAAO,CAAC,mBAAmB;GAC3B,SAAS;EACV,GACA;GACC,OAAO;IAAC;IAAsB;IAAoB;IAAiB;IAAqB;GAAe;GACvG,SAAS,GAAG,WAAW;EACxB,CACD;CACD,CACD;CACA,0BAA0B;CAC1B,cAAc;EAAC;EAAG;EAAa,EAAE,YAAY,QAAQ;CAAC;CACtD,wBAAwB,CACvB,GACA;EACC,SAAS;EACT,WAAW;EACX,WAAW;CACZ,CACD;CACA,gBAAgB;CAChB,qCAAqC;CACrC,gCAAgC;CAChC,iBAAiB;CACjB,kCAAkC;CAClC,2BAA2B;AAC5B;AAEA,MAAM,SAAS,aAAa;CAC3B,SAAS;CACT,WAAW,CAAC,YAAY,gBAAgB,qBAAqB,GAAG,cAAc,WAAW,iBAAiB,CAAC;CAC3G;CACA,WAAW,CACV;EACC,OAAO,CAAC,eAAe;EACvB,OAAO,EACN,0BAA0B,EAC3B;CACD,CACD;AACD,CAAC"}
package/dist/i18n.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- //#region src/i18n.d.ts
2
1
  declare const config: {
3
2
  plugins: ("eslint" | "react" | "unicorn" | "typescript" | "oxc" | "import" | "jsdoc" | "jest" | "vitest" | "jsx-a11y" | "nextjs" | "react-perf" | "promise" | "node" | "vue")[];
4
3
  jsPlugins: import("oxlint").ExternalPluginEntry[];
@@ -7,6 +6,5 @@ declare const config: {
7
6
  'mahir-i18n/no-t-as-parameter': number;
8
7
  };
9
8
  };
10
- //#endregion
11
9
  export { config as default };
12
10
  //# sourceMappingURL=i18n.d.ts.map
package/dist/i18n.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { localPlugin, nativePlugins } from "./config.js";
2
2
  import { defineConfig } from "oxlint";
3
3
 
4
- //#region src/i18n.ts
4
+ // src/i18n.ts
5
5
  const config = defineConfig({
6
6
  plugins: nativePlugins,
7
7
  jsPlugins: [localPlugin("mahir-i18n", "./plugins/i18n.js")],
@@ -11,6 +11,5 @@ const config = defineConfig({
11
11
  }
12
12
  });
13
13
 
14
- //#endregion
15
14
  export { config as default };
16
15
  //# sourceMappingURL=i18n.js.map
package/dist/jsdoc.d.ts CHANGED
@@ -1,9 +1,7 @@
1
- //#region src/jsdoc.d.ts
2
1
  declare const config: {
3
2
  plugins: ("eslint" | "react" | "unicorn" | "typescript" | "oxc" | "import" | "jsdoc" | "jest" | "vitest" | "jsx-a11y" | "nextjs" | "react-perf" | "promise" | "node" | "vue")[];
4
3
  jsPlugins: import("oxlint").ExternalPluginEntry[];
5
4
  rules: import("oxlint").DummyRuleMap;
6
5
  };
7
- //#endregion
8
6
  export { config as default };
9
7
  //# sourceMappingURL=jsdoc.d.ts.map
package/dist/jsdoc.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { nativePlugins, packagePlugin } from "./config.js";
2
2
  import { defineConfig } from "oxlint";
3
3
 
4
- //#region src/jsdoc.ts
4
+ // src/jsdoc.ts
5
5
  const config = defineConfig({
6
6
  plugins: nativePlugins,
7
7
  jsPlugins: [packagePlugin("jsdoc-js", "eslint-plugin-jsdoc")],
@@ -39,6 +39,5 @@ const config = defineConfig({
39
39
  }
40
40
  });
41
41
 
42
- //#endregion
43
42
  export { config as default };
44
43
  //# sourceMappingURL=jsdoc.js.map
package/dist/module.d.ts CHANGED
@@ -1,8 +1,6 @@
1
- //#region src/module.d.ts
2
1
  declare const config: {
3
2
  plugins: ("eslint" | "react" | "unicorn" | "typescript" | "oxc" | "import" | "jsdoc" | "jest" | "vitest" | "jsx-a11y" | "nextjs" | "react-perf" | "promise" | "node" | "vue")[];
4
3
  rules: import("oxlint").DummyRuleMap;
5
4
  };
6
- //#endregion
7
5
  export { config as default };
8
6
  //# sourceMappingURL=module.d.ts.map
package/dist/module.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { nativePlugins } from "./config.js";
2
2
  import { defineConfig } from "oxlint";
3
3
 
4
- //#region src/module.ts
4
+ // src/module.ts
5
5
  const config = defineConfig({
6
6
  plugins: nativePlugins,
7
7
  rules: {
@@ -10,6 +10,5 @@ const config = defineConfig({
10
10
  }
11
11
  });
12
12
 
13
- //#endregion
14
13
  export { config as default };
15
14
  //# sourceMappingURL=module.js.map
@@ -1,4 +1,3 @@
1
- //#region src/native-tailwind.d.ts
2
1
  declare const config: {
3
2
  plugins: ("eslint" | "react" | "unicorn" | "typescript" | "oxc" | "import" | "jsdoc" | "jest" | "vitest" | "jsx-a11y" | "nextjs" | "react-perf" | "promise" | "node" | "vue")[];
4
3
  jsPlugins: import("oxlint").ExternalPluginEntry[];
@@ -6,6 +5,5 @@ declare const config: {
6
5
  'mahir-native-tailwind/class-name-rules': number;
7
6
  };
8
7
  };
9
- //#endregion
10
8
  export { config as default };
11
9
  //# sourceMappingURL=native-tailwind.d.ts.map
@@ -1,13 +1,12 @@
1
1
  import { localPlugin, nativePlugins } from "./config.js";
2
2
  import { defineConfig } from "oxlint";
3
3
 
4
- //#region src/native-tailwind.ts
4
+ // src/native-tailwind.ts
5
5
  const config = defineConfig({
6
6
  plugins: nativePlugins,
7
7
  jsPlugins: [localPlugin("mahir-native-tailwind", "./plugins/native-tailwind.js")],
8
8
  rules: { "mahir-native-tailwind/class-name-rules": 2 }
9
9
  });
10
10
 
11
- //#endregion
12
11
  export { config as default };
13
12
  //# sourceMappingURL=native-tailwind.js.map
package/dist/native.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- //#region src/native.d.ts
2
1
  declare const config: {
3
2
  extends: {
4
3
  plugins: ("eslint" | "react" | "unicorn" | "typescript" | "oxc" | "import" | "jsdoc" | "jest" | "vitest" | "jsx-a11y" | "nextjs" | "react-perf" | "promise" | "node" | "vue")[];
@@ -50,6 +49,5 @@ declare const config: {
50
49
  };
51
50
  }[];
52
51
  };
53
- //#endregion
54
52
  export { config as default };
55
53
  //# sourceMappingURL=native.d.ts.map
package/dist/native.js CHANGED
@@ -2,7 +2,7 @@ import { nativePlugins } from "./config.js";
2
2
  import config$1 from "./react.js";
3
3
  import { defineConfig } from "oxlint";
4
4
 
5
- //#region src/native.ts
5
+ // src/native.ts
6
6
  const config = defineConfig({
7
7
  extends: [config$1],
8
8
  plugins: nativePlugins,
@@ -40,6 +40,5 @@ const config = defineConfig({
40
40
  }]
41
41
  });
42
42
 
43
- //#endregion
44
43
  export { config as default };
45
44
  //# sourceMappingURL=native.js.map
package/dist/nest.d.ts CHANGED
@@ -1,9 +1,7 @@
1
- //#region src/nest.d.ts
2
1
  declare const config: {
3
2
  plugins: ("eslint" | "react" | "unicorn" | "typescript" | "oxc" | "import" | "jsdoc" | "jest" | "vitest" | "jsx-a11y" | "nextjs" | "react-perf" | "promise" | "node" | "vue")[];
4
3
  jsPlugins: import("oxlint").ExternalPluginEntry[];
5
4
  rules: import("oxlint").DummyRuleMap;
6
5
  };
7
- //#endregion
8
6
  export { config as default };
9
7
  //# sourceMappingURL=nest.d.ts.map
package/dist/nest.js CHANGED
@@ -1,13 +1,12 @@
1
1
  import { localPlugin, nativePlugins } from "./config.js";
2
2
  import { defineConfig } from "oxlint";
3
3
 
4
- //#region src/nest.ts
4
+ // src/nest.ts
5
5
  const config = defineConfig({
6
6
  plugins: nativePlugins,
7
7
  jsPlugins: [localPlugin("mahir-nest", "./plugins/nest.js")],
8
8
  rules: { "mahir-nest/sort-module-metadata-arrays": 2 }
9
9
  });
10
10
 
11
- //#endregion
12
11
  export { config as default };
13
12
  //# sourceMappingURL=nest.js.map
package/dist/next.d.ts CHANGED
@@ -1,8 +1,6 @@
1
- //#region src/next.d.ts
2
1
  declare const config: {
3
2
  plugins: ("eslint" | "react" | "unicorn" | "typescript" | "oxc" | "import" | "jsdoc" | "jest" | "vitest" | "jsx-a11y" | "nextjs" | "react-perf" | "promise" | "node" | "vue")[];
4
3
  rules: import("oxlint").DummyRuleMap;
5
4
  };
6
- //#endregion
7
5
  export { config as default };
8
6
  //# sourceMappingURL=next.d.ts.map
package/dist/next.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { nativePlugins } from "./config.js";
2
2
  import { defineConfig } from "oxlint";
3
3
 
4
- //#region src/next.ts
4
+ // src/next.ts
5
5
  const config = defineConfig({
6
6
  plugins: nativePlugins,
7
7
  rules: {
@@ -28,6 +28,5 @@ const config = defineConfig({
28
28
  }
29
29
  });
30
30
 
31
- //#endregion
32
31
  export { config as default };
33
32
  //# sourceMappingURL=next.js.map
package/dist/node.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- //#region src/node.d.ts
2
1
  declare const config: {
3
2
  plugins: ("eslint" | "react" | "unicorn" | "typescript" | "oxc" | "import" | "jsdoc" | "jest" | "vitest" | "jsx-a11y" | "nextjs" | "react-perf" | "promise" | "node" | "vue")[];
4
3
  jsPlugins: import("oxlint").ExternalPluginEntry[];
@@ -7,6 +6,5 @@ declare const config: {
7
6
  };
8
7
  rules: import("oxlint").DummyRuleMap;
9
8
  };
10
- //#endregion
11
9
  export { config as default };
12
10
  //# sourceMappingURL=node.d.ts.map
package/dist/node.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { nativePlugins, packagePlugin } from "./config.js";
2
2
  import { defineConfig } from "oxlint";
3
3
 
4
- //#region src/node.ts
4
+ // src/node.ts
5
5
  const config = defineConfig({
6
6
  plugins: nativePlugins,
7
7
  jsPlugins: [packagePlugin("node-js", "eslint-plugin-n")],
@@ -61,6 +61,5 @@ const config = defineConfig({
61
61
  }
62
62
  });
63
63
 
64
- //#endregion
65
64
  export { config as default };
66
65
  //# sourceMappingURL=node.js.map
package/dist/oxfmt.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- //#region src/oxfmt.d.ts
2
1
  declare const _default: {
3
2
  printWidth: number;
4
3
  useTabs: true;
@@ -11,6 +10,5 @@ declare const _default: {
11
10
  groups: string[];
12
11
  };
13
12
  };
14
- //#endregion
15
13
  export { _default as default };
16
14
  //# sourceMappingURL=oxfmt.d.ts.map
package/dist/oxfmt.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { defineConfig } from "oxfmt";
2
2
 
3
- //#region src/oxfmt.ts
3
+ // src/oxfmt.ts
4
4
  var oxfmt_default = defineConfig({
5
5
  printWidth: 120,
6
6
  useTabs: true,
@@ -20,6 +20,5 @@ var oxfmt_default = defineConfig({
20
20
  ] }
21
21
  });
22
22
 
23
- //#endregion
24
23
  export { oxfmt_default as default };
25
24
  //# sourceMappingURL=oxfmt.js.map
@@ -1,5 +1,3 @@
1
- //#region src/plugins/api-error.d.ts
2
1
  declare const _default: import("@oxlint/plugins").Plugin;
3
- //#endregion
4
2
  export { _default as default };
5
3
  //# sourceMappingURL=api-error.d.ts.map
@@ -1,6 +1,6 @@
1
1
  import { definePlugin, defineRule } from "@oxlint/plugins";
2
2
 
3
- //#region src/plugins/api-error.ts
3
+ // src/plugins/api-error.ts
4
4
  const DEFAULT_ALLOWED_ERRORS = ["ApiError", "FormValidationError"];
5
5
  function getStaticFactoryCallee(arg) {
6
6
  if (arg.type !== "CallExpression") return void 0;
@@ -173,6 +173,5 @@ var api_error_default = definePlugin({
173
173
  rules: { "require-api-error": requireApiError }
174
174
  });
175
175
 
176
- //#endregion
177
176
  export { api_error_default as default };
178
177
  //# sourceMappingURL=api-error.js.map
@@ -1,5 +1,3 @@
1
- //#region src/plugins/central-icons.d.ts
2
1
  declare const _default: import("@oxlint/plugins").Plugin;
3
- //#endregion
4
2
  export { _default as default };
5
3
  //# sourceMappingURL=central-icons.d.ts.map
@@ -1,6 +1,6 @@
1
1
  import { definePlugin, defineRule } from "@oxlint/plugins";
2
2
 
3
- //#region src/plugins/central-icons.ts
3
+ // src/plugins/central-icons.ts
4
4
  const CENTRAL_ICONS_PACKAGE_RE = /^@central-icons-react(?:-native)?\/[^/]+$/;
5
5
  function centralIconSubpath(iconName) {
6
6
  if (iconName.endsWith("Default")) return iconName.slice(0, -7);
@@ -54,6 +54,5 @@ var central_icons_default = definePlugin({
54
54
  rules: { "no-central-icons-barrel-import": noCentralIconsBarrelImport }
55
55
  });
56
56
 
57
- //#endregion
58
57
  export { central_icons_default as default };
59
58
  //# sourceMappingURL=central-icons.js.map
@@ -1,5 +1,3 @@
1
- //#region src/plugins/effect.d.ts
2
1
  declare const _default: import("@oxlint/plugins").Plugin;
3
- //#endregion
4
2
  export { _default as default };
5
3
  //# sourceMappingURL=effect.d.ts.map
@@ -1,7 +1,7 @@
1
1
  import { matchesFileGlob } from "../config.js";
2
2
  import { definePlugin, defineRule } from "@oxlint/plugins";
3
3
 
4
- //#region src/plugins/effect.ts
4
+ // src/plugins/effect.ts
5
5
  const DEFAULT_EDGE_FILES = [
6
6
  "**/main.ts",
7
7
  "**/*.test.ts",
@@ -28,6 +28,8 @@ const FN_METHODS = /* @__PURE__ */ new Set(["fn", "fnUntraced"]);
28
28
  const FN_NAMED = /* @__PURE__ */ new Set(["fn"]);
29
29
  const GEN = /* @__PURE__ */ new Set(["gen"]);
30
30
  const GEN_OR_FN = /* @__PURE__ */ new Set(["gen", ...FN_METHODS]);
31
+ const DEFAULT_SQL_CLIENTS = ["sql"];
32
+ const UNSAFE_SQL_METHODS = /* @__PURE__ */ new Set(["literal", "unsafe"]);
31
33
  function isEffectMember(node, methods) {
32
34
  return node.type === "MemberExpression" && !node.computed && node.object.type === "Identifier" && node.object.name === "Effect" && node.property.type === "Identifier" && methods.has(node.property.name);
33
35
  }
@@ -230,6 +232,56 @@ const noRunOutsideEdge = defineRule({
230
232
  };
231
233
  }
232
234
  });
235
+ function sqlClientName(node) {
236
+ if (node.type === "Identifier") return node.name;
237
+ if (node.type === "MemberExpression" && !node.computed && node.property.type === "Identifier") return node.property.name;
238
+ }
239
+ const noUnsafeSql = defineRule({
240
+ meta: {
241
+ type: "problem",
242
+ docs: { description: "Disallow non-constant SQL text in `sql.unsafe` and `sql.literal`" },
243
+ schema: [{
244
+ type: "object",
245
+ additionalProperties: false,
246
+ properties: { clientNames: {
247
+ type: "array",
248
+ items: {
249
+ type: "string",
250
+ minLength: 1
251
+ },
252
+ uniqueItems: true
253
+ } }
254
+ }],
255
+ messages: { dynamicSql: "`{{client}}.{{method}}` with non-constant text can lead to SQL injection. Interpolate values in the `sql` tagged template and use `sql(identifier)` or a whitelist for identifiers and ORDER BY." },
256
+ defaultOptions: [{ clientNames: [...DEFAULT_SQL_CLIENTS] }]
257
+ },
258
+ createOnce(context) {
259
+ let clients = new Set(DEFAULT_SQL_CLIENTS);
260
+ return {
261
+ before() {
262
+ const options = context.options[0];
263
+ clients = new Set(options?.clientNames ?? DEFAULT_SQL_CLIENTS);
264
+ },
265
+ CallExpression(node) {
266
+ const { callee } = node;
267
+ if (callee.type !== "MemberExpression" || callee.computed || callee.property.type !== "Identifier") return;
268
+ const method = callee.property.name;
269
+ if (!UNSAFE_SQL_METHODS.has(method)) return;
270
+ const client = sqlClientName(callee.object);
271
+ if (client === void 0 || !clients.has(client)) return;
272
+ if (node.arguments.length === 0 || staticString(node.arguments[0]) !== void 0) return;
273
+ context.report({
274
+ node: node.arguments[0],
275
+ messageId: "dynamicSql",
276
+ data: {
277
+ client,
278
+ method
279
+ }
280
+ });
281
+ }
282
+ };
283
+ }
284
+ });
233
285
  function isEffectModule(source) {
234
286
  return source === "effect" || source.startsWith("effect/") || source.startsWith("@effect/");
235
287
  }
@@ -276,11 +328,11 @@ var effect_default = definePlugin({
276
328
  "no-pipe-on-fn": noPipeOnFn,
277
329
  "no-run-outside-edge": noRunOutsideEdge,
278
330
  "no-throw-in-gen": noThrowInGen,
331
+ "no-unsafe-sql": noUnsafeSql,
279
332
  "return-yield-error": returnYieldError,
280
333
  "types-only-imports": typesOnlyImports
281
334
  }
282
335
  });
283
336
 
284
- //#endregion
285
337
  export { effect_default as default };
286
338
  //# sourceMappingURL=effect.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"effect.js","names":[],"sources":["../../src/plugins/effect.ts"],"sourcesContent":["import { definePlugin, defineRule } from '@oxlint/plugins';\n\nimport { matchesFileGlob } from '../config.js';\n\nimport type { ESTree } from '@oxlint/plugins';\n\nconst DEFAULT_EDGE_FILES = ['**/main.ts', '**/*.test.ts', '**/scripts/**'];\nconst RUN_METHODS = new Set(['runCallback', 'runFork', 'runPromise', 'runPromiseExit', 'runSync', 'runSyncExit']);\nconst FAIL_METHODS = new Set(['die', 'dieMessage', 'dieSync', 'fail', 'failCause', 'failCauseSync', 'failSync']);\nconst FN_METHODS = new Set(['fn', 'fnUntraced']);\nconst FN_NAMED = new Set(['fn']);\nconst GEN = new Set(['gen']);\nconst GEN_OR_FN = new Set(['gen', ...FN_METHODS]);\n\nfunction isEffectMember(node: ESTree.Node, methods: Set<string>): node is ESTree.MemberExpression {\n\treturn (\n\t\tnode.type === 'MemberExpression' &&\n\t\t!node.computed &&\n\t\tnode.object.type === 'Identifier' &&\n\t\tnode.object.name === 'Effect' &&\n\t\tnode.property.type === 'Identifier' &&\n\t\tmethods.has(node.property.name)\n\t);\n}\n\nfunction isEffectCall(node: ESTree.Node | null | undefined, methods: Set<string>): node is ESTree.CallExpression {\n\treturn node?.type === 'CallExpression' && isEffectMember(node.callee, methods);\n}\n\nfunction staticString(node: ESTree.Node | undefined) {\n\tif (node?.type === 'Literal' && typeof node.value === 'string') return node.value;\n\tif (node?.type !== 'TemplateLiteral' || node.expressions.length > 0) return undefined;\n\treturn node.quasis[0]?.value.cooked ?? undefined;\n}\n\nfunction isNamedFnFactory(node: ESTree.Node): node is ESTree.CallExpression {\n\treturn isEffectCall(node, FN_NAMED) && staticString(node.arguments[0]) !== undefined;\n}\n\nfunction isEffectGeneratorBody(fn: ESTree.Node) {\n\tif (fn.type !== 'FunctionExpression' || !fn.generator) return false;\n\tconst call = fn.parent;\n\tif (call.type !== 'CallExpression' || !call.arguments.includes(fn)) return false;\n\tif (isEffectMember(call.callee, GEN_OR_FN)) return true;\n\treturn isNamedFnFactory(call.callee);\n}\n\nfunction isEffectFnCall(node: ESTree.Node) {\n\tif (node.type !== 'CallExpression') return false;\n\tif (isNamedFnFactory(node.callee)) return true;\n\treturn isEffectCall(node, FN_METHODS) && node.arguments[0]?.type === 'FunctionExpression';\n}\n\nfunction isGenOrPipedGen(node: ESTree.Node | null | undefined) {\n\tif (node?.type !== 'CallExpression') return false;\n\tconst { callee } = node;\n\tif (\n\t\tcallee.type === 'MemberExpression' &&\n\t\t!callee.computed &&\n\t\tcallee.property.type === 'Identifier' &&\n\t\tcallee.property.name === 'pipe'\n\t) {\n\t\treturn isEffectCall(callee.object, GEN);\n\t}\n\treturn isEffectMember(callee, GEN);\n}\n\nfunction returnedExpression(fn: ESTree.Function | ESTree.ArrowFunctionExpression) {\n\tconst { body } = fn;\n\tif (!body) return undefined;\n\tif (body.type !== 'BlockStatement') return body;\n\tif (body.body.length !== 1) return undefined;\n\tconst [statement] = body.body;\n\treturn statement.type === 'ReturnStatement' ? statement.argument : undefined;\n}\n\nfunction isReusableFunction(fn: ESTree.Function | ESTree.ArrowFunctionExpression) {\n\tif (fn.type === 'FunctionDeclaration') return true;\n\tconst { parent } = fn;\n\tif (parent.type === 'VariableDeclarator') return parent.init === fn;\n\tif (parent.type === 'Property' || parent.type === 'PropertyDefinition') return parent.value === fn;\n\treturn parent.type === 'MethodDefinition' || parent.type === 'ExportDefaultDeclaration';\n}\n\nfunction bindingName(node: ESTree.Node) {\n\tconst { parent } = node;\n\tif (!parent) return undefined;\n\tif (parent.type === 'VariableDeclarator' && parent.init === node && parent.id.type === 'Identifier') {\n\t\treturn parent.id.name;\n\t}\n\tif (\n\t\t(parent.type === 'Property' || parent.type === 'PropertyDefinition') &&\n\t\tparent.value === node &&\n\t\t!parent.computed\n\t) {\n\t\tif (parent.key.type === 'Identifier') return parent.key.name;\n\t\treturn staticString(parent.key);\n\t}\n\treturn undefined;\n}\n\nconst noGenWrapper = defineRule({\n\tmeta: {\n\t\ttype: 'suggestion',\n\t\tdocs: {\n\t\t\tdescription: 'Disallow functions that only wrap and return `Effect.gen`',\n\t\t},\n\t\tmessages: {\n\t\t\tnoGenWrapper:\n\t\t\t\t'Avoid functions that only wrap and return `Effect.gen`. Use `Effect.fn(\"name\")(function* (...) {...})` or `Effect.fnUntraced` instead.',\n\t\t},\n\t},\n\tcreateOnce(context) {\n\t\tfunction check(fn: ESTree.Function | ESTree.ArrowFunctionExpression) {\n\t\t\tif (fn.generator || !isReusableFunction(fn)) return;\n\t\t\tif (isGenOrPipedGen(returnedExpression(fn))) context.report({ node: fn, messageId: 'noGenWrapper' });\n\t\t}\n\t\treturn {\n\t\t\tArrowFunctionExpression: check,\n\t\t\tFunctionDeclaration: check,\n\t\t\tFunctionExpression: check,\n\t\t};\n\t},\n});\n\nconst fnNameMatches = defineRule({\n\tmeta: {\n\t\ttype: 'suggestion',\n\t\tdocs: {\n\t\t\tdescription: 'Require the `Effect.fn` span name to match the binding it is assigned to',\n\t\t},\n\t\tfixable: 'code',\n\t\tmessages: {\n\t\t\tmismatch: '`Effect.fn(\"{{name}}\")` is assigned to `{{binding}}`. Use \"{{binding}}\" or \"<Service>.{{binding}}\".',\n\t\t},\n\t},\n\tcreateOnce(context) {\n\t\treturn {\n\t\t\tCallExpression(node) {\n\t\t\t\tif (!isNamedFnFactory(node.callee)) return;\n\t\t\t\tconst binding = bindingName(node);\n\t\t\t\tconst nameNode = node.callee.arguments[0];\n\t\t\t\tconst name = staticString(nameNode);\n\t\t\t\tif (!binding || name === undefined) return;\n\t\t\t\tif (name === binding || name.endsWith(`.${binding}`)) return;\n\t\t\t\tcontext.report({\n\t\t\t\t\tnode: nameNode,\n\t\t\t\t\tmessageId: 'mismatch',\n\t\t\t\t\tdata: { name, binding },\n\t\t\t\t\tfix(fixer) {\n\t\t\t\t\t\tconst quote = context.sourceCode.getText(nameNode).at(0) ?? \"'\";\n\t\t\t\t\t\tconst prefix = name.includes('.') ? name.slice(0, name.lastIndexOf('.') + 1) : '';\n\t\t\t\t\t\treturn fixer.replaceText(nameNode, `${quote}${prefix}${binding}${quote}`);\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\t},\n});\n\nconst returnYieldError = defineRule({\n\tmeta: {\n\t\ttype: 'problem',\n\t\tdocs: {\n\t\t\tdescription: 'Require `return yield*` when yielding an error so TypeScript knows execution stops',\n\t\t},\n\t\tfixable: 'code',\n\t\tmessages: {\n\t\t\tmissingReturn: 'Use `return yield* ...` when raising an error so TypeScript knows the generator stops here.',\n\t\t},\n\t},\n\tcreateOnce(context) {\n\t\treturn {\n\t\t\tYieldExpression(node) {\n\t\t\t\tif (!node.delegate || !node.argument || node.parent.type !== 'ExpressionStatement') return;\n\t\t\t\tif (node.argument.type !== 'NewExpression' && !isEffectCall(node.argument, FAIL_METHODS)) return;\n\t\t\t\tcontext.report({\n\t\t\t\t\tnode,\n\t\t\t\t\tmessageId: 'missingReturn',\n\t\t\t\t\tfix: (fixer) => fixer.insertTextBefore(node, 'return '),\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\t},\n});\n\nconst noPipeOnFn = defineRule({\n\tmeta: {\n\t\ttype: 'suggestion',\n\t\tdocs: {\n\t\t\tdescription: 'Disallow `.pipe` on `Effect.fn` / `Effect.fnUntraced`; pass combinators as extra arguments',\n\t\t},\n\t\tmessages: {\n\t\t\tnoPipe:\n\t\t\t\t'Do not use `.pipe` with `Effect.fn`. Pass the combinators as extra arguments: `Effect.fn(\"name\")(function* () {...}, Effect.withSpan(...))`.',\n\t\t},\n\t},\n\tcreateOnce(context) {\n\t\treturn {\n\t\t\tMemberExpression(node) {\n\t\t\t\tif (node.computed || node.property.type !== 'Identifier' || node.property.name !== 'pipe') return;\n\t\t\t\tif (!isEffectFnCall(node.object)) return;\n\t\t\t\tcontext.report({ node: node.property, messageId: 'noPipe' });\n\t\t\t},\n\t\t};\n\t},\n});\n\nconst noThrowInGen = defineRule({\n\tmeta: {\n\t\ttype: 'problem',\n\t\tdocs: {\n\t\t\tdescription: 'Disallow `throw` inside `Effect.gen` / `Effect.fn` generators',\n\t\t},\n\t\tmessages: {\n\t\t\tnoThrow:\n\t\t\t\t'Do not throw inside an Effect generator; a throw becomes a defect. Use `return yield* new SomeError(...)` instead.',\n\t\t},\n\t},\n\tcreateOnce(context) {\n\t\treturn {\n\t\t\tThrowStatement(node) {\n\t\t\t\tlet current: ESTree.Node = node.parent;\n\t\t\t\twhile (\n\t\t\t\t\tcurrent.type !== 'FunctionExpression' &&\n\t\t\t\t\tcurrent.type !== 'FunctionDeclaration' &&\n\t\t\t\t\tcurrent.type !== 'ArrowFunctionExpression' &&\n\t\t\t\t\tcurrent.type !== 'Program'\n\t\t\t\t) {\n\t\t\t\t\tcurrent = current.parent;\n\t\t\t\t}\n\t\t\t\tif (isEffectGeneratorBody(current)) context.report({ node, messageId: 'noThrow' });\n\t\t\t},\n\t\t};\n\t},\n});\n\nconst noRunOutsideEdge = defineRule({\n\tmeta: {\n\t\ttype: 'problem',\n\t\tdocs: {\n\t\t\tdescription: 'Restrict `Effect.run*` to entrypoints, tests and scripts',\n\t\t},\n\t\tschema: [\n\t\t\t{\n\t\t\t\ttype: 'object',\n\t\t\t\tadditionalProperties: false,\n\t\t\t\tproperties: {\n\t\t\t\t\tallow: {\n\t\t\t\t\t\ttype: 'array',\n\t\t\t\t\t\titems: { type: 'string', minLength: 1 },\n\t\t\t\t\t\tuniqueItems: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t\tmessages: {\n\t\t\tnoRun:\n\t\t\t\t'`Effect.{{method}}` belongs at the edge (`NodeRuntime.runMain`, `ManagedRuntime`). Allowed files: {{allow}}.',\n\t\t},\n\t\tdefaultOptions: [{ allow: [...DEFAULT_EDGE_FILES] }],\n\t},\n\tcreateOnce(context) {\n\t\tlet allow = DEFAULT_EDGE_FILES;\n\t\treturn {\n\t\t\tbefore() {\n\t\t\t\tconst options = context.options[0] as { allow?: string[] } | undefined;\n\t\t\t\tallow = options?.allow ?? DEFAULT_EDGE_FILES;\n\t\t\t\treturn !matchesFileGlob(context, allow);\n\t\t\t},\n\t\t\tCallExpression(node) {\n\t\t\t\tif (!isEffectMember(node.callee, RUN_METHODS)) return;\n\t\t\t\tconst method = node.callee.property.type === 'Identifier' ? node.callee.property.name : '';\n\t\t\t\tcontext.report({ node, messageId: 'noRun', data: { method, allow: allow.join(', ') } });\n\t\t\t},\n\t\t};\n\t},\n});\n\nfunction isEffectModule(source: string) {\n\treturn source === 'effect' || source.startsWith('effect/') || source.startsWith('@effect/');\n}\n\nfunction isTypeOnly(\n\tkind: string | undefined,\n\tspecifiers: readonly { type: string; importKind?: string; exportKind?: string }[],\n) {\n\tif (kind === 'type') return true;\n\treturn (\n\t\tspecifiers.length > 0 &&\n\t\tspecifiers.every((specifier) => specifier.importKind === 'type' || specifier.exportKind === 'type')\n\t);\n}\n\nconst typesOnlyImports = defineRule({\n\tmeta: {\n\t\ttype: 'problem',\n\t\tdocs: {\n\t\t\tdescription: 'Allow only type imports from `effect`, `effect/*` and `@effect/*`',\n\t\t},\n\t\tmessages: {\n\t\t\tvalueImport:\n\t\t\t\t'`{{source}}` is a runtime import. This package must not ship the Effect runtime; use `import type` or inline `type` specifiers.',\n\t\t},\n\t},\n\tcreateOnce(context) {\n\t\tfunction check(node: ESTree.Node, source: ESTree.Node | null) {\n\t\t\tconst name = staticString(source ?? undefined);\n\t\t\tif (name !== undefined && isEffectModule(name)) {\n\t\t\t\tcontext.report({ node, messageId: 'valueImport', data: { source: name } });\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tImportDeclaration(node) {\n\t\t\t\tif (!isTypeOnly(node.importKind, node.specifiers)) check(node, node.source);\n\t\t\t},\n\t\t\tExportNamedDeclaration(node) {\n\t\t\t\tif (node.source && !isTypeOnly(node.exportKind, node.specifiers)) check(node, node.source);\n\t\t\t},\n\t\t\tExportAllDeclaration(node) {\n\t\t\t\tif (node.exportKind !== 'type') check(node, node.source);\n\t\t\t},\n\t\t\tImportExpression(node) {\n\t\t\t\tcheck(node, node.source);\n\t\t\t},\n\t\t};\n\t},\n});\n\nexport default definePlugin({\n\tmeta: {\n\t\tname: 'eslint-plugin-mahir-effect',\n\t},\n\trules: {\n\t\t'fn-name-matches': fnNameMatches,\n\t\t'no-gen-wrapper': noGenWrapper,\n\t\t'no-pipe-on-fn': noPipeOnFn,\n\t\t'no-run-outside-edge': noRunOutsideEdge,\n\t\t'no-throw-in-gen': noThrowInGen,\n\t\t'return-yield-error': returnYieldError,\n\t\t'types-only-imports': typesOnlyImports,\n\t},\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"effect.js","names":[],"sources":["../../src/plugins/effect.ts"],"sourcesContent":["import { definePlugin, defineRule } from '@oxlint/plugins';\n\nimport { matchesFileGlob } from '../config.js';\n\nimport type { ESTree } from '@oxlint/plugins';\n\nconst DEFAULT_EDGE_FILES = ['**/main.ts', '**/*.test.ts', '**/scripts/**'];\nconst RUN_METHODS = new Set(['runCallback', 'runFork', 'runPromise', 'runPromiseExit', 'runSync', 'runSyncExit']);\nconst FAIL_METHODS = new Set(['die', 'dieMessage', 'dieSync', 'fail', 'failCause', 'failCauseSync', 'failSync']);\nconst FN_METHODS = new Set(['fn', 'fnUntraced']);\nconst FN_NAMED = new Set(['fn']);\nconst GEN = new Set(['gen']);\nconst GEN_OR_FN = new Set(['gen', ...FN_METHODS]);\nconst DEFAULT_SQL_CLIENTS = ['sql'];\nconst UNSAFE_SQL_METHODS = new Set(['literal', 'unsafe']);\n\nfunction isEffectMember(node: ESTree.Node, methods: Set<string>): node is ESTree.MemberExpression {\n\treturn (\n\t\tnode.type === 'MemberExpression' &&\n\t\t!node.computed &&\n\t\tnode.object.type === 'Identifier' &&\n\t\tnode.object.name === 'Effect' &&\n\t\tnode.property.type === 'Identifier' &&\n\t\tmethods.has(node.property.name)\n\t);\n}\n\nfunction isEffectCall(node: ESTree.Node | null | undefined, methods: Set<string>): node is ESTree.CallExpression {\n\treturn node?.type === 'CallExpression' && isEffectMember(node.callee, methods);\n}\n\nfunction staticString(node: ESTree.Node | undefined) {\n\tif (node?.type === 'Literal' && typeof node.value === 'string') return node.value;\n\tif (node?.type !== 'TemplateLiteral' || node.expressions.length > 0) return undefined;\n\treturn node.quasis[0]?.value.cooked ?? undefined;\n}\n\nfunction isNamedFnFactory(node: ESTree.Node): node is ESTree.CallExpression {\n\treturn isEffectCall(node, FN_NAMED) && staticString(node.arguments[0]) !== undefined;\n}\n\nfunction isEffectGeneratorBody(fn: ESTree.Node) {\n\tif (fn.type !== 'FunctionExpression' || !fn.generator) return false;\n\tconst call = fn.parent;\n\tif (call.type !== 'CallExpression' || !call.arguments.includes(fn)) return false;\n\tif (isEffectMember(call.callee, GEN_OR_FN)) return true;\n\treturn isNamedFnFactory(call.callee);\n}\n\nfunction isEffectFnCall(node: ESTree.Node) {\n\tif (node.type !== 'CallExpression') return false;\n\tif (isNamedFnFactory(node.callee)) return true;\n\treturn isEffectCall(node, FN_METHODS) && node.arguments[0]?.type === 'FunctionExpression';\n}\n\nfunction isGenOrPipedGen(node: ESTree.Node | null | undefined) {\n\tif (node?.type !== 'CallExpression') return false;\n\tconst { callee } = node;\n\tif (\n\t\tcallee.type === 'MemberExpression' &&\n\t\t!callee.computed &&\n\t\tcallee.property.type === 'Identifier' &&\n\t\tcallee.property.name === 'pipe'\n\t) {\n\t\treturn isEffectCall(callee.object, GEN);\n\t}\n\treturn isEffectMember(callee, GEN);\n}\n\nfunction returnedExpression(fn: ESTree.Function | ESTree.ArrowFunctionExpression) {\n\tconst { body } = fn;\n\tif (!body) return undefined;\n\tif (body.type !== 'BlockStatement') return body;\n\tif (body.body.length !== 1) return undefined;\n\tconst [statement] = body.body;\n\treturn statement.type === 'ReturnStatement' ? statement.argument : undefined;\n}\n\nfunction isReusableFunction(fn: ESTree.Function | ESTree.ArrowFunctionExpression) {\n\tif (fn.type === 'FunctionDeclaration') return true;\n\tconst { parent } = fn;\n\tif (parent.type === 'VariableDeclarator') return parent.init === fn;\n\tif (parent.type === 'Property' || parent.type === 'PropertyDefinition') return parent.value === fn;\n\treturn parent.type === 'MethodDefinition' || parent.type === 'ExportDefaultDeclaration';\n}\n\nfunction bindingName(node: ESTree.Node) {\n\tconst { parent } = node;\n\tif (!parent) return undefined;\n\tif (parent.type === 'VariableDeclarator' && parent.init === node && parent.id.type === 'Identifier') {\n\t\treturn parent.id.name;\n\t}\n\tif (\n\t\t(parent.type === 'Property' || parent.type === 'PropertyDefinition') &&\n\t\tparent.value === node &&\n\t\t!parent.computed\n\t) {\n\t\tif (parent.key.type === 'Identifier') return parent.key.name;\n\t\treturn staticString(parent.key);\n\t}\n\treturn undefined;\n}\n\nconst noGenWrapper = defineRule({\n\tmeta: {\n\t\ttype: 'suggestion',\n\t\tdocs: {\n\t\t\tdescription: 'Disallow functions that only wrap and return `Effect.gen`',\n\t\t},\n\t\tmessages: {\n\t\t\tnoGenWrapper:\n\t\t\t\t'Avoid functions that only wrap and return `Effect.gen`. Use `Effect.fn(\"name\")(function* (...) {...})` or `Effect.fnUntraced` instead.',\n\t\t},\n\t},\n\tcreateOnce(context) {\n\t\tfunction check(fn: ESTree.Function | ESTree.ArrowFunctionExpression) {\n\t\t\tif (fn.generator || !isReusableFunction(fn)) return;\n\t\t\tif (isGenOrPipedGen(returnedExpression(fn))) context.report({ node: fn, messageId: 'noGenWrapper' });\n\t\t}\n\t\treturn {\n\t\t\tArrowFunctionExpression: check,\n\t\t\tFunctionDeclaration: check,\n\t\t\tFunctionExpression: check,\n\t\t};\n\t},\n});\n\nconst fnNameMatches = defineRule({\n\tmeta: {\n\t\ttype: 'suggestion',\n\t\tdocs: {\n\t\t\tdescription: 'Require the `Effect.fn` span name to match the binding it is assigned to',\n\t\t},\n\t\tfixable: 'code',\n\t\tmessages: {\n\t\t\tmismatch: '`Effect.fn(\"{{name}}\")` is assigned to `{{binding}}`. Use \"{{binding}}\" or \"<Service>.{{binding}}\".',\n\t\t},\n\t},\n\tcreateOnce(context) {\n\t\treturn {\n\t\t\tCallExpression(node) {\n\t\t\t\tif (!isNamedFnFactory(node.callee)) return;\n\t\t\t\tconst binding = bindingName(node);\n\t\t\t\tconst nameNode = node.callee.arguments[0];\n\t\t\t\tconst name = staticString(nameNode);\n\t\t\t\tif (!binding || name === undefined) return;\n\t\t\t\tif (name === binding || name.endsWith(`.${binding}`)) return;\n\t\t\t\tcontext.report({\n\t\t\t\t\tnode: nameNode,\n\t\t\t\t\tmessageId: 'mismatch',\n\t\t\t\t\tdata: { name, binding },\n\t\t\t\t\tfix(fixer) {\n\t\t\t\t\t\tconst quote = context.sourceCode.getText(nameNode).at(0) ?? \"'\";\n\t\t\t\t\t\tconst prefix = name.includes('.') ? name.slice(0, name.lastIndexOf('.') + 1) : '';\n\t\t\t\t\t\treturn fixer.replaceText(nameNode, `${quote}${prefix}${binding}${quote}`);\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\t},\n});\n\nconst returnYieldError = defineRule({\n\tmeta: {\n\t\ttype: 'problem',\n\t\tdocs: {\n\t\t\tdescription: 'Require `return yield*` when yielding an error so TypeScript knows execution stops',\n\t\t},\n\t\tfixable: 'code',\n\t\tmessages: {\n\t\t\tmissingReturn: 'Use `return yield* ...` when raising an error so TypeScript knows the generator stops here.',\n\t\t},\n\t},\n\tcreateOnce(context) {\n\t\treturn {\n\t\t\tYieldExpression(node) {\n\t\t\t\tif (!node.delegate || !node.argument || node.parent.type !== 'ExpressionStatement') return;\n\t\t\t\tif (node.argument.type !== 'NewExpression' && !isEffectCall(node.argument, FAIL_METHODS)) return;\n\t\t\t\tcontext.report({\n\t\t\t\t\tnode,\n\t\t\t\t\tmessageId: 'missingReturn',\n\t\t\t\t\tfix: (fixer) => fixer.insertTextBefore(node, 'return '),\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\t},\n});\n\nconst noPipeOnFn = defineRule({\n\tmeta: {\n\t\ttype: 'suggestion',\n\t\tdocs: {\n\t\t\tdescription: 'Disallow `.pipe` on `Effect.fn` / `Effect.fnUntraced`; pass combinators as extra arguments',\n\t\t},\n\t\tmessages: {\n\t\t\tnoPipe:\n\t\t\t\t'Do not use `.pipe` with `Effect.fn`. Pass the combinators as extra arguments: `Effect.fn(\"name\")(function* () {...}, Effect.withSpan(...))`.',\n\t\t},\n\t},\n\tcreateOnce(context) {\n\t\treturn {\n\t\t\tMemberExpression(node) {\n\t\t\t\tif (node.computed || node.property.type !== 'Identifier' || node.property.name !== 'pipe') return;\n\t\t\t\tif (!isEffectFnCall(node.object)) return;\n\t\t\t\tcontext.report({ node: node.property, messageId: 'noPipe' });\n\t\t\t},\n\t\t};\n\t},\n});\n\nconst noThrowInGen = defineRule({\n\tmeta: {\n\t\ttype: 'problem',\n\t\tdocs: {\n\t\t\tdescription: 'Disallow `throw` inside `Effect.gen` / `Effect.fn` generators',\n\t\t},\n\t\tmessages: {\n\t\t\tnoThrow:\n\t\t\t\t'Do not throw inside an Effect generator; a throw becomes a defect. Use `return yield* new SomeError(...)` instead.',\n\t\t},\n\t},\n\tcreateOnce(context) {\n\t\treturn {\n\t\t\tThrowStatement(node) {\n\t\t\t\tlet current: ESTree.Node = node.parent;\n\t\t\t\twhile (\n\t\t\t\t\tcurrent.type !== 'FunctionExpression' &&\n\t\t\t\t\tcurrent.type !== 'FunctionDeclaration' &&\n\t\t\t\t\tcurrent.type !== 'ArrowFunctionExpression' &&\n\t\t\t\t\tcurrent.type !== 'Program'\n\t\t\t\t) {\n\t\t\t\t\tcurrent = current.parent;\n\t\t\t\t}\n\t\t\t\tif (isEffectGeneratorBody(current)) context.report({ node, messageId: 'noThrow' });\n\t\t\t},\n\t\t};\n\t},\n});\n\nconst noRunOutsideEdge = defineRule({\n\tmeta: {\n\t\ttype: 'problem',\n\t\tdocs: {\n\t\t\tdescription: 'Restrict `Effect.run*` to entrypoints, tests and scripts',\n\t\t},\n\t\tschema: [\n\t\t\t{\n\t\t\t\ttype: 'object',\n\t\t\t\tadditionalProperties: false,\n\t\t\t\tproperties: {\n\t\t\t\t\tallow: {\n\t\t\t\t\t\ttype: 'array',\n\t\t\t\t\t\titems: { type: 'string', minLength: 1 },\n\t\t\t\t\t\tuniqueItems: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t\tmessages: {\n\t\t\tnoRun:\n\t\t\t\t'`Effect.{{method}}` belongs at the edge (`NodeRuntime.runMain`, `ManagedRuntime`). Allowed files: {{allow}}.',\n\t\t},\n\t\tdefaultOptions: [{ allow: [...DEFAULT_EDGE_FILES] }],\n\t},\n\tcreateOnce(context) {\n\t\tlet allow = DEFAULT_EDGE_FILES;\n\t\treturn {\n\t\t\tbefore() {\n\t\t\t\tconst options = context.options[0] as { allow?: string[] } | undefined;\n\t\t\t\tallow = options?.allow ?? DEFAULT_EDGE_FILES;\n\t\t\t\treturn !matchesFileGlob(context, allow);\n\t\t\t},\n\t\t\tCallExpression(node) {\n\t\t\t\tif (!isEffectMember(node.callee, RUN_METHODS)) return;\n\t\t\t\tconst method = node.callee.property.type === 'Identifier' ? node.callee.property.name : '';\n\t\t\t\tcontext.report({ node, messageId: 'noRun', data: { method, allow: allow.join(', ') } });\n\t\t\t},\n\t\t};\n\t},\n});\n\nfunction sqlClientName(node: ESTree.Node) {\n\tif (node.type === 'Identifier') return node.name;\n\tif (node.type === 'MemberExpression' && !node.computed && node.property.type === 'Identifier') {\n\t\treturn node.property.name;\n\t}\n\treturn undefined;\n}\n\nconst noUnsafeSql = defineRule({\n\tmeta: {\n\t\ttype: 'problem',\n\t\tdocs: {\n\t\t\tdescription: 'Disallow non-constant SQL text in `sql.unsafe` and `sql.literal`',\n\t\t},\n\t\tschema: [\n\t\t\t{\n\t\t\t\ttype: 'object',\n\t\t\t\tadditionalProperties: false,\n\t\t\t\tproperties: {\n\t\t\t\t\tclientNames: {\n\t\t\t\t\t\ttype: 'array',\n\t\t\t\t\t\titems: { type: 'string', minLength: 1 },\n\t\t\t\t\t\tuniqueItems: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t\tmessages: {\n\t\t\tdynamicSql:\n\t\t\t\t'`{{client}}.{{method}}` with non-constant text can lead to SQL injection. Interpolate values in the `sql` tagged template and use `sql(identifier)` or a whitelist for identifiers and ORDER BY.',\n\t\t},\n\t\tdefaultOptions: [{ clientNames: [...DEFAULT_SQL_CLIENTS] }],\n\t},\n\tcreateOnce(context) {\n\t\tlet clients = new Set(DEFAULT_SQL_CLIENTS);\n\t\treturn {\n\t\t\tbefore() {\n\t\t\t\tconst options = context.options[0] as { clientNames?: string[] } | undefined;\n\t\t\t\tclients = new Set(options?.clientNames ?? DEFAULT_SQL_CLIENTS);\n\t\t\t},\n\t\t\tCallExpression(node) {\n\t\t\t\tconst { callee } = node;\n\t\t\t\tif (callee.type !== 'MemberExpression' || callee.computed || callee.property.type !== 'Identifier') return;\n\t\t\t\tconst method = callee.property.name;\n\t\t\t\tif (!UNSAFE_SQL_METHODS.has(method)) return;\n\t\t\t\tconst client = sqlClientName(callee.object);\n\t\t\t\tif (client === undefined || !clients.has(client)) return;\n\t\t\t\tif (node.arguments.length === 0 || staticString(node.arguments[0]) !== undefined) return;\n\t\t\t\tcontext.report({ node: node.arguments[0], messageId: 'dynamicSql', data: { client, method } });\n\t\t\t},\n\t\t};\n\t},\n});\n\nfunction isEffectModule(source: string) {\n\treturn source === 'effect' || source.startsWith('effect/') || source.startsWith('@effect/');\n}\n\nfunction isTypeOnly(\n\tkind: string | undefined,\n\tspecifiers: readonly { type: string; importKind?: string; exportKind?: string }[],\n) {\n\tif (kind === 'type') return true;\n\treturn (\n\t\tspecifiers.length > 0 &&\n\t\tspecifiers.every((specifier) => specifier.importKind === 'type' || specifier.exportKind === 'type')\n\t);\n}\n\nconst typesOnlyImports = defineRule({\n\tmeta: {\n\t\ttype: 'problem',\n\t\tdocs: {\n\t\t\tdescription: 'Allow only type imports from `effect`, `effect/*` and `@effect/*`',\n\t\t},\n\t\tmessages: {\n\t\t\tvalueImport:\n\t\t\t\t'`{{source}}` is a runtime import. This package must not ship the Effect runtime; use `import type` or inline `type` specifiers.',\n\t\t},\n\t},\n\tcreateOnce(context) {\n\t\tfunction check(node: ESTree.Node, source: ESTree.Node | null) {\n\t\t\tconst name = staticString(source ?? undefined);\n\t\t\tif (name !== undefined && isEffectModule(name)) {\n\t\t\t\tcontext.report({ node, messageId: 'valueImport', data: { source: name } });\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tImportDeclaration(node) {\n\t\t\t\tif (!isTypeOnly(node.importKind, node.specifiers)) check(node, node.source);\n\t\t\t},\n\t\t\tExportNamedDeclaration(node) {\n\t\t\t\tif (node.source && !isTypeOnly(node.exportKind, node.specifiers)) check(node, node.source);\n\t\t\t},\n\t\t\tExportAllDeclaration(node) {\n\t\t\t\tif (node.exportKind !== 'type') check(node, node.source);\n\t\t\t},\n\t\t\tImportExpression(node) {\n\t\t\t\tcheck(node, node.source);\n\t\t\t},\n\t\t};\n\t},\n});\n\nexport default definePlugin({\n\tmeta: {\n\t\tname: 'eslint-plugin-mahir-effect',\n\t},\n\trules: {\n\t\t'fn-name-matches': fnNameMatches,\n\t\t'no-gen-wrapper': noGenWrapper,\n\t\t'no-pipe-on-fn': noPipeOnFn,\n\t\t'no-run-outside-edge': noRunOutsideEdge,\n\t\t'no-throw-in-gen': noThrowInGen,\n\t\t'no-unsafe-sql': noUnsafeSql,\n\t\t'return-yield-error': returnYieldError,\n\t\t'types-only-imports': typesOnlyImports,\n\t},\n});\n"],"mappings":"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"}
@@ -1,5 +1,3 @@
1
- //#region src/plugins/i18n.d.ts
2
1
  declare const _default: import("@oxlint/plugins").Plugin;
3
- //#endregion
4
2
  export { _default as default };
5
3
  //# sourceMappingURL=i18n.d.ts.map
@@ -1,6 +1,6 @@
1
1
  import { definePlugin, defineRule } from "@oxlint/plugins";
2
2
 
3
- //#region src/plugins/i18n.ts
3
+ // src/plugins/i18n.ts
4
4
  const staticTArguments = defineRule({
5
5
  meta: {
6
6
  type: "problem",
@@ -50,6 +50,5 @@ var i18n_default = definePlugin({
50
50
  }
51
51
  });
52
52
 
53
- //#endregion
54
53
  export { i18n_default as default };
55
54
  //# sourceMappingURL=i18n.js.map
@@ -1,5 +1,3 @@
1
- //#region src/plugins/native-tailwind.d.ts
2
1
  declare const _default: import("@oxlint/plugins").Plugin;
3
- //#endregion
4
2
  export { _default as default };
5
3
  //# sourceMappingURL=native-tailwind.d.ts.map
@@ -1,6 +1,6 @@
1
1
  import { definePlugin, defineRule } from "@oxlint/plugins";
2
2
 
3
- //#region src/plugins/native-tailwind.ts
3
+ // src/plugins/native-tailwind.ts
4
4
  const FORBIDDEN = /* @__PURE__ */ new Set(["flex-col"]);
5
5
  const classNameRules = defineRule({
6
6
  meta: {
@@ -103,6 +103,5 @@ var native_tailwind_default = definePlugin({
103
103
  rules: { "class-name-rules": classNameRules }
104
104
  });
105
105
 
106
- //#endregion
107
106
  export { native_tailwind_default as default };
108
107
  //# sourceMappingURL=native-tailwind.js.map
@@ -1,5 +1,3 @@
1
- //#region src/plugins/nest.d.ts
2
1
  declare const _default: import("@oxlint/plugins").Plugin;
3
- //#endregion
4
2
  export { _default as default };
5
3
  //# sourceMappingURL=nest.d.ts.map
@@ -1,6 +1,6 @@
1
1
  import { definePlugin, defineRule } from "@oxlint/plugins";
2
2
 
3
- //#region src/plugins/nest.ts
3
+ // src/plugins/nest.ts
4
4
  const DEFAULT_LOCALE = "en-US";
5
5
  function isSortable(node) {
6
6
  return node?.type === "Identifier" || node?.type === "CallExpression";
@@ -57,6 +57,5 @@ var nest_default = definePlugin({
57
57
  rules: { "sort-module-metadata-arrays": sortModuleMetadataArrays }
58
58
  });
59
59
 
60
- //#endregion
61
60
  export { nest_default as default };
62
61
  //# sourceMappingURL=nest.js.map
@@ -1,5 +1,3 @@
1
- //#region src/plugins/react.d.ts
2
1
  declare const _default: import("@oxlint/plugins").Plugin;
3
- //#endregion
4
2
  export { _default as default };
5
3
  //# sourceMappingURL=react.d.ts.map
@@ -1,6 +1,6 @@
1
1
  import { definePlugin, defineRule } from "@oxlint/plugins";
2
2
 
3
- //#region src/plugins/react.ts
3
+ // src/plugins/react.ts
4
4
  const REL_TAGS = /* @__PURE__ */ new Set([
5
5
  "a",
6
6
  "area",
@@ -368,6 +368,5 @@ var react_default = definePlugin({
368
368
  }
369
369
  });
370
370
 
371
- //#endregion
372
371
  export { react_default as default };
373
372
  //# sourceMappingURL=react.js.map
@@ -1,5 +1,3 @@
1
- //#region src/plugins/restricted-syntax.d.ts
2
1
  declare const _default: import("@oxlint/plugins").Plugin;
3
- //#endregion
4
2
  export { _default as default };
5
3
  //# sourceMappingURL=restricted-syntax.d.ts.map
@@ -1,6 +1,6 @@
1
1
  import { definePlugin, defineRule } from "@oxlint/plugins";
2
2
 
3
- //#region src/plugins/restricted-syntax.ts
3
+ // src/plugins/restricted-syntax.ts
4
4
  function restrictionSelector(restriction) {
5
5
  return typeof restriction === "string" ? restriction : restriction.selector;
6
6
  }
@@ -110,6 +110,5 @@ var restricted_syntax_default = definePlugin({
110
110
  rules: { "no-restricted-syntax": noRestrictedSyntax }
111
111
  });
112
112
 
113
- //#endregion
114
113
  export { restricted_syntax_default as default };
115
114
  //# sourceMappingURL=restricted-syntax.js.map
@@ -1,5 +1,3 @@
1
- //#region src/plugins/unistyles.d.ts
2
1
  declare const _default: import("@oxlint/plugins").Plugin;
3
- //#endregion
4
2
  export { _default as default };
5
3
  //# sourceMappingURL=unistyles.d.ts.map
@@ -1,7 +1,7 @@
1
1
  import { matchesFileGlob } from "../config.js";
2
2
  import { definePlugin, defineRule } from "@oxlint/plugins";
3
3
 
4
- //#region src/plugins/unistyles.ts
4
+ // src/plugins/unistyles.ts
5
5
  const UNISTYLES = "react-native-unistyles";
6
6
  const DEFAULT_THEME_FILES = ["**/theme/**", "**/tokens/**"];
7
7
  const COLOR_FUNCTION = /^\s*(?:rgba?|hsla?|hwb|lab|lch|oklab|oklch)\(/i;
@@ -199,6 +199,5 @@ var unistyles_default = definePlugin({
199
199
  }
200
200
  });
201
201
 
202
- //#endregion
203
202
  export { unistyles_default as default };
204
203
  //# sourceMappingURL=unistyles.js.map
package/dist/react.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- //#region src/react.d.ts
2
1
  declare const config: {
3
2
  plugins: ("eslint" | "react" | "unicorn" | "typescript" | "oxc" | "import" | "jsdoc" | "jest" | "vitest" | "jsx-a11y" | "nextjs" | "react-perf" | "promise" | "node" | "vue")[];
4
3
  jsPlugins: import("oxlint").ExternalPluginEntry[];
@@ -13,6 +12,5 @@ declare const config: {
13
12
  };
14
13
  rules: import("oxlint").DummyRuleMap;
15
14
  };
16
- //#endregion
17
15
  export { config as default };
18
16
  //# sourceMappingURL=react.d.ts.map
package/dist/react.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { localPlugin, nativePlugins } from "./config.js";
2
2
  import { defineConfig } from "oxlint";
3
3
 
4
- //#region src/react.ts
4
+ // src/react.ts
5
5
  const config = defineConfig({
6
6
  plugins: nativePlugins,
7
7
  jsPlugins: [localPlugin("mahir-react", "./plugins/react.js")],
@@ -73,6 +73,5 @@ const config = defineConfig({
73
73
  }
74
74
  });
75
75
 
76
- //#endregion
77
76
  export { config as default };
78
77
  //# sourceMappingURL=react.js.map
@@ -1,4 +1,3 @@
1
- //#region src/tailwind.d.ts
2
1
  declare const config: {
3
2
  plugins: ("eslint" | "react" | "unicorn" | "typescript" | "oxc" | "import" | "jsdoc" | "jest" | "vitest" | "jsx-a11y" | "nextjs" | "react-perf" | "promise" | "node" | "vue")[];
4
3
  jsPlugins: import("oxlint").ExternalPluginEntry[];
@@ -13,6 +12,5 @@ declare const config: {
13
12
  'tailwindcss/enforce-canonical': "warn";
14
13
  };
15
14
  };
16
- //#endregion
17
15
  export { config as default };
18
16
  //# sourceMappingURL=tailwind.d.ts.map
package/dist/tailwind.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { nativePlugins, packagePlugin } from "./config.js";
2
2
  import { defineConfig } from "oxlint";
3
3
 
4
- //#region src/tailwind.ts
4
+ // src/tailwind.ts
5
5
  const config = defineConfig({
6
6
  plugins: nativePlugins,
7
7
  jsPlugins: [packagePlugin("tailwindcss", "oxlint-tailwindcss")],
@@ -13,6 +13,5 @@ const config = defineConfig({
13
13
  }
14
14
  });
15
15
 
16
- //#endregion
17
16
  export { config as default };
18
17
  //# sourceMappingURL=tailwind.js.map
package/dist/tsdoc.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- //#region src/tsdoc.d.ts
2
1
  declare const config: {
3
2
  extends: {
4
3
  plugins: ("eslint" | "react" | "unicorn" | "typescript" | "oxc" | "import" | "jsdoc" | "jest" | "vitest" | "jsx-a11y" | "nextjs" | "react-perf" | "promise" | "node" | "vue")[];
@@ -14,6 +13,5 @@ declare const config: {
14
13
  };
15
14
  };
16
15
  };
17
- //#endregion
18
16
  export { config as default };
19
17
  //# sourceMappingURL=tsdoc.d.ts.map
package/dist/tsdoc.js CHANGED
@@ -2,7 +2,7 @@ import { nativePlugins, packagePlugin } from "./config.js";
2
2
  import config$1 from "./jsdoc.js";
3
3
  import { defineConfig } from "oxlint";
4
4
 
5
- //#region src/tsdoc.ts
5
+ // src/tsdoc.ts
6
6
  const config = defineConfig({
7
7
  extends: [config$1],
8
8
  plugins: nativePlugins,
@@ -16,6 +16,5 @@ const config = defineConfig({
16
16
  settings: { jsdoc: { mode: "typescript" } }
17
17
  });
18
18
 
19
- //#endregion
20
19
  export { config as default };
21
20
  //# sourceMappingURL=tsdoc.js.map
@@ -1,9 +1,7 @@
1
- //#region src/typescript.d.ts
2
1
  declare const config: {
3
2
  plugins: ("eslint" | "react" | "unicorn" | "typescript" | "oxc" | "import" | "jsdoc" | "jest" | "vitest" | "jsx-a11y" | "nextjs" | "react-perf" | "promise" | "node" | "vue")[];
4
3
  jsPlugins: import("oxlint").ExternalPluginEntry[];
5
4
  rules: import("oxlint").DummyRuleMap;
6
5
  };
7
- //#endregion
8
6
  export { config as default };
9
7
  //# sourceMappingURL=typescript.d.ts.map
@@ -1,7 +1,7 @@
1
1
  import { nativePlugins, packagePlugin } from "./config.js";
2
2
  import { defineConfig } from "oxlint";
3
3
 
4
- //#region src/typescript.ts
4
+ // src/typescript.ts
5
5
  const config = defineConfig({
6
6
  plugins: nativePlugins,
7
7
  jsPlugins: [packagePlugin("sonarjs", "eslint-plugin-sonarjs")],
@@ -154,6 +154,5 @@ const config = defineConfig({
154
154
  }
155
155
  });
156
156
 
157
- //#endregion
158
157
  export { config as default };
159
158
  //# sourceMappingURL=typescript.js.map
@@ -1,9 +1,7 @@
1
- //#region src/unistyles.d.ts
2
1
  declare const config: {
3
2
  plugins: ("eslint" | "react" | "unicorn" | "typescript" | "oxc" | "import" | "jsdoc" | "jest" | "vitest" | "jsx-a11y" | "nextjs" | "react-perf" | "promise" | "node" | "vue")[];
4
3
  jsPlugins: import("oxlint").ExternalPluginEntry[];
5
4
  rules: import("oxlint").DummyRuleMap;
6
5
  };
7
- //#endregion
8
6
  export { config as default };
9
7
  //# sourceMappingURL=unistyles.d.ts.map
package/dist/unistyles.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { localPlugin, nativePlugins } from "./config.js";
2
2
  import { defineConfig } from "oxlint";
3
3
 
4
- //#region src/unistyles.ts
4
+ // src/unistyles.ts
5
5
  const config = defineConfig({
6
6
  plugins: nativePlugins,
7
7
  jsPlugins: [localPlugin("mahir-unistyles", "./plugins/unistyles.js")],
@@ -13,6 +13,5 @@ const config = defineConfig({
13
13
  }
14
14
  });
15
15
 
16
- //#endregion
17
16
  export { config as default };
18
17
  //# sourceMappingURL=unistyles.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@imranbarbhuiya/oxc-config",
3
- "version": "0.3.1",
3
+ "version": "0.4.0",
4
4
  "description": "Shared Oxlint and Oxfmt configs for JavaScript and TypeScript projects",
5
5
  "keywords": [
6
6
  "config",
@@ -210,31 +210,31 @@
210
210
  },
211
211
  "dependencies": {
212
212
  "@clack/prompts": "^1.8.1",
213
- "@oxlint/plugins": "1.88.0",
213
+ "@oxlint/plugins": "1.89.0",
214
214
  "eslint": "^10.13.0",
215
- "eslint-plugin-jsdoc": "^65.3.11",
215
+ "eslint-plugin-jsdoc": "^65.4.2",
216
216
  "eslint-plugin-n": "^18.5.0",
217
217
  "eslint-plugin-sonarjs": "^4.2.2",
218
218
  "eslint-plugin-tsdoc": "^0.5.4",
219
- "nypm": "^0.6.10",
219
+ "nypm": "^0.6.11",
220
220
  "oxlint-tailwindcss": "^1.16.0"
221
221
  },
222
222
  "devDependencies": {
223
- "@types/bun": "^1.4.3",
223
+ "@types/bun": "^1.4.4",
224
224
  "@types/node": "^26.6.5",
225
- "@typescript-eslint/utils": "^8.71.2",
226
- "effect": "^4.0.5",
227
- "oxfmt": "^0.73.0",
228
- "oxlint": "^1.88.0",
229
- "oxlint-tsgolint": "^7.0.2004",
230
- "tsdown": "^0.23.1",
225
+ "@typescript-eslint/utils": "^8.72.0",
226
+ "effect": "^4.0.6",
227
+ "oxfmt": "^0.74.0",
228
+ "oxlint": "^1.89.0",
229
+ "oxlint-tsgolint": "^7.0.2005",
230
+ "tsdown": "^0.23.2",
231
231
  "typescript": "6.0.3"
232
232
  },
233
233
  "peerDependencies": {
234
- "effect": "^4.0.5",
235
- "oxfmt": ">=0.73.0 <0.74.0",
236
- "oxlint": "^1.88.0",
237
- "oxlint-tsgolint": "^7.0.2004"
234
+ "effect": "^4.0.6",
235
+ "oxfmt": ">=0.74.0 <0.75.0",
236
+ "oxlint": "^1.89.0",
237
+ "oxlint-tsgolint": "^7.0.2005"
238
238
  },
239
239
  "peerDependenciesMeta": {
240
240
  "effect": {