@flint.fyi/plugin-flint 0.7.0 → 0.8.1

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 (2) hide show
  1. package/dist/index.mjs +66 -65
  2. package/package.json +10 -9
package/dist/index.mjs CHANGED
@@ -755,6 +755,71 @@ function isVolarReportSourceCodeCall(node, typeChecker) {
755
755
  if (node.expression.kind === SyntaxKind.PropertyAccessExpression && node.expression.expression.kind === SyntaxKind.Identifier && node.expression.name.text === "reportSourceCode") return typeChecker.getSymbolAtLocation(node.expression.expression)?.getDeclarations()?.some((declaration) => declaration.kind === SyntaxKind.NamespaceImport && isImportedBindingFromModule(declaration, volarLanguagePackageName)) ?? false;
756
756
  return false;
757
757
  }
758
+ var unusedMessageIds_default = ruleCreator.createRule(typescriptLanguage, {
759
+ about: {
760
+ description: "Reports message IDs defined in the messages object that are never used in recognized report calls.",
761
+ id: "unusedMessageIds",
762
+ presets: ["logical"]
763
+ },
764
+ messages: { unusedMessageIds: {
765
+ primary: "Message ID '{{ messageId }}' is defined but never used.",
766
+ secondary: ["This message ID is declared in the messages object but is not referenced in any `context.report()` or built-in Flint report helper call.", "Remove unused message IDs to keep the rule configuration clean and maintainable."],
767
+ suggestions: ["Remove the unused message ID from the messages object."]
768
+ } },
769
+ setup(context) {
770
+ const unusedMessageIds = /* @__PURE__ */ new Map();
771
+ function collectMessageIds(node, sourceFile) {
772
+ const args = node.arguments[1];
773
+ if (args?.kind !== SyntaxKind.ObjectLiteralExpression) return;
774
+ const messagesProperty = findProperty(args.properties, "messages", (node) => node.kind === SyntaxKind.ObjectLiteralExpression);
775
+ if (!messagesProperty) return;
776
+ for (const prop of messagesProperty.properties) {
777
+ if (prop.kind !== SyntaxKind.PropertyAssignment || prop.name.kind !== SyntaxKind.Identifier) continue;
778
+ const messageId = prop.name.text;
779
+ if (!unusedMessageIds.has(messageId)) unusedMessageIds.set(messageId, getTSNodeRange(prop.name, sourceFile));
780
+ }
781
+ }
782
+ function detectMessageIdUsage(node, reportArgumentIndex) {
783
+ if (!unusedMessageIds.size) return;
784
+ const args = node.arguments[reportArgumentIndex];
785
+ if (args?.kind !== SyntaxKind.ObjectLiteralExpression) {
786
+ unusedMessageIds.clear();
787
+ return;
788
+ }
789
+ const messageProperty = findProperty(args.properties, "message", (node) => node.kind === SyntaxKind.StringLiteral);
790
+ if (!messageProperty) {
791
+ unusedMessageIds.clear();
792
+ return;
793
+ }
794
+ unusedMessageIds.delete(messageProperty.text);
795
+ }
796
+ return { visitors: {
797
+ CallExpression(node, { sourceFile, typeChecker }) {
798
+ if (isRuleCreatorCreateRule(node, typeChecker)) {
799
+ collectMessageIds(node, sourceFile);
800
+ return;
801
+ }
802
+ if (isRuleContextReport(node, typeChecker)) {
803
+ detectMessageIdUsage(node, 0);
804
+ return;
805
+ }
806
+ if (isVolarReportSourceCodeCall(node, typeChecker)) {
807
+ detectMessageIdUsage(node, 1);
808
+ return;
809
+ }
810
+ },
811
+ "SourceFile:exit"() {
812
+ if (!unusedMessageIds.size) return;
813
+ for (const [messageId, range] of unusedMessageIds) context.report({
814
+ data: { messageId },
815
+ message: "unusedMessageIds",
816
+ range
817
+ });
818
+ unusedMessageIds.clear();
819
+ }
820
+ } };
821
+ }
822
+ });
758
823
  //#endregion
759
824
  //#region src/plugin.ts
