@nest-boot/eslint-plugin 7.0.0-beta.0 → 7.0.0-beta.2

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 (80) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/CHANGELOG.md +2 -14
  3. package/dist/index.d.ts +2 -0
  4. package/dist/index.js +2 -5
  5. package/dist/index.js.map +1 -1
  6. package/dist/rules/graphql/graphql-field-config-from-types.d.ts +6 -0
  7. package/dist/rules/graphql/graphql-field-config-from-types.js +417 -0
  8. package/dist/rules/graphql/graphql-field-config-from-types.js.map +1 -0
  9. package/dist/rules/graphql/graphql-field-definite-assignment.d.ts +2 -0
  10. package/dist/rules/graphql/graphql-field-definite-assignment.js +125 -0
  11. package/dist/rules/graphql/graphql-field-definite-assignment.js.map +1 -0
  12. package/dist/rules/import/import-bullmq.d.ts +2 -0
  13. package/dist/rules/import/import-bullmq.js +36 -0
  14. package/dist/rules/import/import-bullmq.js.map +1 -0
  15. package/dist/rules/import/import-graphql.d.ts +2 -0
  16. package/dist/rules/import/import-graphql.js +36 -0
  17. package/dist/rules/import/import-graphql.js.map +1 -0
  18. package/dist/rules/import/import-mikro-orm.d.ts +2 -0
  19. package/dist/rules/import/import-mikro-orm.js +36 -0
  20. package/dist/rules/import/import-mikro-orm.js.map +1 -0
  21. package/dist/rules/index.d.ts +9 -0
  22. package/dist/rules/index.js +16 -11
  23. package/dist/rules/index.js.map +1 -1
  24. package/dist/rules/mikro-orm/entity-field-definite-assignment.d.ts +2 -0
  25. package/dist/rules/mikro-orm/entity-field-definite-assignment.js +125 -0
  26. package/dist/rules/mikro-orm/entity-field-definite-assignment.js.map +1 -0
  27. package/dist/rules/mikro-orm/entity-property-config-from-types.d.ts +3 -0
  28. package/dist/rules/mikro-orm/entity-property-config-from-types.js +881 -0
  29. package/dist/rules/mikro-orm/entity-property-config-from-types.js.map +1 -0
  30. package/dist/tsconfig.build.tsbuildinfo +1 -0
  31. package/dist/utils/createRule.d.ts +2 -0
  32. package/dist/utils/createRule.js +1 -1
  33. package/dist/utils/createRule.js.map +1 -1
  34. package/dist/utils/decorators.d.ts +29 -0
  35. package/dist/utils/decorators.js +74 -0
  36. package/dist/utils/decorators.js.map +1 -0
  37. package/dist/utils/tester.d.ts +2 -0
  38. package/dist/utils/tester.js +27 -0
  39. package/dist/utils/tester.js.map +1 -0
  40. package/eslint.config.mjs +38 -2
  41. package/jest.config.ts +12 -0
  42. package/package.json +22 -14
  43. package/src/index.ts +1 -1
  44. package/src/rules/graphql/graphql-field-config-from-types.spec.ts +242 -0
  45. package/src/rules/graphql/graphql-field-config-from-types.ts +557 -0
  46. package/src/rules/graphql/graphql-field-definite-assignment.spec.ts +135 -0
  47. package/src/rules/graphql/graphql-field-definite-assignment.ts +147 -0
  48. package/src/rules/import/import-bullmq.spec.ts +69 -0
  49. package/src/rules/import/import-bullmq.ts +35 -0
  50. package/src/rules/import/import-graphql.spec.ts +65 -0
  51. package/src/rules/import/import-graphql.ts +36 -0
  52. package/src/rules/import/import-mikro-orm.spec.ts +65 -0
  53. package/src/rules/import/import-mikro-orm.ts +36 -0
  54. package/src/rules/index.ts +15 -13
  55. package/src/rules/mikro-orm/entity-field-definite-assignment.spec.ts +91 -0
  56. package/src/rules/mikro-orm/entity-field-definite-assignment.ts +141 -0
  57. package/src/rules/mikro-orm/entity-property-config-from-types.spec.ts +262 -0
  58. package/src/rules/mikro-orm/entity-property-config-from-types.ts +1111 -0
  59. package/src/utils/createRule.ts +3 -1
  60. package/src/utils/decorators.spec.ts +214 -0
  61. package/src/utils/decorators.ts +93 -0
  62. package/src/utils/tester.ts +22 -0
  63. package/tsconfig.build.json +5 -0
  64. package/tsconfig.json +6 -7
  65. package/dist/rules/entity-constructor.js +0 -78
  66. package/dist/rules/entity-constructor.js.map +0 -1
  67. package/dist/rules/entity-property-no-optional-or-non-null-assertion.js +0 -63
  68. package/dist/rules/entity-property-no-optional-or-non-null-assertion.js.map +0 -1
  69. package/dist/rules/entity-property-nullable.js +0 -81
  70. package/dist/rules/entity-property-nullable.js.map +0 -1
  71. package/dist/rules/graphql-field-arguments-match-property-type.js +0 -118
  72. package/dist/rules/graphql-field-arguments-match-property-type.js.map +0 -1
  73. package/dist/rules/graphql-resolver-method-return-type.js +0 -145
  74. package/dist/rules/graphql-resolver-method-return-type.js.map +0 -1
  75. package/dist/tsconfig.tsbuildinfo +0 -1
  76. package/src/rules/entity-constructor.ts +0 -97
  77. package/src/rules/entity-property-no-optional-or-non-null-assertion.ts +0 -81
  78. package/src/rules/entity-property-nullable.ts +0 -112
  79. package/src/rules/graphql-field-arguments-match-property-type.ts +0 -186
  80. package/src/rules/graphql-resolver-method-return-type.ts +0 -207
