@guardrail-ai/rules 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.
Files changed (122) hide show
  1. package/dist/__tests__/advanced-rules.test.d.ts +2 -0
  2. package/dist/__tests__/advanced-rules.test.d.ts.map +1 -0
  3. package/dist/__tests__/advanced-rules.test.js +59 -0
  4. package/dist/__tests__/advanced-rules.test.js.map +1 -0
  5. package/dist/__tests__/dead-code.test.d.ts +2 -0
  6. package/dist/__tests__/dead-code.test.d.ts.map +1 -0
  7. package/dist/__tests__/dead-code.test.js +66 -0
  8. package/dist/__tests__/dead-code.test.js.map +1 -0
  9. package/dist/__tests__/duplicate-logic.test.d.ts +2 -0
  10. package/dist/__tests__/duplicate-logic.test.d.ts.map +1 -0
  11. package/dist/__tests__/duplicate-logic.test.js +47 -0
  12. package/dist/__tests__/duplicate-logic.test.js.map +1 -0
  13. package/dist/__tests__/hardcoded-api-key.test.d.ts +2 -0
  14. package/dist/__tests__/hardcoded-api-key.test.d.ts.map +1 -0
  15. package/dist/__tests__/hardcoded-api-key.test.js +44 -0
  16. package/dist/__tests__/hardcoded-api-key.test.js.map +1 -0
  17. package/dist/__tests__/inefficient-loop.test.d.ts +2 -0
  18. package/dist/__tests__/inefficient-loop.test.d.ts.map +1 -0
  19. package/dist/__tests__/inefficient-loop.test.js +49 -0
  20. package/dist/__tests__/inefficient-loop.test.js.map +1 -0
  21. package/dist/__tests__/new-rules.test.d.ts +2 -0
  22. package/dist/__tests__/new-rules.test.d.ts.map +1 -0
  23. package/dist/__tests__/new-rules.test.js +193 -0
  24. package/dist/__tests__/new-rules.test.js.map +1 -0
  25. package/dist/__tests__/sql-injection.test.d.ts +2 -0
  26. package/dist/__tests__/sql-injection.test.d.ts.map +1 -0
  27. package/dist/__tests__/sql-injection.test.js +40 -0
  28. package/dist/__tests__/sql-injection.test.js.map +1 -0
  29. package/dist/any-type-abuse.d.ts +4 -0
  30. package/dist/any-type-abuse.d.ts.map +1 -0
  31. package/dist/any-type-abuse.js +37 -0
  32. package/dist/any-type-abuse.js.map +1 -0
  33. package/dist/console-log-spam.d.ts +4 -0
  34. package/dist/console-log-spam.d.ts.map +1 -0
  35. package/dist/console-log-spam.js +60 -0
  36. package/dist/console-log-spam.js.map +1 -0
  37. package/dist/data/hallucinated-packages.json +212 -0
  38. package/dist/dead-code.d.ts +10 -0
  39. package/dist/dead-code.d.ts.map +1 -0
  40. package/dist/dead-code.js +152 -0
  41. package/dist/dead-code.js.map +1 -0
  42. package/dist/duplicate-logic.d.ts +4 -0
  43. package/dist/duplicate-logic.d.ts.map +1 -0
  44. package/dist/duplicate-logic.js +90 -0
  45. package/dist/duplicate-logic.js.map +1 -0
  46. package/dist/env-var-leak.d.ts +4 -0
  47. package/dist/env-var-leak.d.ts.map +1 -0
  48. package/dist/env-var-leak.js +86 -0
  49. package/dist/env-var-leak.js.map +1 -0
  50. package/dist/fetch-without-error-handling.d.ts +4 -0
  51. package/dist/fetch-without-error-handling.d.ts.map +1 -0
  52. package/dist/fetch-without-error-handling.js +62 -0
  53. package/dist/fetch-without-error-handling.js.map +1 -0
  54. package/dist/hallucinated-import.d.ts +4 -0
  55. package/dist/hallucinated-import.d.ts.map +1 -0
  56. package/dist/hallucinated-import.js +75 -0
  57. package/dist/hallucinated-import.js.map +1 -0
  58. package/dist/hardcoded-api-key.d.ts +4 -0
  59. package/dist/hardcoded-api-key.d.ts.map +1 -0
  60. package/dist/hardcoded-api-key.js +129 -0
  61. package/dist/hardcoded-api-key.js.map +1 -0
  62. package/dist/hardcoded-localhost.d.ts +4 -0
  63. package/dist/hardcoded-localhost.d.ts.map +1 -0
  64. package/dist/hardcoded-localhost.js +53 -0
  65. package/dist/hardcoded-localhost.js.map +1 -0
  66. package/dist/index.d.ts +26 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +83 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/inefficient-loop.d.ts +4 -0
  71. package/dist/inefficient-loop.d.ts.map +1 -0
  72. package/dist/inefficient-loop.js +104 -0
  73. package/dist/inefficient-loop.js.map +1 -0
  74. package/dist/insecure-cors.d.ts +4 -0
  75. package/dist/insecure-cors.d.ts.map +1 -0
  76. package/dist/insecure-cors.js +89 -0
  77. package/dist/insecure-cors.js.map +1 -0
  78. package/dist/magic-numbers.d.ts +4 -0
  79. package/dist/magic-numbers.d.ts.map +1 -0
  80. package/dist/magic-numbers.js +53 -0
  81. package/dist/magic-numbers.js.map +1 -0
  82. package/dist/n-plus-one-query.d.ts +4 -0
  83. package/dist/n-plus-one-query.d.ts.map +1 -0
  84. package/dist/n-plus-one-query.js +95 -0
  85. package/dist/n-plus-one-query.js.map +1 -0
  86. package/dist/no-eval.d.ts +4 -0
  87. package/dist/no-eval.d.ts.map +1 -0
  88. package/dist/no-eval.js +53 -0
  89. package/dist/no-eval.js.map +1 -0
  90. package/dist/no-rate-limiting.d.ts +4 -0
  91. package/dist/no-rate-limiting.d.ts.map +1 -0
  92. package/dist/no-rate-limiting.js +72 -0
  93. package/dist/no-rate-limiting.js.map +1 -0
  94. package/dist/no-secrets-in-logs.d.ts +4 -0
  95. package/dist/no-secrets-in-logs.d.ts.map +1 -0
  96. package/dist/no-secrets-in-logs.js +71 -0
  97. package/dist/no-secrets-in-logs.js.map +1 -0
  98. package/dist/overly-broad-catch.d.ts +4 -0
  99. package/dist/overly-broad-catch.d.ts.map +1 -0
  100. package/dist/overly-broad-catch.js +48 -0
  101. package/dist/overly-broad-catch.js.map +1 -0
  102. package/dist/placeholder-code.d.ts +4 -0
  103. package/dist/placeholder-code.d.ts.map +1 -0
  104. package/dist/placeholder-code.js +58 -0
  105. package/dist/placeholder-code.js.map +1 -0
  106. package/dist/promise-without-catch.d.ts +4 -0
  107. package/dist/promise-without-catch.d.ts.map +1 -0
  108. package/dist/promise-without-catch.js +72 -0
  109. package/dist/promise-without-catch.js.map +1 -0
  110. package/dist/sql-injection.d.ts +4 -0
  111. package/dist/sql-injection.d.ts.map +1 -0
  112. package/dist/sql-injection.js +108 -0
  113. package/dist/sql-injection.js.map +1 -0
  114. package/dist/unsafe-regex.d.ts +4 -0
  115. package/dist/unsafe-regex.d.ts.map +1 -0
  116. package/dist/unsafe-regex.js +75 -0
  117. package/dist/unsafe-regex.js.map +1 -0
  118. package/dist/unused-imports.d.ts +4 -0
  119. package/dist/unused-imports.d.ts.map +1 -0
  120. package/dist/unused-imports.js +56 -0
  121. package/dist/unused-imports.js.map +1 -0
  122. package/package.json +32 -0
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const traverse_1 = __importDefault(require("@babel/traverse"));
7
+ const anyTypeAbuseRule = {
8
+ id: 'ai-codegen/any-type-abuse',
9
+ name: 'Any Type Abuse',
10
+ description: 'Detects explicit `: any` type annotations and `as any` casts in TypeScript files',
11
+ severity: 'warning',
12
+ category: 'ai-codegen',
13
+ detect(context) {
14
+ const violations = [];
15
+ const { ast, filePath } = context;
16
+ // Only check TypeScript files
17
+ if (!/\.tsx?$/.test(filePath))
18
+ return violations;
19
+ (0, traverse_1.default)(ast, {
20
+ TSAnyKeyword(path) {
21
+ violations.push({
22
+ ruleId: 'ai-codegen/any-type-abuse',
23
+ severity: 'warning',
24
+ message: 'Explicit `any` type — use a specific type, `unknown`, or a generic instead.',
25
+ location: {
26
+ file: filePath,
27
+ line: path.node.loc?.start.line ?? 0,
28
+ column: path.node.loc?.start.column ?? 0,
29
+ },
30
+ });
31
+ },
32
+ });
33
+ return violations;
34
+ },
35
+ };
36
+ exports.default = anyTypeAbuseRule;
37
+ //# sourceMappingURL=any-type-abuse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"any-type-abuse.js","sourceRoot":"","sources":["../src/any-type-abuse.ts"],"names":[],"mappings":";;;;;AAAA,+DAAuC;AAGvC,MAAM,gBAAgB,GAAS;IAC7B,EAAE,EAAE,2BAA2B;IAC/B,IAAI,EAAE,gBAAgB;IACtB,WAAW,EACT,kFAAkF;IACpF,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,YAAY;IAEtB,MAAM,CAAC,OAAoB;QACzB,MAAM,UAAU,GAAgB,EAAE,CAAC;QACnC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QAElC,8BAA8B;QAC9B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO,UAAU,CAAC;QAEjD,IAAA,kBAAQ,EAAC,GAAG,EAAE;YACZ,YAAY,CAAC,IAAI;gBACf,UAAU,CAAC,IAAI,CAAC;oBACd,MAAM,EAAE,2BAA2B;oBACnC,QAAQ,EAAE,SAAS;oBACnB,OAAO,EACL,6EAA6E;oBAC/E,QAAQ,EAAE;wBACR,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC;wBACpC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC;qBACzC;iBACF,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACpB,CAAC;CACF,CAAC;AAEF,kBAAe,gBAAgB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Rule } from '@guardrail-ai/core';
2
+ declare const consoleLogSpamRule: Rule;
3
+ export default consoleLogSpamRule;
4
+ //# sourceMappingURL=console-log-spam.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console-log-spam.d.ts","sourceRoot":"","sources":["../src/console-log-spam.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAA0B,MAAM,oBAAoB,CAAC;AAIvE,QAAA,MAAM,kBAAkB,EAAE,IAyDzB,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const traverse_1 = __importDefault(require("@babel/traverse"));
7
+ const DEBUG_METHODS = new Set(['log', 'debug', 'info', 'trace', 'dir', 'table']);
8
+ const consoleLogSpamRule = {
9
+ id: 'ai-codegen/console-log-spam',
10
+ name: 'Console Log Spam',
11
+ description: 'Detects console.log/debug/info calls that should be removed or replaced with proper logging',
12
+ severity: 'info',
13
+ category: 'ai-codegen',
14
+ detect(context) {
15
+ const violations = [];
16
+ const { ast, filePath } = context;
17
+ (0, traverse_1.default)(ast, {
18
+ CallExpression(path) {
19
+ const callee = path.node.callee;
20
+ if (callee.type === 'MemberExpression' &&
21
+ callee.object.type === 'Identifier' &&
22
+ callee.object.name === 'console' &&
23
+ callee.property.type === 'Identifier' &&
24
+ DEBUG_METHODS.has(callee.property.name)) {
25
+ const stmt = path.findParent((p) => p.isExpressionStatement());
26
+ const stmtNode = stmt?.node;
27
+ violations.push({
28
+ ruleId: 'ai-codegen/console-log-spam',
29
+ severity: 'info',
30
+ message: `console.${callee.property.name}() call — remove or replace with a proper logger.`,
31
+ location: {
32
+ file: filePath,
33
+ line: path.node.loc?.start.line ?? 0,
34
+ column: path.node.loc?.start.column ?? 0,
35
+ },
36
+ fix: stmtNode?.loc
37
+ ? {
38
+ description: `Remove console.${callee.property.name}() statement`,
39
+ range: {
40
+ start: {
41
+ line: stmtNode.loc.start.line,
42
+ column: stmtNode.loc.start.column,
43
+ },
44
+ end: {
45
+ line: stmtNode.loc.end.line,
46
+ column: stmtNode.loc.end.column,
47
+ },
48
+ },
49
+ replacement: '',
50
+ }
51
+ : undefined,
52
+ });
53
+ }
54
+ },
55
+ });
56
+ return violations;
57
+ },
58
+ };
59
+ exports.default = consoleLogSpamRule;
60
+ //# sourceMappingURL=console-log-spam.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console-log-spam.js","sourceRoot":"","sources":["../src/console-log-spam.ts"],"names":[],"mappings":";;;;;AAAA,+DAAuC;AAGvC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;AAEjF,MAAM,kBAAkB,GAAS;IAC/B,EAAE,EAAE,6BAA6B;IACjC,IAAI,EAAE,kBAAkB;IACxB,WAAW,EACT,6FAA6F;IAC/F,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,YAAY;IAEtB,MAAM,CAAC,OAAoB;QACzB,MAAM,UAAU,GAAgB,EAAE,CAAC;QACnC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QAElC,IAAA,kBAAQ,EAAC,GAAG,EAAE;YACZ,cAAc,CAAC,IAAI;gBACjB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;gBAChC,IACE,MAAM,CAAC,IAAI,KAAK,kBAAkB;oBAClC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY;oBACnC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS;oBAChC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,YAAY;oBACrC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EACvC,CAAC;oBACD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,qBAAqB,EAAE,CAAC,CAAC;oBAC/D,MAAM,QAAQ,GAAG,IAAI,EAAE,IAAI,CAAC;oBAE5B,UAAU,CAAC,IAAI,CAAC;wBACd,MAAM,EAAE,6BAA6B;wBACrC,QAAQ,EAAE,MAAM;wBAChB,OAAO,EAAE,WAAW,MAAM,CAAC,QAAQ,CAAC,IAAI,mDAAmD;wBAC3F,QAAQ,EAAE;4BACR,IAAI,EAAE,QAAQ;4BACd,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC;4BACpC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC;yBACzC;wBACD,GAAG,EAAE,QAAQ,EAAE,GAAG;4BAChB,CAAC,CAAC;gCACE,WAAW,EAAE,kBAAkB,MAAM,CAAC,QAAQ,CAAC,IAAI,cAAc;gCACjE,KAAK,EAAE;oCACL,KAAK,EAAE;wCACL,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI;wCAC7B,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM;qCAClC;oCACD,GAAG,EAAE;wCACH,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI;wCAC3B,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM;qCAChC;iCACF;gCACD,WAAW,EAAE,EAAE;6BAChB;4BACH,CAAC,CAAC,SAAS;qBACd,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACpB,CAAC;CACF,CAAC;AAEF,kBAAe,kBAAkB,CAAC"}
@@ -0,0 +1,212 @@
1
+ [
2
+ "@openai/api",
3
+ "@openai/sdk",
4
+ "@openai/client",
5
+ "@anthropic/sdk",
6
+ "@anthropic/client",
7
+ "langchain-core",
8
+ "langchain-community",
9
+ "langchain-openai",
10
+ "react-native-ai",
11
+ "react-ai",
12
+ "express-middleware",
13
+ "express-utils",
14
+ "express-helpers",
15
+ "lodash-utils",
16
+ "lodash-helpers",
17
+ "node-utils",
18
+ "node-helpers",
19
+ "crypto-utils",
20
+ "auth-utils",
21
+ "auth-helpers",
22
+ "api-utils",
23
+ "api-helpers",
24
+ "db-utils",
25
+ "database-utils",
26
+ "mongoose-utils",
27
+ "prisma-utils",
28
+ "nextjs-utils",
29
+ "next-utils",
30
+ "react-query-utils",
31
+ "redux-helpers",
32
+ "graphql-helpers",
33
+ "graphql-utils",
34
+ "socket-utils",
35
+ "websocket-utils",
36
+ "firebase-utils",
37
+ "firebase-helpers",
38
+ "aws-utils",
39
+ "aws-helpers",
40
+ "gcp-utils",
41
+ "azure-utils",
42
+ "docker-utils",
43
+ "kubernetes-utils",
44
+ "ml-utils",
45
+ "ai-utils",
46
+ "data-utils",
47
+ "string-utils",
48
+ "array-utils",
49
+ "object-utils",
50
+ "file-utils",
51
+ "path-utils",
52
+ "url-utils",
53
+ "http-utils",
54
+ "validation-utils",
55
+ "test-utils",
56
+ "testing-utils",
57
+ "mock-utils",
58
+ "logger-utils",
59
+ "config-utils",
60
+ "env-utils",
61
+ "cache-utils",
62
+ "queue-utils",
63
+ "email-utils",
64
+ "payment-utils",
65
+ "stripe-utils",
66
+ "@stripe/utils",
67
+ "image-utils",
68
+ "video-utils",
69
+ "audio-utils",
70
+ "pdf-utils",
71
+ "csv-utils",
72
+ "json-utils",
73
+ "xml-utils",
74
+ "yaml-utils",
75
+ "markdown-utils",
76
+ "html-utils",
77
+ "css-utils",
78
+ "tailwind-utils",
79
+ "styled-utils",
80
+ "animation-utils",
81
+ "date-utils",
82
+ "time-utils",
83
+ "math-utils",
84
+ "crypto-helpers",
85
+ "security-utils",
86
+ "permission-utils",
87
+ "role-utils",
88
+ "session-utils",
89
+ "token-utils",
90
+ "jwt-utils",
91
+ "oauth-utils",
92
+ "passport-utils",
93
+ "bcrypt-utils",
94
+ "encryption-utils",
95
+ "hash-utils",
96
+ "random-utils",
97
+ "uuid-utils",
98
+ "id-utils",
99
+ "slug-utils",
100
+ "format-utils",
101
+ "parse-utils",
102
+ "convert-utils",
103
+ "transform-utils",
104
+ "merge-utils",
105
+ "deep-merge-utils",
106
+ "clone-utils",
107
+ "compare-utils",
108
+ "sort-utils",
109
+ "filter-utils",
110
+ "search-utils",
111
+ "pagination-utils",
112
+ "scroll-utils",
113
+ "dom-utils",
114
+ "event-utils",
115
+ "storage-utils",
116
+ "cookie-utils",
117
+ "browser-utils",
118
+ "mobile-utils",
119
+ "responsive-utils",
120
+ "seo-utils",
121
+ "analytics-utils",
122
+ "tracking-utils",
123
+ "notification-utils",
124
+ "push-utils",
125
+ "webhook-utils",
126
+ "cron-utils",
127
+ "scheduler-utils",
128
+ "worker-utils",
129
+ "thread-utils",
130
+ "stream-utils",
131
+ "buffer-utils",
132
+ "encoding-utils",
133
+ "compression-utils",
134
+ "upload-utils",
135
+ "download-utils",
136
+ "migration-utils",
137
+ "seed-utils",
138
+ "fixture-utils",
139
+ "factory-utils",
140
+ "builder-utils",
141
+ "generator-utils",
142
+ "template-utils",
143
+ "render-utils",
144
+ "compile-utils",
145
+ "bundle-utils",
146
+ "deploy-utils",
147
+ "ci-utils",
148
+ "git-utils",
149
+ "npm-utils",
150
+ "cli-utils",
151
+ "terminal-utils",
152
+ "console-utils",
153
+ "debug-utils",
154
+ "error-utils",
155
+ "exception-utils",
156
+ "retry-utils",
157
+ "timeout-utils",
158
+ "delay-utils",
159
+ "async-utils",
160
+ "promise-utils",
161
+ "observable-utils",
162
+ "state-utils",
163
+ "context-utils",
164
+ "hook-utils",
165
+ "middleware-utils",
166
+ "plugin-utils",
167
+ "extension-utils",
168
+ "addon-utils",
169
+ "module-utils",
170
+ "package-utils",
171
+ "dependency-utils",
172
+ "version-utils",
173
+ "changelog-utils",
174
+ "release-utils",
175
+ "publish-utils",
176
+ "docs-utils",
177
+ "readme-utils",
178
+ "comment-utils",
179
+ "annotation-utils",
180
+ "type-utils",
181
+ "schema-utils",
182
+ "model-utils",
183
+ "entity-utils",
184
+ "dto-utils",
185
+ "mapper-utils",
186
+ "serializer-utils",
187
+ "deserializer-utils",
188
+ "encoder-utils",
189
+ "decoder-utils",
190
+ "validator-utils",
191
+ "sanitizer-utils",
192
+ "normalizer-utils",
193
+ "formatter-utils",
194
+ "localization-utils",
195
+ "i18n-utils",
196
+ "translation-utils",
197
+ "currency-utils",
198
+ "number-utils",
199
+ "color-utils",
200
+ "icon-utils",
201
+ "font-utils",
202
+ "theme-utils",
203
+ "layout-utils",
204
+ "grid-utils",
205
+ "flex-utils",
206
+ "spacing-utils",
207
+ "border-utils",
208
+ "shadow-utils",
209
+ "gradient-utils",
210
+ "transition-utils",
211
+ "keyframe-utils"
212
+ ]
@@ -0,0 +1,10 @@
1
+ import type { Rule } from '@guardrail-ai/core';
2
+ /**
3
+ * Detects dead code patterns:
4
+ * - Unreachable code after return/throw/break/continue
5
+ * - Unused function declarations (within module scope)
6
+ * - Empty catch blocks that swallow errors
7
+ */
8
+ declare const deadCodeRule: Rule;
9
+ export default deadCodeRule;
10
+ //# sourceMappingURL=dead-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dead-code.d.ts","sourceRoot":"","sources":["../src/dead-code.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAA0B,MAAM,oBAAoB,CAAC;AAEvE;;;;;GAKG;AAEH,QAAA,MAAM,YAAY,EAAE,IAmKnB,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const traverse_1 = __importDefault(require("@babel/traverse"));
7
+ /**
8
+ * Detects dead code patterns:
9
+ * - Unreachable code after return/throw/break/continue
10
+ * - Unused function declarations (within module scope)
11
+ * - Empty catch blocks that swallow errors
12
+ */
13
+ const deadCodeRule = {
14
+ id: 'quality/dead-code',
15
+ name: 'Dead Code',
16
+ description: 'Detects unreachable code, unused declarations, and empty error handlers',
17
+ severity: 'warning',
18
+ category: 'quality',
19
+ detect(context) {
20
+ const violations = [];
21
+ const { ast, filePath, source } = context;
22
+ // Track function declarations and their references
23
+ const declaredFunctions = new Map();
24
+ const exportedNames = new Set();
25
+ (0, traverse_1.default)(ast, {
26
+ // Detect unreachable code after return/throw
27
+ 'ReturnStatement|ThrowStatement|BreakStatement|ContinueStatement'(path) {
28
+ const siblings = path.container;
29
+ if (!Array.isArray(siblings))
30
+ return;
31
+ const idx = siblings.indexOf(path.node);
32
+ if (idx === -1 || idx >= siblings.length - 1)
33
+ return;
34
+ const nextSibling = siblings[idx + 1];
35
+ // Skip if next is a function/class declaration (hoisted)
36
+ if (nextSibling.type === 'FunctionDeclaration' ||
37
+ nextSibling.type === 'ClassDeclaration') {
38
+ return;
39
+ }
40
+ violations.push({
41
+ ruleId: 'quality/dead-code',
42
+ severity: 'warning',
43
+ message: `Unreachable code after ${path.node.type.replace('Statement', '').toLowerCase()} statement`,
44
+ location: {
45
+ file: filePath,
46
+ line: nextSibling.loc?.start.line ?? 0,
47
+ column: nextSibling.loc?.start.column ?? 0,
48
+ },
49
+ fix: {
50
+ description: 'Remove unreachable code',
51
+ range: {
52
+ start: {
53
+ line: nextSibling.loc?.start.line ?? 0,
54
+ column: nextSibling.loc?.start.column ?? 0,
55
+ },
56
+ end: {
57
+ line: nextSibling.loc?.end.line ?? 0,
58
+ column: nextSibling.loc?.end.column ?? 0,
59
+ },
60
+ },
61
+ replacement: '',
62
+ },
63
+ });
64
+ },
65
+ // Track exports
66
+ ExportNamedDeclaration(path) {
67
+ const decl = path.node.declaration;
68
+ if (decl?.type === 'FunctionDeclaration' && decl.id) {
69
+ exportedNames.add(decl.id.name);
70
+ }
71
+ if (decl?.type === 'VariableDeclaration') {
72
+ for (const d of decl.declarations) {
73
+ if (d.id.type === 'Identifier') {
74
+ exportedNames.add(d.id.name);
75
+ }
76
+ }
77
+ }
78
+ for (const spec of path.node.specifiers) {
79
+ if (spec.type === 'ExportSpecifier' && spec.exported.type === 'Identifier') {
80
+ exportedNames.add(spec.exported.name);
81
+ }
82
+ }
83
+ },
84
+ ExportDefaultDeclaration(path) {
85
+ const decl = path.node.declaration;
86
+ if (decl.type === 'Identifier') {
87
+ exportedNames.add(decl.name);
88
+ }
89
+ if ((decl.type === 'FunctionDeclaration' ||
90
+ decl.type === 'ClassDeclaration') &&
91
+ decl.id) {
92
+ exportedNames.add(decl.id.name);
93
+ }
94
+ },
95
+ // Track function declarations at module level
96
+ FunctionDeclaration(path) {
97
+ if (path.parent.type === 'Program' &&
98
+ path.node.id) {
99
+ const name = path.node.id.name;
100
+ declaredFunctions.set(name, {
101
+ line: path.node.loc?.start.line ?? 0,
102
+ column: path.node.loc?.start.column ?? 0,
103
+ binding: path.scope.getBinding(name),
104
+ });
105
+ }
106
+ },
107
+ // Detect empty catch blocks
108
+ CatchClause(path) {
109
+ if (path.node.body.body.length === 0) {
110
+ // Check if there's at least a comment
111
+ const startLine = path.node.body.loc?.start.line ?? 0;
112
+ const endLine = path.node.body.loc?.end.line ?? 0;
113
+ const lines = source.split('\n').slice(startLine - 1, endLine);
114
+ const hasComment = lines.some((l) => /\/\/|\/\*/.test(l));
115
+ if (!hasComment) {
116
+ violations.push({
117
+ ruleId: 'quality/dead-code',
118
+ severity: 'warning',
119
+ message: 'Empty catch block swallows errors silently. Add error handling or a comment explaining why.',
120
+ location: {
121
+ file: filePath,
122
+ line: path.node.loc?.start.line ?? 0,
123
+ column: path.node.loc?.start.column ?? 0,
124
+ },
125
+ });
126
+ }
127
+ }
128
+ },
129
+ });
130
+ // Check for unused module-level functions
131
+ for (const [name, info] of declaredFunctions) {
132
+ if (exportedNames.has(name))
133
+ continue;
134
+ const binding = info.binding;
135
+ if (binding && binding.references === 0) {
136
+ violations.push({
137
+ ruleId: 'quality/dead-code',
138
+ severity: 'warning',
139
+ message: `Function "${name}" is declared but never used`,
140
+ location: {
141
+ file: filePath,
142
+ line: info.line,
143
+ column: info.column,
144
+ },
145
+ });
146
+ }
147
+ }
148
+ return violations;
149
+ },
150
+ };
151
+ exports.default = deadCodeRule;
152
+ //# sourceMappingURL=dead-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dead-code.js","sourceRoot":"","sources":["../src/dead-code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Rule } from '@guardrail-ai/core';
2
+ declare const duplicateLogicRule: Rule;
3
+ export default duplicateLogicRule;
4
+ //# sourceMappingURL=duplicate-logic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duplicate-logic.d.ts","sourceRoot":"","sources":["../src/duplicate-logic.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAA0B,MAAM,oBAAoB,CAAC;AAyBvE,QAAA,MAAM,kBAAkB,EAAE,IA8EzB,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const traverse_1 = __importDefault(require("@babel/traverse"));
7
+ const generator_1 = __importDefault(require("@babel/generator"));
8
+ /**
9
+ * Detects duplicate logic by comparing normalized AST representations
10
+ * of function bodies and significant code blocks.
11
+ *
12
+ * Two functions with identical normalized bodies are flagged.
13
+ */
14
+ const MIN_BODY_LENGTH = 50; // Minimum characters to consider
15
+ function normalizeName(code) {
16
+ // Replace all identifiers with generic placeholders
17
+ // This is a simplified normalization — a production version would
18
+ // walk the AST and alpha-rename variables
19
+ return code.replace(/\s+/g, ' ').trim();
20
+ }
21
+ const duplicateLogicRule = {
22
+ id: 'quality/duplicate-logic',
23
+ name: 'Duplicate Logic',
24
+ description: 'Detects functions with identical or near-identical logic that could be refactored',
25
+ severity: 'warning',
26
+ category: 'quality',
27
+ detect(context) {
28
+ const violations = [];
29
+ const { ast, filePath } = context;
30
+ const functions = [];
31
+ (0, traverse_1.default)(ast, {
32
+ 'FunctionDeclaration|FunctionExpression|ArrowFunctionExpression'(path) {
33
+ const node = path.node;
34
+ let name = 'anonymous';
35
+ if (node.type === 'FunctionDeclaration' && node.id) {
36
+ name = node.id.name;
37
+ }
38
+ else if (path.parent.type === 'VariableDeclarator' &&
39
+ path.parent.id.type === 'Identifier') {
40
+ name = path.parent.id.name;
41
+ }
42
+ const body = 'body' in node ? node.body : null;
43
+ if (!body)
44
+ return;
45
+ try {
46
+ const generated = (0, generator_1.default)(body, { compact: true }).code;
47
+ const normalized = normalizeName(generated);
48
+ if (normalized.length >= MIN_BODY_LENGTH) {
49
+ functions.push({
50
+ name,
51
+ normalizedBody: normalized,
52
+ line: node.loc?.start.line ?? 0,
53
+ column: node.loc?.start.column ?? 0,
54
+ });
55
+ }
56
+ }
57
+ catch {
58
+ // Skip if generation fails
59
+ }
60
+ },
61
+ });
62
+ // Compare all pairs
63
+ const reported = new Set();
64
+ for (let i = 0; i < functions.length; i++) {
65
+ for (let j = i + 1; j < functions.length; j++) {
66
+ const a = functions[i];
67
+ const b = functions[j];
68
+ if (a.normalizedBody === b.normalizedBody) {
69
+ const key = `${a.line}:${b.line}`;
70
+ if (reported.has(key))
71
+ continue;
72
+ reported.add(key);
73
+ violations.push({
74
+ ruleId: 'quality/duplicate-logic',
75
+ severity: 'warning',
76
+ message: `Function "${b.name}" (line ${b.line}) has identical logic to "${a.name}" (line ${a.line}). Consider refactoring into a shared function.`,
77
+ location: {
78
+ file: filePath,
79
+ line: b.line,
80
+ column: b.column,
81
+ },
82
+ });
83
+ }
84
+ }
85
+ }
86
+ return violations;
87
+ },
88
+ };
89
+ exports.default = duplicateLogicRule;
90
+ //# sourceMappingURL=duplicate-logic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duplicate-logic.js","sourceRoot":"","sources":["../src/duplicate-logic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Rule } from '@guardrail-ai/core';
2
+ declare const envVarLeakRule: Rule;
3
+ export default envVarLeakRule;
4
+ //# sourceMappingURL=env-var-leak.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-var-leak.d.ts","sourceRoot":"","sources":["../src/env-var-leak.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAA0B,MAAM,oBAAoB,CAAC;AAKvE,QAAA,MAAM,cAAc,EAAE,IAmDrB,CAAC;AAiCF,eAAe,cAAc,CAAC"}