create-alistt69-kit 0.1.0

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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +115 -0
  3. package/bin/index.js +25 -0
  4. package/package.json +44 -0
  5. package/src/core/apply-features.js +15 -0
  6. package/src/core/collect-project-info.js +195 -0
  7. package/src/core/copy-base-template.js +12 -0
  8. package/src/core/create-project.js +90 -0
  9. package/src/core/install-dependencies.js +28 -0
  10. package/src/core/parse-cli-args.js +123 -0
  11. package/src/core/prepare-target-directory.js +70 -0
  12. package/src/core/replace-tokens.js +46 -0
  13. package/src/core/restore-special-files.js +19 -0
  14. package/src/features/autoprefixer/files/postcss.config.cjs +5 -0
  15. package/src/features/autoprefixer/index.js +23 -0
  16. package/src/features/eslint/files/eslint.config.mjs +128 -0
  17. package/src/features/eslint/index.js +35 -0
  18. package/src/features/index.js +15 -0
  19. package/src/features/react-router/files/src/app/App.tsx +10 -0
  20. package/src/features/react-router/files/src/app/layouts/app/index.tsx +17 -0
  21. package/src/features/react-router/files/src/app/providers/router/config/router.tsx +13 -0
  22. package/src/features/react-router/files/src/pages/error/index.ts +1 -0
  23. package/src/features/react-router/files/src/pages/error/lazy.ts +3 -0
  24. package/src/features/react-router/files/src/pages/error/page.tsx +7 -0
  25. package/src/features/react-router/files/src/pages/main/index.ts +1 -0
  26. package/src/features/react-router/files/src/pages/main/lazy.ts +3 -0
  27. package/src/features/react-router/files/src/pages/main/page.tsx +7 -0
  28. package/src/features/react-router/index.js +23 -0
  29. package/src/features/stylelint/files/stylelint.config.mjs +14 -0
  30. package/src/features/stylelint/index.js +29 -0
  31. package/src/templates/base/.editorconfig +12 -0
  32. package/src/templates/base/README.md +3 -0
  33. package/src/templates/base/babel.config.json +12 -0
  34. package/src/templates/base/config/build/buildDevServer.ts +11 -0
  35. package/src/templates/base/config/build/buildLoaders.ts +39 -0
  36. package/src/templates/base/config/build/buildPlugins.ts +34 -0
  37. package/src/templates/base/config/build/buildResolvers.ts +14 -0
  38. package/src/templates/base/config/build/buildWebpackConfig.ts +27 -0
  39. package/src/templates/base/config/build/loaders/buildCssLoader.ts +21 -0
  40. package/src/templates/base/config/build/types/config.ts +22 -0
  41. package/src/templates/base/gitignore +27 -0
  42. package/src/templates/base/package.json +48 -0
  43. package/src/templates/base/public/index.html +11 -0
  44. package/src/templates/base/src/app/App.tsx +7 -0
  45. package/src/templates/base/src/index.tsx +16 -0
  46. package/src/templates/base/src/styles/index.scss +11 -0
  47. package/src/templates/base/tsconfig.json +25 -0
  48. package/src/templates/base/webpack.config.ts +27 -0
  49. package/src/utils/console-format.js +12 -0
  50. package/src/utils/package-json.js +73 -0
  51. package/src/utils/package-manager.js +23 -0
