├── CODEOWNERS ├── template ├── react-ts │ ├── src │ │ ├── vite-env.d.ts │ │ ├── pages │ │ │ ├── About.tsx │ │ │ └── Home.tsx │ │ ├── store │ │ │ ├── store.ts │ │ │ └── appStore.ts │ │ ├── app │ │ │ └── hooks.ts │ │ ├── App.ejs │ │ ├── assets │ │ │ └── css │ │ │ │ ├── tailwind.css │ │ │ │ └── base.css │ │ ├── features │ │ │ └── counter │ │ │ │ └── counterSlice.ts │ │ ├── main.ejs │ │ └── components │ │ │ └── TheWelcome.ejs │ ├── postcss.config.js │ ├── vercel.json │ ├── vite.config.ts │ ├── tests │ │ ├── setup.ts │ │ └── App.test.tsx │ ├── tsconfig.node.json │ ├── netlify.toml │ ├── .gitignore.ejs │ ├── tailwind.config.js │ ├── vitest.config.ts │ ├── .eslintrc.cjs │ ├── index.html │ ├── tsconfig.json │ ├── README.md │ └── package.ejs └── react-js │ ├── src │ ├── pages │ │ ├── About.jsx │ │ └── Home.jsx │ ├── store │ │ ├── appStore.js │ │ └── store.js │ ├── App.ejs │ ├── features │ │ └── counter │ │ │ └── counterSlice.js │ ├── assets │ │ └── css │ │ │ ├── tailwind.css │ │ │ └── base.css │ ├── main.ejs │ └── components │ │ └── TheWelcome.ejs │ ├── postcss.config.js │ ├── vercel.json │ ├── vite.config.js │ ├── tests │ ├── setup.js │ └── App.test.jsx │ ├── netlify.toml │ ├── .gitignore.ejs │ ├── README.md │ ├── tailwind.config.js │ ├── vitest.config.js │ ├── index.html │ ├── .eslintrc.cjs │ └── package.ejs ├── image └── create-react-next.png ├── .gitignore ├── renovate.json ├── src ├── core │ ├── program.ts │ ├── questions │ │ └── react │ │ │ ├── eslint.ts │ │ │ ├── initGit.ts │ │ │ ├── tailwind.ts │ │ │ ├── typescript.ts │ │ │ ├── reactQuery.ts │ │ │ ├── createQuestion.ts │ │ │ ├── deploy.ts │ │ │ ├── stateManagement.ts │ │ │ ├── prompts.ts │ │ │ ├── packageManager.ts │ │ │ ├── projectName.ts │ │ │ ├── createReactQuestions.ts │ │ │ └── index.ts │ ├── command │ │ └── create-react-next │ │ │ ├── initialLog.ts │ │ │ ├── index.ts │ │ │ ├── copyTemplate.ts │ │ │ └── install.ts │ └── utils │ │ └── react │ │ ├── templateFile.ts │ │ ├── ejsMapConstant.ts │ │ └── options.ts ├── utils │ ├── emptyDirName.ts │ ├── emptyDir.ts │ ├── getOnPromptState.ts │ ├── logger.ts │ ├── shouldUseBun.ts │ ├── shouldUseYarn.ts │ ├── shouldUsePnpm.ts │ ├── getPackageManager.ts │ ├── validatePackageName.ts │ ├── createSpawnCmd.ts │ ├── getValidProjectName.ts │ ├── directoryTraverse.ts │ ├── ejsRender.ts │ └── colors.ts ├── index.ts ├── filter │ └── filterFiles.ts └── deps │ └── react │ └── dependencies.ts ├── tsconfig.json ├── .github ├── workflows │ ├── release.yml │ └── ci.yml └── ISSUE_TEMPLATE │ ├── feature_request.yaml │ └── bug_report.yaml ├── LICENSE ├── package.json ├── README.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── CHANGELOG.md └── pnpm-lock.yaml /CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @selemondev -------------------------------------------------------------------------------- /template/react-ts/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /image/create-react-next.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/selemondev/create-react-next/HEAD/image/create-react-next.png -------------------------------------------------------------------------------- /template/react-js/src/pages/About.jsx: -------------------------------------------------------------------------------- 1 | const About = () => { 2 | return
About page
; 3 | } 4 | export default About; -------------------------------------------------------------------------------- /template/react-ts/src/pages/About.tsx: -------------------------------------------------------------------------------- 1 | const About = () => { 2 | return
About page
; 3 | } 4 | export default About; -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .cache 2 | .DS_Store 3 | .idea 4 | *.log 5 | *.tgz 6 | coverage 7 | dist 8 | lib-cov 9 | logs 10 | node_modules 11 | temp 12 | -------------------------------------------------------------------------------- /template/react-js/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } -------------------------------------------------------------------------------- /template/react-ts/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": [ 4 | "config:recommended" 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /template/react-js/vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "rewrites": [ 3 | { 4 | "source": "/(.*)", 5 | "destination": "/index.html" 6 | } 7 | ] 8 | } -------------------------------------------------------------------------------- /template/react-ts/vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "rewrites": [ 3 | { 4 | "source": "/(.*)", 5 | "destination": "/index.html" 6 | } 7 | ] 8 | } -------------------------------------------------------------------------------- /src/core/program.ts: -------------------------------------------------------------------------------- 1 | import { Command } from 'commander' 2 | import packageJson from "../../package.json" 3 | const program = new Command(packageJson.name) 4 | 5 | export default program -------------------------------------------------------------------------------- /template/react-js/src/pages/Home.jsx: -------------------------------------------------------------------------------- 1 | import TheWelcome from "../components/TheWelcome" 2 | const Home = () => { 3 | return <> 4 | 5 | ; 6 | } 7 | export default Home; -------------------------------------------------------------------------------- /template/react-ts/src/pages/Home.tsx: -------------------------------------------------------------------------------- 1 | import TheWelcome from "../components/TheWelcome" 2 | const Home = () => { 3 | return <> 4 | 5 | ; 6 | } 7 | export default Home; -------------------------------------------------------------------------------- /template/react-js/vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import react from '@vitejs/plugin-react' 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()], 7 | }) 8 | -------------------------------------------------------------------------------- /template/react-ts/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import react from '@vitejs/plugin-react' 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()], 7 | }) 8 | -------------------------------------------------------------------------------- /template/react-js/tests/setup.js: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom/vitest'; 2 | 3 | import { cleanup } from '@testing-library/react'; 4 | import { afterEach } from 'vitest'; 5 | 6 | afterEach(() => { 7 | cleanup(); 8 | }); -------------------------------------------------------------------------------- /template/react-ts/tests/setup.ts: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom/vitest'; 2 | 3 | import { cleanup } from '@testing-library/react'; 4 | import { afterEach } from 'vitest'; 5 | 6 | afterEach(() => { 7 | cleanup(); 8 | }); -------------------------------------------------------------------------------- /template/react-js/src/store/appStore.js: -------------------------------------------------------------------------------- 1 | import { configureStore } from '@reduxjs/toolkit' 2 | import counterReducer from "../features/counter/counterSlice" 3 | 4 | export const store = configureStore({ 5 | reducer: { 6 | counter: counterReducer, 7 | }, 8 | }) -------------------------------------------------------------------------------- /template/react-ts/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true 8 | }, 9 | "include": ["vite.config.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /src/core/questions/react/eslint.ts: -------------------------------------------------------------------------------- 1 | const eslintPrompt = [ 2 | { 3 | name: 'useEslint', 4 | type: () => 'toggle', 5 | message: 'Add ESLint for code quality?', 6 | initial: true, 7 | active: 'Yes', 8 | inactive: 'No' 9 | } 10 | ]; 11 | 12 | export default eslintPrompt; -------------------------------------------------------------------------------- /src/core/command/create-react-next/initialLog.ts: -------------------------------------------------------------------------------- 1 | import { logger } from "../../../utils/logger"; 2 | async function initialLog() { 3 | console.clear(); 4 | 5 | logger.info('Welcome To Create React Next. The Next Generation React Scaffolding Tool ✨'); 6 | 7 | console.log(); 8 | } 9 | 10 | export default initialLog 11 | -------------------------------------------------------------------------------- /src/core/questions/react/initGit.ts: -------------------------------------------------------------------------------- 1 | const initializeGit = [ 2 | { 3 | name: 'useGitInit', 4 | type: () => 'toggle', 5 | message: 'Initialize a new git repository?', 6 | initial: true, 7 | active: 'Yes', 8 | inactive: 'No' 9 | }, 10 | ] 11 | export default initializeGit 12 | -------------------------------------------------------------------------------- /src/core/questions/react/tailwind.ts: -------------------------------------------------------------------------------- 1 | const tailwindPrompt = [ 2 | { 3 | name: 'useTailwind', 4 | type: () => 'toggle', 5 | message: 'Add TailwindCSS for styling?', 6 | initial: true, 7 | active: 'Yes', 8 | inactive: 'No' 9 | } 10 | ]; 11 | 12 | export default tailwindPrompt; -------------------------------------------------------------------------------- /src/core/questions/react/typescript.ts: -------------------------------------------------------------------------------- 1 | const typeScriptPrompt = [ 2 | { 3 | name: 'useTypeScript', 4 | type: () => 'toggle', 5 | message: 'Add TypeScript for type safety?', 6 | initial: true, 7 | active: 'Yes', 8 | inactive: 'No' 9 | } 10 | ]; 11 | 12 | export default typeScriptPrompt; -------------------------------------------------------------------------------- /template/react-js/src/store/store.js: -------------------------------------------------------------------------------- 1 | 2 | import { create } from 'zustand' 3 | 4 | const useStore = create((set) => ({ 5 | count: 0, 6 | incrementCount: () => set((state) => ({ count: state.count + 1 })), 7 | decrementCount: () => set((state) => ({ count: state.count - 1 })), 8 | resetCount: () => set({ count: 0 }), 9 | })) 10 | -------------------------------------------------------------------------------- /template/react-ts/src/store/store.ts: -------------------------------------------------------------------------------- 1 | 2 | import { create } from 'zustand' 3 | 4 | const useStore = create((set) => ({ 5 | count: 0, 6 | incrementCount: () => set((state) => ({ count: state.count + 1 })), 7 | decrementCount: () => set((state) => ({ count: state.count - 1 })), 8 | resetCount: () => set({ count: 0 }), 9 | })) 10 | -------------------------------------------------------------------------------- /src/core/questions/react/reactQuery.ts: -------------------------------------------------------------------------------- 1 | const reactQuery = [ 2 | { 3 | name: 'useTanStackReactQuery', 4 | type: () => 'toggle', 5 | message: 'Add TanStack React Query for server state management?', 6 | initial: false, 7 | active: 'Yes', 8 | inactive: 'No' 9 | }, 10 | ] 11 | export default reactQuery -------------------------------------------------------------------------------- /template/react-js/netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | publish = "dist" 3 | command = "npm run build" 4 | 5 | [build.environment] 6 | NODE_VERSION = "20" 7 | 8 | [[redirects]] 9 | from = "/*" 10 | to = "/index.html" 11 | status = 200 12 | 13 | [[headers]] 14 | for = "/manifest.webmanifest" 15 | 16 | [headers.values] 17 | Content-Type = "application/manifest+json" -------------------------------------------------------------------------------- /template/react-ts/netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | publish = "dist" 3 | command = "npm run build" 4 | 5 | [build.environment] 6 | NODE_VERSION = "20" 7 | 8 | [[redirects]] 9 | from = "/*" 10 | to = "/index.html" 11 | status = 200 12 | 13 | [[headers]] 14 | for = "/manifest.webmanifest" 15 | 16 | [headers.values] 17 | Content-Type = "application/manifest+json" -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "lib": ["ESNext"], 5 | "module": "ESNext", 6 | "moduleResolution": "Bundler", 7 | "resolveJsonModule": true, 8 | "strict": true, 9 | "strictNullChecks": true, 10 | "esModuleInterop": true, 11 | "skipDefaultLibCheck": true, 12 | "skipLibCheck": true 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /template/react-js/tests/App.test.jsx: -------------------------------------------------------------------------------- 1 | import { render } from '@testing-library/react'; 2 | import App from '../src/App'; 3 | import { it, expect } from "vitest"; 4 | 5 | it('renders the heading with the correct class', () => { 6 | const { getByText } = render(); 7 | const headingElement = getByText('Welcome To Create React Next'); 8 | expect(headingElement).toBeInTheDocument(); 9 | }); -------------------------------------------------------------------------------- /template/react-ts/tests/App.test.tsx: -------------------------------------------------------------------------------- 1 | import { render } from '@testing-library/react'; 2 | import App from '../src/App'; 3 | import { it, expect } from "vitest"; 4 | 5 | it('renders the heading with the correct class', () => { 6 | const { getByText } = render(); 7 | const headingElement = getByText('Welcome To Create React Next'); 8 | expect(headingElement).toBeInTheDocument(); 9 | }); -------------------------------------------------------------------------------- /template/react-js/.gitignore.ejs: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /template/react-ts/.gitignore.ejs: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /template/react-ts/src/store/appStore.ts: -------------------------------------------------------------------------------- 1 | import { configureStore } from '@reduxjs/toolkit' 2 | import counterReducer from "../features/counter/counterSlice" 3 | 4 | export const store = configureStore({ 5 | reducer: { 6 | counter: counterReducer, 7 | }, 8 | }) 9 | 10 | export type RootState = ReturnType 11 | export type AppDispatch = typeof store.dispatch 12 | 13 | -------------------------------------------------------------------------------- /src/utils/emptyDirName.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs-extra' 2 | import { resolve } from 'path' 3 | 4 | export default function (name: string): boolean { 5 | const targetDir = resolve(process.cwd(), name); 6 | 7 | if (!fs.existsSync(targetDir)) { 8 | return true 9 | } 10 | 11 | const files = fs.readdirSync(targetDir) 12 | return files.length === 0 || (files.length === 1 && files[0] === '.git') 13 | } 14 | -------------------------------------------------------------------------------- /src/core/questions/react/createQuestion.ts: -------------------------------------------------------------------------------- 1 | import options from '../../utils/react/options' 2 | import prompts from 'prompts' 3 | 4 | export default async function createQuestion(question: any) { 5 | const result = await prompts(question, { 6 | onCancel: () => { 7 | throw new Error('❌ ' + ' Operation cancelled') 8 | } 9 | }) 10 | Object.assign(options, result) 11 | 12 | return Promise.resolve(options) 13 | }; -------------------------------------------------------------------------------- /template/react-ts/src/app/hooks.ts: -------------------------------------------------------------------------------- 1 | import { useDispatch, useSelector } from 'react-redux' 2 | import type { TypedUseSelectorHook } from 'react-redux' 3 | import type { RootState, AppDispatch } from '../store/appStore' 4 | 5 | // Use throughout your app instead of plain `useDispatch` and `useSelector` 6 | export const useAppDispatch: () => AppDispatch = useDispatch 7 | export const useAppSelector: TypedUseSelectorHook = useSelector -------------------------------------------------------------------------------- /src/utils/emptyDir.ts: -------------------------------------------------------------------------------- 1 | import { existsSync, rmdirSync, unlinkSync } from 'fs' 2 | 3 | import { postOrderDirectoryTraverse } from './directoryTraverse' 4 | 5 | function emptyDir(dir: string) { 6 | if (!existsSync(dir)) { 7 | return 8 | } 9 | 10 | postOrderDirectoryTraverse( 11 | dir, 12 | (dir: string) => rmdirSync(dir), 13 | (file: string) => unlinkSync(file) 14 | ) 15 | } 16 | export default emptyDir 17 | -------------------------------------------------------------------------------- /src/core/questions/react/deploy.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | name: 'deploy', 3 | type: 'select', 4 | message: 'Where should we deploy your project?', 5 | choices: [ 6 | { title: 'I prefer manual deployment', value: 'none' }, 7 | { 8 | title: 'Vercel', 9 | value: 'vercel' 10 | }, 11 | { 12 | title: 'Netlify', 13 | value: 'netlify' 14 | } 15 | ] 16 | } 17 | 18 | -------------------------------------------------------------------------------- /src/core/command/create-react-next/index.ts: -------------------------------------------------------------------------------- 1 | import createReactQuestions from '../../questions/react/createReactQuestions' 2 | import initialLog from './initialLog' 3 | import installDeps from './install' 4 | import copyTemplate from './copyTemplate' 5 | async function createProject() { 6 | await initialLog() 7 | await createReactQuestions() 8 | await copyTemplate() 9 | await installDeps(); 10 | } 11 | export default async function createReactNext() { 12 | await createProject() 13 | } 14 | -------------------------------------------------------------------------------- /template/react-js/README.md: -------------------------------------------------------------------------------- 1 | # React + Vite 2 | 3 | This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. 4 | 5 | Currently, two official plugins are available: 6 | 7 | - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh 8 | - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh 9 | -------------------------------------------------------------------------------- /template/react-js/tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | export default { 3 | content: [ 4 | "./index.html", 5 | "./src/**/*.{js,ts,jsx,tsx}", 6 | ], 7 | theme: { 8 | extend: { 9 | backgroundImage: { 10 | "gradient-radial": "radial-gradient(var(--tw-gradient-stops))", 11 | "gradient-conic": 12 | "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))", 13 | }, 14 | }, 15 | }, 16 | plugins: [], 17 | } -------------------------------------------------------------------------------- /template/react-ts/tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | export default { 3 | content: [ 4 | "./index.html", 5 | "./src/**/*.{js,ts,jsx,tsx}", 6 | ], 7 | theme: { 8 | extend: { 9 | backgroundImage: { 10 | "gradient-radial": "radial-gradient(var(--tw-gradient-stops))", 11 | "gradient-conic": 12 | "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))", 13 | }, 14 | }, 15 | }, 16 | plugins: [], 17 | } -------------------------------------------------------------------------------- /src/utils/getOnPromptState.ts: -------------------------------------------------------------------------------- 1 | import type { InitialReturnValue } from "prompts" 2 | 3 | export const onPromptState = (state: { 4 | value: InitialReturnValue 5 | aborted: boolean 6 | exited: boolean 7 | }) => { 8 | if (state.aborted) { 9 | // If we don't re-enable the terminal cursor before exiting 10 | // the program, the cursor will remain hidden 11 | process.stdout.write('\x1B[?25h') 12 | process.stdout.write('\n') 13 | process.exit(1) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/utils/logger.ts: -------------------------------------------------------------------------------- 1 | import termColors from "./colors"; 2 | 3 | export const logger = { 4 | info: (...args: any[]) => { 5 | console.log(termColors.cyan(String(...args))); 6 | }, 7 | 8 | error: (...args: any[]) => { 9 | console.log(termColors.red(String(...args))); 10 | }, 11 | 12 | warning: (...args: any[]) => { 13 | console.log(termColors.yellow(String(...args))); 14 | }, 15 | 16 | success: (...args: any[]) => { 17 | console.log(termColors.green(String(...args))); 18 | }, 19 | }; 20 | -------------------------------------------------------------------------------- /template/react-ts/vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { fileURLToPath } from 'node:url' 2 | import { mergeConfig, defineConfig, configDefaults } from 'vitest/config' 3 | import viteConfig from './vite.config' 4 | 5 | export default mergeConfig( 6 | viteConfig, 7 | defineConfig({ 8 | test: { 9 | environment: 'jsdom', 10 | exclude: [...configDefaults.exclude, 'e2e/*'], 11 | root: fileURLToPath(new URL('./', import.meta.url)), 12 | setupFiles: './tests/setup.ts' 13 | } 14 | }) 15 | ) -------------------------------------------------------------------------------- /template/react-js/vitest.config.js: -------------------------------------------------------------------------------- 1 | import { fileURLToPath } from 'node:url' 2 | import { mergeConfig, defineConfig, configDefaults } from 'vitest/config' 3 | import viteConfig from './vite.config'; 4 | 5 | export default mergeConfig( 6 | viteConfig, 7 | defineConfig({ 8 | test: { 9 | environment: 'jsdom', 10 | exclude: [...configDefaults.exclude, 'e2e/*'], 11 | root: fileURLToPath(new URL('./', import.meta.url)), 12 | setupFiles: './tests/setup.js' 13 | } 14 | }) 15 | ) -------------------------------------------------------------------------------- /src/core/questions/react/stateManagement.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | name: 'stateManagement', 3 | type: 'select', 4 | message: 'Which state management solution do you prefer?', 5 | choices: [ 6 | { title: 'None', value: 'none' }, 7 | { 8 | title: 'Redux', 9 | value: 'redux' 10 | }, 11 | { 12 | title: 'Zustand', 13 | value: 'zustand' 14 | }, 15 | { 16 | title: 'Jotai', 17 | value: 'jotai' 18 | } 19 | ] 20 | } 21 | 22 | -------------------------------------------------------------------------------- /template/react-js/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Create React Next 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /template/react-ts/.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { browser: true, es2020: true }, 4 | extends: [ 5 | 'eslint:recommended', 6 | 'plugin:@typescript-eslint/recommended', 7 | 'plugin:react-hooks/recommended', 8 | ], 9 | ignorePatterns: ['dist', '.eslintrc.cjs'], 10 | parser: '@typescript-eslint/parser', 11 | plugins: ['react-refresh'], 12 | rules: { 13 | 'react-refresh/only-export-components': [ 14 | 'warn', 15 | { allowConstantExport: true }, 16 | ], 17 | "react/no-unescaped-entities": 0 18 | }, 19 | } 20 | -------------------------------------------------------------------------------- /template/react-ts/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Create React Next 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/utils/shouldUseBun.ts: -------------------------------------------------------------------------------- 1 | import { execSync } from "child_process"; 2 | import { logger } from "./logger"; 3 | export const shouldUseBun = (): boolean => { 4 | try { 5 | const userAgent = process.env.config_user_agent; 6 | 7 | if (userAgent && userAgent.startsWith('bun')) { 8 | return true; 9 | }; 10 | 11 | execSync('bun --version', { stdio: 'ignore' }); 12 | 13 | return true; 14 | } catch (err) { 15 | if (err instanceof Error) { 16 | logger.error(err.message); 17 | }; 18 | 19 | return false; 20 | } 21 | } -------------------------------------------------------------------------------- /src/utils/shouldUseYarn.ts: -------------------------------------------------------------------------------- 1 | import { execSync } from 'child_process' 2 | import { logger } from './logger' 3 | 4 | export const shouldUseYarn = (): boolean => { 5 | try { 6 | const userAgent = process.env.npm_config_user_agent 7 | if (userAgent && userAgent.startsWith('yarn')) { 8 | return true 9 | } 10 | execSync('yarnpkg --version', { stdio: 'ignore' }) 11 | return true 12 | } catch (err) { 13 | if (err instanceof Error) { 14 | logger.error(err.message); 15 | }; 16 | 17 | return false; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/utils/shouldUsePnpm.ts: -------------------------------------------------------------------------------- 1 | import { execSync } from "child_process"; 2 | import { logger } from "./logger"; 3 | export const shouldUsePnpm = (): boolean => { 4 | try { 5 | const userAgent = process.env.config_user_agent; 6 | 7 | if (userAgent && userAgent.startsWith('pnpm')) { 8 | return true; 9 | }; 10 | 11 | execSync('pnpm --version', { stdio: 'ignore' }); 12 | 13 | return true; 14 | } catch(err){ 15 | if(err instanceof Error) { 16 | logger.error(err.message); 17 | }; 18 | 19 | return false; 20 | } 21 | } -------------------------------------------------------------------------------- /src/core/utils/react/templateFile.ts: -------------------------------------------------------------------------------- 1 | import options from './options' 2 | 3 | const templateFilesMap = new Map() 4 | templateFilesMap.set('react', reactFetchTemplateFiles) 5 | export function reactFetchTemplateFiles(): string[] | any[] { 6 | const files = [ 7 | 'package.json', 8 | options.useTypeScript ? 'src/main.tsx' : 'src/main.jsx', 9 | options.useTypeScript ? 'src/App.tsx' : 'src/App.jsx', 10 | options.useTypeScript ? 'src/components/TheWelcome.tsx' : 'src/components/TheWelcome.jsx' 11 | ] 12 | return files.filter(Boolean) 13 | } 14 | export { templateFilesMap } 15 | -------------------------------------------------------------------------------- /src/utils/getPackageManager.ts: -------------------------------------------------------------------------------- 1 | export type PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun' 2 | export const getPackageManager = (): PackageManager => { 3 | const userAgent = process.env.npm_config_user_agent || ''; 4 | 5 | if (userAgent) { 6 | if (userAgent.startsWith('npm')) { 7 | return 'npm' 8 | }; 9 | 10 | if (userAgent.startsWith('yarn')) { 11 | return "yarn" 12 | } 13 | 14 | if (userAgent.startsWith('pnpm')) { 15 | return "pnpm" 16 | } 17 | 18 | if (userAgent.startsWith('bun')) { 19 | return "bun" 20 | } 21 | } 22 | return 'npm' 23 | } -------------------------------------------------------------------------------- /template/react-js/.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { browser: true, es2020: true }, 4 | extends: [ 5 | 'eslint:recommended', 6 | 'plugin:react/recommended', 7 | 'plugin:react/jsx-runtime', 8 | 'plugin:react-hooks/recommended', 9 | ], 10 | ignorePatterns: ['dist', '.eslintrc.cjs'], 11 | parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, 12 | settings: { react: { version: '18.2' } }, 13 | plugins: ['react-refresh'], 14 | rules: { 15 | 'react-refresh/only-export-components': [ 16 | 'warn', 17 | { allowConstantExport: true }, 18 | ], 19 | "react/no-unescaped-entities": 0 20 | }, 21 | } 22 | -------------------------------------------------------------------------------- /src/utils/validatePackageName.ts: -------------------------------------------------------------------------------- 1 | import validateProjectName from 'validate-npm-package-name' 2 | 3 | type ValidateNpmNameResult = 4 | | { 5 | valid: true 6 | } 7 | | { 8 | valid: false 9 | problems: string[] 10 | } 11 | 12 | export function validatePackageName(name: string): ValidateNpmNameResult { 13 | const nameValidation = validateProjectName(name) 14 | if (nameValidation.validForNewPackages) { 15 | return { valid: true } 16 | } 17 | 18 | return { 19 | valid: false, 20 | problems: [ 21 | ...(nameValidation.errors || []), 22 | ...(nameValidation.warnings || []), 23 | ], 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /template/react-js/src/App.ejs: -------------------------------------------------------------------------------- 1 | <% if (useRouter) { -%> 2 | import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; 3 | import Home from "./pages/Home"; 4 | import About from "./pages/About"; 5 | <% } -%> 6 | <% if (!useRouter) { -%> 7 | import TheWelcome from "./components/TheWelcome" 8 | <% } -%> 9 | function App() { 10 | return ( 11 | <> 12 | <% if (useRouter) { -%> 13 | 14 | 15 | } /> 16 | } /> 17 | 18 | 19 | <% } -%> 20 | <% if (!useRouter) { -%> 21 | 22 | <% } -%> 23 | 24 | ) 25 | } 26 | 27 | export default App 28 | -------------------------------------------------------------------------------- /template/react-ts/src/App.ejs: -------------------------------------------------------------------------------- 1 | <% if (useRouter) { -%> 2 | import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; 3 | import Home from "./pages/Home"; 4 | import About from "./pages/About"; 5 | <% } -%> 6 | <% if (!useRouter) { -%> 7 | import TheWelcome from "./components/TheWelcome" 8 | <% } -%> 9 | function App() { 10 | return ( 11 | <> 12 | <% if (useRouter) { -%> 13 | 14 | 15 | } /> 16 | } /> 17 | 18 | 19 | <% } -%> 20 | <% if (!useRouter) { -%> 21 | 22 | <% } -%> 23 | 24 | ) 25 | } 26 | 27 | export default App 28 | -------------------------------------------------------------------------------- /src/utils/createSpawnCmd.ts: -------------------------------------------------------------------------------- 1 | import type { StdioOptions } from "child_process"; 2 | import { spawn } from "child_process"; 3 | 4 | export const createSpawnCmd = (dest: string | undefined, stdio: StdioOptions = 'inherit') => { 5 | return function (cmd: string, args: string[]): Promise { 6 | const ls = spawn(cmd, args, { 7 | cwd: dest, 8 | stdio: stdio, 9 | shell: true 10 | }); 11 | 12 | return new Promise((resolve, reject) => { 13 | ls.on('close', (code: number) => { 14 | code === 0 ? resolve(true) : reject(false); 15 | }) 16 | }).catch((err) => { 17 | return err; 18 | }) 19 | } 20 | } -------------------------------------------------------------------------------- /src/utils/getValidProjectName.ts: -------------------------------------------------------------------------------- 1 | import validate from "validate-npm-package-name"; 2 | 3 | type validateProjectName = 4 | { 5 | valid: true 6 | } 7 | | 8 | 9 | { 10 | valid: false, 11 | problems: string[] 12 | } 13 | 14 | export const isValidProjectName = (projectName: string): validateProjectName => { 15 | const isProjectNameValid = validate(projectName); 16 | 17 | if (isProjectNameValid.validForNewPackages) { 18 | return { valid: true } 19 | } 20 | 21 | return { 22 | valid: false, 23 | problems: [ 24 | ...(isProjectNameValid.errors || []), 25 | ...(isProjectNameValid.warnings || []) 26 | ] 27 | } 28 | } -------------------------------------------------------------------------------- /template/react-js/src/features/counter/counterSlice.js: -------------------------------------------------------------------------------- 1 | import { createSlice } from '@reduxjs/toolkit' 2 | 3 | const initialState = { 4 | value: 0, 5 | } 6 | 7 | export const counterSlice = createSlice({ 8 | name: 'counter', 9 | initialState, 10 | reducers: { 11 | increment: (state) => { 12 | state.value += 1 13 | }, 14 | decrement: (state) => { 15 | state.value -= 1 16 | }, 17 | incrementByAmount: (state, action) => { 18 | state.value += action.payload 19 | }, 20 | }, 21 | }) 22 | 23 | export const { increment, decrement, incrementByAmount } = counterSlice.actions 24 | 25 | export const selectCount = (state) => state.counter.value 26 | 27 | export default counterSlice.reducer -------------------------------------------------------------------------------- /template/react-ts/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "noEmit": true, 15 | "jsx": "react-jsx", 16 | 17 | /* Linting */ 18 | "strict": true, 19 | "noUnusedLocals": true, 20 | "noUnusedParameters": true, 21 | "noFallthroughCasesInSwitch": true 22 | }, 23 | "include": ["src"], 24 | "references": [{ "path": "./tsconfig.node.json" }] 25 | } 26 | -------------------------------------------------------------------------------- /template/react-js/src/assets/css/tailwind.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | :root { 6 | --foreground-rgb: 0, 0, 0; 7 | --background-start-rgb: 214, 219, 220; 8 | --background-end-rgb: 255, 255, 255; 9 | } 10 | 11 | @media (prefers-color-scheme: dark) { 12 | :root { 13 | --foreground-rgb: 255, 255, 255; 14 | --background-start-rgb: 0, 0, 0; 15 | --background-end-rgb: 0, 0, 0; 16 | } 17 | } 18 | 19 | body { 20 | color: rgb(var(--foreground-rgb)); 21 | background: linear-gradient( 22 | to bottom, 23 | transparent, 24 | rgb(var(--background-end-rgb)) 25 | ) 26 | rgb(var(--background-start-rgb)); 27 | } 28 | 29 | @layer utilities { 30 | .text-balance { 31 | text-wrap: balance; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /template/react-ts/src/assets/css/tailwind.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | :root { 6 | --foreground-rgb: 0, 0, 0; 7 | --background-start-rgb: 214, 219, 220; 8 | --background-end-rgb: 255, 255, 255; 9 | } 10 | 11 | @media (prefers-color-scheme: dark) { 12 | :root { 13 | --foreground-rgb: 255, 255, 255; 14 | --background-start-rgb: 0, 0, 0; 15 | --background-end-rgb: 0, 0, 0; 16 | } 17 | } 18 | 19 | body { 20 | color: rgb(var(--foreground-rgb)); 21 | background: linear-gradient( 22 | to bottom, 23 | transparent, 24 | rgb(var(--background-end-rgb)) 25 | ) 26 | rgb(var(--background-start-rgb)); 27 | } 28 | 29 | @layer utilities { 30 | .text-balance { 31 | text-wrap: balance; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/core/questions/react/prompts.ts: -------------------------------------------------------------------------------- 1 | const prompt = [ 2 | { 3 | name: 'useRouter', 4 | type: () => 'toggle', 5 | message: 'Add React Router DOM for Single Page Application development?', 6 | initial: true, 7 | active: 'Yes', 8 | inactive: 'No' 9 | }, 10 | 11 | { 12 | name: 'useHooks', 13 | type: () => 'toggle', 14 | message: 'Add useHooks for a collection of modern, server-safe React hooks?', 15 | initial: false, 16 | active: 'Yes', 17 | inactive: 'No' 18 | }, 19 | 20 | { 21 | name: 'useVitest', 22 | type: () => 'toggle', 23 | message: 'Add Vitest for unit testing?', 24 | initial: true, 25 | active: 'Yes', 26 | inactive: 'No' 27 | } 28 | ] 29 | export default prompt 30 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | tags: 6 | - 'v*' 7 | 8 | jobs: 9 | release: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v5 13 | with: 14 | fetch-depth: 0 15 | 16 | - name: Set node 17 | uses: actions/setup-node@v6 18 | with: 19 | node-version: [18.x, 20.x] 20 | cache: npm 21 | 22 | - run: npx changelogithub 23 | continue-on-error: true 24 | env: 25 | GITHUB_TOKEN: ${{secrets.GH_TOKEN}} 26 | 27 | - name: Install 28 | run: npm install 29 | 30 | - name: Build 31 | run: npm run build 32 | 33 | - name: Test 34 | run: npm run test 35 | 36 | - name: Config npm 37 | run: echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" > .npmrc 38 | env: 39 | NPM_TOKEN: ${{ secrets.NPM_TOKEN }} 40 | 41 | - name: Publish to npm 42 | run: npm publish --access public --no-git-checks 43 | -------------------------------------------------------------------------------- /src/core/questions/react/packageManager.ts: -------------------------------------------------------------------------------- 1 | import { shouldUseYarn } from '../../../utils/shouldUseYarn' 2 | import { shouldUsePnpm } from '../../../utils/shouldUsePnpm' 3 | import { shouldUseBun } from '../../../utils/shouldUseBun' 4 | const isYarnInstalled = shouldUseYarn() 5 | const isPnpmInstalled = shouldUsePnpm() 6 | const isBunInstalled = shouldUseBun(); 7 | export default { 8 | name: 'package', 9 | type: 'select', 10 | message: 'Which package manager do you prefer to use?', 11 | choices: [ 12 | { title: 'I prefer manual installation', value: 'none' }, 13 | { 14 | title: isBunInstalled ? 'Bun' : 'Bun is not installed', 15 | value: 'bun', 16 | disabled: isBunInstalled ? false : true 17 | }, 18 | { 19 | title: isPnpmInstalled ? 'Pnpm' : 'Pnpm is not installed', 20 | value: 'pnpm', 21 | disabled: isPnpmInstalled ? false : true 22 | }, 23 | { 24 | title: isYarnInstalled ? 'Yarn' : 'Yarn is not installed', 25 | value: 'yarn', 26 | disabled: isYarnInstalled ? false : true 27 | }, 28 | { title: 'Npm', value: 'npm' } 29 | ] 30 | } 31 | 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Create-React-Next CLI and Selemondev 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /src/core/utils/react/ejsMapConstant.ts: -------------------------------------------------------------------------------- 1 | import * as dependencies from '../../../deps/react/dependencies' 2 | import options from './options' 3 | interface Dependency { 4 | name: string | string[], 5 | version: string | string[] 6 | }; 7 | 8 | interface Dependencies { 9 | [key: string]: Dependency 10 | } 11 | const packageJsonMap = new Map(); 12 | const deps: Dependencies = dependencies; 13 | Object.keys(deps).forEach((item: string) => { 14 | const name = deps[item].name; 15 | if (Array.isArray(name)) { 16 | let res = '' 17 | name.forEach((cur: string, index: number) => { 18 | res += `"${cur}":"${deps[item].version[index]}",` 19 | }) 20 | packageJsonMap.set(item, res) 21 | } else { 22 | packageJsonMap.set( 23 | item, 24 | `"${deps[item].name}":"${deps[item].version}",` 25 | ) 26 | } 27 | }) 28 | 29 | const lintMap = new Map([ 30 | [ 31 | 'EslintScript', 32 | '"lint": "eslint . --ext ts,tsx,js,jsx --report-unused-disable-directives --max-warnings 0",' 33 | ], 34 | 35 | [ 36 | 'VitestScript', 37 | '"test:unit": "vitest",' 38 | ] 39 | ]) 40 | 41 | 42 | export { 43 | lintMap, 44 | packageJsonMap 45 | } 46 | -------------------------------------------------------------------------------- /src/utils/directoryTraverse.ts: -------------------------------------------------------------------------------- 1 | import { readdirSync, lstatSync, existsSync } from 'fs' 2 | import { resolve } from 'path' 3 | 4 | export function preOrderDirectoryTraverse(dir: string, dirCallback: Function, fileCallback: Function) { 5 | for (const filename of readdirSync(dir)) { 6 | const fullpath = resolve(dir, filename) 7 | if (lstatSync(fullpath).isDirectory()) { 8 | dirCallback(fullpath) 9 | // in case the dirCallback removes the directory entirely 10 | if (existsSync(fullpath)) { 11 | preOrderDirectoryTraverse(fullpath, dirCallback, fileCallback) 12 | } 13 | continue 14 | } 15 | fileCallback(fullpath) 16 | } 17 | } 18 | 19 | export function postOrderDirectoryTraverse(dir: string, dirCallback: Function, fileCallback: Function) { 20 | for (const filename of readdirSync(dir)) { 21 | const fullpath = resolve(dir, filename) 22 | if (lstatSync(fullpath).isDirectory()) { 23 | postOrderDirectoryTraverse(fullpath, dirCallback, fileCallback) 24 | dirCallback(fullpath) 25 | continue 26 | } 27 | fileCallback(fullpath) 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | pull_request: 9 | branches: 10 | - main 11 | 12 | jobs: 13 | lint: 14 | runs-on: ubuntu-latest 15 | steps: 16 | - uses: actions/checkout@v5 17 | 18 | - name: Install pnpm 19 | uses: pnpm/action-setup@v4 20 | 21 | - name: Set node 22 | uses: actions/setup-node@v6 23 | with: 24 | node-version: lts/* 25 | 26 | - name: Install 27 | run: pnpm i 28 | 29 | - name: Build 30 | run: pnpm build:package 31 | 32 | test: 33 | runs-on: ${{ matrix.os }} 34 | 35 | strategy: 36 | matrix: 37 | node: [lts/*] 38 | os: [ubuntu-latest, windows-latest, macos-latest] 39 | fail-fast: false 40 | 41 | steps: 42 | - uses: actions/checkout@v5 43 | 44 | - name: Install pnpm 45 | uses: pnpm/action-setup@v4 46 | 47 | - name: Set node ${{ matrix.node }} 48 | uses: actions/setup-node@v6 49 | with: 50 | node-version: ${{ matrix.node }} 51 | 52 | - name: Install 53 | run: pnpm i 54 | 55 | - name: Build 56 | run: pnpm build:package 57 | -------------------------------------------------------------------------------- /template/react-ts/src/features/counter/counterSlice.ts: -------------------------------------------------------------------------------- 1 | import { createSlice } from '@reduxjs/toolkit' 2 | import type { PayloadAction } from '@reduxjs/toolkit' 3 | import type { RootState } from '../../store/appStore' 4 | 5 | // Define a type for the slice state 6 | interface CounterState { 7 | value: number 8 | } 9 | 10 | // Define the initial state using that type 11 | const initialState: CounterState = { 12 | value: 0, 13 | } 14 | 15 | export const counterSlice = createSlice({ 16 | name: 'counter', 17 | // `createSlice` will infer the state type from the `initialState` argument 18 | initialState, 19 | reducers: { 20 | increment: (state) => { 21 | state.value += 1 22 | }, 23 | decrement: (state) => { 24 | state.value -= 1 25 | }, 26 | // Use the PayloadAction type to declare the contents of `action.payload` 27 | incrementByAmount: (state, action: PayloadAction) => { 28 | state.value += action.payload 29 | }, 30 | }, 31 | }) 32 | 33 | export const { increment, decrement, incrementByAmount } = counterSlice.actions 34 | 35 | // Other code such as selectors can use the imported `RootState` type 36 | export const selectCount = (state: RootState) => state.counter.value 37 | 38 | export default counterSlice.reducer -------------------------------------------------------------------------------- /src/core/utils/react/options.ts: -------------------------------------------------------------------------------- 1 | export interface Options { 2 | templatePath?: string 3 | Router?: string 4 | Tailwind?: string 5 | TypeScript?: string 6 | JavaScript?: string 7 | UseHooks?: string 8 | Redux?: string 9 | Jotai?: string 10 | Zustand?: string 11 | Eslint?: string 12 | Vitest?: string 13 | VercelCLI?: string 14 | NetlifyCLI?: string 15 | TanStackReactQuery?: string 16 | name?: string 17 | version?: string 18 | src?: string 19 | dest?: string 20 | allPackages?: any[] 21 | package?: 'bun' | 'pnpm' | 'npm' | 'yarn' | 'none' 22 | deploy?: 'netlify' | 'vercel' | 'none', 23 | stateManagement?: 'redux' | 'jotai' | 'zustand' | 'none', 24 | useEslint?: boolean 25 | useEslintTs?: boolean 26 | useRouter?: boolean 27 | useVercelCLI?: boolean 28 | useNetlifyCLI?: boolean 29 | useReactQuery?: boolean 30 | useTailwind?: boolean 31 | useTypeScript?: boolean 32 | useHooks?: boolean 33 | useJavaScript?: boolean 34 | useTanStackReactQuery?: string 35 | useVitest?: string 36 | useGitInit?: boolean 37 | EslintScript?: string 38 | constantDevDeps?: string 39 | constantProDeps?: string 40 | } 41 | 42 | const options: Options = {} 43 | export default options -------------------------------------------------------------------------------- /template/react-ts/README.md: -------------------------------------------------------------------------------- 1 | # React + TypeScript + Vite 2 | 3 | This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. 4 | 5 | Currently, two official plugins are available: 6 | 7 | - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh 8 | - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh 9 | 10 | ## Expanding the ESLint configuration 11 | 12 | If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: 13 | 14 | - Configure the top-level `parserOptions` property like this: 15 | 16 | ```js 17 | export default { 18 | // other rules... 19 | parserOptions: { 20 | ecmaVersion: 'latest', 21 | sourceType: 'module', 22 | project: ['./tsconfig.json', './tsconfig.node.json'], 23 | tsconfigRootDir: __dirname, 24 | }, 25 | } 26 | ``` 27 | 28 | - Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked` 29 | - Optionally add `plugin:@typescript-eslint/stylistic-type-checked` 30 | - Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list 31 | -------------------------------------------------------------------------------- /src/core/questions/react/projectName.ts: -------------------------------------------------------------------------------- 1 | import options from '../../../core/utils/react/options' 2 | import emptyDirName from '../../../utils/emptyDirName' 3 | import { validatePackageName } from "../../../utils/validatePackageName" 4 | const defaultProjectName = 'create-react-next' 5 | 6 | const packageName = [ 7 | { 8 | name: 'name', 9 | type: 'text', 10 | message: 'What should we call your project?', 11 | initial: defaultProjectName, 12 | validate: (name: string) => { 13 | const validation = validatePackageName(name) 14 | if (validation.valid) { 15 | options.name = name; 16 | return true 17 | } 18 | return 'Invalid project name: ' + validation.problems[0] 19 | }, 20 | active: 'Yes', 21 | inactive: 'No' 22 | }, 23 | { 24 | name: 'overwrite', 25 | type: () => (options.name && emptyDirName(options.name) ? null : 'confirm'), 26 | message: () => { 27 | return `Directory "${options.name}" is not empty. Do you want to overwrite it?` 28 | } 29 | }, 30 | { 31 | name: 'overwrite', 32 | type: (prev: string, values: { overwrite: boolean }) => { 33 | if (values.overwrite === false) { 34 | throw new Error('Operation cancelled') 35 | } 36 | return null 37 | } 38 | } 39 | ] 40 | export default packageName -------------------------------------------------------------------------------- /template/react-js/package.ejs: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-js", 3 | "private": true, 4 | "version": "0.0.0", 5 | <% if (package === 'pnpm') { -%> 6 | "packageManager": "pnpm@8.15.4", 7 | <% } -%> 8 | "type": "module", 9 | "scripts": { 10 | "dev": "vite", 11 | "build": "tsc && vite build", 12 | "preview": "vite preview", 13 | <% if (useEslint) { -%> 14 | <%- EslintScript %> 15 | <% } -%> 16 | <% if (useVitest) { -%> 17 | <%- VitestScript %> 18 | <% } -%> 19 | }, 20 | "dependencies": { 21 | <%- constantProDeps %> 22 | <% if (useRouter) { -%> 23 | <%- Router %> 24 | <% } -%> 25 | <% if (useHooks) { -%> 26 | <%- UseHooks %> 27 | <% } -%> 28 | <% if (stateManagement === 'redux') { -%> 29 | <%- Redux %> 30 | <% } -%> 31 | <% if (stateManagement === 'jotai') { -%> 32 | <%- Jotai %> 33 | <% } -%> 34 | <% if (stateManagement === 'zustand') { -%> 35 | <%- Zustand %> 36 | <% } -%> 37 | <% if (useTanStackReactQuery) { -%> 38 | <%- TanStackReactQuery %> 39 | <% } -%> 40 | }, 41 | "devDependencies": { 42 | <%- constantDevDeps %> 43 | <% if (useEslint) { -%> 44 | <%- Eslint %> 45 | <% } -%> 46 | <% if (useTailwind) { -%> 47 | <%- Tailwind %> 48 | <% } -%> 49 | <% if (useJavaScript) { -%> 50 | <%- JavaScript %> 51 | <% } -%> 52 | <% if (useVitest) { -%> 53 | <%- Vitest %> 54 | <% } -%> 55 | <% if (useVercelCLI) { -%> 56 | <%- VercelCLI %> 57 | <% } -%> 58 | <% if (useNetlifyCLI) { -%> 59 | <%- NetlifyCLI %> 60 | <% } -%> 61 | "@vitejs/plugin-react": "^4.2.1", 62 | "vite": "^5.0.8" 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /template/react-ts/package.ejs: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-ts", 3 | "private": true, 4 | "version": "0.0.0", 5 | <% if (package === 'pnpm') { -%> 6 | "packageManager": "pnpm@8.15.4", 7 | <% } -%> 8 | "type": "module", 9 | "scripts": { 10 | "dev": "vite", 11 | "build": "tsc && vite build", 12 | "preview": "vite preview", 13 | <% if (useEslint) { -%> 14 | <%- EslintScript %> 15 | <% } -%> 16 | <% if (useVitest) { -%> 17 | <%- VitestScript %> 18 | <% } -%> 19 | }, 20 | "dependencies": { 21 | <%- constantProDeps %> 22 | <% if (useRouter) { -%> 23 | <%- Router %> 24 | <% } -%> 25 | <% if (useHooks) { -%> 26 | <%- UseHooks %> 27 | <% } -%> 28 | <% if (stateManagement === 'redux') { -%> 29 | <%- Redux %> 30 | <% } -%> 31 | <% if (stateManagement === 'jotai') { -%> 32 | <%- Jotai %> 33 | <% } -%> 34 | <% if (stateManagement === 'zustand') { -%> 35 | <%- Zustand %> 36 | <% } -%> 37 | <% if (useTanStackReactQuery) { -%> 38 | <%- TanStackReactQuery %> 39 | <% } -%> 40 | }, 41 | "devDependencies": { 42 | <%- constantDevDeps %> 43 | <% if (useTypeScript) { -%> 44 | <%- TypeScript %> 45 | <% } -%> 46 | <% if (useEslint) { -%> 47 | <%- Eslint %> 48 | <% } -%> 49 | <% if (useTailwind) { -%> 50 | <%- Tailwind %> 51 | <% } -%> 52 | <% if (useJavaScript) { -%> 53 | <%- JavaScript %> 54 | <% } -%> 55 | <% if (useVitest) { -%> 56 | <%- Vitest %> 57 | <% } -%> 58 | <% if (useVercelCLI) { -%> 59 | <%- VercelCLI %> 60 | <% } -%> 61 | <% if (useNetlifyCLI) { -%> 62 | <%- NetlifyCLI %> 63 | <% } -%> 64 | "@vitejs/plugin-react": "^4.2.1", 65 | "vite": "^5.0.8" 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@selemondev/create-react-next", 3 | "version": "1.0.3", 4 | "description": "The Next Generation React Scaffolding Tool ✨", 5 | "type": "module", 6 | "main": "./dist/index.cjs", 7 | "module": "./dist/index.js", 8 | "types": "./dist/index.d.ts", 9 | "scripts": { 10 | "dev": "esno src/index.ts", 11 | "build:package": "tsup-node src/index.ts --format cjs,esm --clean --dts --minify --shims", 12 | "generate:release": "npx changelogen@latest --release", 13 | "package:beta": "npm run build && npm publish --tag beta", 14 | "package": "pnpm build:package && npm publish --access=public" 15 | }, 16 | "exports": { 17 | ".": { 18 | "types": "./dist/index.d.ts", 19 | "require": "./dist/index.cjs", 20 | "import": "./dist/index.js" 21 | } 22 | }, 23 | "bin": { 24 | "@selemondev/create-react-next": "./dist/index.js" 25 | }, 26 | "files": [ 27 | "dist", 28 | "src", 29 | "template" 30 | ], 31 | "keywords": [ 32 | "@selemondev/create-react-next", 33 | "React 18 CLI", 34 | "React CLI", 35 | "Vite CLI", 36 | "Vite", 37 | "React-ts", 38 | "React-js", 39 | "TypeScript" 40 | ], 41 | "author": "Selemondev", 42 | "license": "MIT", 43 | "devDependencies": { 44 | "@types/ejs": "^3.1.5", 45 | "@types/fs-extra": "^11.0.4", 46 | "@types/node": "^20.11.30", 47 | "@types/prompts": "^2.4.9", 48 | "@types/validate-npm-package-name": "^4.0.2", 49 | "conf": "^12.0.0", 50 | "esno": "^4.0.0", 51 | "tsup": "^8.0.2", 52 | "typescript": "^5.3.3" 53 | }, 54 | "dependencies": { 55 | "commander": "^12.0.0", 56 | "ejs": "^3.1.9", 57 | "fs-extra": "^11.2.0", 58 | "ora": "^8.0.1", 59 | "prettier": "^3.5.3", 60 | "prompts": "^2.4.2", 61 | "validate-npm-package-name": "^5.0.0" 62 | }, 63 | "pnpm": { 64 | "overrides": {}, 65 | "onlyBuiltDependencies": [ 66 | "esbuild" 67 | ] 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/core/command/create-react-next/copyTemplate.ts: -------------------------------------------------------------------------------- 1 | import fs from "fs-extra"; 2 | import path from "node:path"; 3 | import options from "../../../core/utils/react/options"; 4 | import { ejsRender } from "../../../utils/ejsRender"; 5 | import termColors from "../../../utils/colors"; 6 | import { templateFilesMap } from "../../../core/utils/react/templateFile"; 7 | import { getFilterFile } from "../../../filter/filterFiles"; 8 | import { fileURLToPath } from "node:url"; 9 | import { dirname } from "node:path"; 10 | import ora from "ora"; 11 | 12 | async function copyTemplate() { 13 | const __filename = fileURLToPath(import.meta.url); 14 | 15 | const __dirname = dirname(__filename); 16 | 17 | const spinner = ora("Copying template...").start(); 18 | 19 | const language = options.useTypeScript ? "react-ts" : "react-js"; 20 | 21 | options.src = path.resolve(__dirname, `../template/${language}`); 22 | 23 | const dest = options.name && path.resolve(process.cwd(), options.name); 24 | 25 | options.dest = dest; 26 | 27 | const templatePath = path.resolve( 28 | __dirname, 29 | `../../../../template/${language}`, 30 | ); 31 | options.templatePath = templatePath; 32 | 33 | const filterFileFn = getFilterFile(); 34 | 35 | async function copy() { 36 | const targetDirectory = path.resolve(__dirname, "../"); 37 | if (!dest) { 38 | return; 39 | } 40 | await fs.copy(`${targetDirectory}/template/${language}`, dest); 41 | } 42 | await copy(); 43 | 44 | filterFileFn && (await filterFileFn()); 45 | 46 | options.dest && 47 | (await fs.move( 48 | path.resolve(options.dest, ".gitignore.ejs"), 49 | path.resolve(options.dest, ".gitignore"), 50 | { overwrite: true }, 51 | )); 52 | 53 | await Promise.all( 54 | templateFilesMap 55 | .get("react")() 56 | .map((file: string) => options.name && ejsRender(file, options.name)), 57 | ); 58 | spinner.text = termColors.green("Template successfully copied!"); 59 | 60 | spinner.succeed(); 61 | } 62 | export default copyTemplate; 63 | -------------------------------------------------------------------------------- /src/core/questions/react/createReactQuestions.ts: -------------------------------------------------------------------------------- 1 | import packageManager from './packageManager' 2 | import projectName from './projectName' 3 | import deploy from './deploy' 4 | import { runPrompt } from '.' 5 | import createQuestion from './createQuestion' 6 | import initializeGit from "./initGit" 7 | import { logger } from '../../../utils/logger' 8 | import options from '../../utils/react/options' 9 | import tailwindPrompt from "./tailwind"; 10 | import typeScriptPrompt from "./typescript"; 11 | import eslintPrompt from "./eslint" 12 | import stateManagement from './stateManagement' 13 | import reactQuery from './reactQuery' 14 | import program from '../../program' 15 | import { packageJsonMap } from '../../utils/react/ejsMapConstant' 16 | async function createReactQuestions(): Promise { 17 | try { 18 | options.name = program.args[0] ?? (await createQuestion(projectName)).name; 19 | 20 | if (!options.useTypeScript) { 21 | await createQuestion(typeScriptPrompt) 22 | } 23 | if (!options.useTailwind) { 24 | await createQuestion(tailwindPrompt) 25 | } 26 | await createQuestion(stateManagement) 27 | await runPrompt(); 28 | await createQuestion(reactQuery) 29 | 30 | if (!options.useEslint) { 31 | await createQuestion(eslintPrompt) 32 | } 33 | 34 | if (!options.package) { 35 | await createQuestion(packageManager) 36 | } 37 | 38 | const VercelCLI = packageJsonMap.get('vercelCLI'); 39 | 40 | const NetlifyCLI = packageJsonMap.get('netlifyCLI'); 41 | 42 | const deploymentCLI = await createQuestion(deploy); 43 | 44 | options.VercelCLI = deploymentCLI?.deploy === 'vercel' && VercelCLI; 45 | 46 | options.NetlifyCLI = deploymentCLI?.deploy === 'netlify' && NetlifyCLI; 47 | 48 | options.useVercelCLI = !!options.VercelCLI; 49 | 50 | options.useNetlifyCLI = !!options.NetlifyCLI; 51 | 52 | await createQuestion(initializeGit); 53 | 54 | } catch (error) { 55 | 56 | if (error instanceof Error) { 57 | 58 | logger.error(error.message); 59 | 60 | process.exit(1); 61 | 62 | } 63 | } 64 | 65 | return Promise.resolve() 66 | } 67 | 68 | export default createReactQuestions -------------------------------------------------------------------------------- /src/core/questions/react/index.ts: -------------------------------------------------------------------------------- 1 | import prompts from './prompts' 2 | import options from '../../utils/react/options' 3 | import { 4 | lintMap, 5 | packageJsonMap, 6 | } from '../../utils/react/ejsMapConstant' 7 | import createQuestion from './createQuestion'; 8 | 9 | async function getReactProperty() { 10 | const Eslint = packageJsonMap.get('eslintJs'); 11 | const EslintTs = packageJsonMap.get('eslintTs'); 12 | const Vitest = packageJsonMap.get('vitest'); 13 | const TanStackReactQuery = packageJsonMap.get('tanStackReactQuery'); 14 | const Router = packageJsonMap.get('router'); 15 | const Redux = packageJsonMap.get('redux'); 16 | const Jotai = packageJsonMap.get('jotai'); 17 | const Zustand = packageJsonMap.get('zustand'); 18 | const Tailwind = packageJsonMap.get('tailwind'); 19 | const TypeScript = packageJsonMap.get('typescript'); 20 | const JavaScript = packageJsonMap.get('javascript'); 21 | const UseHooks = packageJsonMap.get('reactHooks'); 22 | 23 | resolveOptions(options, packageJsonMap) 24 | 25 | resolveOptions(options, lintMap) 26 | 27 | options.constantDevDeps = packageJsonMap.get('constantDevDeps') 28 | 29 | options.constantProDeps = packageJsonMap.get('constantProDeps') 30 | 31 | options.Eslint = options.useTypeScript ? EslintTs : Eslint 32 | 33 | options.Vitest = Vitest 34 | 35 | options.Router = Router 36 | 37 | options.Jotai = Jotai 38 | 39 | options.Zustand = Zustand 40 | 41 | options.TanStackReactQuery = TanStackReactQuery 42 | 43 | options.Redux = Redux 44 | 45 | options.UseHooks = UseHooks; 46 | 47 | options.Tailwind = Tailwind; 48 | 49 | options.TypeScript = TypeScript 50 | 51 | options.JavaScript = JavaScript 52 | 53 | options.useEslintTs = options.useTypeScript 54 | 55 | options.useJavaScript = options.useTypeScript === false; 56 | 57 | return Promise.resolve(true) 58 | } 59 | export async function runPrompt() { 60 | 61 | await createQuestion(prompts) 62 | 63 | await getReactProperty() 64 | } 65 | 66 | function resolveOptions(originOptions: any, configMap: Map) { 67 | Array.from(configMap.keys()).forEach((item: string) => { 68 | originOptions[item] = configMap.get(item) 69 | }) 70 | } 71 | -------------------------------------------------------------------------------- /template/react-js/src/main.ejs: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom/client' 3 | import App from './App.jsx' 4 | <% if (stateManagement==='redux') { -%> 5 | import { store } from "./store/appStore.js"; 6 | import { Provider } from 'react-redux' 7 | <% } -%> 8 | <% if (useTailwind) { -%> 9 | import './assets/css/tailwind.css' 10 | <% } -%> 11 | <% if (useTanStackReactQuery) { -%> 12 | import { 13 | QueryClient, 14 | QueryClientProvider, 15 | } from '@tanstack/react-query' 16 | import { ReactQueryDevtools } from '@tanstack/react-query-devtools' 17 | <% } -%> 18 | 19 | <% if (useTanStackReactQuery && stateManagement !== 'redux' ) { -%> 20 | const queryClient = new QueryClient({ 21 | defaultOptions: { 22 | queries: { 23 | staleTime: 1000 * 10, 24 | }, 25 | }, 26 | }) 27 | ReactDOM.createRoot(document.getElementById('root')).render( 28 | 29 | 30 | 31 | 32 | 33 | 34 | ) 35 | <% } -%> 36 | 37 | <% if (useTanStackReactQuery && stateManagement === 'redux' ) { -%> 38 | const queryClient = new QueryClient({ 39 | defaultOptions: { 40 | queries: { 41 | staleTime: 1000 * 10, 42 | }, 43 | }, 44 | }) 45 | <% } -%> 46 | 47 | <% if ((stateManagement !== 'redux' || stateManagement === 'none') && !useTanStackReactQuery) { %> 48 | ReactDOM.createRoot(document.getElementById('root')).render( 49 | 50 | 51 | 52 | ) 53 | <% } %> 54 | 55 | 56 | <% if (stateManagement === 'redux' && useTanStackReactQuery) { -%> 57 | ReactDOM.createRoot(document.getElementById('root')).render( 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | ) 67 | <% } -%> 68 | 69 | <% if (stateManagement === 'redux' && !useTanStackReactQuery) { -%> 70 | ReactDOM.createRoot(document.getElementById('root')).render( 71 | 72 | 73 | 74 | 75 | 76 | ) 77 | <% } -%> -------------------------------------------------------------------------------- /template/react-ts/src/main.ejs: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom/client' 3 | import App from './App.tsx' 4 | <% if (stateManagement==='redux') { -%> 5 | import { store } from "./store/appStore.ts"; 6 | import { Provider } from 'react-redux' 7 | <% } -%> 8 | <% if (useTailwind) { -%> 9 | import './assets/css/tailwind.css' 10 | <% } -%> 11 | <% if (useTanStackReactQuery) { -%> 12 | import { 13 | QueryClient, 14 | QueryClientProvider, 15 | } from '@tanstack/react-query' 16 | import { ReactQueryDevtools } from '@tanstack/react-query-devtools' 17 | <% } -%> 18 | 19 | <% if (useTanStackReactQuery && stateManagement !== 'redux' ) { -%> 20 | const queryClient = new QueryClient({ 21 | defaultOptions: { 22 | queries: { 23 | staleTime: 1000 * 10, 24 | }, 25 | }, 26 | }) 27 | ReactDOM.createRoot(document.getElementById('root')).render( 28 | 29 | 30 | 31 | 32 | 33 | 34 | ) 35 | <% } -%> 36 | 37 | <% if (useTanStackReactQuery && stateManagement === 'redux' ) { -%> 38 | const queryClient = new QueryClient({ 39 | defaultOptions: { 40 | queries: { 41 | staleTime: 1000 * 10, 42 | }, 43 | }, 44 | }) 45 | <% } -%> 46 | 47 | <% if ((stateManagement !== 'redux' || stateManagement === 'none') && !useTanStackReactQuery) { %> 48 | ReactDOM.createRoot(document.getElementById('root')).render( 49 | 50 | 51 | 52 | ) 53 | <% } %> 54 | 55 | 56 | <% if (stateManagement === 'redux' && useTanStackReactQuery) { -%> 57 | ReactDOM.createRoot(document.getElementById('root')).render( 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | ) 67 | <% } -%> 68 | 69 | <% if (stateManagement === 'redux' && !useTanStackReactQuery) { -%> 70 | ReactDOM.createRoot(document.getElementById('root')).render( 71 | 72 | 73 | 74 | 75 | 76 | ) 77 | <% } -%> -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import program from './core/program' 4 | import createReactNext from './core/command/create-react-next'; 5 | import packageJson from "../package.json" 6 | import options from './core/utils/react/options'; 7 | 8 | async function main() { 9 | program 10 | .version(packageJson.version) 11 | .description(`Create React Next. The Next Generation React Scaffolding Tool ⚡`) 12 | .action((name: string) => { 13 | options.name = name; 14 | }) 15 | .option( 16 | '--ts, --typescript', 17 | ` 18 | 19 | Initialize as a TypeScript project. 20 | ` 21 | ) 22 | .option( 23 | '--tailwind', 24 | ` 25 | 26 | Initialize with Tailwind CSS. 27 | ` 28 | ) 29 | .option( 30 | '--eslint', 31 | ` 32 | 33 | Initialize with eslint config. 34 | ` 35 | ) 36 | .option( 37 | '--use-npm', 38 | ` 39 | 40 | Explicitly tell the CLI to bootstrap the application using npm 41 | ` 42 | ) 43 | .option( 44 | '--use-pnpm', 45 | ` 46 | 47 | Explicitly tell the CLI to bootstrap the application using pnpm 48 | ` 49 | ) 50 | .option( 51 | '--use-yarn', 52 | ` 53 | 54 | Explicitly tell the CLI to bootstrap the application using Yarn 55 | ` 56 | ) 57 | .option( 58 | '--use-bun', 59 | ` 60 | 61 | Explicitly tell the CLI to bootstrap the application using Bun 62 | ` 63 | ) 64 | .allowUnknownOption() 65 | .parse(process.argv); 66 | options.useTypeScript = program.opts().typescript; 67 | options.useTailwind = program.opts().tailwind; 68 | options.useEslint = program.opts().eslint; 69 | options.package = !!program.opts().useNpm ? 'npm' : !!program.opts().usePnpm ? 'pnpm' : !!program.opts().useYarn ? 'yarn' : !!program.opts().useBun ? 'bun' : options.package; 70 | await createReactNext(); 71 | 72 | } 73 | main(); -------------------------------------------------------------------------------- /src/core/command/create-react-next/install.ts: -------------------------------------------------------------------------------- 1 | import options from "../../../core/utils/react/options"; 2 | import { logger } from "../../../utils/logger"; 3 | import { createSpawnCmd } from "../../../utils/createSpawnCmd"; 4 | import ora from "ora"; 5 | import termColors from "../../../utils/colors"; 6 | async function installDeps() { 7 | // No output will be shown in the console 8 | const cmdIgnore = createSpawnCmd(options.dest, "ignore"); 9 | 10 | const spinner = ora("Copying template...").start(); 11 | 12 | const startTime: number = new Date().getTime(); 13 | 14 | if (options.useGitInit) { 15 | await cmdIgnore("git", ["init"]); 16 | 17 | await cmdIgnore("git", ["add ."]); 18 | 19 | await cmdIgnore("git", ['commit -m "Initialized by create-react-next"']); 20 | } 21 | 22 | if (options.package && options.package !== "none") { 23 | spinner.text = termColors.cyan( 24 | `Installing dependencies with ${options.package}. Please wait...`, 25 | ); 26 | 27 | await cmdIgnore(options.package, ["install"]); 28 | } 29 | 30 | spinner.stop(); 31 | 32 | const endTime: number = new Date().getTime(); 33 | const usageTime: number = (endTime - startTime) / 1000; 34 | 35 | console.log(); 36 | 37 | logger.info(`🚀 Completed in ${usageTime}s`); 38 | 39 | console.log(); 40 | 41 | logger.success("✅ Project created successfully"); 42 | 43 | console.log(); 44 | 45 | logger.info(`cd ${options.name}`); 46 | 47 | console.log(); 48 | 49 | if (options.package !== "none") { 50 | logger.info( 51 | options.package === "npm" 52 | ? `${options.package} run dev to start the dev server` 53 | : `${options.package} dev to start the dev server`, 54 | ); 55 | 56 | options.useEslint && console.log(); 57 | 58 | options.useEslint && 59 | logger.info(`${options.package} run lint to format your code`); 60 | 61 | options.useVitest && console.log(); 62 | 63 | options.useVitest && 64 | logger.info(`${options.package} run test:unit to run tests`); 65 | } else { 66 | logger.info(`npm install - To install dependencies`); 67 | 68 | console.log(); 69 | 70 | options.useEslint && logger.info("npm run lint to format your code"); 71 | 72 | options.useEslint && console.log(); 73 | 74 | logger.info("npm run dev to start the dev server"); 75 | 76 | options.useVitest && console.log(); 77 | 78 | options.useVitest && logger.info("npm run test:unit to run tests"); 79 | } 80 | } 81 | export default installDeps; 82 | -------------------------------------------------------------------------------- /src/utils/ejsRender.ts: -------------------------------------------------------------------------------- 1 | import ejs from "ejs"; 2 | import fs from 'fs-extra' 3 | import { resolve, extname, parse } from "path"; 4 | import { format as prettierFormatter } from "prettier/standalone" 5 | import parserBabel from "prettier/parser-babel"; 6 | import parserEstree from "prettier/plugins/estree"; 7 | import options from '../core/utils/react/options' 8 | 9 | // formatting the code 10 | 11 | export async function ejsRender(filePath: string, name: string): Promise { 12 | try { 13 | let prettierCode: string = ''; 14 | 15 | const file = parse(filePath); 16 | 17 | const dest = resolve(process.cwd(), name) 18 | 19 | const readFilePath = resolve(dest, file.dir, `${file.name}.ejs`) 20 | 21 | const outputFilePath = resolve(dest, filePath) 22 | 23 | const templateCode = await fs.readFile(readFilePath) 24 | 25 | const code = ejs.render(templateCode.toString(), options); 26 | 27 | const extensionName = extname(filePath).replace(/[.]/g, '') 28 | 29 | try { 30 | switch (extensionName) { 31 | case 'ts': 32 | case 'tsx': 33 | case 'jsx': 34 | case 'js': 35 | prettierCode = await prettierFormatter(code, { 36 | parser: 'babel', 37 | plugins: [parserBabel, parserEstree] 38 | }); 39 | break; 40 | case 'json': 41 | prettierCode = await prettierFormatter(code, { 42 | parser: "json", 43 | plugins: [parserBabel, parserEstree] 44 | }); 45 | break; 46 | case 'cjs': 47 | prettierCode = await prettierFormatter(code, { 48 | parser: "babel", 49 | plugins: [parserBabel, parserEstree] 50 | }); 51 | break; 52 | case 'toml': 53 | prettierCode = code 54 | break; 55 | case '': 56 | prettierCode = code 57 | break 58 | default: 59 | prettierCode = await prettierFormatter(code, { parser: extname }) 60 | break 61 | } 62 | } catch (err) { 63 | console.log(err) 64 | } 65 | await fs.outputFile(outputFilePath, prettierCode) 66 | await fs.remove(readFilePath) 67 | } catch (error) { 68 | console.log(error) 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/filter/filterFiles.ts: -------------------------------------------------------------------------------- 1 | import options from '../core/utils/react/options'; 2 | import fs from 'fs-extra'; 3 | 4 | export function getFilterFile() { 5 | async function reactFilterFileActions() { 6 | if (!options.useRouter) { 7 | fs.remove(`${options.dest}/src/pages`) 8 | } 9 | 10 | if (!options.useTailwind) { 11 | fs.remove(`${options.dest}/tailwind.config.js`); 12 | fs.remove(`${options.dest}/postcss.config.js`); 13 | fs.remove(`${options.dest}/src/assets/css/tailwind.css`); 14 | }; 15 | 16 | if (options.useTailwind) { 17 | fs.remove(`${options.dest}/src/assets/css/base.css`); 18 | } 19 | 20 | if (options.deploy === 'none') { 21 | fs.remove(`${options.dest}/netlify.toml`); 22 | fs.remove(`${options.dest}/vercel.json`); 23 | } 24 | 25 | if (options.deploy === "netlify") { 26 | fs.remove(`${options.dest}/vercel.json`); 27 | } 28 | 29 | if (options.deploy === "vercel") { 30 | fs.remove(`${options.dest}/netlify.toml`); 31 | } 32 | 33 | 34 | if (options.useTailwind === false) { 35 | fs.remove(`${options.dest}/src/assets/css/tailwind.css`); 36 | } 37 | 38 | if (options.useJavaScript) { 39 | fs.remove(`${options.dest}/src/main.tsx`); 40 | } 41 | 42 | if (!options.useVitest) { 43 | fs.remove(`${options.dest}/vitest.config.ts`); 44 | fs.remove(`${options.dest}/vitest.config.js`); 45 | fs.remove(`${options.dest}/tests`); 46 | } 47 | 48 | if (options.stateManagement === 'none') { 49 | fs.remove(`${options.dest}/src/store`) 50 | fs.remove(`${options.dest}/src/app`) 51 | fs.remove(`${options.dest}/src/features`) 52 | } 53 | 54 | if (options.stateManagement === 'jotai') { 55 | fs.remove(`${options.dest}/src/app`) 56 | fs.remove(`${options.dest}/src/store`) 57 | fs.remove(`${options.dest}/src/features`) 58 | } 59 | 60 | 61 | if (options.stateManagement === 'zustand') { 62 | fs.remove(`${options.dest}/src/app`) 63 | fs.remove(`${options.dest}/src/store/appStore.ts`) 64 | fs.remove(`${options.dest}/src/store/appStore.js`) 65 | fs.remove(`${options.dest}/src/features`) 66 | } 67 | 68 | if (options.stateManagement === 'redux') { 69 | fs.remove(`${options.dest}/src/store/store.ts`) 70 | fs.remove(`${options.dest}/src/store/store.js`) 71 | } 72 | 73 | if (!options.useEslint) { 74 | fs.remove(`${options.dest}/.eslintrc.cjs`) 75 | } 76 | return true 77 | } 78 | const obj = new Map([ 79 | ['react', reactFilterFileActions], 80 | ]) 81 | const res = obj.get('react'); 82 | return res 83 | } 84 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.yaml: -------------------------------------------------------------------------------- 1 | name: ✨ Feature Request 2 | description: Suggest an idea or enhancement for this project 3 | labels: [enhancement] 4 | body: 5 | - type: markdown 6 | attributes: 7 | value: | 8 | ## 🌟 Thanks for taking the time to share your ideas! 9 | ### We appreciate your contribution to making our project better. 10 | 11 | - type: dropdown 12 | id: feature_type 13 | attributes: 14 | label: 🎯 Type of feature 15 | description: What kind of feature are you proposing? 16 | options: 17 | - New functionality 18 | - Enhancement to existing feature 19 | - User experience improvement 20 | - Performance improvement 21 | - Other (please describe below) 22 | validations: 23 | required: true 24 | 25 | - type: textarea 26 | id: problem 27 | attributes: 28 | label: 🤔 Is your feature request related to a problem? 29 | description: Please describe what problem you're trying to solve 30 | placeholder: I'm always frustrated when [...] 31 | validations: 32 | required: false 33 | 34 | - type: textarea 35 | id: solution 36 | attributes: 37 | label: 💡 Desired solution 38 | description: Describe what you want to happen 39 | placeholder: It would be great if the package could... 40 | validations: 41 | required: true 42 | 43 | - type: textarea 44 | id: alternatives 45 | attributes: 46 | label: 🔄 Alternatives considered 47 | description: Describe any alternative solutions or features you've considered 48 | placeholder: I thought about implementing it by... 49 | validations: 50 | required: false 51 | 52 | - type: textarea 53 | id: examples 54 | attributes: 55 | label: 🔍 Examples from other projects 56 | description: Are there other projects that have something similar to what you're requesting? 57 | placeholder: This feature exists in [project link] and works by... 58 | validations: 59 | required: false 60 | 61 | - type: textarea 62 | id: context 63 | attributes: 64 | label: 📝 Additional context 65 | description: Add any other context, mockups, or screenshots about the feature request here 66 | placeholder: You can paste images directly here! 67 | validations: 68 | required: false 69 | 70 | - type: checkboxes 71 | id: terms 72 | attributes: 73 | label: ✅ Before submitting 74 | options: 75 | - label: 🔍 I've searched for existing feature requests and this hasn't been suggested before 76 | required: true 77 | - label: 🙋 I'm willing to help implement or test this feature if needed 78 | required: false 79 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.yaml: -------------------------------------------------------------------------------- 1 | name: 🐛 Bug Report 2 | description: Report a bug to help us improve 3 | labels: [bug, triage] 4 | body: 5 | - type: markdown 6 | attributes: 7 | value: | 8 | ## 🙏 Thanks for taking the time to report this issue! 9 | ### Please complete the information below to help us fix the problem quickly. 10 | 11 | - type: textarea 12 | id: description 13 | attributes: 14 | label: 🔍 Describe the bug 15 | description: A clear and concise description of what the bug is 16 | placeholder: When I try to use the package, it crashes ... 17 | validations: 18 | required: true 19 | 20 | - type: textarea 21 | id: reproduction 22 | attributes: 23 | label: 🔄 Steps to reproduce 24 | description: How can we recreate this issue? Be specific! 25 | placeholder: | 26 | 1. Go to '...' 27 | 2. Click on '...' 28 | 3. See error 29 | validations: 30 | required: true 31 | 32 | - type: textarea 33 | id: expected 34 | attributes: 35 | label: ✅ Expected behavior 36 | description: What did you expect to happen? 37 | placeholder: The package should ... 38 | validations: 39 | required: true 40 | 41 | - type: dropdown 42 | id: os 43 | attributes: 44 | label: 💻 Operating System 45 | multiple: true 46 | options: 47 | - Windows 48 | - macOS 49 | - Linux 50 | - Other (please specify in Additional Info) 51 | validations: 52 | required: true 53 | 54 | - type: input 55 | id: version 56 | attributes: 57 | label: 📊 Package Version 58 | description: What version of the package are you using? 59 | placeholder: e.g., v1.0.0 60 | validations: 61 | required: false 62 | 63 | - type: textarea 64 | id: screenshots 65 | attributes: 66 | label: 📷 Screenshots 67 | description: If applicable, add screenshots to help explain your problem 68 | placeholder: You can paste images directly here! 69 | validations: 70 | required: false 71 | 72 | - type: textarea 73 | id: additional 74 | attributes: 75 | label: 📝 Additional context 76 | description: Add any other information about the problem here 77 | placeholder: Environment details, related issues, etc. 78 | validations: 79 | required: false 80 | 81 | - type: checkboxes 82 | id: terms 83 | attributes: 84 | label: ✨ Before submitting 85 | description: Please confirm the following 86 | options: 87 | - label: 🔍 I've searched for existing issues and this hasn't been reported before 88 | required: true 89 | - label: ℹ️ I've included all the information needed to reproduce the issue 90 | required: true 91 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 | Create React Next 5 |