@@ -1,4 +1,4 @@
1
1
 
2
- > @nest-boot/eslint-plugin@7.0.0-beta.0 build /home/runner/work/nest-boot/nest-boot/packages/eslint-plugin
3
- > tsc
2
+ > @nest-boot/eslint-plugin@7.0.0-beta.2 build /home/runner/work/nest-boot/nest-boot/packages/eslint-plugin
3
+ > tsc -p tsconfig.build.json
4
4
 
package/CHANGELOG.md CHANGED
@@ -1,19 +1,7 @@
1
1
  # @nest-boot/eslint-plugin
2
2
 
3
- ## 7.0.0-beta.0
4
-
5
- ### Major Changes
6
-
7
- - 14895ac: ESLint 升级到 v9
8
-
9
- ## 6.10.2
10
-
11
- ### Patch Changes
12
-
13
- - bcd62cb: fix: Update dependencies across multiple packages to latest versions.
14
-
15
- ## 6.10.1
3
+ ## 7.0.0-beta.2
16
4
 
17
5
  ### Patch Changes
18
6
 
19
- - 8372590: 更新依赖
7
+ - 20f3262: fix: 重构 eslint-plugin 和移除 queue 模块
@@ -0,0 +1,2 @@
1
+ import { rules } from "./rules";
2
+ export { rules };
package/dist/index.js CHANGED
@@ -1,9 +1,6 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.rules = void 0;
7
- const rules_1 = __importDefault(require("./rules"));
8
- exports.rules = rules_1.default;
4
+ const rules_1 = require("./rules");
5
+ Object.defineProperty(exports, "rules", { enumerable: true, get: function () { return rules_1.rules; } });
9
6
  //# 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,oDAA4B;AAEnB,gBAFF,eAAK,CAEE"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mCAAgC;AAEvB,sFAFA,aAAK,OAEA"}