@@ -0,0 +1,21 @@
1
+ import MiniCssExtractPlugin from 'mini-css-extract-plugin';
2
+
3
+ export function buildCssLoader(isDev: boolean) {
4
+ return {
5
+ test: /\.s[ac]ss$/i,
6
+ use: [
7
+ isDev ? 'style-loader' : MiniCssExtractPlugin.loader,
8
+ {
9
+ loader: 'css-loader',
10
+ options: {
11
+ modules: {
12
+ auto: (resPath: string) => Boolean(resPath.includes('.module.')),
13
+ localIdentName: isDev ? '[name]__[local]--[hash:base64:5]' : '[hash:base64:8]',
14
+ },
15
+ },
16
+ },
17
+ 'postcss-loader',
18
+ 'sass-loader',
19
+ ],
20
+ };
21
+ }
@@ -0,0 +1,22 @@
1
+ export type BuildMode = 'production' | 'development';
2
+
3
+ export interface BuildPaths {
4
+ entry: string;
5
+ build: string;
6
+ html: string;
7
+ src: string;
8
+ }
9
+
10
+ export interface BuildEnv {
11
+ mode: BuildMode;
12
+ port: number;
13
+ apiUrl: string;
14
+ }
15
+
16
+ export interface BuildOptions {
17
+ mode: BuildMode;
18
+ paths: BuildPaths;
19
+ isDev: boolean;
20
+ port: number;
21
+ apiUrl: string;
22
+ }
@@ -0,0 +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*
@@ -0,0 +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
+ }
@@ -0,0 +1,11 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>__PROJECT_NAME__</title>
7
+ </head>
8
+ <body>
9
+ <div id="root"></div>
10
+ </body>
11
+ </html>
@@ -0,0 +1,7 @@
1
+ function App() {
2
+ return (
3
+ <h1>alistt69</h1>
4
+ )
5
+ }
6
+
7
+ export default App;
@@ -0,0 +1,16 @@
1
+ import React 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
+ <React.StrictMode>
14
+ <App />
15
+ </React.StrictMode>,
16
+ );
@@ -0,0 +1,11 @@
1
+ html,
2
+ body,
3
+ #root {
4
+ margin: 0;
5
+ padding: 0;
6
+ min-height: 100%;
7
+ }
8
+
9
+ body {
10
+ font-family: Arial, sans-serif;
11
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "compilerOptions": {
3
+ "outDir": "./build",
4
+ "noImplicitAny": true,
5
+ "module": "ESNext",
6
+ "target": "es6",
7
+ "jsx": "react-jsx",
8
+ "allowJs": true,
9
+ "moduleResolution": "node",
10
+ "forceConsistentCasingInFileNames": true,
11
+ "strict": true,
12
+ "skipLibCheck": true,
13
+ "allowSyntheticDefaultImports": true,
14
+ "esModuleInterop": true,
15
+ "baseUrl": "./",
16
+ "paths": {
17
+ "@/*": ["./src/*"]
18
+ }
19
+ },
20
+ "ts-node": {
21
+ "compilerOptions": {
22
+ "module": "CommonJS"
23
+ }
24
+ }
25
+ }
@@ -0,0 +1,27 @@
1
+ import path from 'path';
2
+ import webpack from 'webpack';
3
+ import { buildWebpackConfig } from './config/build/buildWebpackConfig';
4
+ import { BuildEnv, BuildPaths } from './config/build/types/config';
5
+
6
+ export default (env: BuildEnv) => {
7
+ const paths: BuildPaths = {
8
+ entry: path.resolve(__dirname, 'src', 'index.tsx'),
9
+ build: path.resolve(__dirname, 'build'),
10
+ html: path.resolve(__dirname, 'public', 'index.html'),
11
+ src: path.resolve(__dirname, 'src'),
12
+ };
13
+
14
+ const mode = env.mode || 'development';
15
+ const port = env.port || 3000;
16
+ const apiUrl = env.apiUrl || 'http://localhost:8000';
17
+
18
+ const isDev = mode === 'development';
19
+
20
+ return buildWebpackConfig({
21
+ mode,
22
+ paths,
23
+ isDev,
24
+ port,
25
+ apiUrl,
26
+ });
27
+ };
@@ -0,0 +1,12 @@
1
+ const color = (code, text) => `\u001B[${code}m${text}\u001B[0m`;
2
+
3
+ export const format = {
4
+ cyan: (text) => color('36', text),
5
+ green: (text) => color('32', text),
6
+ yellow: (text) => color('33', text),
7
+ dim: (text) => color('2', text),
8
+ bold: (text) => color('1', text),
9
+
10
+ sectionTitle: (text) => color('36', text),
11
+ label: (text) => color('2', text),
12
+ };
@@ -0,0 +1,73 @@
1
+ import { readFile, writeFile } from 'node:fs/promises';
2
+ import { resolve } from 'node:path';
3
+
4
+ export async function readPackageJson(projectPath) {
5
+ const packageJsonPath = resolve(projectPath, 'package.json');
6
+ const content = await readFile(packageJsonPath, 'utf8');
7
+
8
+ return JSON.parse(content);
9
+ }
10
+
11
+ export async function writePackageJson(projectPath, packageJson) {
12
+ const packageJsonPath = resolve(projectPath, 'package.json');
13
+
14
+ await writeFile(
15
+ packageJsonPath,
16
+ `${JSON.stringify(packageJson, null, 4)}\n`,
17
+ 'utf8',
18
+ );
19
+ }
20
+
21
+ export async function addDependencies(projectPath, dependenciesToAdd) {
22
+ const packageJson = await readPackageJson(projectPath);
23
+
24
+ packageJson.dependencies ??= {};
25
+
26
+ for (const [dependencyName, dependencyVersion] of Object.entries(dependenciesToAdd)) {
27
+ packageJson.dependencies[dependencyName] = dependencyVersion;
28
+ }
29
+
30
+ packageJson.dependencies = Object.fromEntries(
31
+ Object.entries(packageJson.dependencies).sort(([leftName], [rightName]) => (
32
+ leftName.localeCompare(rightName)
33
+ )),
34
+ );
35
+
36
+ await writePackageJson(projectPath, packageJson);
37
+ }
38
+
39
+ export async function addDevDependencies(projectPath, dependenciesToAdd) {
40
+ const packageJson = await readPackageJson(projectPath);
41
+
42
+ packageJson.devDependencies ??= {};
43
+
44
+ for (const [dependencyName, dependencyVersion] of Object.entries(dependenciesToAdd)) {
45
+ packageJson.devDependencies[dependencyName] = dependencyVersion;
46
+ }
47
+
48
+ packageJson.devDependencies = Object.fromEntries(
49
+ Object.entries(packageJson.devDependencies).sort(([leftName], [rightName]) => (
50
+ leftName.localeCompare(rightName)
51
+ )),
52
+ );
53
+
54
+ await writePackageJson(projectPath, packageJson);
55
+ }
56
+
57
+ export async function addScripts(projectPath, scriptsToAdd) {
58
+ const packageJson = await readPackageJson(projectPath);
59
+
60
+ packageJson.scripts ??= {};
61
+
62
+ for (const [scriptName, scriptValue] of Object.entries(scriptsToAdd)) {
63
+ packageJson.scripts[scriptName] = scriptValue;
64
+ }
65
+
66
+ packageJson.scripts = Object.fromEntries(
67
+ Object.entries(packageJson.scripts).sort(([leftName], [rightName]) => (
68
+ leftName.localeCompare(rightName)
69
+ )),
70
+ );
71
+
72
+ await writePackageJson(projectPath, packageJson);
73
+ }
@@ -0,0 +1,23 @@
1
+ export const allowedPackageManagers = ['npm', 'pnpm', 'yarn'];
2
+
3
+ export function getInstallCommand(packageManager) {
4
+ if (packageManager === 'yarn') {
5
+ return {
6
+ command: 'yarn',
7
+ args: [],
8
+ };
9
+ }
10
+
11
+ return {
12
+ command: packageManager,
13
+ args: ['install'],
14
+ };
15
+ }
16
+
17
+ export function getRunScriptCommand(packageManager, scriptName) {
18
+ if (packageManager === 'npm') {
19
+ return `npm run ${scriptName}`;
20
+ }
21
+
22
+ return `${packageManager} ${scriptName}`;
23
+ }