eslint-plugin-tmdr-nuxt 1.0.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.

Potentially problematic release.


This version of eslint-plugin-tmdr-nuxt might be problematic. Click here for more details.

Files changed (106) hide show
  1. package/README.md +75 -0
  2. package/dist/configs/recommended.d.ts +4 -0
  3. package/dist/configs/recommended.d.ts.map +1 -0
  4. package/dist/configs/recommended.js +24 -0
  5. package/dist/configs/recommended.js.map +1 -0
  6. package/dist/configs/trial.d.ts +4 -0
  7. package/dist/configs/trial.d.ts.map +1 -0
  8. package/dist/configs/trial.js +24 -0
  9. package/dist/configs/trial.js.map +1 -0
  10. package/dist/index.d.ts +7 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +20 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/rules/async-data-top-level.d.ts +4 -0
  15. package/dist/rules/async-data-top-level.d.ts.map +1 -0
  16. package/dist/rules/async-data-top-level.js +62 -0
  17. package/dist/rules/async-data-top-level.js.map +1 -0
  18. package/dist/rules/emits-interface-name.d.ts +6 -0
  19. package/dist/rules/emits-interface-name.d.ts.map +1 -0
  20. package/dist/rules/emits-interface-name.js +12 -0
  21. package/dist/rules/emits-interface-name.js.map +1 -0
  22. package/dist/rules/enforce-component-directory-structure.d.ts +7 -0
  23. package/dist/rules/enforce-component-directory-structure.d.ts.map +1 -0
  24. package/dist/rules/enforce-component-directory-structure.js +174 -0
  25. package/dist/rules/enforce-component-directory-structure.js.map +1 -0
  26. package/dist/rules/index.d.ts +3 -0
  27. package/dist/rules/index.d.ts.map +1 -0
  28. package/dist/rules/index.js +38 -0
  29. package/dist/rules/index.js.map +1 -0
  30. package/dist/rules/no-async-data-outside-setup.d.ts +4 -0
  31. package/dist/rules/no-async-data-outside-setup.d.ts.map +1 -0
  32. package/dist/rules/no-async-data-outside-setup.js +49 -0
  33. package/dist/rules/no-async-data-outside-setup.js.map +1 -0
  34. package/dist/rules/no-composable-in-class.d.ts +7 -0
  35. package/dist/rules/no-composable-in-class.d.ts.map +1 -0
  36. package/dist/rules/no-composable-in-class.js +69 -0
  37. package/dist/rules/no-composable-in-class.js.map +1 -0
  38. package/dist/rules/no-direct-any-in-emits.d.ts +6 -0
  39. package/dist/rules/no-direct-any-in-emits.d.ts.map +1 -0
  40. package/dist/rules/no-direct-any-in-emits.js +12 -0
  41. package/dist/rules/no-direct-any-in-emits.js.map +1 -0
  42. package/dist/rules/no-direct-any-in-props.d.ts +6 -0
  43. package/dist/rules/no-direct-any-in-props.d.ts.map +1 -0
  44. package/dist/rules/no-direct-any-in-props.js +12 -0
  45. package/dist/rules/no-direct-any-in-props.js.map +1 -0
  46. package/dist/rules/no-direct-api-call-in-component.d.ts +4 -0
  47. package/dist/rules/no-direct-api-call-in-component.d.ts.map +1 -0
  48. package/dist/rules/no-direct-api-call-in-component.js +42 -0
  49. package/dist/rules/no-direct-api-call-in-component.js.map +1 -0
  50. package/dist/rules/no-inline-emits-definition.d.ts +4 -0
  51. package/dist/rules/no-inline-emits-definition.d.ts.map +1 -0
  52. package/dist/rules/no-inline-emits-definition.js +16 -0
  53. package/dist/rules/no-inline-emits-definition.js.map +1 -0
  54. package/dist/rules/no-inline-props-definition.d.ts +4 -0
  55. package/dist/rules/no-inline-props-definition.d.ts.map +1 -0
  56. package/dist/rules/no-inline-props-definition.js +16 -0
  57. package/dist/rules/no-inline-props-definition.js.map +1 -0
  58. package/dist/rules/no-manual-repository-import.d.ts +12 -0
  59. package/dist/rules/no-manual-repository-import.d.ts.map +1 -0
  60. package/dist/rules/no-manual-repository-import.js +80 -0
  61. package/dist/rules/no-manual-repository-import.js.map +1 -0
  62. package/dist/rules/props-interface-name.d.ts +6 -0
  63. package/dist/rules/props-interface-name.d.ts.map +1 -0
  64. package/dist/rules/props-interface-name.js +12 -0
  65. package/dist/rules/props-interface-name.js.map +1 -0
  66. package/dist/rules/require-pinia-composition-api.d.ts +4 -0
  67. package/dist/rules/require-pinia-composition-api.d.ts.map +1 -0
  68. package/dist/rules/require-pinia-composition-api.js +40 -0
  69. package/dist/rules/require-pinia-composition-api.js.map +1 -0
  70. package/dist/rules/require-typed-emits-signature.d.ts +6 -0
  71. package/dist/rules/require-typed-emits-signature.d.ts.map +1 -0
  72. package/dist/rules/require-typed-emits-signature.js +58 -0
  73. package/dist/rules/require-typed-emits-signature.js.map +1 -0
  74. package/dist/rules/require-typed-repository.d.ts +6 -0
  75. package/dist/rules/require-typed-repository.d.ts.map +1 -0
  76. package/dist/rules/require-typed-repository.js +180 -0
  77. package/dist/rules/require-typed-repository.js.map +1 -0
  78. package/dist/rules/require-typescript-interface-props.d.ts +4 -0
  79. package/dist/rules/require-typescript-interface-props.d.ts.map +1 -0
  80. package/dist/rules/require-typescript-interface-props.js +49 -0
  81. package/dist/rules/require-typescript-interface-props.js.map +1 -0
  82. package/dist/utils/ast.d.ts +4 -0
  83. package/dist/utils/ast.d.ts.map +1 -0
  84. package/dist/utils/ast.js +37 -0
  85. package/dist/utils/ast.js.map +1 -0
  86. package/dist/utils/define-macro-rule.d.ts +43 -0
  87. package/dist/utils/define-macro-rule.d.ts.map +1 -0
  88. package/dist/utils/define-macro-rule.js +230 -0
  89. package/dist/utils/define-macro-rule.js.map +1 -0
  90. package/dist/utils/filename.d.ts +5 -0
  91. package/dist/utils/filename.d.ts.map +1 -0
  92. package/dist/utils/filename.js +63 -0
  93. package/dist/utils/filename.js.map +1 -0
  94. package/dist/utils/formattter.d.ts +3 -0
  95. package/dist/utils/formattter.d.ts.map +1 -0
  96. package/dist/utils/formattter.js +18 -0
  97. package/dist/utils/formattter.js.map +1 -0
  98. package/dist/utils/rule.d.ts +18 -0
  99. package/dist/utils/rule.d.ts.map +1 -0
  100. package/dist/utils/rule.js +21 -0
  101. package/dist/utils/rule.js.map +1 -0
  102. package/dist/utils/tester.d.ts +3 -0
  103. package/dist/utils/tester.d.ts.map +1 -0
  104. package/dist/utils/tester.js +19 -0
  105. package/dist/utils/tester.js.map +1 -0
  106. package/package.json +49 -0
