@lark-apaas/fullstack-presets 1.1.5-alpha.13 → 1.1.5-alpha.14

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.
@@ -2,6 +2,4 @@ export declare const customRules: {
2
2
  'no-nested-styled-jsx': import("eslint").Rule.RuleModule;
3
3
  'require-app-container': import("eslint").Rule.RuleModule;
4
4
  'no-direct-capability-api': import("eslint").Rule.RuleModule;
5
- 'no-welcome-index-route': import("eslint").Rule.RuleModule;
6
- 'require-index-route': import("eslint").Rule.RuleModule;
7
5
  };
@@ -7,12 +7,8 @@ exports.customRules = void 0;
7
7
  const no_nested_styled_jsx_1 = __importDefault(require("./no-nested-styled-jsx"));
8
8
  const require_app_container_1 = __importDefault(require("./require-app-container"));
9
9
  const no_direct_capability_api_1 = __importDefault(require("./no-direct-capability-api"));
10
- const no_welcome_index_route_1 = __importDefault(require("./no-welcome-index-route"));
11
- const require_index_route_1 = __importDefault(require("./require-index-route"));
12
10
  exports.customRules = {
13
11
  'no-nested-styled-jsx': no_nested_styled_jsx_1.default,
14
12
  'require-app-container': require_app_container_1.default,
15
13
  'no-direct-capability-api': no_direct_capability_api_1.default,
16
- 'no-welcome-index-route': no_welcome_index_route_1.default,
17
- 'require-index-route': require_index_route_1.default,
18
14
  };
@@ -18,8 +18,6 @@ declare const _default: {
18
18
  'no-nested-styled-jsx': import("eslint").Rule.RuleModule;
19
19
  'require-app-container': import("eslint").Rule.RuleModule;
20
20
  'no-direct-capability-api': import("eslint").Rule.RuleModule;
21
- 'no-welcome-index-route': import("eslint").Rule.RuleModule;
22
- 'require-index-route': import("eslint").Rule.RuleModule;
23
21
  };
24
22
  };
25
23
  };
@@ -21,8 +21,6 @@ export declare const eslintPresets: {
21
21
  'no-nested-styled-jsx': import("eslint").Rule.RuleModule;
22
22
  'require-app-container': import("eslint").Rule.RuleModule;
23
23
  'no-direct-capability-api': import("eslint").Rule.RuleModule;
24
- 'no-welcome-index-route': import("eslint").Rule.RuleModule;
25
- 'require-index-route': import("eslint").Rule.RuleModule;
26
24
  };
27
25
  };
28
26
  };
@@ -15,17 +15,15 @@ declare const _default: ({
15
15
  globals: any;
16
16
  };
17
17
  plugins: {
18
- 'react-hooks': any;
19
- import: any;
20
18
  '@lark-apaas': {
21
19
  rules: {
22
20
  'no-nested-styled-jsx': import("eslint").Rule.RuleModule;
23
21
  'require-app-container': import("eslint").Rule.RuleModule;
24
22
  'no-direct-capability-api': import("eslint").Rule.RuleModule;
25
- 'no-welcome-index-route': import("eslint").Rule.RuleModule;
26
- 'require-index-route': import("eslint").Rule.RuleModule;
27
23
  };
28
24
  };
25
+ 'react-hooks': any;
26
+ import: any;
29
27
  };
30
28
  settings: {
31
29
  'import/resolver': {
@@ -46,8 +44,6 @@ declare const _default: ({
46
44
  message: string;
47
45
  selector: string;
48
46
  })[];
49
- '@lark-apaas/no-welcome-index-route': string;
50
- '@lark-apaas/require-index-route': string;
51
47
  };
52
48
  } | null)[];
53
49
  export default _default;
@@ -103,10 +103,9 @@ const strictSyntaxRules = [
103
103
  message: 'Classname "text-accent" would cause visibility issues. Consider using proper semantic color tokens from `client/src/tailwind-theme.css`',
104
104
  },
105
105
  ];
106
- // 宽松模式专用,请勿删除
107
- const looseSpecificPlugins = {};
108
- // 宽松模式专用,请勿删除
109
- const looseSpecificRules = {};
106
+ const looseSpecificPlugins = {
107
+ '@lark-apaas': { rules: custom_eslint_rules_1.customRules },
108
+ };
110
109
  // 宽松模式下覆盖的规则(关闭非关键规则)
111
110
  const looseOverrideRules = isLooseMode
