@qualety/react 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 NavehBrenner
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/dist/ast.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ import type { RuleContext } from "qualety";
2
+ import { type ArrowFunction, type FunctionDeclaration, type FunctionExpression, type MethodDeclaration, Node, SourceFile } from "ts-morph";
3
+ export type FunctionLike = FunctionDeclaration | FunctionExpression | ArrowFunction | MethodDeclaration;
4
+ export declare function bindFileScan(scan: (sf: SourceFile, file: string, context: Pick<RuleContext, "report">) => void): (context: RuleContext) => void;
5
+ export declare function isFunctionLike(node: Node): node is FunctionLike;
6
+ export declare function collectReactEffectBindings(sf: SourceFile): {
7
+ effects: Set<string>;
8
+ namespaces: Set<string>;
9
+ };
10
+ export declare function collectHttpClientBindings(sf: SourceFile): Set<string>;
11
+ export declare function fileDeclaresLocalFetch(sf: SourceFile): boolean;
12
+ export declare function collectQueryHookBindings(sf: SourceFile): {
13
+ hooks: Map<string, string>;
14
+ namespaces: Set<string>;
15
+ };
16
+ export declare function isEffectCall(call: Node, effects: Set<string>, namespaces: Set<string>): boolean;
17
+ export declare function queryHookName(call: Node, hooks: Map<string, string>, namespaces: Set<string>): string | undefined;
18
+ export declare function forbiddenHttpApi(call: Node, clients: Set<string>, localFetch: boolean): string | undefined;
19
+ export declare function isIifeCallee(fn: Node): boolean;
20
+ export declare function inlineCallback(call: Node): Node | undefined;
21
+ export declare function enclosingFunction(node: Node): FunctionLike | undefined;
22
+ //# sourceMappingURL=ast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,IAAI,EACJ,UAAU,EACX,MAAM,UAAU,CAAC;AAElB,MAAM,MAAM,YAAY,GACpB,mBAAmB,GACnB,kBAAkB,GAClB,aAAa,GACb,iBAAiB,CAAC;AAOtB,wBAAgB,YAAY,CAC1B,IAAI,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,KAAK,IAAI,GACjF,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAShC;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,YAAY,CAO/D;AAED,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,UAAU,GAAG;IAC1D,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACzB,CAYA;AAED,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,CAoBrE;AAED,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,UAAU,GAAG,OAAO,CAc9D;AAED,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,UAAU,GAAG;IACxD,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACzB,CAYA;AA2BD,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAgB/F;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GACtB,MAAM,GAAG,SAAS,CAmBpB;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,EACpB,UAAU,EAAE,OAAO,GAClB,MAAM,GAAG,SAAS,CA0BpB;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,IAAI,GAAG,OAAO,CAU9C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,CAY3D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,YAAY,GAAG,SAAS,CActE"}
package/dist/ast.js ADDED
@@ -0,0 +1,201 @@
1
+ import { Node, SourceFile, } from "ts-morph";
2
+ const HTTP_PACKAGES = ["axios", "ky", "got"];
3
+ const HTTP_METHODS = new Set(["get", "post", "put", "patch", "delete"]);
4
+ const EFFECT_HOOKS = new Set(["useEffect", "useLayoutEffect"]);
5
+ const QUERY_HOOKS = new Set(["useQuery", "useInfiniteQuery"]);
6
+ export function bindFileScan(scan) {
7
+ return (context) => {
8
+ const sources = context.getArtifact("typescript").sources;
9
+ for (const [abs, unit] of sources) {
10
+ if (unit instanceof SourceFile) {
11
+ scan(unit, abs, context);
12
+ }
13
+ }
14
+ };
15
+ }
16
+ export function isFunctionLike(node) {
17
+ return (Node.isFunctionDeclaration(node) ||
18
+ Node.isFunctionExpression(node) ||
19
+ Node.isArrowFunction(node) ||
20
+ Node.isMethodDeclaration(node));
21
+ }
22
+ export function collectReactEffectBindings(sf) {
23
+ const { named, namespaces } = collectMatchingImports(sf, (spec) => spec === "react" || spec.startsWith("react/"));
24
+ const effects = new Set();
25
+ for (const item of named) {
26
+ if (EFFECT_HOOKS.has(item.imported)) {
27
+ effects.add(item.local);
28
+ }
29
+ }
30
+ return { effects, namespaces };
31
+ }
32
+ export function collectHttpClientBindings(sf) {
33
+ const clients = new Set();
34
+ for (const decl of sf.getImportDeclarations()) {
35
+ const spec = decl.getModuleSpecifierValue();
36
+ if (!HTTP_PACKAGES.some((pkg) => spec === pkg || spec.startsWith(`${pkg}/`))) {
37
+ continue;
38
+ }
39
+ const def = decl.getDefaultImport();
40
+ if (def !== undefined) {
41
+ clients.add(def.getText());
42
+ }
43
+ const ns = decl.getNamespaceImport();
44
+ if (ns !== undefined) {
45
+ clients.add(ns.getText());
46
+ }
47
+ for (const named of decl.getNamedImports()) {
48
+ clients.add(named.getAliasNode()?.getText() ?? named.getName());
49
+ }
50
+ }
51
+ return clients;
52
+ }
53
+ export function fileDeclaresLocalFetch(sf) {
54
+ for (const stmt of sf.getStatements()) {
55
+ if (Node.isFunctionDeclaration(stmt) && stmt.getName() === "fetch") {
56
+ return true;
57
+ }
58
+ if (Node.isVariableStatement(stmt)) {
59
+ for (const decl of stmt.getDeclarations()) {
60
+ if (decl.getName() === "fetch") {
61
+ return true;
62
+ }
63
+ }
64
+ }
65
+ }
66
+ return false;
67
+ }
68
+ export function collectQueryHookBindings(sf) {
69
+ const { named, namespaces } = collectMatchingImports(sf, (spec) => spec === "@tanstack/react-query" || spec.startsWith("@tanstack/react-query/"));
70
+ const hooks = new Map();
71
+ for (const item of named) {
72
+ if (QUERY_HOOKS.has(item.imported)) {
73
+ hooks.set(item.local, item.imported);
74
+ }
75
+ }
76
+ return { hooks, namespaces };
77
+ }
78
+ function collectMatchingImports(sf, matchSpec) {
79
+ const named = [];
80
+ const namespaces = new Set();
81
+ for (const decl of sf.getImportDeclarations()) {
82
+ if (!matchSpec(decl.getModuleSpecifierValue())) {
83
+ continue;
84
+ }
85
+ const def = decl.getDefaultImport();
86
+ if (def !== undefined) {
87
+ namespaces.add(def.getText());
88
+ }
89
+ const ns = decl.getNamespaceImport();
90
+ if (ns !== undefined) {
91
+ namespaces.add(ns.getText());
92
+ }
93
+ for (const item of decl.getNamedImports()) {
94
+ named.push({
95
+ local: item.getAliasNode()?.getText() ?? item.getName(),
96
+ imported: item.getName(),
97
+ });
98
+ }
99
+ }
100
+ return { named, namespaces };
101
+ }
102
+ export function isEffectCall(call, effects, namespaces) {
103
+ if (!Node.isCallExpression(call)) {
104
+ return false;
105
+ }
106
+ const expr = call.getExpression();
107
+ if (Node.isIdentifier(expr)) {
108
+ return effects.has(expr.getText());
109
+ }
110
+ if (Node.isPropertyAccessExpression(expr)) {
111
+ if (!EFFECT_HOOKS.has(expr.getName())) {
112
+ return false;
113
+ }
114
+ const obj = expr.getExpression();
115
+ return Node.isIdentifier(obj) && namespaces.has(obj.getText());
116
+ }
117
+ return false;
118
+ }
119
+ export function queryHookName(call, hooks, namespaces) {
120
+ if (!Node.isCallExpression(call)) {
121
+ return undefined;
122
+ }
123
+ const expr = call.getExpression();
124
+ if (Node.isIdentifier(expr)) {
125
+ return hooks.get(expr.getText());
126
+ }
127
+ if (Node.isPropertyAccessExpression(expr)) {
128
+ const name = expr.getName();
129
+ if (!QUERY_HOOKS.has(name)) {
130
+ return undefined;
131
+ }
132
+ const obj = expr.getExpression();
133
+ if (Node.isIdentifier(obj) && namespaces.has(obj.getText())) {
134
+ return name;
135
+ }
136
+ }
137
+ return undefined;
138
+ }
139
+ export function forbiddenHttpApi(call, clients, localFetch) {
140
+ if (!Node.isCallExpression(call)) {
141
+ return undefined;
142
+ }
143
+ const expr = call.getExpression();
144
+ if (Node.isIdentifier(expr)) {
145
+ const name = expr.getText();
146
+ if (name === "fetch" && !localFetch) {
147
+ return "fetch";
148
+ }
149
+ if (clients.has(name)) {
150
+ return name;
151
+ }
152
+ return undefined;
153
+ }
154
+ if (Node.isPropertyAccessExpression(expr)) {
155
+ const method = expr.getName();
156
+ if (!HTTP_METHODS.has(method)) {
157
+ return undefined;
158
+ }
159
+ const obj = expr.getExpression();
160
+ if (Node.isIdentifier(obj) && clients.has(obj.getText())) {
161
+ return `${obj.getText()}.${method}`;
162
+ }
163
+ }
164
+ return undefined;
165
+ }
166
+ export function isIifeCallee(fn) {
167
+ let current = fn;
168
+ let parent = fn.getParent();
169
+ while (parent !== undefined && Node.isParenthesizedExpression(parent)) {
170
+ current = parent;
171
+ parent = parent.getParent();
172
+ }
173
+ return (parent !== undefined && Node.isCallExpression(parent) && parent.getExpression() === current);
174
+ }
175
+ export function inlineCallback(call) {
176
+ if (!Node.isCallExpression(call)) {
177
+ return undefined;
178
+ }
179
+ const arg = call.getArguments()[0];
180
+ if (arg === undefined) {
181
+ return undefined;
182
+ }
183
+ if (Node.isArrowFunction(arg) || Node.isFunctionExpression(arg)) {
184
+ return arg;
185
+ }
186
+ return undefined;
187
+ }
188
+ export function enclosingFunction(node) {
189
+ let parent = node.getParent();
190
+ while (parent !== undefined) {
191
+ if (Node.isFunctionDeclaration(parent) ||
192
+ Node.isFunctionExpression(parent) ||
193
+ Node.isArrowFunction(parent) ||
194
+ Node.isMethodDeclaration(parent)) {
195
+ return parent;
196
+ }
197
+ parent = parent.getParent();
198
+ }
199
+ return undefined;
200
+ }
201
+ //# sourceMappingURL=ast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast.js","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Plugin } from "qualety";
2
+ declare const plugin: Plugin;
3
+ export default plugin;
4
+ export { plugin };
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAItC,QAAA,MAAM,MAAM,EAAE,MAcb,CAAC;eAEa,MAAM;AACrB,OAAO,EAAE,MAAM,EAAE,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ import { noFetchInUseEffect } from "./no-fetch-in-useeffect.js";
2
+ import { queryErrorHandled } from "./query-error-handled.js";
3
+ const plugin = {
4
+ name: "react",
5
+ rules: {
6
+ "no-fetch-in-useeffect": noFetchInUseEffect,
7
+ "query-error-handled": queryErrorHandled,
8
+ },
9
+ configs: {
10
+ recommended: {
11
+ rules: {
12
+ "react/no-fetch-in-useeffect": "error",
13
+ "react/query-error-handled": "error",
14
+ },
15
+ },
16
+ },
17
+ };
18
+ export default plugin;
19
+ export { plugin };
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,MAAM,GAAW;IACrB,IAAI,EAAE,OAAO;IACb,KAAK,EAAE;QACL,uBAAuB,EAAE,kBAAkB;QAC3C,qBAAqB,EAAE,iBAAiB;KACzC;IACD,OAAO,EAAE;QACP,WAAW,EAAE;YACX,KAAK,EAAE;gBACL,6BAA6B,EAAE,OAAO;gBACtC,2BAA2B,EAAE,OAAO;aACrC;SACF;KACF;CACF,CAAC;AAEF,eAAe,MAAM,CAAC;AACtB,OAAO,EAAE,MAAM,EAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type RuleContext } from "qualety";
2
+ export declare const noFetchInUseEffect: {
3
+ meta: import("qualety").RuleMeta & {
4
+ requires?: readonly string[] | undefined;
5
+ };
6
+ create(context: RuleContext<readonly string[]>): void | import("qualety").RuleListener;
7
+ };
8
+ //# sourceMappingURL=no-fetch-in-useeffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-fetch-in-useeffect.d.ts","sourceRoot":"","sources":["../src/no-fetch-in-useeffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAiBvD,eAAO,MAAM,kBAAkB;;;;;CAQ7B,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { defineRule } from "qualety";
2
+ import { Node } from "ts-morph";
3
+ import { bindFileScan, collectHttpClientBindings, collectReactEffectBindings, fileDeclaresLocalFetch, forbiddenHttpApi, inlineCallback, isEffectCall, isFunctionLike, isIifeCallee, } from "./ast.js";
4
+ const SUGGESTION = "Load this data with TanStack Query, SWR, a route loader, or an RSC fetch — not inside useEffect.";
5
+ export const noFetchInUseEffect = defineRule({
6
+ meta: {
7
+ requires: ["typescript"],
8
+ docs: {
9
+ description: "Do not kick off HTTP data loading inside useEffect or useLayoutEffect.",
10
+ },
11
+ },
12
+ create: bindFileScan(scanFile),
13
+ });
14
+ function scanFile(sf, file, context) {
15
+ const { effects, namespaces } = collectReactEffectBindings(sf);
16
+ if (effects.size === 0 && namespaces.size === 0) {
17
+ return;
18
+ }
19
+ const clients = collectHttpClientBindings(sf);
20
+ const localFetch = fileDeclaresLocalFetch(sf);
21
+ for (const node of sf.getDescendants()) {
22
+ if (!isEffectCall(node, effects, namespaces)) {
23
+ continue;
24
+ }
25
+ const callback = inlineCallback(node);
26
+ if (callback === undefined) {
27
+ continue;
28
+ }
29
+ scanEffectCallback(callback, file, clients, localFetch, context);
30
+ }
31
+ }
32
+ function scanEffectCallback(callback, file, clients, localFetch, context) {
33
+ const body = Node.isArrowFunction(callback) || Node.isFunctionExpression(callback)
34
+ ? callback.getBody()
35
+ : undefined;
36
+ if (body === undefined) {
37
+ return;
38
+ }
39
+ consider(body);
40
+ body.forEachDescendant((child, traversal) => {
41
+ if (Node.isFunctionDeclaration(child)) {
42
+ traversal.skip();
43
+ return;
44
+ }
45
+ if (isFunctionLike(child) && !isIifeCallee(child)) {
46
+ traversal.skip();
47
+ return;
48
+ }
49
+ consider(child);
50
+ });
51
+ function consider(node) {
52
+ const api = forbiddenHttpApi(node, clients, localFetch);
53
+ if (api === undefined) {
54
+ return;
55
+ }
56
+ context.report({
57
+ severity: "error",
58
+ file,
59
+ range: {
60
+ start: node.getSourceFile().getLineAndColumnAtPos(node.getStart()),
61
+ end: node.getSourceFile().getLineAndColumnAtPos(node.getEnd()),
62
+ },
63
+ message: `Do not call ${api} inside useEffect or useLayoutEffect.`,
64
+ suggestion: SUGGESTION,
65
+ });
66
+ }
67
+ }
68
+ //# sourceMappingURL=no-fetch-in-useeffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-fetch-in-useeffect.js","sourceRoot":"","sources":["../src/no-fetch-in-useeffect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type RuleContext } from "qualety";
2
+ export declare const queryErrorHandled: {
3
+ meta: import("qualety").RuleMeta & {
4
+ requires?: readonly string[] | undefined;
5
+ };
6
+ create(context: RuleContext<readonly string[]>): void | import("qualety").RuleListener;
7
+ };
8
+ //# sourceMappingURL=query-error-handled.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-error-handled.d.ts","sourceRoot":"","sources":["../src/query-error-handled.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAoBvD,eAAO,MAAM,iBAAiB;;;;;CAQ5B,CAAC"}
@@ -0,0 +1,345 @@
1
+ import { defineRule } from "qualety";
2
+ import { Node } from "ts-morph";
3
+ import { bindFileScan, collectQueryHookBindings, enclosingFunction, isFunctionLike, queryHookName, } from "./ast.js";
4
+ const SUGGESTION = 'Branch on isError/error/status === "error" in this function, or set throwOnError: true and render an Error Boundary.';
5
+ export const queryErrorHandled = defineRule({
6
+ meta: {
7
+ requires: ["typescript"],
8
+ docs: {
9
+ description: "Every TanStack useQuery / useInfiniteQuery usage must handle errors.",
10
+ },
11
+ },
12
+ create: bindFileScan(scanFile),
13
+ });
14
+ function scanFile(sf, file, context) {
15
+ const { hooks, namespaces } = collectQueryHookBindings(sf);
16
+ if (hooks.size === 0 && namespaces.size === 0) {
17
+ return;
18
+ }
19
+ sf.forEachDescendant((node) => {
20
+ const hook = queryHookName(node, hooks, namespaces);
21
+ if (hook === undefined || !Node.isCallExpression(node)) {
22
+ return;
23
+ }
24
+ if (hasThrowOnError(node) || hasTrackedErrorBranch(node, enclosingFunction(node))) {
25
+ return;
26
+ }
27
+ context.report({
28
+ severity: "error",
29
+ file,
30
+ range: {
31
+ start: node.getSourceFile().getLineAndColumnAtPos(node.getStart()),
32
+ end: node.getSourceFile().getLineAndColumnAtPos(node.getEnd()),
33
+ },
34
+ message: `${hook} error is unhandled.`,
35
+ suggestion: SUGGESTION,
36
+ });
37
+ });
38
+ }
39
+ function hasThrowOnError(call) {
40
+ if (!Node.isCallExpression(call)) {
41
+ return false;
42
+ }
43
+ for (const arg of call.getArguments().slice(0, 2)) {
44
+ if (Node.isObjectLiteralExpression(arg) && objectHasThrowOnError(arg)) {
45
+ return true;
46
+ }
47
+ }
48
+ return false;
49
+ }
50
+ function objectHasThrowOnError(obj) {
51
+ if (!Node.isObjectLiteralExpression(obj)) {
52
+ return false;
53
+ }
54
+ const prop = obj.getProperty("throwOnError");
55
+ if (prop === undefined || !Node.isPropertyAssignment(prop)) {
56
+ return false;
57
+ }
58
+ const init = prop.getInitializer();
59
+ if (init === undefined || Node.isFalseLiteral(init)) {
60
+ return false;
61
+ }
62
+ if (Node.isTrueLiteral(init)) {
63
+ return true;
64
+ }
65
+ return Node.isFunctionExpression(init) || Node.isArrowFunction(init);
66
+ }
67
+ function hasTrackedErrorBranch(call, fn) {
68
+ if (fn === undefined || !isFunctionLike(fn)) {
69
+ return false;
70
+ }
71
+ const facts = collectFacts(call, fn);
72
+ const body = fn.getBody();
73
+ if (body === undefined) {
74
+ return false;
75
+ }
76
+ let found = false;
77
+ inspect(body);
78
+ walkFunctionBody(body, (child) => {
79
+ if (found) {
80
+ return true;
81
+ }
82
+ inspect(child);
83
+ return false;
84
+ });
85
+ return found;
86
+ function inspect(node) {
87
+ if (Node.isIfStatement(node) && usesTrackedFact(node.getExpression(), facts)) {
88
+ found = true;
89
+ return;
90
+ }
91
+ if (Node.isConditionalExpression(node) && usesTrackedFact(node.getCondition(), facts)) {
92
+ found = true;
93
+ return;
94
+ }
95
+ if (Node.isBinaryExpression(node) &&
96
+ node.getOperatorToken().getText() === "&&" &&
97
+ (usesTrackedFact(node.getLeft(), facts) || usesTrackedFact(node.getRight(), facts))) {
98
+ found = true;
99
+ }
100
+ }
101
+ }
102
+ function collectFacts(call, fn) {
103
+ const facts = {
104
+ results: new Set(),
105
+ isError: new Set(),
106
+ status: new Set(),
107
+ error: new Set(),
108
+ };
109
+ bindCall(call, facts);
110
+ collectAliases(fn, facts);
111
+ return facts;
112
+ }
113
+ function bindCall(call, facts) {
114
+ const parent = skipWrappersUp(call).getParent();
115
+ if (parent === undefined) {
116
+ return;
117
+ }
118
+ if (Node.isVariableDeclaration(parent)) {
119
+ bindPattern(parent.getNameNode(), facts);
120
+ return;
121
+ }
122
+ if (Node.isBinaryExpression(parent) &&
123
+ parent.getOperatorToken().getText() === "=" &&
124
+ unwrapExpr(parent.getRight()) === unwrapExpr(call)) {
125
+ const left = parent.getLeft();
126
+ if (Node.isIdentifier(left)) {
127
+ facts.results.add(left.getText());
128
+ }
129
+ }
130
+ }
131
+ function collectAliases(fn, facts) {
132
+ const body = isFunctionLike(fn) ? fn.getBody() : undefined;
133
+ if (body === undefined) {
134
+ return;
135
+ }
136
+ let changed = true;
137
+ while (changed) {
138
+ changed = false;
139
+ consider(body);
140
+ walkFunctionBody(body, (child) => {
141
+ if (consider(child)) {
142
+ changed = true;
143
+ }
144
+ return false;
145
+ });
146
+ }
147
+ function consider(node) {
148
+ if (Node.isVariableDeclaration(node)) {
149
+ const init = node.getInitializer();
150
+ if (init === undefined) {
151
+ return false;
152
+ }
153
+ return bindAlias(node.getNameNode(), init, facts);
154
+ }
155
+ if (Node.isBinaryExpression(node) && node.getOperatorToken().getText() === "=") {
156
+ return bindAlias(node.getLeft(), node.getRight(), facts);
157
+ }
158
+ return false;
159
+ }
160
+ }
161
+ function bindAlias(target, init, facts) {
162
+ const expr = unwrapExpr(init);
163
+ if (Node.isIdentifier(target)) {
164
+ return addAlias(target.getText(), expr, facts);
165
+ }
166
+ if (isTrackedResult(expr, facts)) {
167
+ return bindPattern(target, facts);
168
+ }
169
+ return false;
170
+ }
171
+ function addAlias(name, expr, facts) {
172
+ if (isTrackedIsError(expr, facts)) {
173
+ return take(facts.isError, name);
174
+ }
175
+ if (isTrackedStatus(expr, facts)) {
176
+ return take(facts.status, name);
177
+ }
178
+ if (isTrackedError(expr, facts)) {
179
+ return take(facts.error, name);
180
+ }
181
+ if (isTrackedResult(expr, facts)) {
182
+ return take(facts.results, name);
183
+ }
184
+ return false;
185
+ }
186
+ function bindPattern(name, facts) {
187
+ if (Node.isIdentifier(name)) {
188
+ return take(facts.results, name.getText());
189
+ }
190
+ if (!Node.isObjectBindingPattern(name)) {
191
+ return false;
192
+ }
193
+ let changed = false;
194
+ for (const el of name.getElements()) {
195
+ changed = bindOneElement(el, facts) || changed;
196
+ }
197
+ return changed;
198
+ }
199
+ function bindOneElement(el, facts) {
200
+ if (!Node.isBindingElement(el)) {
201
+ return false;
202
+ }
203
+ const local = el.getNameNode();
204
+ if (!Node.isIdentifier(local)) {
205
+ return false;
206
+ }
207
+ if (el.getDotDotDotToken() !== undefined) {
208
+ return take(facts.results, local.getText());
209
+ }
210
+ return takeBoundFact(bindingKey(el), local.getText(), facts);
211
+ }
212
+ function takeBoundFact(key, local, facts) {
213
+ if (key === "isError") {
214
+ return take(facts.isError, local);
215
+ }
216
+ if (key === "status") {
217
+ return take(facts.status, local);
218
+ }
219
+ if (key === "error") {
220
+ return take(facts.error, local);
221
+ }
222
+ return false;
223
+ }
224
+ function bindingKey(el) {
225
+ if (!Node.isBindingElement(el)) {
226
+ return undefined;
227
+ }
228
+ const prop = el.getPropertyNameNode();
229
+ if (prop === undefined) {
230
+ const name = el.getNameNode();
231
+ return Node.isIdentifier(name) ? name.getText() : undefined;
232
+ }
233
+ if (Node.isIdentifier(prop)) {
234
+ return prop.getText();
235
+ }
236
+ if (Node.isStringLiteral(prop)) {
237
+ return prop.getLiteralValue();
238
+ }
239
+ return undefined;
240
+ }
241
+ function usesTrackedFact(expr, facts) {
242
+ if (isTrackedFact(expr, facts)) {
243
+ return true;
244
+ }
245
+ let found = false;
246
+ expr.forEachDescendant((child, traversal) => {
247
+ if (isFunctionLike(child)) {
248
+ traversal.skip();
249
+ return;
250
+ }
251
+ if (isTrackedFact(child, facts)) {
252
+ found = true;
253
+ traversal.stop();
254
+ }
255
+ });
256
+ return found;
257
+ }
258
+ function isTrackedFact(node, facts) {
259
+ if (isTrackedIsError(node, facts) || isTrackedError(node, facts)) {
260
+ return true;
261
+ }
262
+ if (!Node.isBinaryExpression(node)) {
263
+ return false;
264
+ }
265
+ const op = node.getOperatorToken().getText();
266
+ if (op !== "===" && op !== "==") {
267
+ return false;
268
+ }
269
+ return ((isTrackedStatus(node.getLeft(), facts) && isErrorString(node.getRight())) ||
270
+ (isTrackedStatus(node.getRight(), facts) && isErrorString(node.getLeft())));
271
+ }
272
+ function isTrackedIsError(node, facts) {
273
+ return isTrackedName(node, facts.isError) || isResultProp(node, facts, "isError");
274
+ }
275
+ function isTrackedStatus(node, facts) {
276
+ return isTrackedName(node, facts.status) || isResultProp(node, facts, "status");
277
+ }
278
+ function isTrackedError(node, facts) {
279
+ return isTrackedName(node, facts.error) || isResultProp(node, facts, "error");
280
+ }
281
+ function isTrackedResult(node, facts) {
282
+ return Node.isIdentifier(node) && facts.results.has(node.getText());
283
+ }
284
+ function isTrackedName(node, names) {
285
+ return Node.isIdentifier(node) && names.has(node.getText());
286
+ }
287
+ function isResultProp(node, facts, name) {
288
+ if (!Node.isPropertyAccessExpression(node) || node.getName() !== name) {
289
+ return false;
290
+ }
291
+ const obj = unwrapExpr(node.getExpression());
292
+ return Node.isIdentifier(obj) && facts.results.has(obj.getText());
293
+ }
294
+ function isErrorString(node) {
295
+ return Node.isStringLiteral(node) && node.getLiteralValue() === "error";
296
+ }
297
+ function take(set, name) {
298
+ if (set.has(name)) {
299
+ return false;
300
+ }
301
+ set.add(name);
302
+ return true;
303
+ }
304
+ function unwrapExpr(node) {
305
+ let current = node;
306
+ while (Node.isParenthesizedExpression(current) ||
307
+ Node.isAsExpression(current) ||
308
+ Node.isTypeAssertion(current) ||
309
+ Node.isSatisfiesExpression(current) ||
310
+ Node.isNonNullExpression(current)) {
311
+ current = current.getExpression();
312
+ }
313
+ return current;
314
+ }
315
+ function skipWrappersUp(node) {
316
+ let current = node;
317
+ while (true) {
318
+ const parent = current.getParent();
319
+ if (parent === undefined) {
320
+ return current;
321
+ }
322
+ if ((Node.isParenthesizedExpression(parent) ||
323
+ Node.isAsExpression(parent) ||
324
+ Node.isTypeAssertion(parent) ||
325
+ Node.isSatisfiesExpression(parent) ||
326
+ Node.isNonNullExpression(parent)) &&
327
+ parent.getExpression() === current) {
328
+ current = parent;
329
+ continue;
330
+ }
331
+ return current;
332
+ }
333
+ }
334
+ function walkFunctionBody(body, visit) {
335
+ body.forEachDescendant((child, traversal) => {
336
+ if (isFunctionLike(child)) {
337
+ traversal.skip();
338
+ return;
339
+ }
340
+ if (visit(child)) {
341
+ traversal.stop();
342
+ }
343
+ });
344
+ }
345
+ //# sourceMappingURL=query-error-handled.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-error-handled.js","sourceRoot":"","sources":["../src/query-error-handled.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@qualety/react",
3
+ "version": "0.1.0",
4
+ "description": "React compositional rules for qualety.",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/NavehBrenner/qualety.git",
9
+ "directory": "packages/react"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/NavehBrenner/qualety/issues"
13
+ },
14
+ "homepage": "https://github.com/NavehBrenner/qualety",
15
+ "publishConfig": {
16
+ "access": "public"
17
+ },
18
+ "type": "module",
19
+ "exports": {
20
+ ".": {
21
+ "types": "./dist/index.d.ts",
22
+ "import": "./dist/index.js"
23
+ }
24
+ },
25
+ "types": "./dist/index.d.ts",
26
+ "files": [
27
+ "dist"
28
+ ],
29
+ "engines": {
30
+ "node": ">=22"
31
+ },
32
+ "dependencies": {
33
+ "ts-morph": "^28.0.0",
34
+ "qualety": "0.1.0"
35
+ },
36
+ "devDependencies": {
37
+ "@types/node": "^26.2.0"
38
+ },
39
+ "scripts": {
40
+ "build": "tsc -b"
41
+ }
42
+ }