create-apppaaaul 2.0.31 → 2.0.34

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/dist/index.js CHANGED
@@ -22,7 +22,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
22
22
  mod
23
23
  ));
24
24
 
25
- // node_modules/.pnpm/tsup@8.4.0_typescript@5.8.2_yaml@2.4.5/node_modules/tsup/assets/cjs_shims.js
25
+ // node_modules/.pnpm/tsup@8.5.0_typescript@5.9.3_yaml@2.4.5/node_modules/tsup/assets/cjs_shims.js
26
26
  var getImportMetaUrl = () => typeof document === "undefined" ? new URL(`file:${__filename}`).href : document.currentScript && document.currentScript.src || new URL("main.js", document.baseURI).href;
27
27
  var importMetaUrl = /* @__PURE__ */ getImportMetaUrl();
28
28
 
@@ -149,12 +149,21 @@ async function main() {
149
149
  await (0, import_promises.rename)(file, newPath);
150
150
  }
151
151
  }
152
- await (0, import_promises.rename)(import_node_path.default.join(destination, ".env.test"), import_node_path.default.join(destination, ".env"));
152
+ try {
153
+ await (0, import_promises.rename)(import_node_path.default.join(destination, ".env.test"), import_node_path.default.join(destination, ".env"));
154
+ console.log(`${import_picocolors2.default.green("\u2713")} Renamed .env.test to .env`);
155
+ } catch (error) {
156
+ console.log(`${import_picocolors2.default.yellow("\u26A0")} .env.test file not found, skipping rename...`);
157
+ }
153
158
  const files = await (0, import_glob.glob)(`**/*`, { nodir: true, cwd: destination, absolute: true });
154
159
  for await (const file of files) {
155
- const data = await (0, import_promises.readFile)(file, "utf8");
156
- const draft = data.replace(/{{name}}/g, project.name);
157
- await (0, import_promises.writeFile)(file, draft, "utf8");
160
+ try {
161
+ const data = await (0, import_promises.readFile)(file, "utf8");
162
+ const draft = data.replace(/{{name}}/g, project.name);
163
+ await (0, import_promises.writeFile)(file, draft, "utf8");
164
+ } catch (error) {
165
+ console.log(`${import_picocolors2.default.yellow("\u26A0")} Could not process file: ${import_node_path.default.basename(file)}`);
166
+ }
158
167
  }
159
168
  console.log("\n\u2728 Project created \u2728");
