@tractorbeam/eslint-config 0.2.0 → 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.
Files changed (68) hide show
  1. package/README.md +10 -20
  2. package/dist/{base.d.ts → base/index.d.ts} +1 -1
  3. package/dist/base/index.d.ts.map +1 -0
  4. package/dist/{base.js → base/index.js} +1 -1
  5. package/dist/base/index.js.map +1 -0
  6. package/dist/cloudflare-workers/index.d.ts +3 -0
  7. package/dist/cloudflare-workers/index.d.ts.map +1 -0
  8. package/dist/cloudflare-workers/index.js +16 -0
  9. package/dist/cloudflare-workers/index.js.map +1 -0
  10. package/dist/index.d.ts +10 -7
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +10 -7
  13. package/dist/index.js.map +1 -1
  14. package/dist/{node.d.ts → node/index.d.ts} +1 -1
  15. package/dist/node/index.d.ts.map +1 -0
  16. package/dist/{node.js → node/index.js} +1 -1
  17. package/dist/node/index.js.map +1 -0
  18. package/dist/{playwright.d.ts → playwright/index.d.ts} +1 -1
  19. package/dist/playwright/index.d.ts.map +1 -0
  20. package/dist/{playwright.js → playwright/index.js} +1 -1
  21. package/dist/playwright/index.js.map +1 -0
  22. package/dist/{prettier.d.ts → prettier/index.d.ts} +1 -1
  23. package/dist/prettier/index.d.ts.map +1 -0
  24. package/dist/{prettier.js → prettier/index.js} +1 -1
  25. package/dist/prettier/index.js.map +1 -0
  26. package/dist/{react.d.ts → react/index.d.ts} +1 -1
  27. package/dist/react/index.d.ts.map +1 -0
  28. package/dist/{react.js → react/index.js} +1 -1
  29. package/dist/react/index.js.map +1 -0
  30. package/dist/{tanstack-router.d.ts → tanstack-router/index.d.ts} +1 -1
  31. package/dist/tanstack-router/index.d.ts.map +1 -0
  32. package/dist/{tanstack-router.js → tanstack-router/index.js} +1 -1
  33. package/dist/tanstack-router/index.js.map +1 -0
  34. package/dist/{typescript.d.ts → typescript/index.d.ts} +1 -1
  35. package/dist/typescript/index.d.ts.map +1 -0
  36. package/dist/{typescript.js → typescript/index.js} +1 -1
  37. package/dist/typescript/index.js.map +1 -0
  38. package/dist/ui/index.d.ts +3 -0
  39. package/dist/ui/index.d.ts.map +1 -0
  40. package/dist/ui/index.js +22 -0
  41. package/dist/ui/index.js.map +1 -0
  42. package/dist/ui/rules/no-button-height-class.d.ts +3 -0
  43. package/dist/ui/rules/no-button-height-class.d.ts.map +1 -0
  44. package/dist/ui/rules/no-button-height-class.js +103 -0
  45. package/dist/ui/rules/no-button-height-class.js.map +1 -0
  46. package/dist/ui/rules/no-icon-class-in-button.d.ts +3 -0
  47. package/dist/ui/rules/no-icon-class-in-button.d.ts.map +1 -0
  48. package/dist/ui/rules/no-icon-class-in-button.js +161 -0
  49. package/dist/ui/rules/no-icon-class-in-button.js.map +1 -0
  50. package/dist/zod/index.d.ts +3 -0
  51. package/dist/zod/index.d.ts.map +1 -0
  52. package/dist/zod/index.js +6 -0
  53. package/dist/zod/index.js.map +1 -0
  54. package/package.json +16 -3
  55. package/dist/base.d.ts.map +0 -1
  56. package/dist/base.js.map +0 -1
  57. package/dist/node.d.ts.map +0 -1
  58. package/dist/node.js.map +0 -1
  59. package/dist/playwright.d.ts.map +0 -1
  60. package/dist/playwright.js.map +0 -1
  61. package/dist/prettier.d.ts.map +0 -1
  62. package/dist/prettier.js.map +0 -1
  63. package/dist/react.d.ts.map +0 -1
  64. package/dist/react.js.map +0 -1
  65. package/dist/tanstack-router.d.ts.map +0 -1
  66. package/dist/tanstack-router.js.map +0 -1
  67. package/dist/typescript.d.ts.map +0 -1
  68. package/dist/typescript.js.map +0 -1
package/README.md CHANGED
@@ -24,30 +24,20 @@ import { defineConfig } from "eslint/config";
24
24
 
25
25
  import { base, react, typescript } from "@tractorbeam/eslint-config";
26
26
 