6 |

7 | 8 |

9 | 10 | npm-version-src 11 | 12 | 13 | npm-downloads-src 14 | 15 | 16 | 17 | 18 |

19 | 20 | The Next Generation React Scaffolding Tool powered by Vite 🛠️ 21 | 22 | ## Usage 23 | 24 | ### npx 25 | 26 | ```bash 27 | npx @selemondev/create-react-next@latest 28 | 29 | # OR 30 | 31 | npx @selemondev/create-react-next --ts --eslint --tailwind --use-pnpm 32 | ``` 33 | 34 | ### yarn 35 | 36 | ```bash 37 | yarn create @selemondev/create-react-next 38 | 39 | # OR 40 | 41 | yarn create @selemondev/create-react-next --ts --eslint --tailwind --use-pnpm 42 | ``` 43 | 44 | ### pnpm 45 | 46 | ```bash 47 | pnpm create @selemondev/create-react-next@latest 48 | 49 | # OR 50 | 51 | pnpm create @selemondev/create-react-next@latest --ts --eslint --tailwind --use-pnpm 52 | ``` 53 | 54 | ## Options 55 | 56 | You can also pass command line arguments to set up a new project non-interactively. Run `@selemondev/create-react-next --help` to see the available command line arguments: 57 | 58 | ```bash 59 | Usage: @selemondev/create-react-next@latest [options] 60 | 61 | Options: 62 | -V, --version output the version number 63 | --ts, --typescript 64 | 65 | Initialize as a TypeScript project. 66 | 67 | --tailwind 68 | 69 | Initialize with Tailwind CSS config. 70 | 71 | --eslint 72 | 73 | Initialize with ESLint config. 74 | 75 | --use-npm 76 | 77 | Explicitly tell the CLI to bootstrap the app using npm 78 | 79 | --use-pnpm 80 | 81 | Explicitly tell the CLI to bootstrap the app using pnpm 82 | 83 | --use-yarn 84 | 85 | Explicitly tell the CLI to bootstrap the app using Yarn 86 | 87 | --use-bun 88 | 89 | Explicitly tell the CLI to bootstrap the app using Bun 90 | ``` 91 | 92 | ### How to contribute? 93 | 94 | Contributions are welcome and encouraged! If you have any ideas or suggestions for new features, or if you encounter any bugs or issues, please open an issue or submit a pull request on the GitHub repository. 95 | 96 | Developers interested in contributing should read the [Code of Conduct](./CODE_OF_CONDUCT.md) and the [Contributing Guide](./CONTRIBUTING.md). 97 | 98 | 99 | Happy hacking ⚡ 100 | 101 | -------------------------------------------------------------------------------- /src/utils/colors.ts: -------------------------------------------------------------------------------- 1 | // https://github.com/alexeyraspopov/picocolors/blob/main/picocolors.js 2 | const p = process || {}; 3 | const argv = p.argv || []; 4 | const env = p.env || {}; 5 | const isColorSupported = 6 | !(!!env.NO_COLOR || argv.includes("--no-color")) && 7 | (!!env.FORCE_COLOR || 8 | argv.includes("--color") || 9 | p.platform === "win32" || 10 | ((p.stdout || {}).isTTY && env.TERM !== "dumb") || 11 | !!env.CI); 12 | 13 | function formatter(open: string, close: string, replace = open) { 14 | return (input: string) => { 15 | const string = `${input}`; 16 | const index = string.indexOf(close, open.length); 17 | return ~index 18 | ? open + replaceClose(string, close, replace, index) + close 19 | : open + string + close; 20 | }; 21 | } 22 | 23 | function replaceClose( 24 | string: string, 25 | close: string, 26 | replace: string, 27 | index: number, 28 | ) { 29 | let result = ""; 30 | let cursor = 0; 31 | do { 32 | result += string.substring(cursor, index) + replace; 33 | cursor = index + close.length; 34 | index = string.indexOf(close, cursor); 35 | } while (~index); 36 | return result + string.substring(cursor); 37 | } 38 | 39 | function createColors(enabled = isColorSupported) { 40 | const f = enabled ? formatter : () => String; 41 | return { 42 | isColorSupported: enabled, 43 | reset: f("\x1B[0m", "\x1B[0m"), 44 | bold: f("\x1B[1m", "\x1B[22m", "\x1B[22m\x1B[1m"), 45 | dim: f("\x1B[2m", "\x1B[22m", "\x1B[22m\x1B[2m"), 46 | italic: f("\x1B[3m", "\x1B[23m"), 47 | underline: f("\x1B[4m", "\x1B[24m"), 48 | inverse: f("\x1B[7m", "\x1B[27m"), 49 | hidden: f("\x1B[8m", "\x1B[28m"), 50 | strikethrough: f("\x1B[9m", "\x1B[29m"), 51 | 52 | black: f("\x1B[30m", "\x1B[39m"), 53 | red: f("\x1B[31m", "\x1B[39m"), 54 | green: f("\x1B[32m", "\x1B[39m"), 55 | yellow: f("\x1B[33m", "\x1B[39m"), 56 | blue: f("\x1B[34m", "\x1B[39m"), 57 | magenta: f("\x1B[35m", "\x1B[39m"), 58 | cyan: f("\x1B[36m", "\x1B[39m"), 59 | white: f("\x1B[37m", "\x1B[39m"), 60 | gray: f("\x1B[90m", "\x1B[39m"), 61 | orange: f("\x1B[38;5;208m", "\x1B[39m"), 62 | 63 | bgBlack: f("\x1B[40m", "\x1B[49m"), 64 | bgRed: f("\x1B[41m", "\x1B[49m"), 65 | bgGreen: f("\x1B[42m", "\x1B[49m"), 66 | bgYellow: f("\x1B[43m", "\x1B[49m"), 67 | bgBlue: f("\x1B[44m", "\x1B[49m"), 68 | bgMagenta: f("\x1B[45m", "\x1B[49m"), 69 | bgCyan: f("\x1B[46m", "\x1B[49m"), 70 | bgWhite: f("\x1B[47m", "\x1B[49m"), 71 | 72 | blackBright: f("\x1B[90m", "\x1B[39m"), 73 | redBright: f("\x1B[91m", "\x1B[39m"), 74 | greenBright: f("\x1B[92m", "\x1B[39m"), 75 | yellowBright: f("\x1B[93m", "\x1B[39m"), 76 | blueBright: f("\x1B[94m", "\x1B[39m"), 77 | magentaBright: f("\x1B[95m", "\x1B[39m"), 78 | cyanBright: f("\x1B[96m", "\x1B[39m"), 79 | whiteBright: f("\x1B[97m", "\x1B[39m"), 80 | 81 | bgBlackBright: f("\x1B[100m", "\x1B[49m"), 82 | bgRedBright: f("\x1B[101m", "\x1B[49m"), 83 | bgGreenBright: f("\x1B[102m", "\x1B[49m"), 84 | bgYellowBright: f("\x1B[103m", "\x1B[49m"), 85 | bgBlueBright: f("\x1B[104m", "\x1B[49m"), 86 | bgMagentaBright: f("\x1B[105m", "\x1B[49m"), 87 | bgCyanBright: f("\x1B[106m", "\x1B[49m"), 88 | bgWhiteBright: f("\x1B[107m", "\x1B[49m"), 89 | }; 90 | } 91 | 92 | const termColors = createColors(); 93 | export default termColors; 94 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, race, body size, disability, ethnicity, sex characteristics, and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. 6 | 7 | ## Our Standards 8 | 9 | Examples of behavior that contributes to creating a positive environment include: 10 | 11 | - Using welcoming and inclusive language 12 | - Being respectful of differing viewpoints and experiences 13 | - Gracefully accepting constructive criticism 14 | - Focusing on what is best for the community 15 | - Showing empathy towards other community members 16 | 17 | Examples of unacceptable behavior by participants include: 18 | 19 | - The use of sexualized language or imagery and unwelcome sexual attention or advances 20 | - Trolling, insulting/derogatory comments, and personal or political attacks 21 | - Public or private harassment 22 | - Publishing others' private information, such as a physical or electronic address, without explicit permission 23 | - Other conduct which could reasonably be considered inappropriate in a professional setting 24 | 25 | ## Our Responsibilities 26 | 27 | Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. 28 | 29 | Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. 30 | 31 | ## Scope 32 | 33 | This Code of Conduct applies within all project spaces, and it also applies when an individual is representing the project or its community in public spaces. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. 34 | 35 | ## Enforcement 36 | 37 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at selemondev19@gmail.com. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. 38 | 39 | Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. 40 | 41 | ## Attribution 42 | 43 | This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 44 | 45 | For answers to common questions about this code of conduct, see https://www.contributor-covenant.org/faq 46 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | Thank you for your valuable contribution and dedication to improving this project! We greatly appreciate your involvement. To ensure a smooth and cohesive collaboration, we have provided some guidelines to help you get started. Kindly take a moment to review them before submitting your contributions. Your efforts will undoubtedly make this project even better, and we look forward to working together on its success!. 4 | 5 | ## Code of Conduct 6 | 7 | This project is governed by the [Contributor Covenant Code of Conduct](./CODE_OF_CONDUCT.md). By participating, you are expected to adhere to it. 8 | 9 | ## Open Development 10 | 11 | All work happens directly on `GitHub`. Both core team members and external contributors send pull requests which go through the same `code review` process. 12 | 13 | ## Semantic Versioning 14 | 15 | This project follows semantic versioning. We release patch versions for bug fixes or other changes that do not change the behavior of the API, minor versions for new features that are backward-compatible, and major versions for any breaking changes. 16 | 17 | Every significant change is documented in the changelog file. 18 | 19 | ## Reporting Issues 20 | 21 | Welcome to Create-React-Next CLI! We value your feedback and contributions to make this project better. If you encounter any bugs or have feature requests, please use [Github issues](https://github.com/selemondev/create-react-next/issues) issues to submit them. 22 | 23 | Before reporting an issue, we ask you to: 24 | 25 | 1. `Search for Similar Issues` : Ensure you have searched through our existing issues to see if the problem or feature request has already been addressed or is under discussion. 26 | 27 | 2. `Reproduce the Bug` : If reporting a bug, please provide the minimum code required to reproduce the issue. This will help us understand and resolve the problem more efficiently. 28 | 29 | 3. `Describe Feature Requests` : For feature requests, please describe the desired functionality and any additional context that might be helpful. 30 | 31 | Your participation and attention to these guidelines will help us maintain a more organized and effective development process. 32 | 33 | ## Commit Guidelines 34 | 35 | Commit messages are required to follow the [conventional-changelog standard](https://www.conventionalcommits.org/en/v1.0.0/): 36 | 37 | ```bash 38 | [optional scope]: 39 | 40 | [optional body] 41 | 42 | [optional footer(s)] 43 | ``` 44 | 45 | 👉 [Commit example](https://github.com/unocss/unocss/releases/tag/v0.39.0) 46 | 47 | ### Commit types 48 | 49 | The following is a list of commit types: 50 | 51 | ### Commit Types: 52 | 53 | - `feat`: Adding a new snippet or significant functionality to the Create-React-Next CLI. 54 | 55 | - `fix`: Addressing bugs or issues in existing Create-React-Next CLI. 56 | 57 | - `docs`: Commits related to documentation changes for Create-React-Next CLI. 58 | 59 | - `style`: Commits related to code formatting, styling, or theming of Create-React-Next CLI. 60 | 61 | - `refactor`: Code changes that enhance the library's structure without introducing new features or fixing bugs. 62 | 63 | - `perf`: Commits aimed at improving performance for Create-React-Next CLI. 64 | 65 | - `test`: Commits related to testing Create-React-Next CLI. 66 | 67 | - `chore`: Other commits not affecting source or test files directly. 68 | 69 | ## License 70 | 71 | By contributing your code to the repository, you agree to license your contribution under the [MIT license](./LICENSE). 72 | -------------------------------------------------------------------------------- /src/deps/react/dependencies.ts: -------------------------------------------------------------------------------- 1 | import options from '../../core/utils/react/options' 2 | const router = { 3 | name: 'react-router-dom', 4 | version: '^6.22.3', 5 | stableVersion: '^6.22.3', 6 | env: 'pro' 7 | } 8 | const redux = { 9 | name: ['react-redux', '@reduxjs/toolkit'], 10 | version: ['^9.1.0', '^2.2.1'], 11 | stableVersion: ['^9.1.0', '^2.2.1'], 12 | env: 'pro' 13 | } 14 | 15 | const zustand = { 16 | name: 'zustand', 17 | version: '^4.5.2', 18 | stableVersion: '^4.5.2', 19 | env: 'pro' 20 | } 21 | 22 | const jotai = { 23 | name: ['jotai', 'jotai-immer'], 24 | version: ['^2.7.1', '^0.3.0'], 25 | stableVersion: ['^2.7.1', '^0.3.0'], 26 | env: 'pro' 27 | } 28 | 29 | const eslintJs = { 30 | name: ['eslint', 'eslint-plugin-react', 'eslint-plugin-react-hooks', 'eslint-plugin-react-refresh'], 31 | version: ["^8.57.0", "^7.34.0", "^4.6.0", "^0.4.5"], 32 | stableVersion: ["^8.57.0", "^7.34.0", "^4.6.0", "^0.4.5"], 33 | env: ['dev', 'dev', 'dev', 'dev'] 34 | } 35 | 36 | const eslintTs = { 37 | name: [ 38 | "eslint", 39 | 'eslint-plugin-react-hooks', 40 | 'eslint-plugin-react-refresh', 41 | '@typescript-eslint/eslint-plugin', 42 | '@typescript-eslint/parser' 43 | ], 44 | version: ["^8.57.0", "^4.6.0", "^0.4.5", "^7.1.1", "^7.1.1"], 45 | stableVersion: ["^8.57.0", "^4.6.0", "^0.4.5", "^7.1.1", "^7.1.1"], 46 | env: ['dev', 'dev', 'dev', 'dev', 'dev'] 47 | } 48 | 49 | const tailwind = { 50 | name: [ 51 | 'tailwindcss', 52 | 'postcss', 53 | 'autoprefixer' 54 | ], 55 | version: ['^3.4.1', '^8.4.35', '^10.4.18'], 56 | stableVersion: ['^3.4.1', '^8.4.35', '^10.4.18'], 57 | env: ['dev', 'dev', 'dev'] 58 | }; 59 | 60 | const reactHooks = { 61 | name: '@uidotdev/usehooks', 62 | version: '^2.4.1', 63 | stableVersion: '^2.4.1', 64 | env: 'pro' 65 | } 66 | 67 | const typescript = { 68 | name: [ 69 | 'typescript', 70 | '@types/react', 71 | '@types/react-dom', 72 | '@types/node' 73 | ], 74 | version: ['^5.2.2', '^18.2.64', "^18.2.21", '^20.11.28'], 75 | stableVersion: ['^5.2.2', '^18.2.64', "^18.2.21", '^20.11.28'], 76 | dev: ['dev', 'dev', 'dev', 'dev'] 77 | } 78 | 79 | const javascript = { 80 | name: [], 81 | version: [], 82 | stableVersion: [], 83 | dev: [] 84 | }; 85 | 86 | const tanStackReactQuery = { 87 | name: [ 88 | "@tanstack/react-query", 89 | "@tanstack/react-query-devtools" 90 | ], 91 | version: ["^5.28.0", "^5.28.0"], 92 | stableVersion: ["^5.28.0", "^5.28.0"], 93 | dev: ['pro', 'pro'] 94 | } 95 | 96 | const vitest = { 97 | name: ['vitest', 'jsdom', "@testing-library/react", '@testing-library/jest-dom'], 98 | version: ["^1.2.2", "^24.0.0", "^14.2.1", "^6.4.2"], 99 | stableVersion: ["^1.2.2", "^24.0.0", "^14.2.1", "^6.4.2"], 100 | dev: ['dev', 'dev', 'dev', 'dev'] 101 | } 102 | 103 | const vercelCLI = { 104 | name: ['vercel'], 105 | version: ["^34.1.7"], 106 | stableVersion: ["^34.1.7"], 107 | dev: ['dev'] 108 | } 109 | 110 | const netlifyCLI = { 111 | name: ['netlify-cli'], 112 | version: ["^17.30.0"], 113 | stableVersion: ["^17.30.0"], 114 | dev: ['dev'] 115 | } 116 | 117 | const constantDevDeps = { 118 | name: options.useTypeScript ? typescript.name : javascript.name, 119 | version: options.useTypeScript ? typescript.version : javascript.version, 120 | stableVersion: options.useTypeScript ? typescript.stableVersion : javascript.stableVersion, 121 | dev: options.useTypeScript ? typescript.dev : javascript.dev 122 | } 123 | 124 | const constantProDeps = { 125 | name: ['react', 'react-dom'], 126 | version: ['^18.2.0', '^18.2.0'], 127 | stableVersion: ['^18.2.0', '^18.2.0'], 128 | dev: 'pro' 129 | } 130 | export { 131 | constantDevDeps, 132 | constantProDeps, 133 | tailwind, 134 | eslintTs, 135 | javascript, 136 | typescript, 137 | vitest, 138 | zustand, 139 | tanStackReactQuery, 140 | eslintJs, 141 | jotai, 142 | reactHooks, 143 | redux, 144 | router, 145 | vercelCLI, 146 | netlifyCLI 147 | } 148 | -------------------------------------------------------------------------------- /template/react-js/src/assets/css/base.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --max-width: 1100px; 3 | --border-radius: 12px; 4 | --foreground-rgb: 0, 0, 0; 5 | --background-start-rgb: 214, 219, 220; 6 | --background-end-rgb: 255, 255, 255; 7 | 8 | --primary-glow: conic-gradient( 9 | from 180deg at 50% 50%, 10 | #16abff33 0deg, 11 | #0885ff33 55deg, 12 | #54d6ff33 120deg, 13 | #0071ff33 160deg, 14 | transparent 360deg 15 | ); 16 | --secondary-glow: radial-gradient( 17 | rgba(255, 255, 255, 1), 18 | rgba(255, 255, 255, 0) 19 | ); 20 | 21 | --tile-start-rgb: 239, 245, 249; 22 | --tile-end-rgb: 228, 232, 233; 23 | --tile-border: conic-gradient( 24 | #00000080, 25 | #00000040, 26 | #00000030, 27 | #00000020, 28 | #00000010, 29 | #00000010, 30 | #00000080 31 | ); 32 | 33 | --callout-rgb: 238, 240, 241; 34 | --callout-border-rgb: 172, 175, 176; 35 | --card-rgb: 180, 185, 188; 36 | --card-border-rgb: 131, 134, 135; 37 | } 38 | 39 | @media (prefers-color-scheme: dark) { 40 | :root { 41 | --foreground-rgb: 255, 255, 255; 42 | --background-start-rgb: 0, 0, 0; 43 | --background-end-rgb: 0, 0, 0; 44 | 45 | --primary-glow: radial-gradient(rgba(1, 65, 255, 0.4), rgba(1, 65, 255, 0)); 46 | --secondary-glow: linear-gradient( 47 | to bottom right, 48 | rgba(1, 65, 255, 0), 49 | rgba(1, 65, 255, 0), 50 | rgba(1, 65, 255, 0.3) 51 | ); 52 | 53 | --tile-start-rgb: 2, 13, 46; 54 | --tile-end-rgb: 2, 5, 19; 55 | --tile-border: conic-gradient( 56 | #ffffff80, 57 | #ffffff40, 58 | #ffffff30, 59 | #ffffff20, 60 | #ffffff10, 61 | #ffffff10, 62 | #ffffff80 63 | ); 64 | 65 | --callout-rgb: 20, 20, 20; 66 | --callout-border-rgb: 108, 108, 108; 67 | --card-rgb: 100, 100, 100; 68 | --card-border-rgb: 200, 200, 200; 69 | } 70 | } 71 | 72 | * { 73 | box-sizing: border-box; 74 | padding: 0; 75 | margin: 0; 76 | } 77 | 78 | html, 79 | body { 80 | max-width: 100vw; 81 | overflow-x: hidden; 82 | font-family: sans-serif; 83 | } 84 | 85 | body { 86 | color: rgb(var(--foreground-rgb)); 87 | background: linear-gradient( 88 | to bottom, 89 | transparent, 90 | rgb(var(--background-end-rgb)) 91 | ) 92 | rgb(var(--background-start-rgb)); 93 | } 94 | 95 | a { 96 | color: inherit; 97 | text-decoration: none; 98 | } 99 | 100 | @media (prefers-color-scheme: dark) { 101 | html { 102 | color-scheme: dark; 103 | } 104 | } 105 | .main-container { 106 | display: grid; 107 | height: 100vh; 108 | width: 100vw; 109 | place-items: center; 110 | } 111 | 112 | .main { 113 | flex-direction: column; 114 | align-items: center; 115 | gap: 112px; 116 | } 117 | 118 | .main-title { 119 | font-size: 36px; 120 | line-height: 40px; 121 | font-weight: normal; 122 | text-align: center; 123 | } 124 | .description { 125 | display: inherit; 126 | justify-content: inherit; 127 | align-items: inherit; 128 | font-size: 0.85rem; 129 | max-width: var(--max-width); 130 | width: 100%; 131 | z-index: 2; 132 | } 133 | 134 | .description a { 135 | display: flex; 136 | justify-content: center; 137 | align-items: center; 138 | gap: 0.5rem; 139 | } 140 | 141 | .description p { 142 | position: relative; 143 | margin: 0; 144 | padding: 1rem; 145 | background-color: rgba(var(--callout-rgb), 0.5); 146 | border: 1px solid rgba(var(--callout-border-rgb), 0.3); 147 | border-radius: var(--border-radius); 148 | } 149 | 150 | .grid { 151 | display: grid; 152 | grid-template-columns: repeat(4, minmax(25%, auto)); 153 | max-width: 100%; 154 | width: var(--max-width); 155 | } 156 | 157 | .card { 158 | padding: 1rem 1.2rem; 159 | } 160 | 161 | .card span { 162 | display: inline-block; 163 | transition: transform 200ms; 164 | } 165 | 166 | .card h2 { 167 | font-size: 20px; 168 | margin-bottom: 0.7rem; 169 | font-weight: normal; 170 | } 171 | 172 | .card p { 173 | margin: 0; 174 | opacity: 0.6; 175 | font-size: 0.9rem; 176 | line-height: 1.5; 177 | max-width: 30ch; 178 | text-wrap: balance; 179 | font-weight: normal; 180 | } 181 | 182 | .center { 183 | display: flex; 184 | justify-content: center; 185 | align-items: center; 186 | position: relative; 187 | padding: 4rem 0; 188 | } 189 | 190 | .center::before { 191 | background: var(--secondary-glow); 192 | border-radius: 50%; 193 | width: 480px; 194 | height: 360px; 195 | margin-left: -400px; 196 | } 197 | 198 | .center::after { 199 | background: var(--primary-glow); 200 | width: 240px; 201 | height: 180px; 202 | z-index: -1; 203 | } 204 | 205 | .center::before, 206 | .center::after { 207 | content: ""; 208 | left: 50%; 209 | position: absolute; 210 | filter: blur(45px); 211 | transform: translateZ(0); 212 | } 213 | 214 | .logo { 215 | position: relative; 216 | height: 176px; 217 | width: 176px; 218 | } 219 | 220 | .link { 221 | flex-direction: column; 222 | align-items: center; 223 | gap: 6px; 224 | } 225 | 226 | /* Mobile */ 227 | @media (max-width: 700px) { 228 | .content { 229 | padding: 4rem; 230 | } 231 | 232 | .main-title { 233 | font-size: 30px; 234 | } 235 | 236 | .grid { 237 | grid-template-columns: 1fr; 238 | place-items: center; 239 | margin-bottom: 120px; 240 | width: 100%; 241 | text-align: center; 242 | } 243 | 244 | .card { 245 | padding: 1rem 2.5rem; 246 | } 247 | 248 | .card h2 { 249 | margin-bottom: 0.5rem; 250 | } 251 | 252 | .center { 253 | padding: 8rem 0 6rem; 254 | } 255 | 256 | .center::before { 257 | transform: none; 258 | height: 300px; 259 | } 260 | 261 | .description { 262 | font-size: 0.8rem; 263 | } 264 | 265 | .description a { 266 | padding: 1rem; 267 | } 268 | 269 | .description p, 270 | .description div { 271 | display: flex; 272 | justify-content: center; 273 | position: fixed; 274 | width: 100%; 275 | } 276 | 277 | .description p { 278 | align-items: center; 279 | inset: 0 0 auto; 280 | padding: 2rem 1rem 1.4rem; 281 | border-radius: 0; 282 | border: none; 283 | border-bottom: 1px solid rgba(var(--callout-border-rgb), 0.25); 284 | background: linear-gradient( 285 | to bottom, 286 | rgba(var(--background-start-rgb), 1), 287 | rgba(var(--callout-rgb), 0.5) 288 | ); 289 | background-clip: padding-box; 290 | backdrop-filter: blur(24px); 291 | } 292 | 293 | .description div { 294 | align-items: flex-end; 295 | pointer-events: none; 296 | inset: auto 0 0; 297 | padding: 2rem; 298 | height: 200px; 299 | background: linear-gradient( 300 | to bottom, 301 | transparent 0%, 302 | rgb(var(--background-end-rgb)) 40% 303 | ); 304 | z-index: 1; 305 | } 306 | } 307 | 308 | 309 | @media (min-width: 701px) and (max-width: 768px) { 310 | .grid { 311 | grid-template-columns: repeat(3, 30%); 312 | width: 45rem; 313 | place-content: center; 314 | } 315 | } 316 | 317 | @media (min-width: 780px) and (max-width: 1120px) { 318 | .grid { 319 | grid-template-columns: repeat(3, 33%); 320 | width: 60rem; 321 | place-content: center; 322 | } 323 | } -------------------------------------------------------------------------------- /template/react-ts/src/assets/css/base.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --max-width: 1100px; 3 | --border-radius: 12px; 4 | --foreground-rgb: 0, 0, 0; 5 | --background-start-rgb: 214, 219, 220; 6 | --background-end-rgb: 255, 255, 255; 7 | 8 | --primary-glow: conic-gradient( 9 | from 180deg at 50% 50%, 10 | #16abff33 0deg, 11 | #0885ff33 55deg, 12 | #54d6ff33 120deg, 13 | #0071ff33 160deg, 14 | transparent 360deg 15 | ); 16 | --secondary-glow: radial-gradient( 17 | rgba(255, 255, 255, 1), 18 | rgba(255, 255, 255, 0) 19 | ); 20 | 21 | --tile-start-rgb: 239, 245, 249; 22 | --tile-end-rgb: 228, 232, 233; 23 | --tile-border: conic-gradient( 24 | #00000080, 25 | #00000040, 26 | #00000030, 27 | #00000020, 28 | #00000010, 29 | #00000010, 30 | #00000080 31 | ); 32 | 33 | --callout-rgb: 238, 240, 241; 34 | --callout-border-rgb: 172, 175, 176; 35 | --card-rgb: 180, 185, 188; 36 | --card-border-rgb: 131, 134, 135; 37 | } 38 | 39 | @media (prefers-color-scheme: dark) { 40 | :root { 41 | --foreground-rgb: 255, 255, 255; 42 | --background-start-rgb: 0, 0, 0; 43 | --background-end-rgb: 0, 0, 0; 44 | 45 | --primary-glow: radial-gradient(rgba(1, 65, 255, 0.4), rgba(1, 65, 255, 0)); 46 | --secondary-glow: linear-gradient( 47 | to bottom right, 48 | rgba(1, 65, 255, 0), 49 | rgba(1, 65, 255, 0), 50 | rgba(1, 65, 255, 0.3) 51 | ); 52 | 53 | --tile-start-rgb: 2, 13, 46; 54 | --tile-end-rgb: 2, 5, 19; 55 | --tile-border: conic-gradient( 56 | #ffffff80, 57 | #ffffff40, 58 | #ffffff30, 59 | #ffffff20, 60 | #ffffff10, 61 | #ffffff10, 62 | #ffffff80 63 | ); 64 | 65 | --callout-rgb: 20, 20, 20; 66 | --callout-border-rgb: 108, 108, 108; 67 | --card-rgb: 100, 100, 100; 68 | --card-border-rgb: 200, 200, 200; 69 | } 70 | } 71 | 72 | * { 73 | box-sizing: border-box; 74 | padding: 0; 75 | margin: 0; 76 | } 77 | 78 | html, 79 | body { 80 | max-width: 100vw; 81 | overflow-x: hidden; 82 | font-family: sans-serif; 83 | } 84 | 85 | body { 86 | color: rgb(var(--foreground-rgb)); 87 | background: linear-gradient( 88 | to bottom, 89 | transparent, 90 | rgb(var(--background-end-rgb)) 91 | ) 92 | rgb(var(--background-start-rgb)); 93 | } 94 | 95 | a { 96 | color: inherit; 97 | text-decoration: none; 98 | } 99 | 100 | @media (prefers-color-scheme: dark) { 101 | html { 102 | color-scheme: dark; 103 | } 104 | } 105 | .main-container { 106 | display: grid; 107 | height: 100vh; 108 | width: 100vw; 109 | place-items: center; 110 | } 111 | 112 | .main { 113 | flex-direction: column; 114 | align-items: center; 115 | gap: 112px; 116 | } 117 | 118 | .main-title { 119 | font-size: 36px; 120 | line-height: 40px; 121 | font-weight: normal; 122 | text-align: center; 123 | } 124 | .description { 125 | display: inherit; 126 | justify-content: inherit; 127 | align-items: inherit; 128 | font-size: 0.85rem; 129 | max-width: var(--max-width); 130 | width: 100%; 131 | z-index: 2; 132 | } 133 | 134 | .description a { 135 | display: flex; 136 | justify-content: center; 137 | align-items: center; 138 | gap: 0.5rem; 139 | } 140 | 141 | .description p { 142 | position: relative; 143 | margin: 0; 144 | padding: 1rem; 145 | background-color: rgba(var(--callout-rgb), 0.5); 146 | border: 1px solid rgba(var(--callout-border-rgb), 0.3); 147 | border-radius: var(--border-radius); 148 | } 149 | 150 | .grid { 151 | display: grid; 152 | grid-template-columns: repeat(4, minmax(25%, auto)); 153 | max-width: 100%; 154 | width: var(--max-width); 155 | } 156 | 157 | .card { 158 | padding: 1rem 1.2rem; 159 | } 160 | 161 | .card span { 162 | display: inline-block; 163 | transition: transform 200ms; 164 | } 165 | 166 | .card h2 { 167 | font-size: 20px; 168 | margin-bottom: 0.7rem; 169 | font-weight: normal; 170 | } 171 | 172 | .card p { 173 | margin: 0; 174 | opacity: 0.6; 175 | font-size: 0.9rem; 176 | line-height: 1.5; 177 | max-width: 30ch; 178 | text-wrap: balance; 179 | font-weight: normal; 180 | } 181 | 182 | .center { 183 | display: flex; 184 | justify-content: center; 185 | align-items: center; 186 | position: relative; 187 | padding: 4rem 0; 188 | } 189 | 190 | .center::before { 191 | background: var(--secondary-glow); 192 | border-radius: 50%; 193 | width: 480px; 194 | height: 360px; 195 | margin-left: -400px; 196 | } 197 | 198 | .center::after { 199 | background: var(--primary-glow); 200 | width: 240px; 201 | height: 180px; 202 | z-index: -1; 203 | } 204 | 205 | .center::before, 206 | .center::after { 207 | content: ""; 208 | left: 50%; 209 | position: absolute; 210 | filter: blur(45px); 211 | transform: translateZ(0); 212 | } 213 | 214 | .logo { 215 | position: relative; 216 | height: 176px; 217 | width: 176px; 218 | } 219 | 220 | .link { 221 | flex-direction: column; 222 | align-items: center; 223 | gap: 6px; 224 | } 225 | 226 | /* Mobile */ 227 | @media (max-width: 700px) { 228 | .content { 229 | padding: 4rem; 230 | } 231 | 232 | .main-title { 233 | font-size: 30px; 234 | } 235 | 236 | .grid { 237 | grid-template-columns: 1fr; 238 | place-items: center; 239 | margin-bottom: 120px; 240 | width: 100%; 241 | text-align: center; 242 | } 243 | 244 | .card { 245 | padding: 1rem 2.5rem; 246 | } 247 | 248 | .card h2 { 249 | margin-bottom: 0.5rem; 250 | } 251 | 252 | .center { 253 | padding: 8rem 0 6rem; 254 | } 255 | 256 | .center::before { 257 | transform: none; 258 | height: 300px; 259 | } 260 | 261 | .description { 262 | font-size: 0.8rem; 263 | } 264 | 265 | .description a { 266 | padding: 1rem; 267 | } 268 | 269 | .description p, 270 | .description div { 271 | display: flex; 272 | justify-content: center; 273 | position: fixed; 274 | width: 100%; 275 | } 276 | 277 | .description p { 278 | align-items: center; 279 | inset: 0 0 auto; 280 | padding: 2rem 1rem 1.4rem; 281 | border-radius: 0; 282 | border: none; 283 | border-bottom: 1px solid rgba(var(--callout-border-rgb), 0.25); 284 | background: linear-gradient( 285 | to bottom, 286 | rgba(var(--background-start-rgb), 1), 287 | rgba(var(--callout-rgb), 0.5) 288 | ); 289 | background-clip: padding-box; 290 | backdrop-filter: blur(24px); 291 | } 292 | 293 | .description div { 294 | align-items: flex-end; 295 | pointer-events: none; 296 | inset: auto 0 0; 297 | padding: 2rem; 298 | height: 200px; 299 | background: linear-gradient( 300 | to bottom, 301 | transparent 0%, 302 | rgb(var(--background-end-rgb)) 40% 303 | ); 304 | z-index: 1; 305 | } 306 | } 307 | 308 | 309 | @media (min-width: 701px) and (max-width: 768px) { 310 | .grid { 311 | grid-template-columns: repeat(3, 30%); 312 | width: 45rem; 313 | place-content: center; 314 | } 315 | } 316 | 317 | @media (min-width: 780px) and (max-width: 1120px) { 318 | .grid { 319 | grid-template-columns: repeat(3, 33%); 320 | width: 60rem; 321 | place-content: center; 322 | } 323 | } -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## v1.0.3 4 | 5 | [compare changes](https://github.com/selemondev/create-react-next/compare/v1.0.2...v1.0.3) 6 | 7 | ### 🩹 Fixes 8 | 9 | - Import names from fs-extra ([04f92c4](https://github.com/selemondev/create-react-next/commit/04f92c4)) 10 | 11 | ### 📖 Documentation 12 | 13 | - Update ([c17c322](https://github.com/selemondev/create-react-next/commit/c17c322)) 14 | 15 | ### ❤️ Contributors 16 | 17 | - Selemondev 18 | 19 | ## v1.0.2 20 | 21 | [compare changes](https://github.com/selemondev/create-react-next/compare/v1.0.1...v1.0.2) 22 | 23 | ### 🔥 Performance 24 | 25 | - Reduce bundle size ([0345d32](https://github.com/selemondev/create-react-next/commit/0345d32)) 26 | 27 | ### 📖 Documentation 28 | 29 | - Update CHANGELOG.md file ([ca53b28](https://github.com/selemondev/create-react-next/commit/ca53b28)) 30 | - Update ([9751d8c](https://github.com/selemondev/create-react-next/commit/9751d8c)) 31 | 32 | ### 🏡 Chore 33 | 34 | - Release v1.0.1 ([760aaed](https://github.com/selemondev/create-react-next/commit/760aaed)) 35 | - Release v1.0.1 ([8b9aac0](https://github.com/selemondev/create-react-next/commit/8b9aac0)) 36 | - **release:** V1.0.2 ([486f155](https://github.com/selemondev/create-react-next/commit/486f155)) 37 | - **release:** V1.0.2 ([847fb1a](https://github.com/selemondev/create-react-next/commit/847fb1a)) 38 | - Changed package name ([b2310d1](https://github.com/selemondev/create-react-next/commit/b2310d1)) 39 | - **release:** V1.0.2 ([91698f3](https://github.com/selemondev/create-react-next/commit/91698f3)) 40 | - **release:** V1.0.3 ([26c9cb5](https://github.com/selemondev/create-react-next/commit/26c9cb5)) 41 | 42 | ### ❤️ Contributors 43 | 44 | - Selemondev 45 | 46 | ## v1.0.3 47 | 48 | [compare changes](https://github.com/selemondev/create-react-next/compare/v1.0.1...v1.0.3) 49 | 50 | ### 🔥 Performance 51 | 52 | - Reduce bundle size ([0345d32](https://github.com/selemondev/create-react-next/commit/0345d32)) 53 | 54 | ### 📖 Documentation 55 | 56 | - Update CHANGELOG.md file ([ca53b28](https://github.com/selemondev/create-react-next/commit/ca53b28)) 57 | - Update ([9751d8c](https://github.com/selemondev/create-react-next/commit/9751d8c)) 58 | 59 | ### 🏡 Chore 60 | 61 | - Release v1.0.1 ([760aaed](https://github.com/selemondev/create-react-next/commit/760aaed)) 62 | - Release v1.0.1 ([8b9aac0](https://github.com/selemondev/create-react-next/commit/8b9aac0)) 63 | - **release:** V1.0.2 ([486f155](https://github.com/selemondev/create-react-next/commit/486f155)) 64 | - **release:** V1.0.2 ([847fb1a](https://github.com/selemondev/create-react-next/commit/847fb1a)) 65 | - Changed package name ([b2310d1](https://github.com/selemondev/create-react-next/commit/b2310d1)) 66 | - **release:** V1.0.2 ([91698f3](https://github.com/selemondev/create-react-next/commit/91698f3)) 67 | 68 | ### ❤️ Contributors 69 | 70 | - Selemondev 71 | 72 | ## v1.0.2 73 | 74 | [compare changes](https://github.com/selemondev/create-react-next/compare/v1.0.2...v1.0.2) 75 | 76 | ### 📖 Documentation 77 | 78 | - Update ([9751d8c](https://github.com/selemondev/create-react-next/commit/9751d8c)) 79 | 80 | ### 🏡 Chore 81 | 82 | - Changed package name ([b2310d1](https://github.com/selemondev/create-react-next/commit/b2310d1)) 83 | 84 | ### ❤️ Contributors 85 | 86 | - Selemondev 87 | 88 | ## v1.0.1 89 | 90 | [compare changes](https://github.com/selemondev/create-react-next/compare/v1.0.0...v1.0.1) 91 | 92 | ### 🔥 Performance 93 | 94 | - Reduce bundle size ( ~78.4% performance improvement 95 | in terms of bundle size reduction ) ([5cb6bbe](https://github.com/selemondev/create-react-next/commit/5cb6bbe)) 96 | 97 | ### 🏡 Chore 98 | 99 | - Release v1.0.1 ([8b9aac0](https://github.com/selemondev/create-react-next/commit/8b9aac0)) 100 | 101 | ### ❤️ Contributors 102 | 103 | - [Selemondev](https://github.com/selemondev) 104 | 105 | ## v1.0.0 106 | 107 | 108 | ### 🚀 Enhancements 109 | 110 | - Add util functions and templates ([7160991](https://github.com/selemondev/create-react-next/commit/7160991)) 111 | - Add dependencies ([8ecf91d](https://github.com/selemondev/create-react-next/commit/8ecf91d)) 112 | - Add core ([94112cf](https://github.com/selemondev/create-react-next/commit/94112cf)) 113 | - Add file filter ([12a82fb](https://github.com/selemondev/create-react-next/commit/12a82fb)) 114 | - Add files ([6bd149e](https://github.com/selemondev/create-react-next/commit/6bd149e)) 115 | - Filter files ([d800c5c](https://github.com/selemondev/create-react-next/commit/d800c5c)) 116 | - State management ([530c411](https://github.com/selemondev/create-react-next/commit/530c411)) 117 | - Add Vitest ([2e8e650](https://github.com/selemondev/create-react-next/commit/2e8e650)) 118 | - React-js template ([2618f29](https://github.com/selemondev/create-react-next/commit/2618f29)) 119 | - Tailwind starter ([4055ea0](https://github.com/selemondev/create-react-next/commit/4055ea0)) 120 | 121 | ### 🩹 Fixes 122 | 123 | - Github workflows ([f17651f](https://github.com/selemondev/create-react-next/commit/f17651f)) 124 | - Github actions ([ea3e602](https://github.com/selemondev/create-react-next/commit/ea3e602)) 125 | - Github actions ([95bdab3](https://github.com/selemondev/create-react-next/commit/95bdab3)) 126 | - UseHooks ([0d28b6e](https://github.com/selemondev/create-react-next/commit/0d28b6e)) 127 | - Tsconfig ([a540f14](https://github.com/selemondev/create-react-next/commit/a540f14)) 128 | - Templates ([952d0e5](https://github.com/selemondev/create-react-next/commit/952d0e5)) 129 | - Templates ([d2eb1f4](https://github.com/selemondev/create-react-next/commit/d2eb1f4)) 130 | - Starter templates ([627a8fd](https://github.com/selemondev/create-react-next/commit/627a8fd)) 131 | - Unit tests ([be49da9](https://github.com/selemondev/create-react-next/commit/be49da9)) 132 | - Logs ([8c7e25e](https://github.com/selemondev/create-react-next/commit/8c7e25e)) 133 | - CLI arg ([3b228b2](https://github.com/selemondev/create-react-next/commit/3b228b2)) 134 | - Files ([00c13c1](https://github.com/selemondev/create-react-next/commit/00c13c1)) 135 | - Path ([78f9ce4](https://github.com/selemondev/create-react-next/commit/78f9ce4)) 136 | - Path ([b1da89e](https://github.com/selemondev/create-react-next/commit/b1da89e)) 137 | 138 | ### 💅 Refactors 139 | 140 | - State management prompt ([9ec700a](https://github.com/selemondev/create-react-next/commit/9ec700a)) 141 | - Router ([249e76d](https://github.com/selemondev/create-react-next/commit/249e76d)) 142 | - Logs ([728f2c3](https://github.com/selemondev/create-react-next/commit/728f2c3)) 143 | - Logs ([3de2709](https://github.com/selemondev/create-react-next/commit/3de2709)) 144 | - CLI arguments ([119a8ff](https://github.com/selemondev/create-react-next/commit/119a8ff)) 145 | - CLI arg ([e19eb2a](https://github.com/selemondev/create-react-next/commit/e19eb2a)) 146 | - Prompts ([75385a1](https://github.com/selemondev/create-react-next/commit/75385a1)) 147 | 148 | ### 📖 Documentation 149 | 150 | - Update README.md ([8f70b04](https://github.com/selemondev/create-react-next/commit/8f70b04)) 151 | - Update README.md ([4cf9047](https://github.com/selemondev/create-react-next/commit/4cf9047)) 152 | - Update README.md ([0d51351](https://github.com/selemondev/create-react-next/commit/0d51351)) 153 | - Update ([0960457](https://github.com/selemondev/create-react-next/commit/0960457)) 154 | - Update ([9fa37de](https://github.com/selemondev/create-react-next/commit/9fa37de)) 155 | - Update docs ([1d3b0b3](https://github.com/selemondev/create-react-next/commit/1d3b0b3)) 156 | 157 | ### 🏡 Chore 158 | 159 | - Update files ([8fd28a1](https://github.com/selemondev/create-react-next/commit/8fd28a1)) 160 | - Remove unbuild ([aa68541](https://github.com/selemondev/create-react-next/commit/aa68541)) 161 | - . ([f8b306f](https://github.com/selemondev/create-react-next/commit/f8b306f)) 162 | - . ([1f34876](https://github.com/selemondev/create-react-next/commit/1f34876)) 163 | - Ignore lock files ([efb7a03](https://github.com/selemondev/create-react-next/commit/efb7a03)) 164 | - Update ([5ebbf8c](https://github.com/selemondev/create-react-next/commit/5ebbf8c)) 165 | - Update .gitignore ([8bd8f11](https://github.com/selemondev/create-react-next/commit/8bd8f11)) 166 | 167 | ### ❤️ Contributors 168 | 169 | - [Selemondev](http://github.com/selemondev) 170 | 171 | -------------------------------------------------------------------------------- /template/react-js/src/components/TheWelcome.ejs: -------------------------------------------------------------------------------- 1 | <% if (stateManagement === 'jotai' ) { -%> 2 | import { useAtom } from 'jotai' 3 | import { atomWithImmer } from 'jotai-immer' 4 | <% } -%> 5 | 6 | <% if (!useTailwind) { -%> 7 | import "../assets/css/base.css"; 8 | <% } -%> 9 | 10 | <% if (stateManagement === 'jotai' ) { -%> 11 | const countAtom = atomWithImmer(0) 12 | <% } -%> 13 | 14 | const TheWelcome = () => { 15 | <% if (stateManagement === 'jotai' ) { -%> 16 | const [count] = useAtom(countAtom); 17 | const [, setCount] = useAtom(countAtom) 18 | const increment = () => setCount((c) => (c = c + 1)) 19 | <% } -%> 20 | return ( 21 | 22 | <> 23 | <% if (useTailwind) { -%> 24 |
25 |
26 |
27 |