@@ -0,0 +1,6 @@
1
+ export type DecoratorBehavior = "ignore" | "remove";
2
+ export interface Options {
3
+ decorators?: Record<string, DecoratorBehavior>;
4
+ }
5
+ declare const _default: import("@typescript-eslint/utils/ts-eslint").RuleModule<"alignFieldDecoratorWithTsType" | "removeFieldDecorator", [Options], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
6
+ export default _default;
@@ -0,0 +1,417 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_1 = require("@typescript-eslint/utils");
4
+ const createRule_1 = require("../../utils/createRule");
5
+ const decorators_1 = require("../../utils/decorators");
6
+ exports.default = (0, createRule_1.createRule)({
7
+ name: "graphql-field-config-from-types",
8
+ meta: {
9
+ type: "problem",
10
+ docs: {
11
+ description: "根据 TypeScript 类型自动生成或修正 @Field 装饰器的类型与 nullable 配置(支持数组)。",
12
+ },
13
+ fixable: "code",
14
+ schema: [
15
+ {
16
+ type: "object",
17
+ properties: {
18
+ decorators: {
19
+ type: "object",
20
+ additionalProperties: {
21
+ type: "string",
22
+ enum: ["ignore", "remove"],
23
+ },
24
+ description: "配置每个装饰器的行为。ignore: 跳过检查;remove: 移除 @Field。默认:{ HideField: 'remove', OneToOne: 'remove', OneToMany: 'remove', ManyToOne: 'remove', ManyToMany: 'remove' }",
25
+ },
26
+ },
27
+ additionalProperties: false,
28
+ },
29
+ ],
30
+ messages: {
31
+ alignFieldDecoratorWithTsType: "@Field 装饰器应与 TypeScript 类型保持一致(类型与 nullable)。",
32
+ removeFieldDecorator: "属性带有 @{{decoratorName}} 装饰器,应移除 @Field 装饰器。",
33
+ },
34
+ },
35
+ defaultOptions: [
36
+ {
37
+ decorators: {
38
+ HideField: "remove",
39
+ OneToOne: "remove",
40
+ OneToMany: "remove",
41
+ ManyToOne: "remove",
42
+ ManyToMany: "remove",
43
+ },
44
+ },
45
+ ],
46
+ create(context, [options]) {
47
+ const source = context.sourceCode;
48
+ const scalarFromTsKeyword = (typeNodeType) => {
49
+ switch (typeNodeType) {
50
+ case utils_1.AST_NODE_TYPES.TSBooleanKeyword:
51
+ return "Boolean";
52
+ case utils_1.AST_NODE_TYPES.TSStringKeyword:
53
+ return "String";
54
+ case utils_1.AST_NODE_TYPES.TSNumberKeyword:
55
+ // 默认 number → Float(GraphQL 默认也是 Float;Int 需显式声明)
56
+ return "Float";
57
+ default:
58
+ return null;
59
+ }
60
+ };
61
+ const getIdentifierName = (node) => {
62
+ if (node.type === utils_1.AST_NODE_TYPES.TSTypeReference &&
63
+ node.typeName.type === utils_1.AST_NODE_TYPES.Identifier) {
64
+ return node.typeName.name;
65
+ }
66
+ return null;
67
+ };
68
+ const extractArrayElementType = (node) => {
69
+ if (node.type === utils_1.AST_NODE_TYPES.TSArrayType) {
70
+ return node.elementType;
71
+ }
72
+ if (node.type === utils_1.AST_NODE_TYPES.TSTypeReference &&
73
+ node.typeName.type === utils_1.AST_NODE_TYPES.Identifier &&
74
+ node.typeName.name === "Array") {
75
+ return node.typeArguments?.params[0] ?? null;
76
+ }
77
+ return null;
78
+ };
79
+ const computeTypeInfo = (property) => {
80
+ let isNullable = false;
81
+ let isArray = false;
82
+ let baseTypeNode = property.typeAnnotation?.type === utils_1.AST_NODE_TYPES.TSTypeAnnotation
83
+ ? property.typeAnnotation.typeAnnotation
84
+ : null;
85
+ // 可选属性(?)视为可空
86
+ if (property.optional) {
87
+ isNullable = true;
88
+ }
89
+ // 处理联合类型中的 null/undefined
90
+ if (baseTypeNode?.type === utils_1.AST_NODE_TYPES.TSUnionType) {
91
+ const hasNullish = baseTypeNode.types.some((t) => {
92
+ return (t.type === utils_1.AST_NODE_TYPES.TSNullKeyword ||
93
+ t.type === utils_1.AST_NODE_TYPES.TSUndefinedKeyword);
94
+ });
95
+ if (hasNullish)
96
+ isNullable = true;
97
+ baseTypeNode =
98
+ baseTypeNode.types.find((t) => {
99
+ return (t.type !== utils_1.AST_NODE_TYPES.TSNullKeyword &&
100
+ t.type !== utils_1.AST_NODE_TYPES.TSUndefinedKeyword);
101
+ }) ?? null;
102
+ }
103
+ // 先解包 Ref<T> 和 Opt<T> → T,并在内部再次处理 null/undefined
104
+ if (baseTypeNode?.type === utils_1.AST_NODE_TYPES.TSTypeReference &&
105
+ baseTypeNode.typeName.type === utils_1.AST_NODE_TYPES.Identifier &&
106
+ (baseTypeNode.typeName.name === "Ref" ||
107
+ baseTypeNode.typeName.name === "Opt")) {
108
+ let inner = baseTypeNode.typeArguments?.params[0] ?? null;
109
+ if (inner && inner.type === utils_1.AST_NODE_TYPES.TSUnionType) {
110
+ const hasNullish = inner.types.some((t) => {
111
+ return (t.type === utils_1.AST_NODE_TYPES.TSNullKeyword ||
112
+ t.type === utils_1.AST_NODE_TYPES.TSUndefinedKeyword);
113
+ });
114
+ if (hasNullish)
115
+ isNullable = true;
116
+ inner =
117
+ inner.types.find((t) => {
118
+ return (t.type !== utils_1.AST_NODE_TYPES.TSNullKeyword &&
119
+ t.type !== utils_1.AST_NODE_TYPES.TSUndefinedKeyword);
120
+ }) ?? inner;
121
+ }
122
+ baseTypeNode = inner ?? baseTypeNode;
123
+ }
124
+ // 数组类型(T[] 或 Array<T>)- 在解包 Opt/Ref 之后检查
125
+ const elementTypeNode = baseTypeNode
126
+ ? extractArrayElementType(baseTypeNode)
127
+ : null;
128
+ if (elementTypeNode) {
129
+ isArray = true;
130
+ }
131
+ const targetTypeNode = elementTypeNode ?? baseTypeNode;
132
+ // 无显式类型时,尝试从字面量初始值推断
133
+ if (!targetTypeNode) {
134
+ if (property.value?.type === utils_1.AST_NODE_TYPES.Literal) {
135
+ const value = property.value.value;
136
+ const typeOf = typeof value;
137
+ if (typeOf === "boolean")
138
+ return { typeName: "Boolean", isArray, isNullable };
139
+ if (typeOf === "number")
140
+ return { typeName: "Float", isArray, isNullable };
141
+ if (typeOf === "string")
142
+ return { typeName: "String", isArray, isNullable };
143
+ }
144
+ return null;
145
+ }
146
+ // id 字段优先使用 GraphQL 标量 ID
147
+ const propertyName = property.key.type === utils_1.AST_NODE_TYPES.Identifier
148
+ ? property.key.name
149
+ : null;
150
+ if (propertyName === "id" ||
151
+ (typeof propertyName === "string" &&
152
+ (propertyName.endsWith("Id") || propertyName.endsWith("ID")))) {
153
+ return { typeName: "ID", isArray, isNullable };
154
+ }
155
+ // Record<*, *> → GraphQLJSONObject(不限制键值类型)
156
+ if (targetTypeNode.type === utils_1.AST_NODE_TYPES.TSTypeReference &&
157
+ targetTypeNode.typeName.type === utils_1.AST_NODE_TYPES.Identifier &&
158
+ targetTypeNode.typeName.name === "Record") {
159
+ return { typeName: "GraphQLJSONObject", isArray, isNullable };
160
+ }
161
+ // 关键字类型 → GraphQL 标量
162
+ const scalar = scalarFromTsKeyword(targetTypeNode.type);
163
+ if (scalar) {
164
+ return { typeName: scalar, isArray, isNullable };
165
+ }
166
+ // 标识符(类/自定义类型)
167
+ const ident = getIdentifierName(targetTypeNode);
168
+ if (ident) {
169
+ return { typeName: ident, isArray, isNullable };
170
+ }
171
+ return null;
172
+ };
173
+ const ensureScalarImport = (fixes, expected) => {
174
+ if (["Int", "Float", "ID"].includes(expected)) {
175
+ if (!context.sourceCode.text.includes(`import { ${expected} } from "@nestjs/graphql"`)) {
176
+ fixes.push({
177
+ type: "insert",
178
+ range: [0, 0],
179
+ text: `import { ${expected} } from "@nestjs/graphql";\n`,
180
+ });
181
+ }
182
+ }
183
+ };
184
+ const ensureJSONObjectImport = (fixes) => {
185
+ const hasImport = context.sourceCode.text.includes(`from "graphql-type-json"`) &&
186
+ context.sourceCode.text.includes("GraphQLJSONObject");
187
+ if (!hasImport) {
188
+ fixes.push({
189
+ type: "insert",
190
+ range: [0, 0],
191
+ text: `import { GraphQLJSONObject } from "graphql-type-json";\n`,
192
+ });
193
+ }
194
+ };
195
+ const addFieldDecorator = (property, info) => {
196
+ const fixes = [];
197
+ const typeName = info.typeName ?? "";
198
+ const typeExpr = info.isArray
199
+ ? `() => [${typeName}]`
200
+ : `() => ${typeName}`;
201
+ const optionsExpr = info.isNullable ? ", { nullable: true }" : "";
202
+ const newDecoratorText = `@Field(${typeExpr}${optionsExpr})`;
203
+ ensureScalarImport(fixes, info.typeName ?? "");
204
+ if (info.typeName === "GraphQLJSONObject") {
205
+ ensureJSONObjectImport(fixes);
206
+ }
207
+ fixes.push({
208
+ type: "insert",
209
+ range: property.range,
210
+ text: newDecoratorText + "\n ",
211
+ });
212
+ return fixes;
213
+ };
214
+ const fixWithTypeInfo = (property, fieldDecorator, info) => {
215
+ const fixes = [];
216
+ const typeName = info.typeName ?? "";
217
+ const typeExpr = info.isArray
218
+ ? `() => [${typeName}]`
219
+ : `() => ${typeName}`;
220
+ // 提取现有的配置选项(除了 nullable)
221
+ const callExpr = fieldDecorator.expression;
222
+ const existingOptions = [];
223
+ // 检查是否有现有的配置对象
224
+ let optionsArg = null;
225
+ if (callExpr.type === utils_1.AST_NODE_TYPES.CallExpression &&
226
+ callExpr.arguments.length > 0) {
227
+ // 如果第一个参数是对象表达式(没有 type function)
228
+ if (callExpr.arguments[0] &&
229
+ callExpr.arguments[0].type === utils_1.AST_NODE_TYPES.ObjectExpression) {
230
+ optionsArg = callExpr.arguments[0];
231
+ }
232
+ // 如果第二个参数是对象表达式(有 type function)
233
+ else if (callExpr.arguments[1] &&
234
+ callExpr.arguments[1].type === utils_1.AST_NODE_TYPES.ObjectExpression) {
235
+ optionsArg = callExpr.arguments[1];
236
+ }
237
+ }
238
+ // 提取现有选项,同时处理 nullable
239
+ let hasNullableProperty = false;
240
+ if (optionsArg) {
241
+ optionsArg.properties.forEach((prop) => {
242
+ // 处理展开运算符 (SpreadElement)
243
+ if (prop.type === utils_1.AST_NODE_TYPES.SpreadElement) {
244
+ const propText = source.getText(prop);
245
+ existingOptions.push(propText);
246
+ return;
247
+ }
248
+ // 处理普通属性 (Property)
249
+ if (prop.key.type === utils_1.AST_NODE_TYPES.Identifier &&
250
+ prop.key.name === "nullable") {
251
+ hasNullableProperty = true;
252
+ // 根据类型决定是否保留或更新 nullable
253
+ if (info.isNullable) {
254
+ existingOptions.push("nullable: true");
255
+ }
256
+ // 如果不需要 nullable,则跳过(不保留)
257
+ }
258
+ else {
259
+ // 保留原有的其他配置
260
+ const propText = source.getText(prop);
261
+ existingOptions.push(propText);
262
+ }
263
+ });
264
+ }
265
+ // 如果需要 nullable 但原配置中没有,则添加到最前面
266
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
267
+ if (info.isNullable && !hasNullableProperty) {
268
+ existingOptions.unshift("nullable: true");
269
+ }
270
+ // 构建新的装饰器文本
271
+ const optionsExpr = existingOptions.length > 0 ? `, { ${existingOptions.join(", ")} }` : "";
272
+ const newDecoratorText = `@Field(${typeExpr}${optionsExpr})`;
273
+ ensureScalarImport(fixes, info.typeName ?? "");
274
+ if (info.typeName === "GraphQLJSONObject") {
275
+ ensureJSONObjectImport(fixes);
276
+ }
277
+ fixes.push({
278
+ type: "replace",
279
+ range: fieldDecorator.range,
280
+ text: newDecoratorText,
281
+ });
282
+ return fixes;
283
+ };
284
+ const applyFixes = (fixer, fixes) => {
285
+ return fixes.map((fix) => {
286
+ if (fix.type === "replace") {
287
+ return fixer.replaceTextRange(fix.range, fix.text);
288
+ }
289
+ else {
290
+ return fixer.insertTextBeforeRange(fix.range, fix.text);
291
+ }
292
+ });
293
+ };
294
+ const isGraphqlModelClass = (node) => {
295
+ return (0, decorators_1.hasClassDecorator)(node, ["ObjectType", "InputType", "ArgsType"]);
296
+ };
297
+ return {
298
+ ClassDeclaration(node) {
299
+ if (!isGraphqlModelClass(node))
300
+ return;
301
+ node.body.body.forEach((member) => {
302
+ if (member.type !== utils_1.AST_NODE_TYPES.PropertyDefinition)
303
+ return;
304
+ const decoratorConfig = options.decorators ?? {
305
+ HideField: "remove",
306
+ OneToOne: "remove",
307
+ OneToMany: "remove",
308
+ ManyToOne: "remove",
309
+ ManyToMany: "remove",
310
+ };
311
+ // 检查是否有配置的装饰器
312
+ let foundDecoratorName = null;
313
+ let foundBehavior = null;
314
+ for (const decorator of member.decorators) {
315
+ if (decorator.expression.type === utils_1.AST_NODE_TYPES.CallExpression &&
316
+ decorator.expression.callee.type === utils_1.AST_NODE_TYPES.Identifier) {
317
+ const decoratorName = decorator.expression.callee.name;
318
+ if (decoratorName in decoratorConfig) {
319
+ foundDecoratorName = decoratorName;
320
+ foundBehavior = decoratorConfig[decoratorName];
321
+ break;
322
+ }
323
+ }
324
+ }
325
+ // 如果是 ignore 行为,直接跳过
326
+ if (foundBehavior === "ignore")
327
+ return;
328
+ const fieldDecorator = (0, decorators_1.getPropertyDecorator)(member, "Field");
329
+ // 如果是 remove 行为且有 @Field,则移除 @Field
330
+ if (foundBehavior === "remove" && fieldDecorator) {
331
+ context.report({
332
+ node: fieldDecorator,
333
+ messageId: "removeFieldDecorator",
334
+ data: {
335
+ decoratorName: foundDecoratorName ?? "unknown",
336
+ },
337
+ fix: (fixer) => {
338
+ // 移除整个装饰器行(包括换行)
339
+ const decoratorStart = fieldDecorator.range[0];
340
+ const decoratorEnd = fieldDecorator.range[1];
341
+ // 查找装饰器后的换行符和空格
342
+ const textAfter = source.text.slice(decoratorEnd, decoratorEnd + 10);
343
+ const matchNewline = /^(\r?\n\s*)/.exec(textAfter);
344
+ const endPos = matchNewline
345
+ ? decoratorEnd + matchNewline[0].length
346
+ : decoratorEnd;
347
+ return fixer.removeRange([decoratorStart, endPos]);
348
+ },
349
+ });
350
+ return;
351
+ }
352
+ // 如果是 remove 行为但没有 @Field,跳过
353
+ if (foundBehavior === "remove")
354
+ return;
355
+ const typeInfo = computeTypeInfo(member);
356
+ if (!typeInfo?.typeName)
357
+ return;
358
+ // 如果没有 @Field 装饰器,添加它
359
+ if (!fieldDecorator) {
360
+ context.report({
361
+ node: member,
362
+ messageId: "alignFieldDecoratorWithTsType",
363
+ fix: (fixer) => {
364
+ const fixes = addFieldDecorator(member, typeInfo);
365
+ return applyFixes(fixer, fixes);
366
+ },
367
+ });
368
+ return;
369
+ }
370
+ // 若已有 ArrowFunction 但与期望不一致,也进行修正
371
+ const callExpr = fieldDecorator.expression;
372
+ if (callExpr.type !== utils_1.AST_NODE_TYPES.CallExpression)
373
+ return;
374
+ let needReport = true;
375
+ if (callExpr.arguments.length > 0 &&
376
+ callExpr.arguments[0].type ===
377
+ utils_1.AST_NODE_TYPES.ArrowFunctionExpression) {
378
+ const firstArg = callExpr.arguments[0];
379
+ const calleeText = source.getText(firstArg.body);
380
+ const expectedTypeText = typeInfo.isArray
381
+ ? `[${typeInfo.typeName}]`
382
+ : typeInfo.typeName;
383
+ const hasNullableOption = callExpr.arguments.length > 1 &&
384
+ callExpr.arguments[1].type === utils_1.AST_NODE_TYPES.ObjectExpression &&
385
+ callExpr.arguments[1].properties.some((prop) => {
386
+ return (prop.type === utils_1.AST_NODE_TYPES.Property &&
387
+ prop.key.type === utils_1.AST_NODE_TYPES.Identifier &&
388
+ prop.key.name === "nullable" &&
389
+ prop.value.type === utils_1.AST_NODE_TYPES.Literal &&
390
+ prop.value.value === true);
391
+ });
392
+ // 对于 number 类型,Int 和 Float 都是合法的
393
+ const isNumberType = typeInfo.typeName === "Float";
394
+ const actualTypeText = calleeText.replace(/^\[|\]$/g, ""); // 移除数组括号
395
+ const isValidNumberType = isNumberType &&
396
+ (actualTypeText === "Int" || actualTypeText === "Float");
397
+ const typeMatches = calleeText === expectedTypeText || isValidNumberType;
398
+ if (typeMatches && hasNullableOption === typeInfo.isNullable) {
399
+ needReport = false;
400
+ }
401
+ }
402
+ if (!needReport)
403
+ return;
404
+ context.report({
405
+ node: member,
406
+ messageId: "alignFieldDecoratorWithTsType",
407
+ fix: (fixer) => {
408
+ const fixes = fixWithTypeInfo(member, fieldDecorator, typeInfo);
409
+ return applyFixes(fixer, fixes);
410
+ },
411
+ });
412
+ });
413
+ },
414
+ };
415
+ },
416
+ });
417
+ //# sourceMappingURL=graphql-field-config-from-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql-field-config-from-types.js","sourceRoot":"","sources":["../../../src/rules/graphql/graphql-field-config-from-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ declare const _default: import("@typescript-eslint/utils/ts-eslint").RuleModule<"addDefiniteAssignment" | "removeDefiniteAssignment", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
2
+ export default _default;
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_1 = require("@typescript-eslint/utils");
4
+ const createRule_1 = require("../../utils/createRule");
5
+ const decorators_1 = require("../../utils/decorators");
6
+ exports.default = (0, createRule_1.createRule)({
7
+ name: "graphql-field-definite-assignment",
8
+ meta: {
9
+ type: "problem",
10
+ docs: {
11
+ description: "确保 GraphQL @Field 装饰器的属性正确使用 definite assignment assertion (!)。没有初始化值的属性应添加 !,有初始化值的属性应移除 !。",
12
+ },
13
+ fixable: "code",
14
+ schema: [],
15
+ messages: {
16
+ addDefiniteAssignment: "属性 '{{propertyName}}' 使用了 @Field 装饰器但没有初始化值,应添加 definite assignment assertion (!)。",
17
+ removeDefiniteAssignment: "属性 '{{propertyName}}' 使用了 @Field 装饰器且有初始化值,应移除 definite assignment assertion (!)。",
18
+ },
19
+ },
20
+ defaultOptions: [],
21
+ create(context) {
22
+ const source = context.sourceCode;
23
+ const isGraphqlModelClass = (node) => {
24
+ return (0, decorators_1.hasClassDecorator)(node, ["ObjectType", "InputType", "ArgsType"]);
25
+ };
26
+ const getPropertyName = (member) => {
27
+ if (member.key.type === utils_1.AST_NODE_TYPES.Identifier) {
28
+ return member.key.name;
29
+ }
30
+ return null;
31
+ };
32
+ const hasInitializer = (member) => {
33
+ return !!member.value;
34
+ };
35
+ const hasDefiniteAssignment = (member) => {
36
+ return member.definite;
37
+ };
38
+ const isOptionalProperty = (member) => {
39
+ // 检查 AST 节点的 optional 标记
40
+ if (member.optional)
41
+ return true;
42
+ // 检查源代码中是否有 ? 符号(在属性名和冒号之间)
43
+ const keyEnd = member.key.range[1];
44
+ const text = source.text;
45
+ for (let i = keyEnd; i < member.range[1]; i++) {
46
+ if (text[i] === "?")
47
+ return true;
48
+ if (text[i] === ":" || text[i] === "!")
49
+ break;
50
+ }
51
+ return false;
52
+ };
53
+ return {
54
+ ClassDeclaration(node) {
55
+ if (!isGraphqlModelClass(node))
56
+ return;
57
+ node.body.body.forEach((member) => {
58
+ if (member.type !== utils_1.AST_NODE_TYPES.PropertyDefinition)
59
+ return;
60
+ if (!(0, decorators_1.hasPropertyDecorator)(member, "Field"))
61
+ return;
62
+ const propertyName = getPropertyName(member);
63
+ if (!propertyName)
64
+ return;
65
+ // 可选属性(?:)不需要 definite assignment assertion
66
+ if (isOptionalProperty(member))
67
+ return;
68
+ const hasInit = hasInitializer(member);
69
+ const hasDefinite = hasDefiniteAssignment(member);
70
+ // 情况1: 没有初始化值,但也没有 definite assignment assertion
71
+ if (!hasInit && !hasDefinite) {
72
+ context.report({
73
+ node: member,
74
+ messageId: "addDefiniteAssignment",
75
+ data: {
76
+ propertyName,
77
+ },
78
+ fix: (fixer) => {
79
+ // 找到属性名称的结束位置
80
+ const keyEnd = member.key.range[1];
81
+ // 在属性名称后添加 !
82
+ return fixer.insertTextAfterRange([keyEnd, keyEnd], "!");
83
+ },
84
+ });
85
+ }
86
+ // 情况2: 有初始化值,但也有 definite assignment assertion
87
+ if (hasInit && hasDefinite) {
88
+ context.report({
89
+ node: member,
90
+ messageId: "removeDefiniteAssignment",
91
+ data: {
92
+ propertyName,
93
+ },
94
+ fix: (fixer) => {
95
+ // 找到 ! 的位置并移除
96
+ const keyEnd = member.key.range[1];
97
+ const text = source.text;
98
+ // 查找 ! 的位置(在属性名称和冒号之间)
99
+ let exclamationPos = -1;
100
+ for (let i = keyEnd; i < member.range[1]; i++) {
101
+ if (text[i] === "!") {
102
+ exclamationPos = i;
103
+ break;
104
+ }
105
+ // 如果遇到冒号,说明没有 !
106
+ if (text[i] === ":") {
107
+ break;
108
+ }
109
+ }
110
+ if (exclamationPos !== -1) {
111
+ return fixer.removeRange([
112
+ exclamationPos,
113
+ exclamationPos + 1,
114
+ ]);
115
+ }
116
+ return null;
117
+ },
118
+ });
119
+ }
120
+ });
121
+ },
122
+ };
123
+ },
124
+ });
125
+ //# sourceMappingURL=graphql-field-definite-assignment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql-field-definite-assignment.js","sourceRoot":"","sources":["../../../src/rules/graphql/graphql-field-definite-assignment.ts"],"names":[],"mappings":";;AAAA,oDAAoE;AAEpE,uDAAoD;AACpD,uDAGgC;AAEhC,kBAAe,IAAA,uBAAU,EAGvB;IACA,IAAI,EAAE,mCAAmC;IACzC,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EACT,8FAA8F;SACjG;QACD,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,qBAAqB,EACnB,oFAAoF;YACtF,wBAAwB,EACtB,mFAAmF;SACtF;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;QAElC,MAAM,mBAAmB,GAAG,CAAC,IAA+B,EAAW,EAAE;YACvE,OAAO,IAAA,8BAAiB,EAAC,IAAI,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;QAC1E,CAAC,CAAC;QAEF,MAAM,eAAe,GAAG,CACtB,MAAmC,EACpB,EAAE;YACjB,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,sBAAc,CAAC,UAAU,EAAE,CAAC;gBAClD,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YACzB,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QAEF,MAAM,cAAc,GAAG,CAAC,MAAmC,EAAW,EAAE;YACtE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QACxB,CAAC,CAAC;QAEF,MAAM,qBAAqB,GAAG,CAC5B,MAAmC,EAC1B,EAAE;YACX,OAAO,MAAM,CAAC,QAAQ,CAAC;QACzB,CAAC,CAAC;QAEF,MAAM,kBAAkB,GAAG,CACzB,MAAmC,EAC1B,EAAE;YACX,yBAAyB;YACzB,IAAI,MAAM,CAAC,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAEjC,4BAA4B;YAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACzB,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9C,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;oBAAE,OAAO,IAAI,CAAC;gBACjC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;oBAAE,MAAM;YAChD,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEF,OAAO;YACL,gBAAgB,CAAC,IAAI;gBACnB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;oBAAE,OAAO;gBAEvC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAA6B,EAAE,EAAE;oBACvD,IAAI,MAAM,CAAC,IAAI,KAAK,sBAAc,CAAC,kBAAkB;wBAAE,OAAO;oBAC9D,IAAI,CAAC,IAAA,iCAAoB,EAAC,MAAM,EAAE,OAAO,CAAC;wBAAE,OAAO;oBAEnD,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;oBAC7C,IAAI,CAAC,YAAY;wBAAE,OAAO;oBAE1B,4CAA4C;oBAC5C,IAAI,kBAAkB,CAAC,MAAM,CAAC;wBAAE,OAAO;oBAEvC,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;oBACvC,MAAM,WAAW,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;oBAElD,iDAAiD;oBACjD,IAAI,CAAC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;wBAC7B,OAAO,CAAC,MAAM,CAAC;4BACb,IAAI,EAAE,MAAM;4BACZ,SAAS,EAAE,uBAAuB;4BAClC,IAAI,EAAE;gCACJ,YAAY;6BACb;4BACD,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE;gCACb,cAAc;gCACd,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gCACnC,aAAa;gCACb,OAAO,KAAK,CAAC,oBAAoB,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;4BAC3D,CAAC;yBACF,CAAC,CAAC;oBACL,CAAC;oBAED,+CAA+C;oBAC/C,IAAI,OAAO,IAAI,WAAW,EAAE,CAAC;wBAC3B,OAAO,CAAC,MAAM,CAAC;4BACb,IAAI,EAAE,MAAM;4BACZ,SAAS,EAAE,0BAA0B;4BACrC,IAAI,EAAE;gCACJ,YAAY;6BACb;4BACD,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE;gCACb,cAAc;gCACd,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gCACnC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;gCAEzB,uBAAuB;gCACvB,IAAI,cAAc,GAAG,CAAC,CAAC,CAAC;gCACxB,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oCAC9C,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;wCACpB,cAAc,GAAG,CAAC,CAAC;wCACnB,MAAM;oCACR,CAAC;oCACD,gBAAgB;oCAChB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;wCACpB,MAAM;oCACR,CAAC;gCACH,CAAC;gCAED,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;oCAC1B,OAAO,KAAK,CAAC,WAAW,CAAC;wCACvB,cAAc;wCACd,cAAc,GAAG,CAAC;qCACnB,CAAC,CAAC;gCACL,CAAC;gCACD,OAAO,IAAI,CAAC;4BACd,CAAC;yBACF,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ declare const _default: import("@typescript-eslint/utils/ts-eslint").RuleModule<"replaceBullmqImport", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
2
+ export default _default;