160
169
  if (project.name !== "." && project.name !== currentDirName) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/.pnpm/tsup@8.4.0_typescript@5.8.2_yaml@2.4.5/node_modules/tsup/assets/cjs_shims.js","../index.ts","../helpers/install.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () =>\n typeof document === 'undefined'\n ? new URL(`file:${__filename}`).href\n : (document.currentScript && document.currentScript.src) ||\n new URL('main.js', document.baseURI).href\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","#!/usr/bin/env node\r\n\r\nimport path from \"node:path\";\r\nimport { fileURLToPath } from \"node:url\";\r\nimport { cp, readFile, writeFile, access, rename } from \"node:fs/promises\";\r\nimport { exec } from \"child_process\";\r\nimport { promisify } from \"util\";\r\n\r\nimport { cyan, green, red, yellow } from \"picocolors\";\r\nimport { glob } from \"glob\";\r\nimport color from \"picocolors\";\r\nimport prompts from \"prompts\";\r\nimport yargs from \"yargs\";\r\nimport { hideBin } from \"yargs/helpers\";\r\n\r\nimport { install } from \"./helpers/install\";\r\nconst execAsync = promisify(exec);\r\n\r\n// Define the templates available\r\nconst TEMPLATES = [\r\n {\r\n title: \"Nextjs ts with db setup Landing with prisma\",\r\n value: \"nextjs-ts-landing-prisma\",\r\n },\r\n {\r\n title: 'Nextjs ts clean',\r\n value: 'nextjs-ts-clean'\r\n }\r\n];\r\n\r\n// Specify CLI arguments\r\nconst args = yargs(hideBin(process.argv)).options({\r\n name: {\r\n alias: \"n\",\r\n type: \"string\",\r\n description: \"Name of the project\",\r\n },\r\n template: {\r\n alias: \"t\",\r\n type: \"string\",\r\n description: \"Template to use\",\r\n },\r\n});\r\n\r\n// Override arguments passed on the CLI\r\nprompts.override(args.argv);\r\n\r\nasync function main() {\r\n // Get the initial values for the prompts\r\n const {\r\n _: [initialName, initialProject],\r\n } = await args.argv;\r\n\r\n // Get the current directory name as default project name\r\n const currentDirName = path.basename(process.cwd());\r\n const defaultProjectName = initialName || currentDirName;\r\n\r\n // Create the project prompt\r\n const project = await prompts(\r\n [\r\n {\r\n type: \"text\",\r\n name: \"name\",\r\n message: `What is the name of your project? (suggested: ${currentDirName})`,\r\n initial: defaultProjectName,\r\n validate: (value) => {\r\n if (value !== \".\" && value.match(/[^a-zA-Z0-9-_]+/g)) {\r\n return \"Project name can only contain letters, numbers, dashes, underscores, or be '.' for the current directory\";\r\n }\r\n\r\n return true;\r\n },\r\n },\r\n {\r\n type: \"select\",\r\n name: \"template\",\r\n message: `Which template would you like to use?`,\r\n initial: initialProject || 0,\r\n choices: TEMPLATES,\r\n },\r\n ],\r\n {\r\n onCancel: () => {\r\n console.log(\"\\nBye 👋\\n\");\r\n\r\n process.exit(0);\r\n },\r\n },\r\n );\r\n\r\n // Get the template folder for the selected template\r\n const template = path.join(\r\n path.dirname(fileURLToPath(import.meta.url)),\r\n \"templates\",\r\n project.template,\r\n );\r\n\r\n // Get the destination folder for the project\r\n // If the user chose the same name as the current directory, use current directory\r\n const destination = (project.name === \".\" || project.name === currentDirName) \r\n ? process.cwd() \r\n : path.join(process.cwd(), project.name);\r\n\r\n // Copy files from the template folder to the current directory\r\n await cp(path.join(template, \"project\"), destination, { recursive: true });\r\n\r\n // Copy additional files from aditionals folder within the template\r\n try {\r\n const aditionalsPath = path.join(template, \"aditionals\");\r\n await access(aditionalsPath);\r\n \r\n // Use cp with recursive to copy all files including dotfiles\r\n await cp(aditionalsPath, destination, { recursive: true });\r\n \r\n console.log(`${color.green(\"✓\")} Copied additional files`);\r\n } catch (error) {\r\n console.log(`${color.yellow(\"⚠\")} Additional files folder not found in template, skipping...`);\r\n }\r\n\r\n // Get all files from the destination folder\r\n const aditionalsFiles = await glob(`**/*`, {nodir: true, cwd: destination, absolute: true});\r\n\r\n // Rename files with %% prefix\r\n for await (const file of aditionalsFiles) {\r\n const basename = path.basename(file);\r\n\r\n if (basename.startsWith(\"%%\")) {\r\n const newPath = path.join(path.dirname(file), basename.slice(2));\r\n await rename(file, newPath);\r\n }\r\n }\r\n\r\n // Rename .env.test to .env\r\n await rename(path.join(destination, \".env.test\"), path.join(destination, \".env\"));\r\n\r\n // Get all files from the destination folder\r\n const files = await glob(`**/*`, { nodir: true, cwd: destination, absolute: true });\r\n\r\n // Read each file and replace the tokens\r\n for await (const file of files) {\r\n const data = await readFile(file, \"utf8\");\r\n const draft = data.replace(/{{name}}/g, project.name);\r\n\r\n await writeFile(file, draft, \"utf8\");\r\n }\r\n\r\n // Log outro message\r\n console.log(\"\\n✨ Project created ✨\");\r\n\r\n // Run commands if a new directory was created\r\n if (project.name !== \".\" && project.name !== currentDirName) {\r\n try {\r\n await execAsync(`cd ${project.name}`);\r\n console.log(`\\n${color.green(`cd`)} ${project.name}`);\r\n \r\n // Check if user modified the suggested folder name\r\n const suggestedFolderName = project.name.toLowerCase().replace(/[^a-z0-9]/g, '-');\r\n const isDefaultFolder = destination.endsWith(suggestedFolderName);\r\n \r\n if (isDefaultFolder) {\r\n // User didn't modify the folder name, check if git is initialized\r\n console.log(`${color.green(\"✓\")} Using default folder name, checking git status...`);\r\n \r\n try {\r\n // Check if git is already initialized\r\n await execAsync(\"git status\", { cwd: destination });\r\n console.log(`${color.green(\"✓\")} Git repository detected`);\r\n \r\n // Add all files to git\r\n await execAsync(\"git add .\", { cwd: destination });\r\n console.log(`${color.green(\"✓\")} Files added to git`);\r\n \r\n // Make first commit\r\n await execAsync('git commit -m \"First commit\"', { cwd: destination });\r\n console.log(`${color.green(\"✓\")} First commit created`);\r\n \r\n // Try to push to origin\r\n try {\r\n await execAsync(\"git push\", { cwd: destination });\r\n console.log(`${color.green(\"✓\")} Pushed to origin`);\r\n } catch (pushError) {\r\n console.log(`${color.yellow(\"⚠\")} Could not push to origin (remote may not be configured)`);\r\n }\r\n \r\n // Create dev branch\r\n await execAsync(\"git checkout -b dev\", { cwd: destination });\r\n console.log(`${color.green(\"✓\")} Created dev branch`);\r\n \r\n // Try to push dev branch to origin\r\n try {\r\n await execAsync(\"git push -u origin dev\", { cwd: destination });\r\n console.log(`${color.green(\"✓\")} Pushed dev branch to origin`);\r\n } catch (pushError) {\r\n console.log(`${color.yellow(\"⚠\")} Could not push dev branch to origin`);\r\n }\r\n } catch (gitError) {\r\n // Git not initialized, initialize it\r\n console.log(`${color.yellow(\"⚠\")} Git not initialized, initializing git repository...`);\r\n \r\n // Initialize git repository\r\n await execAsync(\"git init\", { cwd: destination });\r\n console.log(`${color.green(\"✓\")} Git repository initialized`);\r\n \r\n // Add all files to git\r\n await execAsync(\"git add .\", { cwd: destination });\r\n console.log(`${color.green(\"✓\")} Files added to git`);\r\n \r\n // Make first commit\r\n await execAsync('git commit -m \"First commit\"', { cwd: destination });\r\n console.log(`${color.green(\"✓\")} First commit created`);\r\n \r\n // Create dev branch\r\n await execAsync(\"git checkout -b dev\", { cwd: destination });\r\n console.log(`${color.green(\"✓\")} Created dev branch`);\r\n }\r\n } else {\r\n // User modified the folder name, check if git is initialized\r\n try {\r\n await execAsync(\"git status\", { cwd: destination });\r\n console.log(`${color.green(\"✓\")} Git repository detected`);\r\n \r\n // Create dev branch if git is initialized\r\n await execAsync(\"git checkout -b dev\", { cwd: destination });\r\n console.log(`${color.green(\"✓\")} Created dev branch`);\r\n \r\n // Try to push to origin if remote exists\r\n try {\r\n await execAsync(\"git push -u origin dev\", { cwd: destination });\r\n console.log(`${color.green(\"✓\")} Pushed dev branch to origin`);\r\n } catch (pushError) {\r\n console.log(`${color.yellow(\"⚠\")} Could not push to origin (remote may not be configured)`);\r\n }\r\n } catch (gitError) {\r\n console.log(`${color.yellow(\"⚠\")} Git not initialized, initializing git repository...`);\r\n \r\n // Initialize git repository\r\n await execAsync(\"git init\", { cwd: destination });\r\n console.log(`${color.green(\"✓\")} Git repository initialized`);\r\n \r\n // Add all files to git\r\n await execAsync(\"git add .\", { cwd: destination });\r\n console.log(`${color.green(\"✓\")} Files added to git`);\r\n \r\n // Make first commit\r\n await execAsync('git commit -m \"First commit\"', { cwd: destination });\r\n console.log(`${color.green(\"✓\")} First commit created`);\r\n \r\n // Create dev branch\r\n await execAsync(\"git checkout -b dev\", { cwd: destination });\r\n console.log(`${color.green(\"✓\")} Created dev branch`);\r\n }\r\n }\r\n } catch (error) {\r\n console.error(`Error executing commands: ${error}`);\r\n }\r\n }\r\n try {\r\n await execAsync(\"cursor .\");\r\n console.log(\"Installing packages. This might take a couple of minutes.\");\r\n console.log();\r\n await install();\r\n console.log();\r\n console.log(`${green(\"Success!\")} App installed successfully.`);\r\n } catch (error) {\r\n console.error(`Error executing commands: ${error}`);\r\n }\r\n}\r\n\r\n// Run the main function\r\nmain().catch(console.error);\r\n","import spawn from \"cross-spawn\";\r\nimport { yellow } from \"picocolors\";\r\n\r\nexport async function install(): Promise<void> {\r\n const packageManager = \"pnpm\";\r\n const args: string[] = [\"install\"];\r\n\r\n return new Promise((resolve, reject) => {\r\n /**\r\n * Spawn the installation process.\r\n */\r\n const child = spawn(packageManager, args, {\r\n stdio: \"inherit\",\r\n env: {\r\n ...process.env,\r\n ADBLOCK: \"1\",\r\n // we set NODE_ENV to development as pnpm skips dev\r\n // dependencies when production\r\n NODE_ENV: \"development\",\r\n DISABLE_OPENCOLLECTIVE: \"1\",\r\n },\r\n });\r\n\r\n child.on(\"close\", (code) => {\r\n if (code !== 0) {\r\n reject({ command: `${packageManager} ${args.join(\" \")}` });\r\n\r\n return;\r\n }\r\n resolve();\r\n });\r\n });\r\n}\r\n"],"mappings":"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","names":["import_picocolors","args","spawn","yargs","prompts","path","color"]}