Welcome To Create React Next

28 |
29 | 30 |
31 | React Logo 32 |
33 | 34 |
35 | 43 | 51 | 52 | 60 | 68 | 77 | 86 | 95 | 103 |
104 |
105 |
106 | <% } -%> 107 | <% if (!useTailwind) { -%> 108 |
109 |
110 |
111 |

Welcome To Create React Next

112 |
113 | 114 |
115 | React Logo 116 |
117 | 118 |
119 | 125 | 133 | 134 | 140 | 141 | 149 | 150 | 159 | 160 | 169 | 170 | 179 | 180 | 186 |
187 |
188 |
189 | <% } -%> 190 | 191 | ) 192 | } 193 | 194 | export default TheWelcome; -------------------------------------------------------------------------------- /template/react-ts/src/components/TheWelcome.ejs: -------------------------------------------------------------------------------- 1 | <% if (stateManagement === 'jotai' ) { -%> 2 | import { useAtom } from 'jotai' 3 | import { atomWithImmer } from 'jotai-immer' 4 | <% } -%> 5 | 6 | <% if (!useTailwind) { -%> 7 | import "../assets/css/base.css"; 8 | <% } -%> 9 | 10 | <% if (stateManagement === 'jotai' ) { -%> 11 | const countAtom = atomWithImmer(0) 12 | <% } -%> 13 | 14 | const TheWelcome = () => { 15 | <% if (stateManagement === 'jotai' ) { -%> 16 | const [count] = useAtom(countAtom); 17 | const [, setCount] = useAtom(countAtom) 18 | const increment = () => setCount((c) => (c = c + 1)) 19 | <% } -%> 20 | return ( 21 | 22 | <> 23 | <% if (useTailwind) { -%> 24 |
25 |
26 |
27 |

Welcome To Create React Next

28 |
29 | 30 |
31 | React Logo 36 |
37 | 38 |
39 | 52 | 65 | 66 | 79 | 80 | 94 | 108 | 122 | 136 | 149 |
150 |
151 |
152 | <% } -%> 153 | <% if (!useTailwind) { -%> 154 |
155 |
156 |
157 |

Welcome To Create React Next

158 |
159 | 160 |
161 | React Logo 166 |
167 | 168 |
169 | 180 | 193 | 194 | 205 | 206 | 220 | 221 | 235 | 236 | 250 | 251 | 265 | 266 | 277 |
278 |
279 |
280 | <% } -%> 281 | 282 | ) 283 | } 284 | 285 | export default TheWelcome; -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | commander: 12 | specifier: ^12.0.0 13 | version: 12.1.0 14 | ejs: 15 | specifier: ^3.1.9 16 | version: 3.1.10 17 | fs-extra: 18 | specifier: ^11.2.0 19 | version: 11.3.2 20 | ora: 21 | specifier: ^8.0.1 22 | version: 8.2.0 23 | prettier: 24 | specifier: ^3.5.3 25 | version: 3.6.2 26 | prompts: 27 | specifier: ^2.4.2 28 | version: 2.4.2 29 | validate-npm-package-name: 30 | specifier: ^5.0.0 31 | version: 5.0.1 32 | devDependencies: 33 | '@types/ejs': 34 | specifier: ^3.1.5 35 | version: 3.1.5 36 | '@types/fs-extra': 37 | specifier: ^11.0.4 38 | version: 11.0.4 39 | '@types/node': 40 | specifier: ^20.11.30 41 | version: 20.19.24 42 | '@types/prompts': 43 | specifier: ^2.4.9 44 | version: 2.4.9 45 | '@types/validate-npm-package-name': 46 | specifier: ^4.0.2 47 | version: 4.0.2 48 | conf: 49 | specifier: ^12.0.0 50 | version: 12.0.0 51 | esno: 52 | specifier: ^4.0.0 53 | version: 4.8.0 54 | tsup: 55 | specifier: ^8.0.2 56 | version: 8.5.0(tsx@4.20.6)(typescript@5.9.3) 57 | typescript: 58 | specifier: ^5.3.3 59 | version: 5.9.3 60 | 61 | packages: 62 | 63 | '@esbuild/aix-ppc64@0.25.12': 64 | resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} 65 | engines: {node: '>=18'} 66 | cpu: [ppc64] 67 | os: [aix] 68 | 69 | '@esbuild/android-arm64@0.25.12': 70 | resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} 71 | engines: {node: '>=18'} 72 | cpu: [arm64] 73 | os: [android] 74 | 75 | '@esbuild/android-arm@0.25.12': 76 | resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} 77 | engines: {node: '>=18'} 78 | cpu: [arm] 79 | os: [android] 80 | 81 | '@esbuild/android-x64@0.25.12': 82 | resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} 83 | engines: {node: '>=18'} 84 | cpu: [x64] 85 | os: [android] 86 | 87 | '@esbuild/darwin-arm64@0.25.12': 88 | resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} 89 | engines: {node: '>=18'} 90 | cpu: [arm64] 91 | os: [darwin] 92 | 93 | '@esbuild/darwin-x64@0.25.12': 94 | resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} 95 | engines: {node: '>=18'} 96 | cpu: [x64] 97 | os: [darwin] 98 | 99 | '@esbuild/freebsd-arm64@0.25.12': 100 | resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} 101 | engines: {node: '>=18'} 102 | cpu: [arm64] 103 | os: [freebsd] 104 | 105 | '@esbuild/freebsd-x64@0.25.12': 106 | resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} 107 | engines: {node: '>=18'} 108 | cpu: [x64] 109 | os: [freebsd] 110 | 111 | '@esbuild/linux-arm64@0.25.12': 112 | resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} 113 | engines: {node: '>=18'} 114 | cpu: [arm64] 115 | os: [linux] 116 | 117 | '@esbuild/linux-arm@0.25.12': 118 | resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} 119 | engines: {node: '>=18'} 120 | cpu: [arm] 121 | os: [linux] 122 | 123 | '@esbuild/linux-ia32@0.25.12': 124 | resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} 125 | engines: {node: '>=18'} 126 | cpu: [ia32] 127 | os: [linux] 128 | 129 | '@esbuild/linux-loong64@0.25.12': 130 | resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} 131 | engines: {node: '>=18'} 132 | cpu: [loong64] 133 | os: [linux] 134 | 135 | '@esbuild/linux-mips64el@0.25.12': 136 | resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} 137 | engines: {node: '>=18'} 138 | cpu: [mips64el] 139 | os: [linux] 140 | 141 | '@esbuild/linux-ppc64@0.25.12': 142 | resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} 143 | engines: {node: '>=18'} 144 | cpu: [ppc64] 145 | os: [linux] 146 | 147 | '@esbuild/linux-riscv64@0.25.12': 148 | resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} 149 | engines: {node: '>=18'} 150 | cpu: [riscv64] 151 | os: [linux] 152 | 153 | '@esbuild/linux-s390x@0.25.12': 154 | resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} 155 | engines: {node: '>=18'} 156 | cpu: [s390x] 157 | os: [linux] 158 | 159 | '@esbuild/linux-x64@0.25.12': 160 | resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} 161 | engines: {node: '>=18'} 162 | cpu: [x64] 163 | os: [linux] 164 | 165 | '@esbuild/netbsd-arm64@0.25.12': 166 | resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} 167 | engines: {node: '>=18'} 168 | cpu: [arm64] 169 | os: [netbsd] 170 | 171 | '@esbuild/netbsd-x64@0.25.12': 172 | resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} 173 | engines: {node: '>=18'} 174 | cpu: [x64] 175 | os: [netbsd] 176 | 177 | '@esbuild/openbsd-arm64@0.25.12': 178 | resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} 179 | engines: {node: '>=18'} 180 | cpu: [arm64] 181 | os: [openbsd] 182 | 183 | '@esbuild/openbsd-x64@0.25.12': 184 | resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} 185 | engines: {node: '>=18'} 186 | cpu: [x64] 187 | os: [openbsd] 188 | 189 | '@esbuild/openharmony-arm64@0.25.12': 190 | resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} 191 | engines: {node: '>=18'} 192 | cpu: [arm64] 193 | os: [openharmony] 194 | 195 | '@esbuild/sunos-x64@0.25.12': 196 | resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} 197 | engines: {node: '>=18'} 198 | cpu: [x64] 199 | os: [sunos] 200 | 201 | '@esbuild/win32-arm64@0.25.12': 202 | resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} 203 | engines: {node: '>=18'} 204 | cpu: [arm64] 205 | os: [win32] 206 | 207 | '@esbuild/win32-ia32@0.25.12': 208 | resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} 209 | engines: {node: '>=18'} 210 | cpu: [ia32] 211 | os: [win32] 212 | 213 | '@esbuild/win32-x64@0.25.12': 214 | resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} 215 | engines: {node: '>=18'} 216 | cpu: [x64] 217 | os: [win32] 218 | 219 | '@isaacs/cliui@8.0.2': 220 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 221 | engines: {node: '>=12'} 222 | 223 | '@jridgewell/gen-mapping@0.3.13': 224 | resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} 225 | 226 | '@jridgewell/resolve-uri@3.1.2': 227 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 228 | engines: {node: '>=6.0.0'} 229 | 230 | '@jridgewell/sourcemap-codec@1.5.5': 231 | resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 232 | 233 | '@jridgewell/trace-mapping@0.3.31': 234 | resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} 235 | 236 | '@pkgjs/parseargs@0.11.0': 237 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 238 | engines: {node: '>=14'} 239 | 240 | '@rollup/rollup-android-arm-eabi@4.53.1': 241 | resolution: {integrity: sha512-bxZtughE4VNVJlL1RdoSE545kc4JxL7op57KKoi59/gwuU5rV6jLWFXXc8jwgFoT6vtj+ZjO+Z2C5nrY0Cl6wA==} 242 | cpu: [arm] 243 | os: [android] 244 | 245 | '@rollup/rollup-android-arm64@4.53.1': 246 | resolution: {integrity: sha512-44a1hreb02cAAfAKmZfXVercPFaDjqXCK+iKeVOlJ9ltvnO6QqsBHgKVPTu+MJHSLLeMEUbeG2qiDYgbFPU48g==} 247 | cpu: [arm64] 248 | os: [android] 249 | 250 | '@rollup/rollup-darwin-arm64@4.53.1': 251 | resolution: {integrity: sha512-usmzIgD0rf1syoOZ2WZvy8YpXK5G1V3btm3QZddoGSa6mOgfXWkkv+642bfUUldomgrbiLQGrPryb7DXLovPWQ==} 252 | cpu: [arm64] 253 | os: [darwin] 254 | 255 | '@rollup/rollup-darwin-x64@4.53.1': 256 | resolution: {integrity: sha512-is3r/k4vig2Gt8mKtTlzzyaSQ+hd87kDxiN3uDSDwggJLUV56Umli6OoL+/YZa/KvtdrdyNfMKHzL/P4siOOmg==} 257 | cpu: [x64] 258 | os: [darwin] 259 | 260 | '@rollup/rollup-freebsd-arm64@4.53.1': 261 | resolution: {integrity: sha512-QJ1ksgp/bDJkZB4daldVmHaEQkG4r8PUXitCOC2WRmRaSaHx5RwPoI3DHVfXKwDkB+Sk6auFI/+JHacTekPRSw==} 262 | cpu: [arm64] 263 | os: [freebsd] 264 | 265 | '@rollup/rollup-freebsd-x64@4.53.1': 266 | resolution: {integrity: sha512-J6ma5xgAzvqsnU6a0+jgGX/gvoGokqpkx6zY4cWizRrm0ffhHDpJKQgC8dtDb3+MqfZDIqs64REbfHDMzxLMqQ==} 267 | cpu: [x64] 268 | os: [freebsd] 269 | 270 | '@rollup/rollup-linux-arm-gnueabihf@4.53.1': 271 | resolution: {integrity: sha512-JzWRR41o2U3/KMNKRuZNsDUAcAVUYhsPuMlx5RUldw0E4lvSIXFUwejtYz1HJXohUmqs/M6BBJAUBzKXZVddbg==} 272 | cpu: [arm] 273 | os: [linux] 274 | 275 | '@rollup/rollup-linux-arm-musleabihf@4.53.1': 276 | resolution: {integrity: sha512-L8kRIrnfMrEoHLHtHn+4uYA52fiLDEDyezgxZtGUTiII/yb04Krq+vk3P2Try+Vya9LeCE9ZHU8CXD6J9EhzHQ==} 277 | cpu: [arm] 278 | os: [linux] 279 | 280 | '@rollup/rollup-linux-arm64-gnu@4.53.1': 281 | resolution: {integrity: sha512-ysAc0MFRV+WtQ8li8hi3EoFi7us6d1UzaS/+Dp7FYZfg3NdDljGMoVyiIp6Ucz7uhlYDBZ/zt6XI0YEZbUO11Q==} 282 | cpu: [arm64] 283 | os: [linux] 284 | 285 | '@rollup/rollup-linux-arm64-musl@4.53.1': 286 | resolution: {integrity: sha512-UV6l9MJpDbDZZ/fJvqNcvO1PcivGEf1AvKuTcHoLjVZVFeAMygnamCTDikCVMRnA+qJe+B3pSbgX2+lBMqgBhA==} 287 | cpu: [arm64] 288 | os: [linux] 289 | 290 | '@rollup/rollup-linux-loong64-gnu@4.53.1': 291 | resolution: {integrity: sha512-UDUtelEprkA85g95Q+nj3Xf0M4hHa4DiJ+3P3h4BuGliY4NReYYqwlc0Y8ICLjN4+uIgCEvaygYlpf0hUj90Yg==} 292 | cpu: [loong64] 293 | os: [linux] 294 | 295 | '@rollup/rollup-linux-ppc64-gnu@4.53.1': 296 | resolution: {integrity: sha512-vrRn+BYhEtNOte/zbc2wAUQReJXxEx2URfTol6OEfY2zFEUK92pkFBSXRylDM7aHi+YqEPJt9/ABYzmcrS4SgQ==} 297 | cpu: [ppc64] 298 | os: [linux] 299 | 300 | '@rollup/rollup-linux-riscv64-gnu@4.53.1': 301 | resolution: {integrity: sha512-gto/1CxHyi4A7YqZZNznQYrVlPSaodOBPKM+6xcDSCMVZN/Fzb4K+AIkNz/1yAYz9h3Ng+e2fY9H6bgawVq17w==} 302 | cpu: [riscv64] 303 | os: [linux] 304 | 305 | '@rollup/rollup-linux-riscv64-musl@4.53.1': 306 | resolution: {integrity: sha512-KZ6Vx7jAw3aLNjFR8eYVcQVdFa/cvBzDNRFM3z7XhNNunWjA03eUrEwJYPk0G8V7Gs08IThFKcAPS4WY/ybIrQ==} 307 | cpu: [riscv64] 308 | os: [linux] 309 | 310 | '@rollup/rollup-linux-s390x-gnu@4.53.1': 311 | resolution: {integrity: sha512-HvEixy2s/rWNgpwyKpXJcHmE7om1M89hxBTBi9Fs6zVuLU4gOrEMQNbNsN/tBVIMbLyysz/iwNiGtMOpLAOlvA==} 312 | cpu: [s390x] 313 | os: [linux] 314 | 315 | '@rollup/rollup-linux-x64-gnu@4.53.1': 316 | resolution: {integrity: sha512-E/n8x2MSjAQgjj9IixO4UeEUeqXLtiA7pyoXCFYLuXpBA/t2hnbIdxHfA7kK9BFsYAoNU4st1rHYdldl8dTqGA==} 317 | cpu: [x64] 318 | os: [linux] 319 | 320 | '@rollup/rollup-linux-x64-musl@4.53.1': 321 | resolution: {integrity: sha512-IhJ087PbLOQXCN6Ui/3FUkI9pWNZe/Z7rEIVOzMsOs1/HSAECCvSZ7PkIbkNqL/AZn6WbZvnoVZw/qwqYMo4/w==} 322 | cpu: [x64] 323 | os: [linux] 324 | 325 | '@rollup/rollup-openharmony-arm64@4.53.1': 326 | resolution: {integrity: sha512-0++oPNgLJHBblreu0SFM7b3mAsBJBTY0Ksrmu9N6ZVrPiTkRgda52mWR7TKhHAsUb9noCjFvAw9l6ZO1yzaVbA==} 327 | cpu: [arm64] 328 | os: [openharmony] 329 | 330 | '@rollup/rollup-win32-arm64-msvc@4.53.1': 331 | resolution: {integrity: sha512-VJXivz61c5uVdbmitLkDlbcTk9Or43YC2QVLRkqp86QoeFSqI81bNgjhttqhKNMKnQMWnecOCm7lZz4s+WLGpQ==} 332 | cpu: [arm64] 333 | os: [win32] 334 | 335 | '@rollup/rollup-win32-ia32-msvc@4.53.1': 336 | resolution: {integrity: sha512-NmZPVTUOitCXUH6erJDzTQ/jotYw4CnkMDjCYRxNHVD9bNyfrGoIse684F9okwzKCV4AIHRbUkeTBc9F2OOH5Q==} 337 | cpu: [ia32] 338 | os: [win32] 339 | 340 | '@rollup/rollup-win32-x64-gnu@4.53.1': 341 | resolution: {integrity: sha512-2SNj7COIdAf6yliSpLdLG8BEsp5lgzRehgfkP0Av8zKfQFKku6JcvbobvHASPJu4f3BFxej5g+HuQPvqPhHvpQ==} 342 | cpu: [x64] 343 | os: [win32] 344 | 345 | '@rollup/rollup-win32-x64-msvc@4.53.1': 346 | resolution: {integrity: sha512-rLarc1Ofcs3DHtgSzFO31pZsCh8g05R2azN1q3fF+H423Co87My0R+tazOEvYVKXSLh8C4LerMK41/K7wlklcg==} 347 | cpu: [x64] 348 | os: [win32] 349 | 350 | '@types/ejs@3.1.5': 351 | resolution: {integrity: sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==} 352 | 353 | '@types/estree@1.0.8': 354 | resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 355 | 356 | '@types/fs-extra@11.0.4': 357 | resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} 358 | 359 | '@types/jsonfile@6.1.4': 360 | resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} 361 | 362 | '@types/node@20.19.24': 363 | resolution: {integrity: sha512-FE5u0ezmi6y9OZEzlJfg37mqqf6ZDSF2V/NLjUyGrR9uTZ7Sb9F7bLNZ03S4XVUNRWGA7Ck4c1kK+YnuWjl+DA==} 364 | 365 | '@types/prompts@2.4.9': 366 | resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} 367 | 368 | '@types/validate-npm-package-name@4.0.2': 369 | resolution: {integrity: sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==} 370 | 371 | acorn@8.15.0: 372 | resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} 373 | engines: {node: '>=0.4.0'} 374 | hasBin: true 375 | 376 | ajv-formats@2.1.1: 377 | resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} 378 | peerDependencies: 379 | ajv: ^8.0.0 380 | peerDependenciesMeta: 381 | ajv: 382 | optional: true 383 | 384 | ajv@8.17.1: 385 | resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} 386 | 387 | ansi-regex@5.0.1: 388 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 389 | engines: {node: '>=8'} 390 | 391 | ansi-regex@6.2.2: 392 | resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} 393 | engines: {node: '>=12'} 394 | 395 | ansi-styles@4.3.0: 396 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 397 | engines: {node: '>=8'} 398 | 399 | ansi-styles@6.2.3: 400 | resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} 401 | engines: {node: '>=12'} 402 | 403 | any-promise@1.3.0: 404 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 405 | 406 | async@3.2.6: 407 | resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} 408 | 409 | atomically@2.1.0: 410 | resolution: {integrity: sha512-+gDffFXRW6sl/HCwbta7zK4uNqbPjv4YJEAdz7Vu+FLQHe77eZ4bvbJGi4hE0QPeJlMYMA3piXEr1UL3dAwx7Q==} 411 | 412 | balanced-match@1.0.2: 413 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 414 | 415 | brace-expansion@2.0.2: 416 | resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} 417 | 418 | bundle-require@5.1.0: 419 | resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} 420 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 421 | peerDependencies: 422 | esbuild: '>=0.18' 423 | 424 | cac@6.7.14: 425 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 426 | engines: {node: '>=8'} 427 | 428 | chalk@5.6.2: 429 | resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} 430 | engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} 431 | 432 | chokidar@4.0.3: 433 | resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} 434 | engines: {node: '>= 14.16.0'} 435 | 436 | cli-cursor@5.0.0: 437 | resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} 438 | engines: {node: '>=18'} 439 | 440 | cli-spinners@2.9.2: 441 | resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} 442 | engines: {node: '>=6'} 443 | 444 | color-convert@2.0.1: 445 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 446 | engines: {node: '>=7.0.0'} 447 | 448 | color-name@1.1.4: 449 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 450 | 451 | commander@12.1.0: 452 | resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} 453 | engines: {node: '>=18'} 454 | 455 | commander@4.1.1: 456 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 457 | engines: {node: '>= 6'} 458 | 459 | conf@12.0.0: 460 | resolution: {integrity: sha512-fIWyWUXrJ45cHCIQX+Ck1hrZDIf/9DR0P0Zewn3uNht28hbt5OfGUq8rRWsxi96pZWPyBEd0eY9ama01JTaknA==} 461 | engines: {node: '>=18'} 462 | 463 | confbox@0.1.8: 464 | resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} 465 | 466 | consola@3.4.2: 467 | resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} 468 | engines: {node: ^14.18.0 || >=16.10.0} 469 | 470 | cross-spawn@7.0.6: 471 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 472 | engines: {node: '>= 8'} 473 | 474 | debounce-fn@5.1.2: 475 | resolution: {integrity: sha512-Sr4SdOZ4vw6eQDvPYNxHogvrxmCIld/VenC5JbNrFwMiwd7lY/Z18ZFfo+EWNG4DD9nFlAujWAo/wGuOPHmy5A==} 476 | engines: {node: '>=12'} 477 | 478 | debug@4.4.3: 479 | resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} 480 | engines: {node: '>=6.0'} 481 | peerDependencies: 482 | supports-color: '*' 483 | peerDependenciesMeta: 484 | supports-color: 485 | optional: true 486 | 487 | dot-prop@8.0.2: 488 | resolution: {integrity: sha512-xaBe6ZT4DHPkg0k4Ytbvn5xoxgpG0jOS1dYxSOwAHPuNLjP3/OzN0gH55SrLqpx8cBfSaVt91lXYkApjb+nYdQ==} 489 | engines: {node: '>=16'} 490 | 491 | eastasianwidth@0.2.0: 492 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 493 | 494 | ejs@3.1.10: 495 | resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} 496 | engines: {node: '>=0.10.0'} 497 | hasBin: true 498 | 499 | emoji-regex@10.6.0: 500 | resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} 501 | 502 | emoji-regex@8.0.0: 503 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 504 | 505 | emoji-regex@9.2.2: 506 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 507 | 508 | env-paths@3.0.0: 509 | resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} 510 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 511 | 512 | esbuild@0.25.12: 513 | resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} 514 | engines: {node: '>=18'} 515 | hasBin: true 516 | 517 | esno@4.8.0: 518 | resolution: {integrity: sha512-acMtooReAQGzLU0zcuEDHa8S62meh5aIyi8jboYxyvAePdmuWx2Mpwmt0xjwO0bs9/SXf+dvXJ0QJoDWw814Iw==} 519 | hasBin: true 520 | 521 | fast-deep-equal@3.1.3: 522 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 523 | 524 | fast-uri@3.1.0: 525 | resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} 526 | 527 | fdir@6.5.0: 528 | resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} 529 | engines: {node: '>=12.0.0'} 530 | peerDependencies: 531 | picomatch: ^3 || ^4 532 | peerDependenciesMeta: 533 | picomatch: 534 | optional: true 535 | 536 | filelist@1.0.4: 537 | resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} 538 | 539 | fix-dts-default-cjs-exports@1.0.1: 540 | resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} 541 | 542 | foreground-child@3.3.1: 543 | resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} 544 | engines: {node: '>=14'} 545 | 546 | fs-extra@11.3.2: 547 | resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==} 548 | engines: {node: '>=14.14'} 549 | 550 | fsevents@2.3.3: 551 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 552 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 553 | os: [darwin] 554 | 555 | get-east-asian-width@1.4.0: 556 | resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} 557 | engines: {node: '>=18'} 558 | 559 | get-tsconfig@4.13.0: 560 | resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} 561 | 562 | glob@10.4.5: 563 | resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} 564 | hasBin: true 565 | 566 | graceful-fs@4.2.11: 567 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 568 | 569 | is-fullwidth-code-point@3.0.0: 570 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 571 | engines: {node: '>=8'} 572 | 573 | is-interactive@2.0.0: 574 | resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} 575 | engines: {node: '>=12'} 576 | 577 | is-unicode-supported@1.3.0: 578 | resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} 579 | engines: {node: '>=12'} 580 | 581 | is-unicode-supported@2.1.0: 582 | resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} 583 | engines: {node: '>=18'} 584 | 585 | isexe@2.0.0: 586 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 587 | 588 | jackspeak@3.4.3: 589 | resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} 590 | 591 | jake@10.9.4: 592 | resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} 593 | engines: {node: '>=10'} 594 | hasBin: true 595 | 596 | joycon@3.1.1: 597 | resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} 598 | engines: {node: '>=10'} 599 | 600 | json-schema-traverse@1.0.0: 601 | resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} 602 | 603 | json-schema-typed@8.0.1: 604 | resolution: {integrity: sha512-XQmWYj2Sm4kn4WeTYvmpKEbyPsL7nBsb647c7pMe6l02/yx2+Jfc4dT6UZkEXnIUb5LhD55r2HPsJ1milQ4rDg==} 605 | 606 | jsonfile@6.2.0: 607 | resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} 608 | 609 | kleur@3.0.3: 610 | resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 611 | engines: {node: '>=6'} 612 | 613 | lilconfig@3.1.3: 614 | resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} 615 | engines: {node: '>=14'} 616 | 617 | lines-and-columns@1.2.4: 618 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 619 | 620 | load-tsconfig@0.2.5: 621 | resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} 622 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 623 | 624 | lodash.sortby@4.7.0: 625 | resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} 626 | 627 | log-symbols@6.0.0: 628 | resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} 629 | engines: {node: '>=18'} 630 | 631 | lru-cache@10.4.3: 632 | resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 633 | 634 | magic-string@0.30.21: 635 | resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} 636 | 637 | mimic-fn@4.0.0: 638 | resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} 639 | engines: {node: '>=12'} 640 | 641 | mimic-function@5.0.1: 642 | resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} 643 | engines: {node: '>=18'} 644 | 645 | minimatch@5.1.6: 646 | resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} 647 | engines: {node: '>=10'} 648 | 649 | minimatch@9.0.5: 650 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 651 | engines: {node: '>=16 || 14 >=14.17'} 652 | 653 | minipass@7.1.2: 654 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 655 | engines: {node: '>=16 || 14 >=14.17'} 656 | 657 | mlly@1.8.0: 658 | resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} 659 | 660 | ms@2.1.3: 661 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 662 | 663 | mz@2.7.0: 664 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 665 | 666 | object-assign@4.1.1: 667 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 668 | engines: {node: '>=0.10.0'} 669 | 670 | onetime@7.0.0: 671 | resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} 672 | engines: {node: '>=18'} 673 | 674 | ora@8.2.0: 675 | resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} 676 | engines: {node: '>=18'} 677 | 678 | package-json-from-dist@1.0.1: 679 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 680 | 681 | path-key@3.1.1: 682 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 683 | engines: {node: '>=8'} 684 | 685 | path-scurry@1.11.1: 686 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 687 | engines: {node: '>=16 || 14 >=14.18'} 688 | 689 | pathe@2.0.3: 690 | resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 691 | 692 | picocolors@1.1.1: 693 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 694 | 695 | picomatch@4.0.3: 696 | resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 697 | engines: {node: '>=12'} 698 | 699 | pirates@4.0.7: 700 | resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} 701 | engines: {node: '>= 6'} 702 | 703 | pkg-types@1.3.1: 704 | resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} 705 | 706 | postcss-load-config@6.0.1: 707 | resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} 708 | engines: {node: '>= 18'} 709 | peerDependencies: 710 | jiti: '>=1.21.0' 711 | postcss: '>=8.0.9' 712 | tsx: ^4.8.1 713 | yaml: ^2.4.2 714 | peerDependenciesMeta: 715 | jiti: 716 | optional: true 717 | postcss: 718 | optional: true 719 | tsx: 720 | optional: true 721 | yaml: 722 | optional: true 723 | 724 | prettier@3.6.2: 725 | resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} 726 | engines: {node: '>=14'} 727 | hasBin: true 728 | 729 | prompts@2.4.2: 730 | resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} 731 | engines: {node: '>= 6'} 732 | 733 | punycode@2.3.1: 734 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 735 | engines: {node: '>=6'} 736 | 737 | readdirp@4.1.2: 738 | resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} 739 | engines: {node: '>= 14.18.0'} 740 | 741 | require-from-string@2.0.2: 742 | resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} 743 | engines: {node: '>=0.10.0'} 744 | 745 | resolve-from@5.0.0: 746 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 747 | engines: {node: '>=8'} 748 | 749 | resolve-pkg-maps@1.0.0: 750 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 751 | 752 | restore-cursor@5.1.0: 753 | resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} 754 | engines: {node: '>=18'} 755 | 756 | rollup@4.53.1: 757 | resolution: {integrity: sha512-n2I0V0lN3E9cxxMqBCT3opWOiQBzRN7UG60z/WDKqdX2zHUS/39lezBcsckZFsV6fUTSnfqI7kHf60jDAPGKug==} 758 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 759 | hasBin: true 760 | 761 | semver@7.7.3: 762 | resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} 763 | engines: {node: '>=10'} 764 | hasBin: true 765 | 766 | shebang-command@2.0.0: 767 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 768 | engines: {node: '>=8'} 769 | 770 | shebang-regex@3.0.0: 771 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 772 | engines: {node: '>=8'} 773 | 774 | signal-exit@4.1.0: 775 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 776 | engines: {node: '>=14'} 777 | 778 | sisteransi@1.0.5: 779 | resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 780 | 781 | source-map@0.8.0-beta.0: 782 | resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} 783 | engines: {node: '>= 8'} 784 | deprecated: The work that was done in this beta branch won't be included in future versions 785 | 786 | stdin-discarder@0.2.2: 787 | resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} 788 | engines: {node: '>=18'} 789 | 790 | string-width@4.2.3: 791 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 792 | engines: {node: '>=8'} 793 | 794 | string-width@5.1.2: 795 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 796 | engines: {node: '>=12'} 797 | 798 | string-width@7.2.0: 799 | resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} 800 | engines: {node: '>=18'} 801 | 802 | strip-ansi@6.0.1: 803 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 804 | engines: {node: '>=8'} 805 | 806 | strip-ansi@7.1.2: 807 | resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} 808 | engines: {node: '>=12'} 809 | 810 | stubborn-fs@2.0.0: 811 | resolution: {integrity: sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA==} 812 | 813 | stubborn-utils@1.0.2: 814 | resolution: {integrity: sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg==} 815 | 816 | sucrase@3.35.0: 817 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 818 | engines: {node: '>=16 || 14 >=14.17'} 819 | hasBin: true 820 | 821 | thenify-all@1.6.0: 822 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 823 | engines: {node: '>=0.8'} 824 | 825 | thenify@3.3.1: 826 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 827 | 828 | tinyexec@0.3.2: 829 | resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 830 | 831 | tinyglobby@0.2.15: 832 | resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 833 | engines: {node: '>=12.0.0'} 834 | 835 | tr46@1.0.1: 836 | resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} 837 | 838 | tree-kill@1.2.2: 839 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 840 | hasBin: true 841 | 842 | ts-interface-checker@0.1.13: 843 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 844 | 845 | tsup@8.5.0: 846 | resolution: {integrity: sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==} 847 | engines: {node: '>=18'} 848 | hasBin: true 849 | peerDependencies: 850 | '@microsoft/api-extractor': ^7.36.0 851 | '@swc/core': ^1 852 | postcss: ^8.4.12 853 | typescript: '>=4.5.0' 854 | peerDependenciesMeta: 855 | '@microsoft/api-extractor': 856 | optional: true 857 | '@swc/core': 858 | optional: true 859 | postcss: 860 | optional: true 861 | typescript: 862 | optional: true 863 | 864 | tsx@4.20.6: 865 | resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==} 866 | engines: {node: '>=18.0.0'} 867 | hasBin: true 868 | 869 | type-fest@3.13.1: 870 | resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} 871 | engines: {node: '>=14.16'} 872 | 873 | typescript@5.9.3: 874 | resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} 875 | engines: {node: '>=14.17'} 876 | hasBin: true 877 | 878 | ufo@1.6.1: 879 | resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} 880 | 881 | uint8array-extras@0.3.0: 882 | resolution: {integrity: sha512-erJsJwQ0tKdwuqI0359U8ijkFmfiTcq25JvvzRVc1VP+2son1NJRXhxcAKJmAW3ajM8JSGAfsAXye8g4s+znxA==} 883 | engines: {node: '>=18'} 884 | 885 | undici-types@6.21.0: 886 | resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 887 | 888 | universalify@2.0.1: 889 | resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} 890 | engines: {node: '>= 10.0.0'} 891 | 892 | validate-npm-package-name@5.0.1: 893 | resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} 894 | engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} 895 | 896 | webidl-conversions@4.0.2: 897 | resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} 898 | 899 | whatwg-url@7.1.0: 900 | resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} 901 | 902 | when-exit@2.1.5: 903 | resolution: {integrity: sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==} 904 | 905 | which@2.0.2: 906 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 907 | engines: {node: '>= 8'} 908 | hasBin: true 909 | 910 | wrap-ansi@7.0.0: 911 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 912 | engines: {node: '>=10'} 913 | 914 | wrap-ansi@8.1.0: 915 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 916 | engines: {node: '>=12'} 917 | 918 | snapshots: 919 | 920 | '@esbuild/aix-ppc64@0.25.12': 921 | optional: true 922 | 923 | '@esbuild/android-arm64@0.25.12': 924 | optional: true 925 | 926 | '@esbuild/android-arm@0.25.12': 927 | optional: true 928 | 929 | '@esbuild/android-x64@0.25.12': 930 | optional: true 931 | 932 | '@esbuild/darwin-arm64@0.25.12': 933 | optional: true 934 | 935 | '@esbuild/darwin-x64@0.25.12': 936 | optional: true 937 | 938 | '@esbuild/freebsd-arm64@0.25.12': 939 | optional: true 940 | 941 | '@esbuild/freebsd-x64@0.25.12': 942 | optional: true 943 | 944 | '@esbuild/linux-arm64@0.25.12': 945 | optional: true 946 | 947 | '@esbuild/linux-arm@0.25.12': 948 | optional: true 949 | 950 | '@esbuild/linux-ia32@0.25.12': 951 | optional: true 952 | 953 | '@esbuild/linux-loong64@0.25.12': 954 | optional: true 955 | 956 | '@esbuild/linux-mips64el@0.25.12': 957 | optional: true 958 | 959 | '@esbuild/linux-ppc64@0.25.12': 960 | optional: true 961 | 962 | '@esbuild/linux-riscv64@0.25.12': 963 | optional: true 964 | 965 | '@esbuild/linux-s390x@0.25.12': 966 | optional: true 967 | 968 | '@esbuild/linux-x64@0.25.12': 969 | optional: true 970 | 971 | '@esbuild/netbsd-arm64@0.25.12': 972 | optional: true 973 | 974 | '@esbuild/netbsd-x64@0.25.12': 975 | optional: true 976 | 977 | '@esbuild/openbsd-arm64@0.25.12': 978 | optional: true 979 | 980 | '@esbuild/openbsd-x64@0.25.12': 981 | optional: true 982 | 983 | '@esbuild/openharmony-arm64@0.25.12': 984 | optional: true 985 | 986 | '@esbuild/sunos-x64@0.25.12': 987 | optional: true 988 | 989 | '@esbuild/win32-arm64@0.25.12': 990 | optional: true 991 | 992 | '@esbuild/win32-ia32@0.25.12': 993 | optional: true 994 | 995 | '@esbuild/win32-x64@0.25.12': 996 | optional: true 997 | 998 | '@isaacs/cliui@8.0.2': 999 | dependencies: 1000 | string-width: 5.1.2 1001 | string-width-cjs: string-width@4.2.3 1002 | strip-ansi: 7.1.2 1003 | strip-ansi-cjs: strip-ansi@6.0.1 1004 | wrap-ansi: 8.1.0 1005 | wrap-ansi-cjs: wrap-ansi@7.0.0 1006 | 1007 | '@jridgewell/gen-mapping@0.3.13': 1008 | dependencies: 1009 | '@jridgewell/sourcemap-codec': 1.5.5 1010 | '@jridgewell/trace-mapping': 0.3.31 1011 | 1012 | '@jridgewell/resolve-uri@3.1.2': {} 1013 | 1014 | '@jridgewell/sourcemap-codec@1.5.5': {} 1015 | 1016 | '@jridgewell/trace-mapping@0.3.31': 1017 | dependencies: 1018 | '@jridgewell/resolve-uri': 3.1.2 1019 | '@jridgewell/sourcemap-codec': 1.5.5 1020 | 1021 | '@pkgjs/parseargs@0.11.0': 1022 | optional: true 1023 | 1024 | '@rollup/rollup-android-arm-eabi@4.53.1': 1025 | optional: true 1026 | 1027 | '@rollup/rollup-android-arm64@4.53.1': 1028 | optional: true 1029 | 1030 | '@rollup/rollup-darwin-arm64@4.53.1': 1031 | optional: true 1032 | 1033 | '@rollup/rollup-darwin-x64@4.53.1': 1034 | optional: true 1035 | 1036 | '@rollup/rollup-freebsd-arm64@4.53.1': 1037 | optional: true 1038 | 1039 | '@rollup/rollup-freebsd-x64@4.53.1': 1040 | optional: true 1041 | 1042 | '@rollup/rollup-linux-arm-gnueabihf@4.53.1': 1043 | optional: true 1044 | 1045 | '@rollup/rollup-linux-arm-musleabihf@4.53.1': 1046 | optional: true 1047 | 1048 | '@rollup/rollup-linux-arm64-gnu@4.53.1': 1049 | optional: true 1050 | 1051 | '@rollup/rollup-linux-arm64-musl@4.53.1': 1052 | optional: true 1053 | 1054 | '@rollup/rollup-linux-loong64-gnu@4.53.1': 1055 | optional: true 1056 | 1057 | '@rollup/rollup-linux-ppc64-gnu@4.53.1': 1058 | optional: true 1059 | 1060 | '@rollup/rollup-linux-riscv64-gnu@4.53.1': 1061 | optional: true 1062 | 1063 | '@rollup/rollup-linux-riscv64-musl@4.53.1': 1064 | optional: true 1065 | 1066 | '@rollup/rollup-linux-s390x-gnu@4.53.1': 1067 | optional: true 1068 | 1069 | '@rollup/rollup-linux-x64-gnu@4.53.1': 1070 | optional: true 1071 | 1072 | '@rollup/rollup-linux-x64-musl@4.53.1': 1073 | optional: true 1074 | 1075 | '@rollup/rollup-openharmony-arm64@4.53.1': 1076 | optional: true 1077 | 1078 | '@rollup/rollup-win32-arm64-msvc@4.53.1': 1079 | optional: true 1080 | 1081 | '@rollup/rollup-win32-ia32-msvc@4.53.1': 1082 | optional: true 1083 | 1084 | '@rollup/rollup-win32-x64-gnu@4.53.1': 1085 | optional: true 1086 | 1087 | '@rollup/rollup-win32-x64-msvc@4.53.1': 1088 | optional: true 1089 | 1090 | '@types/ejs@3.1.5': {} 1091 | 1092 | '@types/estree@1.0.8': {} 1093 | 1094 | '@types/fs-extra@11.0.4': 1095 | dependencies: 1096 | '@types/jsonfile': 6.1.4 1097 | '@types/node': 20.19.24 1098 | 1099 | '@types/jsonfile@6.1.4': 1100 | dependencies: 1101 | '@types/node': 20.19.24 1102 | 1103 | '@types/node@20.19.24': 1104 | dependencies: 1105 | undici-types: 6.21.0 1106 | 1107 | '@types/prompts@2.4.9': 1108 | dependencies: 1109 | '@types/node': 20.19.24 1110 | kleur: 3.0.3 1111 | 1112 | '@types/validate-npm-package-name@4.0.2': {} 1113 | 1114 | acorn@8.15.0: {} 1115 | 1116 | ajv-formats@2.1.1(ajv@8.17.1): 1117 | optionalDependencies: 1118 | ajv: 8.17.1 1119 | 1120 | ajv@8.17.1: 1121 | dependencies: 1122 | fast-deep-equal: 3.1.3 1123 | fast-uri: 3.1.0 1124 | json-schema-traverse: 1.0.0 1125 | require-from-string: 2.0.2 1126 | 1127 | ansi-regex@5.0.1: {} 1128 | 1129 | ansi-regex@6.2.2: {} 1130 | 1131 | ansi-styles@4.3.0: 1132 | dependencies: 1133 | color-convert: 2.0.1 1134 | 1135 | ansi-styles@6.2.3: {} 1136 | 1137 | any-promise@1.3.0: {} 1138 | 1139 | async@3.2.6: {} 1140 | 1141 | atomically@2.1.0: 1142 | dependencies: 1143 | stubborn-fs: 2.0.0 1144 | when-exit: 2.1.5 1145 | 1146 | balanced-match@1.0.2: {} 1147 | 1148 | brace-expansion@2.0.2: 1149 | dependencies: 1150 | balanced-match: 1.0.2 1151 | 1152 | bundle-require@5.1.0(esbuild@0.25.12): 1153 | dependencies: 1154 | esbuild: 0.25.12 1155 | load-tsconfig: 0.2.5 1156 | 1157 | cac@6.7.14: {} 1158 | 1159 | chalk@5.6.2: {} 1160 | 1161 | chokidar@4.0.3: 1162 | dependencies: 1163 | readdirp: 4.1.2 1164 | 1165 | cli-cursor@5.0.0: 1166 | dependencies: 1167 | restore-cursor: 5.1.0 1168 | 1169 | cli-spinners@2.9.2: {} 1170 | 1171 | color-convert@2.0.1: 1172 | dependencies: 1173 | color-name: 1.1.4 1174 | 1175 | color-name@1.1.4: {} 1176 | 1177 | commander@12.1.0: {} 1178 | 1179 | commander@4.1.1: {} 1180 | 1181 | conf@12.0.0: 1182 | dependencies: 1183 | ajv: 8.17.1 1184 | ajv-formats: 2.1.1(ajv@8.17.1) 1185 | atomically: 2.1.0 1186 | debounce-fn: 5.1.2 1187 | dot-prop: 8.0.2 1188 | env-paths: 3.0.0 1189 | json-schema-typed: 8.0.1 1190 | semver: 7.7.3 1191 | uint8array-extras: 0.3.0 1192 | 1193 | confbox@0.1.8: {} 1194 | 1195 | consola@3.4.2: {} 1196 | 1197 | cross-spawn@7.0.6: 1198 | dependencies: 1199 | path-key: 3.1.1 1200 | shebang-command: 2.0.0 1201 | which: 2.0.2 1202 | 1203 | debounce-fn@5.1.2: 1204 | dependencies: 1205 | mimic-fn: 4.0.0 1206 | 1207 | debug@4.4.3: 1208 | dependencies: 1209 | ms: 2.1.3 1210 | 1211 | dot-prop@8.0.2: 1212 | dependencies: 1213 | type-fest: 3.13.1 1214 | 1215 | eastasianwidth@0.2.0: {} 1216 | 1217 | ejs@3.1.10: 1218 | dependencies: 1219 | jake: 10.9.4 1220 | 1221 | emoji-regex@10.6.0: {} 1222 | 1223 | emoji-regex@8.0.0: {} 1224 | 1225 | emoji-regex@9.2.2: {} 1226 | 1227 | env-paths@3.0.0: {} 1228 | 1229 | esbuild@0.25.12: 1230 | optionalDependencies: 1231 | '@esbuild/aix-ppc64': 0.25.12 1232 | '@esbuild/android-arm': 0.25.12 1233 | '@esbuild/android-arm64': 0.25.12 1234 | '@esbuild/android-x64': 0.25.12 1235 | '@esbuild/darwin-arm64': 0.25.12 1236 | '@esbuild/darwin-x64': 0.25.12 1237 | '@esbuild/freebsd-arm64': 0.25.12 1238 | '@esbuild/freebsd-x64': 0.25.12 1239 | '@esbuild/linux-arm': 0.25.12 1240 | '@esbuild/linux-arm64': 0.25.12 1241 | '@esbuild/linux-ia32': 0.25.12 1242 | '@esbuild/linux-loong64': 0.25.12 1243 | '@esbuild/linux-mips64el': 0.25.12 1244 | '@esbuild/linux-ppc64': 0.25.12 1245 | '@esbuild/linux-riscv64': 0.25.12 1246 | '@esbuild/linux-s390x': 0.25.12 1247 | '@esbuild/linux-x64': 0.25.12 1248 | '@esbuild/netbsd-arm64': 0.25.12 1249 | '@esbuild/netbsd-x64': 0.25.12 1250 | '@esbuild/openbsd-arm64': 0.25.12 1251 | '@esbuild/openbsd-x64': 0.25.12 1252 | '@esbuild/openharmony-arm64': 0.25.12 1253 | '@esbuild/sunos-x64': 0.25.12 1254 | '@esbuild/win32-arm64': 0.25.12 1255 | '@esbuild/win32-ia32': 0.25.12 1256 | '@esbuild/win32-x64': 0.25.12 1257 | 1258 | esno@4.8.0: 1259 | dependencies: 1260 | tsx: 4.20.6 1261 | 1262 | fast-deep-equal@3.1.3: {} 1263 | 1264 | fast-uri@3.1.0: {} 1265 | 1266 | fdir@6.5.0(picomatch@4.0.3): 1267 | optionalDependencies: 1268 | picomatch: 4.0.3 1269 | 1270 | filelist@1.0.4: 1271 | dependencies: 1272 | minimatch: 5.1.6 1273 | 1274 | fix-dts-default-cjs-exports@1.0.1: 1275 | dependencies: 1276 | magic-string: 0.30.21 1277 | mlly: 1.8.0 1278 | rollup: 4.53.1 1279 | 1280 | foreground-child@3.3.1: 1281 | dependencies: 1282 | cross-spawn: 7.0.6 1283 | signal-exit: 4.1.0 1284 | 1285 | fs-extra@11.3.2: 1286 | dependencies: 1287 | graceful-fs: 4.2.11 1288 | jsonfile: 6.2.0 1289 | universalify: 2.0.1 1290 | 1291 | fsevents@2.3.3: 1292 | optional: true 1293 | 1294 | get-east-asian-width@1.4.0: {} 1295 | 1296 | get-tsconfig@4.13.0: 1297 | dependencies: 1298 | resolve-pkg-maps: 1.0.0 1299 | 1300 | glob@10.4.5: 1301 | dependencies: 1302 | foreground-child: 3.3.1 1303 | jackspeak: 3.4.3 1304 | minimatch: 9.0.5 1305 | minipass: 7.1.2 1306 | package-json-from-dist: 1.0.1 1307 | path-scurry: 1.11.1 1308 | 1309 | graceful-fs@4.2.11: {} 1310 | 1311 | is-fullwidth-code-point@3.0.0: {} 1312 | 1313 | is-interactive@2.0.0: {} 1314 | 1315 | is-unicode-supported@1.3.0: {} 1316 | 1317 | is-unicode-supported@2.1.0: {} 1318 | 1319 | isexe@2.0.0: {} 1320 | 1321 | jackspeak@3.4.3: 1322 | dependencies: 1323 | '@isaacs/cliui': 8.0.2 1324 | optionalDependencies: 1325 | '@pkgjs/parseargs': 0.11.0 1326 | 1327 | jake@10.9.4: 1328 | dependencies: 1329 | async: 3.2.6 1330 | filelist: 1.0.4 1331 | picocolors: 1.1.1 1332 | 1333 | joycon@3.1.1: {} 1334 | 1335 | json-schema-traverse@1.0.0: {} 1336 | 1337 | json-schema-typed@8.0.1: {} 1338 | 1339 | jsonfile@6.2.0: 1340 | dependencies: 1341 | universalify: 2.0.1 1342 | optionalDependencies: 1343 | graceful-fs: 4.2.11 1344 | 1345 | kleur@3.0.3: {} 1346 | 1347 | lilconfig@3.1.3: {} 1348 | 1349 | lines-and-columns@1.2.4: {} 1350 | 1351 | load-tsconfig@0.2.5: {} 1352 | 1353 | lodash.sortby@4.7.0: {} 1354 | 1355 | log-symbols@6.0.0: 1356 | dependencies: 1357 | chalk: 5.6.2 1358 | is-unicode-supported: 1.3.0 1359 | 1360 | lru-cache@10.4.3: {} 1361 | 1362 | magic-string@0.30.21: 1363 | dependencies: 1364 | '@jridgewell/sourcemap-codec': 1.5.5 1365 | 1366 | mimic-fn@4.0.0: {} 1367 | 1368 | mimic-function@5.0.1: {} 1369 | 1370 | minimatch@5.1.6: 1371 | dependencies: 1372 | brace-expansion: 2.0.2 1373 | 1374 | minimatch@9.0.5: 1375 | dependencies: 1376 | brace-expansion: 2.0.2 1377 | 1378 | minipass@7.1.2: {} 1379 | 1380 | mlly@1.8.0: 1381 | dependencies: 1382 | acorn: 8.15.0 1383 | pathe: 2.0.3 1384 | pkg-types: 1.3.1 1385 | ufo: 1.6.1 1386 | 1387 | ms@2.1.3: {} 1388 | 1389 | mz@2.7.0: 1390 | dependencies: 1391 | any-promise: 1.3.0 1392 | object-assign: 4.1.1 1393 | thenify-all: 1.6.0 1394 | 1395 | object-assign@4.1.1: {} 1396 | 1397 | onetime@7.0.0: 1398 | dependencies: 1399 | mimic-function: 5.0.1 1400 | 1401 | ora@8.2.0: 1402 | dependencies: 1403 | chalk: 5.6.2 1404 | cli-cursor: 5.0.0 1405 | cli-spinners: 2.9.2 1406 | is-interactive: 2.0.0 1407 | is-unicode-supported: 2.1.0 1408 | log-symbols: 6.0.0 1409 | stdin-discarder: 0.2.2 1410 | string-width: 7.2.0 1411 | strip-ansi: 7.1.2 1412 | 1413 | package-json-from-dist@1.0.1: {} 1414 | 1415 | path-key@3.1.1: {} 1416 | 1417 | path-scurry@1.11.1: 1418 | dependencies: 1419 | lru-cache: 10.4.3 1420 | minipass: 7.1.2 1421 | 1422 | pathe@2.0.3: {} 1423 | 1424 | picocolors@1.1.1: {} 1425 | 1426 | picomatch@4.0.3: {} 1427 | 1428 | pirates@4.0.7: {} 1429 | 1430 | pkg-types@1.3.1: 1431 | dependencies: 1432 | confbox: 0.1.8 1433 | mlly: 1.8.0 1434 | pathe: 2.0.3 1435 | 1436 | postcss-load-config@6.0.1(tsx@4.20.6): 1437 | dependencies: 1438 | lilconfig: 3.1.3 1439 | optionalDependencies: 1440 | tsx: 4.20.6 1441 | 1442 | prettier@3.6.2: {} 1443 | 1444 | prompts@2.4.2: 1445 | dependencies: 1446 | kleur: 3.0.3 1447 | sisteransi: 1.0.5 1448 | 1449 | punycode@2.3.1: {} 1450 | 1451 | readdirp@4.1.2: {} 1452 | 1453 | require-from-string@2.0.2: {} 1454 | 1455 | resolve-from@5.0.0: {} 1456 | 1457 | resolve-pkg-maps@1.0.0: {} 1458 | 1459 | restore-cursor@5.1.0: 1460 | dependencies: 1461 | onetime: 7.0.0 1462 | signal-exit: 4.1.0 1463 | 1464 | rollup@4.53.1: 1465 | dependencies: 1466 | '@types/estree': 1.0.8 1467 | optionalDependencies: 1468 | '@rollup/rollup-android-arm-eabi': 4.53.1 1469 | '@rollup/rollup-android-arm64': 4.53.1 1470 | '@rollup/rollup-darwin-arm64': 4.53.1 1471 | '@rollup/rollup-darwin-x64': 4.53.1 1472 | '@rollup/rollup-freebsd-arm64': 4.53.1 1473 | '@rollup/rollup-freebsd-x64': 4.53.1 1474 | '@rollup/rollup-linux-arm-gnueabihf': 4.53.1 1475 | '@rollup/rollup-linux-arm-musleabihf': 4.53.1 1476 | '@rollup/rollup-linux-arm64-gnu': 4.53.1 1477 | '@rollup/rollup-linux-arm64-musl': 4.53.1 1478 | '@rollup/rollup-linux-loong64-gnu': 4.53.1 1479 | '@rollup/rollup-linux-ppc64-gnu': 4.53.1 1480 | '@rollup/rollup-linux-riscv64-gnu': 4.53.1 1481 | '@rollup/rollup-linux-riscv64-musl': 4.53.1 1482 | '@rollup/rollup-linux-s390x-gnu': 4.53.1 1483 | '@rollup/rollup-linux-x64-gnu': 4.53.1 1484 | '@rollup/rollup-linux-x64-musl': 4.53.1 1485 | '@rollup/rollup-openharmony-arm64': 4.53.1 1486 | '@rollup/rollup-win32-arm64-msvc': 4.53.1 1487 | '@rollup/rollup-win32-ia32-msvc': 4.53.1 1488 | '@rollup/rollup-win32-x64-gnu': 4.53.1 1489 | '@rollup/rollup-win32-x64-msvc': 4.53.1 1490 | fsevents: 2.3.3 1491 | 1492 | semver@7.7.3: {} 1493 | 1494 | shebang-command@2.0.0: 1495 | dependencies: 1496 | shebang-regex: 3.0.0 1497 | 1498 | shebang-regex@3.0.0: {} 1499 | 1500 | signal-exit@4.1.0: {} 1501 | 1502 | sisteransi@1.0.5: {} 1503 | 1504 | source-map@0.8.0-beta.0: 1505 | dependencies: 1506 | whatwg-url: 7.1.0 1507 | 1508 | stdin-discarder@0.2.2: {} 1509 | 1510 | string-width@4.2.3: 1511 | dependencies: 1512 | emoji-regex: 8.0.0 1513 | is-fullwidth-code-point: 3.0.0 1514 | strip-ansi: 6.0.1 1515 | 1516 | string-width@5.1.2: 1517 | dependencies: 1518 | eastasianwidth: 0.2.0 1519 | emoji-regex: 9.2.2 1520 | strip-ansi: 7.1.2 1521 | 1522 | string-width@7.2.0: 1523 | dependencies: 1524 | emoji-regex: 10.6.0 1525 | get-east-asian-width: 1.4.0 1526 | strip-ansi: 7.1.2 1527 | 1528 | strip-ansi@6.0.1: 1529 | dependencies: 1530 | ansi-regex: 5.0.1 1531 | 1532 | strip-ansi@7.1.2: 1533 | dependencies: 1534 | ansi-regex: 6.2.2 1535 | 1536 | stubborn-fs@2.0.0: 1537 | dependencies: 1538 | stubborn-utils: 1.0.2 1539 | 1540 | stubborn-utils@1.0.2: {} 1541 | 1542 | sucrase@3.35.0: 1543 | dependencies: 1544 | '@jridgewell/gen-mapping': 0.3.13 1545 | commander: 4.1.1 1546 | glob: 10.4.5 1547 | lines-and-columns: 1.2.4 1548 | mz: 2.7.0 1549 | pirates: 4.0.7 1550 | ts-interface-checker: 0.1.13 1551 | 1552 | thenify-all@1.6.0: 1553 | dependencies: 1554 | thenify: 3.3.1 1555 | 1556 | thenify@3.3.1: 1557 | dependencies: 1558 | any-promise: 1.3.0 1559 | 1560 | tinyexec@0.3.2: {} 1561 | 1562 | tinyglobby@0.2.15: 1563 | dependencies: 1564 | fdir: 6.5.0(picomatch@4.0.3) 1565 | picomatch: 4.0.3 1566 | 1567 | tr46@1.0.1: 1568 | dependencies: 1569 | punycode: 2.3.1 1570 | 1571 | tree-kill@1.2.2: {} 1572 | 1573 | ts-interface-checker@0.1.13: {} 1574 | 1575 | tsup@8.5.0(tsx@4.20.6)(typescript@5.9.3): 1576 | dependencies: 1577 | bundle-require: 5.1.0(esbuild@0.25.12) 1578 | cac: 6.7.14 1579 | chokidar: 4.0.3 1580 | consola: 3.4.2 1581 | debug: 4.4.3 1582 | esbuild: 0.25.12 1583 | fix-dts-default-cjs-exports: 1.0.1 1584 | joycon: 3.1.1 1585 | picocolors: 1.1.1 1586 | postcss-load-config: 6.0.1(tsx@4.20.6) 1587 | resolve-from: 5.0.0 1588 | rollup: 4.53.1 1589 | source-map: 0.8.0-beta.0 1590 | sucrase: 3.35.0 1591 | tinyexec: 0.3.2 1592 | tinyglobby: 0.2.15 1593 | tree-kill: 1.2.2 1594 | optionalDependencies: 1595 | typescript: 5.9.3 1596 | transitivePeerDependencies: 1597 | - jiti 1598 | - supports-color 1599 | - tsx 1600 | - yaml 1601 | 1602 | tsx@4.20.6: 1603 | dependencies: 1604 | esbuild: 0.25.12 1605 | get-tsconfig: 4.13.0 1606 | optionalDependencies: 1607 | fsevents: 2.3.3 1608 | 1609 | type-fest@3.13.1: {} 1610 | 1611 | typescript@5.9.3: {} 1612 | 1613 | ufo@1.6.1: {} 1614 | 1615 | uint8array-extras@0.3.0: {} 1616 | 1617 | undici-types@6.21.0: {} 1618 | 1619 | universalify@2.0.1: {} 1620 | 1621 | validate-npm-package-name@5.0.1: {} 1622 | 1623 | webidl-conversions@4.0.2: {} 1624 | 1625 | whatwg-url@7.1.0: 1626 | dependencies: 1627 | lodash.sortby: 4.7.0 1628 | tr46: 1.0.1 1629 | webidl-conversions: 4.0.2 1630 | 1631 | when-exit@2.1.5: {} 1632 | 1633 | which@2.0.2: 1634 | dependencies: 1635 | isexe: 2.0.0 1636 | 1637 | wrap-ansi@7.0.0: 1638 | dependencies: 1639 | ansi-styles: 4.3.0 1640 | string-width: 4.2.3 1641 | strip-ansi: 6.0.1 1642 | 1643 | wrap-ansi@8.1.0: 1644 | dependencies: 1645 | ansi-styles: 6.2.3 1646 | string-width: 5.1.2 1647 | strip-ansi: 7.1.2 1648 | --------------------------------------------------------------------------------