From 257cc77071009374bd1cd0dc0937812f46904f9b Mon Sep 17 00:00:00 2001 From: Franck DAKIA Date: Wed, 4 Mar 2026 06:02:54 +0000 Subject: [PATCH 1/2] Add scheduler config --- app/Kernel.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/app/Kernel.php b/app/Kernel.php index 7a395cd..70c8232 100644 --- a/app/Kernel.php +++ b/app/Kernel.php @@ -3,6 +3,7 @@ namespace App; use Bow\Router\Router; +use Bow\Scheduler\Scheduler; use Bow\Configuration\Loader as ApplicationLoader; class Kernel extends ApplicationLoader @@ -20,6 +21,19 @@ public function events(): array ]; } + /** + * Define your scheduled tasks + * + * @param Scheduler $schedule + * @return void + */ + public function schedules(Scheduler $schedule): void + { + // Define your scheduled tasks here + // $schedule->command("cache:clear")->daily(); + // $schedule->call(fn () => logger()->info("Heartbeat"))->everyMinute(); + } + /** * Define the app namespace * From 043795d43de35a3755f60ebf525b4ad89fd4a4d5 Mon Sep 17 00:00:00 2001 From: Franck DAKIA Date: Mon, 9 Mar 2026 17:56:43 +0000 Subject: [PATCH 2/2] Update welcome view --- .env.example.json | 7 +- public/img/logo.png | Bin 15649 -> 0 bytes public/img/logo.svg | 38 +++ seeders/20251220174703-user-seeder.php | 6 +- templates/layouts/default.tintin.php | 107 ++------ templates/welcome.tintin.php | 331 ++++++++++++++++++++++++- vite.config.js | 201 ++++++++++----- 7 files changed, 536 insertions(+), 154 deletions(-) delete mode 100644 public/img/logo.png create mode 100644 public/img/logo.svg diff --git a/.env.example.json b/.env.example.json index 24fdd44..7c7aef7 100644 --- a/.env.example.json +++ b/.env.example.json @@ -56,5 +56,10 @@ "SMTP_TIMEOUT": 50, "MAIL_FROM_EMAIL": "example@domain.com", - "MAIL_FROM_NAME": "Bow Framework" + "MAIL_FROM_NAME": "Bow Framework", + + "VITE_APP_NAME": "Bow Application", + "VITE_APP_URL": "http://localhost:5000", + "VITE_API_URL": "http://localhost:5000/api", + "VITE_APP_DEBUG": true } diff --git a/public/img/logo.png b/public/img/logo.png deleted file mode 100644 index dd384b515ce2b2b8b038b9f5585bfcb9586f01b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15649 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 F|6dSzg=GK$ diff --git a/public/img/logo.svg b/public/img/logo.svg new file mode 100644 index 0000000..2b03a43 --- /dev/null +++ b/public/img/logo.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/seeders/20251220174703-user-seeder.php b/seeders/20251220174703-user-seeder.php index 5d403c6..1b4e185 100644 --- a/seeders/20251220174703-user-seeder.php +++ b/seeders/20251220174703-user-seeder.php @@ -10,16 +10,16 @@ public function run() $faker = FakerFactory::create(); foreach (range(1, 5) as $value) { - $user = [ + $user = User::create([ 'name' => $faker->name, 'description' => $faker->text(100), 'email' => $faker->email, 'password' => app_hash('password'), 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s'), - ]; + ]); - User::create($user); + $user->persist(); } } } diff --git a/templates/layouts/default.tintin.php b/templates/layouts/default.tintin.php index 941c8f6..ed099b6 100644 --- a/templates/layouts/default.tintin.php +++ b/templates/layouts/default.tintin.php @@ -1,107 +1,54 @@ - + + - - - %inject("title", "It's Worked") + %inject("title", "Bow Framework") + + -
- %inject('content') -
+ %inject('content') diff --git a/templates/welcome.tintin.php b/templates/welcome.tintin.php index d40bbb8..f0e7ef5 100644 --- a/templates/welcome.tintin.php +++ b/templates/welcome.tintin.php @@ -1,19 +1,324 @@ %extends('layouts.default') -%block('title', "It's Worked") +%block('title', 'Bow Framework') %block('content') - -
- - adjemin - - - Snapdev Côte d'ivoire - + + +
+
+
+ Bow + Bow +
+ +
+ +
+
+

Construisez avec Bow

+

Un framework PHP léger et expressif conçu pour les développeurs qui valorisent la simplicité et la productivité.

+ +
+ +
+
+
+ +
+

Rapide

+

Architecture légère optimisée pour des performances maximales.

+
+
+
+ +
+

Simple

+

API intuitive et documentation complète pour démarrer rapidement.

+
+
+
+ +
+

Flexible

+

Modulaire et extensible selon les besoins de votre projet.

+
+
+ +
+

Commencez en quelques lignes

+

Définissez vos routes simplement

+
+
// routes/app.php
$router->get('/', fn() => view('welcome'));
$router->get('/users/:id', [UserController::class, 'show']);
+
+
+
+ +
%endblock diff --git a/vite.config.js b/vite.config.js index f11bb77..bcda1b2 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,63 +1,150 @@ -import { defineConfig } from 'vite'; +import { defineConfig, loadEnv } from 'vite'; import vue from '@vitejs/plugin-vue'; import react from '@vitejs/plugin-react'; -import path from 'path'; import tailwindcss from '@tailwindcss/vite'; +import { resolve } from 'path'; +import { existsSync, readFileSync } from 'fs'; -export default defineConfig({ - plugins: [ - vue(), - react(), - tailwindcss(), - ], - root: path.resolve(__dirname, 'assets'), - build: { - outDir: path.resolve(__dirname, 'public'), - emptyOutDir: true, - rollupOptions: { - input: { - app: path.resolve(__dirname, 'assets/js/app.js'), - }, - output: { - entryFileNames: 'js/[name].js', - chunkFileNames: 'js/[name]-[hash].js', - assetFileNames: (assetInfo) => { - // Place images/fonts in their own folders, css in css/ - const ext = assetInfo.name.split('.').pop(); - if (/\.(css|scss|sass|less)$/.test(assetInfo.name)) { - return 'css/[name]-[hash][extname]'; - } - if (/\.(png|jpe?g|gif|svg|webp|ico)$/.test(assetInfo.name)) { - return 'img/[name]-[hash][extname]'; - } - if (/\.(woff2?|eot|ttf|otf)$/.test(assetInfo.name)) { - return 'fonts/[name]-[hash][extname]'; - } - return '[ext]/[name]-[hash][extname]'; - }, - }, - }, - }, - css: { - preprocessorOptions: { - scss: { - additionalData: `@import "${path.resolve(__dirname, 'assets/sass/variables.scss')}";`, - }, - less: { - javascriptEnabled: true, - }, - }, - }, - resolve: { - alias: { - '@': path.resolve(__dirname, 'assets/js'), - '@sass': path.resolve(__dirname, 'assets/sass'), - }, - }, - server: { - watch: { - usePolling: true, - }, - }, +// Load .env.json if exists +const loadBowEnv = () => { + const envPath = resolve(__dirname, '.env.json'); + if (existsSync(envPath)) { + try { + const env = JSON.parse(readFileSync(envPath, 'utf-8')); + // Expose VITE_* variables + Object.keys(env).forEach((key) => { + if (key.startsWith('VITE_')) { + process.env[key] = env[key]; + } + }); + return env; + } catch (e) { + console.warn('Failed to parse .env.json:', e.message); + } + } + return {}; +}; + +export default defineConfig(({ mode }) => { + const bowEnv = loadBowEnv(); + const isDev = mode === 'development'; + const isProd = mode === 'production'; + + return { + plugins: [ + vue({ + script: { + defineModel: true, + propsDestructure: true, + }, + }), + react({ + fastRefresh: true, + }), + tailwindcss(), + ], + + root: resolve(__dirname, 'assets'), + publicDir: resolve(__dirname, 'public/static'), + + build: { + outDir: resolve(__dirname, 'public'), + emptyOutDir: false, + manifest: isProd, + sourcemap: isDev, + minify: isProd ? 'esbuild' : false, + target: 'es2020', + cssCodeSplit: true, + chunkSizeWarningLimit: 500, + + rollupOptions: { + input: { + app: resolve(__dirname, 'assets/js/app.js'), + }, + output: { + entryFileNames: isProd ? 'js/[name]-[hash].js' : 'js/[name].js', + chunkFileNames: 'js/chunks/[name]-[hash].js', + assetFileNames: (assetInfo) => { + const name = assetInfo.name || ''; + if (/\.(css|scss|sass|less)$/.test(name)) { + return isProd ? 'css/[name]-[hash][extname]' : 'css/[name][extname]'; + } + if (/\.(png|jpe?g|gif|svg|webp|ico|avif)$/.test(name)) { + return 'img/[name]-[hash][extname]'; + } + if (/\.(woff2?|eot|ttf|otf)$/.test(name)) { + return 'fonts/[name]-[hash][extname]'; + } + if (/\.(mp4|webm|ogg|mp3|wav|flac|aac)$/.test(name)) { + return 'media/[name]-[hash][extname]'; + } + return 'assets/[name]-[hash][extname]'; + }, + manualChunks: isProd + ? { + vendor: ['vue', 'react', 'react-dom'], + } + : undefined, + }, + }, + }, + + css: { + devSourcemap: true, + preprocessorOptions: { + scss: { + additionalData: `@use "${resolve(__dirname, 'assets/sass/variables.scss')}" as *;`, + silenceDeprecations: ['legacy-js-api'], + }, + }, + }, + + resolve: { + alias: { + '@': resolve(__dirname, 'assets/js'), + '@components': resolve(__dirname, 'assets/js/components'), + '@sass': resolve(__dirname, 'assets/sass'), + '@css': resolve(__dirname, 'assets/css'), + '@img': resolve(__dirname, 'assets/img'), + }, + extensions: ['.js', '.jsx', '.ts', '.tsx', '.vue', '.json'], + }, + + server: { + host: '0.0.0.0', + port: 5173, + strictPort: false, + open: false, + cors: true, + hmr: { + overlay: true, + }, + watch: { + usePolling: true, + interval: 100, + }, + }, + + preview: { + host: '0.0.0.0', + port: 4173, + open: false, + }, + + optimizeDeps: { + include: ['vue', 'react', 'react-dom'], + exclude: [], + }, + + esbuild: { + drop: isProd ? ['console', 'debugger'] : [], + legalComments: 'none', + }, + + define: { + __APP_VERSION__: JSON.stringify(process.env.npm_package_version || '1.0.0'), + __DEV__: isDev, + }, + }; });