1
+ {"version":3,"sources":["../node_modules/.pnpm/tsup@8.5.0_typescript@5.9.3_yaml@2.4.5/node_modules/tsup/assets/cjs_shims.js","../index.ts","../helpers/install.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () =>\n typeof document === 'undefined'\n ? new URL(`file:${__filename}`).href\n : (document.currentScript && document.currentScript.src) ||\n new URL('main.js', document.baseURI).href\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","#!/usr/bin/env node\r\n\r\nimport path from \"node:path\";\r\nimport { fileURLToPath } from \"node:url\";\r\nimport { cp, readFile, writeFile, access, rename } from \"node:fs/promises\";\r\nimport { exec } from \"child_process\";\r\nimport { promisify } from \"util\";\r\n\r\nimport { cyan, green, red, yellow } from \"picocolors\";\r\nimport { glob } from \"glob\";\r\nimport color from \"picocolors\";\r\nimport prompts from \"prompts\";\r\nimport yargs from \"yargs\";\r\nimport { hideBin } from \"yargs/helpers\";\r\n\r\nimport { install } from \"./helpers/install\";\r\nconst execAsync = promisify(exec);\r\n\r\n// Define the templates available\r\nconst TEMPLATES = [\r\n {\r\n title: \"Nextjs ts with db setup Landing with prisma\",\r\n value: \"nextjs-ts-landing-prisma\",\r\n },\r\n {\r\n title: 'Nextjs ts clean',\r\n value: 'nextjs-ts-clean'\r\n }\r\n];\r\n\r\n// Specify CLI arguments\r\nconst args = yargs(hideBin(process.argv)).options({\r\n name: {\r\n alias: \"n\",\r\n type: \"string\",\r\n description: \"Name of the project\",\r\n },\r\n template: {\r\n alias: \"t\",\r\n type: \"string\",\r\n description: \"Template to use\",\r\n },\r\n});\r\n\r\n// Override arguments passed on the CLI\r\nprompts.override(args.argv);\r\n\r\nasync function main() {\r\n // Get the initial values for the prompts\r\n const {\r\n _: [initialName, initialProject],\r\n } = await args.argv;\r\n\r\n // Get the current directory name as default project name\r\n const currentDirName = path.basename(process.cwd());\r\n const defaultProjectName = initialName || currentDirName;\r\n\r\n // Create the project prompt\r\n const project = await prompts(\r\n [\r\n {\r\n type: \"text\",\r\n name: \"name\",\r\n message: `What is the name of your project? (suggested: ${currentDirName})`,\r\n initial: defaultProjectName,\r\n validate: (value) => {\r\n if (value !== \".\" && value.match(/[^a-zA-Z0-9-_]+/g)) {\r\n return \"Project name can only contain letters, numbers, dashes, underscores, or be '.' for the current directory\";\r\n }\r\n\r\n return true;\r\n },\r\n },\r\n {\r\n type: \"select\",\r\n name: \"template\",\r\n message: `Which template would you like to use?`,\r\n initial: initialProject || 0,\r\n choices: TEMPLATES,\r\n },\r\n ],\r\n {\r\n onCancel: () => {\r\n console.log(\"\\nBye 👋\\n\");\r\n\r\n process.exit(0);\r\n },\r\n },\r\n );\r\n\r\n // Get the template folder for the selected template\r\n const template = path.join(\r\n path.dirname(fileURLToPath(import.meta.url)),\r\n \"templates\",\r\n project.template,\r\n );\r\n\r\n // Get the destination folder for the project\r\n // If the user chose the same name as the current directory, use current directory\r\n const destination = (project.name === \".\" || project.name === currentDirName) \r\n ? process.cwd() \r\n : path.join(process.cwd(), project.name);\r\n\r\n // Copy files from the template folder to the current directory\r\n await cp(path.join(template, \"project\"), destination, { recursive: true });\r\n\r\n // Copy additional files from aditionals folder within the template\r\n try {\r\n const aditionalsPath = path.join(template, \"aditionals\");\r\n await access(aditionalsPath);\r\n \r\n // Use cp with recursive to copy all files including dotfiles\r\n await cp(aditionalsPath, destination, { recursive: true });\r\n \r\n console.log(`${color.green(\"✓\")} Copied additional files`);\r\n } catch (error) {\r\n console.log(`${color.yellow(\"⚠\")} Additional files folder not found in template, skipping...`);\r\n }\r\n\r\n // Get all files from the destination folder\r\n const aditionalsFiles = await glob(`**/*`, {nodir: true, cwd: destination, absolute: true});\r\n\r\n // Rename files with %% prefix\r\n for await (const file of aditionalsFiles) {\r\n const basename = path.basename(file);\r\n\r\n if (basename.startsWith(\"%%\")) {\r\n const newPath = path.join(path.dirname(file), basename.slice(2));\r\n await rename(file, newPath);\r\n }\r\n }\r\n\r\n // Rename .env.test to .env if it exists\r\n try {\r\n await rename(path.join(destination, \".env.test\"), path.join(destination, \".env\"));\r\n console.log(`${color.green(\"✓\")} Renamed .env.test to .env`);\r\n } catch (error) {\r\n console.log(`${color.yellow(\"⚠\")} .env.test file not found, skipping rename...`);\r\n }\r\n\r\n // Get all files from the destination folder\r\n const files = await glob(`**/*`, { nodir: true, cwd: destination, absolute: true });\r\n\r\n // Read each file and replace the tokens\r\n for await (const file of files) {\r\n try {\r\n const data = await readFile(file, \"utf8\");\r\n const draft = data.replace(/{{name}}/g, project.name);\r\n\r\n await writeFile(file, draft, \"utf8\");\r\n } catch (error) {\r\n console.log(`${color.yellow(\"⚠\")} Could not process file: ${path.basename(file)}`);\r\n }\r\n }\r\n\r\n // Log outro message\r\n console.log(\"\\n✨ Project created ✨\");\r\n\r\n // Run commands if a new directory was created\r\n if (project.name !== \".\" && project.name !== currentDirName) {\r\n try {\r\n await execAsync(`cd ${project.name}`);\r\n console.log(`\\n${color.green(`cd`)} ${project.name}`);\r\n \r\n // Check if user modified the suggested folder name\r\n const suggestedFolderName = project.name.toLowerCase().replace(/[^a-z0-9]/g, '-');\r\n const isDefaultFolder = destination.endsWith(suggestedFolderName);\r\n \r\n if (isDefaultFolder) {\r\n // User didn't modify the folder name, check if git is initialized\r\n console.log(`${color.green(\"✓\")} Using default folder name, checking git status...`);\r\n \r\n try {\r\n // Check if git is already initialized\r\n await execAsync(\"git status\", { cwd: destination });\r\n console.log(`${color.green(\"✓\")} Git repository detected`);\r\n \r\n // Add all files to git\r\n await execAsync(\"git add .\", { cwd: destination });\r\n console.log(`${color.green(\"✓\")} Files added to git`);\r\n \r\n // Make first commit\r\n await execAsync('git commit -m \"First commit\"', { cwd: destination });\r\n console.log(`${color.green(\"✓\")} First commit created`);\r\n \r\n // Try to push to origin\r\n try {\r\n await execAsync(\"git push\", { cwd: destination });\r\n console.log(`${color.green(\"✓\")} Pushed to origin`);\r\n } catch (pushError) {\r\n console.log(`${color.yellow(\"⚠\")} Could not push to origin (remote may not be configured)`);\r\n }\r\n \r\n // Create dev branch\r\n await execAsync(\"git checkout -b dev\", { cwd: destination });\r\n console.log(`${color.green(\"✓\")} Created dev branch`);\r\n \r\n // Try to push dev branch to origin\r\n try {\r\n await execAsync(\"git push -u origin dev\", { cwd: destination });\r\n console.log(`${color.green(\"✓\")} Pushed dev branch to origin`);\r\n } catch (pushError) {\r\n console.log(`${color.yellow(\"⚠\")} Could not push dev branch to origin`);\r\n }\r\n } catch (gitError) {\r\n // Git not initialized, initialize it\r\n console.log(`${color.yellow(\"⚠\")} Git not initialized, initializing git repository...`);\r\n \r\n // Initialize git repository\r\n await execAsync(\"git init\", { cwd: destination });\r\n console.log(`${color.green(\"✓\")} Git repository initialized`);\r\n \r\n // Add all files to git\r\n await execAsync(\"git add .\", { cwd: destination });\r\n console.log(`${color.green(\"✓\")} Files added to git`);\r\n \r\n // Make first commit\r\n await execAsync('git commit -m \"First commit\"', { cwd: destination });\r\n console.log(`${color.green(\"✓\")} First commit created`);\r\n \r\n // Create dev branch\r\n await execAsync(\"git checkout -b dev\", { cwd: destination });\r\n console.log(`${color.green(\"✓\")} Created dev branch`);\r\n }\r\n } else {\r\n // User modified the folder name, check if git is initialized\r\n try {\r\n await execAsync(\"git status\", { cwd: destination });\r\n console.log(`${color.green(\"✓\")} Git repository detected`);\r\n \r\n // Create dev branch if git is initialized\r\n await execAsync(\"git checkout -b dev\", { cwd: destination });\r\n console.log(`${color.green(\"✓\")} Created dev branch`);\r\n \r\n // Try to push to origin if remote exists\r\n try {\r\n await execAsync(\"git push -u origin dev\", { cwd: destination });\r\n console.log(`${color.green(\"✓\")} Pushed dev branch to origin`);\r\n } catch (pushError) {\r\n console.log(`${color.yellow(\"⚠\")} Could not push to origin (remote may not be configured)`);\r\n }\r\n } catch (gitError) {\r\n console.log(`${color.yellow(\"⚠\")} Git not initialized, initializing git repository...`);\r\n \r\n // Initialize git repository\r\n await execAsync(\"git init\", { cwd: destination });\r\n console.log(`${color.green(\"✓\")} Git repository initialized`);\r\n \r\n // Add all files to git\r\n await execAsync(\"git add .\", { cwd: destination });\r\n console.log(`${color.green(\"✓\")} Files added to git`);\r\n \r\n // Make first commit\r\n await execAsync('git commit -m \"First commit\"', { cwd: destination });\r\n console.log(`${color.green(\"✓\")} First commit created`);\r\n \r\n // Create dev branch\r\n await execAsync(\"git checkout -b dev\", { cwd: destination });\r\n console.log(`${color.green(\"✓\")} Created dev branch`);\r\n }\r\n }\r\n } catch (error) {\r\n console.error(`Error executing commands: ${error}`);\r\n }\r\n }\r\n try {\r\n await execAsync(\"cursor .\");\r\n console.log(\"Installing packages. This might take a couple of minutes.\");\r\n console.log();\r\n await install();\r\n console.log();\r\n console.log(`${green(\"Success!\")} App installed successfully.`);\r\n } catch (error) {\r\n console.error(`Error executing commands: ${error}`);\r\n }\r\n}\r\n\r\n// Run the main function\r\nmain().catch(console.error);\r\n","import spawn from \"cross-spawn\";\r\nimport { yellow } from \"picocolors\";\r\n\r\nexport async function install(): Promise<void> {\r\n const packageManager = \"pnpm\";\r\n const args: string[] = [\"install\"];\r\n\r\n return new Promise((resolve, reject) => {\r\n /**\r\n * Spawn the installation process.\r\n */\r\n const child = spawn(packageManager, args, {\r\n stdio: \"inherit\",\r\n env: {\r\n ...process.env,\r\n ADBLOCK: \"1\",\r\n // we set NODE_ENV to development as pnpm skips dev\r\n // dependencies when production\r\n NODE_ENV: \"development\",\r\n DISABLE_OPENCOLLECTIVE: \"1\",\r\n },\r\n });\r\n\r\n child.on(\"close\", (code) => {\r\n if (code !== 0) {\r\n reject({ command: `${packageManager} ${args.join(\" \")}` });\r\n\r\n return;\r\n }\r\n resolve();\r\n });\r\n });\r\n}\r\n"],"mappings":"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","names":["import_picocolors","args","spawn","yargs","prompts","path","color"]}
@@ -0,0 +1,34 @@
1
+ # Checklist
2
+ - [ ] Auditoria seguridad
3
+ - [ ] Configurar sitemap
4
+ - [ ] Configurar plausible
5
+ - [ ] Configurar search-console
6
+
7
+
8
+
9
+ # Prompts
10
+ Auditoria de seguridad (claude 4.5 + plan + max mode)
11
+ ```
12
+ ROLE: Senior AppSec engineer auditing a Next.js 15 + TypeScript + Prisma repo + postgresql + betterauth, with Resend on custom linux server.
13
+
14
+ GOAL: Find and fix (1) secret/ENV exposure, (2) XSS, (3) auth/authz/session issues. Also check CSRF, SSRF, SQL/NoSQL injection, headers/CSP, webhooks, uploads, rate limits, CORS, caching/data leakage, logging/PII, CI/CD leaks.
15
+
16
+ METHOD:
17
+ - Map quickly: package.json, next.config.*, middleware.ts, app/**/route.ts, server actions, prisma/schema.prisma, auth config, webhook handlers, upload flows.
18
+ - Targeted search (must cite file:line + short codeframe):
19
+ • Client files exposing non-NEXT_PUBLIC envs: `process.env.(?!NEXT_PUBLIC_)`
20
+ • XSS sinks: `dangerouslySetInnerHTML|innerHTML`, markdown renderers w/o sanitize
21
+ • Prisma raw: `.$queryRawUnsafe|.$executeRawUnsafe`
22
+ • User-controlled fetch/redirects (SSRF/open redirect)
23
+ • Missing guards on server actions/API routes; RLS gaps
24
+ • CSRF on cookie-backed mutations; Origin/Referer checks
25
+ • Security headers/CSP presence
26
+ • Stripe webhook signature/idempotency
27
+ - Output:
28
+ 1) “Audit Summary” (risk + 3–6 key issues)
29
+ 2) “Findings” table (Sev|Category|File:Line|Evidence|Risk|Short Fix)
30
+ 3) Minimal unified diffs for each fix + 1-line verification step
31
+ RULES: No hypotheticals—every finding has file:line evidence. Patches must compile.
32
+
33
+ START: Print top 10 checks you’ll run, then proceed with findings → diffs → verification.
34
+ ```
@@ -1,15 +1,27 @@
1
- ## Getting Started with {{name}}
1
+ ## ENV
2
+ # DB prod
3
+ #DATABASE_URL=""
2
4
 
