create-alistt69-kit 0.1.9 → 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.
Files changed (45) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +123 -122
  3. package/bin/index.js +24 -24
  4. package/package.json +44 -44
  5. package/src/core/apply-features.js +14 -14
  6. package/src/core/collect-project-info.js +170 -194
  7. package/src/core/copy-base-template.js +11 -11
  8. package/src/core/create-project.js +99 -98
  9. package/src/core/install-dependencies.js +27 -27
  10. package/src/core/parse-cli-args.js +122 -122
  11. package/src/core/prepare-target-directory.js +69 -69
  12. package/src/core/render-project-readme.js +188 -75
  13. package/src/core/replace-tokens.js +45 -45
  14. package/src/core/restore-special-files.js +18 -18
  15. package/src/features/autoprefixer/files/postcss.config.cjs +4 -4
  16. package/src/features/autoprefixer/index.js +19 -23
  17. package/src/features/define-feature.js +33 -0
  18. package/src/features/eslint/files/eslint.config.mjs +133 -133
  19. package/src/features/eslint/index.js +30 -35
  20. package/src/features/index.js +25 -15
  21. package/src/features/react-router/files/src/app/App.tsx +20 -20
  22. package/src/features/react-router/files/src/app/layouts/app/index.tsx +36 -36
  23. package/src/features/react-router/files/src/app/providers/router/config/router.tsx +13 -13
  24. package/src/features/react-router/files/src/pages/error/index.ts +1 -1
  25. package/src/features/react-router/files/src/pages/error/lazy.ts +3 -3
  26. package/src/features/react-router/files/src/pages/error/page.tsx +7 -7
  27. package/src/features/react-router/files/src/pages/main/index.ts +1 -1
  28. package/src/features/react-router/files/src/pages/main/lazy.ts +3 -3
  29. package/src/features/react-router/files/src/pages/main/page.tsx +7 -7
  30. package/src/features/react-router/index.js +19 -23
  31. package/src/features/stylelint/files/stylelint.config.mjs +13 -13
  32. package/src/features/stylelint/index.js +24 -29
  33. package/src/templates/base/.editorconfig +11 -11
  34. package/src/templates/base/README.md +2 -2
  35. package/src/templates/base/babel.config.json +12 -12
  36. package/src/templates/base/gitignore +27 -27
  37. package/src/templates/base/package.json +48 -48
  38. package/src/templates/base/public/index.html +12 -12
  39. package/src/templates/base/src/app/App.tsx +17 -17
  40. package/src/templates/base/src/index.tsx +16 -16
  41. package/src/templates/base/src/styles/index.scss +13 -13
  42. package/src/templates/base/tsconfig.json +25 -25
  43. package/src/utils/console-format.js +11 -11
  44. package/src/utils/package-json.js +96 -72
  45. package/src/utils/package-manager.js +22 -22
