@teispace/next-maker 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/dist/index.js +16 -16
- package/dist/index.js.map +3 -3
- package/dist/src/config/paths.d.ts +2 -0
- package/dist/src/config/paths.d.ts.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.2.2](https://github.com/teispace/npm-packages/compare/next-maker-v0.2.1...next-maker-v0.2.2) (2025-12-02)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Miscellaneous Chores
|
|
7
|
+
|
|
8
|
+
* **cleanup:** remove unused client-utils and app-apis during cleanup process ([866baf4](https://github.com/teispace/npm-packages/commit/866baf41c32369bc7ca65dbe44fd7db0034c091f))
|
|
9
|
+
* **next-maker:** release alpha ([afbcfca](https://github.com/teispace/npm-packages/commit/afbcfca48fde7c19162c9aec8dd4aed0c4e8075c))
|
|
10
|
+
* **release:** merge alpha into beta ([d52f1f2](https://github.com/teispace/npm-packages/commit/d52f1f210745859d87701a42d629af9bc68d9e92))
|
|
11
|
+
|
|
3
12
|
## [0.2.1](https://github.com/teispace/npm-packages/compare/next-maker-v0.2.0...next-maker-v0.2.1) (2025-12-01)
|
|
4
13
|
|
|
5
14
|
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{Command as Se}from"commander";import xe from"node:path";import I from"picocolors";import K from"ora";function x(e="",t){let i=K({text:e,...t});return i.start(),i}import W from"enquirer";var{prompt:B}=W,A=async e=>await B([{type:"input",name:"projectName",message:"What is the project name?",initial:e||"my-app",skip:!!e,validate:i=>/^[a-z0-9-_]+$/.test(i)?!0:"Project name must be lowercase and contain only alphanumeric characters, hyphens, and underscores."},{type:"input",name:"description",message:"Project description:",initial:"A Next.js application"},{type:"input",name:"author",message:"Author:",initial:"Teispace"},{type:"input",name:"version",message:"Version:",initial:"0.1.0",validate:i=>/^\d+\.\d+\.\d+$/.test(i)?!0:"Version must be a valid semantic version (x.y.z)."},{type:"input",name:"email",message:"Support email:",initial:"support@example.com",validate:i=>/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(i)?!0:"Please enter a valid email address."},{type:"input",name:"company",message:"Company name:",initial:"Teispace"},{type:"select",name:"packageManager",message:"Which package manager would you like to use?",choices:["npm","yarn","pnpm","bun"],initial:1},{type:"input",name:"gitRemote",message:"Git remote origin URL (optional):",validate:i=>i&&!/^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([/\w .-]*)*\/?$/.test(i)?"Please enter a valid URL.":!0},{type:"input",name:"gitIssues",message:"Git issues URL (optional):",validate:i=>i&&!/^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([/\w .-]*)*\/?$/.test(i)?"Please enter a valid URL.":!0},{type:"input",name:"gitHomepage",message:"Project homepage URL (optional):",validate:i=>i&&!/^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([/\w .-]*)*\/?$/.test(i)?"Please enter a valid URL.":!0},{type:"confirm",name:"keepTemplates",message:"Do you want to keep GitHub issue and pull request templates?",initial:!0},{type:"select",name:"httpClient",message:"Which HTTP client do you want to use?",choices:["axios","fetch","both","none"],initial:0},{type:"confirm",name:"reactSecureStorage",message:"Do you want to include react-secure-storage?",initial:!0,skip:function(){let i=this.state?.answers??this.enquirer?.answers??{};return!!(i.httpClient&&i.httpClient!=="none")}},{type:"confirm",name:"darkMode",message:"Do you want to include Dark Mode (Tailwind + next-themes)?",initial:!0},{type:"confirm",name:"redux",message:"Do you want to include Redux Toolkit?",initial:!0},{type:"confirm",name:"i18n",message:"Do you want to include Internationalization (next-intl)?",initial:!0},{type:"multiselect",name:"communityFiles",message:"Select community files to include:",choices:[{name:"CODE_OF_CONDUCT.md",value:"CODE_OF_CONDUCT.md"},{name:"CONTRIBUTING.md",value:"CONTRIBUTING.md"},{name:"SECURITY.md",value:"SECURITY.md"}],initial:["CODE_OF_CONDUCT.md","CONTRIBUTING.md","SECURITY.md"]},{type:"confirm",name:"readme",message:"Do you want to create a README.md?",initial:!0},{type:"confirm",name:"docker",message:"Do you want to include Docker configuration?",initial:!0},{type:"input",name:"containerName",message:"Docker Container Name:",initial:"next-app",skip:function(){return!(this.state?.answers??this.enquirer?.answers??{}).docker},validate:i=>/^[a-zA-Z0-9][a-zA-Z0-9_.-]*$/.test(i)?!0:"Invalid Docker container name."},{type:"input",name:"imageName",message:"Docker Image Name:",initial:"nextjs-starter",skip:function(){return!(this.state?.answers??this.enquirer?.answers??{}).docker},validate:i=>/^[a-z0-9]+(?:[._-][a-z0-9]+)*$/.test(i)?!0:"Invalid Docker image name (must be lowercase)."},{type:"input",name:"imageTag",message:"Docker Image Tag:",initial:"latest",skip:function(){return!(this.state?.answers??this.enquirer?.answers??{}).docker},validate:i=>/^[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,127}$/.test(i)?!0:"Invalid Docker image tag."},{type:"confirm",name:"ci",message:"Do you want to include GitHub Actions (CI/CD)?",initial:!0},{type:"confirm",name:"preCommitHooks",message:"Do you want to setup pre-commit hooks (Husky, Commitlint, Lint-staged)?",initial:!0},{type:"confirm",name:"commitizen",message:"Do you want to setup Commitizen?",initial:!0}]);import N from"node:fs/promises";import Z from"node:path";import{existsSync as R}from"node:fs";var u=async e=>N.readFile(e,"utf-8"),m=async(e,t)=>{await N.mkdir(Z.dirname(e),{recursive:!0}),await N.writeFile(e,t,"utf-8")},p=async e=>{R(e)&&await N.unlink(e)},d=async e=>{R(e)&&await N.rm(e,{recursive:!0,force:!0})},w=async(e,t)=>{let i=await u(e),o=JSON.parse(i),r=t(o);await m(e,JSON.stringify(r,null,2))},g=e=>R(e);import{exec as q}from"node:child_process";import{promisify as Q}from"node:util";var v=Q(q),D=async e=>{try{await v("git init",{cwd:e}),await v("git add .",{cwd:e}),await v('git commit -m "Initial commit from @teispace/next-maker"',{cwd:e})}catch(t){console.warn("Failed to initialize git repository",t)}},j=async(e,t)=>{try{await v(`git remote add origin ${t}`,{cwd:e})}catch(i){console.warn("Failed to add remote origin",i)}};import{exec as ee}from"node:child_process";import{promisify as te}from"node:util";var L=te(ee),M=async(e,t)=>{let i=`${t} install`;try{await L(i,{cwd:e})}catch(o){throw new Error(`Failed to install dependencies with ${t}: ${o}`)}},O=async(e,t,i)=>{let o=`${t} run ${i}`;try{await L(o,{cwd:e})}catch(r){console.warn(`Warning: Failed to run script '${i}': ${r}`)}};import C from"picocolors";var ie={reset:e=>e,red:C.red,green:C.green,yellow:C.yellow,blue:C.blue,cyan:C.cyan,magenta:C.magenta,white:C.white,gray:C.gray,bright:C.bold,dim:C.dim};function P(e,t="reset"){let i=ie[t]??(o=>o);console.log(i(e))}function _(e){P(`\u2716 ${e}`,"red")}function T(e){P(e)}function b(){console.log(""),P("\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557","cyan"),P("\u2551 \u2551","cyan"),P("\u2551 \u{1F680} Create Teispace Next.js App \u{1F680} \u2551","cyan"),P("\u2551 \u2551","cyan"),P("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D","cyan"),console.log("")}function G(e){let{logger:t=a=>console.error(a),exitOnCancel:i=process.env.NODE_ENV!=="test"}=e??{},o=()=>{console.log(""),console.log(""),t("Setup cancelled by user"),console.log(""),i&&process.exit(0)},r=a=>{if(a!==null&&typeof a=="object"&&"code"in a&&a.code==="ERR_USE_AFTER_CLOSE"){o();return}if(a instanceof Error){t(`Uncaught exception: ${a.message}`);return}t(`Uncaught exception: ${String(a)}`)},n=a=>{if(a instanceof Error){t(`Unhandled promise rejection: ${a.message}`);return}t(`Unhandled promise rejection: ${String(a)}`)};return process.on("SIGINT",o),process.on("SIGTERM",o),process.on("uncaughtException",r),process.on("unhandledRejection",n),()=>{process.off("SIGINT",o),process.off("SIGTERM",o),process.off("uncaughtException",r),process.off("unhandledRejection",n)}}import oe from"degit";var U=async e=>{let t=x("Downloading template...");try{await oe("teispace/nextjs-starter",{cache:!1,force:!0,verbose:!0}).clone(e),t.succeed("Template downloaded successfully.")}catch(i){throw t.fail("Failed to download template."),i}};import ne from"node:path";var s={NEXT_CONFIG:"next.config.ts",TAILWIND_CONFIG:"tailwind.config.ts",POSTCSS_CONFIG:"postcss.config.mjs",ESLINT_CONFIG:"eslint.config.mjs",TS_CONFIG:"tsconfig.json",PACKAGE_JSON:"package.json",ENV_EXAMPLE:".env.example",GITIGNORE:".gitignore",README:"README.md",LICENSE:"LICENSE",CHANGELOG:"CHANGELOG.md",NVM_RC:".nvmrc",NPM_RC:".npmrc",SRC:"src",APP:"src/app",COMPONENTS:"src/components",LIB:"src/lib",PROVIDERS:"src/providers",STYLES:"src/styles",TYPES:"src/types",UTILS:"src/lib/utils",HOOKS:"src/hooks",SERVICES:"src/services",STORE:"src/store",I18N:"src/i18n",GLOBALS_CSS:"src/styles/globals.css",ROOT_LAYOUT:"src/app/layout.tsx",ROOT_PAGE:"src/app/page.tsx",ROOT_PROVIDER:"src/providers/RootProvider.tsx",PROVIDERS_INDEX:"src/providers/index.ts",COMPONENTS_INDEX:"src/components/index.ts",TYPES_INDEX:"src/types/index.ts",UTILS_INDEX:"src/lib/utils/index.ts",CONFIG_INDEX:"src/lib/config/index.ts",CONSTANTS:"src/lib/config/constants.ts",APP_LOCALES:"src/lib/config/app-locales.ts",MIDDLEWARE:"src/middleware.ts",PROXY:"src/proxy.ts",I18N_TYPES:"src/types/i18n.ts",HTTP_UTILS:"src/lib/utils/http",AXIOS_CLIENT:"src/lib/utils/http/axios-client",FETCH_CLIENT:"src/lib/utils/http/fetch-client",STORAGE_SERVICE:"src/services/storage",COUNTER_FEATURE:"src/features/counter",I18N_DIR:"src/i18n",LOCALE_DIR:"src/app/[locale]",ERRORS_DIR:"src/lib/errors",UTILITY_TYPES_DIR:"src/types/utility",COMMON_TYPES_DIR:"src/types/common",GITHUB_DIR:".github",HUSKY_DIR:".husky"};var f={REDUX_TOOLKIT:"@reduxjs/toolkit",REACT_REDUX:"react-redux",REDUX_PERSIST:"redux-persist",REACT_SECURE_STORAGE:"react-secure-storage",NEXT_INTL:"next-intl",NEXT_THEMES:"next-themes",AXIOS:"axios",HUSKY:"husky",COMMITLINT_CLI:"@commitlint/cli",COMMITLINT_CONFIG:"@commitlint/config-conventional",LINT_STAGED:"lint-staged",COMMITIZEN:"commitizen",CZ_CONVENTIONAL_CHANGELOG:"cz-conventional-changelog"};var F=async(e,t)=>{let i=x("Configuring package.json...");try{await w(ne.join(e,s.PACKAGE_JSON),o=>(o.name=t.projectName,o.version=t.version,o.description=t.description,o.author=t.author,delete o.packageManager,t.gitHomepage&&(o.homepage=t.gitHomepage),t.gitIssues&&(o.bugs={url:t.gitIssues}),t.gitRemote&&(o.repository={type:"git",url:t.gitRemote}),t.redux||(delete o.dependencies[f.REDUX_TOOLKIT],delete o.dependencies[f.REACT_REDUX],delete o.dependencies[f.REDUX_PERSIST]),t.httpClient!=="none"||t.reactSecureStorage||delete o.dependencies[f.REACT_SECURE_STORAGE],t.i18n||delete o.dependencies[f.NEXT_INTL],t.darkMode||delete o.dependencies[f.NEXT_THEMES],t.httpClient==="none"?delete o.dependencies[f.AXIOS]:t.httpClient==="fetch"&&delete o.dependencies[f.AXIOS],o)),i.succeed("package.json configured.")}catch(o){throw i.fail("Failed to configure package.json."),o}};import c from"node:path";var k=async(e,t)=>{let i=x("Customizing features...");try{await re(e,t),await ae(e,t),await se(e,t),await ce(e,t),await me(e,t),await pe(e),await le(e),await de(e),i.succeed("Features customized.")}catch(o){throw i.fail("Failed to customize features."),o}},re=async(e,t)=>{let i=c.join(e,s.HTTP_UTILS),o=t.httpClient!=="none"||t.reactSecureStorage;if(t.httpClient==="none"){if(await d(c.join(e,s.AXIOS_CLIENT)),await d(c.join(e,s.FETCH_CLIENT)),o)await m(c.join(i,"index.ts"),`export * from './token-store';
|
|
3
|
-
`);else{await
|
|
2
|
+
import{Command as Se}from"commander";import xe from"node:path";import I from"picocolors";import K from"ora";function x(e="",t){let i=K({text:e,...t});return i.start(),i}import W from"enquirer";var{prompt:B}=W,A=async e=>await B([{type:"input",name:"projectName",message:"What is the project name?",initial:e||"my-app",skip:!!e,validate:i=>/^[a-z0-9-_]+$/.test(i)?!0:"Project name must be lowercase and contain only alphanumeric characters, hyphens, and underscores."},{type:"input",name:"description",message:"Project description:",initial:"A Next.js application"},{type:"input",name:"author",message:"Author:",initial:"Teispace"},{type:"input",name:"version",message:"Version:",initial:"0.1.0",validate:i=>/^\d+\.\d+\.\d+$/.test(i)?!0:"Version must be a valid semantic version (x.y.z)."},{type:"input",name:"email",message:"Support email:",initial:"support@example.com",validate:i=>/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(i)?!0:"Please enter a valid email address."},{type:"input",name:"company",message:"Company name:",initial:"Teispace"},{type:"select",name:"packageManager",message:"Which package manager would you like to use?",choices:["npm","yarn","pnpm","bun"],initial:1},{type:"input",name:"gitRemote",message:"Git remote origin URL (optional):",validate:i=>i&&!/^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([/\w .-]*)*\/?$/.test(i)?"Please enter a valid URL.":!0},{type:"input",name:"gitIssues",message:"Git issues URL (optional):",validate:i=>i&&!/^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([/\w .-]*)*\/?$/.test(i)?"Please enter a valid URL.":!0},{type:"input",name:"gitHomepage",message:"Project homepage URL (optional):",validate:i=>i&&!/^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([/\w .-]*)*\/?$/.test(i)?"Please enter a valid URL.":!0},{type:"confirm",name:"keepTemplates",message:"Do you want to keep GitHub issue and pull request templates?",initial:!0},{type:"select",name:"httpClient",message:"Which HTTP client do you want to use?",choices:["axios","fetch","both","none"],initial:0},{type:"confirm",name:"reactSecureStorage",message:"Do you want to include react-secure-storage?",initial:!0,skip:function(){let i=this.state?.answers??this.enquirer?.answers??{};return!!(i.httpClient&&i.httpClient!=="none")}},{type:"confirm",name:"darkMode",message:"Do you want to include Dark Mode (Tailwind + next-themes)?",initial:!0},{type:"confirm",name:"redux",message:"Do you want to include Redux Toolkit?",initial:!0},{type:"confirm",name:"i18n",message:"Do you want to include Internationalization (next-intl)?",initial:!0},{type:"multiselect",name:"communityFiles",message:"Select community files to include:",choices:[{name:"CODE_OF_CONDUCT.md",value:"CODE_OF_CONDUCT.md"},{name:"CONTRIBUTING.md",value:"CONTRIBUTING.md"},{name:"SECURITY.md",value:"SECURITY.md"}],initial:["CODE_OF_CONDUCT.md","CONTRIBUTING.md","SECURITY.md"]},{type:"confirm",name:"readme",message:"Do you want to create a README.md?",initial:!0},{type:"confirm",name:"docker",message:"Do you want to include Docker configuration?",initial:!0},{type:"input",name:"containerName",message:"Docker Container Name:",initial:"next-app",skip:function(){return!(this.state?.answers??this.enquirer?.answers??{}).docker},validate:i=>/^[a-zA-Z0-9][a-zA-Z0-9_.-]*$/.test(i)?!0:"Invalid Docker container name."},{type:"input",name:"imageName",message:"Docker Image Name:",initial:"nextjs-starter",skip:function(){return!(this.state?.answers??this.enquirer?.answers??{}).docker},validate:i=>/^[a-z0-9]+(?:[._-][a-z0-9]+)*$/.test(i)?!0:"Invalid Docker image name (must be lowercase)."},{type:"input",name:"imageTag",message:"Docker Image Tag:",initial:"latest",skip:function(){return!(this.state?.answers??this.enquirer?.answers??{}).docker},validate:i=>/^[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,127}$/.test(i)?!0:"Invalid Docker image tag."},{type:"confirm",name:"ci",message:"Do you want to include GitHub Actions (CI/CD)?",initial:!0},{type:"confirm",name:"preCommitHooks",message:"Do you want to setup pre-commit hooks (Husky, Commitlint, Lint-staged)?",initial:!0},{type:"confirm",name:"commitizen",message:"Do you want to setup Commitizen?",initial:!0}]);import w from"node:fs/promises";import Z from"node:path";import{existsSync as R}from"node:fs";var d=async e=>w.readFile(e,"utf-8"),m=async(e,t)=>{await w.mkdir(Z.dirname(e),{recursive:!0}),await w.writeFile(e,t,"utf-8")},l=async e=>{R(e)&&await w.unlink(e)},g=async e=>{R(e)&&await w.rm(e,{recursive:!0,force:!0})},N=async(e,t)=>{let i=await d(e),o=JSON.parse(i),s=t(o);await m(e,JSON.stringify(s,null,2))},f=e=>R(e);import{exec as q}from"node:child_process";import{promisify as Q}from"node:util";var v=Q(q),D=async e=>{try{await v("git init",{cwd:e}),await v("git add .",{cwd:e}),await v('git commit -m "Initial commit from @teispace/next-maker"',{cwd:e})}catch(t){console.warn("Failed to initialize git repository",t)}},j=async(e,t)=>{try{await v(`git remote add origin ${t}`,{cwd:e})}catch(i){console.warn("Failed to add remote origin",i)}};import{exec as ee}from"node:child_process";import{promisify as te}from"node:util";var L=te(ee),M=async(e,t)=>{let i=`${t} install`;try{await L(i,{cwd:e})}catch(o){throw new Error(`Failed to install dependencies with ${t}: ${o}`)}},_=async(e,t,i)=>{let o=`${t} run ${i}`;try{await L(o,{cwd:e})}catch(s){console.warn(`Warning: Failed to run script '${i}': ${s}`)}};import C from"picocolors";var ie={reset:e=>e,red:C.red,green:C.green,yellow:C.yellow,blue:C.blue,cyan:C.cyan,magenta:C.magenta,white:C.white,gray:C.gray,bright:C.bold,dim:C.dim};function P(e,t="reset"){let i=ie[t]??(o=>o);console.log(i(e))}function O(e){P(`\u2716 ${e}`,"red")}function T(e){P(e)}function b(){console.log(""),P("\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557","cyan"),P("\u2551 \u2551","cyan"),P("\u2551 \u{1F680} Create Teispace Next.js App \u{1F680} \u2551","cyan"),P("\u2551 \u2551","cyan"),P("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D","cyan"),console.log("")}function G(e){let{logger:t=n=>console.error(n),exitOnCancel:i=process.env.NODE_ENV!=="test"}=e??{},o=()=>{console.log(""),console.log(""),t("Setup cancelled by user"),console.log(""),i&&process.exit(0)},s=n=>{if(n!==null&&typeof n=="object"&&"code"in n&&n.code==="ERR_USE_AFTER_CLOSE"){o();return}if(n instanceof Error){t(`Uncaught exception: ${n.message}`);return}t(`Uncaught exception: ${String(n)}`)},r=n=>{if(n instanceof Error){t(`Unhandled promise rejection: ${n.message}`);return}t(`Unhandled promise rejection: ${String(n)}`)};return process.on("SIGINT",o),process.on("SIGTERM",o),process.on("uncaughtException",s),process.on("unhandledRejection",r),()=>{process.off("SIGINT",o),process.off("SIGTERM",o),process.off("uncaughtException",s),process.off("unhandledRejection",r)}}import oe from"degit";var U=async e=>{let t=x("Downloading template...");try{await oe("teispace/nextjs-starter",{cache:!1,force:!0,verbose:!0}).clone(e),t.succeed("Template downloaded successfully.")}catch(i){throw t.fail("Failed to download template."),i}};import ne from"node:path";var a={NEXT_CONFIG:"next.config.ts",TAILWIND_CONFIG:"tailwind.config.ts",POSTCSS_CONFIG:"postcss.config.mjs",ESLINT_CONFIG:"eslint.config.mjs",TS_CONFIG:"tsconfig.json",PACKAGE_JSON:"package.json",ENV_EXAMPLE:".env.example",GITIGNORE:".gitignore",README:"README.md",LICENSE:"LICENSE",CHANGELOG:"CHANGELOG.md",NVM_RC:".nvmrc",NPM_RC:".npmrc",SRC:"src",APP:"src/app",COMPONENTS:"src/components",LIB:"src/lib",PROVIDERS:"src/providers",STYLES:"src/styles",TYPES:"src/types",UTILS:"src/lib/utils",HOOKS:"src/hooks",SERVICES:"src/services",STORE:"src/store",I18N:"src/i18n",GLOBALS_CSS:"src/styles/globals.css",ROOT_LAYOUT:"src/app/layout.tsx",ROOT_PAGE:"src/app/page.tsx",ROOT_PROVIDER:"src/providers/RootProvider.tsx",PROVIDERS_INDEX:"src/providers/index.ts",COMPONENTS_INDEX:"src/components/index.ts",TYPES_INDEX:"src/types/index.ts",UTILS_INDEX:"src/lib/utils/index.ts",CONFIG_INDEX:"src/lib/config/index.ts",CONSTANTS:"src/lib/config/constants.ts",APP_LOCALES:"src/lib/config/app-locales.ts",MIDDLEWARE:"src/middleware.ts",PROXY:"src/proxy.ts",I18N_TYPES:"src/types/i18n.ts",HTTP_UTILS:"src/lib/utils/http",AXIOS_CLIENT:"src/lib/utils/http/axios-client",FETCH_CLIENT:"src/lib/utils/http/fetch-client",CLIENT_UTILS:"src/lib/utils/http/client-utils.ts",APP_APIS:"src/lib/config/app-apis.ts",STORAGE_SERVICE:"src/services/storage",COUNTER_FEATURE:"src/features/counter",I18N_DIR:"src/i18n",LOCALE_DIR:"src/app/[locale]",ERRORS_DIR:"src/lib/errors",UTILITY_TYPES_DIR:"src/types/utility",COMMON_TYPES_DIR:"src/types/common",GITHUB_DIR:".github",HUSKY_DIR:".husky"};var E={REDUX_TOOLKIT:"@reduxjs/toolkit",REACT_REDUX:"react-redux",REDUX_PERSIST:"redux-persist",REACT_SECURE_STORAGE:"react-secure-storage",NEXT_INTL:"next-intl",NEXT_THEMES:"next-themes",AXIOS:"axios",HUSKY:"husky",COMMITLINT_CLI:"@commitlint/cli",COMMITLINT_CONFIG:"@commitlint/config-conventional",LINT_STAGED:"lint-staged",COMMITIZEN:"commitizen",CZ_CONVENTIONAL_CHANGELOG:"cz-conventional-changelog"};var F=async(e,t)=>{let i=x("Configuring package.json...");try{await N(ne.join(e,a.PACKAGE_JSON),o=>(o.name=t.projectName,o.version=t.version,o.description=t.description,o.author=t.author,delete o.packageManager,t.gitHomepage&&(o.homepage=t.gitHomepage),t.gitIssues&&(o.bugs={url:t.gitIssues}),t.gitRemote&&(o.repository={type:"git",url:t.gitRemote}),t.redux||(delete o.dependencies[E.REDUX_TOOLKIT],delete o.dependencies[E.REACT_REDUX],delete o.dependencies[E.REDUX_PERSIST]),t.httpClient!=="none"||t.reactSecureStorage||delete o.dependencies[E.REACT_SECURE_STORAGE],t.i18n||delete o.dependencies[E.NEXT_INTL],t.darkMode||delete o.dependencies[E.NEXT_THEMES],t.httpClient==="none"?delete o.dependencies[E.AXIOS]:t.httpClient==="fetch"&&delete o.dependencies[E.AXIOS],o)),i.succeed("package.json configured.")}catch(o){throw i.fail("Failed to configure package.json."),o}};import c from"node:path";var k=async(e,t)=>{let i=x("Customizing features...");try{await re(e,t),await ae(e,t),await se(e,t),await ce(e,t),await me(e,t),await le(e),await pe(e),await de(e),i.succeed("Features customized.")}catch(o){throw i.fail("Failed to customize features."),o}},re=async(e,t)=>{let i=c.join(e,a.HTTP_UTILS),o=t.httpClient!=="none"||t.reactSecureStorage;if(t.httpClient==="none"){if(await g(c.join(e,a.AXIOS_CLIENT)),await g(c.join(e,a.FETCH_CLIENT)),o)await m(c.join(i,"index.ts"),`export * from './token-store';
|
|
3
|
+
`),await l(c.join(e,a.CLIENT_UTILS));else{await g(i);let r=c.join(e,a.UTILS_INDEX);if(f(r)){let p=await d(r);p=p.replace(/export \* from '\.\/http';\n/,""),await m(r,p)}await l(c.join(e,a.APP_APIS));let n=c.join(e,a.CONFIG_INDEX);if(f(n)){let p=await d(n);p=p.replace(/export \* from '\.\/app-apis';\n/,""),await m(n,p)}}let s=c.join(e,a.CONSTANTS);if(f(s)){let r=await d(s);r=r.replace(/export const API_RESPONSE_DATA_KEY = 'data';\n/,""),r=r.replace(/export const SAVE_AUTH_TOKENS = false;\n/,""),await m(s,r)}if(await g(c.join(e,a.ERRORS_DIR)),!o){await g(c.join(e,a.COMMON_TYPES_DIR)),await g(c.join(e,a.UTILITY_TYPES_DIR));let r=c.join(e,a.TYPES_INDEX);if(f(r)){let n=await d(r);n=n.replace(/export \* from '\.\/utility';\n/,""),n=n.replace(/export \* from '\.\/common';\n/,""),await m(r,n)}}}else if(t.httpClient==="axios"){await g(c.join(e,a.FETCH_CLIENT));let s=await d(c.join(i,"index.ts"));s=s.replace(/export .* from '\.\/fetch-client';\n/g,""),await m(c.join(i,"index.ts"),s)}else if(t.httpClient==="fetch"){await g(c.join(e,a.AXIOS_CLIENT));let s=await d(c.join(i,"index.ts"));s=s.replace(/export .* from '\.\/axios-client';\n/g,""),await m(c.join(i,"index.ts"),s)}},ae=async(e,t)=>{t.httpClient!=="none"||t.reactSecureStorage||await g(c.join(e,a.STORAGE_SERVICE))},se=async(e,t)=>{if(!t.redux){await g(c.join(e,a.STORE)),await g(c.join(e,a.COUNTER_FEATURE)),await l(c.join(e,"src/providers/StoreProvider.tsx")),await l(c.join(e,"src/components/Count.tsx"));let i=c.join(e,a.PROVIDERS_INDEX),o=await d(i);o=o.replace(/export \* from '\.\/StoreProvider';\n/,""),await m(i,o);let s=c.join(e,a.COMPONENTS_INDEX);if(f(s)){let n=await d(s);n=n.replace(/export \* from '\.\/Count';\n?/,""),await m(s,n)}let r=[c.join(e,a.ROOT_PAGE),c.join(e,"src/app/[locale]/page.tsx")];for(let n of r)if(f(n)){let p=await d(n);p=p.replace(/import\s+\{\s*Count\s*\}\s+from\s+['"]@\/components['"];\n?/,""),p=p.replace(/<Count\s*\/>\n?/g,""),await m(n,p)}}},ce=async(e,t)=>{if(!t.darkMode){await l(c.join(e,"src/providers/CustomThemeProvider.tsx"));let i=c.join(e,a.PROVIDERS_INDEX),o=await d(i);o=o.replace(/export \* from '\.\/CustomThemeProvider';\n/,""),await m(i,o);let s=c.join(e,a.GLOBALS_CSS);if(f(s)){let r=await d(s);r=r.replace(/@custom-variant dark \(.*?\);\n?/,""),await m(s,r)}}},me=async(e,t)=>{if(!t.i18n){await g(c.join(e,a.I18N_DIR)),await g(c.join(e,a.LOCALE_DIR)),await l(c.join(e,a.PROXY)),await l(c.join(e,a.MIDDLEWARE)),await l(c.join(e,a.I18N_TYPES)),await l(c.join(e,a.APP_LOCALES));let i=c.join(e,a.TYPES_INDEX);if(f(i)){let n=await d(i);n=n.replace(/export \* from '\.\/i18n';\n/,""),await m(i,n)}let o=c.join(e,a.CONFIG_INDEX);if(f(o)){let n=await d(o);n=n.replace(/export \* from '\.\/app-locales';\n/,""),await m(o,n)}let s=c.join(e,a.NEXT_CONFIG);if(f(s)){let n=await d(s);n=n.replace(/import createNextIntlPlugin from 'next-intl\/plugin';\n/,""),n=n.replace(/const withNextIntl = createNextIntlPlugin\(\);\n/,""),n=n.replace(/export default withNextIntl\(nextConfig\);/,"export default nextConfig;"),await m(s,n)}let r=c.join(e,"src/components/Count.tsx");if(f(r)){let n=await d(r);n=n.replace(/import\s+\{\s*useTranslations\s*\}\s+from\s+['"]next-intl['"];\n?/,""),n=n.replace(/const\s+t\s*=\s*useTranslations\(['"]Count['"]\);\n?/,""),n=n.replace(/\{t\(['"]increment['"]\)\}/g,"{'Increment'}"),n=n.replace(/\{t\(['"]decrement['"]\)\}/g,"{'Decrement'}"),n=n.replace(/\{t\(['"]incrementByAmount['"]\)\}/g,"{'Increment by Amount'}"),n=n.replace(/\{t\(['"]reset['"]\)\}/g,"{'Reset'}"),await m(r,n)}}},le=async e=>{await l(c.join(e,a.LICENSE))},pe=async e=>{await l(c.join(e,a.CHANGELOG))},de=async e=>{await l(c.join(e,a.NVM_RC)),await l(c.join(e,a.NPM_RC))};import h from"node:path";var $=async(e,t)=>{let i=[],o=[];t.redux&&(i.push("import { StoreProvider } from '@/providers';"),o.push("StoreProvider")),t.darkMode&&(i.push("import { CustomThemeProvider } from '@/providers';"),o.push("CustomThemeProvider")),t.i18n&&(i.push("import { NextIntlClientProvider, AbstractIntlMessages } from 'next-intl';"),i.push("import { SupportedLocale } from '@/types/i18n';"));let s=`'use client';
|
|
4
4
|
${i.join(`
|
|
5
5
|
`)}
|
|
6
6
|
|
|
@@ -14,16 +14,16 @@ export const RootProvider = ({
|
|
|
14
14
|
messages: AbstractIntlMessages;`:""}
|
|
15
15
|
}) => {
|
|
16
16
|
return (
|
|
17
|
-
`,
|
|
18
|
-
${
|
|
19
|
-
</NextIntlClientProvider>`),t.darkMode&&(
|
|
20
|
-
${
|
|
21
|
-
</CustomThemeProvider>`),t.redux&&(
|
|
22
|
-
${
|
|
23
|
-
</StoreProvider>`),
|
|
17
|
+
`,r="{children}";t.i18n&&(r=`<NextIntlClientProvider locale={locale} messages={messages}>
|
|
18
|
+
${r}
|
|
19
|
+
</NextIntlClientProvider>`),t.darkMode&&(r=`<CustomThemeProvider>
|
|
20
|
+
${r}
|
|
21
|
+
</CustomThemeProvider>`),t.redux&&(r=`<StoreProvider>
|
|
22
|
+
${r}
|
|
23
|
+
</StoreProvider>`),r==="{children}"&&(r="<>{children}</>"),s+=` ${r}
|
|
24
24
|
);
|
|
25
25
|
};
|
|
26
|
-
`,await m(h.join(e,
|
|
26
|
+
`,await m(h.join(e,a.ROOT_PROVIDER),s)},H=async(e,t)=>{if(!t.i18n){let i=`import type { Metadata } from 'next';
|
|
27
27
|
import '@/styles/globals.css';
|
|
28
28
|
import { Livvic } from 'next/font/google';
|
|
29
29
|
import { RootProvider } from '@/providers';
|
|
@@ -55,7 +55,7 @@ export default function RootLayout({
|
|
|
55
55
|
</html>
|
|
56
56
|
);
|
|
57
57
|
}
|
|
58
|
-
`;await m(h.join(e,
|
|
58
|
+
`;await m(h.join(e,a.ROOT_LAYOUT),i);let o=`export default function Home() {
|
|
59
59
|
return (
|
|
60
60
|
<div className="flex min-h-screen flex-col items-center justify-center p-24">
|
|
61
61
|
<h1 className="text-4xl font-bold">Welcome to ${t.projectName}</h1>
|
|
@@ -63,8 +63,8 @@ export default function RootLayout({
|
|
|
63
63
|
</div>
|
|
64
64
|
);
|
|
65
65
|
}
|
|
66
|
-
`;await m(h.join(e,
|
|
67
|
-
`};
|
|
66
|
+
`;await m(h.join(e,a.ROOT_PAGE),o)}};import u from"node:path";import{readdir as X}from"node:fs/promises";var z=async(e,t)=>{await ue(e,t),await ge(e,t),await fe(e,t),await Ee(e,t),await Ce(e,t),await Te(e,t),await ye(e,t)},ue=async(e,t)=>{t.preCommitHooks||(await g(u.join(e,a.HUSKY_DIR)),await l(u.join(e,"commitlint.config.mjs")),await l(u.join(e,".lintstagedrc.mjs")),await N(u.join(e,a.PACKAGE_JSON),i=>(delete i.devDependencies[E.HUSKY],delete i.devDependencies[E.COMMITLINT_CLI],delete i.devDependencies[E.COMMITLINT_CONFIG],delete i.devDependencies[E.LINT_STAGED],delete i.scripts.prepare,delete i.scripts.postinstall,delete i.commitlint,delete i["lint-staged"],i)))},ge=async(e,t)=>{t.commitizen||(await l(u.join(e,".czrc")),await N(u.join(e,a.PACKAGE_JSON),i=>(delete i.devDependencies[E.COMMITIZEN],delete i.devDependencies[E.CZ_CONVENTIONAL_CHANGELOG],delete i.config?.commitizen,i.config&&Object.keys(i.config).length===0&&delete i.config,delete i.scripts.commit,i)))},fe=async(e,t)=>{t.ci||await g(u.join(e,".github/workflows"))},Ee=async(e,t)=>{let i=u.join(e,a.GITHUB_DIR);if(!t.keepTemplates)await g(u.join(i,"ISSUE_TEMPLATE")),await l(u.join(i,"PULL_REQUEST_TEMPLATE.md"));else{let o=u.join(i,"ISSUE_TEMPLATE"),s=u.join(i,"PULL_REQUEST_TEMPLATE.md"),r=n=>n.replace(/Teispace/g,t.company).replace(/support@teispace\.com/g,t.email).replace(/Next\.js Starter/g,t.projectName).replace(/\[AUTHOR\]/g,t.author).replace(/\[COMPANY\]/g,t.company).replace(/\[EMAIL\]/g,t.email);if(f(s)){let n=await d(s);n=r(n),await m(s,n)}try{if(f(o)){let n=await X(o);for(let p of n){let y=u.join(o,p),S=await d(y);S=r(S),await m(y,S)}}}catch{}}},Ce=async(e,t)=>{let i=["CODE_OF_CONDUCT.md","CONTRIBUTING.md","SECURITY.md"];for(let o of i)t.communityFiles.includes(o)||await l(u.join(e,o))},Te=async(e,t)=>{if(t.docker){let i=u.join(e,a.ENV_EXAMPLE);if(f(i)){let o=await d(i),s=(r,n)=>{let p=new RegExp(`${r}=.*`);p.test(o)?o=o.replace(p,`${r}=${n}`):o+=`${r}=${n}
|
|
67
|
+
`};s("CONTAINER_NAME",t.containerName||"next-app"),s("IMAGE_NAME",t.imageName||"nextjs-starter"),s("IMAGE_TAG",t.imageTag||"latest"),await m(i,o)}}else{await l(u.join(e,"Dockerfile")),await l(u.join(e,"docker-compose.yml")),await l(u.join(e,".dockerignore"));let i=u.join(e,a.ENV_EXAMPLE);if(f(i)){let o=await d(i);o=o.replace(/# Docker Compose Configuration\n/,""),o=o.replace(/CONTAINER_NAME=.*\n/,""),o=o.replace(/IMAGE_NAME=.*\n/,""),o=o.replace(/IMAGE_TAG=.*\n/,""),await m(i,o)}}},ye=async(e,t)=>{let i=async r=>{let n=await X(r,{withFileTypes:!0}),p=[];for(let y of n){let S=u.join(r,y.name);y.isDirectory()&&y.name!=="node_modules"&&y.name!==".git"?p.push(...await i(S)):y.isFile()&&y.name.toLowerCase()==="readme.md"&&p.push(S)}return p},o=await i(e),s=u.join(e,a.README);for(let r of o)r!==s&&await l(r);if(t.readme){let r=`# ${t.projectName}
|
|
68
68
|
|
|
69
69
|
${t.description}
|
|
70
70
|
|
|
@@ -77,7 +77,7 @@ ${t.packageManager==="npm"?"npm run dev":t.packageManager+" dev"}
|
|
|
77
77
|
\`\`\`
|
|
78
78
|
|
|
79
79
|
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
|
|
80
|
-
`;await m(r
|
|
81
|
-
Cleaning up: Deleting directory ${t.projectName}...`));try{await
|
|
82
|
-
Process interrupted. Cleaning up...`)),await
|
|
80
|
+
`;await m(s,r)}else await l(s)};var Y=e=>{e.command("init").description("Initialize a new Next.js project").argument("[name]","Project name").action(async t=>{await Ie(t)})},Ie=async e=>{b(),T("Welcome to the Teispace Next.js App Creator!"),T("");let t=await A(e),i=xe.resolve(process.cwd(),t.projectName);f(i)&&(console.error(I.red(`Error: Directory ${t.projectName} already exists.`)),process.exit(1));let o=x("Initializing project..."),s=async()=>{if(f(i)){o.stop(),console.log(I.yellow(`
|
|
81
|
+
Cleaning up: Deleting directory ${t.projectName}...`));try{await g(i),console.log(I.green("Cleanup successful."))}catch(n){console.error(I.red(`Failed to clean up directory ${t.projectName}:`),n)}}},r=async()=>{console.log(I.red(`
|
|
82
|
+
Process interrupted. Cleaning up...`)),await s(),process.exit(1)};process.on("SIGINT",r),process.on("SIGTERM",r);try{await U(i),await F(i,t),await k(i,t),o.text="Generating code...",await $(i,t),await H(i,t),o.text="Setting up developer tools...",await z(i,t),o.text="Initializing Git...",await D(i),t.gitRemote&&await j(i,t.gitRemote),o.text="Installing dependencies...",await M(i,t.packageManager),o.text="Formatting and Linting...",await _(i,t.packageManager,"format"),await _(i,t.packageManager,"lint:fix"),process.off("SIGINT",r),process.off("SIGTERM",r),o.succeed(I.green(`Project ${t.projectName} created successfully!`)),T(""),T("To get started:"),T(I.cyan(` cd ${t.projectName}`)),T(I.cyan(` ${t.packageManager==="npm"?"npm run dev":t.packageManager+" dev"}`)),T("")}catch(n){o.fail("Failed to create project."),console.error(n),await s(),process.exit(1)}};import Pe from"picocolors";var V=e=>{e.command("feature [name]").description("Generate a new feature module").action(async()=>{T(Pe.yellow("Feature generation will be available soon!"))})};var J=e=>{Y(e),V(e)};async function we(){G({logger:t=>O(t)});let e=new Se;e.name("next-maker").description("Teispace Next.js Project Generator").version("1.0.0"),J(e),e.parse()}we().catch(e=>{let t=e&&typeof e=="object"&&"message"in e?e.message:String(e);O(`Unexpected error: ${t}`)});
|
|
83
83
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts", "../src/commands/app.ts", "../src/config/spinner.ts", "../src/prompts/create-app.prompt.ts", "../src/core/files.ts", "../src/core/git.ts", "../src/core/package-manager.ts", "../src/config/output.ts", "../src/config/errorHandlers.ts", "../src/services/init/template.service.ts", "../src/services/init/config.service.ts", "../src/config/paths.ts", "../src/config/packages.ts", "../src/services/init/cleanup.service.ts", "../src/services/init/providers.service.ts", "../src/services/init/devtools.service.ts", "../src/commands/feature.ts", "../src/commands/index.ts"],
|
|
4
|
-
"sourcesContent": ["import { Command } from 'commander';\nimport { registerCommands } from './commands/index';\nimport { error, setupCancellationHandlers } from './config';\n\nasync function main() {\n setupCancellationHandlers({ logger: (m: string) => error(m) });\n\n const program = new Command();\n\n program.name('next-maker').description('Teispace Next.js Project Generator').version('1.0.0');\n\n registerCommands(program);\n\n program.parse();\n}\n\nmain().catch((err) => {\n const message =\n err && typeof err === 'object' && 'message' in err ? (err as Error).message : String(err);\n error(`Unexpected error: ${message}`);\n});\n", "import { Command } from 'commander';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport { startSpinner } from '../config/spinner';\nimport { promptForProjectDetails } from '../prompts/create-app.prompt';\nimport { deleteDirectory, fileExists } from '../core/files';\nimport { initializeGit, addRemote } from '../core/git';\nimport { installDependencies, runScript } from '../core/package-manager';\nimport { log, printBanner } from '../config';\nimport { cloneTemplate } from '../services/init/template.service';\nimport { configurePackageJson } from '../services/init/config.service';\nimport { cleanupFeatures } from '../services/init/cleanup.service';\nimport { generateRootProvider, generateLayout } from '../services/init/providers.service';\nimport { setupDevTools } from '../services/init/devtools.service';\n\nexport const registerAppCommand = (program: Command) => {\n program\n .command('init')\n .description('Initialize a new Next.js project')\n .argument('[name]', 'Project name')\n .action(async (name) => {\n await createApp(name);\n });\n};\n\nconst createApp = async (initialName?: string): Promise<void> => {\n printBanner();\n log('Welcome to the Teispace Next.js App Creator!');\n log('');\n\n const answers = await promptForProjectDetails(initialName);\n const projectPath = path.resolve(process.cwd(), answers.projectName);\n\n if (fileExists(projectPath)) {\n console.error(pc.red(`Error: Directory ${answers.projectName} already exists.`));\n process.exit(1);\n }\n\n const spinner = startSpinner('Initializing project...');\n\n // Cleanup helper\n const performCleanup = async () => {\n if (fileExists(projectPath)) {\n spinner.stop(); // Stop spinner if running\n console.log(pc.yellow(`\\nCleaning up: Deleting directory ${answers.projectName}...`));\n try {\n await deleteDirectory(projectPath);\n console.log(pc.green('Cleanup successful.'));\n } catch (cleanupErr) {\n console.error(pc.red(`Failed to clean up directory ${answers.projectName}:`), cleanupErr);\n }\n }\n };\n\n // Signal handler\n const handleSignal = async () => {\n console.log(pc.red('\\nProcess interrupted. Cleaning up...'));\n await performCleanup();\n process.exit(1);\n };\n\n // Register signal listeners\n process.on('SIGINT', handleSignal);\n process.on('SIGTERM', handleSignal);\n\n try {\n // 1. Clone template\n await cloneTemplate(projectPath);\n\n // 2. Update package.json\n await configurePackageJson(projectPath, answers);\n\n // 3. Customize Features (Cleanup)\n await cleanupFeatures(projectPath, answers);\n\n // 4. Generate Code (Providers, Layout)\n spinner.text = 'Generating code...';\n await generateRootProvider(projectPath, answers);\n await generateLayout(projectPath, answers);\n\n // 5. Setup DevTools & Community Files\n spinner.text = 'Setting up developer tools...';\n await setupDevTools(projectPath, answers);\n\n // 6. Initialize Git\n spinner.text = 'Initializing Git...';\n await initializeGit(projectPath);\n if (answers.gitRemote) {\n await addRemote(projectPath, answers.gitRemote);\n }\n\n // 7. Install Dependencies\n spinner.text = 'Installing dependencies...';\n await installDependencies(projectPath, answers.packageManager);\n\n // 8. Format and Lint\n spinner.text = 'Formatting and Linting...';\n await runScript(projectPath, answers.packageManager, 'format');\n await runScript(projectPath, answers.packageManager, 'lint:fix');\n\n // Remove signal listeners on success\n process.off('SIGINT', handleSignal);\n process.off('SIGTERM', handleSignal);\n\n spinner.succeed(pc.green(`Project ${answers.projectName} created successfully!`));\n log('');\n log('To get started:');\n log(pc.cyan(` cd ${answers.projectName}`));\n log(\n pc.cyan(\n ` ${answers.packageManager === 'npm' ? 'npm run dev' : answers.packageManager + ' dev'}`,\n ),\n );\n log('');\n } catch (err) {\n spinner.fail('Failed to create project.');\n console.error(err);\n await performCleanup();\n process.exit(1);\n }\n};\n", "import ora, { Ora, Options } from 'ora';\n\n// Create and start a spinner\nexport function startSpinner(text = '', options?: Options): Ora {\n const spinner = ora({ text, ...options });\n spinner.start();\n return spinner;\n}\n\n// Stop a spinner without changing its status\nexport function stopSpinner(spinner: Ora): void {\n spinner.stop();\n}\n\n// Mark spinner as succeeded\nexport function succeedSpinner(spinner: Ora, text?: string): void {\n spinner.succeed(text);\n}\n\n// Mark spinner as failed\nexport function failSpinner(spinner: Ora, text?: string): void {\n spinner.fail(text);\n}\n\n// Run an async function while showing a spinner; auto-succeed/fail\nexport async function withSpinner<T>(\n text: string,\n fn: () => Promise<T>,\n {\n successText,\n failText,\n options,\n }: { successText?: string; failText?: string; options?: Options } = {},\n): Promise<T> {\n const spinner = startSpinner(text, options);\n try {\n const result = await fn();\n spinner.succeed(successText ?? 'Done');\n return result;\n } catch (err) {\n spinner.fail(failText ?? 'Failed');\n throw err;\n }\n}\n\nexport default startSpinner;\n", "import Enquirer from 'enquirer';\nimport { PackageManager } from '../core/package-manager';\n\nconst { prompt } = Enquirer;\n\ntype PromptContext = {\n state?: { answers?: Partial<ProjectPrompts> };\n enquirer?: { answers?: Partial<ProjectPrompts> };\n};\n\nexport interface ProjectPrompts {\n projectName: string;\n description: string;\n author: string;\n version: string;\n packageManager: PackageManager;\n gitRemote: string;\n gitIssues: string;\n gitHomepage: string;\n httpClient: 'axios' | 'fetch' | 'both' | 'none';\n reactSecureStorage?: boolean;\n email: string;\n company: string;\n keepTemplates: boolean;\n darkMode: boolean;\n redux: boolean;\n i18n: boolean;\n communityFiles: string[];\n readme: boolean;\n docker: boolean;\n containerName?: string;\n imageName?: string;\n imageTag?: string;\n ci: boolean;\n preCommitHooks: boolean;\n commitizen: boolean;\n}\n\nexport const promptForProjectDetails = async (initialName?: string): Promise<ProjectPrompts> => {\n const response = await prompt<ProjectPrompts>([\n {\n type: 'input',\n name: 'projectName',\n message: 'What is the project name?',\n initial: initialName || 'my-app',\n skip: !!initialName,\n validate: (value: string) => {\n if (!/^[a-z0-9-_]+$/.test(value)) {\n return 'Project name must be lowercase and contain only alphanumeric characters, hyphens, and underscores.';\n }\n return true;\n },\n },\n {\n type: 'input',\n name: 'description',\n message: 'Project description:',\n initial: 'A Next.js application',\n },\n {\n type: 'input',\n name: 'author',\n message: 'Author:',\n initial: 'Teispace',\n },\n {\n type: 'input',\n name: 'version',\n message: 'Version:',\n initial: '0.1.0',\n validate: (value: string) => {\n if (!/^\\d+\\.\\d+\\.\\d+$/.test(value)) {\n return 'Version must be a valid semantic version (x.y.z).';\n }\n return true;\n },\n },\n {\n type: 'input',\n name: 'email',\n message: 'Support email:',\n initial: 'support@example.com',\n validate: (value: string) => {\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) {\n return 'Please enter a valid email address.';\n }\n return true;\n },\n },\n {\n type: 'input',\n name: 'company',\n message: 'Company name:',\n initial: 'Teispace',\n },\n {\n type: 'select',\n name: 'packageManager',\n message: 'Which package manager would you like to use?',\n choices: ['npm', 'yarn', 'pnpm', 'bun'],\n initial: 1,\n },\n {\n type: 'input',\n name: 'gitRemote',\n message: 'Git remote origin URL (optional):',\n validate: (value: string) => {\n if (value && !/^(https?:\\/\\/)?([\\da-z.-]+)\\.([a-z.]{2,6})([/\\w .-]*)*\\/?$/.test(value)) {\n return 'Please enter a valid URL.';\n }\n return true;\n },\n },\n {\n type: 'input',\n name: 'gitIssues',\n message: 'Git issues URL (optional):',\n validate: (value: string) => {\n if (value && !/^(https?:\\/\\/)?([\\da-z.-]+)\\.([a-z.]{2,6})([/\\w .-]*)*\\/?$/.test(value)) {\n return 'Please enter a valid URL.';\n }\n return true;\n },\n },\n {\n type: 'input',\n name: 'gitHomepage',\n message: 'Project homepage URL (optional):',\n validate: (value: string) => {\n if (value && !/^(https?:\\/\\/)?([\\da-z.-]+)\\.([a-z.]{2,6})([/\\w .-]*)*\\/?$/.test(value)) {\n return 'Please enter a valid URL.';\n }\n return true;\n },\n },\n {\n type: 'confirm',\n name: 'keepTemplates',\n message: 'Do you want to keep GitHub issue and pull request templates?',\n initial: true,\n },\n {\n type: 'select',\n name: 'httpClient',\n message: 'Which HTTP client do you want to use?',\n choices: ['axios', 'fetch', 'both', 'none'],\n initial: 0,\n },\n {\n type: 'confirm',\n name: 'reactSecureStorage',\n message: 'Do you want to include react-secure-storage?',\n initial: true,\n skip: function (this: PromptContext) {\n // Access answers from the prompt instance safely across versions\n const answers = this.state?.answers ?? this.enquirer?.answers ?? {};\n // If HTTP client is selected (not 'none'), we skip this question (it will be auto-included)\n return !!(answers.httpClient && answers.httpClient !== 'none');\n },\n },\n {\n type: 'confirm',\n name: 'darkMode',\n message: 'Do you want to include Dark Mode (Tailwind + next-themes)?',\n initial: true,\n },\n {\n type: 'confirm',\n name: 'redux',\n message: 'Do you want to include Redux Toolkit?',\n initial: true,\n },\n {\n type: 'confirm',\n name: 'i18n',\n message: 'Do you want to include Internationalization (next-intl)?',\n initial: true,\n },\n {\n type: 'multiselect',\n name: 'communityFiles',\n message: 'Select community files to include:',\n choices: [\n { name: 'CODE_OF_CONDUCT.md', value: 'CODE_OF_CONDUCT.md' },\n { name: 'CONTRIBUTING.md', value: 'CONTRIBUTING.md' },\n { name: 'SECURITY.md', value: 'SECURITY.md' },\n ],\n initial: ['CODE_OF_CONDUCT.md', 'CONTRIBUTING.md', 'SECURITY.md'],\n },\n {\n type: 'confirm',\n name: 'readme',\n message: 'Do you want to create a README.md?',\n initial: true,\n },\n {\n type: 'confirm',\n name: 'docker',\n message: 'Do you want to include Docker configuration?',\n initial: true,\n },\n {\n type: 'input',\n name: 'containerName',\n message: 'Docker Container Name:',\n initial: 'next-app',\n skip: function (this: PromptContext) {\n const answers = this.state?.answers ?? this.enquirer?.answers ?? {};\n return !answers.docker;\n },\n validate: (value: string) => {\n if (!/^[a-zA-Z0-9][a-zA-Z0-9_.-]*$/.test(value)) {\n return 'Invalid Docker container name.';\n }\n return true;\n },\n },\n {\n type: 'input',\n name: 'imageName',\n message: 'Docker Image Name:',\n initial: 'nextjs-starter',\n skip: function (this: PromptContext) {\n const answers = this.state?.answers ?? this.enquirer?.answers ?? {};\n return !answers.docker;\n },\n validate: (value: string) => {\n if (!/^[a-z0-9]+(?:[._-][a-z0-9]+)*$/.test(value)) {\n return 'Invalid Docker image name (must be lowercase).';\n }\n return true;\n },\n },\n {\n type: 'input',\n name: 'imageTag',\n message: 'Docker Image Tag:',\n initial: 'latest',\n skip: function (this: PromptContext) {\n const answers = this.state?.answers ?? this.enquirer?.answers ?? {};\n return !answers.docker;\n },\n validate: (value: string) => {\n if (!/^[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,127}$/.test(value)) {\n return 'Invalid Docker image tag.';\n }\n return true;\n },\n },\n {\n type: 'confirm',\n name: 'ci',\n message: 'Do you want to include GitHub Actions (CI/CD)?',\n initial: true,\n },\n {\n type: 'confirm',\n name: 'preCommitHooks',\n message: 'Do you want to setup pre-commit hooks (Husky, Commitlint, Lint-staged)?',\n initial: true,\n },\n {\n type: 'confirm',\n name: 'commitizen',\n message: 'Do you want to setup Commitizen?',\n initial: true,\n },\n ] as any);\n\n return response;\n};\n", "import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { existsSync } from 'node:fs';\n\nexport const readFile = async (filePath: string): Promise<string> => {\n return fs.readFile(filePath, 'utf-8');\n};\n\nexport const writeFile = async (filePath: string, content: string): Promise<void> => {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, content, 'utf-8');\n};\n\nexport const deleteFile = async (filePath: string): Promise<void> => {\n if (existsSync(filePath)) {\n await fs.unlink(filePath);\n }\n};\n\nexport const deleteDirectory = async (dirPath: string): Promise<void> => {\n if (existsSync(dirPath)) {\n await fs.rm(dirPath, { recursive: true, force: true });\n }\n};\n\nexport const updateJson = async <T = any>(\n filePath: string,\n update: (json: T) => T,\n): Promise<void> => {\n const content = await readFile(filePath);\n const json = JSON.parse(content) as T;\n const updatedJson = update(json);\n await writeFile(filePath, JSON.stringify(updatedJson, null, 2));\n};\n\nexport const fileExists = (filePath: string): boolean => {\n return existsSync(filePath);\n};\n", "import { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execAsync = promisify(exec);\n\nexport const initializeGit = async (cwd: string): Promise<void> => {\n try {\n await execAsync('git init', { cwd });\n await execAsync('git add .', { cwd });\n await execAsync('git commit -m \"Initial commit from @teispace/next-maker\"', { cwd });\n } catch (error) {\n // Ignore error if git is not installed or fails\n console.warn('Failed to initialize git repository', error);\n }\n};\n\nexport const addRemote = async (cwd: string, url: string): Promise<void> => {\n try {\n await execAsync(`git remote add origin ${url}`, { cwd });\n } catch (error) {\n console.warn('Failed to add remote origin', error);\n }\n};\n\nexport const isGitInstalled = async (): Promise<boolean> => {\n try {\n await execAsync('git --version');\n return true;\n } catch {\n return false;\n }\n};\n", "import { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execAsync = promisify(exec);\n\nexport type PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun';\n\nexport const installDependencies = async (cwd: string, manager: PackageManager): Promise<void> => {\n const command = `${manager} install`;\n try {\n await execAsync(command, { cwd });\n } catch (error) {\n throw new Error(`Failed to install dependencies with ${manager}: ${error}`);\n }\n};\n\nexport const runScript = async (\n cwd: string,\n manager: PackageManager,\n script: string,\n): Promise<void> => {\n const command = `${manager} run ${script}`;\n try {\n await execAsync(command, { cwd });\n } catch (error) {\n // We don't want to fail the whole setup if linting fails, just warn\n console.warn(`Warning: Failed to run script '${script}': ${error}`);\n }\n};\n\nexport const getPackageManager = (): PackageManager => {\n const userAgent = process.env.npm_config_user_agent;\n if (userAgent) {\n if (userAgent.startsWith('yarn')) return 'yarn';\n if (userAgent.startsWith('pnpm')) return 'pnpm';\n if (userAgent.startsWith('bun')) return 'bun';\n }\n return 'npm';\n};\n", "import pc from 'picocolors';\n\n// Define a type for allowed colors explicitly\nexport type Color =\n | 'reset'\n | 'red'\n | 'green'\n | 'yellow'\n | 'blue'\n | 'cyan'\n | 'magenta'\n | 'white'\n | 'gray'\n | 'bright'\n | 'dim';\n\nconst colorMap: Record<Color, (s: string) => string> = {\n reset: (s: string) => s,\n red: pc.red,\n green: pc.green,\n yellow: pc.yellow,\n blue: pc.blue,\n cyan: pc.cyan,\n magenta: pc.magenta,\n white: pc.white,\n gray: pc.gray,\n bright: pc.bold,\n dim: pc.dim,\n};\n\n// Print with color\nexport function print(message: string, color: Color = 'reset'): void {\n const colorFn = colorMap[color] ?? ((text: string) => text);\n console.log(colorFn(message));\n}\n\n// Print section header\nexport function printHeader(title: string): void {\n console.log('');\n print('\u2550'.repeat(60), 'cyan');\n print(` ${title}`, 'bright');\n print('\u2550'.repeat(60), 'cyan');\n console.log('');\n}\n\n// Print success message\nexport function success(message: string): void {\n print(`\u2713 ${message}`, 'green');\n}\n\n// Print error message\nexport function error(message: string): void {\n print(`\u2716 ${message}`, 'red');\n}\n\n// Print warning message\nexport function warning(message: string): void {\n print(`\u26A0 ${message}`, 'yellow');\n}\n\n// Print info message\nexport function info(message: string): void {\n print(`\u2139 ${message}`, 'cyan');\n}\n\nexport function log(message: string): void {\n print(message);\n}\n\n// Print banner\nexport function printBanner(): void {\n console.log('');\n print('\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557', 'cyan');\n print('\u2551 \u2551', 'cyan');\n print('\u2551 \uD83D\uDE80 Create Teispace Next.js App \uD83D\uDE80 \u2551', 'cyan');\n print('\u2551 \u2551', 'cyan');\n print('\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D', 'cyan');\n console.log('');\n}\n", "export type SetupOptions = {\n logger?: (msg: string) => void;\n exitOnCancel?: boolean;\n};\n\nexport function setupCancellationHandlers(options?: SetupOptions): () => void {\n const {\n logger = (m: string) => console.error(m),\n exitOnCancel = process.env.NODE_ENV !== 'test',\n } = options ?? {};\n\n const onCancel = (): void => {\n console.log('');\n console.log('');\n logger('Setup cancelled by user');\n console.log('');\n if (exitOnCancel) process.exit(0);\n };\n\n const onUncaught = (err: unknown): void => {\n if (err !== null && typeof err === 'object' && 'code' in err) {\n const maybeErrWithCode = err as { code?: unknown };\n if (maybeErrWithCode.code === 'ERR_USE_AFTER_CLOSE') {\n onCancel();\n return;\n }\n }\n\n // Log uncaught exceptions instead of throwing so the CLI can report\n // the error and exit gracefully when appropriate.\n if (err instanceof Error) {\n logger(`Uncaught exception: ${err.message}`);\n return;\n }\n logger(`Uncaught exception: ${String(err)}`);\n };\n\n const onRejection = (reason: unknown): void => {\n // Log unhandled promise rejections rather than letting them crash the\n // process. This converts the reason to a readable string safely.\n if (reason instanceof Error) {\n logger(`Unhandled promise rejection: ${reason.message}`);\n return;\n }\n logger(`Unhandled promise rejection: ${String(reason)}`);\n };\n\n process.on('SIGINT', onCancel);\n process.on('SIGTERM', onCancel);\n process.on('uncaughtException', onUncaught);\n process.on('unhandledRejection', onRejection as (...args: unknown[]) => void);\n\n // Return a cleanup function to remove listeners (useful in tests).\n return (): void => {\n process.off('SIGINT', onCancel);\n process.off('SIGTERM', onCancel);\n process.off('uncaughtException', onUncaught);\n process.off('unhandledRejection', onRejection as (...args: unknown[]) => void);\n };\n}\n\nexport default setupCancellationHandlers;\n", "import degit from 'degit';\nimport { startSpinner } from '../../config/spinner';\n\nexport const cloneTemplate = async (projectPath: string): Promise<void> => {\n const spinner = startSpinner('Downloading template...');\n try {\n const emitter = degit('teispace/nextjs-starter', {\n cache: false,\n force: true,\n verbose: true,\n });\n await emitter.clone(projectPath);\n spinner.succeed('Template downloaded successfully.');\n } catch (error) {\n spinner.fail('Failed to download template.');\n throw error;\n }\n};\n", "import path from 'node:path';\nimport { updateJson } from '../../core/files';\nimport { ProjectPrompts } from '../../prompts/create-app.prompt';\nimport { startSpinner } from '../../config/spinner';\nimport { PROJECT_PATHS } from '../../config/paths';\nimport { PACKAGES } from '../../config/packages';\n\nexport const configurePackageJson = async (\n projectPath: string,\n answers: ProjectPrompts,\n): Promise<void> => {\n const spinner = startSpinner('Configuring package.json...');\n try {\n await updateJson(path.join(projectPath, PROJECT_PATHS.PACKAGE_JSON), (pkg) => {\n pkg.name = answers.projectName;\n pkg.version = answers.version;\n pkg.description = answers.description;\n pkg.author = answers.author;\n\n // Remove packageManager field to avoid \"configured to use yarn\" errors\n // and let the user's environment handle it.\n delete pkg.packageManager;\n\n if (answers.gitHomepage) pkg.homepage = answers.gitHomepage;\n if (answers.gitIssues) pkg.bugs = { url: answers.gitIssues };\n if (answers.gitRemote) pkg.repository = { type: 'git', url: answers.gitRemote };\n\n // Remove dependencies based on choices\n if (!answers.redux) {\n delete pkg.dependencies[PACKAGES.REDUX_TOOLKIT];\n delete pkg.dependencies[PACKAGES.REACT_REDUX];\n delete pkg.dependencies[PACKAGES.REDUX_PERSIST];\n }\n\n // Handle react-secure-storage\n const keepSecureStorage = answers.httpClient !== 'none' || answers.reactSecureStorage;\n if (!keepSecureStorage) {\n delete pkg.dependencies[PACKAGES.REACT_SECURE_STORAGE];\n }\n if (!answers.i18n) {\n delete pkg.dependencies[PACKAGES.NEXT_INTL];\n }\n if (!answers.darkMode) {\n delete pkg.dependencies[PACKAGES.NEXT_THEMES];\n }\n if (answers.httpClient === 'none') {\n delete pkg.dependencies[PACKAGES.AXIOS];\n } else if (answers.httpClient === 'fetch') {\n delete pkg.dependencies[PACKAGES.AXIOS];\n }\n\n return pkg;\n });\n spinner.succeed('package.json configured.');\n } catch (error) {\n spinner.fail('Failed to configure package.json.');\n throw error;\n }\n};\n", "export const PROJECT_PATHS = {\n // Config\n NEXT_CONFIG: 'next.config.ts',\n TAILWIND_CONFIG: 'tailwind.config.ts',\n POSTCSS_CONFIG: 'postcss.config.mjs',\n ESLINT_CONFIG: 'eslint.config.mjs',\n TS_CONFIG: 'tsconfig.json',\n PACKAGE_JSON: 'package.json',\n ENV_EXAMPLE: '.env.example',\n GITIGNORE: '.gitignore',\n README: 'README.md',\n LICENSE: 'LICENSE',\n CHANGELOG: 'CHANGELOG.md',\n NVM_RC: '.nvmrc',\n NPM_RC: '.npmrc',\n\n // Source\n SRC: 'src',\n APP: 'src/app',\n COMPONENTS: 'src/components',\n LIB: 'src/lib',\n PROVIDERS: 'src/providers',\n STYLES: 'src/styles',\n TYPES: 'src/types',\n UTILS: 'src/lib/utils',\n HOOKS: 'src/hooks',\n SERVICES: 'src/services',\n STORE: 'src/store',\n I18N: 'src/i18n',\n\n // Specific Files\n GLOBALS_CSS: 'src/styles/globals.css',\n ROOT_LAYOUT: 'src/app/layout.tsx',\n ROOT_PAGE: 'src/app/page.tsx',\n ROOT_PROVIDER: 'src/providers/RootProvider.tsx',\n PROVIDERS_INDEX: 'src/providers/index.ts',\n COMPONENTS_INDEX: 'src/components/index.ts',\n TYPES_INDEX: 'src/types/index.ts',\n UTILS_INDEX: 'src/lib/utils/index.ts',\n CONFIG_INDEX: 'src/lib/config/index.ts',\n CONSTANTS: 'src/lib/config/constants.ts',\n APP_LOCALES: 'src/lib/config/app-locales.ts',\n MIDDLEWARE: 'src/middleware.ts',\n PROXY: 'src/proxy.ts',\n I18N_TYPES: 'src/types/i18n.ts',\n\n // Directories to Cleanup\n HTTP_UTILS: 'src/lib/utils/http',\n AXIOS_CLIENT: 'src/lib/utils/http/axios-client',\n FETCH_CLIENT: 'src/lib/utils/http/fetch-client',\n STORAGE_SERVICE: 'src/services/storage',\n COUNTER_FEATURE: 'src/features/counter',\n I18N_DIR: 'src/i18n',\n LOCALE_DIR: 'src/app/[locale]',\n ERRORS_DIR: 'src/lib/errors',\n UTILITY_TYPES_DIR: 'src/types/utility',\n COMMON_TYPES_DIR: 'src/types/common',\n GITHUB_DIR: '.github',\n HUSKY_DIR: '.husky',\n} as const;\n", "export const PACKAGES = {\n // Dependencies\n REDUX_TOOLKIT: '@reduxjs/toolkit',\n REACT_REDUX: 'react-redux',\n REDUX_PERSIST: 'redux-persist',\n REACT_SECURE_STORAGE: 'react-secure-storage',\n NEXT_INTL: 'next-intl',\n NEXT_THEMES: 'next-themes',\n AXIOS: 'axios',\n\n // Dev Dependencies\n HUSKY: 'husky',\n COMMITLINT_CLI: '@commitlint/cli',\n COMMITLINT_CONFIG: '@commitlint/config-conventional',\n LINT_STAGED: 'lint-staged',\n COMMITIZEN: 'commitizen',\n CZ_CONVENTIONAL_CHANGELOG: 'cz-conventional-changelog',\n} as const;\n", "import path from 'node:path';\nimport { deleteDirectory, deleteFile, fileExists, readFile, writeFile } from '../../core/files';\nimport { ProjectPrompts } from '../../prompts/create-app.prompt';\nimport { startSpinner } from '../../config/spinner';\n\nimport { PROJECT_PATHS } from '../../config/paths';\n\n// ... (imports)\n\nexport const cleanupFeatures = async (\n projectPath: string,\n answers: ProjectPrompts,\n): Promise<void> => {\n const spinner = startSpinner('Customizing features...');\n try {\n await cleanupHttpClient(projectPath, answers);\n await cleanupSecureStorage(projectPath, answers);\n await cleanupRedux(projectPath, answers);\n await cleanupDarkMode(projectPath, answers);\n await cleanupI18n(projectPath, answers);\n await cleanupLicense(projectPath);\n await cleanupChangelog(projectPath);\n await cleanupConfig(projectPath);\n spinner.succeed('Features customized.');\n } catch (error) {\n spinner.fail('Failed to customize features.');\n throw error;\n }\n};\n\nconst cleanupHttpClient = async (projectPath: string, answers: ProjectPrompts): Promise<void> => {\n const httpUtilsPath = path.join(projectPath, PROJECT_PATHS.HTTP_UTILS);\n const keepSecureStorage = answers.httpClient !== 'none' || answers.reactSecureStorage;\n\n if (answers.httpClient === 'none') {\n await deleteDirectory(path.join(projectPath, PROJECT_PATHS.AXIOS_CLIENT));\n await deleteDirectory(path.join(projectPath, PROJECT_PATHS.FETCH_CLIENT));\n\n if (keepSecureStorage) {\n await writeFile(path.join(httpUtilsPath, 'index.ts'), \"export * from './token-store';\\n\");\n } else {\n await deleteDirectory(httpUtilsPath);\n const utilsIndexPath = path.join(projectPath, PROJECT_PATHS.UTILS_INDEX);\n if (fileExists(utilsIndexPath)) {\n let content = await readFile(utilsIndexPath);\n content = content.replace(/export \\* from '\\.\\/http';\\n/, '');\n await writeFile(utilsIndexPath, content);\n }\n }\n\n // Remove API constants\n const constantsPath = path.join(projectPath, PROJECT_PATHS.CONSTANTS);\n if (fileExists(constantsPath)) {\n let content = await readFile(constantsPath);\n content = content.replace(/export const API_RESPONSE_DATA_KEY = 'data';\\n/, '');\n content = content.replace(/export const SAVE_AUTH_TOKENS = false;\\n/, '');\n await writeFile(constantsPath, content);\n }\n\n // Remove errors and types\n await deleteDirectory(path.join(projectPath, PROJECT_PATHS.ERRORS_DIR));\n await deleteDirectory(path.join(projectPath, PROJECT_PATHS.UTILITY_TYPES_DIR));\n await deleteDirectory(path.join(projectPath, PROJECT_PATHS.COMMON_TYPES_DIR));\n\n // Update types/index.ts\n const typesIndexPath = path.join(projectPath, PROJECT_PATHS.TYPES_INDEX);\n if (fileExists(typesIndexPath)) {\n let content = await readFile(typesIndexPath);\n content = content.replace(/export \\* from '\\.\\/utility';\\n/, '');\n content = content.replace(/export \\* from '\\.\\/common';\\n/, '');\n await writeFile(typesIndexPath, content);\n }\n } else if (answers.httpClient === 'axios') {\n await deleteDirectory(path.join(projectPath, PROJECT_PATHS.FETCH_CLIENT));\n let content = await readFile(path.join(httpUtilsPath, 'index.ts'));\n content = content.replace(/export .* from '\\.\\/fetch-client';\\n/g, '');\n await writeFile(path.join(httpUtilsPath, 'index.ts'), content);\n } else if (answers.httpClient === 'fetch') {\n await deleteDirectory(path.join(projectPath, PROJECT_PATHS.AXIOS_CLIENT));\n let content = await readFile(path.join(httpUtilsPath, 'index.ts'));\n content = content.replace(/export .* from '\\.\\/axios-client';\\n/g, '');\n await writeFile(path.join(httpUtilsPath, 'index.ts'), content);\n }\n};\n\nconst cleanupSecureStorage = async (\n projectPath: string,\n answers: ProjectPrompts,\n): Promise<void> => {\n const keepSecureStorage = answers.httpClient !== 'none' || answers.reactSecureStorage;\n if (!keepSecureStorage) {\n await deleteDirectory(path.join(projectPath, PROJECT_PATHS.STORAGE_SERVICE));\n }\n};\n\nconst cleanupRedux = async (projectPath: string, answers: ProjectPrompts): Promise<void> => {\n if (!answers.redux) {\n await deleteDirectory(path.join(projectPath, PROJECT_PATHS.STORE));\n await deleteDirectory(path.join(projectPath, PROJECT_PATHS.COUNTER_FEATURE));\n await deleteFile(path.join(projectPath, 'src/providers/StoreProvider.tsx'));\n await deleteFile(path.join(projectPath, 'src/components/Count.tsx'));\n\n const providersIndexPath = path.join(projectPath, PROJECT_PATHS.PROVIDERS_INDEX);\n let providersIndexContent = await readFile(providersIndexPath);\n providersIndexContent = providersIndexContent.replace(\n /export \\* from '\\.\\/StoreProvider';\\n/,\n '',\n );\n await writeFile(providersIndexPath, providersIndexContent);\n\n const componentsIndexPath = path.join(projectPath, PROJECT_PATHS.COMPONENTS_INDEX);\n if (fileExists(componentsIndexPath)) {\n let componentsIndexContent = await readFile(componentsIndexPath);\n componentsIndexContent = componentsIndexContent.replace(/export \\* from '\\.\\/Count';\\n?/, '');\n await writeFile(componentsIndexPath, componentsIndexContent);\n }\n }\n};\n\nconst cleanupDarkMode = async (projectPath: string, answers: ProjectPrompts): Promise<void> => {\n if (!answers.darkMode) {\n await deleteFile(path.join(projectPath, 'src/providers/CustomThemeProvider.tsx'));\n const providersIndexPath = path.join(projectPath, PROJECT_PATHS.PROVIDERS_INDEX);\n let providersIndexContent = await readFile(providersIndexPath);\n providersIndexContent = providersIndexContent.replace(\n /export \\* from '\\.\\/CustomThemeProvider';\\n/,\n '',\n );\n await writeFile(providersIndexPath, providersIndexContent);\n\n const globalsCssPath = path.join(projectPath, PROJECT_PATHS.GLOBALS_CSS);\n if (fileExists(globalsCssPath)) {\n let cssContent = await readFile(globalsCssPath);\n cssContent = cssContent.replace(/@custom-variant dark \\(.*?\\);\\n?/, '');\n await writeFile(globalsCssPath, cssContent);\n }\n }\n};\n\nconst cleanupI18n = async (projectPath: string, answers: ProjectPrompts): Promise<void> => {\n if (!answers.i18n) {\n await deleteDirectory(path.join(projectPath, PROJECT_PATHS.I18N_DIR));\n await deleteDirectory(path.join(projectPath, PROJECT_PATHS.LOCALE_DIR));\n await deleteFile(path.join(projectPath, PROJECT_PATHS.PROXY));\n await deleteFile(path.join(projectPath, PROJECT_PATHS.MIDDLEWARE));\n await deleteFile(path.join(projectPath, PROJECT_PATHS.I18N_TYPES));\n await deleteFile(path.join(projectPath, PROJECT_PATHS.APP_LOCALES));\n\n const typesIndexPath = path.join(projectPath, PROJECT_PATHS.TYPES_INDEX);\n if (fileExists(typesIndexPath)) {\n let content = await readFile(typesIndexPath);\n content = content.replace(/export \\* from '\\.\\/i18n';\\n/, '');\n await writeFile(typesIndexPath, content);\n }\n\n const configIndexPath = path.join(projectPath, PROJECT_PATHS.CONFIG_INDEX);\n if (fileExists(configIndexPath)) {\n let content = await readFile(configIndexPath);\n content = content.replace(/export \\* from '\\.\\/app-locales';\\n/, '');\n await writeFile(configIndexPath, content);\n }\n\n const nextConfigPath = path.join(projectPath, PROJECT_PATHS.NEXT_CONFIG);\n if (fileExists(nextConfigPath)) {\n let configContent = await readFile(nextConfigPath);\n configContent = configContent.replace(\n /import createNextIntlPlugin from 'next-intl\\/plugin';\\n/,\n '',\n );\n configContent = configContent.replace(/const withNextIntl = createNextIntlPlugin\\(\\);\\n/, '');\n configContent = configContent.replace(\n /export default withNextIntl\\(nextConfig\\);/,\n 'export default nextConfig;',\n );\n await writeFile(nextConfigPath, configContent);\n }\n }\n};\n\nconst cleanupLicense = async (projectPath: string): Promise<void> => {\n await deleteFile(path.join(projectPath, PROJECT_PATHS.LICENSE));\n};\n\nconst cleanupChangelog = async (projectPath: string): Promise<void> => {\n await deleteFile(path.join(projectPath, PROJECT_PATHS.CHANGELOG));\n};\n\nconst cleanupConfig = async (projectPath: string): Promise<void> => {\n await deleteFile(path.join(projectPath, PROJECT_PATHS.NVM_RC));\n await deleteFile(path.join(projectPath, PROJECT_PATHS.NPM_RC));\n};\n", "import path from 'node:path';\nimport { writeFile } from '../../core/files';\nimport { ProjectPrompts } from '../../prompts/create-app.prompt';\nimport { PROJECT_PATHS } from '../../config/paths';\n\nexport const generateRootProvider = async (\n projectPath: string,\n answers: ProjectPrompts,\n): Promise<void> => {\n const imports: string[] = [];\n const providers: string[] = [];\n\n if (answers.redux) {\n imports.push(\"import { StoreProvider } from '@/providers';\");\n providers.push('StoreProvider');\n }\n\n if (answers.darkMode) {\n imports.push(\"import { CustomThemeProvider } from '@/providers';\");\n providers.push('CustomThemeProvider');\n }\n\n if (answers.i18n) {\n imports.push(\"import { NextIntlClientProvider, AbstractIntlMessages } from 'next-intl';\");\n imports.push(\"import { SupportedLocale } from '@/types/i18n';\");\n }\n\n let rootProviderContent = `'use client';\n${imports.join('\\n')}\n\nexport const RootProvider = ({\n children,\n ${answers.i18n ? 'locale,\\n messages,' : ''}\n}: {\n children: React.ReactNode;\n ${answers.i18n ? 'locale: SupportedLocale;\\n messages: AbstractIntlMessages;' : ''}\n}) => {\n return (\n`;\n\n // Build the nesting\n let content = '{children}';\n\n if (answers.i18n) {\n content = `<NextIntlClientProvider locale={locale} messages={messages}>\n ${content}\n </NextIntlClientProvider>`;\n }\n\n if (answers.darkMode) {\n content = `<CustomThemeProvider>\n ${content}\n </CustomThemeProvider>`;\n }\n\n if (answers.redux) {\n content = `<StoreProvider>\n ${content}\n </StoreProvider>`;\n }\n\n // If no providers are wrapped, ensure we return a valid JSX element (Fragment)\n if (content === '{children}') {\n content = `<>{children}</>`;\n }\n\n rootProviderContent += ` ${content}\n );\n};\n`;\n\n await writeFile(path.join(projectPath, PROJECT_PATHS.ROOT_PROVIDER), rootProviderContent);\n};\n\nexport const generateLayout = async (\n projectPath: string,\n answers: ProjectPrompts,\n): Promise<void> => {\n if (!answers.i18n) {\n const basicLayout = `import type { Metadata } from 'next';\nimport '@/styles/globals.css';\nimport { Livvic } from 'next/font/google';\nimport { RootProvider } from '@/providers';\n\nconst livvic = Livvic({\n subsets: ['latin'],\n variable: '--font-livvic',\n weight: ['100', '200', '300', '400', '500', '600', '700', '900'],\n display: 'swap',\n});\n\nexport const metadata: Metadata = {\n title: '${answers.projectName}',\n description: '${answers.description}',\n};\n\nexport default function RootLayout({\n children,\n}: Readonly<{\n children: React.ReactNode;\n}>) {\n return (\n <html lang=\"en\" suppressHydrationWarning={true}>\n <body className={\\`\\${livvic.variable} bg-light dark:bg-dark antialiased\\`}>\n <RootProvider>\n {children}\n </RootProvider>\n </body>\n </html>\n );\n}\n`;\n await writeFile(path.join(projectPath, PROJECT_PATHS.ROOT_LAYOUT), basicLayout);\n\n const basicPage = `export default function Home() {\n return (\n <div className=\"flex min-h-screen flex-col items-center justify-center p-24\">\n <h1 className=\"text-4xl font-bold\">Welcome to ${answers.projectName}</h1>\n <p className=\"mt-4 text-xl\">Get started by editing src/app/page.tsx</p>\n </div>\n );\n}\n`;\n await writeFile(path.join(projectPath, PROJECT_PATHS.ROOT_PAGE), basicPage);\n }\n};\n", "import path from 'node:path';\nimport { readdir } from 'node:fs/promises';\nimport {\n deleteDirectory,\n deleteFile,\n fileExists,\n readFile,\n updateJson,\n writeFile,\n} from '../../core/files';\nimport { ProjectPrompts } from '../../prompts/create-app.prompt';\nimport { PROJECT_PATHS } from '../../config/paths';\nimport { PACKAGES } from '../../config/packages';\n\nexport const setupDevTools = async (\n projectPath: string,\n answers: ProjectPrompts,\n): Promise<void> => {\n await setupPreCommitHooks(projectPath, answers);\n await setupCommitizen(projectPath, answers);\n await setupCiCd(projectPath, answers);\n await setupGithubTemplates(projectPath, answers);\n await setupCommunityFiles(projectPath, answers);\n await setupDocker(projectPath, answers);\n await setupReadme(projectPath, answers);\n};\n\nconst setupPreCommitHooks = async (projectPath: string, answers: ProjectPrompts): Promise<void> => {\n if (!answers.preCommitHooks) {\n await deleteDirectory(path.join(projectPath, PROJECT_PATHS.HUSKY_DIR));\n await deleteFile(path.join(projectPath, 'commitlint.config.mjs'));\n await deleteFile(path.join(projectPath, '.lintstagedrc.mjs'));\n\n await updateJson(path.join(projectPath, PROJECT_PATHS.PACKAGE_JSON), (pkg) => {\n delete pkg.devDependencies[PACKAGES.HUSKY];\n delete pkg.devDependencies[PACKAGES.COMMITLINT_CLI];\n delete pkg.devDependencies[PACKAGES.COMMITLINT_CONFIG];\n delete pkg.devDependencies[PACKAGES.LINT_STAGED];\n delete pkg.scripts['prepare'];\n delete pkg.scripts['postinstall'];\n delete pkg.commitlint;\n delete pkg['lint-staged'];\n return pkg;\n });\n }\n};\n\nconst setupCommitizen = async (projectPath: string, answers: ProjectPrompts): Promise<void> => {\n if (!answers.commitizen) {\n await deleteFile(path.join(projectPath, '.czrc'));\n\n await updateJson(path.join(projectPath, PROJECT_PATHS.PACKAGE_JSON), (pkg) => {\n delete pkg.devDependencies[PACKAGES.COMMITIZEN];\n delete pkg.devDependencies[PACKAGES.CZ_CONVENTIONAL_CHANGELOG];\n delete pkg.config?.commitizen;\n if (pkg.config && Object.keys(pkg.config).length === 0) {\n delete pkg.config;\n }\n delete pkg.scripts['commit'];\n return pkg;\n });\n }\n};\n\nconst setupCiCd = async (projectPath: string, answers: ProjectPrompts): Promise<void> => {\n if (!answers.ci) {\n await deleteDirectory(path.join(projectPath, '.github/workflows'));\n }\n};\n\nconst setupGithubTemplates = async (\n projectPath: string,\n answers: ProjectPrompts,\n): Promise<void> => {\n const githubPath = path.join(projectPath, PROJECT_PATHS.GITHUB_DIR);\n if (!answers.keepTemplates) {\n await deleteDirectory(path.join(githubPath, 'ISSUE_TEMPLATE'));\n await deleteFile(path.join(githubPath, 'PULL_REQUEST_TEMPLATE.md'));\n } else {\n const issueTemplatePath = path.join(githubPath, 'ISSUE_TEMPLATE');\n const prTemplatePath = path.join(githubPath, 'PULL_REQUEST_TEMPLATE.md');\n\n const replacePlaceholders = (content: string) => {\n return content\n .replace(/Teispace/g, answers.company)\n .replace(/support@teispace\\.com/g, answers.email)\n .replace(/Next\\.js Starter/g, answers.projectName)\n .replace(/\\[AUTHOR\\]/g, answers.author)\n .replace(/\\[COMPANY\\]/g, answers.company)\n .replace(/\\[EMAIL\\]/g, answers.email);\n };\n\n if (fileExists(prTemplatePath)) {\n let content = await readFile(prTemplatePath);\n content = replacePlaceholders(content);\n await writeFile(prTemplatePath, content);\n }\n\n try {\n if (fileExists(issueTemplatePath)) {\n const files = await readdir(issueTemplatePath);\n for (const file of files) {\n const filePath = path.join(issueTemplatePath, file);\n let content = await readFile(filePath);\n content = replacePlaceholders(content);\n await writeFile(filePath, content);\n }\n }\n } catch {\n // Ignore\n }\n }\n};\n\nconst setupCommunityFiles = async (projectPath: string, answers: ProjectPrompts): Promise<void> => {\n const allCommunityFiles = ['CODE_OF_CONDUCT.md', 'CONTRIBUTING.md', 'SECURITY.md'];\n for (const file of allCommunityFiles) {\n if (!answers.communityFiles.includes(file)) {\n await deleteFile(path.join(projectPath, file));\n }\n }\n};\n\nconst setupDocker = async (projectPath: string, answers: ProjectPrompts): Promise<void> => {\n if (!answers.docker) {\n await deleteFile(path.join(projectPath, 'Dockerfile'));\n await deleteFile(path.join(projectPath, 'docker-compose.yml'));\n await deleteFile(path.join(projectPath, '.dockerignore'));\n\n const envPath = path.join(projectPath, PROJECT_PATHS.ENV_EXAMPLE);\n if (fileExists(envPath)) {\n let envContent = await readFile(envPath);\n envContent = envContent.replace(/# Docker Compose Configuration\\n/, '');\n envContent = envContent.replace(/CONTAINER_NAME=.*\\n/, '');\n envContent = envContent.replace(/IMAGE_NAME=.*\\n/, '');\n envContent = envContent.replace(/IMAGE_TAG=.*\\n/, '');\n await writeFile(envPath, envContent);\n }\n } else {\n const envPath = path.join(projectPath, PROJECT_PATHS.ENV_EXAMPLE);\n if (fileExists(envPath)) {\n let envContent = await readFile(envPath);\n const updateEnvVar = (key: string, value: string) => {\n const regex = new RegExp(`${key}=.*`);\n if (regex.test(envContent)) {\n envContent = envContent.replace(regex, `${key}=${value}`);\n } else {\n envContent += `${key}=${value}\\n`;\n }\n };\n\n updateEnvVar('CONTAINER_NAME', answers.containerName || 'next-app');\n updateEnvVar('IMAGE_NAME', answers.imageName || 'nextjs-starter');\n updateEnvVar('IMAGE_TAG', answers.imageTag || 'latest');\n\n await writeFile(envPath, envContent);\n }\n }\n};\n\nconst setupReadme = async (projectPath: string, answers: ProjectPrompts): Promise<void> => {\n const findReadmes = async (dir: string): Promise<string[]> => {\n const entries = await readdir(dir, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory() && entry.name !== 'node_modules' && entry.name !== '.git') {\n files.push(...(await findReadmes(fullPath)));\n } else if (entry.isFile() && entry.name.toLowerCase() === 'readme.md') {\n files.push(fullPath);\n }\n }\n return files;\n };\n\n const allReadmes = await findReadmes(projectPath);\n const rootReadmePath = path.join(projectPath, PROJECT_PATHS.README);\n\n for (const readmePath of allReadmes) {\n if (readmePath !== rootReadmePath) {\n await deleteFile(readmePath);\n }\n }\n\n if (answers.readme) {\n const simpleReadme = `# ${answers.projectName}\n\n${answers.description}\n\n## Getting Started\n\nFirst, run the development server:\n\n\\`\\`\\`bash\n${answers.packageManager === 'npm' ? 'npm run dev' : answers.packageManager + ' dev'}\n\\`\\`\\`\n\nOpen [http://localhost:3000](http://localhost:3000) with your browser to see the result.\n`;\n await writeFile(rootReadmePath, simpleReadme);\n } else {\n await deleteFile(rootReadmePath);\n }\n};\n", "import { Command } from 'commander';\nimport pc from 'picocolors';\nimport { log } from '../config';\n\nexport const registerFeatureCommand = (program: Command) => {\n program\n .command('feature [name]')\n .description('Generate a new feature module')\n .action(async () => {\n log(pc.yellow('Feature generation will be available soon!'));\n });\n};\n", "import { Command } from 'commander';\nimport { registerAppCommand } from './app';\nimport { registerFeatureCommand } from './feature';\n\nexport const registerCommands = (program: Command) => {\n registerAppCommand(program);\n registerFeatureCommand(program);\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Command", "path", "pc", "ora", "startSpinner", "text", "options", "spinner", "Enquirer", "prompt", "promptForProjectDetails", "initialName", "value", "answers", "fs", "path", "existsSync", "readFile", "filePath", "writeFile", "content", "deleteFile", "deleteDirectory", "dirPath", "updateJson", "update", "json", "updatedJson", "fileExists", "exec", "promisify", "execAsync", "initializeGit", "cwd", "error", "addRemote", "url", "exec", "promisify", "execAsync", "installDependencies", "cwd", "manager", "command", "error", "runScript", "script", "pc", "colorMap", "s", "print", "message", "color", "colorFn", "text", "error", "message", "print", "log", "message", "print", "printBanner", "setupCancellationHandlers", "options", "logger", "m", "exitOnCancel", "onCancel", "onUncaught", "err", "onRejection", "reason", "degit", "cloneTemplate", "projectPath", "spinner", "startSpinner", "degit", "error", "path", "PROJECT_PATHS", "PACKAGES", "configurePackageJson", "projectPath", "answers", "spinner", "startSpinner", "updateJson", "path", "PROJECT_PATHS", "pkg", "PACKAGES", "error", "path", "cleanupFeatures", "projectPath", "answers", "spinner", "startSpinner", "cleanupHttpClient", "cleanupSecureStorage", "cleanupRedux", "cleanupDarkMode", "cleanupI18n", "cleanupLicense", "cleanupChangelog", "cleanupConfig", "error", "httpUtilsPath", "path", "PROJECT_PATHS", "keepSecureStorage", "deleteDirectory", "writeFile", "utilsIndexPath", "fileExists", "content", "readFile", "
|
|
4
|
+
"sourcesContent": ["import { Command } from 'commander';\nimport { registerCommands } from './commands/index';\nimport { error, setupCancellationHandlers } from './config';\n\nasync function main() {\n setupCancellationHandlers({ logger: (m: string) => error(m) });\n\n const program = new Command();\n\n program.name('next-maker').description('Teispace Next.js Project Generator').version('1.0.0');\n\n registerCommands(program);\n\n program.parse();\n}\n\nmain().catch((err) => {\n const message =\n err && typeof err === 'object' && 'message' in err ? (err as Error).message : String(err);\n error(`Unexpected error: ${message}`);\n});\n", "import { Command } from 'commander';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport { startSpinner } from '../config/spinner';\nimport { promptForProjectDetails } from '../prompts/create-app.prompt';\nimport { deleteDirectory, fileExists } from '../core/files';\nimport { initializeGit, addRemote } from '../core/git';\nimport { installDependencies, runScript } from '../core/package-manager';\nimport { log, printBanner } from '../config';\nimport { cloneTemplate } from '../services/init/template.service';\nimport { configurePackageJson } from '../services/init/config.service';\nimport { cleanupFeatures } from '../services/init/cleanup.service';\nimport { generateRootProvider, generateLayout } from '../services/init/providers.service';\nimport { setupDevTools } from '../services/init/devtools.service';\n\nexport const registerAppCommand = (program: Command) => {\n program\n .command('init')\n .description('Initialize a new Next.js project')\n .argument('[name]', 'Project name')\n .action(async (name) => {\n await createApp(name);\n });\n};\n\nconst createApp = async (initialName?: string): Promise<void> => {\n printBanner();\n log('Welcome to the Teispace Next.js App Creator!');\n log('');\n\n const answers = await promptForProjectDetails(initialName);\n const projectPath = path.resolve(process.cwd(), answers.projectName);\n\n if (fileExists(projectPath)) {\n console.error(pc.red(`Error: Directory ${answers.projectName} already exists.`));\n process.exit(1);\n }\n\n const spinner = startSpinner('Initializing project...');\n\n // Cleanup helper\n const performCleanup = async () => {\n if (fileExists(projectPath)) {\n spinner.stop(); // Stop spinner if running\n console.log(pc.yellow(`\\nCleaning up: Deleting directory ${answers.projectName}...`));\n try {\n await deleteDirectory(projectPath);\n console.log(pc.green('Cleanup successful.'));\n } catch (cleanupErr) {\n console.error(pc.red(`Failed to clean up directory ${answers.projectName}:`), cleanupErr);\n }\n }\n };\n\n // Signal handler\n const handleSignal = async () => {\n console.log(pc.red('\\nProcess interrupted. Cleaning up...'));\n await performCleanup();\n process.exit(1);\n };\n\n // Register signal listeners\n process.on('SIGINT', handleSignal);\n process.on('SIGTERM', handleSignal);\n\n try {\n // 1. Clone template\n await cloneTemplate(projectPath);\n\n // 2. Update package.json\n await configurePackageJson(projectPath, answers);\n\n // 3. Customize Features (Cleanup)\n await cleanupFeatures(projectPath, answers);\n\n // 4. Generate Code (Providers, Layout)\n spinner.text = 'Generating code...';\n await generateRootProvider(projectPath, answers);\n await generateLayout(projectPath, answers);\n\n // 5. Setup DevTools & Community Files\n spinner.text = 'Setting up developer tools...';\n await setupDevTools(projectPath, answers);\n\n // 6. Initialize Git\n spinner.text = 'Initializing Git...';\n await initializeGit(projectPath);\n if (answers.gitRemote) {\n await addRemote(projectPath, answers.gitRemote);\n }\n\n // 7. Install Dependencies\n spinner.text = 'Installing dependencies...';\n await installDependencies(projectPath, answers.packageManager);\n\n // 8. Format and Lint\n spinner.text = 'Formatting and Linting...';\n await runScript(projectPath, answers.packageManager, 'format');\n await runScript(projectPath, answers.packageManager, 'lint:fix');\n\n // Remove signal listeners on success\n process.off('SIGINT', handleSignal);\n process.off('SIGTERM', handleSignal);\n\n spinner.succeed(pc.green(`Project ${answers.projectName} created successfully!`));\n log('');\n log('To get started:');\n log(pc.cyan(` cd ${answers.projectName}`));\n log(\n pc.cyan(\n ` ${answers.packageManager === 'npm' ? 'npm run dev' : answers.packageManager + ' dev'}`,\n ),\n );\n log('');\n } catch (err) {\n spinner.fail('Failed to create project.');\n console.error(err);\n await performCleanup();\n process.exit(1);\n }\n};\n", "import ora, { Ora, Options } from 'ora';\n\n// Create and start a spinner\nexport function startSpinner(text = '', options?: Options): Ora {\n const spinner = ora({ text, ...options });\n spinner.start();\n return spinner;\n}\n\n// Stop a spinner without changing its status\nexport function stopSpinner(spinner: Ora): void {\n spinner.stop();\n}\n\n// Mark spinner as succeeded\nexport function succeedSpinner(spinner: Ora, text?: string): void {\n spinner.succeed(text);\n}\n\n// Mark spinner as failed\nexport function failSpinner(spinner: Ora, text?: string): void {\n spinner.fail(text);\n}\n\n// Run an async function while showing a spinner; auto-succeed/fail\nexport async function withSpinner<T>(\n text: string,\n fn: () => Promise<T>,\n {\n successText,\n failText,\n options,\n }: { successText?: string; failText?: string; options?: Options } = {},\n): Promise<T> {\n const spinner = startSpinner(text, options);\n try {\n const result = await fn();\n spinner.succeed(successText ?? 'Done');\n return result;\n } catch (err) {\n spinner.fail(failText ?? 'Failed');\n throw err;\n }\n}\n\nexport default startSpinner;\n", "import Enquirer from 'enquirer';\nimport { PackageManager } from '../core/package-manager';\n\nconst { prompt } = Enquirer;\n\ntype PromptContext = {\n state?: { answers?: Partial<ProjectPrompts> };\n enquirer?: { answers?: Partial<ProjectPrompts> };\n};\n\nexport interface ProjectPrompts {\n projectName: string;\n description: string;\n author: string;\n version: string;\n packageManager: PackageManager;\n gitRemote: string;\n gitIssues: string;\n gitHomepage: string;\n httpClient: 'axios' | 'fetch' | 'both' | 'none';\n reactSecureStorage?: boolean;\n email: string;\n company: string;\n keepTemplates: boolean;\n darkMode: boolean;\n redux: boolean;\n i18n: boolean;\n communityFiles: string[];\n readme: boolean;\n docker: boolean;\n containerName?: string;\n imageName?: string;\n imageTag?: string;\n ci: boolean;\n preCommitHooks: boolean;\n commitizen: boolean;\n}\n\nexport const promptForProjectDetails = async (initialName?: string): Promise<ProjectPrompts> => {\n const response = await prompt<ProjectPrompts>([\n {\n type: 'input',\n name: 'projectName',\n message: 'What is the project name?',\n initial: initialName || 'my-app',\n skip: !!initialName,\n validate: (value: string) => {\n if (!/^[a-z0-9-_]+$/.test(value)) {\n return 'Project name must be lowercase and contain only alphanumeric characters, hyphens, and underscores.';\n }\n return true;\n },\n },\n {\n type: 'input',\n name: 'description',\n message: 'Project description:',\n initial: 'A Next.js application',\n },\n {\n type: 'input',\n name: 'author',\n message: 'Author:',\n initial: 'Teispace',\n },\n {\n type: 'input',\n name: 'version',\n message: 'Version:',\n initial: '0.1.0',\n validate: (value: string) => {\n if (!/^\\d+\\.\\d+\\.\\d+$/.test(value)) {\n return 'Version must be a valid semantic version (x.y.z).';\n }\n return true;\n },\n },\n {\n type: 'input',\n name: 'email',\n message: 'Support email:',\n initial: 'support@example.com',\n validate: (value: string) => {\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) {\n return 'Please enter a valid email address.';\n }\n return true;\n },\n },\n {\n type: 'input',\n name: 'company',\n message: 'Company name:',\n initial: 'Teispace',\n },\n {\n type: 'select',\n name: 'packageManager',\n message: 'Which package manager would you like to use?',\n choices: ['npm', 'yarn', 'pnpm', 'bun'],\n initial: 1,\n },\n {\n type: 'input',\n name: 'gitRemote',\n message: 'Git remote origin URL (optional):',\n validate: (value: string) => {\n if (value && !/^(https?:\\/\\/)?([\\da-z.-]+)\\.([a-z.]{2,6})([/\\w .-]*)*\\/?$/.test(value)) {\n return 'Please enter a valid URL.';\n }\n return true;\n },\n },\n {\n type: 'input',\n name: 'gitIssues',\n message: 'Git issues URL (optional):',\n validate: (value: string) => {\n if (value && !/^(https?:\\/\\/)?([\\da-z.-]+)\\.([a-z.]{2,6})([/\\w .-]*)*\\/?$/.test(value)) {\n return 'Please enter a valid URL.';\n }\n return true;\n },\n },\n {\n type: 'input',\n name: 'gitHomepage',\n message: 'Project homepage URL (optional):',\n validate: (value: string) => {\n if (value && !/^(https?:\\/\\/)?([\\da-z.-]+)\\.([a-z.]{2,6})([/\\w .-]*)*\\/?$/.test(value)) {\n return 'Please enter a valid URL.';\n }\n return true;\n },\n },\n {\n type: 'confirm',\n name: 'keepTemplates',\n message: 'Do you want to keep GitHub issue and pull request templates?',\n initial: true,\n },\n {\n type: 'select',\n name: 'httpClient',\n message: 'Which HTTP client do you want to use?',\n choices: ['axios', 'fetch', 'both', 'none'],\n initial: 0,\n },\n {\n type: 'confirm',\n name: 'reactSecureStorage',\n message: 'Do you want to include react-secure-storage?',\n initial: true,\n skip: function (this: PromptContext) {\n // Access answers from the prompt instance safely across versions\n const answers = this.state?.answers ?? this.enquirer?.answers ?? {};\n // If HTTP client is selected (not 'none'), we skip this question (it will be auto-included)\n return !!(answers.httpClient && answers.httpClient !== 'none');\n },\n },\n {\n type: 'confirm',\n name: 'darkMode',\n message: 'Do you want to include Dark Mode (Tailwind + next-themes)?',\n initial: true,\n },\n {\n type: 'confirm',\n name: 'redux',\n message: 'Do you want to include Redux Toolkit?',\n initial: true,\n },\n {\n type: 'confirm',\n name: 'i18n',\n message: 'Do you want to include Internationalization (next-intl)?',\n initial: true,\n },\n {\n type: 'multiselect',\n name: 'communityFiles',\n message: 'Select community files to include:',\n choices: [\n { name: 'CODE_OF_CONDUCT.md', value: 'CODE_OF_CONDUCT.md' },\n { name: 'CONTRIBUTING.md', value: 'CONTRIBUTING.md' },\n { name: 'SECURITY.md', value: 'SECURITY.md' },\n ],\n initial: ['CODE_OF_CONDUCT.md', 'CONTRIBUTING.md', 'SECURITY.md'],\n },\n {\n type: 'confirm',\n name: 'readme',\n message: 'Do you want to create a README.md?',\n initial: true,\n },\n {\n type: 'confirm',\n name: 'docker',\n message: 'Do you want to include Docker configuration?',\n initial: true,\n },\n {\n type: 'input',\n name: 'containerName',\n message: 'Docker Container Name:',\n initial: 'next-app',\n skip: function (this: PromptContext) {\n const answers = this.state?.answers ?? this.enquirer?.answers ?? {};\n return !answers.docker;\n },\n validate: (value: string) => {\n if (!/^[a-zA-Z0-9][a-zA-Z0-9_.-]*$/.test(value)) {\n return 'Invalid Docker container name.';\n }\n return true;\n },\n },\n {\n type: 'input',\n name: 'imageName',\n message: 'Docker Image Name:',\n initial: 'nextjs-starter',\n skip: function (this: PromptContext) {\n const answers = this.state?.answers ?? this.enquirer?.answers ?? {};\n return !answers.docker;\n },\n validate: (value: string) => {\n if (!/^[a-z0-9]+(?:[._-][a-z0-9]+)*$/.test(value)) {\n return 'Invalid Docker image name (must be lowercase).';\n }\n return true;\n },\n },\n {\n type: 'input',\n name: 'imageTag',\n message: 'Docker Image Tag:',\n initial: 'latest',\n skip: function (this: PromptContext) {\n const answers = this.state?.answers ?? this.enquirer?.answers ?? {};\n return !answers.docker;\n },\n validate: (value: string) => {\n if (!/^[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,127}$/.test(value)) {\n return 'Invalid Docker image tag.';\n }\n return true;\n },\n },\n {\n type: 'confirm',\n name: 'ci',\n message: 'Do you want to include GitHub Actions (CI/CD)?',\n initial: true,\n },\n {\n type: 'confirm',\n name: 'preCommitHooks',\n message: 'Do you want to setup pre-commit hooks (Husky, Commitlint, Lint-staged)?',\n initial: true,\n },\n {\n type: 'confirm',\n name: 'commitizen',\n message: 'Do you want to setup Commitizen?',\n initial: true,\n },\n ] as any);\n\n return response;\n};\n", "import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { existsSync } from 'node:fs';\n\nexport const readFile = async (filePath: string): Promise<string> => {\n return fs.readFile(filePath, 'utf-8');\n};\n\nexport const writeFile = async (filePath: string, content: string): Promise<void> => {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, content, 'utf-8');\n};\n\nexport const deleteFile = async (filePath: string): Promise<void> => {\n if (existsSync(filePath)) {\n await fs.unlink(filePath);\n }\n};\n\nexport const deleteDirectory = async (dirPath: string): Promise<void> => {\n if (existsSync(dirPath)) {\n await fs.rm(dirPath, { recursive: true, force: true });\n }\n};\n\nexport const updateJson = async <T = any>(\n filePath: string,\n update: (json: T) => T,\n): Promise<void> => {\n const content = await readFile(filePath);\n const json = JSON.parse(content) as T;\n const updatedJson = update(json);\n await writeFile(filePath, JSON.stringify(updatedJson, null, 2));\n};\n\nexport const fileExists = (filePath: string): boolean => {\n return existsSync(filePath);\n};\n", "import { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execAsync = promisify(exec);\n\nexport const initializeGit = async (cwd: string): Promise<void> => {\n try {\n await execAsync('git init', { cwd });\n await execAsync('git add .', { cwd });\n await execAsync('git commit -m \"Initial commit from @teispace/next-maker\"', { cwd });\n } catch (error) {\n // Ignore error if git is not installed or fails\n console.warn('Failed to initialize git repository', error);\n }\n};\n\nexport const addRemote = async (cwd: string, url: string): Promise<void> => {\n try {\n await execAsync(`git remote add origin ${url}`, { cwd });\n } catch (error) {\n console.warn('Failed to add remote origin', error);\n }\n};\n\nexport const isGitInstalled = async (): Promise<boolean> => {\n try {\n await execAsync('git --version');\n return true;\n } catch {\n return false;\n }\n};\n", "import { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execAsync = promisify(exec);\n\nexport type PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun';\n\nexport const installDependencies = async (cwd: string, manager: PackageManager): Promise<void> => {\n const command = `${manager} install`;\n try {\n await execAsync(command, { cwd });\n } catch (error) {\n throw new Error(`Failed to install dependencies with ${manager}: ${error}`);\n }\n};\n\nexport const runScript = async (\n cwd: string,\n manager: PackageManager,\n script: string,\n): Promise<void> => {\n const command = `${manager} run ${script}`;\n try {\n await execAsync(command, { cwd });\n } catch (error) {\n // We don't want to fail the whole setup if linting fails, just warn\n console.warn(`Warning: Failed to run script '${script}': ${error}`);\n }\n};\n\nexport const getPackageManager = (): PackageManager => {\n const userAgent = process.env.npm_config_user_agent;\n if (userAgent) {\n if (userAgent.startsWith('yarn')) return 'yarn';\n if (userAgent.startsWith('pnpm')) return 'pnpm';\n if (userAgent.startsWith('bun')) return 'bun';\n }\n return 'npm';\n};\n", "import pc from 'picocolors';\n\n// Define a type for allowed colors explicitly\nexport type Color =\n | 'reset'\n | 'red'\n | 'green'\n | 'yellow'\n | 'blue'\n | 'cyan'\n | 'magenta'\n | 'white'\n | 'gray'\n | 'bright'\n | 'dim';\n\nconst colorMap: Record<Color, (s: string) => string> = {\n reset: (s: string) => s,\n red: pc.red,\n green: pc.green,\n yellow: pc.yellow,\n blue: pc.blue,\n cyan: pc.cyan,\n magenta: pc.magenta,\n white: pc.white,\n gray: pc.gray,\n bright: pc.bold,\n dim: pc.dim,\n};\n\n// Print with color\nexport function print(message: string, color: Color = 'reset'): void {\n const colorFn = colorMap[color] ?? ((text: string) => text);\n console.log(colorFn(message));\n}\n\n// Print section header\nexport function printHeader(title: string): void {\n console.log('');\n print('\u2550'.repeat(60), 'cyan');\n print(` ${title}`, 'bright');\n print('\u2550'.repeat(60), 'cyan');\n console.log('');\n}\n\n// Print success message\nexport function success(message: string): void {\n print(`\u2713 ${message}`, 'green');\n}\n\n// Print error message\nexport function error(message: string): void {\n print(`\u2716 ${message}`, 'red');\n}\n\n// Print warning message\nexport function warning(message: string): void {\n print(`\u26A0 ${message}`, 'yellow');\n}\n\n// Print info message\nexport function info(message: string): void {\n print(`\u2139 ${message}`, 'cyan');\n}\n\nexport function log(message: string): void {\n print(message);\n}\n\n// Print banner\nexport function printBanner(): void {\n console.log('');\n print('\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557', 'cyan');\n print('\u2551 \u2551', 'cyan');\n print('\u2551 \uD83D\uDE80 Create Teispace Next.js App \uD83D\uDE80 \u2551', 'cyan');\n print('\u2551 \u2551', 'cyan');\n print('\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D', 'cyan');\n console.log('');\n}\n", "export type SetupOptions = {\n logger?: (msg: string) => void;\n exitOnCancel?: boolean;\n};\n\nexport function setupCancellationHandlers(options?: SetupOptions): () => void {\n const {\n logger = (m: string) => console.error(m),\n exitOnCancel = process.env.NODE_ENV !== 'test',\n } = options ?? {};\n\n const onCancel = (): void => {\n console.log('');\n console.log('');\n logger('Setup cancelled by user');\n console.log('');\n if (exitOnCancel) process.exit(0);\n };\n\n const onUncaught = (err: unknown): void => {\n if (err !== null && typeof err === 'object' && 'code' in err) {\n const maybeErrWithCode = err as { code?: unknown };\n if (maybeErrWithCode.code === 'ERR_USE_AFTER_CLOSE') {\n onCancel();\n return;\n }\n }\n\n // Log uncaught exceptions instead of throwing so the CLI can report\n // the error and exit gracefully when appropriate.\n if (err instanceof Error) {\n logger(`Uncaught exception: ${err.message}`);\n return;\n }\n logger(`Uncaught exception: ${String(err)}`);\n };\n\n const onRejection = (reason: unknown): void => {\n // Log unhandled promise rejections rather than letting them crash the\n // process. This converts the reason to a readable string safely.\n if (reason instanceof Error) {\n logger(`Unhandled promise rejection: ${reason.message}`);\n return;\n }\n logger(`Unhandled promise rejection: ${String(reason)}`);\n };\n\n process.on('SIGINT', onCancel);\n process.on('SIGTERM', onCancel);\n process.on('uncaughtException', onUncaught);\n process.on('unhandledRejection', onRejection as (...args: unknown[]) => void);\n\n // Return a cleanup function to remove listeners (useful in tests).\n return (): void => {\n process.off('SIGINT', onCancel);\n process.off('SIGTERM', onCancel);\n process.off('uncaughtException', onUncaught);\n process.off('unhandledRejection', onRejection as (...args: unknown[]) => void);\n };\n}\n\nexport default setupCancellationHandlers;\n", "import degit from 'degit';\nimport { startSpinner } from '../../config/spinner';\n\nexport const cloneTemplate = async (projectPath: string): Promise<void> => {\n const spinner = startSpinner('Downloading template...');\n try {\n const emitter = degit('teispace/nextjs-starter', {\n cache: false,\n force: true,\n verbose: true,\n });\n await emitter.clone(projectPath);\n spinner.succeed('Template downloaded successfully.');\n } catch (error) {\n spinner.fail('Failed to download template.');\n throw error;\n }\n};\n", "import path from 'node:path';\nimport { updateJson } from '../../core/files';\nimport { ProjectPrompts } from '../../prompts/create-app.prompt';\nimport { startSpinner } from '../../config/spinner';\nimport { PROJECT_PATHS } from '../../config/paths';\nimport { PACKAGES } from '../../config/packages';\n\nexport const configurePackageJson = async (\n projectPath: string,\n answers: ProjectPrompts,\n): Promise<void> => {\n const spinner = startSpinner('Configuring package.json...');\n try {\n await updateJson(path.join(projectPath, PROJECT_PATHS.PACKAGE_JSON), (pkg) => {\n pkg.name = answers.projectName;\n pkg.version = answers.version;\n pkg.description = answers.description;\n pkg.author = answers.author;\n\n // Remove packageManager field to avoid \"configured to use yarn\" errors\n // and let the user's environment handle it.\n delete pkg.packageManager;\n\n if (answers.gitHomepage) pkg.homepage = answers.gitHomepage;\n if (answers.gitIssues) pkg.bugs = { url: answers.gitIssues };\n if (answers.gitRemote) pkg.repository = { type: 'git', url: answers.gitRemote };\n\n // Remove dependencies based on choices\n if (!answers.redux) {\n delete pkg.dependencies[PACKAGES.REDUX_TOOLKIT];\n delete pkg.dependencies[PACKAGES.REACT_REDUX];\n delete pkg.dependencies[PACKAGES.REDUX_PERSIST];\n }\n\n // Handle react-secure-storage\n const keepSecureStorage = answers.httpClient !== 'none' || answers.reactSecureStorage;\n if (!keepSecureStorage) {\n delete pkg.dependencies[PACKAGES.REACT_SECURE_STORAGE];\n }\n if (!answers.i18n) {\n delete pkg.dependencies[PACKAGES.NEXT_INTL];\n }\n if (!answers.darkMode) {\n delete pkg.dependencies[PACKAGES.NEXT_THEMES];\n }\n if (answers.httpClient === 'none') {\n delete pkg.dependencies[PACKAGES.AXIOS];\n } else if (answers.httpClient === 'fetch') {\n delete pkg.dependencies[PACKAGES.AXIOS];\n }\n\n return pkg;\n });\n spinner.succeed('package.json configured.');\n } catch (error) {\n spinner.fail('Failed to configure package.json.');\n throw error;\n }\n};\n", "export const PROJECT_PATHS = {\n // Config\n NEXT_CONFIG: 'next.config.ts',\n TAILWIND_CONFIG: 'tailwind.config.ts',\n POSTCSS_CONFIG: 'postcss.config.mjs',\n ESLINT_CONFIG: 'eslint.config.mjs',\n TS_CONFIG: 'tsconfig.json',\n PACKAGE_JSON: 'package.json',\n ENV_EXAMPLE: '.env.example',\n GITIGNORE: '.gitignore',\n README: 'README.md',\n LICENSE: 'LICENSE',\n CHANGELOG: 'CHANGELOG.md',\n NVM_RC: '.nvmrc',\n NPM_RC: '.npmrc',\n\n // Source\n SRC: 'src',\n APP: 'src/app',\n COMPONENTS: 'src/components',\n LIB: 'src/lib',\n PROVIDERS: 'src/providers',\n STYLES: 'src/styles',\n TYPES: 'src/types',\n UTILS: 'src/lib/utils',\n HOOKS: 'src/hooks',\n SERVICES: 'src/services',\n STORE: 'src/store',\n I18N: 'src/i18n',\n\n // Specific Files\n GLOBALS_CSS: 'src/styles/globals.css',\n ROOT_LAYOUT: 'src/app/layout.tsx',\n ROOT_PAGE: 'src/app/page.tsx',\n ROOT_PROVIDER: 'src/providers/RootProvider.tsx',\n PROVIDERS_INDEX: 'src/providers/index.ts',\n COMPONENTS_INDEX: 'src/components/index.ts',\n TYPES_INDEX: 'src/types/index.ts',\n UTILS_INDEX: 'src/lib/utils/index.ts',\n CONFIG_INDEX: 'src/lib/config/index.ts',\n CONSTANTS: 'src/lib/config/constants.ts',\n APP_LOCALES: 'src/lib/config/app-locales.ts',\n MIDDLEWARE: 'src/middleware.ts',\n PROXY: 'src/proxy.ts',\n I18N_TYPES: 'src/types/i18n.ts',\n\n // Directories to Cleanup\n HTTP_UTILS: 'src/lib/utils/http',\n AXIOS_CLIENT: 'src/lib/utils/http/axios-client',\n FETCH_CLIENT: 'src/lib/utils/http/fetch-client',\n CLIENT_UTILS: 'src/lib/utils/http/client-utils.ts',\n APP_APIS: 'src/lib/config/app-apis.ts',\n STORAGE_SERVICE: 'src/services/storage',\n COUNTER_FEATURE: 'src/features/counter',\n I18N_DIR: 'src/i18n',\n LOCALE_DIR: 'src/app/[locale]',\n ERRORS_DIR: 'src/lib/errors',\n UTILITY_TYPES_DIR: 'src/types/utility',\n COMMON_TYPES_DIR: 'src/types/common',\n GITHUB_DIR: '.github',\n HUSKY_DIR: '.husky',\n} as const;\n", "export const PACKAGES = {\n // Dependencies\n REDUX_TOOLKIT: '@reduxjs/toolkit',\n REACT_REDUX: 'react-redux',\n REDUX_PERSIST: 'redux-persist',\n REACT_SECURE_STORAGE: 'react-secure-storage',\n NEXT_INTL: 'next-intl',\n NEXT_THEMES: 'next-themes',\n AXIOS: 'axios',\n\n // Dev Dependencies\n HUSKY: 'husky',\n COMMITLINT_CLI: '@commitlint/cli',\n COMMITLINT_CONFIG: '@commitlint/config-conventional',\n LINT_STAGED: 'lint-staged',\n COMMITIZEN: 'commitizen',\n CZ_CONVENTIONAL_CHANGELOG: 'cz-conventional-changelog',\n} as const;\n", "import path from 'node:path';\nimport { deleteDirectory, deleteFile, fileExists, readFile, writeFile } from '../../core/files';\nimport { ProjectPrompts } from '../../prompts/create-app.prompt';\nimport { startSpinner } from '../../config/spinner';\n\nimport { PROJECT_PATHS } from '../../config/paths';\n\n// ... (imports)\n\nexport const cleanupFeatures = async (\n projectPath: string,\n answers: ProjectPrompts,\n): Promise<void> => {\n const spinner = startSpinner('Customizing features...');\n try {\n await cleanupHttpClient(projectPath, answers);\n await cleanupSecureStorage(projectPath, answers);\n await cleanupRedux(projectPath, answers);\n await cleanupDarkMode(projectPath, answers);\n await cleanupI18n(projectPath, answers);\n await cleanupLicense(projectPath);\n await cleanupChangelog(projectPath);\n await cleanupConfig(projectPath);\n spinner.succeed('Features customized.');\n } catch (error) {\n spinner.fail('Failed to customize features.');\n throw error;\n }\n};\n\nconst cleanupHttpClient = async (projectPath: string, answers: ProjectPrompts): Promise<void> => {\n const httpUtilsPath = path.join(projectPath, PROJECT_PATHS.HTTP_UTILS);\n const keepSecureStorage = answers.httpClient !== 'none' || answers.reactSecureStorage;\n\n if (answers.httpClient === 'none') {\n await deleteDirectory(path.join(projectPath, PROJECT_PATHS.AXIOS_CLIENT));\n await deleteDirectory(path.join(projectPath, PROJECT_PATHS.FETCH_CLIENT));\n\n if (keepSecureStorage) {\n await writeFile(path.join(httpUtilsPath, 'index.ts'), \"export * from './token-store';\\n\");\n // token-store.ts does not use client-utils, so we can remove it\n await deleteFile(path.join(projectPath, PROJECT_PATHS.CLIENT_UTILS));\n } else {\n await deleteDirectory(httpUtilsPath);\n const utilsIndexPath = path.join(projectPath, PROJECT_PATHS.UTILS_INDEX);\n if (fileExists(utilsIndexPath)) {\n let content = await readFile(utilsIndexPath);\n content = content.replace(/export \\* from '\\.\\/http';\\n/, '');\n await writeFile(utilsIndexPath, content);\n }\n\n // Remove app-apis.ts if no client and no secure storage (likely no auth)\n await deleteFile(path.join(projectPath, PROJECT_PATHS.APP_APIS));\n const configIndexPath = path.join(projectPath, PROJECT_PATHS.CONFIG_INDEX);\n if (fileExists(configIndexPath)) {\n let content = await readFile(configIndexPath);\n content = content.replace(/export \\* from '\\.\\/app-apis';\\n/, '');\n await writeFile(configIndexPath, content);\n }\n }\n\n // Remove API constants\n const constantsPath = path.join(projectPath, PROJECT_PATHS.CONSTANTS);\n if (fileExists(constantsPath)) {\n let content = await readFile(constantsPath);\n content = content.replace(/export const API_RESPONSE_DATA_KEY = 'data';\\n/, '');\n content = content.replace(/export const SAVE_AUTH_TOKENS = false;\\n/, '');\n await writeFile(constantsPath, content);\n }\n\n // Remove errors and types\n await deleteDirectory(path.join(projectPath, PROJECT_PATHS.ERRORS_DIR));\n\n // Only remove common types if we don't keep secure storage (TokenStore needs common/http.types.ts)\n if (!keepSecureStorage) {\n await deleteDirectory(path.join(projectPath, PROJECT_PATHS.COMMON_TYPES_DIR));\n await deleteDirectory(path.join(projectPath, PROJECT_PATHS.UTILITY_TYPES_DIR));\n\n // Update types/index.ts\n const typesIndexPath = path.join(projectPath, PROJECT_PATHS.TYPES_INDEX);\n if (fileExists(typesIndexPath)) {\n let content = await readFile(typesIndexPath);\n content = content.replace(/export \\* from '\\.\\/utility';\\n/, '');\n content = content.replace(/export \\* from '\\.\\/common';\\n/, '');\n await writeFile(typesIndexPath, content);\n }\n }\n } else if (answers.httpClient === 'axios') {\n await deleteDirectory(path.join(projectPath, PROJECT_PATHS.FETCH_CLIENT));\n let content = await readFile(path.join(httpUtilsPath, 'index.ts'));\n content = content.replace(/export .* from '\\.\\/fetch-client';\\n/g, '');\n await writeFile(path.join(httpUtilsPath, 'index.ts'), content);\n } else if (answers.httpClient === 'fetch') {\n await deleteDirectory(path.join(projectPath, PROJECT_PATHS.AXIOS_CLIENT));\n let content = await readFile(path.join(httpUtilsPath, 'index.ts'));\n content = content.replace(/export .* from '\\.\\/axios-client';\\n/g, '');\n await writeFile(path.join(httpUtilsPath, 'index.ts'), content);\n }\n};\n\nconst cleanupSecureStorage = async (\n projectPath: string,\n answers: ProjectPrompts,\n): Promise<void> => {\n const keepSecureStorage = answers.httpClient !== 'none' || answers.reactSecureStorage;\n if (!keepSecureStorage) {\n await deleteDirectory(path.join(projectPath, PROJECT_PATHS.STORAGE_SERVICE));\n }\n};\n\nconst cleanupRedux = async (projectPath: string, answers: ProjectPrompts): Promise<void> => {\n if (!answers.redux) {\n await deleteDirectory(path.join(projectPath, PROJECT_PATHS.STORE));\n await deleteDirectory(path.join(projectPath, PROJECT_PATHS.COUNTER_FEATURE));\n await deleteFile(path.join(projectPath, 'src/providers/StoreProvider.tsx'));\n await deleteFile(path.join(projectPath, 'src/components/Count.tsx'));\n\n const providersIndexPath = path.join(projectPath, PROJECT_PATHS.PROVIDERS_INDEX);\n let providersIndexContent = await readFile(providersIndexPath);\n providersIndexContent = providersIndexContent.replace(\n /export \\* from '\\.\\/StoreProvider';\\n/,\n '',\n );\n await writeFile(providersIndexPath, providersIndexContent);\n\n const componentsIndexPath = path.join(projectPath, PROJECT_PATHS.COMPONENTS_INDEX);\n if (fileExists(componentsIndexPath)) {\n let componentsIndexContent = await readFile(componentsIndexPath);\n componentsIndexContent = componentsIndexContent.replace(/export \\* from '\\.\\/Count';\\n?/, '');\n await writeFile(componentsIndexPath, componentsIndexContent);\n }\n\n // Cleanup usage in pages\n const pagesToClean = [\n path.join(projectPath, PROJECT_PATHS.ROOT_PAGE),\n path.join(projectPath, 'src/app/[locale]/page.tsx'),\n ];\n\n for (const pagePath of pagesToClean) {\n if (fileExists(pagePath)) {\n let content = await readFile(pagePath);\n content = content.replace(\n /import\\s+\\{\\s*Count\\s*\\}\\s+from\\s+['\"]@\\/components['\"];\\n?/,\n '',\n );\n content = content.replace(/<Count\\s*\\/>\\n?/g, '');\n await writeFile(pagePath, content);\n }\n }\n }\n};\n\nconst cleanupDarkMode = async (projectPath: string, answers: ProjectPrompts): Promise<void> => {\n if (!answers.darkMode) {\n await deleteFile(path.join(projectPath, 'src/providers/CustomThemeProvider.tsx'));\n const providersIndexPath = path.join(projectPath, PROJECT_PATHS.PROVIDERS_INDEX);\n let providersIndexContent = await readFile(providersIndexPath);\n providersIndexContent = providersIndexContent.replace(\n /export \\* from '\\.\\/CustomThemeProvider';\\n/,\n '',\n );\n await writeFile(providersIndexPath, providersIndexContent);\n\n const globalsCssPath = path.join(projectPath, PROJECT_PATHS.GLOBALS_CSS);\n if (fileExists(globalsCssPath)) {\n let cssContent = await readFile(globalsCssPath);\n cssContent = cssContent.replace(/@custom-variant dark \\(.*?\\);\\n?/, '');\n await writeFile(globalsCssPath, cssContent);\n }\n }\n};\n\nconst cleanupI18n = async (projectPath: string, answers: ProjectPrompts): Promise<void> => {\n if (!answers.i18n) {\n await deleteDirectory(path.join(projectPath, PROJECT_PATHS.I18N_DIR));\n await deleteDirectory(path.join(projectPath, PROJECT_PATHS.LOCALE_DIR));\n await deleteFile(path.join(projectPath, PROJECT_PATHS.PROXY));\n await deleteFile(path.join(projectPath, PROJECT_PATHS.MIDDLEWARE));\n await deleteFile(path.join(projectPath, PROJECT_PATHS.I18N_TYPES));\n await deleteFile(path.join(projectPath, PROJECT_PATHS.APP_LOCALES));\n\n const typesIndexPath = path.join(projectPath, PROJECT_PATHS.TYPES_INDEX);\n if (fileExists(typesIndexPath)) {\n let content = await readFile(typesIndexPath);\n content = content.replace(/export \\* from '\\.\\/i18n';\\n/, '');\n await writeFile(typesIndexPath, content);\n }\n\n const configIndexPath = path.join(projectPath, PROJECT_PATHS.CONFIG_INDEX);\n if (fileExists(configIndexPath)) {\n let content = await readFile(configIndexPath);\n content = content.replace(/export \\* from '\\.\\/app-locales';\\n/, '');\n await writeFile(configIndexPath, content);\n }\n\n const nextConfigPath = path.join(projectPath, PROJECT_PATHS.NEXT_CONFIG);\n if (fileExists(nextConfigPath)) {\n let configContent = await readFile(nextConfigPath);\n configContent = configContent.replace(\n /import createNextIntlPlugin from 'next-intl\\/plugin';\\n/,\n '',\n );\n configContent = configContent.replace(/const withNextIntl = createNextIntlPlugin\\(\\);\\n/, '');\n configContent = configContent.replace(\n /export default withNextIntl\\(nextConfig\\);/,\n 'export default nextConfig;',\n );\n await writeFile(nextConfigPath, configContent);\n }\n\n // Cleanup Count.tsx if it exists (Redux enabled)\n const countComponentPath = path.join(projectPath, 'src/components/Count.tsx');\n if (fileExists(countComponentPath)) {\n let content = await readFile(countComponentPath);\n content = content.replace(\n /import\\s+\\{\\s*useTranslations\\s*\\}\\s+from\\s+['\"]next-intl['\"];\\n?/,\n '',\n );\n content = content.replace(/const\\s+t\\s*=\\s*useTranslations\\(['\"]Count['\"]\\);\\n?/, '');\n content = content.replace(/\\{t\\(['\"]increment['\"]\\)\\}/g, \"{'Increment'}\");\n content = content.replace(/\\{t\\(['\"]decrement['\"]\\)\\}/g, \"{'Decrement'}\");\n content = content.replace(/\\{t\\(['\"]incrementByAmount['\"]\\)\\}/g, \"{'Increment by Amount'}\");\n content = content.replace(/\\{t\\(['\"]reset['\"]\\)\\}/g, \"{'Reset'}\");\n await writeFile(countComponentPath, content);\n }\n }\n};\n\nconst cleanupLicense = async (projectPath: string): Promise<void> => {\n await deleteFile(path.join(projectPath, PROJECT_PATHS.LICENSE));\n};\n\nconst cleanupChangelog = async (projectPath: string): Promise<void> => {\n await deleteFile(path.join(projectPath, PROJECT_PATHS.CHANGELOG));\n};\n\nconst cleanupConfig = async (projectPath: string): Promise<void> => {\n await deleteFile(path.join(projectPath, PROJECT_PATHS.NVM_RC));\n await deleteFile(path.join(projectPath, PROJECT_PATHS.NPM_RC));\n};\n", "import path from 'node:path';\nimport { writeFile } from '../../core/files';\nimport { ProjectPrompts } from '../../prompts/create-app.prompt';\nimport { PROJECT_PATHS } from '../../config/paths';\n\nexport const generateRootProvider = async (\n projectPath: string,\n answers: ProjectPrompts,\n): Promise<void> => {\n const imports: string[] = [];\n const providers: string[] = [];\n\n if (answers.redux) {\n imports.push(\"import { StoreProvider } from '@/providers';\");\n providers.push('StoreProvider');\n }\n\n if (answers.darkMode) {\n imports.push(\"import { CustomThemeProvider } from '@/providers';\");\n providers.push('CustomThemeProvider');\n }\n\n if (answers.i18n) {\n imports.push(\"import { NextIntlClientProvider, AbstractIntlMessages } from 'next-intl';\");\n imports.push(\"import { SupportedLocale } from '@/types/i18n';\");\n }\n\n let rootProviderContent = `'use client';\n${imports.join('\\n')}\n\nexport const RootProvider = ({\n children,\n ${answers.i18n ? 'locale,\\n messages,' : ''}\n}: {\n children: React.ReactNode;\n ${answers.i18n ? 'locale: SupportedLocale;\\n messages: AbstractIntlMessages;' : ''}\n}) => {\n return (\n`;\n\n // Build the nesting\n let content = '{children}';\n\n if (answers.i18n) {\n content = `<NextIntlClientProvider locale={locale} messages={messages}>\n ${content}\n </NextIntlClientProvider>`;\n }\n\n if (answers.darkMode) {\n content = `<CustomThemeProvider>\n ${content}\n </CustomThemeProvider>`;\n }\n\n if (answers.redux) {\n content = `<StoreProvider>\n ${content}\n </StoreProvider>`;\n }\n\n // If no providers are wrapped, ensure we return a valid JSX element (Fragment)\n if (content === '{children}') {\n content = `<>{children}</>`;\n }\n\n rootProviderContent += ` ${content}\n );\n};\n`;\n\n await writeFile(path.join(projectPath, PROJECT_PATHS.ROOT_PROVIDER), rootProviderContent);\n};\n\nexport const generateLayout = async (\n projectPath: string,\n answers: ProjectPrompts,\n): Promise<void> => {\n if (!answers.i18n) {\n const basicLayout = `import type { Metadata } from 'next';\nimport '@/styles/globals.css';\nimport { Livvic } from 'next/font/google';\nimport { RootProvider } from '@/providers';\n\nconst livvic = Livvic({\n subsets: ['latin'],\n variable: '--font-livvic',\n weight: ['100', '200', '300', '400', '500', '600', '700', '900'],\n display: 'swap',\n});\n\nexport const metadata: Metadata = {\n title: '${answers.projectName}',\n description: '${answers.description}',\n};\n\nexport default function RootLayout({\n children,\n}: Readonly<{\n children: React.ReactNode;\n}>) {\n return (\n <html lang=\"en\" suppressHydrationWarning={true}>\n <body className={\\`\\${livvic.variable} bg-light dark:bg-dark antialiased\\`}>\n <RootProvider>\n {children}\n </RootProvider>\n </body>\n </html>\n );\n}\n`;\n await writeFile(path.join(projectPath, PROJECT_PATHS.ROOT_LAYOUT), basicLayout);\n\n const basicPage = `export default function Home() {\n return (\n <div className=\"flex min-h-screen flex-col items-center justify-center p-24\">\n <h1 className=\"text-4xl font-bold\">Welcome to ${answers.projectName}</h1>\n <p className=\"mt-4 text-xl\">Get started by editing src/app/page.tsx</p>\n </div>\n );\n}\n`;\n await writeFile(path.join(projectPath, PROJECT_PATHS.ROOT_PAGE), basicPage);\n }\n};\n", "import path from 'node:path';\nimport { readdir } from 'node:fs/promises';\nimport {\n deleteDirectory,\n deleteFile,\n fileExists,\n readFile,\n updateJson,\n writeFile,\n} from '../../core/files';\nimport { ProjectPrompts } from '../../prompts/create-app.prompt';\nimport { PROJECT_PATHS } from '../../config/paths';\nimport { PACKAGES } from '../../config/packages';\n\nexport const setupDevTools = async (\n projectPath: string,\n answers: ProjectPrompts,\n): Promise<void> => {\n await setupPreCommitHooks(projectPath, answers);\n await setupCommitizen(projectPath, answers);\n await setupCiCd(projectPath, answers);\n await setupGithubTemplates(projectPath, answers);\n await setupCommunityFiles(projectPath, answers);\n await setupDocker(projectPath, answers);\n await setupReadme(projectPath, answers);\n};\n\nconst setupPreCommitHooks = async (projectPath: string, answers: ProjectPrompts): Promise<void> => {\n if (!answers.preCommitHooks) {\n await deleteDirectory(path.join(projectPath, PROJECT_PATHS.HUSKY_DIR));\n await deleteFile(path.join(projectPath, 'commitlint.config.mjs'));\n await deleteFile(path.join(projectPath, '.lintstagedrc.mjs'));\n\n await updateJson(path.join(projectPath, PROJECT_PATHS.PACKAGE_JSON), (pkg) => {\n delete pkg.devDependencies[PACKAGES.HUSKY];\n delete pkg.devDependencies[PACKAGES.COMMITLINT_CLI];\n delete pkg.devDependencies[PACKAGES.COMMITLINT_CONFIG];\n delete pkg.devDependencies[PACKAGES.LINT_STAGED];\n delete pkg.scripts['prepare'];\n delete pkg.scripts['postinstall'];\n delete pkg.commitlint;\n delete pkg['lint-staged'];\n return pkg;\n });\n }\n};\n\nconst setupCommitizen = async (projectPath: string, answers: ProjectPrompts): Promise<void> => {\n if (!answers.commitizen) {\n await deleteFile(path.join(projectPath, '.czrc'));\n\n await updateJson(path.join(projectPath, PROJECT_PATHS.PACKAGE_JSON), (pkg) => {\n delete pkg.devDependencies[PACKAGES.COMMITIZEN];\n delete pkg.devDependencies[PACKAGES.CZ_CONVENTIONAL_CHANGELOG];\n delete pkg.config?.commitizen;\n if (pkg.config && Object.keys(pkg.config).length === 0) {\n delete pkg.config;\n }\n delete pkg.scripts['commit'];\n return pkg;\n });\n }\n};\n\nconst setupCiCd = async (projectPath: string, answers: ProjectPrompts): Promise<void> => {\n if (!answers.ci) {\n await deleteDirectory(path.join(projectPath, '.github/workflows'));\n }\n};\n\nconst setupGithubTemplates = async (\n projectPath: string,\n answers: ProjectPrompts,\n): Promise<void> => {\n const githubPath = path.join(projectPath, PROJECT_PATHS.GITHUB_DIR);\n if (!answers.keepTemplates) {\n await deleteDirectory(path.join(githubPath, 'ISSUE_TEMPLATE'));\n await deleteFile(path.join(githubPath, 'PULL_REQUEST_TEMPLATE.md'));\n } else {\n const issueTemplatePath = path.join(githubPath, 'ISSUE_TEMPLATE');\n const prTemplatePath = path.join(githubPath, 'PULL_REQUEST_TEMPLATE.md');\n\n const replacePlaceholders = (content: string) => {\n return content\n .replace(/Teispace/g, answers.company)\n .replace(/support@teispace\\.com/g, answers.email)\n .replace(/Next\\.js Starter/g, answers.projectName)\n .replace(/\\[AUTHOR\\]/g, answers.author)\n .replace(/\\[COMPANY\\]/g, answers.company)\n .replace(/\\[EMAIL\\]/g, answers.email);\n };\n\n if (fileExists(prTemplatePath)) {\n let content = await readFile(prTemplatePath);\n content = replacePlaceholders(content);\n await writeFile(prTemplatePath, content);\n }\n\n try {\n if (fileExists(issueTemplatePath)) {\n const files = await readdir(issueTemplatePath);\n for (const file of files) {\n const filePath = path.join(issueTemplatePath, file);\n let content = await readFile(filePath);\n content = replacePlaceholders(content);\n await writeFile(filePath, content);\n }\n }\n } catch {\n // Ignore\n }\n }\n};\n\nconst setupCommunityFiles = async (projectPath: string, answers: ProjectPrompts): Promise<void> => {\n const allCommunityFiles = ['CODE_OF_CONDUCT.md', 'CONTRIBUTING.md', 'SECURITY.md'];\n for (const file of allCommunityFiles) {\n if (!answers.communityFiles.includes(file)) {\n await deleteFile(path.join(projectPath, file));\n }\n }\n};\n\nconst setupDocker = async (projectPath: string, answers: ProjectPrompts): Promise<void> => {\n if (!answers.docker) {\n await deleteFile(path.join(projectPath, 'Dockerfile'));\n await deleteFile(path.join(projectPath, 'docker-compose.yml'));\n await deleteFile(path.join(projectPath, '.dockerignore'));\n\n const envPath = path.join(projectPath, PROJECT_PATHS.ENV_EXAMPLE);\n if (fileExists(envPath)) {\n let envContent = await readFile(envPath);\n envContent = envContent.replace(/# Docker Compose Configuration\\n/, '');\n envContent = envContent.replace(/CONTAINER_NAME=.*\\n/, '');\n envContent = envContent.replace(/IMAGE_NAME=.*\\n/, '');\n envContent = envContent.replace(/IMAGE_TAG=.*\\n/, '');\n await writeFile(envPath, envContent);\n }\n } else {\n const envPath = path.join(projectPath, PROJECT_PATHS.ENV_EXAMPLE);\n if (fileExists(envPath)) {\n let envContent = await readFile(envPath);\n const updateEnvVar = (key: string, value: string) => {\n const regex = new RegExp(`${key}=.*`);\n if (regex.test(envContent)) {\n envContent = envContent.replace(regex, `${key}=${value}`);\n } else {\n envContent += `${key}=${value}\\n`;\n }\n };\n\n updateEnvVar('CONTAINER_NAME', answers.containerName || 'next-app');\n updateEnvVar('IMAGE_NAME', answers.imageName || 'nextjs-starter');\n updateEnvVar('IMAGE_TAG', answers.imageTag || 'latest');\n\n await writeFile(envPath, envContent);\n }\n }\n};\n\nconst setupReadme = async (projectPath: string, answers: ProjectPrompts): Promise<void> => {\n const findReadmes = async (dir: string): Promise<string[]> => {\n const entries = await readdir(dir, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory() && entry.name !== 'node_modules' && entry.name !== '.git') {\n files.push(...(await findReadmes(fullPath)));\n } else if (entry.isFile() && entry.name.toLowerCase() === 'readme.md') {\n files.push(fullPath);\n }\n }\n return files;\n };\n\n const allReadmes = await findReadmes(projectPath);\n const rootReadmePath = path.join(projectPath, PROJECT_PATHS.README);\n\n for (const readmePath of allReadmes) {\n if (readmePath !== rootReadmePath) {\n await deleteFile(readmePath);\n }\n }\n\n if (answers.readme) {\n const simpleReadme = `# ${answers.projectName}\n\n${answers.description}\n\n## Getting Started\n\nFirst, run the development server:\n\n\\`\\`\\`bash\n${answers.packageManager === 'npm' ? 'npm run dev' : answers.packageManager + ' dev'}\n\\`\\`\\`\n\nOpen [http://localhost:3000](http://localhost:3000) with your browser to see the result.\n`;\n await writeFile(rootReadmePath, simpleReadme);\n } else {\n await deleteFile(rootReadmePath);\n }\n};\n", "import { Command } from 'commander';\nimport pc from 'picocolors';\nimport { log } from '../config';\n\nexport const registerFeatureCommand = (program: Command) => {\n program\n .command('feature [name]')\n .description('Generate a new feature module')\n .action(async () => {\n log(pc.yellow('Feature generation will be available soon!'));\n });\n};\n", "import { Command } from 'commander';\nimport { registerAppCommand } from './app';\nimport { registerFeatureCommand } from './feature';\n\nexport const registerCommands = (program: Command) => {\n registerAppCommand(program);\n registerFeatureCommand(program);\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Command", "path", "pc", "ora", "startSpinner", "text", "options", "spinner", "Enquirer", "prompt", "promptForProjectDetails", "initialName", "value", "answers", "fs", "path", "existsSync", "readFile", "filePath", "writeFile", "content", "deleteFile", "deleteDirectory", "dirPath", "updateJson", "update", "json", "updatedJson", "fileExists", "exec", "promisify", "execAsync", "initializeGit", "cwd", "error", "addRemote", "url", "exec", "promisify", "execAsync", "installDependencies", "cwd", "manager", "command", "error", "runScript", "script", "pc", "colorMap", "s", "print", "message", "color", "colorFn", "text", "error", "message", "print", "log", "message", "print", "printBanner", "setupCancellationHandlers", "options", "logger", "m", "exitOnCancel", "onCancel", "onUncaught", "err", "onRejection", "reason", "degit", "cloneTemplate", "projectPath", "spinner", "startSpinner", "degit", "error", "path", "PROJECT_PATHS", "PACKAGES", "configurePackageJson", "projectPath", "answers", "spinner", "startSpinner", "updateJson", "path", "PROJECT_PATHS", "pkg", "PACKAGES", "error", "path", "cleanupFeatures", "projectPath", "answers", "spinner", "startSpinner", "cleanupHttpClient", "cleanupSecureStorage", "cleanupRedux", "cleanupDarkMode", "cleanupI18n", "cleanupLicense", "cleanupChangelog", "cleanupConfig", "error", "httpUtilsPath", "path", "PROJECT_PATHS", "keepSecureStorage", "deleteDirectory", "writeFile", "deleteFile", "utilsIndexPath", "fileExists", "content", "readFile", "configIndexPath", "constantsPath", "typesIndexPath", "providersIndexPath", "providersIndexContent", "componentsIndexPath", "componentsIndexContent", "pagesToClean", "pagePath", "globalsCssPath", "cssContent", "nextConfigPath", "configContent", "countComponentPath", "path", "generateRootProvider", "projectPath", "answers", "imports", "providers", "rootProviderContent", "content", "writeFile", "path", "PROJECT_PATHS", "generateLayout", "basicLayout", "basicPage", "path", "readdir", "setupDevTools", "projectPath", "answers", "setupPreCommitHooks", "setupCommitizen", "setupCiCd", "setupGithubTemplates", "setupCommunityFiles", "setupDocker", "setupReadme", "deleteDirectory", "path", "PROJECT_PATHS", "deleteFile", "updateJson", "pkg", "PACKAGES", "githubPath", "issueTemplatePath", "prTemplatePath", "replacePlaceholders", "content", "fileExists", "readFile", "writeFile", "files", "readdir", "file", "filePath", "allCommunityFiles", "envPath", "envContent", "updateEnvVar", "key", "value", "regex", "findReadmes", "dir", "entries", "entry", "fullPath", "allReadmes", "rootReadmePath", "readmePath", "simpleReadme", "registerAppCommand", "program", "name", "createApp", "initialName", "printBanner", "log", "answers", "promptForProjectDetails", "projectPath", "path", "fileExists", "pc", "spinner", "startSpinner", "performCleanup", "deleteDirectory", "cleanupErr", "handleSignal", "cloneTemplate", "configurePackageJson", "cleanupFeatures", "generateRootProvider", "generateLayout", "setupDevTools", "initializeGit", "addRemote", "installDependencies", "runScript", "err", "pc", "registerFeatureCommand", "program", "log", "pc", "registerCommands", "program", "registerAppCommand", "registerFeatureCommand", "main", "setupCancellationHandlers", "m", "error", "program", "Command", "registerCommands", "err", "message"]
|
|
7
7
|
}
|
|
@@ -41,6 +41,8 @@ export declare const PROJECT_PATHS: {
|
|
|
41
41
|
readonly HTTP_UTILS: "src/lib/utils/http";
|
|
42
42
|
readonly AXIOS_CLIENT: "src/lib/utils/http/axios-client";
|
|
43
43
|
readonly FETCH_CLIENT: "src/lib/utils/http/fetch-client";
|
|
44
|
+
readonly CLIENT_UTILS: "src/lib/utils/http/client-utils.ts";
|
|
45
|
+
readonly APP_APIS: "src/lib/config/app-apis.ts";
|
|
44
46
|
readonly STORAGE_SERVICE: "src/services/storage";
|
|
45
47
|
readonly COUNTER_FEATURE: "src/features/counter";
|
|
46
48
|
readonly I18N_DIR: "src/i18n";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/config/paths.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/config/paths.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6DhB,CAAC"}
|