package/README.md ADDED
@@ -0,0 +1,75 @@
1
+ # Timedoor ESLint Plugin
2
+
3
+ `eslint-plugin-tmdr-nuxt` is an ESLint plugin designed for the Timedoor Frontend Team. It enforces **Nuxt.js best practices**, **TypeScript conventions**, and **directory structure** standards in Nuxt 3 projects.
4
+
5
+ There is also a ready-to-use shared config, [`eslint-config-tmdr-nuxt`](./eslint-config), that bundles this plugin alongside other recommended plugins.
6
+
7
+ ## Installation
8
+
9
+ ### Plugin only
10
+
11
+ ```bash
12
+ npm install --save-dev eslint-plugin-tmdr-nuxt
13
+ # or
14
+ pnpm add -D eslint-plugin-tmdr-nuxt
15
+ # or
16
+ yarn add -D eslint-plugin-tmdr-nuxt
17
+ ```
18
+
19
+ ### Shared config (recommended)
20
+
21
+ The shared config includes `eslint-plugin-tmdr-nuxt` plus a curated set of other ESLint plugins. See the [ESLint Config](https://timedoor-eslint-plugin-nuxt.vercel.app/eslint-config) page for full details.
22
+
23
+ ## Usage
24
+
25
+ ### Flat Config (`eslint.config.mjs`)
26
+
27
+ ```js
28
+ import pluginTmdrNuxt from 'eslint-plugin-tmdr-nuxt'
29
+
30
+ export default [
31
+ {
32
+ plugins: {
33
+ 'tmdr-nuxt': pluginTmdrNuxt,
34
+ },
35
+ rules: {
36
+ 'tmdr-nuxt/no-composable-in-class': 'error',
37
+ 'tmdr-nuxt/async-data-top-level': 'error',
38
+ // ... add more rules
39
+ },
40
+ },
41
+ ]
42
+ ```
43
+
44
+ Or use the built-in `recommended` config to enable all rules at once:
45
+
46
+ ```js
47
+ import pluginTmdrNuxt from 'eslint-plugin-tmdr-nuxt'
48
+
49
+ export default [
50
+ {
51
+ plugins: { 'tmdr-nuxt': pluginTmdrNuxt },
52
+ ...pluginTmdrNuxt.configs.recommended,
53
+ },
54
+ ]
55
+ ```
56
+
57
+ ### Legacy Config (`.eslintrc`)
58
+
59
+ ```json
60
+ {
61
+ "plugins": ["tmdr-nuxt"],
62
+ "rules": {
63
+ "tmdr-nuxt/no-composable-in-class": "error",
64
+ "tmdr-nuxt/async-data-top-level": "error"
65
+ }
66
+ }
67
+ ```
68
+
69
+ Or extend the `recommended` config:
70
+
71
+ ```json
72
+ {
73
+ "extends": ["plugin:tmdr-nuxt/recommended"]
74
+ }
75
+ ```
@@ -0,0 +1,4 @@
1
+ import { Linter } from "eslint";
2
+ declare const config: Linter.Config;
3
+ export default config;
4
+ //# sourceMappingURL=recommended.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommended.d.ts","sourceRoot":"","sources":["../../src/configs/recommended.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,QAAA,MAAM,MAAM,EAAE,MAAM,CAAC,MAmBpB,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const config = {
4
+ rules: {
5
+ "tmdr-nuxt/enforce-component-directory-structure": "error",
6
+ "tmdr-nuxt/require-typescript-interface-props": "error",
7
+ "tmdr-nuxt/no-direct-any-in-props": "error",
8
+ "tmdr-nuxt/no-inline-props-definition": "error",
9
+ "tmdr-nuxt/props-interface-name": "error",
10
+ "tmdr-nuxt/require-typed-emits-signature": "error",
11
+ "tmdr-nuxt/no-direct-any-in-emits": "error",
12
+ "tmdr-nuxt/no-inline-emits-definition": "error",
13
+ "tmdr-nuxt/emits-interface-name": "error",
14
+ "tmdr-nuxt/no-composable-in-class": "error",
15
+ "tmdr-nuxt/async-data-top-level": "error",
16
+ "tmdr-nuxt/no-async-data-outside-setup": "error",
17
+ "tmdr-nuxt/no-direct-api-call-in-component": "error",
18
+ "tmdr-nuxt/no-manual-repository-import": "error",
19
+ "tmdr-nuxt/require-typed-repository": "error",
20
+ "tmdr-nuxt/require-pinia-composition-api": "error",
21
+ },
22
+ };
23
+ exports.default = config;
24
+ //# sourceMappingURL=recommended.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommended.js","sourceRoot":"","sources":["../../src/configs/recommended.ts"],"names":[],"mappings":";;AAEA,MAAM,MAAM,GAAkB;IAC5B,KAAK,EAAE;QACL,iDAAiD,EAAE,OAAO;QAC1D,8CAA8C,EAAE,OAAO;QACvD,kCAAkC,EAAE,OAAO;QAC3C,sCAAsC,EAAE,OAAO;QAC/C,gCAAgC,EAAE,OAAO;QACzC,yCAAyC,EAAE,OAAO;QAClD,kCAAkC,EAAE,OAAO;QAC3C,sCAAsC,EAAE,OAAO;QAC/C,gCAAgC,EAAE,OAAO;QACzC,kCAAkC,EAAE,OAAO;QAC3C,gCAAgC,EAAE,OAAO;QACzC,uCAAuC,EAAE,OAAO;QAChD,2CAA2C,EAAE,OAAO;QACpD,uCAAuC,EAAE,OAAO;QAChD,oCAAoC,EAAE,OAAO;QAC7C,yCAAyC,EAAE,OAAO;KACnD;CACF,CAAC;AAEF,kBAAe,MAAM,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Linter } from "eslint";
2
+ declare const config: Linter.Config;
3
+ export default config;
4
+ //# sourceMappingURL=trial.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trial.d.ts","sourceRoot":"","sources":["../../src/configs/trial.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,QAAA,MAAM,MAAM,EAAE,MAAM,CAAC,MAmBpB,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const config = {
4
+ rules: {
5
+ "tmdr-nuxt/enforce-component-directory-structure": "warn",
6
+ "tmdr-nuxt/require-typescript-interface-props": "warn",
7
+ "tmdr-nuxt/no-direct-any-in-props": "warn",
8
+ "tmdr-nuxt/no-inline-props-definition": "warn",
9
+ "tmdr-nuxt/props-interface-name": "warn",
10
+ "tmdr-nuxt/require-typed-emits-signature": "warn",
11
+ "tmdr-nuxt/no-direct-any-in-emits": "warn",
12
+ "tmdr-nuxt/no-inline-emits-definition": "warn",
13
+ "tmdr-nuxt/emits-interface-name": "warn",
14
+ "tmdr-nuxt/no-composable-in-class": "warn",
15
+ "tmdr-nuxt/async-data-top-level": "warn",
16
+ "tmdr-nuxt/no-async-data-outside-setup": "warn",
17
+ "tmdr-nuxt/no-direct-api-call-in-component": "warn",
18
+ "tmdr-nuxt/no-manual-repository-import": "warn",
19
+ "tmdr-nuxt/require-typed-repository": "warn",
20
+ "tmdr-nuxt/require-pinia-composition-api": "warn",
21
+ },
22
+ };
23
+ exports.default = config;
24
+ //# sourceMappingURL=trial.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trial.js","sourceRoot":"","sources":["../../src/configs/trial.ts"],"names":[],"mappings":";;AAEA,MAAM,MAAM,GAAkB;IAC5B,KAAK,EAAE;QACL,iDAAiD,EAAE,MAAM;QACzD,8CAA8C,EAAE,MAAM;QACtD,kCAAkC,EAAE,MAAM;QAC1C,sCAAsC,EAAE,MAAM;QAC9C,gCAAgC,EAAE,MAAM;QACxC,yCAAyC,EAAE,MAAM;QACjD,kCAAkC,EAAE,MAAM;QAC1C,sCAAsC,EAAE,MAAM;QAC9C,gCAAgC,EAAE,MAAM;QACxC,kCAAkC,EAAE,MAAM;QAC1C,gCAAgC,EAAE,MAAM;QACxC,uCAAuC,EAAE,MAAM;QAC/C,2CAA2C,EAAE,MAAM;QACnD,uCAAuC,EAAE,MAAM;QAC/C,oCAAoC,EAAE,MAAM;QAC5C,yCAAyC,EAAE,MAAM;KAClD;CACF,CAAC;AAEF,kBAAe,MAAM,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { ESLint, Linter } from "eslint";
2
+ type Plugin = Omit<ESLint.Plugin, "configs"> & {
3
+ configs: ESLint.Plugin["configs"] & Record<"recommended" | "trial", Linter.Config>;
4
+ };
5
+ declare const plugin: Plugin;
6
+ export = plugin;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAKxC,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG;IAC7C,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAC/B,MAAM,CAAC,aAAa,GAAG,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;CAClD,CAAC;AAEF,QAAA,MAAM,MAAM,EAAE,MAUb,CAAC;AAEF,SAAS,MAAM,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ const rules_1 = require("./rules");
6
+ const recommended_1 = __importDefault(require("./configs/recommended"));
7
+ const trial_1 = __importDefault(require("./configs/trial"));
8
+ const plugin = {
9
+ meta: {
10
+ name: "eslint-plugin-tmdr-nuxt",
11
+ version: "1.0.0",
12
+ },
13
+ rules: rules_1.rules,
14
+ configs: {
15
+ recommended: recommended_1.default,
16
+ trial: trial_1.default,
17
+ },
18
+ };
19
+ module.exports = plugin;
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AACA,mCAAgC;AAChC,wEAAgD;AAChD,4DAAoC;AAOpC,MAAM,MAAM,GAAW;IACrB,IAAI,EAAE;QACJ,IAAI,EAAE,yBAAyB;QAC/B,OAAO,EAAE,OAAO;KACjB;IACD,KAAK,EAAL,aAAK;IACL,OAAO,EAAE;QACP,WAAW,EAAX,qBAAW;QACX,KAAK,EAAL,eAAK;KACN;CACF,CAAC;AAEF,iBAAS,MAAM,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const asyncDataTopLevel: import("@typescript-eslint/utils/ts-eslint").RuleModule<"issue:invalid-call", never[], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
2
+ name: string;
3
+ };
4
+ //# sourceMappingURL=async-data-top-level.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-data-top-level.d.ts","sourceRoot":"","sources":["../../src/rules/async-data-top-level.ts"],"names":[],"mappings":"AAoBA,eAAO,MAAM,iBAAiB;;CAgD5B,CAAC"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.asyncDataTopLevel = void 0;
4
+ const utils_1 = require("@typescript-eslint/utils");
5
+ const rule_1 = require("../utils/rule");
6
+ const ast_1 = require("../utils/ast");
7
+ const NON_TOP_LEVEL_ANCESTORS = new Set([
8
+ utils_1.AST_NODE_TYPES.FunctionDeclaration,
9
+ utils_1.AST_NODE_TYPES.FunctionExpression,
10
+ utils_1.AST_NODE_TYPES.ArrowFunctionExpression,
11
+ utils_1.AST_NODE_TYPES.ClassDeclaration,
12
+ utils_1.AST_NODE_TYPES.ClassExpression,
13
+ utils_1.AST_NODE_TYPES.IfStatement,
14
+ utils_1.AST_NODE_TYPES.ForStatement,
15
+ utils_1.AST_NODE_TYPES.ForInStatement,
16
+ utils_1.AST_NODE_TYPES.ForOfStatement,
17
+ utils_1.AST_NODE_TYPES.WhileStatement,
18
+ utils_1.AST_NODE_TYPES.DoWhileStatement,
19
+ utils_1.AST_NODE_TYPES.TryStatement,
20
+ utils_1.AST_NODE_TYPES.SwitchStatement,
21
+ ]);
22
+ exports.asyncDataTopLevel = (0, rule_1.createRule)({
23
+ name: "async-data-top-level",
24
+ meta: {
25
+ docs: {
26
+ description: "Enforce useAsyncData to be called at the top level of setup or inside custom composable.",
27
+ },
28
+ type: "problem",
29
+ messages: {
30
+ "issue:invalid-call": "'{{name}}' must be called at the top level of <script setup> or inside custom composable.",
31
+ },
32
+ schema: [],
33
+ defaultOptions: [],
34
+ hasSuggestions: false,
35
+ },
36
+ create: (context) => {
37
+ return (0, rule_1.withTemplateVisitor)(context, {
38
+ script: {
39
+ CallExpression(node) {
40
+ const nuxtFetchComposables = ["useAsyncData", "useFetch"];
41
+ const isCallingUseAsyncData = node.callee.type === utils_1.AST_NODE_TYPES.Identifier &&
42
+ nuxtFetchComposables.includes(node.callee.name);
43
+ if (!isCallingUseAsyncData)
44
+ return;
45
+ const composableName = node.callee.type === utils_1.AST_NODE_TYPES.Identifier
46
+ ? node.callee.name
47
+ : "";
48
+ const ancestors = context.sourceCode.getAncestors(node);
49
+ const isTopLevel = !ancestors.some((ancestor) => NON_TOP_LEVEL_ANCESTORS.has(ancestor.type));
50
+ if (!isTopLevel && !(0, ast_1.isInsideComposable)(ancestors)) {
51
+ context.report({
52
+ node,
53
+ messageId: "issue:invalid-call",
54
+ data: { name: composableName },
55
+ });
56
+ }
57
+ },
58
+ },
59
+ });
60
+ },
61
+ });
62
+ //# sourceMappingURL=async-data-top-level.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-data-top-level.js","sourceRoot":"","sources":["../../src/rules/async-data-top-level.ts"],"names":[],"mappings":";;;AAAA,oDAA0D;AAC1D,wCAAgE;AAChE,sCAAkD;AAElD,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC;IACtC,sBAAc,CAAC,mBAAmB;IAClC,sBAAc,CAAC,kBAAkB;IACjC,sBAAc,CAAC,uBAAuB;IACtC,sBAAc,CAAC,gBAAgB;IAC/B,sBAAc,CAAC,eAAe;IAC9B,sBAAc,CAAC,WAAW;IAC1B,sBAAc,CAAC,YAAY;IAC3B,sBAAc,CAAC,cAAc;IAC7B,sBAAc,CAAC,cAAc;IAC7B,sBAAc,CAAC,cAAc;IAC7B,sBAAc,CAAC,gBAAgB;IAC/B,sBAAc,CAAC,YAAY;IAC3B,sBAAc,CAAC,eAAe;CAC/B,CAAC,CAAC;AAEU,QAAA,iBAAiB,GAAG,IAAA,iBAAU,EAAC;IAC1C,IAAI,EAAE,sBAAsB;IAC5B,IAAI,EAAE;QACJ,IAAI,EAAE;YACJ,WAAW,EACT,0FAA0F;SAC7F;QACD,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE;YACR,oBAAoB,EAClB,2FAA2F;SAC9F;QACD,MAAM,EAAE,EAAE;QACV,cAAc,EAAE,EAAE;QAClB,cAAc,EAAE,KAAK;KACtB;IACD,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;QAClB,OAAO,IAAA,0BAAmB,EAAC,OAAO,EAAE;YAClC,MAAM,EAAE;gBACN,cAAc,CAAC,IAAI;oBACjB,MAAM,oBAAoB,GAAG,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;oBAC1D,MAAM,qBAAqB,GACzB,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,sBAAc,CAAC,UAAU;wBAC9C,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBAElD,IAAI,CAAC,qBAAqB;wBAAE,OAAO;oBAEnC,MAAM,cAAc,GAClB,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,sBAAc,CAAC,UAAU;wBAC5C,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI;wBAClB,CAAC,CAAC,EAAE,CAAC;oBAET,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;oBACxD,MAAM,UAAU,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC9C,uBAAuB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAC3C,CAAC;oBAEF,IAAI,CAAC,UAAU,IAAI,CAAC,IAAA,wBAAkB,EAAC,SAAS,CAAC,EAAE,CAAC;wBAClD,OAAO,CAAC,MAAM,CAAC;4BACb,IAAI;4BACJ,SAAS,EAAE,oBAAoB;4BAC/B,IAAI,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE;yBAC/B,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;aACF;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare const emitsInterfaceName: import("@typescript-eslint/utils/ts-eslint").RuleModule<"issue:invalid-interface-name" | "hint:rename-interface", [{
2
+ pattern?: string;
3
+ }], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
4
+ name: string;
5
+ };
6
+ //# sourceMappingURL=emits-interface-name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emits-interface-name.d.ts","sourceRoot":"","sources":["../../src/rules/emits-interface-name.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,kBAAkB;;;;CAM7B,CAAC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.emitsInterfaceName = void 0;
4
+ const define_macro_rule_1 = require("../utils/define-macro-rule");
5
+ exports.emitsInterfaceName = (0, define_macro_rule_1.createInterfaceNameRule)({
6
+ macroName: "defineEmits",
7
+ ruleName: "emits-interface-name",
8
+ description: "Enforce naming convention for emits interface/type",
9
+ subjectLabel: "Emits",
10
+ defaultSuffix: "Emits",
11
+ });
12
+ //# sourceMappingURL=emits-interface-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emits-interface-name.js","sourceRoot":"","sources":["../../src/rules/emits-interface-name.ts"],"names":[],"mappings":";;;AAAA,kEAAqE;AAExD,QAAA,kBAAkB,GAAG,IAAA,2CAAuB,EAAC;IACxD,SAAS,EAAE,aAAa;IACxB,QAAQ,EAAE,sBAAsB;IAChC,WAAW,EAAE,oDAAoD;IACjE,YAAY,EAAE,OAAO;IACrB,aAAa,EAAE,OAAO;CACvB,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare const enforceComponentDirectoryStructure: import("@typescript-eslint/utils/ts-eslint").RuleModule<"issue:component-ui-dir" | "issue:component-dir-ui" | "issue:component-layout-dir" | "issue:layout-parent-dir" | "issue:invalid-dir" | "issue:must-components-dir", {
2
+ allowedDirs: string[];
3
+ overrideDefaults: boolean;
4
+ }[], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
5
+ name: string;
6
+ };
7
+ //# sourceMappingURL=enforce-component-directory-structure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enforce-component-directory-structure.d.ts","sourceRoot":"","sources":["../../src/rules/enforce-component-directory-structure.ts"],"names":[],"mappings":"AA4FA,eAAO,MAAM,kCAAkC;iBAiCpB,MAAM,EAAE;;;;CA0GjC,CAAC"}
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.enforceComponentDirectoryStructure = void 0;
4
+ const filename_1 = require("../utils/filename");
5
+ const formattter_1 = require("../utils/formattter");
6
+ const rule_1 = require("../utils/rule");
7
+ const whitelistNuxtDirs = ["layouts", "pages"];
8
+ const whitelistNuxtFiles = ["app.vue", "error.vue"];
9
+ const validateFilename = (fileName, affix, type) => {
10
+ let regex;
11
+ if (type === "prefix") {
12
+ regex = new RegExp(`^${affix}[A-Z][a-zA-Z]*\.vue$`);
13
+ }
14
+ else {
15
+ regex = new RegExp(`^[A-Z][a-zA-Z]*${affix}\.vue$`);
16
+ }
17
+ return regex.test(fileName);
18
+ };
19
+ const messagesMap = {
20
+ ui: {
21
+ inside: "issue:component-ui-dir",
22
+ outside: "issue:component-dir-ui",
23
+ },
24
+ layout: {
25
+ inside: "issue:component-layout-dir",
26
+ outside: "issue:component-layout-dir",
27
+ },
28
+ };
29
+ const validateDirectory = ({ subPath, affix, type, prefixDirectory, }) => {
30
+ const splittedSubPath = subPath.split("/");
31
+ const messageIds = messagesMap[prefixDirectory];
32
+ if (splittedSubPath.length <= 2) {
33
+ if (validateFilename(splittedSubPath[1], affix, type)) {
34
+ return messageIds.outside;
35
+ }
36
+ }
37
+ const [_, componentDir, ...files] = subPath.split("/");
38
+ const componentFile = files.filter((f) => f.endsWith(".vue"));
39
+ if (!componentFile[0]) {
40
+ return null;
41
+ }
42
+ const hasFileAffix = validateFilename(componentFile[0], affix, type);
43
+ const hasDirectory = componentDir === prefixDirectory;
44
+ if (!hasDirectory && hasFileAffix) {
45
+ return messageIds.outside;
46
+ }
47
+ if (hasDirectory && !hasFileAffix) {
48
+ return messageIds.inside;
49
+ }
50
+ return null;
51
+ };
52
+ const getAllowedDirs = (dirs, overrideDefaults) => {
53
+ const defaultDirs = ["ui", "layout", "section"];
54
+ if (overrideDefaults) {
55
+ return dirs;
56
+ }
57
+ return [...defaultDirs, ...dirs];
58
+ };
59
+ exports.enforceComponentDirectoryStructure = (0, rule_1.createRule)({
60
+ name: "enforce-component-directory-structure",
61
+ meta: {
62
+ docs: {
63
+ description: "Validate that components convention name are placed in the correct directory structure",
64
+ },
65
+ type: "layout",
66
+ messages: {
67
+ "issue:component-ui-dir": `Filename must be start with "Ui" when the component is placed in a "components/ui" directory.`,
68
+ "issue:component-dir-ui": `Filename must be placed in a "components/ui" directory when the filename starts with "Ui".`,
69
+ "issue:component-layout-dir": `Filename must be start with "{{parentName}}" when the component is placed in a "components/layout/{{parentDir}}" directory.`,
70
+ "issue:layout-parent-dir": `File must have at least 1 parent directory inside "components/layout" directory.`,
71
+ "issue:invalid-dir": "Component must be placed in a valid directory. Allowed directories are: {{allowedDirs}}.",
72
+ "issue:must-components-dir": `Component must be placed inside the "components" directory.`,
73
+ },
74
+ schema: {
75
+ type: "array",
76
+ minItems: 0,
77
+ items: [
78
+ {
79
+ type: "object",
80
+ properties: {
81
+ allowedDirs: { type: "array", items: { type: "string" } },
82
+ overrideDefaults: { type: "boolean" },
83
+ },
84
+ additionalProperties: false,
85
+ },
86
+ ],
87
+ },
88
+ defaultOptions: [
89
+ {
90
+ allowedDirs: [],
91
+ overrideDefaults: false,
92
+ },
93
+ ],
94
+ hasSuggestions: false,
95
+ },
96
+ create: (context) => {
97
+ var _a, _b;
98
+ const relativePath = (0, filename_1.getRelativePath)(context);
99
+ const isNuxtDir = whitelistNuxtDirs.some((dir) => relativePath.startsWith(`${dir}/`));
100
+ const isNuxtFile = whitelistNuxtFiles.some((file) => relativePath === file);
101
+ if (!relativePath.endsWith(".vue") || isNuxtDir || isNuxtFile) {
102
+ return {};
103
+ }
104
+ const allowedDirs = getAllowedDirs(((_a = context.options[0]) === null || _a === void 0 ? void 0 : _a.allowedDirs) || [], ((_b = context.options[0]) === null || _b === void 0 ? void 0 : _b.overrideDefaults) || false);
105
+ return (0, rule_1.withTemplateVisitor)(context, {
106
+ script: {
107
+ Program: (node) => {
108
+ const componentsDir = `/${relativePath}`.split("/components");
109
+ if (componentsDir.length <= 1) {
110
+ context.report({
111
+ node,
112
+ messageId: "issue:must-components-dir",
113
+ });
114
+ return;
115
+ }
116
+ const subPath = componentsDir[componentsDir.length - 1];
117
+ const messageIdUi = validateDirectory({
118
+ subPath,
119
+ affix: "Ui",
120
+ type: "prefix",
121
+ prefixDirectory: "ui",
122
+ });
123
+ if (messageIdUi) {
124
+ context.report({
125
+ node,
126
+ messageId: messageIdUi,
127
+ });
128
+ return;
129
+ }
130
+ const [_, subCompDir, ...files] = subPath.split("/");
131
+ if (subCompDir === "layout") {
132
+ const parentDir = files[files.length - 2];
133
+ if (!parentDir) {
134
+ context.report({
135
+ node,
136
+ messageId: "issue:layout-parent-dir",
137
+ });
138
+ return;
139
+ }
140
+ const messageIdLayout = validateDirectory({
141
+ subPath,
142
+ affix: (0, formattter_1.capitalize)(parentDir, "-"),
143
+ type: "prefix",
144
+ prefixDirectory: "layout",
145
+ });
146
+ if (messageIdLayout) {
147
+ context.report({
148
+ node,
149
+ data: {
150
+ parentName: (0, formattter_1.capitalize)(parentDir, "-"),
151
+ parentDir,
152
+ },
153
+ messageId: messageIdLayout,
154
+ });
155
+ return;
156
+ }
157
+ }
158
+ const isInAllowedDir = allowedDirs.some((dir) => subPath.startsWith(`/${dir}/`));
159
+ if (!isInAllowedDir) {
160
+ context.report({
161
+ node,
162
+ messageId: "issue:invalid-dir",
163
+ data: {
164
+ allowedDirs: allowedDirs.join(", "),
165
+ },
166
+ });
167
+ return;
168
+ }
169
+ },
170
+ },
171
+ });
172
+ },
173
+ });
174
+ //# sourceMappingURL=enforce-component-directory-structure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enforce-component-directory-structure.js","sourceRoot":"","sources":["../../src/rules/enforce-component-directory-structure.ts"],"names":[],"mappings":";;;AAAA,gDAAoD;AACpD,oDAAiD;AACjD,wCAAgE;AAEhE,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAC/C,MAAM,kBAAkB,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;AAEpD,MAAM,gBAAgB,GAAG,CACvB,QAAgB,EAChB,KAAa,EACb,IAAyB,EACzB,EAAE;IACF,IAAI,KAAK,CAAC;IACV,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,KAAK,sBAAsB,CAAC,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,IAAI,MAAM,CAAC,kBAAkB,KAAK,QAAQ,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC,CAAC;AAaF,MAAM,WAAW,GAGb;IACF,EAAE,EAAE;QACF,MAAM,EAAE,wBAAwB;QAChC,OAAO,EAAE,wBAAwB;KAClC;IACD,MAAM,EAAE;QACN,MAAM,EAAE,4BAA4B;QACpC,OAAO,EAAE,4BAA4B;KACtC;CACF,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,EACzB,OAAO,EACP,KAAK,EACL,IAAI,EACJ,eAAe,GACC,EAAqB,EAAE;IACvC,MAAM,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,WAAW,CAAC,eAAe,CAAC,CAAC;IAEhD,IAAI,eAAe,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAChC,IAAI,gBAAgB,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;YACtD,OAAO,UAAU,CAAC,OAAO,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,MAAM,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvD,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAE9D,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,YAAY,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACrE,MAAM,YAAY,GAAG,YAAY,KAAK,eAAe,CAAC;IAEtD,IAAI,CAAC,YAAY,IAAI,YAAY,EAAE,CAAC;QAClC,OAAO,UAAU,CAAC,OAAO,CAAC;IAC5B,CAAC;IAED,IAAI,YAAY,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,OAAO,UAAU,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,IAAc,EAAE,gBAAyB,EAAE,EAAE;IACnE,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAEhD,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,GAAG,WAAW,EAAE,GAAG,IAAI,CAAC,CAAC;AACnC,CAAC,CAAC;AAEW,QAAA,kCAAkC,GAAG,IAAA,iBAAU,EAAC;IAC3D,IAAI,EAAE,uCAAuC;IAC7C,IAAI,EAAE;QACJ,IAAI,EAAE;YACJ,WAAW,EACT,wFAAwF;SAC3F;QACD,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE;YACR,wBAAwB,EAAE,+FAA+F;YACzH,wBAAwB,EAAE,4FAA4F;YACtH,4BAA4B,EAAE,6HAA6H;YAC3J,yBAAyB,EAAE,kFAAkF;YAC7G,mBAAmB,EACjB,0FAA0F;YAC5F,2BAA2B,EAAE,6DAA6D;SAC3F;QACD,MAAM,EAAE;YACN,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,CAAC;YACX,KAAK,EAAE;gBACL;oBACE,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,WAAW,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;wBACzD,gBAAgB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;qBACtC;oBACD,oBAAoB,EAAE,KAAK;iBAC5B;aACF;SACF;QACD,cAAc,EAAE;YACd;gBACE,WAAW,EAAE,EAAc;gBAC3B,gBAAgB,EAAE,KAAK;aACxB;SACF;QACD,cAAc,EAAE,KAAK;KACtB;IACD,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;;QAClB,MAAM,YAAY,GAAG,IAAA,0BAAe,EAAC,OAAO,CAAC,CAAC;QAE9C,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAC/C,YAAY,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,CACnC,CAAC;QACF,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC;QAE5E,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,SAAS,IAAI,UAAU,EAAE,CAAC;YAC9D,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,WAAW,GAAG,cAAc,CAChC,CAAA,MAAA,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,0CAAE,WAAW,KAAI,EAAE,EACrC,CAAA,MAAA,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,0CAAE,gBAAgB,KAAI,KAAK,CAC9C,CAAC;QAEF,OAAO,IAAA,0BAAmB,EAAC,OAAO,EAAE;YAClC,MAAM,EAAE;gBACN,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;oBAChB,MAAM,aAAa,GAAG,IAAI,YAAY,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;oBAE9D,IAAI,aAAa,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;wBAC9B,OAAO,CAAC,MAAM,CAAC;4BACb,IAAI;4BACJ,SAAS,EAAE,2BAA2B;yBACvC,CAAC,CAAC;wBACH,OAAO;oBACT,CAAC;oBAED,MAAM,OAAO,GAAG,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAExD,MAAM,WAAW,GAAG,iBAAiB,CAAC;wBACpC,OAAO;wBACP,KAAK,EAAE,IAAI;wBACX,IAAI,EAAE,QAAQ;wBACd,eAAe,EAAE,IAAI;qBACtB,CAAC,CAAC;oBAEH,IAAI,WAAW,EAAE,CAAC;wBAChB,OAAO,CAAC,MAAM,CAAC;4BACb,IAAI;4BACJ,SAAS,EAAE,WAAW;yBACvB,CAAC,CAAC;wBAEH,OAAO;oBACT,CAAC;oBAED,MAAM,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACrD,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;wBAC5B,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;wBAE1C,IAAI,CAAC,SAAS,EAAE,CAAC;4BACf,OAAO,CAAC,MAAM,CAAC;gCACb,IAAI;gCACJ,SAAS,EAAE,yBAAyB;6BACrC,CAAC,CAAC;4BAEH,OAAO;wBACT,CAAC;wBAED,MAAM,eAAe,GAAG,iBAAiB,CAAC;4BACxC,OAAO;4BACP,KAAK,EAAE,IAAA,uBAAU,EAAC,SAAS,EAAE,GAAG,CAAC;4BACjC,IAAI,EAAE,QAAQ;4BACd,eAAe,EAAE,QAAQ;yBAC1B,CAAC,CAAC;wBAEH,IAAI,eAAe,EAAE,CAAC;4BACpB,OAAO,CAAC,MAAM,CAAC;gCACb,IAAI;gCACJ,IAAI,EAAE;oCACJ,UAAU,EAAE,IAAA,uBAAU,EAAC,SAAS,EAAE,GAAG,CAAC;oCACtC,SAAS;iCACV;gCACD,SAAS,EAAE,eAAe;6BAC3B,CAAC,CAAC;4BAEH,OAAO;wBACT,CAAC;oBACH,CAAC;oBAED,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAC9C,OAAO,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,CAC/B,CAAC;oBAEF,IAAI,CAAC,cAAc,EAAE,CAAC;wBACpB,OAAO,CAAC,MAAM,CAAC;4BACb,IAAI;4BACJ,SAAS,EAAE,mBAAmB;4BAC9B,IAAI,EAAE;gCACJ,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;6BACpC;yBACF,CAAC,CAAC;wBACH,OAAO;oBACT,CAAC;gBACH,CAAC;aACF;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ESLint } from "eslint";
2
+ export declare const rules: ESLint.Plugin["rules"];
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAkBhC,eAAO,MAAM,KAAK,EAiBF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rules = void 0;
4
+ const enforce_component_directory_structure_1 = require("./enforce-component-directory-structure");
5
+ const require_typescript_interface_props_1 = require("./require-typescript-interface-props");
6
+ const no_direct_any_in_props_1 = require("./no-direct-any-in-props");
7
+ const no_inline_props_definition_1 = require("./no-inline-props-definition");
8
+ const props_interface_name_1 = require("./props-interface-name");
9
+ const require_typed_emits_signature_1 = require("./require-typed-emits-signature");
10
+ const emits_interface_name_1 = require("./emits-interface-name");
11
+ const no_direct_any_in_emits_1 = require("./no-direct-any-in-emits");
12
+ const no_inline_emits_definition_1 = require("./no-inline-emits-definition");
13
+ const no_composable_in_class_1 = require("./no-composable-in-class");
14
+ const async_data_top_level_1 = require("./async-data-top-level");
15
+ const no_async_data_outside_setup_1 = require("./no-async-data-outside-setup");
16
+ const no_direct_api_call_in_component_1 = require("./no-direct-api-call-in-component");
17
+ const no_manual_repository_import_1 = require("./no-manual-repository-import");
18
+ const require_typed_repository_1 = require("./require-typed-repository");
19
+ const require_pinia_composition_api_1 = require("./require-pinia-composition-api");
20
+ exports.rules = {
21
+ "enforce-component-directory-structure": enforce_component_directory_structure_1.enforceComponentDirectoryStructure,
22
+ "require-typescript-interface-props": require_typescript_interface_props_1.requireTypescriptInterfaceProps,
23
+ "no-direct-any-in-props": no_direct_any_in_props_1.noDirectAnyInProps,
24
+ "no-inline-props-definition": no_inline_props_definition_1.noInlinePropsDefinition,
25
+ "props-interface-name": props_interface_name_1.propsInterfaceName,
26
+ "require-typed-emits-signature": require_typed_emits_signature_1.requireTypedEmitsSignature,
27
+ "no-direct-any-in-emits": no_direct_any_in_emits_1.noDirectAnyInEmits,
28
+ "no-inline-emits-definition": no_inline_emits_definition_1.noInlineEmitsDefinition,
29
+ "emits-interface-name": emits_interface_name_1.emitsInterfaceName,
30
+ "no-composable-in-class": no_composable_in_class_1.noComposableInClass,
31
+ "async-data-top-level": async_data_top_level_1.asyncDataTopLevel,
32
+ "no-async-data-outside-setup": no_async_data_outside_setup_1.noAsyncDataOutsideSetup,
33
+ "no-direct-api-call-in-component": no_direct_api_call_in_component_1.noDirectApiCallInComponent,
34
+ "no-manual-repository-import": no_manual_repository_import_1.noManualRepositoryImport,
35
+ "require-typed-repository": require_typed_repository_1.requireTypedRepository,
36
+ "require-pinia-composition-api": require_pinia_composition_api_1.requirePiniaCompositionApi,
37
+ };
38
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":";;;AACA,mGAA6F;AAC7F,6FAAuF;AACvF,qEAA8D;AAC9D,6EAAuE;AACvE,iEAA4D;AAC5D,mFAA6E;AAC7E,iEAA4D;AAC5D,qEAA8D;AAC9D,6EAAuE;AACvE,qEAA+D;AAC/D,iEAA2D;AAC3D,+EAAwE;AACxE,uFAA+E;AAC/E,+EAAyE;AACzE,yEAAoE;AACpE,mFAA6E;AAEhE,QAAA,KAAK,GAAG;IACnB,uCAAuC,EAAE,0EAAkC;IAC3E,oCAAoC,EAAE,oEAA+B;IACrE,wBAAwB,EAAE,2CAAkB;IAC5C,4BAA4B,EAAE,oDAAuB;IACrD,sBAAsB,EAAE,yCAAkB;IAC1C,+BAA+B,EAAE,0DAA0B;IAC3D,wBAAwB,EAAE,2CAAkB;IAC5C,4BAA4B,EAAE,oDAAuB;IACrD,sBAAsB,EAAE,yCAAkB;IAC1C,wBAAwB,EAAE,4CAAmB;IAC7C,sBAAsB,EAAE,wCAAiB;IACzC,6BAA6B,EAAE,qDAAuB;IACtD,iCAAiC,EAAE,4DAA0B;IAC7D,6BAA6B,EAAE,sDAAwB;IACvD,0BAA0B,EAAE,iDAAsB;IAClD,+BAA+B,EAAE,0DAA0B;CACvB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const noAsyncDataOutsideSetup: import("@typescript-eslint/utils/ts-eslint").RuleModule<"issue:invalid-call", never[], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
2
+ name: string;
3
+ };
4
+ //# sourceMappingURL=no-async-data-outside-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-async-data-outside-setup.d.ts","sourceRoot":"","sources":["../../src/rules/no-async-data-outside-setup.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,uBAAuB;;CA+ClC,CAAC"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.noAsyncDataOutsideSetup = void 0;
4
+ const utils_1 = require("@typescript-eslint/utils");
5
+ const filename_1 = require("../utils/filename");
6
+ const rule_1 = require("../utils/rule");
7
+ const ast_1 = require("../utils/ast");
8
+ exports.noAsyncDataOutsideSetup = (0, rule_1.createRule)({
9
+ name: "no-async-data-outside-setup",
10
+ meta: {
11
+ docs: {
12
+ description: "Disallow useAsyncData/useFetch outside of Vue component or composable functions.",
13
+ },
14
+ type: "problem",
15
+ messages: {
16
+ "issue:invalid-call": "Nuxt composable '{{name}}' cannot be used outside of Vue component or composable function.",
17
+ },
18
+ schema: [],
19
+ defaultOptions: [],
20
+ hasSuggestions: false,
21
+ },
22
+ create: (context) => {
23
+ return (0, rule_1.withTemplateVisitor)(context, {
24
+ script: {
25
+ CallExpression(node) {
26
+ if ((0, filename_1.isVueFile)(context.filename))
27
+ return;
28
+ const nuxtFetchComposables = ["useAsyncData", "useFetch"];
29
+ const isCallingNuxtFetchComposable = node.callee.type === utils_1.AST_NODE_TYPES.Identifier &&
30
+ nuxtFetchComposables.includes(node.callee.name);
31
+ if (!isCallingNuxtFetchComposable)
32
+ return;
33
+ const composableName = node.callee.type === utils_1.AST_NODE_TYPES.Identifier
34
+ ? node.callee.name
35
+ : "";
36
+ const ancestors = context.sourceCode.getAncestors(node);
37
+ if (!(0, ast_1.isInsideComposable)(ancestors)) {
38
+ context.report({
39
+ node,
40
+ messageId: "issue:invalid-call",
41
+ data: { name: composableName },
42
+ });
43
+ }
44
+ },
45
+ },
46
+ });
47
+ },
48
+ });
49
+ //# sourceMappingURL=no-async-data-outside-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-async-data-outside-setup.js","sourceRoot":"","sources":["../../src/rules/no-async-data-outside-setup.ts"],"names":[],"mappings":";;;AAAA,oDAA0D;AAC1D,gDAA8C;AAC9C,wCAAgE;AAChE,sCAAkD;AAErC,QAAA,uBAAuB,GAAG,IAAA,iBAAU,EAAC;IAChD,IAAI,EAAE,6BAA6B;IACnC,IAAI,EAAE;QACJ,IAAI,EAAE;YACJ,WAAW,EACT,kFAAkF;SACrF;QACD,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE;YACR,oBAAoB,EAClB,4FAA4F;SAC/F;QACD,MAAM,EAAE,EAAE;QACV,cAAc,EAAE,EAAE;QAClB,cAAc,EAAE,KAAK;KACtB;IACD,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;QAClB,OAAO,IAAA,0BAAmB,EAAC,OAAO,EAAE;YAClC,MAAM,EAAE;gBACN,cAAc,CAAC,IAAI;oBACjB,IAAI,IAAA,oBAAS,EAAC,OAAO,CAAC,QAAQ,CAAC;wBAAE,OAAO;oBAExC,MAAM,oBAAoB,GAAG,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;oBAC1D,MAAM,4BAA4B,GAChC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,sBAAc,CAAC,UAAU;wBAC9C,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBAElD,IAAI,CAAC,4BAA4B;wBAAE,OAAO;oBAE1C,MAAM,cAAc,GAClB,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,sBAAc,CAAC,UAAU;wBAC5C,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI;wBAClB,CAAC,CAAC,EAAE,CAAC;oBAET,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;oBAExD,IAAI,CAAC,IAAA,wBAAkB,EAAC,SAAS,CAAC,EAAE,CAAC;wBACnC,OAAO,CAAC,MAAM,CAAC;4BACb,IAAI;4BACJ,SAAS,EAAE,oBAAoB;4BAC/B,IAAI,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE;yBAC/B,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;aACF;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare const noComposableInClass: import("@typescript-eslint/utils/ts-eslint").RuleModule<"issue:composable-call", {
2
+ allowedComposables: string[];
3
+ overrideDefaults: boolean;
4
+ }[], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
5
+ name: string;
6
+ };
7
+ //# sourceMappingURL=no-composable-in-class.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-composable-in-class.d.ts","sourceRoot":"","sources":["../../src/rules/no-composable-in-class.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,mBAAmB;;;;;CAsE9B,CAAC"}