3
- First, run the development server:
5
+ # DB local
6
+ DATABASE_URL="postgres://postgres:1234@localhost/postgres"
4
7
 
5
- ```bash
6
- npm run dev
7
- # or
8
- yarn dev
9
- # or
10
- pnpm dev
11
- ```
8
+ # Better auth
9
+ BETTER_AUTH_SECRET=""
10
+ GOOGLE_CLIENT_ID=""
11
+ GOOGLE_CLIENT_SECRET=""
12
+ BETTER_AUTH_URL="http://localhost:3000"
13
+ NEXT_PUBLIC_BETTER_AUTH_URL="http://localhost:3000"
12
14
 
13
- Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
15
+ # Resend
16
+ AUTH_RESEND_KEY=""
17
+ RESEND_API_KEY=""
18
+ RESEND_FROM_EMAIL="noreply@outreach.nuvace.com"
14
19
 
15
- You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
20
+ # Cloudflare
21
+ CLOUDFLARE_ACCESS_KEY=""
22
+ CLOUDFLARE_BUCKET=""
23
+ CLOUDFLARE_ENDPOINT=""
24
+ CLOUDFLARE_SECRET_KEY=""
25
+ CLOUDFLARE_TOKEN=""
26
+ CLOUDFLARE_ACCOUNT_ID=""
27
+ CLOUDFLARE_PUBLIC_URL=""
@@ -18,9 +18,13 @@
18
18
  "@auth/prisma-adapter": "^2.11.0",
