create-alistt69-kit 0.1.11 → 0.1.12
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/LICENSE +20 -20
- package/README.md +123 -123
- package/bin/index.js +24 -24
- package/package.json +44 -44
- package/src/core/apply-features.js +14 -14
- package/src/core/collect-project-info.js +170 -170
- package/src/core/copy-base-template.js +11 -11
- package/src/core/create-project.js +99 -99
- package/src/core/install-dependencies.js +27 -27
- package/src/core/parse-cli-args.js +122 -122
- package/src/core/prepare-target-directory.js +69 -69
- package/src/core/render-project-readme.js +188 -188
- package/src/core/replace-tokens.js +45 -45
- package/src/core/restore-special-files.js +18 -18
- package/src/features/autoprefixer/files/postcss.config.cjs +4 -4
- package/src/features/autoprefixer/index.js +18 -18
- package/src/features/define-feature.js +32 -32
- package/src/features/eslint/files/eslint.config.mjs +133 -133
- package/src/features/eslint/index.js +29 -29
- package/src/features/index.js +24 -24
- package/src/features/react-router/files/src/app/App.tsx +20 -20
- package/src/features/react-router/files/src/app/layouts/app/index.tsx +36 -36
- package/src/features/react-router/files/src/app/providers/router/config/router.tsx +13 -13
- package/src/features/react-router/files/src/pages/error/index.ts +1 -1
- package/src/features/react-router/files/src/pages/error/lazy.ts +3 -3
- package/src/features/react-router/files/src/pages/error/page.tsx +7 -7
- package/src/features/react-router/files/src/pages/main/index.ts +1 -1
- package/src/features/react-router/files/src/pages/main/lazy.ts +3 -3
- package/src/features/react-router/files/src/pages/main/page.tsx +7 -7
- package/src/features/react-router/index.js +18 -18
- package/src/features/stylelint/files/stylelint.config.mjs +13 -13
- package/src/features/stylelint/index.js +23 -23
- package/src/templates/base/.editorconfig +11 -11
- package/src/templates/base/README.md +2 -2
- package/src/templates/base/babel.config.json +12 -12
- package/src/templates/base/gitignore +27 -27
- package/src/templates/base/package.json +48 -48
- package/src/templates/base/public/index.html +12 -12
- package/src/templates/base/src/app/App.tsx +17 -17
- package/src/templates/base/src/index.tsx +16 -16
- package/src/templates/base/src/styles/index.scss +13 -13
- package/src/templates/base/tsconfig.json +25 -25
- package/src/utils/console-format.js +11 -11
- package/src/utils/package-json.js +96 -96
- package/src/utils/package-manager.js +22 -22
|
@@ -1,134 +1,134 @@
|
|
|
1
|
-
import js from '@eslint/js';
|
|
2
|
-
import stylistic from '@stylistic/eslint-plugin';
|
|
3
|
-
import importPlugin from 'eslint-plugin-import';
|
|
4
|
-
import react from 'eslint-plugin-react';
|
|
5
|
-
import reactHooks from 'eslint-plugin-react-hooks';
|
|
6
|
-
import unused from 'eslint-plugin-unused-imports';
|
|
7
|
-
import tseslint from 'typescript-eslint';
|
|
8
|
-
|
|
9
|
-
export default [
|
|
10
|
-
// ESLint recommended rules
|
|
11
|
-
js.configs.recommended,
|
|
12
|
-
|
|
13
|
-
// Paths to ignore
|
|
14
|
-
{
|
|
15
|
-
ignores: ['**/dist', '**/node_modules', '**/build', 'webpack.config.ts', 'postcss.config.cjs'],
|
|
16
|
-
},
|
|
17
|
-
|
|
18
|
-
// TypeScript rules
|
|
19
|
-
...tseslint.configs.recommended,
|
|
20
|
-
...tseslint.configs.stylistic,
|
|
21
|
-
|
|
22
|
-
// TypeScript parser configuration
|
|
23
|
-
{
|
|
24
|
-
files: ['**/*.ts', '**/*.tsx'],
|
|
25
|
-
languageOptions: {
|
|
26
|
-
parser: tseslint.parser,
|
|
27
|
-
parserOptions: { sourceType: 'module' },
|
|
28
|
-
},
|
|
29
|
-
},
|
|
30
|
-
|
|
31
|
-
// Stylistic rules (Prettier alternative)
|
|
32
|
-
stylistic.configs.recommended,
|
|
33
|
-
|
|
34
|
-
// Main rule configuration
|
|
35
|
-
{
|
|
36
|
-
plugins: {
|
|
37
|
-
react,
|
|
38
|
-
'react-hooks': reactHooks,
|
|
39
|
-
'@stylistic': stylistic,
|
|
40
|
-
import: importPlugin,
|
|
41
|
-
'unused-imports': unused,
|
|
42
|
-
},
|
|
43
|
-
settings: { react: { version: 'detect' } },
|
|
44
|
-
rules: {
|
|
45
|
-
// === Formatting ===
|
|
46
|
-
'@stylistic/indent': ['error', 4, { SwitchCase: 1 }],
|
|
47
|
-
'@stylistic/semi': ['error', 'always'],
|
|
48
|
-
'@stylistic/quotes': ['error', 'single', { avoidEscape: true }],
|
|
49
|
-
'@stylistic/comma-dangle': ['error', 'always-multiline'],
|
|
50
|
-
'@stylistic/object-curly-spacing': ['error', 'always'],
|
|
51
|
-
'@stylistic/array-bracket-spacing': ['error', 'never'],
|
|
52
|
-
'@stylistic/eol-last': ['error', 'always'],
|
|
53
|
-
'@stylistic/arrow-parens': ['error', 'always'],
|
|
54
|
-
'@stylistic/quote-props': ['error', 'as-needed', { keywords: false }],
|
|
55
|
-
'@stylistic/member-delimiter-style': ['error', {
|
|
56
|
-
multiline: { delimiter: 'semi', requireLast: true },
|
|
57
|
-
singleline: { delimiter: 'semi', requireLast: false },
|
|
58
|
-
}],
|
|
59
|
-
'@stylistic/no-extra-parens': 'off',
|
|
60
|
-
'@stylistic/jsx-indent-props': 'off',
|
|
61
|
-
'@stylistic/multiline-ternary': 'off',
|
|
62
|
-
|
|
63
|
-
// === Whitespace ===
|
|
64
|
-
'no-trailing-spaces': ['warn', { skipBlankLines: false }],
|
|
65
|
-
'no-multiple-empty-lines': ['error', { max: 1, maxBOF: 0, maxEOF: 1 }],
|
|
66
|
-
'comma-style': ['error', 'last'],
|
|
67
|
-
|
|
68
|
-
// === Line length ===
|
|
69
|
-
'max-len': ['error', {
|
|
70
|
-
code: 120,
|
|
71
|
-
tabWidth: 4,
|
|
72
|
-
ignoreUrls: true,
|
|
73
|
-
ignoreStrings: true,
|
|
74
|
-
ignoreComments: false,
|
|
75
|
-
ignoreTemplateLiterals: true,
|
|
76
|
-
}],
|
|
77
|
-
|
|
78
|
-
// === Imports ===
|
|
79
|
-
'unused-imports/no-unused-imports': 'warn',
|
|
80
|
-
'unused-imports/no-unused-vars': ['warn', {
|
|
81
|
-
args: 'after-used',
|
|
82
|
-
argsIgnorePattern: '^_',
|
|
83
|
-
varsIgnorePattern: '^_',
|
|
84
|
-
caughtErrorsIgnorePattern: '^_',
|
|
85
|
-
}],
|
|
86
|
-
'import/order': ['error', {
|
|
87
|
-
groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index', 'object', 'type'],
|
|
88
|
-
pathGroups: [
|
|
89
|
-
{ pattern: '@/**', group: 'internal', position: 'after' },
|
|
90
|
-
{ pattern: '@app/**', group: 'internal', position: 'after' },
|
|
91
|
-
{ pattern: '@pages/**', group: 'internal', position: 'after' },
|
|
92
|
-
{ pattern: '@widgets/**', group: 'internal', position: 'after' },
|
|
93
|
-
{ pattern: '@features/**', group: 'internal', position: 'after' },
|
|
94
|
-
{ pattern: '@entities/**', group: 'internal', position: 'after' },
|
|
95
|
-
{ pattern: '@shared/**', group: 'internal', position: 'after' },
|
|
96
|
-
],
|
|
97
|
-
pathGroupsExcludedImportTypes: ['builtin', 'external'],
|
|
98
|
-
'newlines-between': 'never',
|
|
99
|
-
alphabetize: { order: 'asc', caseInsensitive: true },
|
|
100
|
-
}],
|
|
101
|
-
|
|
102
|
-
// === React ===
|
|
103
|
-
...react.configs.recommended.rules,
|
|
104
|
-
...reactHooks.configs.recommended.rules,
|
|
105
|
-
'react/react-in-jsx-scope': 'off', // Not needed in React 17+
|
|
106
|
-
'react/jsx-uses-react': 'off', // Not needed in React 17+
|
|
107
|
-
'react/prop-types': 'off', // TypeScript handles this
|
|
108
|
-
|
|
109
|
-
// === JSX formatting ===
|
|
110
|
-
'react/jsx-indent': ['error', 4],
|
|
111
|
-
'react/jsx-indent-props': ['error', 4],
|
|
112
|
-
'react/jsx-curly-spacing': ['error', { when: 'never', children: true }],
|
|
113
|
-
'react/jsx-equals-spacing': ['error', 'never'],
|
|
114
|
-
'react/jsx-tag-spacing': ['error', {
|
|
115
|
-
closingSlash: 'never',
|
|
116
|
-
beforeSelfClosing: 'always',
|
|
117
|
-
afterOpening: 'never',
|
|
118
|
-
beforeClosing: 'never',
|
|
119
|
-
}],
|
|
120
|
-
'react/jsx-first-prop-new-line': ['error', 'multiline-multiprop'],
|
|
121
|
-
'react/jsx-max-props-per-line': ['error', { maximum: 1, when: 'multiline' }],
|
|
122
|
-
'react/jsx-closing-bracket-location': ['error', 'line-aligned'],
|
|
123
|
-
|
|
124
|
-
// === General ===
|
|
125
|
-
'@typescript-eslint/no-unused-vars': 'off', // Handled by unused-imports
|
|
126
|
-
'no-console': ['warn', { allow: ['error'] }],
|
|
127
|
-
'no-restricted-imports': ['error', {
|
|
128
|
-
name: 'react',
|
|
129
|
-
importNames: ['default'],
|
|
130
|
-
message: 'React import is not needed in React 17+. Remove import React from "react".',
|
|
131
|
-
}],
|
|
132
|
-
},
|
|
133
|
-
},
|
|
1
|
+
import js from '@eslint/js';
|
|
2
|
+
import stylistic from '@stylistic/eslint-plugin';
|
|
3
|
+
import importPlugin from 'eslint-plugin-import';
|
|
4
|
+
import react from 'eslint-plugin-react';
|
|
5
|
+
import reactHooks from 'eslint-plugin-react-hooks';
|
|
6
|
+
import unused from 'eslint-plugin-unused-imports';
|
|
7
|
+
import tseslint from 'typescript-eslint';
|
|
8
|
+
|
|
9
|
+
export default [
|
|
10
|
+
// ESLint recommended rules
|
|
11
|
+
js.configs.recommended,
|
|
12
|
+
|
|
13
|
+
// Paths to ignore
|
|
14
|
+
{
|
|
15
|
+
ignores: ['**/dist', '**/node_modules', '**/build', 'webpack.config.ts', 'postcss.config.cjs'],
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
// TypeScript rules
|
|
19
|
+
...tseslint.configs.recommended,
|
|
20
|
+
...tseslint.configs.stylistic,
|
|
21
|
+
|
|
22
|
+
// TypeScript parser configuration
|
|
23
|
+
{
|
|
24
|
+
files: ['**/*.ts', '**/*.tsx'],
|
|
25
|
+
languageOptions: {
|
|
26
|
+
parser: tseslint.parser,
|
|
27
|
+
parserOptions: { sourceType: 'module' },
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
// Stylistic rules (Prettier alternative)
|
|
32
|
+
stylistic.configs.recommended,
|
|
33
|
+
|
|
34
|
+
// Main rule configuration
|
|
35
|
+
{
|
|
36
|
+
plugins: {
|
|
37
|
+
react,
|
|
38
|
+
'react-hooks': reactHooks,
|
|
39
|
+
'@stylistic': stylistic,
|
|
40
|
+
import: importPlugin,
|
|
41
|
+
'unused-imports': unused,
|
|
42
|
+
},
|
|
43
|
+
settings: { react: { version: 'detect' } },
|
|
44
|
+
rules: {
|
|
45
|
+
// === Formatting ===
|
|
46
|
+
'@stylistic/indent': ['error', 4, { SwitchCase: 1 }],
|
|
47
|
+
'@stylistic/semi': ['error', 'always'],
|
|
48
|
+
'@stylistic/quotes': ['error', 'single', { avoidEscape: true }],
|
|
49
|
+
'@stylistic/comma-dangle': ['error', 'always-multiline'],
|
|
50
|
+
'@stylistic/object-curly-spacing': ['error', 'always'],
|
|
51
|
+
'@stylistic/array-bracket-spacing': ['error', 'never'],
|
|
52
|
+
'@stylistic/eol-last': ['error', 'always'],
|
|
53
|
+
'@stylistic/arrow-parens': ['error', 'always'],
|
|
54
|
+
'@stylistic/quote-props': ['error', 'as-needed', { keywords: false }],
|
|
55
|
+
'@stylistic/member-delimiter-style': ['error', {
|
|
56
|
+
multiline: { delimiter: 'semi', requireLast: true },
|
|
57
|
+
singleline: { delimiter: 'semi', requireLast: false },
|
|
58
|
+
}],
|
|
59
|
+
'@stylistic/no-extra-parens': 'off',
|
|
60
|
+
'@stylistic/jsx-indent-props': 'off',
|
|
61
|
+
'@stylistic/multiline-ternary': 'off',
|
|
62
|
+
|
|
63
|
+
// === Whitespace ===
|
|
64
|
+
'no-trailing-spaces': ['warn', { skipBlankLines: false }],
|
|
65
|
+
'no-multiple-empty-lines': ['error', { max: 1, maxBOF: 0, maxEOF: 1 }],
|
|
66
|
+
'comma-style': ['error', 'last'],
|
|
67
|
+
|
|
68
|
+
// === Line length ===
|
|
69
|
+
'max-len': ['error', {
|
|
70
|
+
code: 120,
|
|
71
|
+
tabWidth: 4,
|
|
72
|
+
ignoreUrls: true,
|
|
73
|
+
ignoreStrings: true,
|
|
74
|
+
ignoreComments: false,
|
|
75
|
+
ignoreTemplateLiterals: true,
|
|
76
|
+
}],
|
|
77
|
+
|
|
78
|
+
// === Imports ===
|
|
79
|
+
'unused-imports/no-unused-imports': 'warn',
|
|
80
|
+
'unused-imports/no-unused-vars': ['warn', {
|
|
81
|
+
args: 'after-used',
|
|
82
|
+
argsIgnorePattern: '^_',
|
|
83
|
+
varsIgnorePattern: '^_',
|
|
84
|
+
caughtErrorsIgnorePattern: '^_',
|
|
85
|
+
}],
|
|
86
|
+
'import/order': ['error', {
|
|
87
|
+
groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index', 'object', 'type'],
|
|
88
|
+
pathGroups: [
|
|
89
|
+
{ pattern: '@/**', group: 'internal', position: 'after' },
|
|
90
|
+
{ pattern: '@app/**', group: 'internal', position: 'after' },
|
|
91
|
+
{ pattern: '@pages/**', group: 'internal', position: 'after' },
|
|
92
|
+
{ pattern: '@widgets/**', group: 'internal', position: 'after' },
|
|
93
|
+
{ pattern: '@features/**', group: 'internal', position: 'after' },
|
|
94
|
+
{ pattern: '@entities/**', group: 'internal', position: 'after' },
|
|
95
|
+
{ pattern: '@shared/**', group: 'internal', position: 'after' },
|
|
96
|
+
],
|
|
97
|
+
pathGroupsExcludedImportTypes: ['builtin', 'external'],
|
|
98
|
+
'newlines-between': 'never',
|
|
99
|
+
alphabetize: { order: 'asc', caseInsensitive: true },
|
|
100
|
+
}],
|
|
101
|
+
|
|
102
|
+
// === React ===
|
|
103
|
+
...react.configs.recommended.rules,
|
|
104
|
+
...reactHooks.configs.recommended.rules,
|
|
105
|
+
'react/react-in-jsx-scope': 'off', // Not needed in React 17+
|
|
106
|
+
'react/jsx-uses-react': 'off', // Not needed in React 17+
|
|
107
|
+
'react/prop-types': 'off', // TypeScript handles this
|
|
108
|
+
|
|
109
|
+
// === JSX formatting ===
|
|
110
|
+
'react/jsx-indent': ['error', 4],
|
|
111
|
+
'react/jsx-indent-props': ['error', 4],
|
|
112
|
+
'react/jsx-curly-spacing': ['error', { when: 'never', children: true }],
|
|
113
|
+
'react/jsx-equals-spacing': ['error', 'never'],
|
|
114
|
+
'react/jsx-tag-spacing': ['error', {
|
|
115
|
+
closingSlash: 'never',
|
|
116
|
+
beforeSelfClosing: 'always',
|
|
117
|
+
afterOpening: 'never',
|
|
118
|
+
beforeClosing: 'never',
|
|
119
|
+
}],
|
|
120
|
+
'react/jsx-first-prop-new-line': ['error', 'multiline-multiprop'],
|
|
121
|
+
'react/jsx-max-props-per-line': ['error', { maximum: 1, when: 'multiline' }],
|
|
122
|
+
'react/jsx-closing-bracket-location': ['error', 'line-aligned'],
|
|
123
|
+
|
|
124
|
+
// === General ===
|
|
125
|
+
'@typescript-eslint/no-unused-vars': 'off', // Handled by unused-imports
|
|
126
|
+
'no-console': ['warn', { allow: ['error'] }],
|
|
127
|
+
'no-restricted-imports': ['error', {
|
|
128
|
+
name: 'react',
|
|
129
|
+
importNames: ['default'],
|
|
130
|
+
message: 'React import is not needed in React 17+. Remove import React from "react".',
|
|
131
|
+
}],
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
134
|
];
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
import { dirname, resolve } from 'node:path';
|
|
2
|
-
import { fileURLToPath } from 'node:url';
|
|
3
|
-
|
|
4
|
-
import { defineFeature } from '../define-feature.js';
|
|
5
|
-
|
|
6
|
-
const currentFilePath = fileURLToPath(import.meta.url);
|
|
7
|
-
const currentDirPath = dirname(currentFilePath);
|
|
8
|
-
|
|
9
|
-
export const eslintFeature = defineFeature({
|
|
10
|
-
id: 'eslint',
|
|
11
|
-
title: 'ESLint + Stylistic',
|
|
12
|
-
hint: 'JS/TS/React linting',
|
|
13
|
-
packageJson: {
|
|
14
|
-
devDependencies: {
|
|
15
|
-
eslint: '^9.0.0',
|
|
16
|
-
'@eslint/js': '^9.0.0',
|
|
17
|
-
'@stylistic/eslint-plugin': '^5.0.0',
|
|
18
|
-
'typescript-eslint': '^8.0.0',
|
|
19
|
-
'eslint-plugin-import': '^2.0.0',
|
|
20
|
-
'eslint-plugin-react': '^7.0.0',
|
|
21
|
-
'eslint-plugin-react-hooks': '^7.0.0',
|
|
22
|
-
'eslint-plugin-unused-imports': '^4.0.0',
|
|
23
|
-
},
|
|
24
|
-
scripts: {
|
|
25
|
-
lint: 'eslint . --ext .js,.jsx,.ts,.tsx',
|
|
26
|
-
'lint:fix': 'eslint . --ext .js,.jsx,.ts,.tsx --fix',
|
|
27
|
-
},
|
|
28
|
-
},
|
|
29
|
-
copyFiles: resolve(currentDirPath, 'files'),
|
|
1
|
+
import { dirname, resolve } from 'node:path';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
|
|
4
|
+
import { defineFeature } from '../define-feature.js';
|
|
5
|
+
|
|
6
|
+
const currentFilePath = fileURLToPath(import.meta.url);
|
|
7
|
+
const currentDirPath = dirname(currentFilePath);
|
|
8
|
+
|
|
9
|
+
export const eslintFeature = defineFeature({
|
|
10
|
+
id: 'eslint',
|
|
11
|
+
title: 'ESLint + Stylistic',
|
|
12
|
+
hint: 'JS/TS/React linting',
|
|
13
|
+
packageJson: {
|
|
14
|
+
devDependencies: {
|
|
15
|
+
eslint: '^9.0.0',
|
|
16
|
+
'@eslint/js': '^9.0.0',
|
|
17
|
+
'@stylistic/eslint-plugin': '^5.0.0',
|
|
18
|
+
'typescript-eslint': '^8.0.0',
|
|
19
|
+
'eslint-plugin-import': '^2.0.0',
|
|
20
|
+
'eslint-plugin-react': '^7.0.0',
|
|
21
|
+
'eslint-plugin-react-hooks': '^7.0.0',
|
|
22
|
+
'eslint-plugin-unused-imports': '^4.0.0',
|
|
23
|
+
},
|
|
24
|
+
scripts: {
|
|
25
|
+
lint: 'eslint . --ext .js,.jsx,.ts,.tsx',
|
|
26
|
+
'lint:fix': 'eslint . --ext .js,.jsx,.ts,.tsx --fix',
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
copyFiles: resolve(currentDirPath, 'files'),
|
|
30
30
|
});
|
package/src/features/index.js
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
import { autoprefixerFeature } from './autoprefixer/index.js';
|
|
2
|
-
import { eslintFeature } from './eslint/index.js';
|
|
3
|
-
import { reactRouterFeature } from './react-router/index.js';
|
|
4
|
-
import { stylelintFeature } from './stylelint/index.js';
|
|
5
|
-
|
|
6
|
-
export const features = [
|
|
7
|
-
autoprefixerFeature,
|
|
8
|
-
eslintFeature,
|
|
9
|
-
reactRouterFeature,
|
|
10
|
-
stylelintFeature,
|
|
11
|
-
];
|
|
12
|
-
|
|
13
|
-
export const featuresById = new Map(
|
|
14
|
-
features.map((feature) => [feature.id, feature]),
|
|
15
|
-
);
|
|
16
|
-
|
|
17
|
-
export const featurePromptOptions = features.map((feature) => ({
|
|
18
|
-
value: feature.id,
|
|
19
|
-
label: feature.title,
|
|
20
|
-
hint: feature.hint,
|
|
21
|
-
}));
|
|
22
|
-
|
|
23
|
-
export const defaultFeatureIds = features.map((feature) => feature.id);
|
|
24
|
-
|
|
1
|
+
import { autoprefixerFeature } from './autoprefixer/index.js';
|
|
2
|
+
import { eslintFeature } from './eslint/index.js';
|
|
3
|
+
import { reactRouterFeature } from './react-router/index.js';
|
|
4
|
+
import { stylelintFeature } from './stylelint/index.js';
|
|
5
|
+
|
|
6
|
+
export const features = [
|
|
7
|
+
autoprefixerFeature,
|
|
8
|
+
eslintFeature,
|
|
9
|
+
reactRouterFeature,
|
|
10
|
+
stylelintFeature,
|
|
11
|
+
];
|
|
12
|
+
|
|
13
|
+
export const featuresById = new Map(
|
|
14
|
+
features.map((feature) => [feature.id, feature]),
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
export const featurePromptOptions = features.map((feature) => ({
|
|
18
|
+
value: feature.id,
|
|
19
|
+
label: feature.title,
|
|
20
|
+
hint: feature.hint,
|
|
21
|
+
}));
|
|
22
|
+
|
|
23
|
+
export const defaultFeatureIds = features.map((feature) => feature.id);
|
|
24
|
+
|
|
25
25
|
export const availableFeatureIdSet = new Set(defaultFeatureIds);
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { RouterProvider } from 'react-router-dom';
|
|
2
|
-
import Logo from '../../public/create-alistt69-kit-logo.svg';
|
|
3
|
-
import { appRouter } from './providers/router/config/router';
|
|
4
|
-
import styles from './styles.module.scss';
|
|
5
|
-
|
|
6
|
-
function App() {
|
|
7
|
-
return (
|
|
8
|
-
<div className={styles.app_wrapper}>
|
|
9
|
-
<div className={styles.created_by_section}>
|
|
10
|
-
<Logo className={styles.logo} />
|
|
11
|
-
<p className={styles.promo}>
|
|
12
|
-
created by create-alistt69-kit
|
|
13
|
-
</p>
|
|
14
|
-
</div>
|
|
15
|
-
<RouterProvider router={appRouter} />
|
|
16
|
-
</div>
|
|
17
|
-
);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export default App;
|
|
1
|
+
import { RouterProvider } from 'react-router-dom';
|
|
2
|
+
import Logo from '../../public/create-alistt69-kit-logo.svg';
|
|
3
|
+
import { appRouter } from './providers/router/config/router';
|
|
4
|
+
import styles from './styles.module.scss';
|
|
5
|
+
|
|
6
|
+
function App() {
|
|
7
|
+
return (
|
|
8
|
+
<div className={styles.app_wrapper}>
|
|
9
|
+
<div className={styles.created_by_section}>
|
|
10
|
+
<Logo className={styles.logo} />
|
|
11
|
+
<p className={styles.promo}>
|
|
12
|
+
created by create-alistt69-kit
|
|
13
|
+
</p>
|
|
14
|
+
</div>
|
|
15
|
+
<RouterProvider router={appRouter} />
|
|
16
|
+
</div>
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export default App;
|
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
import clsx from 'clsx';
|
|
2
|
-
import { NavLink, Outlet } from 'react-router-dom';
|
|
3
|
-
import styles from './styles.module.scss';
|
|
4
|
-
|
|
5
|
-
export default function AppLayout() {
|
|
6
|
-
return (
|
|
7
|
-
<div className={styles.layout_wrapper}>
|
|
8
|
-
<aside className={styles.sidebar}>
|
|
9
|
-
<nav>
|
|
10
|
-
<NavLink
|
|
11
|
-
className={({ isActive }) => clsx({
|
|
12
|
-
[styles.active]: isActive,
|
|
13
|
-
})}
|
|
14
|
-
to="/"
|
|
15
|
-
>
|
|
16
|
-
Main
|
|
17
|
-
</NavLink>
|
|
18
|
-
</nav>
|
|
19
|
-
<nav>
|
|
20
|
-
<NavLink
|
|
21
|
-
className={({ isActive }) => clsx({
|
|
22
|
-
[styles.active]: isActive,
|
|
23
|
-
})}
|
|
24
|
-
to="/error-route"
|
|
25
|
-
>
|
|
26
|
-
Error
|
|
27
|
-
</NavLink>
|
|
28
|
-
</nav>
|
|
29
|
-
</aside>
|
|
30
|
-
|
|
31
|
-
<main>
|
|
32
|
-
<Outlet />
|
|
33
|
-
</main>
|
|
34
|
-
</div>
|
|
35
|
-
);
|
|
36
|
-
}
|
|
1
|
+
import clsx from 'clsx';
|
|
2
|
+
import { NavLink, Outlet } from 'react-router-dom';
|
|
3
|
+
import styles from './styles.module.scss';
|
|
4
|
+
|
|
5
|
+
export default function AppLayout() {
|
|
6
|
+
return (
|
|
7
|
+
<div className={styles.layout_wrapper}>
|
|
8
|
+
<aside className={styles.sidebar}>
|
|
9
|
+
<nav>
|
|
10
|
+
<NavLink
|
|
11
|
+
className={({ isActive }) => clsx({
|
|
12
|
+
[styles.active]: isActive,
|
|
13
|
+
})}
|
|
14
|
+
to="/"
|
|
15
|
+
>
|
|
16
|
+
Main
|
|
17
|
+
</NavLink>
|
|
18
|
+
</nav>
|
|
19
|
+
<nav>
|
|
20
|
+
<NavLink
|
|
21
|
+
className={({ isActive }) => clsx({
|
|
22
|
+
[styles.active]: isActive,
|
|
23
|
+
})}
|
|
24
|
+
to="/error-route"
|
|
25
|
+
>
|
|
26
|
+
Error
|
|
27
|
+
</NavLink>
|
|
28
|
+
</nav>
|
|
29
|
+
</aside>
|
|
30
|
+
|
|
31
|
+
<main>
|
|
32
|
+
<Outlet />
|
|
33
|
+
</main>
|
|
34
|
+
</div>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { createBrowserRouter, createRoutesFromElements, Route } from 'react-router-dom';
|
|
2
|
-
import { Error } from '../../../../pages/error';
|
|
3
|
-
import { Main } from '../../../../pages/main';
|
|
4
|
-
import AppLayout from '../../../layouts/app';
|
|
5
|
-
|
|
6
|
-
export const appRouter = createBrowserRouter(
|
|
7
|
-
createRoutesFromElements(
|
|
8
|
-
<Route path="/" element={<AppLayout />}>
|
|
9
|
-
<Route index element={<Main />} />
|
|
10
|
-
<Route path="*" element={<Error />} />
|
|
11
|
-
</Route>,
|
|
12
|
-
),
|
|
13
|
-
);
|
|
1
|
+
import { createBrowserRouter, createRoutesFromElements, Route } from 'react-router-dom';
|
|
2
|
+
import { Error } from '../../../../pages/error';
|
|
3
|
+
import { Main } from '../../../../pages/main';
|
|
4
|
+
import AppLayout from '../../../layouts/app';
|
|
5
|
+
|
|
6
|
+
export const appRouter = createBrowserRouter(
|
|
7
|
+
createRoutesFromElements(
|
|
8
|
+
<Route path="/" element={<AppLayout />}>
|
|
9
|
+
<Route index element={<Main />} />
|
|
10
|
+
<Route path="*" element={<Error />} />
|
|
11
|
+
</Route>,
|
|
12
|
+
),
|
|
13
|
+
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { LazyError as Error } from './lazy';
|
|
1
|
+
export { LazyError as Error } from './lazy';
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { lazy } from 'react';
|
|
2
|
-
|
|
3
|
-
export const LazyError = lazy(() => import('./page'));
|
|
1
|
+
import { lazy } from 'react';
|
|
2
|
+
|
|
3
|
+
export const LazyError = lazy(() => import('./page'));
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
function ErrorPage() {
|
|
2
|
-
return (
|
|
3
|
-
<h2>error page</h2>
|
|
4
|
-
);
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export default ErrorPage;
|
|
1
|
+
function ErrorPage() {
|
|
2
|
+
return (
|
|
3
|
+
<h2>error page</h2>
|
|
4
|
+
);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export default ErrorPage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { LazyMain as Main } from './lazy';
|
|
1
|
+
export { LazyMain as Main } from './lazy';
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { lazy } from 'react';
|
|
2
|
-
|
|
3
|
-
export const LazyMain = lazy(() => import('./page'));
|
|
1
|
+
import { lazy } from 'react';
|
|
2
|
+
|
|
3
|
+
export const LazyMain = lazy(() => import('./page'));
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
function MainPage() {
|
|
2
|
-
return (
|
|
3
|
-
<h2>main page</h2>
|
|
4
|
-
);
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export default MainPage;
|
|
1
|
+
function MainPage() {
|
|
2
|
+
return (
|
|
3
|
+
<h2>main page</h2>
|
|
4
|
+
);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export default MainPage;
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import { dirname, resolve } from 'node:path';
|
|
2
|
-
import { fileURLToPath } from 'node:url';
|
|
3
|
-
|
|
4
|
-
import { defineFeature } from '../define-feature.js';
|
|
5
|
-
|
|
6
|
-
const currentFilePath = fileURLToPath(import.meta.url);
|
|
7
|
-
const currentDirPath = dirname(currentFilePath);
|
|
8
|
-
|
|
9
|
-
export const reactRouterFeature = defineFeature({
|
|
10
|
-
id: 'react-router',
|
|
11
|
-
title: 'React Router DOM',
|
|
12
|
-
hint: 'Routing + FSD-like app/pages/shared',
|
|
13
|
-
packageJson: {
|
|
14
|
-
dependencies: {
|
|
15
|
-
'react-router-dom': '^7.13.2',
|
|
16
|
-
},
|
|
17
|
-
},
|
|
18
|
-
copyFiles: resolve(currentDirPath, 'files'),
|
|
1
|
+
import { dirname, resolve } from 'node:path';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
|
|
4
|
+
import { defineFeature } from '../define-feature.js';
|
|
5
|
+
|
|
6
|
+
const currentFilePath = fileURLToPath(import.meta.url);
|
|
7
|
+
const currentDirPath = dirname(currentFilePath);
|
|
8
|
+
|
|
9
|
+
export const reactRouterFeature = defineFeature({
|
|
10
|
+
id: 'react-router',
|
|
11
|
+
title: 'React Router DOM',
|
|
12
|
+
hint: 'Routing + FSD-like app/pages/shared',
|
|
13
|
+
packageJson: {
|
|
14
|
+
dependencies: {
|
|
15
|
+
'react-router-dom': '^7.13.2',
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
copyFiles: resolve(currentDirPath, 'files'),
|
|
19
19
|
});
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
/** @type {import('stylelint').Config} */
|
|
2
|
-
export default {
|
|
3
|
-
extends: ['stylelint-config-standard-scss'],
|
|
4
|
-
rules: {
|
|
5
|
-
'scss/no-global-function-names': null,
|
|
6
|
-
'selector-class-pattern': [
|
|
7
|
-
'^[a-z][a-z0-9-_]*$',
|
|
8
|
-
{
|
|
9
|
-
message: 'Class names should be lowercase and can include numbers, hyphens, and underscores.',
|
|
10
|
-
},
|
|
11
|
-
],
|
|
12
|
-
'at-rule-empty-line-before': null,
|
|
13
|
-
},
|
|
1
|
+
/** @type {import('stylelint').Config} */
|
|
2
|
+
export default {
|
|
3
|
+
extends: ['stylelint-config-standard-scss'],
|
|
4
|
+
rules: {
|
|
5
|
+
'scss/no-global-function-names': null,
|
|
6
|
+
'selector-class-pattern': [
|
|
7
|
+
'^[a-z][a-z0-9-_]*$',
|
|
8
|
+
{
|
|
9
|
+
message: 'Class names should be lowercase and can include numbers, hyphens, and underscores.',
|
|
10
|
+
},
|
|
11
|
+
],
|
|
12
|
+
'at-rule-empty-line-before': null,
|
|
13
|
+
},
|
|
14
14
|
};
|