@codyswann/lisa 1.50.1 → 1.50.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/configs/eslint/expo.d.ts.map +1 -1
- package/dist/configs/eslint/expo.js +6 -3
- package/dist/configs/eslint/expo.js.map +1 -1
- package/dist/configs/eslint/typescript.d.ts.map +1 -1
- package/dist/configs/eslint/typescript.js +5 -2
- package/dist/configs/eslint/typescript.js.map +1 -1
- package/eslint-plugin-code-organization/README.md +149 -0
- package/eslint-plugin-code-organization/__tests__/enforce-statement-order.test.js +473 -0
- package/eslint-plugin-code-organization/index.js +28 -0
- package/eslint-plugin-code-organization/package.json +10 -0
- package/eslint-plugin-code-organization/rules/enforce-statement-order.js +162 -0
- package/eslint-plugin-component-structure/README.md +234 -0
- package/eslint-plugin-component-structure/__tests__/plugin-index.test.js +89 -0
- package/eslint-plugin-component-structure/__tests__/require-memo-in-view.test.js +201 -0
- package/eslint-plugin-component-structure/__tests__/single-component-per-file.test.js +294 -0
- package/eslint-plugin-component-structure/index.js +37 -0
- package/eslint-plugin-component-structure/package.json +10 -0
- package/eslint-plugin-component-structure/rules/enforce-component-structure.js +235 -0
- package/eslint-plugin-component-structure/rules/no-return-in-view.js +96 -0
- package/eslint-plugin-component-structure/rules/require-memo-in-view.js +183 -0
- package/eslint-plugin-component-structure/rules/single-component-per-file.js +243 -0
- package/eslint-plugin-ui-standards/README.md +192 -0
- package/eslint-plugin-ui-standards/index.js +31 -0
- package/eslint-plugin-ui-standards/package.json +10 -0
- package/eslint-plugin-ui-standards/rules/no-classname-outside-ui.js +56 -0
- package/eslint-plugin-ui-standards/rules/no-direct-rn-imports.js +60 -0
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expo.d.ts","sourceRoot":"","sources":["../../../src/configs/eslint/expo.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"expo.d.ts","sourceRoot":"","sources":["../../../src/configs/eslint/expo.ts"],"names":[],"mappings":"AAsBA,OAAO,EAEL,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,sBAAsB,EAGtB,cAAc,EAIf,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,sBAAsB,EACtB,cAAc,GACf,CAAC;AAwBF;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,EAC5B,eAAe,EACf,cAA+B,EAC/B,UAA8B,GAC/B,EAAE;IACD,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,iBAAiB,CAAC;CACvC,GAAG,OAAO,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,CA6PnC"}
|
|
@@ -17,14 +17,17 @@
|
|
|
17
17
|
import react from "eslint-plugin-react";
|
|
18
18
|
import reactCompiler from "eslint-plugin-react-compiler";
|
|
19
19
|
import { createRequire } from "module";
|
|
20
|
+
import { fileURLToPath } from "url";
|
|
20
21
|
// Import TypeScript config and utilities
|
|
21
22
|
import { codeOrganization, defaultIgnores, defaultThresholds, getBaseConfigs, getBaseLanguageOptions, getJsFilesOverride, getSharedFilesOverride, getSharedRules, getTestFilesOverride, getTsFilesOverride, getTsTestFilesOverride, } from "./typescript.js";
|
|
22
23
|
// Re-export for downstream configs
|
|
23
24
|
export { defaultIgnores, defaultThresholds, getBaseConfigs, getBaseLanguageOptions, getSharedRules, };
|
|
24
|
-
// Custom plugins
|
|
25
|
+
// Custom plugins — loaded via relative path so they are resolved from the Lisa
|
|
26
|
+
// package itself (eslint-plugin-* dirs are included in the published files array)
|
|
27
|
+
// rather than requiring separate npm packages that bun must resolve from the registry.
|
|
25
28
|
const require = createRequire(import.meta.url);
|
|
26
|
-
const componentStructure = require("
|
|
27
|
-
const uiStandards = require("
|
|
29
|
+
const componentStructure = require(fileURLToPath(new URL("../../../eslint-plugin-component-structure/index.js", import.meta.url)));
|
|
30
|
+
const uiStandards = require(fileURLToPath(new URL("../../../eslint-plugin-ui-standards/index.js", import.meta.url)));
|
|
28
31
|
const expoConfig = require("eslint-config-expo/flat");
|
|
29
32
|
const reactPerf = require("eslint-plugin-react-perf");
|
|
30
33
|
const jsxA11y = require("eslint-plugin-jsx-a11y");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expo.js","sourceRoot":"","sources":["../../../src/configs/eslint/expo.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,MAAM,qBAAqB,CAAC;AACxC,OAAO,aAAa,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"expo.js","sourceRoot":"","sources":["../../../src/configs/eslint/expo.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typescript.d.ts","sourceRoot":"","sources":["../../../src/configs/eslint/typescript.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"typescript.d.ts","sourceRoot":"","sources":["../../../src/configs/eslint/typescript.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,sBAAsB,EACtB,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,EACvB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,sBAAsB,EACtB,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,GACvB,CAAC;AAMF,QAAA,MAAM,gBAAgB,KAOrB,CAAC;AAGF,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAE5B;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,eAAe,EACf,cAA+B,EAC/B,UAA8B,GAC/B,EAAE;IACD,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,iBAAiB,CAAC;CACvC,GAAG,OAAO,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,CAgEnC"}
|
|
@@ -8,13 +8,16 @@
|
|
|
8
8
|
* @module configs/eslint/typescript
|
|
9
9
|
*/
|
|
10
10
|
import { createRequire } from "module";
|
|
11
|
+
import { fileURLToPath } from "url";
|
|
11
12
|
// Import shared base configuration
|
|
12
13
|
import { defaultIgnores, defaultThresholds, getBaseConfigs, getBaseLanguageOptions, getJsFilesOverride, getSharedFilesOverride, getSharedRules, getTestFilesOverride, getTsFilesOverride, getTsTestFilesOverride, } from "./base.js";
|
|
13
14
|
// Re-export base utilities for stack-specific configs to use
|
|
14
15
|
export { defaultIgnores, defaultThresholds, getBaseConfigs, getBaseLanguageOptions, getJsFilesOverride, getSharedFilesOverride, getSharedRules, getTestFilesOverride, getTsFilesOverride, getTsTestFilesOverride, };
|
|
15
|
-
// Custom plugins
|
|
16
|
+
// Custom plugins — loaded via relative path so they are resolved from the Lisa
|
|
17
|
+
// package itself (eslint-plugin-* dirs are included in the published files array)
|
|
18
|
+
// rather than requiring separate npm packages that bun must resolve from the registry.
|
|
16
19
|
const require = createRequire(import.meta.url);
|
|
17
|
-
const codeOrganization = require("
|
|
20
|
+
const codeOrganization = require(fileURLToPath(new URL("../../../eslint-plugin-code-organization/index.js", import.meta.url)));
|
|
18
21
|
// Re-export plugin for stack-specific configs
|
|
19
22
|
export { codeOrganization };
|
|
20
23
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typescript.js","sourceRoot":"","sources":["../../../src/configs/eslint/typescript.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"typescript.js","sourceRoot":"","sources":["../../../src/configs/eslint/typescript.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,mCAAmC;AACnC,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,sBAAsB,EACtB,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,WAAW,CAAC;AAEnB,6DAA6D;AAC7D,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,sBAAsB,EACtB,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,GACvB,CAAC;AAEF,+EAA+E;AAC/E,kFAAkF;AAClF,uFAAuF;AACvF,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,gBAAgB,GAAG,OAAO,CAC9B,aAAa,CACX,IAAI,GAAG,CACL,mDAAmD,EACnD,MAAM,CAAC,IAAI,CAAC,GAAG,CAChB,CACF,CACF,CAAC;AAEF,8CAA8C;AAC9C,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAE5B;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAClC,eAAe,EACf,cAAc,GAAG,cAAc,EAC/B,UAAU,GAAG,iBAAiB,GAK/B;IACC,OAAO;QACL,iBAAiB;QACjB;YACE,OAAO,EAAE,cAAc;SACxB;QAED,yCAAyC;QACzC,GAAG,cAAc,EAAE;QAEnB,mCAAmC;QACnC;YACE,eAAe,EAAE,sBAAsB,EAAE;YACzC,OAAO,EAAE;gBACP,mBAAmB,EAAE,gBAAgB;aACtC;YACD,KAAK,EAAE;gBACL,yBAAyB;gBACzB,GAAG,cAAc,CAAC,UAAU,CAAC;gBAE7B,oBAAoB;gBACpB,2CAA2C,EAAE,OAAO;gBAEpD,gEAAgE;gBAChE,6EAA6E;gBAC7E,sCAAsC;gBACtC,sBAAsB,EAAE;oBACtB,OAAO;oBACP;wBACE,QAAQ,EACN,8DAA8D;wBAChE,OAAO,EACL,kKAAkK;qBACrK;iBACF;gBAED,sFAAsF;gBACtF,uBAAuB,EAAE,KAAK;aAC/B;SACF;QAED,4BAA4B;QAC5B,kBAAkB,EAAE;QAEpB,8BAA8B;QAC9B,sBAAsB,EAAE;QAExB,4BAA4B;QAC5B,oBAAoB,EAAE;QAEtB,iDAAiD;QACjD,kBAAkB,CAAC,CAAC,SAAS,CAAC,EAAE,eAAe,CAAC;QAEhD,qFAAqF;QACrF,sBAAsB,CAAC,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;QAExD,4DAA4D;QAC5D;YACE,KAAK,EAAE,CAAC,cAAc,CAAC;YACvB,KAAK,EAAE;gBACL,sBAAsB,EAAE,KAAK;aAC9B;SACF;KAC6C,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# eslint-plugin-code-organization
|
|
2
|
+
|
|
3
|
+
ESLint plugin to enforce code organization standards for the PropSwap frontend application.
|
|
4
|
+
|
|
5
|
+
## Rules
|
|
6
|
+
|
|
7
|
+
### `enforce-statement-order`
|
|
8
|
+
|
|
9
|
+
Enforces the standard statement order in all functions:
|
|
10
|
+
|
|
11
|
+
1. **Definitions** - Variable declarations (`const`, `let`, `var`) and function declarations
|
|
12
|
+
2. **Side effects** - Expression statements that are function calls
|
|
13
|
+
3. **Return statement** - Final return
|
|
14
|
+
|
|
15
|
+
This rule applies to all functions: React components, hooks, utilities, and plain JavaScript functions.
|
|
16
|
+
|
|
17
|
+
**Examples:**
|
|
18
|
+
|
|
19
|
+
❌ Incorrect - side effect before definition:
|
|
20
|
+
|
|
21
|
+
```javascript
|
|
22
|
+
function process() {
|
|
23
|
+
initialize(); // Side effect
|
|
24
|
+
const config = getConfig(); // Definition after side effect - WRONG
|
|
25
|
+
return config;
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
❌ Incorrect - definition after side effect (React):
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
const useExample = () => {
|
|
33
|
+
useEffect(() => {}, []); // Side effect
|
|
34
|
+
|
|
35
|
+
const data = useMemo(() => [], []); // Definition after side effect - WRONG
|
|
36
|
+
|
|
37
|
+
return data;
|
|
38
|
+
};
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
✅ Correct - Proper order:
|
|
42
|
+
|
|
43
|
+
```javascript
|
|
44
|
+
function process() {
|
|
45
|
+
// 1. Definitions
|
|
46
|
+
const config = getConfig();
|
|
47
|
+
const options = { debug: true };
|
|
48
|
+
|
|
49
|
+
// 2. Side effects
|
|
50
|
+
initialize();
|
|
51
|
+
logger.info("starting");
|
|
52
|
+
|
|
53
|
+
// 3. Return
|
|
54
|
+
return config;
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
✅ Correct - React hook with proper order:
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
const useExample = () => {
|
|
62
|
+
// 1. Definitions
|
|
63
|
+
const [state, setState] = useState(null);
|
|
64
|
+
const data = useMemo(() => [], []);
|
|
65
|
+
const handleClick = useCallback(() => {}, []);
|
|
66
|
+
|
|
67
|
+
// 2. Side effects
|
|
68
|
+
useEffect(() => {}, []);
|
|
69
|
+
|
|
70
|
+
// 3. Return
|
|
71
|
+
return data;
|
|
72
|
+
};
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Installation
|
|
76
|
+
|
|
77
|
+
This plugin is installed locally as a file dependency:
|
|
78
|
+
|
|
79
|
+
```json
|
|
80
|
+
{
|
|
81
|
+
"devDependencies": {
|
|
82
|
+
"eslint-plugin-code-organization": "file:./eslint-plugin-code-organization"
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Usage
|
|
88
|
+
|
|
89
|
+
### ESLint 9 Flat Config (Recommended)
|
|
90
|
+
|
|
91
|
+
```javascript
|
|
92
|
+
// eslint.config.mjs
|
|
93
|
+
import codeOrganizationPlugin from './eslint-plugin-code-organization/index.js';
|
|
94
|
+
|
|
95
|
+
export default [
|
|
96
|
+
{
|
|
97
|
+
plugins: {
|
|
98
|
+
'code-organization': codeOrganizationPlugin,
|
|
99
|
+
},
|
|
100
|
+
rules: {
|
|
101
|
+
'code-organization/enforce-statement-order': 'error',
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
];
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Legacy Config (.eslintrc.json)
|
|
108
|
+
|
|
109
|
+
```json
|
|
110
|
+
{
|
|
111
|
+
"plugins": ["code-organization"],
|
|
112
|
+
"rules": {
|
|
113
|
+
"code-organization/enforce-statement-order": "error"
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Special Cases
|
|
119
|
+
|
|
120
|
+
### Guard Clauses
|
|
121
|
+
|
|
122
|
+
If statements (often used for early returns/guard clauses) are intentionally excluded from this rule. They can appear anywhere in the function:
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
function processUser(userId: string) {
|
|
126
|
+
// Guard clause - allowed anywhere
|
|
127
|
+
if (!userId) {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const user = getUser(userId);
|
|
132
|
+
validateUser(user);
|
|
133
|
+
return user;
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### React Hooks
|
|
138
|
+
|
|
139
|
+
For React hooks, the definitions category includes:
|
|
140
|
+
- `useState`, `useRef`, `useMemo`, `useCallback` (return values to variables)
|
|
141
|
+
- Any hook that returns a value assigned to a variable
|
|
142
|
+
|
|
143
|
+
Side effects include:
|
|
144
|
+
- `useEffect`, `useLayoutEffect` (no return value used)
|
|
145
|
+
- Any expression statement with function calls
|
|
146
|
+
|
|
147
|
+
## Version
|
|
148
|
+
|
|
149
|
+
1.0.0
|