19
19
  "@aws-sdk/client-s3": "^3.916.0",
20
20
  "@aws-sdk/s3-request-presigner": "^3.916.0",
21
+ "@eslint-react/eslint-plugin": "^2.2.3",
22
+ "@eslint/eslintrc": "^3.3.1",
23
+ "@eslint/js": "^9.38.0",
21
24
  "@prisma/client": "^6.18.0",
22
25
  "@radix-ui/react-slot": "^1.2.3",
23
26
  "@react-email/render": "^1.4.0",
27
+ "@stylistic/eslint-plugin": "^5.5.0",
24
28
  "@tailwindcss/postcss": "^4.1.16",
25
29
  "autoprefixer": "^10.4.21",
26
30
  "bcryptjs": "^3.0.2",
@@ -31,6 +35,8 @@
31
35
  "lucide-react": "^0.547.0",
32
36
  "motion": "^12.23.24",
33
37
  "next": "^16.0.0",
38
+ "next-plausible": "^3.12.4",
39
+ "next-sitemap": "^4.2.3",
34
40
  "postcss": "^8.5.6",
35
41
  "postgres": "^3.4.7",
36
42
  "react": "^19.2.0",
@@ -3,6 +3,7 @@ import type { Metadata } from "next";
3
3
  import Link from "next/link";