760
825
  const flint = createPlugin({
@@ -772,71 +837,7 @@ const flint = createPlugin({
772
837
  testCaseNonStaticCode_default,
773
838
  testCaseOnlyFlags_default,
774
839
  testShorthands_default,
775
- ruleCreator.createRule(typescriptLanguage, {
776
- about: {
777
- description: "Reports message IDs defined in the messages object that are never used in recognized report calls.",
778
- id: "unusedMessageIds",
779
- presets: ["logical"]
780
- },
781
- messages: { unusedMessageIds: {
782
- primary: "Message ID '{{ messageId }}' is defined but never used.",
783
- secondary: ["This message ID is declared in the messages object but is not referenced in any `context.report()` or built-in Flint report helper call.", "Remove unused message IDs to keep the rule configuration clean and maintainable."],
784
- suggestions: ["Remove the unused message ID from the messages object."]
785
- } },
786
- setup(context) {
787
- const unusedMessageIds = /* @__PURE__ */ new Map();
788
- function collectMessageIds(node, sourceFile) {
789
- const args = node.arguments[1];
790
- if (args?.kind !== SyntaxKind.ObjectLiteralExpression) return;
791
- const messagesProperty = findProperty(args.properties, "messages", (node) => node.kind === SyntaxKind.ObjectLiteralExpression);
792
- if (!messagesProperty) return;
793
- for (const prop of messagesProperty.properties) {
794
- if (prop.kind !== SyntaxKind.PropertyAssignment || prop.name.kind !== SyntaxKind.Identifier) continue;
795
- const messageId = prop.name.text;
796
- if (!unusedMessageIds.has(messageId)) unusedMessageIds.set(messageId, getTSNodeRange(prop.name, sourceFile));
797
- }
798
- }
799
- function detectMessageIdUsage(node, reportArgumentIndex) {
800
- if (!unusedMessageIds.size) return;
801
- const args = node.arguments[reportArgumentIndex];
802
- if (args?.kind !== SyntaxKind.ObjectLiteralExpression) {
803
- unusedMessageIds.clear();
804
- return;
805
- }
806
- const messageProperty = findProperty(args.properties, "message", (node) => node.kind === SyntaxKind.StringLiteral);
807
- if (!messageProperty) {
808
- unusedMessageIds.clear();
809
- return;
810
- }
811
- unusedMessageIds.delete(messageProperty.text);
812
- }
813
- return { visitors: {
814
- CallExpression(node, { sourceFile, typeChecker }) {
815
- if (isRuleCreatorCreateRule(node, typeChecker)) {
816
- collectMessageIds(node, sourceFile);
817
- return;
818
- }
819
- if (isRuleContextReport(node, typeChecker)) {
820
- detectMessageIdUsage(node, 0);
821
- return;
822
- }
823
- if (isVolarReportSourceCodeCall(node, typeChecker)) {
824
- detectMessageIdUsage(node, 1);
825
- return;
826
- }
827
- },
828
- "SourceFile:exit"() {
829
- if (!unusedMessageIds.size) return;
830
- for (const [messageId, range] of unusedMessageIds) context.report({
831
- data: { messageId },
832
- message: "unusedMessageIds",
833
- range
834
- });
835
- unusedMessageIds.clear();
836
- }
837
- } };
838
- }
839
- })
840
+ unusedMessageIds_default
840
841
  ]
841
842
  });
842
843
  //#endregion
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flint.fyi/plugin-flint",
3
- "version": "0.7.0",
3
+ "version": "0.8.1",
4
4
  "description": "[Experimental] A Flint plugin for linting Flint plugins.",
5
5
  "homepage": "https://flint.fyi/rules/flint",
6
6
  "repository": {
@@ -22,19 +22,20 @@
22
22
  "dist/"
23
23
  ],
24
24
  "dependencies": {
25
- "typescript": "^6.0.0",
26
- "@flint.fyi/core": "^0.24.0",
27
- "@flint.fyi/typescript-language": "^0.19.0",
28
- "@flint.fyi/utils": "^0.15.0"
25
+ "@flint.fyi/core": "^0.26.0",
26
+ "@flint.fyi/typescript-language": "^0.20.1",
27
+ "@flint.fyi/utils": "^0.16.0",
28
+ "typescript": "^6.0.0"
29
29
  },
30
30
  "devDependencies": {
31
- "tsdown": "0.22.3",
32
- "vitest": "4.1.0",
33
31
  "@flint.fyi/build": "^0.1.0",
34
- "@flint.fyi/rule-tester": "^0.17.0"
32
+ "@flint.fyi/rule-tester": "^0.19.1",
33
+ "@flint.fyi/volar-language": "^0.3.1",
34
+ "tsdown": "0.22.14",
35
+ "vitest": "4.1.11"
35
36
  },
36
37
  "engines": {
37
- "node": ">=24.0.0"
38
+ "node": ">=26.1.0"
38
39
  },
39
40
  "publishConfig": {
40
41
  "access": "public"