create-alistt69-kit 0.3.6 → 0.3.7
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 +189 -189
- 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 +278 -278
- package/src/core/replace-tokens.js +45 -45
- package/src/core/restore-special-files.js +18 -18
- package/src/features/agents-md/files/AGENTS.md +36 -36
- package/src/features/agents-md/index.js +13 -13
- package/src/features/autoprefixer/files/postcss.config.cjs +4 -4
- package/src/features/autoprefixer/index.js +31 -31
- package/src/features/define-feature.js +32 -32
- package/src/features/eslint/files/eslint.config.mjs +135 -135
- package/src/features/eslint/index.js +43 -43
- package/src/features/index.js +28 -28
- package/src/features/prerender/files/prerender.routes.mjs +5 -5
- package/src/features/prerender/files/scripts/prerender.mjs +114 -114
- package/src/features/prerender/index.js +40 -40
- package/src/features/react-router/files/scripts/generate/page.mjs +366 -366
- package/src/features/react-router/files/src/app/App.tsx +18 -18
- package/src/features/react-router/files/src/app/providers/error-boundary/lib/provider/index.tsx +44 -44
- package/src/features/react-router/files/src/app/providers/error-boundary/ui/error-screen/index.tsx +151 -151
- package/src/features/react-router/files/src/app/providers/index.ts +17 -17
- package/src/features/react-router/files/src/app/providers/router/lib/provider/index.tsx +21 -21
- package/src/features/react-router/files/src/app/providers/router/model/router/index.tsx +24 -24
- package/src/features/react-router/files/src/app/providers/router/types/index.ts +10 -10
- package/src/features/react-router/files/src/app/providers/router/ui/app/index.tsx +36 -36
- package/src/features/react-router/files/src/index.tsx +23 -23
- 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 +36 -36
- package/src/features/stylelint/files/stylelint.config.mjs +13 -13
- package/src/features/stylelint/index.js +37 -37
- 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 +12 -12
- package/src/templates/base/src/app/providers/error-boundary/lib/provider/index.tsx +44 -44
- package/src/templates/base/src/app/providers/error-boundary/ui/error-screen/index.tsx +150 -150
- package/src/templates/base/src/app/providers/index.ts +5 -5
- package/src/templates/base/src/index.tsx +19 -19
- package/src/templates/base/src/styles/index.scss +13 -13
- package/src/templates/base/src/styles/normalize.scss +36 -36
- package/src/templates/base/tsconfig.json +25 -25
- package/src/utils/agents-md.js +52 -52
- 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,23 +1,23 @@
|
|
|
1
|
-
import { StrictMode } from 'react';
|
|
2
|
-
import { createRoot } from 'react-dom/client';
|
|
3
|
-
import App from '@/app/App';
|
|
4
|
-
import { RouterProvider, ErrorBoundary } from '@/app/providers';
|
|
5
|
-
import './styles/index.scss';
|
|
6
|
-
|
|
7
|
-
const container = document.getElementById('root');
|
|
8
|
-
|
|
9
|
-
if (!container) {
|
|
10
|
-
throw new Error('Root container not found');
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
createRoot(container).render(
|
|
14
|
-
<StrictMode>
|
|
15
|
-
<App
|
|
16
|
-
router={(
|
|
17
|
-
<RouterProvider
|
|
18
|
-
errorBoundary={ErrorBoundary}
|
|
19
|
-
/>
|
|
20
|
-
)}
|
|
21
|
-
/>
|
|
22
|
-
</StrictMode>,
|
|
23
|
-
);
|
|
1
|
+
import { StrictMode } from 'react';
|
|
2
|
+
import { createRoot } from 'react-dom/client';
|
|
3
|
+
import App from '@/app/App';
|
|
4
|
+
import { RouterProvider, ErrorBoundary } from '@/app/providers';
|
|
5
|
+
import './styles/index.scss';
|
|
6
|
+
|
|
7
|
+
const container = document.getElementById('root');
|
|
8
|
+
|
|
9
|
+
if (!container) {
|
|
10
|
+
throw new Error('Root container not found');
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
createRoot(container).render(
|
|
14
|
+
<StrictMode>
|
|
15
|
+
<App
|
|
16
|
+
router={(
|
|
17
|
+
<RouterProvider
|
|
18
|
+
errorBoundary={ErrorBoundary}
|
|
19
|
+
/>
|
|
20
|
+
)}
|
|
21
|
+
/>
|
|
22
|
+
</StrictMode>,
|
|
23
|
+
);
|
|
@@ -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,37 +1,37 @@
|
|
|
1
|
-
import { dirname, resolve } from 'node:path';
|
|
2
|
-
import { fileURLToPath } from 'node:url';
|
|
3
|
-
|
|
4
|
-
import { defineFeature } from '../define-feature.js';
|
|
5
|
-
import { appendAgentsSection } from '../../utils/agents-md.js';
|
|
6
|
-
|
|
7
|
-
const currentFilePath = fileURLToPath(import.meta.url);
|
|
8
|
-
const currentDirPath = dirname(currentFilePath);
|
|
9
|
-
|
|
10
|
-
export const reactRouterFeature = defineFeature({
|
|
11
|
-
id: 'react-router',
|
|
12
|
-
title: 'React Router DOM',
|
|
13
|
-
hint: 'Routing + FSD-like app/pages/shared',
|
|
14
|
-
packageJson: {
|
|
15
|
-
dependencies: {
|
|
16
|
-
'react-router-dom': '^7.13.2',
|
|
17
|
-
},
|
|
18
|
-
scripts: {
|
|
19
|
-
'generate:page': 'node ./scripts/generate/page.mjs',
|
|
20
|
-
},
|
|
21
|
-
},
|
|
22
|
-
copyFiles: resolve(currentDirPath, 'files'),
|
|
23
|
-
async apply({ projectPath }) {
|
|
24
|
-
await appendAgentsSection(
|
|
25
|
-
projectPath,
|
|
26
|
-
'react-router',
|
|
27
|
-
`
|
|
28
|
-
## React Router
|
|
29
|
-
|
|
30
|
-
- Routing is configured under \`src/app/providers/router/\`.
|
|
31
|
-
- Route-level pages live in \`src/pages/\`.
|
|
32
|
-
- Generate a new page with \`npm run generate:page -- <page-name>\`.
|
|
33
|
-
- Do not remove router marker comments used by the page generator unless you also disable auto-registration.
|
|
34
|
-
`,
|
|
35
|
-
);
|
|
36
|
-
},
|
|
1
|
+
import { dirname, resolve } from 'node:path';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
|
|
4
|
+
import { defineFeature } from '../define-feature.js';
|
|
5
|
+
import { appendAgentsSection } from '../../utils/agents-md.js';
|
|
6
|
+
|
|
7
|
+
const currentFilePath = fileURLToPath(import.meta.url);
|
|
8
|
+
const currentDirPath = dirname(currentFilePath);
|
|
9
|
+
|
|
10
|
+
export const reactRouterFeature = defineFeature({
|
|
11
|
+
id: 'react-router',
|
|
12
|
+
title: 'React Router DOM',
|
|
13
|
+
hint: 'Routing + FSD-like app/pages/shared',
|
|
14
|
+
packageJson: {
|
|
15
|
+
dependencies: {
|
|
16
|
+
'react-router-dom': '^7.13.2',
|
|
17
|
+
},
|
|
18
|
+
scripts: {
|
|
19
|
+
'generate:page': 'node ./scripts/generate/page.mjs',
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
copyFiles: resolve(currentDirPath, 'files'),
|
|
23
|
+
async apply({ projectPath }) {
|
|
24
|
+
await appendAgentsSection(
|
|
25
|
+
projectPath,
|
|
26
|
+
'react-router',
|
|
27
|
+
`
|
|
28
|
+
## React Router
|
|
29
|
+
|
|
30
|
+
- Routing is configured under \`src/app/providers/router/\`.
|
|
31
|
+
- Route-level pages live in \`src/pages/\`.
|
|
32
|
+
- Generate a new page with \`npm run generate:page -- <page-name>\`.
|
|
33
|
+
- Do not remove router marker comments used by the page generator unless you also disable auto-registration.
|
|
34
|
+
`,
|
|
35
|
+
);
|
|
36
|
+
},
|
|
37
37
|
});
|
|
@@ -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
|
};
|
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
import { dirname, resolve } from 'node:path';
|
|
2
|
-
import { fileURLToPath } from 'node:url';
|
|
3
|
-
|
|
4
|
-
import { defineFeature } from '../define-feature.js';
|
|
5
|
-
import { appendAgentsSection } from '../../utils/agents-md.js';
|
|
6
|
-
|
|
7
|
-
const currentFilePath = fileURLToPath(import.meta.url);
|
|
8
|
-
const currentDirPath = dirname(currentFilePath);
|
|
9
|
-
|
|
10
|
-
export const stylelintFeature = defineFeature({
|
|
11
|
-
id: 'stylelint',
|
|
12
|
-
title: 'Stylelint',
|
|
13
|
-
hint: 'SCSS/CSS linting',
|
|
14
|
-
packageJson: {
|
|
15
|
-
devDependencies: {
|
|
16
|
-
stylelint: '^17.6.0',
|
|
17
|
-
'stylelint-config-standard-scss': '^17.0.0',
|
|
18
|
-
},
|
|
19
|
-
scripts: {
|
|
20
|
-
'lint:styles': 'stylelint "src/**/*.{scss,css}"',
|
|
21
|
-
'lint:styles:fix': 'stylelint "src/**/*.{scss,css}" --fix',
|
|
22
|
-
},
|
|
23
|
-
},
|
|
24
|
-
copyFiles: resolve(currentDirPath, 'files'),
|
|
25
|
-
async apply({ projectPath }) {
|
|
26
|
-
await appendAgentsSection(
|
|
27
|
-
projectPath,
|
|
28
|
-
'stylelint',
|
|
29
|
-
`
|
|
30
|
-
## Stylelint
|
|
31
|
-
|
|
32
|
-
- Lint styles with \`npm run lint:styles\`.
|
|
33
|
-
- Apply autofixes with \`npm run lint:styles:fix\`.
|
|
34
|
-
- Keep styles compatible with the existing SCSS modules setup.
|
|
35
|
-
`,
|
|
36
|
-
);
|
|
37
|
-
},
|
|
1
|
+
import { dirname, resolve } from 'node:path';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
|
|
4
|
+
import { defineFeature } from '../define-feature.js';
|
|
5
|
+
import { appendAgentsSection } from '../../utils/agents-md.js';
|
|
6
|
+
|
|
7
|
+
const currentFilePath = fileURLToPath(import.meta.url);
|
|
8
|
+
const currentDirPath = dirname(currentFilePath);
|
|
9
|
+
|
|
10
|
+
export const stylelintFeature = defineFeature({
|
|
11
|
+
id: 'stylelint',
|
|
12
|
+
title: 'Stylelint',
|
|
13
|
+
hint: 'SCSS/CSS linting',
|
|
14
|
+
packageJson: {
|
|
15
|
+
devDependencies: {
|
|
16
|
+
stylelint: '^17.6.0',
|
|
17
|
+
'stylelint-config-standard-scss': '^17.0.0',
|
|
18
|
+
},
|
|
19
|
+
scripts: {
|
|
20
|
+
'lint:styles': 'stylelint "src/**/*.{scss,css}"',
|
|
21
|
+
'lint:styles:fix': 'stylelint "src/**/*.{scss,css}" --fix',
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
copyFiles: resolve(currentDirPath, 'files'),
|
|
25
|
+
async apply({ projectPath }) {
|
|
26
|
+
await appendAgentsSection(
|
|
27
|
+
projectPath,
|
|
28
|
+
'stylelint',
|
|
29
|
+
`
|
|
30
|
+
## Stylelint
|
|
31
|
+
|
|
32
|
+
- Lint styles with \`npm run lint:styles\`.
|
|
33
|
+
- Apply autofixes with \`npm run lint:styles:fix\`.
|
|
34
|
+
- Keep styles compatible with the existing SCSS modules setup.
|
|
35
|
+
`,
|
|
36
|
+
);
|
|
37
|
+
},
|
|
38
38
|
});
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
root = true
|
|
2
|
-
|
|
3
|
-
[*]
|
|
4
|
-
charset = utf-8
|
|
5
|
-
indent_style = space
|
|
6
|
-
indent_size = 4
|
|
7
|
-
end_of_line = lf
|
|
8
|
-
insert_final_newline = true
|
|
9
|
-
trim_trailing_whitespace = true
|
|
10
|
-
|
|
11
|
-
[*.md]
|
|
1
|
+
root = true
|
|
2
|
+
|
|
3
|
+
[*]
|
|
4
|
+
charset = utf-8
|
|
5
|
+
indent_style = space
|
|
6
|
+
indent_size = 4
|
|
7
|
+
end_of_line = lf
|
|
8
|
+
insert_final_newline = true
|
|
9
|
+
trim_trailing_whitespace = true
|
|
10
|
+
|
|
11
|
+
[*.md]
|
|
12
12
|
trim_trailing_whitespace = false
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
# __PROJECT_NAME__
|
|
2
|
-
|
|
1
|
+
# __PROJECT_NAME__
|
|
2
|
+
|
|
3
3
|
Created with create-alistt69-kit
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
{
|
|
2
|
-
"presets": [
|
|
3
|
-
"@babel/preset-env",
|
|
4
|
-
"@babel/preset-typescript",
|
|
5
|
-
[
|
|
6
|
-
"@babel/preset-react",
|
|
7
|
-
{
|
|
8
|
-
"runtime": "automatic"
|
|
9
|
-
}
|
|
10
|
-
]
|
|
11
|
-
]
|
|
12
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"presets": [
|
|
3
|
+
"@babel/preset-env",
|
|
4
|
+
"@babel/preset-typescript",
|
|
5
|
+
[
|
|
6
|
+
"@babel/preset-react",
|
|
7
|
+
{
|
|
8
|
+
"runtime": "automatic"
|
|
9
|
+
}
|
|
10
|
+
]
|
|
11
|
+
]
|
|
12
|
+
}
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
# Local-specified
|
|
2
|
-
node_modules
|
|
3
|
-
dist
|
|
4
|
-
build
|
|
5
|
-
coverage
|
|
6
|
-
.env
|
|
7
|
-
.env.local
|
|
8
|
-
|
|
9
|
-
# Editor directories and files
|
|
10
|
-
.vscode/*
|
|
11
|
-
!.vscode/extensions.json
|
|
12
|
-
.idea
|
|
13
|
-
.DS_Store
|
|
14
|
-
*.suo
|
|
15
|
-
*.ntvs*
|
|
16
|
-
*.njsproj
|
|
17
|
-
*.sln
|
|
18
|
-
*.sw?
|
|
19
|
-
|
|
20
|
-
# Logs
|
|
21
|
-
logs
|
|
22
|
-
*.log
|
|
23
|
-
npm-debug.log*
|
|
24
|
-
yarn-debug.log*
|
|
25
|
-
yarn-error.log*
|
|
26
|
-
pnpm-debug.log*
|
|
27
|
-
lerna-debug.log*
|
|
1
|
+
# Local-specified
|
|
2
|
+
node_modules
|
|
3
|
+
dist
|
|
4
|
+
build
|
|
5
|
+
coverage
|
|
6
|
+
.env
|
|
7
|
+
.env.local
|
|
8
|
+
|
|
9
|
+
# Editor directories and files
|
|
10
|
+
.vscode/*
|
|
11
|
+
!.vscode/extensions.json
|
|
12
|
+
.idea
|
|
13
|
+
.DS_Store
|
|
14
|
+
*.suo
|
|
15
|
+
*.ntvs*
|
|
16
|
+
*.njsproj
|
|
17
|
+
*.sln
|
|
18
|
+
*.sw?
|
|
19
|
+
|
|
20
|
+
# Logs
|
|
21
|
+
logs
|
|
22
|
+
*.log
|
|
23
|
+
npm-debug.log*
|
|
24
|
+
yarn-debug.log*
|
|
25
|
+
yarn-error.log*
|
|
26
|
+
pnpm-debug.log*
|
|
27
|
+
lerna-debug.log*
|
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "__PROJECT_NAME__",
|
|
3
|
-
"version": "0.0.1",
|
|
4
|
-
"private": true,
|
|
5
|
-
"scripts": {
|
|
6
|
-
"build": "webpack --env mode=production",
|
|
7
|
-
"build:dev": "webpack --env mode=development",
|
|
8
|
-
"build:prod": "webpack --env mode=production",
|
|
9
|
-
"dev": "webpack serve --env mode=development port=3000",
|
|
10
|
-
"start": "webpack serve --env mode=development port=3000",
|
|
11
|
-
"typecheck": "tsc --noEmit"
|
|
12
|
-
},
|
|
13
|
-
"dependencies": {
|
|
14
|
-
"clsx": "^2.1.1",
|
|
15
|
-
"react": "^18.3.1",
|
|
16
|
-
"react-dom": "^18.3.1"
|
|
17
|
-
},
|
|
18
|
-
"devDependencies": {
|
|
19
|
-
"@babel/core": "^7.26.0",
|
|
20
|
-
"@babel/preset-react": "^7.25.9",
|
|
21
|
-
"@babel/preset-typescript": "^7.26.0",
|
|
22
|
-
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.15",
|
|
23
|
-
"@svgr/webpack": "^8.1.0",
|
|
24
|
-
"@types/node": "^22.10.1",
|
|
25
|
-
"@types/react": "^18.3.12",
|
|
26
|
-
"@types/react-dom": "^18.3.1",
|
|
27
|
-
"@types/webpack": "^5.28.5",
|
|
28
|
-
"@types/webpack-bundle-analyzer": "^4.7.0",
|
|
29
|
-
"@types/webpack-dev-server": "^4.7.1",
|
|
30
|
-
"babel-loader": "^9.2.1",
|
|
31
|
-
"css-loader": "^6.11.0",
|
|
32
|
-
"html-webpack-plugin": "^5.6.3",
|
|
33
|
-
"mini-css-extract-plugin": "^2.9.2",
|
|
34
|
-
"postcss": "^8.5.6",
|
|
35
|
-
"postcss-loader": "^8.2.0",
|
|
36
|
-
"react-refresh": "^0.14.2",
|
|
37
|
-
"sass": "^1.81.0",
|
|
38
|
-
"sass-loader": "^16.0.3",
|
|
39
|
-
"style-loader": "^4.0.0",
|
|
40
|
-
"ts-loader": "^9.5.1",
|
|
41
|
-
"ts-node": "^10.9.2",
|
|
42
|
-
"typescript": "^5.7.2",
|
|
43
|
-
"webpack": "^5.96.1",
|
|
44
|
-
"webpack-bundle-analyzer": "^4.10.2",
|
|
45
|
-
"webpack-cli": "^5.1.4",
|
|
46
|
-
"webpack-dev-server": "^5.1.0"
|
|
47
|
-
}
|
|
48
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "__PROJECT_NAME__",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"private": true,
|
|
5
|
+
"scripts": {
|
|
6
|
+
"build": "webpack --env mode=production",
|
|
7
|
+
"build:dev": "webpack --env mode=development",
|
|
8
|
+
"build:prod": "webpack --env mode=production",
|
|
9
|
+
"dev": "webpack serve --env mode=development port=3000",
|
|
10
|
+
"start": "webpack serve --env mode=development port=3000",
|
|
11
|
+
"typecheck": "tsc --noEmit"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"clsx": "^2.1.1",
|
|
15
|
+
"react": "^18.3.1",
|
|
16
|
+
"react-dom": "^18.3.1"
|
|
17
|
+
},
|
|
18
|
+
"devDependencies": {
|
|
19
|
+
"@babel/core": "^7.26.0",
|
|
20
|
+
"@babel/preset-react": "^7.25.9",
|
|
21
|
+
"@babel/preset-typescript": "^7.26.0",
|
|
22
|
+
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.15",
|
|
23
|
+
"@svgr/webpack": "^8.1.0",
|
|
24
|
+
"@types/node": "^22.10.1",
|
|
25
|
+
"@types/react": "^18.3.12",
|
|
26
|
+
"@types/react-dom": "^18.3.1",
|
|
27
|
+
"@types/webpack": "^5.28.5",
|
|
28
|
+
"@types/webpack-bundle-analyzer": "^4.7.0",
|
|
29
|
+
"@types/webpack-dev-server": "^4.7.1",
|
|
30
|
+
"babel-loader": "^9.2.1",
|
|
31
|
+
"css-loader": "^6.11.0",
|
|
32
|
+
"html-webpack-plugin": "^5.6.3",
|
|
33
|
+
"mini-css-extract-plugin": "^2.9.2",
|
|
34
|
+
"postcss": "^8.5.6",
|
|
35
|
+
"postcss-loader": "^8.2.0",
|
|
36
|
+
"react-refresh": "^0.14.2",
|
|
37
|
+
"sass": "^1.81.0",
|
|
38
|
+
"sass-loader": "^16.0.3",
|
|
39
|
+
"style-loader": "^4.0.0",
|
|
40
|
+
"ts-loader": "^9.5.1",
|
|
41
|
+
"ts-node": "^10.9.2",
|
|
42
|
+
"typescript": "^5.7.2",
|
|
43
|
+
"webpack": "^5.96.1",
|
|
44
|
+
"webpack-bundle-analyzer": "^4.10.2",
|
|
45
|
+
"webpack-cli": "^5.1.4",
|
|
46
|
+
"webpack-dev-server": "^5.1.0"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="UTF-8" />
|
|
5
|
-
<link rel="icon" type="image/png" href="/favicon.ico" />
|
|
6
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
|
-
<title>__PROJECT_NAME__</title>
|
|
8
|
-
</head>
|
|
9
|
-
<body>
|
|
10
|
-
<div id="root"></div>
|
|
11
|
-
</body>
|
|
12
|
-
</html>
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<link rel="icon" type="image/png" href="/favicon.ico" />
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
|
+
<title>__PROJECT_NAME__</title>
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<div id="root"></div>
|
|
11
|
+
</body>
|
|
12
|
+
</html>
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import CreatedBy from '@/widgets/created-by';
|
|
2
|
-
import styles from './styles.module.scss';
|
|
3
|
-
|
|
4
|
-
function App() {
|
|
5
|
-
return (
|
|
6
|
-
<div className={styles.app_wrapper}>
|
|
7
|
-
<CreatedBy />
|
|
8
|
-
</div>
|
|
9
|
-
);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export default App;
|
|
1
|
+
import CreatedBy from '@/widgets/created-by';
|
|
2
|
+
import styles from './styles.module.scss';
|
|
3
|
+
|
|
4
|
+
function App() {
|
|
5
|
+
return (
|
|
6
|
+
<div className={styles.app_wrapper}>
|
|
7
|
+
<CreatedBy />
|
|
8
|
+
</div>
|
|
9
|
+
);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export default App;
|
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
import { Component, ErrorInfo, ReactNode } from 'react';
|
|
2
|
-
import ErrorScreen from '../../ui/error-screen';
|
|
3
|
-
|
|
4
|
-
type ErrorBoundaryProps = {
|
|
5
|
-
children: ReactNode;
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
type ErrorBoundaryState = {
|
|
9
|
-
hasError: boolean;
|
|
10
|
-
error: Error | null;
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
|
|
14
|
-
constructor(props: ErrorBoundaryProps) {
|
|
15
|
-
super(props);
|
|
16
|
-
this.state = { hasError: false, error: null };
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
static getDerivedStateFromError(error: Error) {
|
|
20
|
-
return {
|
|
21
|
-
hasError: true,
|
|
22
|
-
error,
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
componentDidCatch(error: Error, errorInfo: ErrorInfo) {
|
|
27
|
-
console.error('ErrorBoundary caught:', error, errorInfo);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
public render(): ReactNode {
|
|
31
|
-
if (this.state.hasError) {
|
|
32
|
-
return (
|
|
33
|
-
<ErrorScreen
|
|
34
|
-
errorMessage={this.state.error?.message}
|
|
35
|
-
onRetry={() => window.location.reload()}
|
|
36
|
-
/>
|
|
37
|
-
);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
return this.props.children;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export default ErrorBoundary;
|
|
1
|
+
import { Component, ErrorInfo, ReactNode } from 'react';
|
|
2
|
+
import ErrorScreen from '../../ui/error-screen';
|
|
3
|
+
|
|
4
|
+
type ErrorBoundaryProps = {
|
|
5
|
+
children: ReactNode;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
type ErrorBoundaryState = {
|
|
9
|
+
hasError: boolean;
|
|
10
|
+
error: Error | null;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
|
|
14
|
+
constructor(props: ErrorBoundaryProps) {
|
|
15
|
+
super(props);
|
|
16
|
+
this.state = { hasError: false, error: null };
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
static getDerivedStateFromError(error: Error) {
|
|
20
|
+
return {
|
|
21
|
+
hasError: true,
|
|
22
|
+
error,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
componentDidCatch(error: Error, errorInfo: ErrorInfo) {
|
|
27
|
+
console.error('ErrorBoundary caught:', error, errorInfo);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public render(): ReactNode {
|
|
31
|
+
if (this.state.hasError) {
|
|
32
|
+
return (
|
|
33
|
+
<ErrorScreen
|
|
34
|
+
errorMessage={this.state.error?.message}
|
|
35
|
+
onRetry={() => window.location.reload()}
|
|
36
|
+
/>
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return this.props.children;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export default ErrorBoundary;
|