112
111
  ? {
@@ -134,7 +133,6 @@ const baseConfig = {
134
133
  plugins: {
135
134
  'react-hooks': reactHooks,
136
135
  import: importPlugin,
137
- '@lark-apaas': { rules: custom_eslint_rules_1.customRules },
138
136
  ...looseSpecificPlugins,
139
137
  },
140
138
  settings: {
@@ -169,6 +167,9 @@ const baseConfig = {
169
167
  'no-undef': 'off', // 禁止使用未声明的变量
170
168
  'no-console': 'off', // 允许使用 console
171
169
  'prefer-const': 'off', // 不强制使用 const
170
+ 'no-control-regex': 'off',
171
+ 'no-useless-escape': 'off',
172
+ 'no-case-declarations': 'off',
172
173
  // Import 规则
173
174
  'import/no-unresolved': 'error', // 检查导入路径是否存在
174
175
  // 其他规则
@@ -192,8 +193,6 @@ const baseConfig = {
192
193
  // 注意:严格模式的 strictSyntaxRules 仍然应用于所有文件
193
194
  ...(isLooseMode ? [] : strictSyntaxRules),
194
195
  ],
195
- // 宽松模式专用规则
196
- ...looseSpecificRules,
197
196
  // 宽松模式下覆盖上述规则
198
197
  ...looseOverrideRules,
199
198
  },
@@ -210,8 +209,6 @@ const appTsxConfig = isLooseMode
210
209
  ...baseSyntaxRules,
211
210
  ...exports.looseRestrictSyntaxRules,
212
211
  ],
213
- '@lark-apaas/no-welcome-index-route': 'error',
214
- '@lark-apaas/require-index-route': 'error',
215
212
  },
216
213
  }
217
214
  : null;