27
- export default defineConfig([
28
- base,
29
- {
30
- extends: [typescript],
31
- languageOptions: {
32
- parserOptions: {
33
- tsconfigRootDir: import.meta.dirname,
34
- },
35
- },
36
- },
37
- react,
38
- ]);
27
+ export default defineConfig([base, typescript, react]);
39
28
  ```
40
29
 
41
30
  ## Available Configs
42
31
 
43
- | Config | Description | File Patterns |
44
- | ---------------- | ---------------------------------------- | ------------------------------- |
45
- | `base` | ESLint recommended rules | All files |
46
- | `typescript` | TypeScript, unicorn, regexp, import-lite | `**/*.ts`, `**/*.tsx` |
47
- | `react` | React, hooks, a11y, react-compiler | `**/*.tsx`, `**/*.jsx` |
48
- | `tanstackRouter` | TanStack Router plugin | `**/*.tsx`, `**/*.jsx` |
49
- | `node` | Node.js globals | All files |
50
- | `playwright` | Playwright testing rules | No default (use with `extends`) |
32
+ | Config | Description | File Patterns |
33
+ | ------------------- | ---------------------------------------- | ------------------------------- |
34
+ | `base` | ESLint recommended rules | All files |
35
+ | `typescript` | TypeScript, unicorn, regexp, import-lite | `**/*.ts`, `**/*.tsx` |
36
+ | `react` | React, hooks, a11y, react-compiler | `**/*.tsx`, `**/*.jsx` |
37
+ | `tanstackRouter` | TanStack Router plugin | `**/*.tsx`, `**/*.jsx` |
38
+ | `node` | Node.js globals | All files |
39
+ | `cloudflareWorkers` | Cloudflare Workers globals | All files |
40
+ | `playwright` | Playwright testing rules | No default (use with `extends`) |
51
41
 
52
42
  ## Customization
53
43
 
@@ -1,3 +1,3 @@
1
1
  import type { Linter } from "eslint";
2
2
  export declare const base: Linter.Config[];
3
- //# sourceMappingURL=base.d.ts.map
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/base/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIrC,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,EAQ9B,CAAC"}
@@ -10,4 +10,4 @@ export const base = defineConfig([
10
10
  },
11
11
  },
12
12
  ]);
13
- //# sourceMappingURL=base.js.map
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/base/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,YAAY,CAAC;AAEhC,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,CAAC,MAAM,IAAI,GAAoB,YAAY,CAAC;IAChD,MAAM,CAAC,OAAO,CAAC,WAAW;IAC1B,mBAAmB,CAAC,kBAAkB,CAAC;IACvC;QACE,KAAK,EAAE;YACL,mBAAmB,EAAE,OAAO;SAC7B;KACF;CACF,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Linter } from "eslint";
2
+ export declare const cloudflareWorkers: Linter.Config[];
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cloudflare-workers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIrC,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAY3C,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { defineConfig } from "eslint/config";
2
+ import globals from "globals";
3
+ export const cloudflareWorkers = defineConfig([
4
+ {
5
+ languageOptions: {
6
+ globals: {
7
+ ...globals.serviceworker,
8
+ ...globals.worker,
9
+ },
10
+ },
11
+ rules: {
12
+ "no-console": "off",
13
+ },
14
+ },
15
+ ]);
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cloudflare-workers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,MAAM,CAAC,MAAM,iBAAiB,GAAoB,YAAY,CAAC;IAC7D;QACE,eAAe,EAAE;YACf,OAAO,EAAE;gBACP,GAAG,OAAO,CAAC,aAAa;gBACxB,GAAG,OAAO,CAAC,MAAM;aAClB;SACF;QACD,KAAK,EAAE;YACL,YAAY,EAAE,KAAK;SACpB;KACF;CACF,CAAC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,11 @@
1
- export { base } from "./base.js";
2
- export { typescript } from "./typescript.js";
3
- export { react } from "./react.js";
4
- export { tanstackRouter } from "./tanstack-router.js";
5
- export { node } from "./node.js";
6
- export { playwright } from "./playwright.js";
7
- export { prettier } from "./prettier.js";
1
+ export { base } from "./base/index.js";
2
+ export { typescript } from "./typescript/index.js";
3
+ export { react } from "./react/index.js";
4
+ export { tanstackRouter } from "./tanstack-router/index.js";
5
+ export { node } from "./node/index.js";
6
+ export { cloudflareWorkers } from "./cloudflare-workers/index.js";
7
+ export { playwright } from "./playwright/index.js";
8
+ export { prettier } from "./prettier/index.js";
9
+ export { ui } from "./ui/index.js";
10
+ export { zod } from "./zod/index.js";
8
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AACnC,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -1,8 +1,11 @@
1
- export { base } from "./base.js";
2
- export { typescript } from "./typescript.js";
3
- export { react } from "./react.js";
4
- export { tanstackRouter } from "./tanstack-router.js";
5
- export { node } from "./node.js";
6
- export { playwright } from "./playwright.js";
7
- export { prettier } from "./prettier.js";
1
+ export { base } from "./base/index.js";
2
+ export { typescript } from "./typescript/index.js";
3
+ export { react } from "./react/index.js";
4
+ export { tanstackRouter } from "./tanstack-router/index.js";
5
+ export { node } from "./node/index.js";
6
+ export { cloudflareWorkers } from "./cloudflare-workers/index.js";
7
+ export { playwright } from "./playwright/index.js";
8
+ export { prettier } from "./prettier/index.js";
9
+ export { ui } from "./ui/index.js";
10
+ export { zod } from "./zod/index.js";
8
11
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AACnC,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC"}
@@ -1,3 +1,3 @@
1
1
  import type { Linter } from "eslint";
2
2
  export declare const node: Linter.Config[];
3
- //# sourceMappingURL=node.d.ts.map
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIrC,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,EAS9B,CAAC"}
@@ -10,4 +10,4 @@ export const node = defineConfig([
10
10
  },
11
11
  },
12
12
  ]);
13
- //# sourceMappingURL=node.js.map
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,MAAM,CAAC,MAAM,IAAI,GAAoB,YAAY,CAAC;IAChD;QACE,eAAe,EAAE;YACf,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE;SAC7B;QACD,KAAK,EAAE;YACL,YAAY,EAAE,KAAK;SACpB;KACF;CACF,CAAC,CAAC"}
@@ -1,3 +1,3 @@
1
1
  import type { Linter } from "eslint";
2
2
  export declare const playwright: Linter.Config[];
3
- //# sourceMappingURL=playwright.d.ts.map
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/playwright/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIrC,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAEpC,CAAC"}
@@ -3,4 +3,4 @@ import { defineConfig } from "eslint/config";
3
3
  export const playwright = defineConfig([
4
4
  pluginPlaywright.configs["flat/recommended"],
5
5
  ]);
6
- //# sourceMappingURL=playwright.js.map
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/playwright/index.ts"],"names":[],"mappings":"AACA,OAAO,gBAAgB,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,CAAC,MAAM,UAAU,GAAoB,YAAY,CAAC;IACtD,gBAAgB,CAAC,OAAO,CAAC,kBAAkB,CAAC;CAC7C,CAAC,CAAC"}
@@ -1,3 +1,3 @@
1
1
  import type { Linter } from "eslint";
2
2
  export declare const prettier: Linter.Config[];
3
- //# sourceMappingURL=prettier.d.ts.map
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prettier/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGrC,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAqB,CAAC"}
@@ -1,3 +1,3 @@
1
1
  import prettierConfig from "eslint-config-prettier";
2
2
  export const prettier = [prettierConfig];
3
- //# sourceMappingURL=prettier.js.map
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prettier/index.ts"],"names":[],"mappings":"AACA,OAAO,cAAc,MAAM,wBAAwB,CAAC;AAEpD,MAAM,CAAC,MAAM,QAAQ,GAAoB,CAAC,cAAc,CAAC,CAAC"}
@@ -1,3 +1,3 @@
1
1
  import type { Linter } from "eslint";
2
2
  export declare const react: Linter.Config[];
3
- //# sourceMappingURL=react.d.ts.map
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;AAS7C,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,MAAM,EA4B/B,CAAC"}
@@ -34,4 +34,4 @@ export const react = defineConfig([
34
34
  },
35
35
  },
36
36
  ]);
37
- //# sourceMappingURL=react.js.map
37
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AACA,OAAO,aAAa,MAAM,wBAAwB,CAAC;AACnD,OAAO,WAAW,MAAM,qBAAqB,CAAC;AAC9C,OAAO,mBAAmB,MAAM,8BAA8B,CAAC;AAC/D,OAAO,gBAAgB,MAAM,2BAA2B,CAAC;AACzD,OAAO,kBAAkB,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,MAAM,CAAC,MAAM,KAAK,GAAoB,YAAY,CAAC;IACjD;QACE,KAAK,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;QAC/B,OAAO,EAAE;YACP,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW;YACpC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC;YACvC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW;YACzC,aAAa,CAAC,WAAW,CAAC,WAAW;YACrC,mBAAmB,CAAC,OAAO,CAAC,WAAW;SACxC;QACD,eAAe,EAAE;YACf,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE;SAChC;QACD,OAAO,EAAE;YACP,aAAa,EAAE,gBAA4C;YAC3D,eAAe,EAAE,kBAAkB;SACpC;QACD,KAAK,EAAE;YACL,6BAA6B,EAAE,KAAK;YACpC,sCAAsC,EAAE,MAAM;YAC9C,wBAAwB,EAAE,KAAK;YAC/B,0BAA0B,EAAE,KAAK;YACjC,6BAA6B,EAAE,KAAK;SACrC;QACD,QAAQ,EAAE;YACR,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;SAC7B;KACF;CACF,CAAC,CAAC"}
@@ -1,3 +1,3 @@
1
1
  import type { Linter } from "eslint";
2
2
  export declare const tanstackRouter: Linter.Config[];
3
- //# sourceMappingURL=tanstack-router.d.ts.map
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tanstack-router/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGrC,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAExC,CAAC"}
@@ -3,4 +3,4 @@ import { defineConfig } from "eslint/config";
3
3
  export const tanstackRouter = defineConfig([
4
4
  pluginTanStackRouter.configs["flat/recommended"],
5
5
  ]);
6
- //# sourceMappingURL=tanstack-router.js.map
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tanstack-router/index.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,MAAM,gCAAgC,CAAC;AAElE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,CAAC,MAAM,cAAc,GAAoB,YAAY,CAAC;IAC1D,oBAAoB,CAAC,OAAO,CAAC,kBAAkB,CAAC;CACjD,CAAC,CAAC"}
@@ -1,3 +1,3 @@
1
1
  import type { Linter } from "eslint";
2
2
  export declare const typescript: Linter.Config[];
3
- //# sourceMappingURL=typescript.d.ts.map
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/typescript/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAOrC,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EA0DpC,CAAC"}
@@ -59,4 +59,4 @@ export const typescript = defineConfig([
59
59
  },
60
60
  },
61
61
  ]);
62
- //# sourceMappingURL=typescript.js.map
62
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/typescript/index.ts"],"names":[],"mappings":"AACA,OAAO,gBAAgB,MAAM,2BAA2B,CAAC;AACzD,OAAO,YAAY,MAAM,sBAAsB,CAAC;AAChD,OAAO,aAAa,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,QAAQ,MAAM,mBAAmB,CAAC;AAEzC,MAAM,CAAC,MAAM,UAAU,GAAoB,YAAY,CAAC;IACtD;QACE,KAAK,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;QAC9B,OAAO,EAAE;YACP,QAAQ,CAAC,OAAO,CAAC,iBAAiB;YAClC,QAAQ,CAAC,OAAO,CAAC,oBAAoB;YACrC,aAAa,CAAC,OAAO,CAAC,WAAW;YACjC,YAAY,CAAC,OAAO,CAAC,kBAAkB,CAAC;YACxC,sEAAsE;YACtE,gBAAgB,CAAC,OAAO,CAAC,WAAW;SACrC;QACD,eAAe,EAAE;YACf,aAAa,EAAE;gBACb,cAAc,EAAE,IAAI;aACrB;SACF;QACD,KAAK,EAAE;YACL,yCAAyC,EAAE,KAAK;YAChD,kDAAkD,EAAE,KAAK;YAEzD,mCAAmC,EAAE,MAAM;YAC3C,yCAAyC,EAAE,MAAM;YACjD,oCAAoC,EAAE,MAAM;YAE5C,4CAA4C,EAAE,OAAO;YACrD,qCAAqC,EAAE;gBACrC,OAAO;gBACP;oBACE,KAAK,EAAE;wBACL;4BACE,IAAI,EAAE,SAAS;4BACf,OAAO,EAAE,uBAAuB;4BAChC,IAAI,EAAE,UAAU;yBACjB;wBACD;4BACE,IAAI,EAAE,SAAS;4BACf,OAAO,EAAE,uBAAuB;4BAChC,IAAI,EAAE,eAAe;yBACtB;qBACF;iBACF;aACF;YACD,mCAAmC,EAAE;gBACnC,OAAO;gBACP;oBACE,iBAAiB,EAAE,IAAI;oBACvB,iBAAiB,EAAE,IAAI;oBACvB,8BAA8B,EAAE,IAAI;iBACrC;aACF;YAED,2BAA2B,EAAE,KAAK;YAClC,iBAAiB,EAAE,KAAK;YACxB,+BAA+B,EAAE,KAAK;YACtC,mCAAmC,EAAE,KAAK;YAC1C,uBAAuB,EAAE,KAAK;SAC/B;KACF;CACF,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Linter } from "eslint";
2
+ export declare const ui: Linter.Config[];
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAQ,MAAM,QAAQ,CAAC;AAM3C,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,EAmB5B,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { defineConfig } from "eslint/config";
2
+ import { noButtonHeightClass } from "./rules/no-button-height-class.js";
3
+ import { noIconClassInButton } from "./rules/no-icon-class-in-button.js";
4
+ export const ui = defineConfig([
5
+ {
6
+ files: ["**/*.tsx", "**/*.jsx"],
7
+ plugins: {
8
+ ui: {
9
+ rules: {
10
+ // Cast required: @typescript-eslint/utils RuleModule has stricter types than ESLint's Rule.RuleModule
11
+ "no-button-height-class": noButtonHeightClass,
12
+ "no-icon-class-in-button": noIconClassInButton,
13
+ },
14
+ },
15
+ },
16
+ rules: {
17
+ "ui/no-button-height-class": "warn",
18
+ "ui/no-icon-class-in-button": "warn",
19
+ },
20
+ },
21
+ ]);
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAEzE,MAAM,CAAC,MAAM,EAAE,GAAoB,YAAY,CAAC;IAC9C;QACE,KAAK,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;QAC/B,OAAO,EAAE;YACP,EAAE,EAAE;gBACF,KAAK,EAAE;oBACL,sGAAsG;oBACtG,wBAAwB,EACtB,mBAAiD;oBACnD,yBAAyB,EACvB,mBAAiD;iBACpD;aACF;SACF;QACD,KAAK,EAAE;YACL,2BAA2B,EAAE,MAAM;YACnC,4BAA4B,EAAE,MAAM;SACrC;KACF;CACF,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ export declare const noButtonHeightClass: ESLintUtils.RuleModule<"preferSizeProp", [], unknown, ESLintUtils.RuleListener>;
3
+ //# sourceMappingURL=no-button-height-class.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-button-height-class.d.ts","sourceRoot":"","sources":["../../../src/ui/rules/no-button-height-class.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EAEZ,MAAM,0BAA0B,CAAC;AAoDlC,eAAO,MAAM,mBAAmB,iFAkF9B,CAAC"}
@@ -0,0 +1,103 @@
1
+ import { AST_NODE_TYPES, ESLintUtils, } from "@typescript-eslint/utils";
2
+ const createRule = ESLintUtils.RuleCreator.withoutDocs;
3
+ /**
4
+ * Patterns for Tailwind sizing classes that shouldn't be used on Button components.
5
+ * These match numeric values, arbitrary values, and fractions.
6
+ *
7
+ * Allowed exceptions:
8
+ * - w-full, h-full, size-full, min-w-full, max-w-full, min-h-full, max-h-full
9
+ * - min-w-0, min-h-0 (reset utilities)
10
+ * - max-w-none, max-h-none (remove constraints)
11
+ */
12
+ // Base pattern for values: numeric (40), arbitrary ([100px]), fractions (1/2)
13
+ const VALUE_PATTERN = "(\\d+|\\[.+?\\]|\\d+\\/\\d+)";
14
+ // h-* classes (except h-full)
15
+ const HEIGHT_PATTERN = new RegExp(`\\bh-(?!full\\b)${VALUE_PATTERN}`);
16
+ // w-* classes (except w-full)
17
+ const WIDTH_PATTERN = new RegExp(`\\bw-(?!full\\b)${VALUE_PATTERN}`);
18
+ // size-* classes (except size-full)
19
+ const SIZE_PATTERN = new RegExp(`\\bsize-(?!full\\b)${VALUE_PATTERN}`);
20
+ // min-h-* classes (except min-h-full, min-h-0)
21
+ const MIN_HEIGHT_PATTERN = new RegExp(`\\bmin-h-(?!full\\b|0\\b)${VALUE_PATTERN}`);
22
+ // max-h-* classes (except max-h-full, max-h-none)
23
+ const MAX_HEIGHT_PATTERN = new RegExp(`\\bmax-h-(?!full\\b|none\\b)${VALUE_PATTERN}`);
24
+ // min-w-* classes (except min-w-full, min-w-0)
25
+ const MIN_WIDTH_PATTERN = new RegExp(`\\bmin-w-(?!full\\b|0\\b)${VALUE_PATTERN}`);
26
+ // max-w-* classes (except max-w-full, max-w-none)
27
+ const MAX_WIDTH_PATTERN = new RegExp(`\\bmax-w-(?!full\\b|none\\b)${VALUE_PATTERN}`);
28
+ const PATTERNS = [
29
+ HEIGHT_PATTERN,
30
+ WIDTH_PATTERN,
31
+ SIZE_PATTERN,
32
+ MIN_HEIGHT_PATTERN,
33
+ MAX_HEIGHT_PATTERN,
34
+ MIN_WIDTH_PATTERN,
35
+ MAX_WIDTH_PATTERN,
36
+ ];
37
+ export const noButtonHeightClass = createRule({
38
+ meta: {
39
+ type: "suggestion",
40
+ docs: {
41
+ description: "Prefer size prop over sizing classes on Button components",
42
+ },
43
+ messages: {
44
+ preferSizeProp: "Avoid using sizing classes (h-*, w-*, size-*, min-*, max-*) on <Button>. Use the size prop instead.",
45
+ },
46
+ schema: [],
47
+ },
48
+ defaultOptions: [],
49
+ create(context) {
50
+ const hasDisallowedSizeClass = (classString) => {
51
+ return PATTERNS.some((pattern) => pattern.test(classString));
52
+ };
53
+ return {
54
+ JSXOpeningElement(node) {
55
+ // Check if element is <Button>
56
+ if (node.name.type !== AST_NODE_TYPES.JSXIdentifier ||
57
+ node.name.name !== "Button") {
58
+ return;
59
+ }
60
+ // Find className attribute
61
+ const classNameAttr = node.attributes.find((attr) => attr.type === AST_NODE_TYPES.JSXAttribute &&
62
+ attr.name.type === AST_NODE_TYPES.JSXIdentifier &&
63
+ attr.name.name === "className");
64
+ if (!classNameAttr) {
65
+ return;
66
+ }
67
+ const reportViolation = () => {
68
+ context.report({
69
+ node,
70
+ messageId: "preferSizeProp",
71
+ });
72
+ };
73
+ // Check for sizing patterns in string literal or template literal
74
+ const value = classNameAttr.value;
75
+ if (value?.type === AST_NODE_TYPES.Literal &&
76
+ typeof value.value === "string") {
77
+ if (hasDisallowedSizeClass(value.value)) {
78
+ reportViolation();
79
+ }
80
+ }
81
+ // Handle JSX expressions like className={...} or className={`...`}
82
+ if (value?.type === AST_NODE_TYPES.JSXExpressionContainer) {
83
+ const expr = value.expression;
84
+ if (expr.type === AST_NODE_TYPES.Literal &&
85
+ typeof expr.value === "string") {
86
+ if (hasDisallowedSizeClass(expr.value)) {
87
+ reportViolation();
88
+ }
89
+ }
90
+ if (expr.type === AST_NODE_TYPES.TemplateLiteral) {
91
+ for (const quasi of expr.quasis) {
92
+ if (hasDisallowedSizeClass(quasi.value.raw)) {
93
+ reportViolation();
94
+ break;
95
+ }
96
+ }
97
+ }
98
+ }
99
+ },
100
+ };
101
+ },
102
+ });
103
+ //# sourceMappingURL=no-button-height-class.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-button-height-class.js","sourceRoot":"","sources":["../../../src/ui/rules/no-button-height-class.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ export declare const noIconClassInButton: ESLintUtils.RuleModule<"noClassName", [], unknown, ESLintUtils.RuleListener>;
3
+ //# sourceMappingURL=no-icon-class-in-button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-icon-class-in-button.d.ts","sourceRoot":"","sources":["../../../src/ui/rules/no-icon-class-in-button.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EAEZ,MAAM,0BAA0B,CAAC;AAmJlC,eAAO,MAAM,mBAAmB,8EAuD9B,CAAC"}
@@ -0,0 +1,161 @@
1
+ import { AST_NODE_TYPES, ESLintUtils, } from "@typescript-eslint/utils";
2
+ import * as ts from "typescript";
3
+ const createRule = ESLintUtils.RuleCreator.withoutDocs;
4
+ /**
5
+ * Checks if a type is or extends LucideIcon from lucide-react.
6
+ * Returns true if the type's name contains "LucideIcon" or "LucideProps",
7
+ * or if any base type does.
8
+ */
9
+ function isLucideIconType(type, checker) {
10
+ // Check the type's symbol name
11
+ const typeName = checker.typeToString(type);
12
+ if (typeName.includes("LucideIcon") ||
13
+ typeName.includes("LucideProps") ||
14
+ typeName.includes("ForwardRefExoticComponent")) {
15
+ // Check if it's from lucide-react by examining the full type string
16
+ const fullType = checker.typeToString(type, undefined, ts.TypeFormatFlags.NoTruncation);
17
+ if (fullType.includes("lucide-react") || fullType.includes("Lucide")) {
18
+ return true;
19
+ }
20
+ }
21
+ // Check call signatures for function components
22
+ const callSignatures = type.getCallSignatures();
23
+ for (const sig of callSignatures) {
24
+ const returnType = checker.getReturnTypeOfSignature(sig);
25
+ const returnTypeName = checker.typeToString(returnType);
26
+ // React elements from icon components
27
+ if (returnTypeName.includes("Element") ||
28
+ returnTypeName.includes("ReactNode")) {
29
+ // Check parameters for SVGProps or LucideProps
30
+ for (const param of sig.parameters) {
31
+ const paramType = checker.getTypeOfSymbol(param);
32
+ const paramTypeName = checker.typeToString(paramType);
33
+ if (paramTypeName.includes("LucideProps") ||
34
+ paramTypeName.includes("SVGProps")) {
35
+ return true;
36
+ }
37
+ }
38
+ }
39
+ }
40
+ return false;
41
+ }
42
+ /**
43
+ * Checks if a JSX element name matches Icon patterns by name:
44
+ * - Exactly "Icon"
45
+ * - Ends with "Icon" (e.g., SearchIcon, ChevronDownIcon)
46
+ */
47
+ function isIconComponentByName(node) {
48
+ if (node.name.type === AST_NODE_TYPES.JSXIdentifier) {
49
+ const name = node.name.name;
50
+ return name === "Icon" || name.endsWith("Icon");
51
+ }
52
+ // Handle namespaced components like Icons.Search
53
+ if (node.name.type === AST_NODE_TYPES.JSXMemberExpression) {
54
+ const { object, property } = node.name;
55
+ // object can be JSXIdentifier or JSXMemberExpression (nested)
56
+ // property is always JSXIdentifier
57
+ if (object.type === AST_NODE_TYPES.JSXIdentifier) {
58
+ // Match Icons.* or *.Icon patterns
59
+ return (object.name === "Icons" ||
60
+ object.name === "Icon" ||
61
+ property.name === "Icon" ||
62
+ property.name.endsWith("Icon"));
63
+ }
64
+ }
65
+ return false;
66
+ }
67
+ /**
68
+ * Checks if a JSX element is a LucideIcon by type.
69
+ * Returns undefined if type checking is not available.
70
+ */
71
+ function isIconComponentByType(node, context) {
72
+ // Try to get parser services with type info
73
+ const services = ESLintUtils.getParserServices(context, true);
74
+ // Check if type info is available
75
+ if (!services.program) {
76
+ return undefined;
77
+ }
78
+ const checker = services.program.getTypeChecker();
79
+ // Get the JSX element name node to check its type
80
+ const nameNode = node.name;
81
+ if (nameNode.type === AST_NODE_TYPES.JSXIdentifier) {
82
+ try {
83
+ const type = services.getTypeAtLocation(nameNode);
84
+ return isLucideIconType(type, checker);
85
+ }
86
+ catch {
87
+ // Type info not available for this node
88
+ return undefined;
89
+ }
90
+ }
91
+ if (nameNode.type === AST_NODE_TYPES.JSXMemberExpression) {
92
+ try {
93
+ const type = services.getTypeAtLocation(nameNode);
94
+ return isLucideIconType(type, checker);
95
+ }
96
+ catch {
97
+ return undefined;
98
+ }
99
+ }
100
+ return undefined;
101
+ }
102
+ /**
103
+ * Checks if a node is inside a Button component by walking up the AST.
104
+ */
105
+ function isInsideButton(node, context) {
106
+ const ancestors = context.sourceCode.getAncestors(node);
107
+ for (const ancestor of ancestors) {
108
+ if (ancestor.type === AST_NODE_TYPES.JSXElement &&
109
+ ancestor.openingElement.name.type === AST_NODE_TYPES.JSXIdentifier &&
110
+ ancestor.openingElement.name.name === "Button") {
111
+ return true;
112
+ }
113
+ }
114
+ return false;
115
+ }
116
+ export const noIconClassInButton = createRule({
117
+ meta: {
118
+ type: "suggestion",
119
+ docs: {
120
+ description: "Disallow className on Icon components nested inside Button (uses type info when available)",
121
+ },
122
+ messages: {
123
+ noClassName: "Avoid using className on icons inside <Button>. The Button component handles icon sizing automatically.",
124
+ },
125
+ schema: [],
126
+ },
127
+ defaultOptions: [],
128
+ create(context) {
129
+ return {
130
+ JSXOpeningElement(node) {
131
+ // First, try type-based detection (more accurate)
132
+ const isIconByType = isIconComponentByType(node, context);
133
+ // If type checking says it's not an icon, trust it
134
+ if (isIconByType === false) {
135
+ return;
136
+ }
137
+ // If type checking says it's an icon, or type checking isn't available,
138
+ // fall back to name-based detection
139
+ const isIcon = isIconByType === true || isIconComponentByName(node);
140
+ if (!isIcon) {
141
+ return;
142
+ }
143
+ // Check if it's inside a Button
144
+ if (!isInsideButton(node, context)) {
145
+ return;
146
+ }
147
+ // Check if it has a className attribute
148
+ const classNameAttr = node.attributes.find((attr) => attr.type === AST_NODE_TYPES.JSXAttribute &&
149
+ attr.name.type === AST_NODE_TYPES.JSXIdentifier &&
150
+ attr.name.name === "className");
151
+ if (classNameAttr) {
152
+ context.report({
153
+ node: classNameAttr,
154
+ messageId: "noClassName",
155
+ });
156
+ }
157
+ },
158
+ };
159
+ },
160
+ });
161
+ //# sourceMappingURL=no-icon-class-in-button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-icon-class-in-button.js","sourceRoot":"","sources":["../../../src/ui/rules/no-icon-class-in-button.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Linter } from "eslint";
2
+ export declare const zod: Linter.Config[];
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/zod/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIrC,eAAO,MAAM,GAAG,EAAE,MAAM,CAAC,MAAM,EAE7B,CAAC"}
@@ -0,0 +1,6 @@
1
+ import eslintPluginZod from "eslint-plugin-zod";
2
+ import { defineConfig } from "eslint/config";
3
+ export const zod = defineConfig([
4
+ eslintPluginZod.configs.recommended,
5
+ ]);
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/zod/index.ts"],"names":[],"mappings":"AACA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,CAAC,MAAM,GAAG,GAAoB,YAAY,CAAC;IAC/C,eAAe,CAAC,OAAO,CAAC,WAAW;CACpC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tractorbeam/eslint-config",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Shared ESLint configuration for Tractorbeam projects",
5
5
  "keywords": [
6
6
  "tractorbeam",
@@ -50,6 +50,10 @@
50
50
  "types": "./dist/node.d.ts",
51
51
  "default": "./dist/node.js"
52
52
  },
53
+ "./cloudflare-workers": {
54
+ "types": "./dist/cloudflare-workers.d.ts",
55
+ "default": "./dist/cloudflare-workers.js"
56
+ },
53
57
  "./playwright": {
54
58
  "types": "./dist/playwright.d.ts",
55
59
  "default": "./dist/playwright.js"
@@ -57,6 +61,14 @@
57
61
  "./prettier": {
58
62
  "types": "./dist/prettier.d.ts",
59
63
  "default": "./dist/prettier.js"
64
+ },
65
+ "./ui": {
66
+ "types": "./dist/ui.d.ts",
67
+ "default": "./dist/ui.js"
68
+ },
69
+ "./zod": {
70
+ "types": "./dist/zod.d.ts",
71
+ "default": "./dist/zod.js"
60
72
  }
61
73
  },
62
74
  "files": [
@@ -77,6 +89,8 @@
77
89
  "eslint-plugin-react-refresh": "^0.4.26",
78
90
  "eslint-plugin-regexp": "^2.10.0",
79
91
  "eslint-plugin-unicorn": "^62.0.0",
92
+ "eslint-plugin-zod": "^3.0.2",
93
+ "@typescript-eslint/utils": "^8.50.0",
80
94
  "globals": "^16.5.0",
81
95
  "typescript-eslint": "^8.50.0"
82
96
  },
@@ -85,7 +99,7 @@
85
99
  "@types/eslint-plugin-jsx-a11y": "^6.10.1",
86
100
  "@types/node": "^25.0.3",
87
101
  "typescript": "^5.9.3",
88
- "@tractorbeam/typescript-config": "0.1.2"
102
+ "@tractorbeam/typescript-config": "0.2.0"
89
103
  },
90
104
  "peerDependencies": {
91
105
  "eslint": ">= 9",
@@ -98,7 +112,6 @@
98
112
  "scripts": {
99
113
  "build": "tsc -p tsconfig.build.json",
100
114
  "clean": "rm -rf dist *.tsbuildinfo",
101
- "postinstall": "pnpm run build",
102
115
  "lint:eslint": "eslint src --max-warnings=0",
103
116
  "lint:types": "tsc --noEmit"
104
117
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIrC,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,EAQ9B,CAAC"}
package/dist/base.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,YAAY,CAAC;AAEhC,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,CAAC,MAAM,IAAI,GAAoB,YAAY,CAAC;IAChD,MAAM,CAAC,OAAO,CAAC,WAAW;IAC1B,mBAAmB,CAAC,kBAAkB,CAAC;IACvC;QACE,KAAK,EAAE;YACL,mBAAmB,EAAE,OAAO;SAC7B;KACF;CACF,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIrC,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,EAS9B,CAAC"}
package/dist/node.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,MAAM,CAAC,MAAM,IAAI,GAAoB,YAAY,CAAC;IAChD;QACE,eAAe,EAAE;YACf,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE;SAC7B;QACD,KAAK,EAAE;YACL,YAAY,EAAE,KAAK;SACpB;KACF;CACF,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"playwright.d.ts","sourceRoot":"","sources":["../src/playwright.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIrC,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAEpC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"playwright.js","sourceRoot":"","sources":["../src/playwright.ts"],"names":[],"mappings":"AACA,OAAO,gBAAgB,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,CAAC,MAAM,UAAU,GAAoB,YAAY,CAAC;IACtD,gBAAgB,CAAC,OAAO,CAAC,kBAAkB,CAAC;CAC7C,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"prettier.d.ts","sourceRoot":"","sources":["../src/prettier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGrC,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAqB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"prettier.js","sourceRoot":"","sources":["../src/prettier.ts"],"names":[],"mappings":"AACA,OAAO,cAAc,MAAM,wBAAwB,CAAC;AAEpD,MAAM,CAAC,MAAM,QAAQ,GAAoB,CAAC,cAAc,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;AAS7C,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,MAAM,EA4B/B,CAAC"}
package/dist/react.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AACA,OAAO,aAAa,MAAM,wBAAwB,CAAC;AACnD,OAAO,WAAW,MAAM,qBAAqB,CAAC;AAC9C,OAAO,mBAAmB,MAAM,8BAA8B,CAAC;AAC/D,OAAO,gBAAgB,MAAM,2BAA2B,CAAC;AACzD,OAAO,kBAAkB,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,MAAM,CAAC,MAAM,KAAK,GAAoB,YAAY,CAAC;IACjD;QACE,KAAK,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;QAC/B,OAAO,EAAE;YACP,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW;YACpC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC;YACvC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW;YACzC,aAAa,CAAC,WAAW,CAAC,WAAW;YACrC,mBAAmB,CAAC,OAAO,CAAC,WAAW;SACxC;QACD,eAAe,EAAE;YACf,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE;SAChC;QACD,OAAO,EAAE;YACP,aAAa,EAAE,gBAA4C;YAC3D,eAAe,EAAE,kBAAkB;SACpC;QACD,KAAK,EAAE;YACL,6BAA6B,EAAE,KAAK;YACpC,sCAAsC,EAAE,MAAM;YAC9C,wBAAwB,EAAE,KAAK;YAC/B,0BAA0B,EAAE,KAAK;YACjC,6BAA6B,EAAE,KAAK;SACrC;QACD,QAAQ,EAAE;YACR,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;SAC7B;KACF;CACF,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tanstack-router.d.ts","sourceRoot":"","sources":["../src/tanstack-router.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGrC,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAExC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tanstack-router.js","sourceRoot":"","sources":["../src/tanstack-router.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,MAAM,gCAAgC,CAAC;AAElE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,CAAC,MAAM,cAAc,GAAoB,YAAY,CAAC;IAC1D,oBAAoB,CAAC,OAAO,CAAC,kBAAkB,CAAC;CACjD,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"typescript.d.ts","sourceRoot":"","sources":["../src/typescript.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAOrC,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EA0DpC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"typescript.js","sourceRoot":"","sources":["../src/typescript.ts"],"names":[],"mappings":"AACA,OAAO,gBAAgB,MAAM,2BAA2B,CAAC;AACzD,OAAO,YAAY,MAAM,sBAAsB,CAAC;AAChD,OAAO,aAAa,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,QAAQ,MAAM,mBAAmB,CAAC;AAEzC,MAAM,CAAC,MAAM,UAAU,GAAoB,YAAY,CAAC;IACtD;QACE,KAAK,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;QAC9B,OAAO,EAAE;YACP,QAAQ,CAAC,OAAO,CAAC,iBAAiB;YAClC,QAAQ,CAAC,OAAO,CAAC,oBAAoB;YACrC,aAAa,CAAC,OAAO,CAAC,WAAW;YACjC,YAAY,CAAC,OAAO,CAAC,kBAAkB,CAAC;YACxC,sEAAsE;YACtE,gBAAgB,CAAC,OAAO,CAAC,WAAW;SACrC;QACD,eAAe,EAAE;YACf,aAAa,EAAE;gBACb,cAAc,EAAE,IAAI;aACrB;SACF;QACD,KAAK,EAAE;YACL,yCAAyC,EAAE,KAAK;YAChD,kDAAkD,EAAE,KAAK;YAEzD,mCAAmC,EAAE,MAAM;YAC3C,yCAAyC,EAAE,MAAM;YACjD,oCAAoC,EAAE,MAAM;YAE5C,4CAA4C,EAAE,OAAO;YACrD,qCAAqC,EAAE;gBACrC,OAAO;gBACP;oBACE,KAAK,EAAE;wBACL;4BACE,IAAI,EAAE,SAAS;4BACf,OAAO,EAAE,uBAAuB;4BAChC,IAAI,EAAE,UAAU;yBACjB;wBACD;4BACE,IAAI,EAAE,SAAS;4BACf,OAAO,EAAE,uBAAuB;4BAChC,IAAI,EAAE,eAAe;yBACtB;qBACF;iBACF;aACF;YACD,mCAAmC,EAAE;gBACnC,OAAO;gBACP;oBACE,iBAAiB,EAAE,IAAI;oBACvB,iBAAiB,EAAE,IAAI;oBACvB,8BAA8B,EAAE,IAAI;iBACrC;aACF;YAED,2BAA2B,EAAE,KAAK;YAClC,iBAAiB,EAAE,KAAK;YACxB,+BAA+B,EAAE,KAAK;YACtC,mCAAmC,EAAE,KAAK;YAC1C,uBAAuB,EAAE,KAAK;SAC/B;KACF;CACF,CAAC,CAAC"}