@@ -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,23 +1,19 @@
1
- import { cp } from 'node:fs/promises';
2
- import { dirname, resolve } from 'node:path';
3
- import { fileURLToPath } from 'node:url';
4
- import { addDependencies } from '../../utils/package-json.js';
5
-
6
- const currentFilePath = fileURLToPath(import.meta.url);
7
- const currentDirPath = dirname(currentFilePath);
8
-
9
- export const reactRouterFeature = {
10
- id: 'react-router',
11
- title: 'React Router DOM',
12
- apply: async ({ projectPath }) => {
13
- await addDependencies(projectPath, {
14
- 'react-router-dom': '^7.13.2',
15
- });
16
-
17
- const filesDirPath = resolve(currentDirPath, 'files');
18
-
19
- await cp(filesDirPath, projectPath, {
20
- recursive: true,
21
- });
22
- },
23
- };
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
+ });
@@ -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,29 +1,24 @@
1
- import { cp } from 'node:fs/promises';
2
- import { dirname, resolve } from 'node:path';
3
- import { fileURLToPath } from 'node:url';
4
- import { addDevDependencies, addScripts } from '../../utils/package-json.js';
5
-
6
- const currentFilePath = fileURLToPath(import.meta.url);
7
- const currentDirPath = dirname(currentFilePath);
8
-
9
- export const stylelintFeature = {
10
- id: 'stylelint',
11
- title: 'Stylelint',
12
- apply: async ({ projectPath }) => {
13
- await addDevDependencies(projectPath, {
14
- stylelint: '^17.6.0',
15
- 'stylelint-config-standard-scss': '^17.0.0',
16
- });
17
-
18
- await addScripts(projectPath, {
19
- 'lint:styles': 'stylelint "src/**/*.{scss,css}"',
20
- 'lint:styles:fix': 'stylelint "src/**/*.{scss,css}" --fix',
21
- });
22
-
23
- const filesDirPath = resolve(currentDirPath, 'files');
24
-
25
- await cp(filesDirPath, projectPath, {
26
- recursive: true,
27
- });
28
- },
29
- };
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 stylelintFeature = defineFeature({
10
+ id: 'stylelint',
11
+ title: 'Stylelint',
12
+ hint: 'SCSS/CSS linting',
13
+ packageJson: {
14
+ devDependencies: {
15
+ stylelint: '^17.6.0',
16
+ 'stylelint-config-standard-scss': '^17.0.0',
17
+ },
18
+ scripts: {
19
+ 'lint:styles': 'stylelint "src/**/*.{scss,css}"',
20
+ 'lint:styles:fix': 'stylelint "src/**/*.{scss,css}" --fix',
21
+ },
22
+ },
23
+ copyFiles: resolve(currentDirPath, 'files'),
24
+ });
@@ -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>artello</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>artello</title>
8
+ </head>
9
+ <body>
10
+ <div id="root"></div>
11
+ </body>
12
+ </html>
@@ -1,17 +1,17 @@
1
- import Logo from '../../public/create-alistt69-kit-logo.svg';
2
- import styles from './styles.module.scss';
3
-
4
- function App() {
5
- return (
6
- <div className={styles.app_wrapper}>
7
- <div className={styles.created_by_section}>
8
- <Logo className={styles.logo} />
9
- <p className={styles.promo}>
10
- created by create-alistt69-kit
11
- </p>
12
- </div>
13
- </div>
14
- );
15
- }
16
-
17
- export default App;
1
+ import Logo from '../../public/create-alistt69-kit-logo.svg';
2
+ import styles from './styles.module.scss';
3
+
4
+ function App() {
5
+ return (
6
+ <div className={styles.app_wrapper}>
7
+ <div className={styles.created_by_section}>
8
+ <Logo className={styles.logo} />
9
+ <p className={styles.promo}>
10
+ created by create-alistt69-kit
11
+ </p>
12
+ </div>
13
+ </div>
14
+ );
15
+ }
16
+
17
+ export default App;
@@ -1,16 +1,16 @@
1
- import { StrictMode } from 'react';
2
- import { createRoot } from 'react-dom/client';
3
- import App from './app/App';
4
- import './styles/index.scss';
5
-
6
- const container = document.getElementById('root');
7
-
8
- if (!container) {
9
- throw new Error('Root container not found');
10
- }
11
-
12
- createRoot(container).render(
13
- <StrictMode>
14
- <App />
15
- </StrictMode>,
16
- );
1
+ import { StrictMode } from 'react';
2
+ import { createRoot } from 'react-dom/client';
3
+ import App from './app/App';
4
+ import './styles/index.scss';
5
+
6
+ const container = document.getElementById('root');
7
+
8
+ if (!container) {
9
+ throw new Error('Root container not found');
10
+ }
11
+
12
+ createRoot(container).render(
13
+ <StrictMode>
14
+ <App />
15
+ </StrictMode>,
16
+ );
@@ -1,13 +1,13 @@
1
- html,
2
- body,
3
- #root {
4
- margin: 0;
5
- padding: 0;
6
- min-height: 100%;
7
- }
8
-
9
- body {
10
- font-family: Bahnschrift;
11
- background: #141617;
12
- color: #A6A8AAFF;
13
- }
1
+ html,
2
+ body,
3
+ #root {
4
+ margin: 0;
5
+ padding: 0;
6
+ min-height: 100%;
7
+ }
8
+
9
+ body {
10
+ font-family: Bahnschrift;
11
+ background: #141617;
12
+ color: #A6A8AAFF;
13
+ }