@tanstack/eslint-plugin-router 1.121.0-alpha.1 → 1.121.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/dist/cjs/index.cjs +0 -29
- package/dist/cjs/index.cjs.map +0 -1
- package/dist/cjs/index.d.cts +0 -13
- package/dist/cjs/rules/create-route-property-order/constants.cjs +0 -40
- package/dist/cjs/rules/create-route-property-order/constants.cjs.map +0 -1
- package/dist/cjs/rules/create-route-property-order/constants.d.cts +0 -7
- package/dist/cjs/rules/create-route-property-order/create-route-property-order.rule.cjs +0 -103
- package/dist/cjs/rules/create-route-property-order/create-route-property-order.rule.cjs.map +0 -1
- package/dist/cjs/rules/create-route-property-order/create-route-property-order.rule.d.cts +0 -4
- package/dist/cjs/rules/create-route-property-order/create-route-property-order.utils.cjs +0 -51
- package/dist/cjs/rules/create-route-property-order/create-route-property-order.utils.cjs.map +0 -1
- package/dist/cjs/rules/create-route-property-order/create-route-property-order.utils.d.cts +0 -2
- package/dist/cjs/rules.cjs +0 -8
- package/dist/cjs/rules.cjs.map +0 -1
- package/dist/cjs/rules.d.cts +0 -3
- package/dist/cjs/types.d.cts +0 -3
- package/dist/cjs/utils/detect-router-imports.cjs +0 -54
- package/dist/cjs/utils/detect-router-imports.cjs.map +0 -1
- package/dist/cjs/utils/detect-router-imports.d.cts +0 -11
- package/dist/cjs/utils/get-docs-url.cjs +0 -5
- package/dist/cjs/utils/get-docs-url.cjs.map +0 -1
- package/dist/cjs/utils/get-docs-url.d.cts +0 -1
- package/dist/esm/index.d.ts +0 -13
- package/dist/esm/index.js +0 -30
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/rules/create-route-property-order/constants.d.ts +0 -7
- package/dist/esm/rules/create-route-property-order/constants.js +0 -40
- package/dist/esm/rules/create-route-property-order/constants.js.map +0 -1
- package/dist/esm/rules/create-route-property-order/create-route-property-order.rule.d.ts +0 -4
- package/dist/esm/rules/create-route-property-order/create-route-property-order.rule.js +0 -103
- package/dist/esm/rules/create-route-property-order/create-route-property-order.rule.js.map +0 -1
- package/dist/esm/rules/create-route-property-order/create-route-property-order.utils.d.ts +0 -2
- package/dist/esm/rules/create-route-property-order/create-route-property-order.utils.js +0 -51
- package/dist/esm/rules/create-route-property-order/create-route-property-order.utils.js.map +0 -1
- package/dist/esm/rules.d.ts +0 -3
- package/dist/esm/rules.js +0 -8
- package/dist/esm/rules.js.map +0 -1
- package/dist/esm/types.d.ts +0 -3
- package/dist/esm/utils/detect-router-imports.d.ts +0 -11
- package/dist/esm/utils/detect-router-imports.js +0 -54
- package/dist/esm/utils/detect-router-imports.js.map +0 -1
- package/dist/esm/utils/get-docs-url.d.ts +0 -1
- package/dist/esm/utils/get-docs-url.js +0 -5
- package/dist/esm/utils/get-docs-url.js.map +0 -1
package/package.json
CHANGED
package/dist/cjs/index.cjs
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
const rules = require("./rules.cjs");
|
|
3
|
-
const plugin = {
|
|
4
|
-
meta: {
|
|
5
|
-
name: "@tanstack/eslint-plugin-router"
|
|
6
|
-
},
|
|
7
|
-
configs: {},
|
|
8
|
-
rules: rules.rules
|
|
9
|
-
};
|
|
10
|
-
Object.assign(plugin.configs, {
|
|
11
|
-
recommended: {
|
|
12
|
-
plugins: ["@tanstack/eslint-plugin-router"],
|
|
13
|
-
rules: {
|
|
14
|
-
"@tanstack/router/create-route-property-order": "warn"
|
|
15
|
-
}
|
|
16
|
-
},
|
|
17
|
-
"flat/recommended": [
|
|
18
|
-
{
|
|
19
|
-
plugins: {
|
|
20
|
-
"@tanstack/router": plugin
|
|
21
|
-
},
|
|
22
|
-
rules: {
|
|
23
|
-
"@tanstack/router/create-route-property-order": "warn"
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
]
|
|
27
|
-
});
|
|
28
|
-
module.exports = plugin;
|
|
29
|
-
//# sourceMappingURL=index.cjs.map
|
package/dist/cjs/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../src/index.ts"],"sourcesContent":["import { rules } from './rules'\nimport type { ESLint, Linter } from 'eslint'\nimport type { RuleModule } from '@typescript-eslint/utils/ts-eslint'\n\ntype RuleKey = keyof typeof rules\n\ninterface Plugin extends Omit<ESLint.Plugin, 'rules'> {\n rules: Record<RuleKey, RuleModule<any, any, any>>\n configs: {\n recommended: ESLint.ConfigData\n 'flat/recommended': Array<Linter.FlatConfig>\n }\n}\n\nconst plugin: Plugin = {\n meta: {\n name: '@tanstack/eslint-plugin-router',\n },\n configs: {} as Plugin['configs'],\n rules,\n}\n\n// Assign configs here so we can reference `plugin`\nObject.assign(plugin.configs, {\n recommended: {\n plugins: ['@tanstack/eslint-plugin-router'],\n rules: {\n '@tanstack/router/create-route-property-order': 'warn',\n },\n },\n 'flat/recommended': [\n {\n plugins: {\n '@tanstack/router': plugin,\n },\n rules: {\n '@tanstack/router/create-route-property-order': 'warn',\n },\n },\n ],\n})\n\nexport default plugin\n"],"names":["rules"],"mappings":";;AAcA,MAAM,SAAiB;AAAA,EACrB,MAAM;AAAA,IACJ,MAAM;AAAA,EACR;AAAA,EACA,SAAS,CAAC;AAAA,EACVA,OAAAA,MAAAA;AACF;AAGA,OAAO,OAAO,OAAO,SAAS;AAAA,EAC5B,aAAa;AAAA,IACX,SAAS,CAAC,gCAAgC;AAAA,IAC1C,OAAO;AAAA,MACL,gDAAgD;AAAA,IAAA;AAAA,EAEpD;AAAA,EACA,oBAAoB;AAAA,IAClB;AAAA,MACE,SAAS;AAAA,QACP,oBAAoB;AAAA,MACtB;AAAA,MACA,OAAO;AAAA,QACL,gDAAgD;AAAA,MAAA;AAAA,IAClD;AAAA,EACF;AAEJ,CAAC;;"}
|
package/dist/cjs/index.d.cts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { rules } from './rules.cjs';
|
|
2
|
-
import { ESLint, Linter } from 'eslint';
|
|
3
|
-
import { RuleModule } from '@typescript-eslint/utils/ts-eslint';
|
|
4
|
-
type RuleKey = keyof typeof rules;
|
|
5
|
-
interface Plugin extends Omit<ESLint.Plugin, 'rules'> {
|
|
6
|
-
rules: Record<RuleKey, RuleModule<any, any, any>>;
|
|
7
|
-
configs: {
|
|
8
|
-
recommended: ESLint.ConfigData;
|
|
9
|
-
'flat/recommended': Array<Linter.FlatConfig>;
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
declare const plugin: Plugin;
|
|
13
|
-
export default plugin;
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const createRoutePropertyOrder_utils = require("./create-route-property-order.utils.cjs");
|
|
4
|
-
const createRouteFunctionsIndirect = [
|
|
5
|
-
"createFileRoute",
|
|
6
|
-
"createRootRouteWithContext"
|
|
7
|
-
];
|
|
8
|
-
const createRouteFunctionsDirect = [
|
|
9
|
-
"createRootRoute",
|
|
10
|
-
"createRoute"
|
|
11
|
-
];
|
|
12
|
-
const createRouteFunctions = [
|
|
13
|
-
...createRouteFunctionsDirect,
|
|
14
|
-
...createRouteFunctionsIndirect
|
|
15
|
-
];
|
|
16
|
-
const sortRules = [
|
|
17
|
-
[["params", "validateSearch"], ["search"]],
|
|
18
|
-
[["search"], ["loaderDeps"]],
|
|
19
|
-
[["loaderDeps"], ["context"]],
|
|
20
|
-
[["context"], ["beforeLoad"]],
|
|
21
|
-
[["beforeLoad"], ["loader"]],
|
|
22
|
-
[
|
|
23
|
-
["loader"],
|
|
24
|
-
[
|
|
25
|
-
"onEnter",
|
|
26
|
-
"onStay",
|
|
27
|
-
"onLeave",
|
|
28
|
-
"head",
|
|
29
|
-
"scripts",
|
|
30
|
-
"headers",
|
|
31
|
-
"remountDeps"
|
|
32
|
-
]
|
|
33
|
-
]
|
|
34
|
-
];
|
|
35
|
-
createRoutePropertyOrder_utils.getCheckedProperties(sortRules);
|
|
36
|
-
exports.createRouteFunctions = createRouteFunctions;
|
|
37
|
-
exports.createRouteFunctionsDirect = createRouteFunctionsDirect;
|
|
38
|
-
exports.createRouteFunctionsIndirect = createRouteFunctionsIndirect;
|
|
39
|
-
exports.sortRules = sortRules;
|
|
40
|
-
//# sourceMappingURL=constants.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constants.cjs","sources":["../../../../src/rules/create-route-property-order/constants.ts"],"sourcesContent":["import { getCheckedProperties } from './create-route-property-order.utils'\n\nexport const createRouteFunctionsIndirect = [\n 'createFileRoute',\n 'createRootRouteWithContext',\n] as const\nexport const createRouteFunctionsDirect = [\n 'createRootRoute',\n 'createRoute',\n] as const\n\nexport const createRouteFunctions = [\n ...createRouteFunctionsDirect,\n ...createRouteFunctionsIndirect,\n] as const\n\nexport type CreateRouteFunction = (typeof createRouteFunctions)[number]\n\nexport const sortRules = [\n [['params', 'validateSearch'], ['search']],\n [['search'], ['loaderDeps']],\n [['loaderDeps'], ['context']],\n [['context'], ['beforeLoad']],\n [['beforeLoad'], ['loader']],\n [\n ['loader'],\n [\n 'onEnter',\n 'onStay',\n 'onLeave',\n 'head',\n 'scripts',\n 'headers',\n 'remountDeps',\n ],\n ],\n] as const\n\nexport type CheckedProperties = (typeof sortRules)[number][number][number]\nexport const checkedProperties = getCheckedProperties(sortRules)\n"],"names":["getCheckedProperties"],"mappings":";;;AAEO,MAAM,+BAA+B;AAAA,EAC1C;AAAA,EACA;AACF;AACO,MAAM,6BAA6B;AAAA,EACxC;AAAA,EACA;AACF;AAEO,MAAM,uBAAuB;AAAA,EAClC,GAAG;AAAA,EACH,GAAG;AACL;AAIO,MAAM,YAAY;AAAA,EACvB,CAAC,CAAC,UAAU,gBAAgB,GAAG,CAAC,QAAQ,CAAC;AAAA,EACzC,CAAC,CAAC,QAAQ,GAAG,CAAC,YAAY,CAAC;AAAA,EAC3B,CAAC,CAAC,YAAY,GAAG,CAAC,SAAS,CAAC;AAAA,EAC5B,CAAC,CAAC,SAAS,GAAG,CAAC,YAAY,CAAC;AAAA,EAC5B,CAAC,CAAC,YAAY,GAAG,CAAC,QAAQ,CAAC;AAAA,EAC3B;AAAA,IACE,CAAC,QAAQ;AAAA,IACT;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EACF;AAEJ;AAGiCA,+BAAAA,qBAAqB,SAAS;;;;;"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export declare const createRouteFunctionsIndirect: readonly ["createFileRoute", "createRootRouteWithContext"];
|
|
2
|
-
export declare const createRouteFunctionsDirect: readonly ["createRootRoute", "createRoute"];
|
|
3
|
-
export declare const createRouteFunctions: readonly ["createRootRoute", "createRoute", "createFileRoute", "createRootRouteWithContext"];
|
|
4
|
-
export type CreateRouteFunction = (typeof createRouteFunctions)[number];
|
|
5
|
-
export declare const sortRules: readonly [readonly [readonly ["params", "validateSearch"], readonly ["search"]], readonly [readonly ["search"], readonly ["loaderDeps"]], readonly [readonly ["loaderDeps"], readonly ["context"]], readonly [readonly ["context"], readonly ["beforeLoad"]], readonly [readonly ["beforeLoad"], readonly ["loader"]], readonly [readonly ["loader"], readonly ["onEnter", "onStay", "onLeave", "head", "scripts", "headers", "remountDeps"]]];
|
|
6
|
-
export type CheckedProperties = (typeof sortRules)[number][number][number];
|
|
7
|
-
export declare const checkedProperties: readonly ("search" | "params" | "validateSearch" | "loaderDeps" | "context" | "beforeLoad" | "loader" | "onEnter" | "onStay" | "onLeave" | "head" | "scripts" | "headers" | "remountDeps")[];
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const utils = require("@typescript-eslint/utils");
|
|
4
|
-
const getDocsUrl = require("../../utils/get-docs-url.cjs");
|
|
5
|
-
const detectRouterImports = require("../../utils/detect-router-imports.cjs");
|
|
6
|
-
const createRoutePropertyOrder_utils = require("./create-route-property-order.utils.cjs");
|
|
7
|
-
const constants = require("./constants.cjs");
|
|
8
|
-
const createRule = utils.ESLintUtils.RuleCreator(getDocsUrl.getDocsUrl);
|
|
9
|
-
const createRouteFunctionSet = new Set(constants.createRouteFunctions);
|
|
10
|
-
function isCreateRouteFunction(node) {
|
|
11
|
-
return createRouteFunctionSet.has(node);
|
|
12
|
-
}
|
|
13
|
-
const name = "create-route-property-order";
|
|
14
|
-
const rule = createRule({
|
|
15
|
-
name,
|
|
16
|
-
meta: {
|
|
17
|
-
type: "problem",
|
|
18
|
-
docs: {
|
|
19
|
-
description: "Ensure correct order of inference sensitive properties for createRoute functions",
|
|
20
|
-
recommended: "error"
|
|
21
|
-
},
|
|
22
|
-
messages: {
|
|
23
|
-
invalidOrder: "Invalid order of properties for `{{function}}`."
|
|
24
|
-
},
|
|
25
|
-
schema: [],
|
|
26
|
-
hasSuggestions: true,
|
|
27
|
-
fixable: "code"
|
|
28
|
-
},
|
|
29
|
-
defaultOptions: [],
|
|
30
|
-
create: detectRouterImports.detectTanstackRouterImports((context) => {
|
|
31
|
-
return {
|
|
32
|
-
CallExpression(node) {
|
|
33
|
-
if (node.callee.type !== utils.AST_NODE_TYPES.Identifier) {
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
const createRouteFunction = node.callee.name;
|
|
37
|
-
if (!isCreateRouteFunction(createRouteFunction)) {
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
let args = node.arguments;
|
|
41
|
-
if (constants.createRouteFunctionsIndirect.includes(createRouteFunction)) {
|
|
42
|
-
if (node.parent.type === utils.AST_NODE_TYPES.CallExpression) {
|
|
43
|
-
args = node.parent.arguments;
|
|
44
|
-
} else {
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
const argument = args[0];
|
|
49
|
-
if (argument === void 0 || argument.type !== "ObjectExpression") {
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
const allProperties = argument.properties;
|
|
53
|
-
if (allProperties.length < 2) {
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
const properties = allProperties.flatMap((p) => {
|
|
57
|
-
if (p.type === utils.AST_NODE_TYPES.Property && p.key.type === utils.AST_NODE_TYPES.Identifier) {
|
|
58
|
-
return { name: p.key.name, property: p };
|
|
59
|
-
} else if (p.type === utils.AST_NODE_TYPES.SpreadElement) {
|
|
60
|
-
if (p.argument.type === utils.AST_NODE_TYPES.Identifier) {
|
|
61
|
-
return { name: p.argument.name, property: p };
|
|
62
|
-
} else {
|
|
63
|
-
throw new Error("Unsupported spread element");
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
return [];
|
|
67
|
-
});
|
|
68
|
-
const sortedProperties = createRoutePropertyOrder_utils.sortDataByOrder(properties, constants.sortRules, "name");
|
|
69
|
-
if (sortedProperties === null) {
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
context.report({
|
|
73
|
-
node: argument,
|
|
74
|
-
data: { function: node.callee.name },
|
|
75
|
-
messageId: "invalidOrder",
|
|
76
|
-
fix(fixer) {
|
|
77
|
-
const sourceCode = context.sourceCode;
|
|
78
|
-
const text = sortedProperties.reduce(
|
|
79
|
-
(sourceText, specifier, index) => {
|
|
80
|
-
let text2 = "";
|
|
81
|
-
if (index < allProperties.length - 1) {
|
|
82
|
-
text2 = sourceCode.getText().slice(
|
|
83
|
-
allProperties[index].range[1],
|
|
84
|
-
allProperties[index + 1].range[0]
|
|
85
|
-
);
|
|
86
|
-
}
|
|
87
|
-
return sourceText + sourceCode.getText(specifier.property) + text2;
|
|
88
|
-
},
|
|
89
|
-
""
|
|
90
|
-
);
|
|
91
|
-
return fixer.replaceTextRange(
|
|
92
|
-
[allProperties[0].range[0], allProperties.at(-1).range[1]],
|
|
93
|
-
text
|
|
94
|
-
);
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
};
|
|
99
|
-
})
|
|
100
|
-
});
|
|
101
|
-
exports.name = name;
|
|
102
|
-
exports.rule = rule;
|
|
103
|
-
//# sourceMappingURL=create-route-property-order.rule.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-route-property-order.rule.cjs","sources":["../../../../src/rules/create-route-property-order/create-route-property-order.rule.ts"],"sourcesContent":["import { AST_NODE_TYPES, ESLintUtils } from '@typescript-eslint/utils'\n\nimport { getDocsUrl } from '../../utils/get-docs-url'\nimport { detectTanstackRouterImports } from '../../utils/detect-router-imports'\nimport { sortDataByOrder } from './create-route-property-order.utils'\nimport {\n createRouteFunctions,\n createRouteFunctionsIndirect,\n sortRules,\n} from './constants'\nimport type { CreateRouteFunction } from './constants'\nimport type { ExtraRuleDocs } from '../../types'\n\nconst createRule = ESLintUtils.RuleCreator<ExtraRuleDocs>(getDocsUrl)\n\nconst createRouteFunctionSet = new Set(createRouteFunctions)\nfunction isCreateRouteFunction(node: any): node is CreateRouteFunction {\n return createRouteFunctionSet.has(node)\n}\n\nexport const name = 'create-route-property-order'\n\nexport const rule = createRule({\n name,\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Ensure correct order of inference sensitive properties for createRoute functions',\n recommended: 'error',\n },\n messages: {\n invalidOrder: 'Invalid order of properties for `{{function}}`.',\n },\n schema: [],\n hasSuggestions: true,\n fixable: 'code',\n },\n defaultOptions: [],\n\n create: detectTanstackRouterImports((context) => {\n return {\n CallExpression(node) {\n if (node.callee.type !== AST_NODE_TYPES.Identifier) {\n return\n }\n const createRouteFunction = node.callee.name\n if (!isCreateRouteFunction(createRouteFunction)) {\n return\n }\n let args = node.arguments\n if (createRouteFunctionsIndirect.includes(createRouteFunction as any)) {\n if (node.parent.type === AST_NODE_TYPES.CallExpression) {\n args = node.parent.arguments\n } else {\n return\n }\n }\n\n const argument = args[0]\n if (argument === undefined || argument.type !== 'ObjectExpression') {\n return\n }\n\n const allProperties = argument.properties\n // no need to sort if there is at max 1 property\n if (allProperties.length < 2) {\n return\n }\n\n const properties = allProperties.flatMap((p) => {\n if (\n p.type === AST_NODE_TYPES.Property &&\n p.key.type === AST_NODE_TYPES.Identifier\n ) {\n return { name: p.key.name, property: p }\n } else if (p.type === AST_NODE_TYPES.SpreadElement) {\n if (p.argument.type === AST_NODE_TYPES.Identifier) {\n return { name: p.argument.name, property: p }\n } else {\n throw new Error('Unsupported spread element')\n }\n }\n return []\n })\n\n const sortedProperties = sortDataByOrder(properties, sortRules, 'name')\n if (sortedProperties === null) {\n return\n }\n context.report({\n node: argument,\n data: { function: node.callee.name },\n messageId: 'invalidOrder',\n fix(fixer) {\n const sourceCode = context.sourceCode\n\n const text = sortedProperties.reduce(\n (sourceText, specifier, index) => {\n let text = ''\n if (index < allProperties.length - 1) {\n text = sourceCode\n .getText()\n .slice(\n allProperties[index]!.range[1],\n allProperties[index + 1]!.range[0],\n )\n }\n return (\n sourceText + sourceCode.getText(specifier.property) + text\n )\n },\n '',\n )\n return fixer.replaceTextRange(\n [allProperties[0]!.range[0], allProperties.at(-1)!.range[1]],\n text,\n )\n },\n })\n },\n }\n }),\n})\n"],"names":["ESLintUtils","getDocsUrl","createRouteFunctions","detectTanstackRouterImports","AST_NODE_TYPES","createRouteFunctionsIndirect","sortDataByOrder","sortRules","text"],"mappings":";;;;;;;AAaA,MAAM,aAAaA,MAAAA,YAAY,YAA2BC,qBAAU;AAEpE,MAAM,yBAAyB,IAAI,IAAIC,8BAAoB;AAC3D,SAAS,sBAAsB,MAAwC;AAC9D,SAAA,uBAAuB,IAAI,IAAI;AACxC;AAEO,MAAM,OAAO;AAEb,MAAM,OAAO,WAAW;AAAA,EAC7B;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,MACJ,aACE;AAAA,MACF,aAAa;AAAA,IACf;AAAA,IACA,UAAU;AAAA,MACR,cAAc;AAAA,IAChB;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,gBAAgB;AAAA,IAChB,SAAS;AAAA,EACX;AAAA,EACA,gBAAgB,CAAC;AAAA,EAEjB,QAAQC,oBAAAA,4BAA4B,CAAC,YAAY;AACxC,WAAA;AAAA,MACL,eAAe,MAAM;AACnB,YAAI,KAAK,OAAO,SAASC,MAAAA,eAAe,YAAY;AAClD;AAAA,QAAA;AAEI,cAAA,sBAAsB,KAAK,OAAO;AACpC,YAAA,CAAC,sBAAsB,mBAAmB,GAAG;AAC/C;AAAA,QAAA;AAEF,YAAI,OAAO,KAAK;AACZ,YAAAC,UAAA,6BAA6B,SAAS,mBAA0B,GAAG;AACrE,cAAI,KAAK,OAAO,SAASD,MAAAA,eAAe,gBAAgB;AACtD,mBAAO,KAAK,OAAO;AAAA,UAAA,OACd;AACL;AAAA,UAAA;AAAA,QACF;AAGI,cAAA,WAAW,KAAK,CAAC;AACvB,YAAI,aAAa,UAAa,SAAS,SAAS,oBAAoB;AAClE;AAAA,QAAA;AAGF,cAAM,gBAAgB,SAAS;AAE3B,YAAA,cAAc,SAAS,GAAG;AAC5B;AAAA,QAAA;AAGF,cAAM,aAAa,cAAc,QAAQ,CAAC,MAAM;AAE5C,cAAA,EAAE,SAASA,MAAAA,eAAe,YAC1B,EAAE,IAAI,SAASA,qBAAe,YAC9B;AACA,mBAAO,EAAE,MAAM,EAAE,IAAI,MAAM,UAAU,EAAE;AAAA,UAC9B,WAAA,EAAE,SAASA,MAAAA,eAAe,eAAe;AAClD,gBAAI,EAAE,SAAS,SAASA,MAAAA,eAAe,YAAY;AACjD,qBAAO,EAAE,MAAM,EAAE,SAAS,MAAM,UAAU,EAAE;AAAA,YAAA,OACvC;AACC,oBAAA,IAAI,MAAM,4BAA4B;AAAA,YAAA;AAAA,UAC9C;AAEF,iBAAO,CAAC;AAAA,QAAA,CACT;AAED,cAAM,mBAAmBE,+BAAA,gBAAgB,YAAYC,UAAAA,WAAW,MAAM;AACtE,YAAI,qBAAqB,MAAM;AAC7B;AAAA,QAAA;AAEF,gBAAQ,OAAO;AAAA,UACb,MAAM;AAAA,UACN,MAAM,EAAE,UAAU,KAAK,OAAO,KAAK;AAAA,UACnC,WAAW;AAAA,UACX,IAAI,OAAO;AACT,kBAAM,aAAa,QAAQ;AAE3B,kBAAM,OAAO,iBAAiB;AAAA,cAC5B,CAAC,YAAY,WAAW,UAAU;AAChC,oBAAIC,QAAO;AACP,oBAAA,QAAQ,cAAc,SAAS,GAAG;AACpCA,0BAAO,WACJ,QAAA,EACA;AAAA,oBACC,cAAc,KAAK,EAAG,MAAM,CAAC;AAAA,oBAC7B,cAAc,QAAQ,CAAC,EAAG,MAAM,CAAC;AAAA,kBACnC;AAAA,gBAAA;AAEJ,uBACE,aAAa,WAAW,QAAQ,UAAU,QAAQ,IAAIA;AAAAA,cAE1D;AAAA,cACA;AAAA,YACF;AACA,mBAAO,MAAM;AAAA,cACX,CAAC,cAAc,CAAC,EAAG,MAAM,CAAC,GAAG,cAAc,GAAG,EAAE,EAAG,MAAM,CAAC,CAAC;AAAA,cAC3D;AAAA,YACF;AAAA,UAAA;AAAA,QACF,CACD;AAAA,MAAA;AAAA,IAEL;AAAA,EACD,CAAA;AACH,CAAC;;;"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { ESLintUtils } from '@typescript-eslint/utils';
|
|
2
|
-
import { ExtraRuleDocs } from '../../types.cjs';
|
|
3
|
-
export declare const name = "create-route-property-order";
|
|
4
|
-
export declare const rule: ESLintUtils.RuleModule<string, readonly unknown[], ExtraRuleDocs, ESLintUtils.RuleListener>;
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
function sortDataByOrder(data, orderRules, key) {
|
|
4
|
-
const getSubsetIndex = (item, subsets) => {
|
|
5
|
-
var _a;
|
|
6
|
-
for (let i = 0; i < subsets.length; i++) {
|
|
7
|
-
if ((_a = subsets[i]) == null ? void 0 : _a.includes(item)) {
|
|
8
|
-
return i;
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
return null;
|
|
12
|
-
};
|
|
13
|
-
const orderSets = orderRules.reduce(
|
|
14
|
-
(sets, [A, B]) => [...sets, A, B],
|
|
15
|
-
[]
|
|
16
|
-
);
|
|
17
|
-
const inOrderArray = data.filter(
|
|
18
|
-
(item) => getSubsetIndex(item[key], orderSets) !== null
|
|
19
|
-
);
|
|
20
|
-
let wasResorted = false;
|
|
21
|
-
const sortedArray = inOrderArray.sort((a, b) => {
|
|
22
|
-
const aKey = a[key], bKey = b[key];
|
|
23
|
-
const aSubsetIndex = getSubsetIndex(aKey, orderSets);
|
|
24
|
-
const bSubsetIndex = getSubsetIndex(bKey, orderSets);
|
|
25
|
-
if (aSubsetIndex !== null && bSubsetIndex !== null && aSubsetIndex !== bSubsetIndex) {
|
|
26
|
-
return aSubsetIndex - bSubsetIndex;
|
|
27
|
-
}
|
|
28
|
-
return 0;
|
|
29
|
-
});
|
|
30
|
-
const inOrderIterator = sortedArray.values();
|
|
31
|
-
const result = data.map((item) => {
|
|
32
|
-
if (getSubsetIndex(item[key], orderSets) !== null) {
|
|
33
|
-
const sortedItem = inOrderIterator.next().value;
|
|
34
|
-
if (sortedItem[key] !== item[key]) {
|
|
35
|
-
wasResorted = true;
|
|
36
|
-
}
|
|
37
|
-
return sortedItem;
|
|
38
|
-
}
|
|
39
|
-
return item;
|
|
40
|
-
});
|
|
41
|
-
if (!wasResorted) {
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
return result;
|
|
45
|
-
}
|
|
46
|
-
function getCheckedProperties(orderRules) {
|
|
47
|
-
return [...new Set(orderRules.flat(2))];
|
|
48
|
-
}
|
|
49
|
-
exports.getCheckedProperties = getCheckedProperties;
|
|
50
|
-
exports.sortDataByOrder = sortDataByOrder;
|
|
51
|
-
//# sourceMappingURL=create-route-property-order.utils.cjs.map
|
package/dist/cjs/rules/create-route-property-order/create-route-property-order.utils.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-route-property-order.utils.cjs","sources":["../../../../src/rules/create-route-property-order/create-route-property-order.utils.ts"],"sourcesContent":["export function sortDataByOrder<T, TKey extends keyof T>(\n data: Array<T> | ReadonlyArray<T>,\n orderRules: ReadonlyArray<\n Readonly<[ReadonlyArray<T[TKey]>, ReadonlyArray<T[TKey]>]>\n >,\n key: TKey,\n): Array<T> | null {\n const getSubsetIndex = (\n item: T[TKey],\n subsets: ReadonlyArray<ReadonlyArray<T[TKey]> | Array<T[TKey]>>,\n ): number | null => {\n for (let i = 0; i < subsets.length; i++) {\n if (subsets[i]?.includes(item)) {\n return i\n }\n }\n return null\n }\n\n const orderSets = orderRules.reduce(\n (sets, [A, B]) => [...sets, A, B],\n [] as Array<ReadonlyArray<T[TKey]> | Array<T[TKey]>>,\n )\n\n const inOrderArray = data.filter(\n (item) => getSubsetIndex(item[key], orderSets) !== null,\n )\n\n let wasResorted = false as boolean\n\n // Sort by the relative order defined by the rules\n const sortedArray = inOrderArray.sort((a, b) => {\n const aKey = a[key],\n bKey = b[key]\n const aSubsetIndex = getSubsetIndex(aKey, orderSets)\n const bSubsetIndex = getSubsetIndex(bKey, orderSets)\n\n // If both items belong to different subsets, sort by their subset order\n if (\n aSubsetIndex !== null &&\n bSubsetIndex !== null &&\n aSubsetIndex !== bSubsetIndex\n ) {\n return aSubsetIndex - bSubsetIndex\n }\n\n // If both items belong to the same subset or neither is in the subset, keep their relative order\n return 0\n })\n\n const inOrderIterator = sortedArray.values()\n const result = data.map((item) => {\n if (getSubsetIndex(item[key], orderSets) !== null) {\n const sortedItem = inOrderIterator.next().value!\n if (sortedItem[key] !== item[key]) {\n wasResorted = true\n }\n return sortedItem\n }\n return item\n })\n\n if (!wasResorted) {\n return null\n }\n return result\n}\n\nexport function getCheckedProperties<T>(\n orderRules: ReadonlyArray<ReadonlyArray<ReadonlyArray<T>>>,\n): ReadonlyArray<T> {\n return [...new Set<T>(orderRules.flat(2))]\n}\n"],"names":[],"mappings":";;AAAgB,SAAA,gBACd,MACA,YAGA,KACiB;AACX,QAAA,iBAAiB,CACrB,MACA,YACkB;;AAClB,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,WAAI,aAAQ,CAAC,MAAT,mBAAY,SAAS,OAAO;AACvB,eAAA;AAAA,MAAA;AAAA,IACT;AAEK,WAAA;AAAA,EACT;AAEA,QAAM,YAAY,WAAW;AAAA,IAC3B,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC;AAAA,IAChC,CAAA;AAAA,EACF;AAEA,QAAM,eAAe,KAAK;AAAA,IACxB,CAAC,SAAS,eAAe,KAAK,GAAG,GAAG,SAAS,MAAM;AAAA,EACrD;AAEA,MAAI,cAAc;AAGlB,QAAM,cAAc,aAAa,KAAK,CAAC,GAAG,MAAM;AAC9C,UAAM,OAAO,EAAE,GAAG,GAChB,OAAO,EAAE,GAAG;AACR,UAAA,eAAe,eAAe,MAAM,SAAS;AAC7C,UAAA,eAAe,eAAe,MAAM,SAAS;AAGnD,QACE,iBAAiB,QACjB,iBAAiB,QACjB,iBAAiB,cACjB;AACA,aAAO,eAAe;AAAA,IAAA;AAIjB,WAAA;AAAA,EAAA,CACR;AAEK,QAAA,kBAAkB,YAAY,OAAO;AAC3C,QAAM,SAAS,KAAK,IAAI,CAAC,SAAS;AAChC,QAAI,eAAe,KAAK,GAAG,GAAG,SAAS,MAAM,MAAM;AAC3C,YAAA,aAAa,gBAAgB,KAAA,EAAO;AAC1C,UAAI,WAAW,GAAG,MAAM,KAAK,GAAG,GAAG;AACnB,sBAAA;AAAA,MAAA;AAET,aAAA;AAAA,IAAA;AAEF,WAAA;AAAA,EAAA,CACR;AAED,MAAI,CAAC,aAAa;AACT,WAAA;AAAA,EAAA;AAEF,SAAA;AACT;AAEO,SAAS,qBACd,YACkB;AACX,SAAA,CAAC,GAAG,IAAI,IAAO,WAAW,KAAK,CAAC,CAAC,CAAC;AAC3C;;;"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export declare function sortDataByOrder<T, TKey extends keyof T>(data: Array<T> | ReadonlyArray<T>, orderRules: ReadonlyArray<Readonly<[ReadonlyArray<T[TKey]>, ReadonlyArray<T[TKey]>]>>, key: TKey): Array<T> | null;
|
|
2
|
-
export declare function getCheckedProperties<T>(orderRules: ReadonlyArray<ReadonlyArray<ReadonlyArray<T>>>): ReadonlyArray<T>;
|
package/dist/cjs/rules.cjs
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const createRoutePropertyOrder_rule = require("./rules/create-route-property-order/create-route-property-order.rule.cjs");
|
|
4
|
-
const rules = {
|
|
5
|
-
[createRoutePropertyOrder_rule.name]: createRoutePropertyOrder_rule.rule
|
|
6
|
-
};
|
|
7
|
-
exports.rules = rules;
|
|
8
|
-
//# sourceMappingURL=rules.cjs.map
|
package/dist/cjs/rules.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rules.cjs","sources":["../../src/rules.ts"],"sourcesContent":["import * as createRoutePropertyOrder from './rules/create-route-property-order/create-route-property-order.rule'\nimport type { ESLintUtils } from '@typescript-eslint/utils'\nimport type { ExtraRuleDocs } from './types'\n\nexport const rules: Record<\n string,\n ESLintUtils.RuleModule<\n string,\n ReadonlyArray<unknown>,\n ExtraRuleDocs,\n ESLintUtils.RuleListener\n >\n> = {\n [createRoutePropertyOrder.name]: createRoutePropertyOrder.rule,\n}\n"],"names":["createRoutePropertyOrder.name","createRoutePropertyOrder.rule"],"mappings":";;;AAIO,MAAM,QAQT;AAAA,EACF,CAACA,kCAA6B,GAAGC,8BAAAA;AACnC;;"}
|
package/dist/cjs/rules.d.cts
DELETED
package/dist/cjs/types.d.cts
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const utils = require("@typescript-eslint/utils");
|
|
4
|
-
function detectTanstackRouterImports(create) {
|
|
5
|
-
return (context, optionsWithDefault) => {
|
|
6
|
-
const tanstackRouterImportSpecifiers = [];
|
|
7
|
-
const helpers = {
|
|
8
|
-
isSpecificTanstackRouterImport(node, source) {
|
|
9
|
-
return !!tanstackRouterImportSpecifiers.find((specifier) => {
|
|
10
|
-
if (specifier.type === utils.TSESTree.AST_NODE_TYPES.ImportSpecifier && specifier.parent.type === utils.TSESTree.AST_NODE_TYPES.ImportDeclaration && specifier.parent.source.value === source) {
|
|
11
|
-
return node.name === specifier.local.name;
|
|
12
|
-
}
|
|
13
|
-
return false;
|
|
14
|
-
});
|
|
15
|
-
},
|
|
16
|
-
isTanstackRouterImport(node) {
|
|
17
|
-
return !!tanstackRouterImportSpecifiers.find((specifier) => {
|
|
18
|
-
if (specifier.type === utils.TSESTree.AST_NODE_TYPES.ImportSpecifier) {
|
|
19
|
-
return node.name === specifier.local.name;
|
|
20
|
-
}
|
|
21
|
-
return false;
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
const detectionInstructions = {
|
|
26
|
-
ImportDeclaration(node) {
|
|
27
|
-
if (node.specifiers.length > 0 && node.importKind === "value" && node.source.value.startsWith("@tanstack/") && node.source.value.endsWith("-router")) {
|
|
28
|
-
tanstackRouterImportSpecifiers.push(...node.specifiers);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
const ruleInstructions = create(context, optionsWithDefault, helpers);
|
|
33
|
-
const enhancedRuleInstructions = {};
|
|
34
|
-
const allKeys = new Set(
|
|
35
|
-
Object.keys(detectionInstructions).concat(Object.keys(ruleInstructions))
|
|
36
|
-
);
|
|
37
|
-
allKeys.forEach((instruction) => {
|
|
38
|
-
enhancedRuleInstructions[instruction] = (node) => {
|
|
39
|
-
var _a;
|
|
40
|
-
if (instruction in detectionInstructions) {
|
|
41
|
-
(_a = detectionInstructions[instruction]) == null ? void 0 : _a.call(detectionInstructions, node);
|
|
42
|
-
}
|
|
43
|
-
const ruleFunction = ruleInstructions[instruction];
|
|
44
|
-
if (ruleFunction !== void 0) {
|
|
45
|
-
return ruleFunction(node);
|
|
46
|
-
}
|
|
47
|
-
return void 0;
|
|
48
|
-
};
|
|
49
|
-
});
|
|
50
|
-
return enhancedRuleInstructions;
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
exports.detectTanstackRouterImports = detectTanstackRouterImports;
|
|
54
|
-
//# sourceMappingURL=detect-router-imports.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"detect-router-imports.cjs","sources":["../../../src/utils/detect-router-imports.ts"],"sourcesContent":["import { TSESTree } from '@typescript-eslint/utils'\nimport type { ESLintUtils, TSESLint } from '@typescript-eslint/utils'\n\ntype Create = Parameters<\n ReturnType<typeof ESLintUtils.RuleCreator>\n>[0]['create']\n\ntype Context = Parameters<Create>[0]\ntype Options = Parameters<Create>[1]\ntype Helpers = {\n isSpecificTanstackRouterImport: (\n node: TSESTree.Identifier,\n source: string,\n ) => boolean\n isTanstackRouterImport: (node: TSESTree.Identifier) => boolean\n}\n\ntype EnhancedCreate = (\n context: Context,\n options: Options,\n helpers: Helpers,\n) => ReturnType<Create>\n\nexport function detectTanstackRouterImports(create: EnhancedCreate): Create {\n return (context, optionsWithDefault) => {\n const tanstackRouterImportSpecifiers: Array<TSESTree.ImportClause> = []\n\n const helpers: Helpers = {\n isSpecificTanstackRouterImport(node, source) {\n return !!tanstackRouterImportSpecifiers.find((specifier) => {\n if (\n specifier.type === TSESTree.AST_NODE_TYPES.ImportSpecifier &&\n specifier.parent.type ===\n TSESTree.AST_NODE_TYPES.ImportDeclaration &&\n specifier.parent.source.value === source\n ) {\n return node.name === specifier.local.name\n }\n\n return false\n })\n },\n isTanstackRouterImport(node) {\n return !!tanstackRouterImportSpecifiers.find((specifier) => {\n if (specifier.type === TSESTree.AST_NODE_TYPES.ImportSpecifier) {\n return node.name === specifier.local.name\n }\n\n return false\n })\n },\n }\n\n const detectionInstructions: TSESLint.RuleListener = {\n ImportDeclaration(node) {\n if (\n node.specifiers.length > 0 &&\n node.importKind === 'value' &&\n node.source.value.startsWith('@tanstack/') &&\n node.source.value.endsWith('-router')\n ) {\n tanstackRouterImportSpecifiers.push(...node.specifiers)\n }\n },\n }\n\n // Call original rule definition\n const ruleInstructions = create(context, optionsWithDefault, helpers)\n const enhancedRuleInstructions: TSESLint.RuleListener = {}\n\n const allKeys = new Set(\n Object.keys(detectionInstructions).concat(Object.keys(ruleInstructions)),\n )\n\n // Iterate over ALL instructions keys so we can override original rule instructions\n // to prevent their execution if conditions to report errors are not met.\n allKeys.forEach((instruction) => {\n enhancedRuleInstructions[instruction] = (node) => {\n if (instruction in detectionInstructions) {\n detectionInstructions[instruction]?.(node)\n }\n\n const ruleFunction = ruleInstructions[instruction]\n if (ruleFunction !== undefined) {\n return ruleFunction(node)\n }\n\n return undefined\n }\n })\n\n return enhancedRuleInstructions\n }\n}\n"],"names":["TSESTree"],"mappings":";;;AAuBO,SAAS,4BAA4B,QAAgC;AACnE,SAAA,CAAC,SAAS,uBAAuB;AACtC,UAAM,iCAA+D,CAAC;AAEtE,UAAM,UAAmB;AAAA,MACvB,+BAA+B,MAAM,QAAQ;AAC3C,eAAO,CAAC,CAAC,+BAA+B,KAAK,CAAC,cAAc;AAC1D,cACE,UAAU,SAASA,MAAS,SAAA,eAAe,mBAC3C,UAAU,OAAO,SACfA,MAAAA,SAAS,eAAe,qBAC1B,UAAU,OAAO,OAAO,UAAU,QAClC;AACO,mBAAA,KAAK,SAAS,UAAU,MAAM;AAAA,UAAA;AAGhC,iBAAA;AAAA,QAAA,CACR;AAAA,MACH;AAAA,MACA,uBAAuB,MAAM;AAC3B,eAAO,CAAC,CAAC,+BAA+B,KAAK,CAAC,cAAc;AAC1D,cAAI,UAAU,SAASA,eAAS,eAAe,iBAAiB;AACvD,mBAAA,KAAK,SAAS,UAAU,MAAM;AAAA,UAAA;AAGhC,iBAAA;AAAA,QAAA,CACR;AAAA,MAAA;AAAA,IAEL;AAEA,UAAM,wBAA+C;AAAA,MACnD,kBAAkB,MAAM;AACtB,YACE,KAAK,WAAW,SAAS,KACzB,KAAK,eAAe,WACpB,KAAK,OAAO,MAAM,WAAW,YAAY,KACzC,KAAK,OAAO,MAAM,SAAS,SAAS,GACpC;AAC+B,yCAAA,KAAK,GAAG,KAAK,UAAU;AAAA,QAAA;AAAA,MACxD;AAAA,IAEJ;AAGA,UAAM,mBAAmB,OAAO,SAAS,oBAAoB,OAAO;AACpE,UAAM,2BAAkD,CAAC;AAEzD,UAAM,UAAU,IAAI;AAAA,MAClB,OAAO,KAAK,qBAAqB,EAAE,OAAO,OAAO,KAAK,gBAAgB,CAAC;AAAA,IACzE;AAIQ,YAAA,QAAQ,CAAC,gBAAgB;AACN,+BAAA,WAAW,IAAI,CAAC,SAAS;;AAChD,YAAI,eAAe,uBAAuB;AAClB,sCAAA,iBAAA,+CAAe;AAAA,QAAI;AAGrC,cAAA,eAAe,iBAAiB,WAAW;AACjD,YAAI,iBAAiB,QAAW;AAC9B,iBAAO,aAAa,IAAI;AAAA,QAAA;AAGnB,eAAA;AAAA,MACT;AAAA,IAAA,CACD;AAEM,WAAA;AAAA,EACT;AACF;;"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { TSESTree, ESLintUtils } from '@typescript-eslint/utils';
|
|
2
|
-
type Create = Parameters<ReturnType<typeof ESLintUtils.RuleCreator>>[0]['create'];
|
|
3
|
-
type Context = Parameters<Create>[0];
|
|
4
|
-
type Options = Parameters<Create>[1];
|
|
5
|
-
type Helpers = {
|
|
6
|
-
isSpecificTanstackRouterImport: (node: TSESTree.Identifier, source: string) => boolean;
|
|
7
|
-
isTanstackRouterImport: (node: TSESTree.Identifier) => boolean;
|
|
8
|
-
};
|
|
9
|
-
type EnhancedCreate = (context: Context, options: Options, helpers: Helpers) => ReturnType<Create>;
|
|
10
|
-
export declare function detectTanstackRouterImports(create: EnhancedCreate): Create;
|
|
11
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-docs-url.cjs","sources":["../../../src/utils/get-docs-url.ts"],"sourcesContent":["export const getDocsUrl = (ruleName: string): string =>\n `https://tanstack.com/router/latest/docs/eslint/${ruleName}`\n"],"names":[],"mappings":";;AAAO,MAAM,aAAa,CAAC,aACzB,kDAAkD,QAAQ;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const getDocsUrl: (ruleName: string) => string;
|
package/dist/esm/index.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { rules } from './rules.js';
|
|
2
|
-
import { ESLint, Linter } from 'eslint';
|
|
3
|
-
import { RuleModule } from '@typescript-eslint/utils/ts-eslint';
|
|
4
|
-
type RuleKey = keyof typeof rules;
|
|
5
|
-
interface Plugin extends Omit<ESLint.Plugin, 'rules'> {
|
|
6
|
-
rules: Record<RuleKey, RuleModule<any, any, any>>;
|
|
7
|
-
configs: {
|
|
8
|
-
recommended: ESLint.ConfigData;
|
|
9
|
-
'flat/recommended': Array<Linter.FlatConfig>;
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
declare const plugin: Plugin;
|
|
13
|
-
export default plugin;
|
package/dist/esm/index.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { rules } from "./rules.js";
|
|
2
|
-
const plugin = {
|
|
3
|
-
meta: {
|
|
4
|
-
name: "@tanstack/eslint-plugin-router"
|
|
5
|
-
},
|
|
6
|
-
configs: {},
|
|
7
|
-
rules
|
|
8
|
-
};
|
|
9
|
-
Object.assign(plugin.configs, {
|
|
10
|
-
recommended: {
|
|
11
|
-
plugins: ["@tanstack/eslint-plugin-router"],
|
|
12
|
-
rules: {
|
|
13
|
-
"@tanstack/router/create-route-property-order": "warn"
|
|
14
|
-
}
|
|
15
|
-
},
|
|
16
|
-
"flat/recommended": [
|
|
17
|
-
{
|
|
18
|
-
plugins: {
|
|
19
|
-
"@tanstack/router": plugin
|
|
20
|
-
},
|
|
21
|
-
rules: {
|
|
22
|
-
"@tanstack/router/create-route-property-order": "warn"
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
]
|
|
26
|
-
});
|
|
27
|
-
export {
|
|
28
|
-
plugin as default
|
|
29
|
-
};
|
|
30
|
-
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["import { rules } from './rules'\nimport type { ESLint, Linter } from 'eslint'\nimport type { RuleModule } from '@typescript-eslint/utils/ts-eslint'\n\ntype RuleKey = keyof typeof rules\n\ninterface Plugin extends Omit<ESLint.Plugin, 'rules'> {\n rules: Record<RuleKey, RuleModule<any, any, any>>\n configs: {\n recommended: ESLint.ConfigData\n 'flat/recommended': Array<Linter.FlatConfig>\n }\n}\n\nconst plugin: Plugin = {\n meta: {\n name: '@tanstack/eslint-plugin-router',\n },\n configs: {} as Plugin['configs'],\n rules,\n}\n\n// Assign configs here so we can reference `plugin`\nObject.assign(plugin.configs, {\n recommended: {\n plugins: ['@tanstack/eslint-plugin-router'],\n rules: {\n '@tanstack/router/create-route-property-order': 'warn',\n },\n },\n 'flat/recommended': [\n {\n plugins: {\n '@tanstack/router': plugin,\n },\n rules: {\n '@tanstack/router/create-route-property-order': 'warn',\n },\n },\n ],\n})\n\nexport default plugin\n"],"names":[],"mappings":";AAcA,MAAM,SAAiB;AAAA,EACrB,MAAM;AAAA,IACJ,MAAM;AAAA,EACR;AAAA,EACA,SAAS,CAAC;AAAA,EACV;AACF;AAGA,OAAO,OAAO,OAAO,SAAS;AAAA,EAC5B,aAAa;AAAA,IACX,SAAS,CAAC,gCAAgC;AAAA,IAC1C,OAAO;AAAA,MACL,gDAAgD;AAAA,IAAA;AAAA,EAEpD;AAAA,EACA,oBAAoB;AAAA,IAClB;AAAA,MACE,SAAS;AAAA,QACP,oBAAoB;AAAA,MACtB;AAAA,MACA,OAAO;AAAA,QACL,gDAAgD;AAAA,MAAA;AAAA,IAClD;AAAA,EACF;AAEJ,CAAC;"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export declare const createRouteFunctionsIndirect: readonly ["createFileRoute", "createRootRouteWithContext"];
|
|
2
|
-
export declare const createRouteFunctionsDirect: readonly ["createRootRoute", "createRoute"];
|
|
3
|
-
export declare const createRouteFunctions: readonly ["createRootRoute", "createRoute", "createFileRoute", "createRootRouteWithContext"];
|
|
4
|
-
export type CreateRouteFunction = (typeof createRouteFunctions)[number];
|
|
5
|
-
export declare const sortRules: readonly [readonly [readonly ["params", "validateSearch"], readonly ["search"]], readonly [readonly ["search"], readonly ["loaderDeps"]], readonly [readonly ["loaderDeps"], readonly ["context"]], readonly [readonly ["context"], readonly ["beforeLoad"]], readonly [readonly ["beforeLoad"], readonly ["loader"]], readonly [readonly ["loader"], readonly ["onEnter", "onStay", "onLeave", "head", "scripts", "headers", "remountDeps"]]];
|
|
6
|
-
export type CheckedProperties = (typeof sortRules)[number][number][number];
|
|
7
|
-
export declare const checkedProperties: readonly ("search" | "params" | "validateSearch" | "loaderDeps" | "context" | "beforeLoad" | "loader" | "onEnter" | "onStay" | "onLeave" | "head" | "scripts" | "headers" | "remountDeps")[];
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { getCheckedProperties } from "./create-route-property-order.utils.js";
|
|
2
|
-
const createRouteFunctionsIndirect = [
|
|
3
|
-
"createFileRoute",
|
|
4
|
-
"createRootRouteWithContext"
|
|
5
|
-
];
|
|
6
|
-
const createRouteFunctionsDirect = [
|
|
7
|
-
"createRootRoute",
|
|
8
|
-
"createRoute"
|
|
9
|
-
];
|
|
10
|
-
const createRouteFunctions = [
|
|
11
|
-
...createRouteFunctionsDirect,
|
|
12
|
-
...createRouteFunctionsIndirect
|
|
13
|
-
];
|
|
14
|
-
const sortRules = [
|
|
15
|
-
[["params", "validateSearch"], ["search"]],
|
|
16
|
-
[["search"], ["loaderDeps"]],
|
|
17
|
-
[["loaderDeps"], ["context"]],
|
|
18
|
-
[["context"], ["beforeLoad"]],
|
|
19
|
-
[["beforeLoad"], ["loader"]],
|
|
20
|
-
[
|
|
21
|
-
["loader"],
|
|
22
|
-
[
|
|
23
|
-
"onEnter",
|
|
24
|
-
"onStay",
|
|
25
|
-
"onLeave",
|
|
26
|
-
"head",
|
|
27
|
-
"scripts",
|
|
28
|
-
"headers",
|
|
29
|
-
"remountDeps"
|
|
30
|
-
]
|
|
31
|
-
]
|
|
32
|
-
];
|
|
33
|
-
getCheckedProperties(sortRules);
|
|
34
|
-
export {
|
|
35
|
-
createRouteFunctions,
|
|
36
|
-
createRouteFunctionsDirect,
|
|
37
|
-
createRouteFunctionsIndirect,
|
|
38
|
-
sortRules
|
|
39
|
-
};
|
|
40
|
-
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sources":["../../../../src/rules/create-route-property-order/constants.ts"],"sourcesContent":["import { getCheckedProperties } from './create-route-property-order.utils'\n\nexport const createRouteFunctionsIndirect = [\n 'createFileRoute',\n 'createRootRouteWithContext',\n] as const\nexport const createRouteFunctionsDirect = [\n 'createRootRoute',\n 'createRoute',\n] as const\n\nexport const createRouteFunctions = [\n ...createRouteFunctionsDirect,\n ...createRouteFunctionsIndirect,\n] as const\n\nexport type CreateRouteFunction = (typeof createRouteFunctions)[number]\n\nexport const sortRules = [\n [['params', 'validateSearch'], ['search']],\n [['search'], ['loaderDeps']],\n [['loaderDeps'], ['context']],\n [['context'], ['beforeLoad']],\n [['beforeLoad'], ['loader']],\n [\n ['loader'],\n [\n 'onEnter',\n 'onStay',\n 'onLeave',\n 'head',\n 'scripts',\n 'headers',\n 'remountDeps',\n ],\n ],\n] as const\n\nexport type CheckedProperties = (typeof sortRules)[number][number][number]\nexport const checkedProperties = getCheckedProperties(sortRules)\n"],"names":[],"mappings":";AAEO,MAAM,+BAA+B;AAAA,EAC1C;AAAA,EACA;AACF;AACO,MAAM,6BAA6B;AAAA,EACxC;AAAA,EACA;AACF;AAEO,MAAM,uBAAuB;AAAA,EAClC,GAAG;AAAA,EACH,GAAG;AACL;AAIO,MAAM,YAAY;AAAA,EACvB,CAAC,CAAC,UAAU,gBAAgB,GAAG,CAAC,QAAQ,CAAC;AAAA,EACzC,CAAC,CAAC,QAAQ,GAAG,CAAC,YAAY,CAAC;AAAA,EAC3B,CAAC,CAAC,YAAY,GAAG,CAAC,SAAS,CAAC;AAAA,EAC5B,CAAC,CAAC,SAAS,GAAG,CAAC,YAAY,CAAC;AAAA,EAC5B,CAAC,CAAC,YAAY,GAAG,CAAC,QAAQ,CAAC;AAAA,EAC3B;AAAA,IACE,CAAC,QAAQ;AAAA,IACT;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EACF;AAEJ;AAGiC,qBAAqB,SAAS;"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { ESLintUtils } from '@typescript-eslint/utils';
|
|
2
|
-
import { ExtraRuleDocs } from '../../types.js';
|
|
3
|
-
export declare const name = "create-route-property-order";
|
|
4
|
-
export declare const rule: ESLintUtils.RuleModule<string, readonly unknown[], ExtraRuleDocs, ESLintUtils.RuleListener>;
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
import { ESLintUtils, AST_NODE_TYPES } from "@typescript-eslint/utils";
|
|
2
|
-
import { getDocsUrl } from "../../utils/get-docs-url.js";
|
|
3
|
-
import { detectTanstackRouterImports } from "../../utils/detect-router-imports.js";
|
|
4
|
-
import { sortDataByOrder } from "./create-route-property-order.utils.js";
|
|
5
|
-
import { createRouteFunctions, createRouteFunctionsIndirect, sortRules } from "./constants.js";
|
|
6
|
-
const createRule = ESLintUtils.RuleCreator(getDocsUrl);
|
|
7
|
-
const createRouteFunctionSet = new Set(createRouteFunctions);
|
|
8
|
-
function isCreateRouteFunction(node) {
|
|
9
|
-
return createRouteFunctionSet.has(node);
|
|
10
|
-
}
|
|
11
|
-
const name = "create-route-property-order";
|
|
12
|
-
const rule = createRule({
|
|
13
|
-
name,
|
|
14
|
-
meta: {
|
|
15
|
-
type: "problem",
|
|
16
|
-
docs: {
|
|
17
|
-
description: "Ensure correct order of inference sensitive properties for createRoute functions",
|
|
18
|
-
recommended: "error"
|
|
19
|
-
},
|
|
20
|
-
messages: {
|
|
21
|
-
invalidOrder: "Invalid order of properties for `{{function}}`."
|
|
22
|
-
},
|
|
23
|
-
schema: [],
|
|
24
|
-
hasSuggestions: true,
|
|
25
|
-
fixable: "code"
|
|
26
|
-
},
|
|
27
|
-
defaultOptions: [],
|
|
28
|
-
create: detectTanstackRouterImports((context) => {
|
|
29
|
-
return {
|
|
30
|
-
CallExpression(node) {
|
|
31
|
-
if (node.callee.type !== AST_NODE_TYPES.Identifier) {
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
const createRouteFunction = node.callee.name;
|
|
35
|
-
if (!isCreateRouteFunction(createRouteFunction)) {
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
let args = node.arguments;
|
|
39
|
-
if (createRouteFunctionsIndirect.includes(createRouteFunction)) {
|
|
40
|
-
if (node.parent.type === AST_NODE_TYPES.CallExpression) {
|
|
41
|
-
args = node.parent.arguments;
|
|
42
|
-
} else {
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
const argument = args[0];
|
|
47
|
-
if (argument === void 0 || argument.type !== "ObjectExpression") {
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
const allProperties = argument.properties;
|
|
51
|
-
if (allProperties.length < 2) {
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
const properties = allProperties.flatMap((p) => {
|
|
55
|
-
if (p.type === AST_NODE_TYPES.Property && p.key.type === AST_NODE_TYPES.Identifier) {
|
|
56
|
-
return { name: p.key.name, property: p };
|
|
57
|
-
} else if (p.type === AST_NODE_TYPES.SpreadElement) {
|
|
58
|
-
if (p.argument.type === AST_NODE_TYPES.Identifier) {
|
|
59
|
-
return { name: p.argument.name, property: p };
|
|
60
|
-
} else {
|
|
61
|
-
throw new Error("Unsupported spread element");
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
return [];
|
|
65
|
-
});
|
|
66
|
-
const sortedProperties = sortDataByOrder(properties, sortRules, "name");
|
|
67
|
-
if (sortedProperties === null) {
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
context.report({
|
|
71
|
-
node: argument,
|
|
72
|
-
data: { function: node.callee.name },
|
|
73
|
-
messageId: "invalidOrder",
|
|
74
|
-
fix(fixer) {
|
|
75
|
-
const sourceCode = context.sourceCode;
|
|
76
|
-
const text = sortedProperties.reduce(
|
|
77
|
-
(sourceText, specifier, index) => {
|
|
78
|
-
let text2 = "";
|
|
79
|
-
if (index < allProperties.length - 1) {
|
|
80
|
-
text2 = sourceCode.getText().slice(
|
|
81
|
-
allProperties[index].range[1],
|
|
82
|
-
allProperties[index + 1].range[0]
|
|
83
|
-
);
|
|
84
|
-
}
|
|
85
|
-
return sourceText + sourceCode.getText(specifier.property) + text2;
|
|
86
|
-
},
|
|
87
|
-
""
|
|
88
|
-
);
|
|
89
|
-
return fixer.replaceTextRange(
|
|
90
|
-
[allProperties[0].range[0], allProperties.at(-1).range[1]],
|
|
91
|
-
text
|
|
92
|
-
);
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
};
|
|
97
|
-
})
|
|
98
|
-
});
|
|
99
|
-
export {
|
|
100
|
-
name,
|
|
101
|
-
rule
|
|
102
|
-
};
|
|
103
|
-
//# sourceMappingURL=create-route-property-order.rule.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-route-property-order.rule.js","sources":["../../../../src/rules/create-route-property-order/create-route-property-order.rule.ts"],"sourcesContent":["import { AST_NODE_TYPES, ESLintUtils } from '@typescript-eslint/utils'\n\nimport { getDocsUrl } from '../../utils/get-docs-url'\nimport { detectTanstackRouterImports } from '../../utils/detect-router-imports'\nimport { sortDataByOrder } from './create-route-property-order.utils'\nimport {\n createRouteFunctions,\n createRouteFunctionsIndirect,\n sortRules,\n} from './constants'\nimport type { CreateRouteFunction } from './constants'\nimport type { ExtraRuleDocs } from '../../types'\n\nconst createRule = ESLintUtils.RuleCreator<ExtraRuleDocs>(getDocsUrl)\n\nconst createRouteFunctionSet = new Set(createRouteFunctions)\nfunction isCreateRouteFunction(node: any): node is CreateRouteFunction {\n return createRouteFunctionSet.has(node)\n}\n\nexport const name = 'create-route-property-order'\n\nexport const rule = createRule({\n name,\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Ensure correct order of inference sensitive properties for createRoute functions',\n recommended: 'error',\n },\n messages: {\n invalidOrder: 'Invalid order of properties for `{{function}}`.',\n },\n schema: [],\n hasSuggestions: true,\n fixable: 'code',\n },\n defaultOptions: [],\n\n create: detectTanstackRouterImports((context) => {\n return {\n CallExpression(node) {\n if (node.callee.type !== AST_NODE_TYPES.Identifier) {\n return\n }\n const createRouteFunction = node.callee.name\n if (!isCreateRouteFunction(createRouteFunction)) {\n return\n }\n let args = node.arguments\n if (createRouteFunctionsIndirect.includes(createRouteFunction as any)) {\n if (node.parent.type === AST_NODE_TYPES.CallExpression) {\n args = node.parent.arguments\n } else {\n return\n }\n }\n\n const argument = args[0]\n if (argument === undefined || argument.type !== 'ObjectExpression') {\n return\n }\n\n const allProperties = argument.properties\n // no need to sort if there is at max 1 property\n if (allProperties.length < 2) {\n return\n }\n\n const properties = allProperties.flatMap((p) => {\n if (\n p.type === AST_NODE_TYPES.Property &&\n p.key.type === AST_NODE_TYPES.Identifier\n ) {\n return { name: p.key.name, property: p }\n } else if (p.type === AST_NODE_TYPES.SpreadElement) {\n if (p.argument.type === AST_NODE_TYPES.Identifier) {\n return { name: p.argument.name, property: p }\n } else {\n throw new Error('Unsupported spread element')\n }\n }\n return []\n })\n\n const sortedProperties = sortDataByOrder(properties, sortRules, 'name')\n if (sortedProperties === null) {\n return\n }\n context.report({\n node: argument,\n data: { function: node.callee.name },\n messageId: 'invalidOrder',\n fix(fixer) {\n const sourceCode = context.sourceCode\n\n const text = sortedProperties.reduce(\n (sourceText, specifier, index) => {\n let text = ''\n if (index < allProperties.length - 1) {\n text = sourceCode\n .getText()\n .slice(\n allProperties[index]!.range[1],\n allProperties[index + 1]!.range[0],\n )\n }\n return (\n sourceText + sourceCode.getText(specifier.property) + text\n )\n },\n '',\n )\n return fixer.replaceTextRange(\n [allProperties[0]!.range[0], allProperties.at(-1)!.range[1]],\n text,\n )\n },\n })\n },\n }\n }),\n})\n"],"names":["text"],"mappings":";;;;;AAaA,MAAM,aAAa,YAAY,YAA2B,UAAU;AAEpE,MAAM,yBAAyB,IAAI,IAAI,oBAAoB;AAC3D,SAAS,sBAAsB,MAAwC;AAC9D,SAAA,uBAAuB,IAAI,IAAI;AACxC;AAEO,MAAM,OAAO;AAEb,MAAM,OAAO,WAAW;AAAA,EAC7B;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,MACJ,aACE;AAAA,MACF,aAAa;AAAA,IACf;AAAA,IACA,UAAU;AAAA,MACR,cAAc;AAAA,IAChB;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,gBAAgB;AAAA,IAChB,SAAS;AAAA,EACX;AAAA,EACA,gBAAgB,CAAC;AAAA,EAEjB,QAAQ,4BAA4B,CAAC,YAAY;AACxC,WAAA;AAAA,MACL,eAAe,MAAM;AACnB,YAAI,KAAK,OAAO,SAAS,eAAe,YAAY;AAClD;AAAA,QAAA;AAEI,cAAA,sBAAsB,KAAK,OAAO;AACpC,YAAA,CAAC,sBAAsB,mBAAmB,GAAG;AAC/C;AAAA,QAAA;AAEF,YAAI,OAAO,KAAK;AACZ,YAAA,6BAA6B,SAAS,mBAA0B,GAAG;AACrE,cAAI,KAAK,OAAO,SAAS,eAAe,gBAAgB;AACtD,mBAAO,KAAK,OAAO;AAAA,UAAA,OACd;AACL;AAAA,UAAA;AAAA,QACF;AAGI,cAAA,WAAW,KAAK,CAAC;AACvB,YAAI,aAAa,UAAa,SAAS,SAAS,oBAAoB;AAClE;AAAA,QAAA;AAGF,cAAM,gBAAgB,SAAS;AAE3B,YAAA,cAAc,SAAS,GAAG;AAC5B;AAAA,QAAA;AAGF,cAAM,aAAa,cAAc,QAAQ,CAAC,MAAM;AAE5C,cAAA,EAAE,SAAS,eAAe,YAC1B,EAAE,IAAI,SAAS,eAAe,YAC9B;AACA,mBAAO,EAAE,MAAM,EAAE,IAAI,MAAM,UAAU,EAAE;AAAA,UAC9B,WAAA,EAAE,SAAS,eAAe,eAAe;AAClD,gBAAI,EAAE,SAAS,SAAS,eAAe,YAAY;AACjD,qBAAO,EAAE,MAAM,EAAE,SAAS,MAAM,UAAU,EAAE;AAAA,YAAA,OACvC;AACC,oBAAA,IAAI,MAAM,4BAA4B;AAAA,YAAA;AAAA,UAC9C;AAEF,iBAAO,CAAC;AAAA,QAAA,CACT;AAED,cAAM,mBAAmB,gBAAgB,YAAY,WAAW,MAAM;AACtE,YAAI,qBAAqB,MAAM;AAC7B;AAAA,QAAA;AAEF,gBAAQ,OAAO;AAAA,UACb,MAAM;AAAA,UACN,MAAM,EAAE,UAAU,KAAK,OAAO,KAAK;AAAA,UACnC,WAAW;AAAA,UACX,IAAI,OAAO;AACT,kBAAM,aAAa,QAAQ;AAE3B,kBAAM,OAAO,iBAAiB;AAAA,cAC5B,CAAC,YAAY,WAAW,UAAU;AAChC,oBAAIA,QAAO;AACP,oBAAA,QAAQ,cAAc,SAAS,GAAG;AACpCA,0BAAO,WACJ,QAAA,EACA;AAAA,oBACC,cAAc,KAAK,EAAG,MAAM,CAAC;AAAA,oBAC7B,cAAc,QAAQ,CAAC,EAAG,MAAM,CAAC;AAAA,kBACnC;AAAA,gBAAA;AAEJ,uBACE,aAAa,WAAW,QAAQ,UAAU,QAAQ,IAAIA;AAAAA,cAE1D;AAAA,cACA;AAAA,YACF;AACA,mBAAO,MAAM;AAAA,cACX,CAAC,cAAc,CAAC,EAAG,MAAM,CAAC,GAAG,cAAc,GAAG,EAAE,EAAG,MAAM,CAAC,CAAC;AAAA,cAC3D;AAAA,YACF;AAAA,UAAA;AAAA,QACF,CACD;AAAA,MAAA;AAAA,IAEL;AAAA,EACD,CAAA;AACH,CAAC;"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export declare function sortDataByOrder<T, TKey extends keyof T>(data: Array<T> | ReadonlyArray<T>, orderRules: ReadonlyArray<Readonly<[ReadonlyArray<T[TKey]>, ReadonlyArray<T[TKey]>]>>, key: TKey): Array<T> | null;
|
|
2
|
-
export declare function getCheckedProperties<T>(orderRules: ReadonlyArray<ReadonlyArray<ReadonlyArray<T>>>): ReadonlyArray<T>;
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
function sortDataByOrder(data, orderRules, key) {
|
|
2
|
-
const getSubsetIndex = (item, subsets) => {
|
|
3
|
-
var _a;
|
|
4
|
-
for (let i = 0; i < subsets.length; i++) {
|
|
5
|
-
if ((_a = subsets[i]) == null ? void 0 : _a.includes(item)) {
|
|
6
|
-
return i;
|
|
7
|
-
}
|
|
8
|
-
}
|
|
9
|
-
return null;
|
|
10
|
-
};
|
|
11
|
-
const orderSets = orderRules.reduce(
|
|
12
|
-
(sets, [A, B]) => [...sets, A, B],
|
|
13
|
-
[]
|
|
14
|
-
);
|
|
15
|
-
const inOrderArray = data.filter(
|
|
16
|
-
(item) => getSubsetIndex(item[key], orderSets) !== null
|
|
17
|
-
);
|
|
18
|
-
let wasResorted = false;
|
|
19
|
-
const sortedArray = inOrderArray.sort((a, b) => {
|
|
20
|
-
const aKey = a[key], bKey = b[key];
|
|
21
|
-
const aSubsetIndex = getSubsetIndex(aKey, orderSets);
|
|
22
|
-
const bSubsetIndex = getSubsetIndex(bKey, orderSets);
|
|
23
|
-
if (aSubsetIndex !== null && bSubsetIndex !== null && aSubsetIndex !== bSubsetIndex) {
|
|
24
|
-
return aSubsetIndex - bSubsetIndex;
|
|
25
|
-
}
|
|
26
|
-
return 0;
|
|
27
|
-
});
|
|
28
|
-
const inOrderIterator = sortedArray.values();
|
|
29
|
-
const result = data.map((item) => {
|
|
30
|
-
if (getSubsetIndex(item[key], orderSets) !== null) {
|
|
31
|
-
const sortedItem = inOrderIterator.next().value;
|
|
32
|
-
if (sortedItem[key] !== item[key]) {
|
|
33
|
-
wasResorted = true;
|
|
34
|
-
}
|
|
35
|
-
return sortedItem;
|
|
36
|
-
}
|
|
37
|
-
return item;
|
|
38
|
-
});
|
|
39
|
-
if (!wasResorted) {
|
|
40
|
-
return null;
|
|
41
|
-
}
|
|
42
|
-
return result;
|
|
43
|
-
}
|
|
44
|
-
function getCheckedProperties(orderRules) {
|
|
45
|
-
return [...new Set(orderRules.flat(2))];
|
|
46
|
-
}
|
|
47
|
-
export {
|
|
48
|
-
getCheckedProperties,
|
|
49
|
-
sortDataByOrder
|
|
50
|
-
};
|
|
51
|
-
//# sourceMappingURL=create-route-property-order.utils.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-route-property-order.utils.js","sources":["../../../../src/rules/create-route-property-order/create-route-property-order.utils.ts"],"sourcesContent":["export function sortDataByOrder<T, TKey extends keyof T>(\n data: Array<T> | ReadonlyArray<T>,\n orderRules: ReadonlyArray<\n Readonly<[ReadonlyArray<T[TKey]>, ReadonlyArray<T[TKey]>]>\n >,\n key: TKey,\n): Array<T> | null {\n const getSubsetIndex = (\n item: T[TKey],\n subsets: ReadonlyArray<ReadonlyArray<T[TKey]> | Array<T[TKey]>>,\n ): number | null => {\n for (let i = 0; i < subsets.length; i++) {\n if (subsets[i]?.includes(item)) {\n return i\n }\n }\n return null\n }\n\n const orderSets = orderRules.reduce(\n (sets, [A, B]) => [...sets, A, B],\n [] as Array<ReadonlyArray<T[TKey]> | Array<T[TKey]>>,\n )\n\n const inOrderArray = data.filter(\n (item) => getSubsetIndex(item[key], orderSets) !== null,\n )\n\n let wasResorted = false as boolean\n\n // Sort by the relative order defined by the rules\n const sortedArray = inOrderArray.sort((a, b) => {\n const aKey = a[key],\n bKey = b[key]\n const aSubsetIndex = getSubsetIndex(aKey, orderSets)\n const bSubsetIndex = getSubsetIndex(bKey, orderSets)\n\n // If both items belong to different subsets, sort by their subset order\n if (\n aSubsetIndex !== null &&\n bSubsetIndex !== null &&\n aSubsetIndex !== bSubsetIndex\n ) {\n return aSubsetIndex - bSubsetIndex\n }\n\n // If both items belong to the same subset or neither is in the subset, keep their relative order\n return 0\n })\n\n const inOrderIterator = sortedArray.values()\n const result = data.map((item) => {\n if (getSubsetIndex(item[key], orderSets) !== null) {\n const sortedItem = inOrderIterator.next().value!\n if (sortedItem[key] !== item[key]) {\n wasResorted = true\n }\n return sortedItem\n }\n return item\n })\n\n if (!wasResorted) {\n return null\n }\n return result\n}\n\nexport function getCheckedProperties<T>(\n orderRules: ReadonlyArray<ReadonlyArray<ReadonlyArray<T>>>,\n): ReadonlyArray<T> {\n return [...new Set<T>(orderRules.flat(2))]\n}\n"],"names":[],"mappings":"AAAgB,SAAA,gBACd,MACA,YAGA,KACiB;AACX,QAAA,iBAAiB,CACrB,MACA,YACkB;AAVN;AAWZ,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,WAAI,aAAQ,CAAC,MAAT,mBAAY,SAAS,OAAO;AACvB,eAAA;AAAA,MAAA;AAAA,IACT;AAEK,WAAA;AAAA,EACT;AAEA,QAAM,YAAY,WAAW;AAAA,IAC3B,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC;AAAA,IAChC,CAAA;AAAA,EACF;AAEA,QAAM,eAAe,KAAK;AAAA,IACxB,CAAC,SAAS,eAAe,KAAK,GAAG,GAAG,SAAS,MAAM;AAAA,EACrD;AAEA,MAAI,cAAc;AAGlB,QAAM,cAAc,aAAa,KAAK,CAAC,GAAG,MAAM;AAC9C,UAAM,OAAO,EAAE,GAAG,GAChB,OAAO,EAAE,GAAG;AACR,UAAA,eAAe,eAAe,MAAM,SAAS;AAC7C,UAAA,eAAe,eAAe,MAAM,SAAS;AAGnD,QACE,iBAAiB,QACjB,iBAAiB,QACjB,iBAAiB,cACjB;AACA,aAAO,eAAe;AAAA,IAAA;AAIjB,WAAA;AAAA,EAAA,CACR;AAEK,QAAA,kBAAkB,YAAY,OAAO;AAC3C,QAAM,SAAS,KAAK,IAAI,CAAC,SAAS;AAChC,QAAI,eAAe,KAAK,GAAG,GAAG,SAAS,MAAM,MAAM;AAC3C,YAAA,aAAa,gBAAgB,KAAA,EAAO;AAC1C,UAAI,WAAW,GAAG,MAAM,KAAK,GAAG,GAAG;AACnB,sBAAA;AAAA,MAAA;AAET,aAAA;AAAA,IAAA;AAEF,WAAA;AAAA,EAAA,CACR;AAED,MAAI,CAAC,aAAa;AACT,WAAA;AAAA,EAAA;AAEF,SAAA;AACT;AAEO,SAAS,qBACd,YACkB;AACX,SAAA,CAAC,GAAG,IAAI,IAAO,WAAW,KAAK,CAAC,CAAC,CAAC;AAC3C;"}
|
package/dist/esm/rules.d.ts
DELETED
package/dist/esm/rules.js
DELETED
package/dist/esm/rules.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rules.js","sources":["../../src/rules.ts"],"sourcesContent":["import * as createRoutePropertyOrder from './rules/create-route-property-order/create-route-property-order.rule'\nimport type { ESLintUtils } from '@typescript-eslint/utils'\nimport type { ExtraRuleDocs } from './types'\n\nexport const rules: Record<\n string,\n ESLintUtils.RuleModule<\n string,\n ReadonlyArray<unknown>,\n ExtraRuleDocs,\n ESLintUtils.RuleListener\n >\n> = {\n [createRoutePropertyOrder.name]: createRoutePropertyOrder.rule,\n}\n"],"names":["createRoutePropertyOrder.name","createRoutePropertyOrder.rule"],"mappings":";AAIO,MAAM,QAQT;AAAA,EACF,CAACA,IAA6B,GAAGC;AACnC;"}
|
package/dist/esm/types.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { TSESTree, ESLintUtils } from '@typescript-eslint/utils';
|
|
2
|
-
type Create = Parameters<ReturnType<typeof ESLintUtils.RuleCreator>>[0]['create'];
|
|
3
|
-
type Context = Parameters<Create>[0];
|
|
4
|
-
type Options = Parameters<Create>[1];
|
|
5
|
-
type Helpers = {
|
|
6
|
-
isSpecificTanstackRouterImport: (node: TSESTree.Identifier, source: string) => boolean;
|
|
7
|
-
isTanstackRouterImport: (node: TSESTree.Identifier) => boolean;
|
|
8
|
-
};
|
|
9
|
-
type EnhancedCreate = (context: Context, options: Options, helpers: Helpers) => ReturnType<Create>;
|
|
10
|
-
export declare function detectTanstackRouterImports(create: EnhancedCreate): Create;
|
|
11
|
-
export {};
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { TSESTree } from "@typescript-eslint/utils";
|
|
2
|
-
function detectTanstackRouterImports(create) {
|
|
3
|
-
return (context, optionsWithDefault) => {
|
|
4
|
-
const tanstackRouterImportSpecifiers = [];
|
|
5
|
-
const helpers = {
|
|
6
|
-
isSpecificTanstackRouterImport(node, source) {
|
|
7
|
-
return !!tanstackRouterImportSpecifiers.find((specifier) => {
|
|
8
|
-
if (specifier.type === TSESTree.AST_NODE_TYPES.ImportSpecifier && specifier.parent.type === TSESTree.AST_NODE_TYPES.ImportDeclaration && specifier.parent.source.value === source) {
|
|
9
|
-
return node.name === specifier.local.name;
|
|
10
|
-
}
|
|
11
|
-
return false;
|
|
12
|
-
});
|
|
13
|
-
},
|
|
14
|
-
isTanstackRouterImport(node) {
|
|
15
|
-
return !!tanstackRouterImportSpecifiers.find((specifier) => {
|
|
16
|
-
if (specifier.type === TSESTree.AST_NODE_TYPES.ImportSpecifier) {
|
|
17
|
-
return node.name === specifier.local.name;
|
|
18
|
-
}
|
|
19
|
-
return false;
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
};
|
|
23
|
-
const detectionInstructions = {
|
|
24
|
-
ImportDeclaration(node) {
|
|
25
|
-
if (node.specifiers.length > 0 && node.importKind === "value" && node.source.value.startsWith("@tanstack/") && node.source.value.endsWith("-router")) {
|
|
26
|
-
tanstackRouterImportSpecifiers.push(...node.specifiers);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
};
|
|
30
|
-
const ruleInstructions = create(context, optionsWithDefault, helpers);
|
|
31
|
-
const enhancedRuleInstructions = {};
|
|
32
|
-
const allKeys = new Set(
|
|
33
|
-
Object.keys(detectionInstructions).concat(Object.keys(ruleInstructions))
|
|
34
|
-
);
|
|
35
|
-
allKeys.forEach((instruction) => {
|
|
36
|
-
enhancedRuleInstructions[instruction] = (node) => {
|
|
37
|
-
var _a;
|
|
38
|
-
if (instruction in detectionInstructions) {
|
|
39
|
-
(_a = detectionInstructions[instruction]) == null ? void 0 : _a.call(detectionInstructions, node);
|
|
40
|
-
}
|
|
41
|
-
const ruleFunction = ruleInstructions[instruction];
|
|
42
|
-
if (ruleFunction !== void 0) {
|
|
43
|
-
return ruleFunction(node);
|
|
44
|
-
}
|
|
45
|
-
return void 0;
|
|
46
|
-
};
|
|
47
|
-
});
|
|
48
|
-
return enhancedRuleInstructions;
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
export {
|
|
52
|
-
detectTanstackRouterImports
|
|
53
|
-
};
|
|
54
|
-
//# sourceMappingURL=detect-router-imports.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"detect-router-imports.js","sources":["../../../src/utils/detect-router-imports.ts"],"sourcesContent":["import { TSESTree } from '@typescript-eslint/utils'\nimport type { ESLintUtils, TSESLint } from '@typescript-eslint/utils'\n\ntype Create = Parameters<\n ReturnType<typeof ESLintUtils.RuleCreator>\n>[0]['create']\n\ntype Context = Parameters<Create>[0]\ntype Options = Parameters<Create>[1]\ntype Helpers = {\n isSpecificTanstackRouterImport: (\n node: TSESTree.Identifier,\n source: string,\n ) => boolean\n isTanstackRouterImport: (node: TSESTree.Identifier) => boolean\n}\n\ntype EnhancedCreate = (\n context: Context,\n options: Options,\n helpers: Helpers,\n) => ReturnType<Create>\n\nexport function detectTanstackRouterImports(create: EnhancedCreate): Create {\n return (context, optionsWithDefault) => {\n const tanstackRouterImportSpecifiers: Array<TSESTree.ImportClause> = []\n\n const helpers: Helpers = {\n isSpecificTanstackRouterImport(node, source) {\n return !!tanstackRouterImportSpecifiers.find((specifier) => {\n if (\n specifier.type === TSESTree.AST_NODE_TYPES.ImportSpecifier &&\n specifier.parent.type ===\n TSESTree.AST_NODE_TYPES.ImportDeclaration &&\n specifier.parent.source.value === source\n ) {\n return node.name === specifier.local.name\n }\n\n return false\n })\n },\n isTanstackRouterImport(node) {\n return !!tanstackRouterImportSpecifiers.find((specifier) => {\n if (specifier.type === TSESTree.AST_NODE_TYPES.ImportSpecifier) {\n return node.name === specifier.local.name\n }\n\n return false\n })\n },\n }\n\n const detectionInstructions: TSESLint.RuleListener = {\n ImportDeclaration(node) {\n if (\n node.specifiers.length > 0 &&\n node.importKind === 'value' &&\n node.source.value.startsWith('@tanstack/') &&\n node.source.value.endsWith('-router')\n ) {\n tanstackRouterImportSpecifiers.push(...node.specifiers)\n }\n },\n }\n\n // Call original rule definition\n const ruleInstructions = create(context, optionsWithDefault, helpers)\n const enhancedRuleInstructions: TSESLint.RuleListener = {}\n\n const allKeys = new Set(\n Object.keys(detectionInstructions).concat(Object.keys(ruleInstructions)),\n )\n\n // Iterate over ALL instructions keys so we can override original rule instructions\n // to prevent their execution if conditions to report errors are not met.\n allKeys.forEach((instruction) => {\n enhancedRuleInstructions[instruction] = (node) => {\n if (instruction in detectionInstructions) {\n detectionInstructions[instruction]?.(node)\n }\n\n const ruleFunction = ruleInstructions[instruction]\n if (ruleFunction !== undefined) {\n return ruleFunction(node)\n }\n\n return undefined\n }\n })\n\n return enhancedRuleInstructions\n }\n}\n"],"names":[],"mappings":";AAuBO,SAAS,4BAA4B,QAAgC;AACnE,SAAA,CAAC,SAAS,uBAAuB;AACtC,UAAM,iCAA+D,CAAC;AAEtE,UAAM,UAAmB;AAAA,MACvB,+BAA+B,MAAM,QAAQ;AAC3C,eAAO,CAAC,CAAC,+BAA+B,KAAK,CAAC,cAAc;AAC1D,cACE,UAAU,SAAS,SAAS,eAAe,mBAC3C,UAAU,OAAO,SACf,SAAS,eAAe,qBAC1B,UAAU,OAAO,OAAO,UAAU,QAClC;AACO,mBAAA,KAAK,SAAS,UAAU,MAAM;AAAA,UAAA;AAGhC,iBAAA;AAAA,QAAA,CACR;AAAA,MACH;AAAA,MACA,uBAAuB,MAAM;AAC3B,eAAO,CAAC,CAAC,+BAA+B,KAAK,CAAC,cAAc;AAC1D,cAAI,UAAU,SAAS,SAAS,eAAe,iBAAiB;AACvD,mBAAA,KAAK,SAAS,UAAU,MAAM;AAAA,UAAA;AAGhC,iBAAA;AAAA,QAAA,CACR;AAAA,MAAA;AAAA,IAEL;AAEA,UAAM,wBAA+C;AAAA,MACnD,kBAAkB,MAAM;AACtB,YACE,KAAK,WAAW,SAAS,KACzB,KAAK,eAAe,WACpB,KAAK,OAAO,MAAM,WAAW,YAAY,KACzC,KAAK,OAAO,MAAM,SAAS,SAAS,GACpC;AAC+B,yCAAA,KAAK,GAAG,KAAK,UAAU;AAAA,QAAA;AAAA,MACxD;AAAA,IAEJ;AAGA,UAAM,mBAAmB,OAAO,SAAS,oBAAoB,OAAO;AACpE,UAAM,2BAAkD,CAAC;AAEzD,UAAM,UAAU,IAAI;AAAA,MAClB,OAAO,KAAK,qBAAqB,EAAE,OAAO,OAAO,KAAK,gBAAgB,CAAC;AAAA,IACzE;AAIQ,YAAA,QAAQ,CAAC,gBAAgB;AACN,+BAAA,WAAW,IAAI,CAAC,SAAS;;AAChD,YAAI,eAAe,uBAAuB;AAClB,sCAAA,iBAAA,+CAAe;AAAA,QAAI;AAGrC,cAAA,eAAe,iBAAiB,WAAW;AACjD,YAAI,iBAAiB,QAAW;AAC9B,iBAAO,aAAa,IAAI;AAAA,QAAA;AAGnB,eAAA;AAAA,MACT;AAAA,IAAA,CACD;AAEM,WAAA;AAAA,EACT;AACF;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const getDocsUrl: (ruleName: string) => string;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-docs-url.js","sources":["../../../src/utils/get-docs-url.ts"],"sourcesContent":["export const getDocsUrl = (ruleName: string): string =>\n `https://tanstack.com/router/latest/docs/eslint/${ruleName}`\n"],"names":[],"mappings":"AAAO,MAAM,aAAa,CAAC,aACzB,kDAAkD,QAAQ;"}
|