@@ -29,6 +29,9 @@ declare const _default: {
29
29
  'no-undef': string;
30
30
  'no-console': string;
31
31
  'prefer-const': string;
32
+ 'no-control-regex': string;
33
+ 'no-useless-escape': string;
34
+ 'no-case-declarations': string;
32
35
  'import/no-unresolved': string;
33
36
  'import/no-extraneous-dependencies': string;
34
37
  'no-restricted-imports': (string | {
@@ -39,6 +39,9 @@ exports.default = {
39
39
  'no-undef': 'off',
40
40
  'no-console': 'error',
41
41
  'prefer-const': 'off',
42
+ 'no-control-regex': 'off',
43
+ 'no-useless-escape': 'off',
44
+ 'no-case-declarations': 'off',
42
45
  // Import 规则
43
46
  'import/no-unresolved': 'error',
44
47
  'import/no-extraneous-dependencies': 'error',
@@ -14,17 +14,15 @@ export declare const eslintPresets: {
14
14
  globals: any;
15
15
  };
16
16
  plugins: {
17
- 'react-hooks': any;
18
- import: any;
19
17
  '@lark-apaas': {
20
18
  rules: {
21
19
  'no-nested-styled-jsx': import("eslint").Rule.RuleModule;
22
20
  'require-app-container': import("eslint").Rule.RuleModule;
23
21
  'no-direct-capability-api': import("eslint").Rule.RuleModule;
24
- 'no-welcome-index-route': import("eslint").Rule.RuleModule;
25
- 'require-index-route': import("eslint").Rule.RuleModule;
26
22
  };
27
23
  };
24
+ 'react-hooks': any;
25
+ import: any;
28
26
  };
29
27
  settings: {
30
28
  'import/resolver': {
@@ -45,8 +43,6 @@ export declare const eslintPresets: {
45
43
  message: string;
46
44
  selector: string;
47
45
  })[];
48
- '@lark-apaas/no-welcome-index-route': string;
49
- '@lark-apaas/require-index-route': string;
50
46
  };
51
47
  } | null)[] | {
52
48
  ignores: string[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lark-apaas/fullstack-presets",
3
- "version": "1.1.5-alpha.13",
3
+ "version": "1.1.5-alpha.14",
4
4
  "files": [
5
5
  "lib"
6
6
  ],
@@ -1,12 +0,0 @@
1
- /**
2
- * ESLint rule to disallow Welcome or PagePlaceholder components as the default home page route.
3
- *
4
- * This rule enforces that the first-level index route (the actual home page at "/")
5
- * should use an actual page component rather than placeholder components from the framework.
6
- *
7
- * Only checks the first-level index route nested directly under a parent Route (typically Layout).
8
- * Only flags Welcome/PagePlaceholder if they are imported from @lark-apaas/client-toolkit.
9
- */
10
- import type { Rule } from 'eslint';
11
- declare const rule: Rule.RuleModule;
12
- export default rule;
@@ -1,123 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const rule = {
4
- meta: {
5
- type: 'problem',
6
- docs: {
7
- description: 'Disallow Welcome or PagePlaceholder from @lark-apaas/client-toolkit as the default home page route element',
8
- category: 'Best Practices',
9
- recommended: true,
10
- },
11
- messages: {
12
- noWelcomeIndex: 'Index route should not use {{componentName}} from @lark-apaas/client-toolkit as the element. Please create and use your own home page component (e.g., HomePage, Dashboard).',
13
- },
14
- schema: [],
15
- },
16
- create(context) {
17
- // Track imports from @lark-apaas/client-toolkit
18
- const toolkitImports = new Set();
19
- return {
20
- ImportDeclaration(node) {
21
- const importNode = node;
22
- const source = importNode.source?.value;
23
- // Check if importing from @lark-apaas/client-toolkit (any subpath)
24
- if (typeof source === 'string' &&
25
- source.startsWith('@lark-apaas/client-toolkit')) {
26
- // Collect all imported names
27
- importNode.specifiers?.forEach(specifier => {
28
- if (specifier.type === 'ImportSpecifier' &&
29
- specifier.imported?.name) {
30
- toolkitImports.add(specifier.imported.name);
31
- }
32
- });
33
- }
34
- },
35
- JSXElement(node) {
36
- const element = node;
37
- const openingElement = element.openingElement;
38
- if (!openingElement)
39
- return;
40
- const elementName = openingElement.name;
41
- // Check if this is a <Route> element
42
- if (elementName.type !== 'JSXIdentifier' ||
43
- elementName.name !== 'Route') {
44
- return;
45
- }
46
- // Check if it has an index prop that is truthy
47
- const indexAttr = openingElement.attributes.find(attr => attr.type === 'JSXAttribute' &&
48
- attr.name?.type === 'JSXIdentifier' &&
49
- attr.name?.name === 'index');
50
- // If no index attribute, skip this route
51
- if (!indexAttr) {
52
- return;
53
- }
54
- // Check if index={false} explicitly
55
- const indexValue = indexAttr.value;
56
- if (indexValue?.type === 'JSXExpressionContainer' &&
57
- indexValue.expression?.type === 'Literal' &&
58
- indexValue.expression.value === false) {
59
- return;
60
- }
61
- // Check if this is a first-level index route (nested under exactly one parent Route)
62
- // The structure should be: <Routes> -> <Route element={<Layout />}> -> <Route index>
63
- let routeParentCount = 0;
64
- let current = element.parent;
65
- while (current) {
66
- if (current.type === 'JSXElement') {
67
- const currentElement = current;
68
- const currentOpeningElement = currentElement.openingElement;
69
- const currentElementName = currentOpeningElement?.name;
70
- if (currentElementName?.type === 'JSXIdentifier' &&
71
- currentElementName.name === 'Route') {
72
- routeParentCount++;
73
- }
74
- else if (currentElementName?.type === 'JSXIdentifier' &&
75
- currentElementName.name === 'Routes') {
76
- // Stop when we reach Routes
77
- break;
78
- }
79
- }
80
- current = current.parent;
81
- }
82
- // Only check if this is a first-level route (exactly 1 parent Route)
83
- // This corresponds to the default home page pattern:
84
- // <Routes><Route element={<Layout />}><Route index /></Route></Routes>
85
- if (routeParentCount !== 1) {
86
- return;
87
- }
88
- // Find the element prop
89
- const elementProp = openingElement.attributes.find(attr => attr.type === 'JSXAttribute' &&
90
- attr.name?.type === 'JSXIdentifier' &&
91
- attr.name?.name === 'element');
92
- if (!elementProp) {
93
- return;
94
- }
95
- // Check if the element prop value is a JSXExpressionContainer with a JSXElement
96
- const propValue = elementProp.value;
97
- if (propValue?.type === 'JSXExpressionContainer' &&
98
- propValue.expression?.type === 'JSXElement') {
99
- const jsxElement = propValue.expression;
100
- const jsxOpeningElement = jsxElement.openingElement;
101
- const jsxElementName = jsxOpeningElement?.name;
102
- // Check if the component name is Welcome or PagePlaceholder
103
- if (jsxElementName?.type === 'JSXIdentifier' &&
104
- (jsxElementName.name === 'Welcome' ||
105
- jsxElementName.name === 'PagePlaceholder')) {
106
- const componentName = jsxElementName.name;
107
- // Only report if this component was imported from @lark-apaas/client-toolkit
108
- if (toolkitImports.has(componentName)) {
109
- context.report({
110
- node: elementProp,
111
- messageId: 'noWelcomeIndex',
112
- data: {
113
- componentName,
114
- },
115
- });
116
- }
117
- }
118
- }
119
- },
120
- };
121
- },
122
- };
123
- exports.default = rule;
@@ -1,14 +0,0 @@
1
- /**
2
- * ESLint rule to require a default index route in RoutesComponent.
3
- *
4
- * This rule enforces that the RoutesComponent must have a first-level index route
5
- * to handle the default "/" path. This ensures users don't see a 404 when visiting
6
- * the application root.
7
- *
8
- * Valid configurations:
9
- * 1. <Route index element={...} /> (first-level, nested under one parent Route)
10
- * 2. <Route path="/" element={...} /> (first-level or top-level)
11
- */
12
- import type { Rule } from 'eslint';
13
- declare const rule: Rule.RuleModule;
14
- export default rule;
@@ -1,98 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const rule = {
4
- meta: {
5
- type: 'problem',
6
- docs: {
7
- description: 'Require a default index route in RoutesComponent to handle the root path',
8
- category: 'Best Practices',
9
- recommended: true,
10
- },
11
- messages: {
12
- missingIndexRoute: 'RoutesComponent is missing a default home page route. Add either:\n - <Route index element={<HomePage />} /> (nested under Layout)\n - <Route path="/" element={<HomePage />} /> (at any level)',
13
- },
14
- schema: [],
15
- },
16
- create(context) {
17
- let inRoutesComponent = false;
18
- let hasDefaultRoute = false;
19
- let routeDepth = 0;
20
- return {
21
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
22
- VariableDeclarator(node) {
23
- // Check if this is RoutesComponent
24
- if (node.id?.name === 'RoutesComponent') {
25
- inRoutesComponent = true;
26
- hasDefaultRoute = false;
27
- routeDepth = 0;
28
- }
29
- },
30
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
31
- 'VariableDeclarator:exit'(node) {
32
- if (node.id?.name === 'RoutesComponent') {
33
- if (!hasDefaultRoute) {
34
- context.report({
35
- node,
36
- messageId: 'missingIndexRoute',
37
- });
38
- }
39
- inRoutesComponent = false;
40
- }
41
- },
42
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
43
- JSXElement(node) {
44
- if (!inRoutesComponent)
45
- return;
46
- const elementName = node.openingElement?.name?.name;
47
- // Track Route depth
48
- if (elementName === 'Route') {
49
- routeDepth++;
50
- // Only check first-level routes (depth 1 or 2)
51
- // depth 1: <Routes><Route index /></Routes>
52
- // depth 2: <Routes><Route><Route index /></Route></Routes>
53
- if (routeDepth <= 2) {
54
- const attributes = node.openingElement?.attributes || [];
55
- // Check for index attribute
56
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
57
- const indexAttr = attributes.find((attr) => attr.type === 'JSXAttribute' && attr.name?.name === 'index');
58
- if (indexAttr) {
59
- // Make sure it's not index={false}
60
- const isIndexFalse = indexAttr.value?.type === 'JSXExpressionContainer' &&
61
- indexAttr.value.expression?.type === 'Literal' &&
62
- indexAttr.value.expression.value === false;
63
- if (!isIndexFalse) {
64
- hasDefaultRoute = true;
65
- }
66
- }
67
- // Check for path="/"
68
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
69
- const pathAttr = attributes.find((attr) => attr.type === 'JSXAttribute' && attr.name?.name === 'path');
70
- if (pathAttr) {
71
- const value = pathAttr.value;
72
- // Handle path="/"
73
- if (value?.type === 'Literal' && value.value === '/') {
74
- hasDefaultRoute = true;
75
- }
76
- // Handle path={"/"}
77
- if (value?.type === 'JSXExpressionContainer' &&
78
- value.expression?.type === 'Literal' &&
79
- value.expression.value === '/') {
80
- hasDefaultRoute = true;
81
- }
82
- }
83
- }
84
- }
85
- },
86
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
87
- 'JSXElement:exit'(node) {
88
- if (!inRoutesComponent)
89
- return;
90
- const elementName = node.openingElement?.name?.name;
91
- if (elementName === 'Route') {
92
- routeDepth--;
93
- }
94
- },
95
- };
96
- },
97
- };
98
- exports.default = rule;