4
4
 
5
5
  import "./globals.css";
6
+ import { PlausibleProvider } from "next-plausible";
6
7
 
7
8
  export const metadata: Metadata = {
8
9
  title: "{{name}}",
@@ -12,6 +13,15 @@ export const metadata: Metadata = {
12
13
  export default function RootLayout({ children }: { children: React.ReactNode }) {
13
14
  return (
14
15
  <html lang="en">
16
+ <head>
17
+ <PlausibleProvider
18
+ selfHosted
19
+ taggedEvents
20
+ trackOutboundLinks
21
+ customDomain="https://plausible.nuvace.com"
22
+ domain="{{name}}.com"
23
+ />
24
+ </head>
15
25
  <body className="bg-background container m-auto grid min-h-screen grid-rows-[auto,1fr,auto] px-4 font-sans antialiased">
16
26
  <header className="text-xl font-bold leading-[4rem]">
17
27
  <Link href="/">{{ name }}</Link>
@@ -12,15 +12,16 @@ const publicRoutes = [
12
12
  "/politica-privacidad",
13
13
  "/terminos-condiciones",
14
14
  "/api/auth",
15
+ "/dashboard"
15
16
  ];
16
17
 
17
18
  // Rutas que requieren autenticación de usuario (role: user)
18
- const userRoutes = ["/dashboard"];
19
+ const userRoutes = [""];
19
20
 
20
21
  // Rutas que requieren autenticación de admin (role: admin)
21
22
  const adminRoutes = ["/admin"];
22
23
 
23
- export async function middleware(request: NextRequest) {
24
+ export async function proxy(request: NextRequest) {
24
25
  const { pathname } = request.nextUrl;
25
26
 
26
27
  // Verificar si la ruta es pública
@@ -59,7 +60,7 @@ export async function middleware(request: NextRequest) {
59
60
  }
60
61
  } catch (error) {
61
62
  // Si hay error obteniendo los datos del usuario, log detallado y permitir continuar
62
- console.error("Error checking user status in middleware:", {
63
+ console.error("Error checking user status in proxy:", {
63
64
  error: error instanceof Error ? error.message : error,
64
65
  userId: session.user.id,
65
66
  pathname,
@@ -75,7 +76,7 @@ export async function middleware(request: NextRequest) {
75
76
  return NextResponse.redirect(new URL("/dashboard", request.url));
76
77
  }
77
78
 
78
- // Verificar rutas de usuario
79
+ // Verificar rutas de usuario y dashboard
79
80
  const isUserRoute = userRoutes.some((route) => pathname.startsWith(route));
80
81
 
81
82
  if (isUserRoute && userRole !== "user" && userRole !== "admin") {
@@ -99,7 +100,7 @@ export async function middleware(request: NextRequest) {
99
100
  export const config = {
100
101
  runtime: "nodejs",
101
102
  matcher: [
102
- // Aplicar middleware a todas las rutas excepto archivos estáticos
103
+ // Aplicar proxy a todas las rutas excepto archivos estáticos
103
104
  "/((?!_next/static|_next/image|favicon.ico|.*\\.(?:svg|png|jpg|jpeg|gif|webp)$).*)",
104
105
  ],
105
106
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-apppaaaul",
3
- "version": "2.0.31",
3
+ "version": "2.0.34",
4
4
  "description": "Create projects as paaauldev would",
5
5
  "main": "index.mjs",
6
6
  "bin": {