diff --git a/docs/DEV.md b/docs/DEV.md index 4a107df..4ee9fbe 100644 --- a/docs/DEV.md +++ b/docs/DEV.md @@ -13,7 +13,7 @@ On suit ces deux guides : ``` src/ -├── cli/ # Scripts CLI : zen-db, zen-setup +├── cli/ # Scripts CLI : zen-db ├── core/ # Briques techniques : database, api, email, storage, cron, pdf, toast, payments ├── features/ # Features utilisateur : auth, admin, provider ├── modules/ # Modules métier : posts, invoice, nuage… diff --git a/docs/INSTALL.md b/docs/INSTALL.md index 27379af..f82b9ca 100644 --- a/docs/INSTALL.md +++ b/docs/INSTALL.md @@ -1,69 +1,23 @@ # Installation -## 1. Configurer le registre npm - -Créer un fichier `.npmrc` à la racine du projet avec le contenu suivant : - -``` -@zen:registry=https://git.hyko.cx/api/packages/zen/npm/ -``` - -## 2. Installer le package +## 1. Configurer le registre pour le scope `@zen` : ```bash -npm install @zen/core +npm config set @zen:registry https://git.hyko.cx/api/packages/zen/npm/ ``` -## 3. Installer les styles +## 2. Lancer le CLI : -Ajouter la ligne suivante dans le fichier `globals.css` : - -```css -@import '@zen/core/styles/zen.css'; +```bash +npx @zen/start ``` -## 4. Ajouter ZenProvider au layout racine +## 3. Configurer les variables d'environnement -Entourer l'application avec `ZenProvider` dans le layout racine pour activer les notifications toast globalement : +Consulter le fichier [`.env.example`](../.env.example) pour les variables d'environnement à ajouter dans le fichier `.env`. -```javascript -// app/layout.js -import './globals.css'; -import { ZenProvider } from '@zen/core/provider'; - -export const metadata = { - title: 'My App', -}; - -export default function RootLayout({ children }) { - return ( - - - - {children} - - - - ); -} -``` - -## 5. Configurer les variables d'environnement - -Consulter le fichier [`.env.example`](.env.example) pour les variables d'environnement à ajouter dans le fichier `.env`. - -## 6. Initialiser la base de données +## 4. Initialiser la base de données ```bash npx zen-db init ``` - -# Configuration - -## Configuration rapide - -On peut créer tous les fichiers requis avec une seule commande : - -```bash -npx zen-setup init -``` \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 531e962..50712d1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,8 +21,7 @@ "stripe": "^14.0.0" }, "bin": { - "zen-db": "dist/cli/database.js", - "zen-setup": "dist/cli/setup.js" + "zen-db": "dist/cli/database.js" }, "devDependencies": { "@tailwindcss/cli": "^4.2.1", diff --git a/package.json b/package.json index ea32ad9..c0c5a0c 100644 --- a/package.json +++ b/package.json @@ -23,8 +23,7 @@ "prepublishOnly": "npm run build" }, "bin": { - "zen-db": "./dist/cli/database.js", - "zen-setup": "./dist/cli/setup.js" + "zen-db": "./dist/cli/database.js" }, "dependencies": { "@headlessui/react": "^2.0.0", diff --git a/src/cli/setup.js b/src/cli/setup.js deleted file mode 100644 index 53d48c6..0000000 --- a/src/cli/setup.js +++ /dev/null @@ -1,251 +0,0 @@ -#!/usr/bin/env node - -/** - * Zen Setup CLI - * Command-line tool for setting up Zen in a Next.js project - */ - -import { mkdir, writeFile } from 'node:fs/promises'; -import { existsSync } from 'node:fs'; -import { resolve, dirname } from 'node:path'; -import readline from 'readline'; - -// File templates -const templates = { - instrumentation: `// instrumentation.js -export async function register() { - if (process.env.NEXT_RUNTIME === 'nodejs') { - const { initializeZen } = await import('@zen/core'); - await initializeZen(); - } -} -`, - authRedirect: `import { redirect } from 'next/navigation'; - -export default function Redirect() { - redirect('/auth/login/'); -} -`, - authCatchAll: `export { default } from '@zen/core/auth/page'; -`, - adminRedirect: `import { redirect } from 'next/navigation'; - -export default function Redirect() { - redirect('/admin/dashboard'); -} -`, - adminCatchAll: `export { default } from '@zen/core/admin/page'; -`, - zenApiRoute: `export { GET, POST, PUT, DELETE, PATCH } from '@zen/core/zen/api'; -`, - zenPageRoute: `export { default, generateMetadata } from '@zen/core/modules/page'; -`, - nextConfig: `// next.config.js -module.exports = { - experimental: { - instrumentationHook: true, - }, -}; -`, -}; - -// File definitions -const files = [ - { - path: 'instrumentation.js', - template: 'instrumentation', - description: 'Instrumentation file (initialize Zen)', - }, - { - path: 'app/(auth)/auth/page.js', - template: 'authRedirect', - description: 'Auth redirect page', - }, - { - path: 'app/(auth)/auth/[...auth]/page.js', - template: 'authCatchAll', - description: 'Auth catch-all route', - }, - { - path: 'app/(admin)/admin/page.js', - template: 'adminRedirect', - description: 'Admin redirect page', - }, - { - path: 'app/(admin)/admin/[...admin]/page.js', - template: 'adminCatchAll', - description: 'Admin catch-all route', - }, - { - path: 'app/zen/api/[...path]/route.js', - template: 'zenApiRoute', - description: 'Zen API catch-all route', - }, - { - path: 'app/zen/[...zen]/page.js', - template: 'zenPageRoute', - description: 'Zen public pages catch-all route', - }, -]; - -async function createFile(filePath, content, force = false) { - const fullPath = resolve(process.cwd(), filePath); - - // Check if file already exists - if (existsSync(fullPath) && !force) { - console.log(`⏭️ Skipped (already exists): ${filePath}`); - return { created: false, skipped: true }; - } - - // Create directory if it doesn't exist - const dir = dirname(fullPath); - await mkdir(dir, { recursive: true }); - - // Write the file - await writeFile(fullPath, content, 'utf-8'); - console.log(`✅ Created: ${filePath}`); - - return { created: true, skipped: false }; -} - -async function setupZen(options = {}) { - const { force = false } = options; - - console.log('🚀 Setting up Zen for your Next.js project...\n'); - - let created = 0; - let skipped = 0; - - for (const file of files) { - const result = await createFile( - file.path, - templates[file.template], - force - ); - - if (result.created) created++; - if (result.skipped) skipped++; - } - - console.log('\n📝 Summary:'); - console.log(` ✅ Created: ${created} file${created !== 1 ? 's' : ''}`); - console.log(` ⏭️ Skipped: ${skipped} file${skipped !== 1 ? 's' : ''}`); - - // Check if next.config.js needs updating - const nextConfigPath = resolve(process.cwd(), 'next.config.js'); - const nextConfigExists = existsSync(nextConfigPath); - - if (!nextConfigExists) { - console.log('\n⚠️ Note: next.config.js not found.'); - console.log(' Make sure to enable instrumentation in your Next.js config:'); - console.log(' experimental: { instrumentationHook: true }'); - } - - console.log('\n🎉 Setup complete!'); - console.log('\nNext steps:'); - console.log(' 1. Add Zen styles to your globals.css:'); - console.log(' @import \'@zen/core/styles/zen.css\';'); - console.log(' 2. Configure environment variables (see .env.example)'); - console.log(' 3. Initialize the database:'); - console.log(' npx zen-db init'); - console.log('\nFor more information, check the INSTALL.md file.'); -} - -async function listFiles() { - console.log('📋 Files that will be created:\n'); - - for (const file of files) { - const exists = existsSync(resolve(process.cwd(), file.path)); - const status = exists ? '✓ exists' : '✗ missing'; - console.log(` ${status} ${file.path}`); - console.log(` ${file.description}`); - } - - console.log('\nRun "npx zen-setup init" to create missing files.'); -} - -async function runCLI() { - const command = process.argv[2]; - const flags = process.argv.slice(3); - const force = flags.includes('--force') || flags.includes('-f'); - - if (!command || command === 'help') { - console.log(` -Zen Setup CLI - -Usage: - npx zen-setup [options] - -Commands: - init Create all required files for Zen setup - list List all files that will be created - help Show this help message - -Options: - --force, -f Force overwrite existing files - -Examples: - npx zen-setup init # Create missing files - npx zen-setup init --force # Overwrite all files - npx zen-setup list # List all files - `); - process.exit(0); - } - - try { - switch (command) { - case 'init': - if (force) { - console.log('⚠️ WARNING: --force flag will overwrite existing files!\n'); - console.log('Type "yes" to confirm or Ctrl+C to cancel...'); - - const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout, - }); - - rl.question('Confirm (yes/no): ', async (answer) => { - if (answer.toLowerCase() === 'yes') { - await setupZen({ force: true }); - } else { - console.log('❌ Operation cancelled.'); - } - rl.close(); - process.exit(0); - }); - return; // Don't exit yet - } else { - await setupZen({ force: false }); - } - break; - - case 'list': - await listFiles(); - break; - - default: - console.log(`❌ Unknown command: ${command}`); - console.log('Run "npx zen-setup help" for usage information.'); - process.exit(1); - } - - process.exit(0); - - } catch (error) { - console.error('❌ Error:', error.message); - console.error(error.stack); - process.exit(1); - } -} - -// Run CLI if called directly -import { fileURLToPath } from 'url'; -import { realpathSync } from 'node:fs'; -const __filename = realpathSync(fileURLToPath(import.meta.url)); -const isMainModule = process.argv[1] && realpathSync(process.argv[1]) === __filename; - -if (isMainModule) { - runCLI(); -} - -export { runCLI, setupZen };