├── 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 |
11 |
12 |
13 |
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 |

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 |

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 |

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 |

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 |
--------------------------------------------------------------------------------