laracook 1.0.0

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.
Files changed (42) hide show
  1. package/README.md +109 -0
  2. package/dist/commands/install.d.ts +11 -0
  3. package/dist/commands/install.d.ts.map +1 -0
  4. package/dist/commands/install.js +189 -0
  5. package/dist/commands/install.js.map +1 -0
  6. package/dist/commands/list.d.ts +2 -0
  7. package/dist/commands/list.d.ts.map +1 -0
  8. package/dist/commands/list.js +70 -0
  9. package/dist/commands/list.js.map +1 -0
  10. package/dist/commands/login.d.ts +2 -0
  11. package/dist/commands/login.d.ts.map +1 -0
  12. package/dist/commands/login.js +69 -0
  13. package/dist/commands/login.js.map +1 -0
  14. package/dist/index.d.ts +3 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +32 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/services/api.d.ts +9 -0
  19. package/dist/services/api.d.ts.map +1 -0
  20. package/dist/services/api.js +46 -0
  21. package/dist/services/api.js.map +1 -0
  22. package/dist/services/auth.d.ts +13 -0
  23. package/dist/services/auth.d.ts.map +1 -0
  24. package/dist/services/auth.js +36 -0
  25. package/dist/services/auth.js.map +1 -0
  26. package/dist/services/installer.d.ts +9 -0
  27. package/dist/services/installer.d.ts.map +1 -0
  28. package/dist/services/installer.js +146 -0
  29. package/dist/services/installer.js.map +1 -0
  30. package/dist/ui/banner.d.ts +3 -0
  31. package/dist/ui/banner.d.ts.map +1 -0
  32. package/dist/ui/banner.js +32 -0
  33. package/dist/ui/banner.js.map +1 -0
  34. package/dist/ui/theme.d.ts +20 -0
  35. package/dist/ui/theme.d.ts.map +1 -0
  36. package/dist/ui/theme.js +51 -0
  37. package/dist/ui/theme.js.map +1 -0
  38. package/dist/utils/checks.d.ts +10 -0
  39. package/dist/utils/checks.d.ts.map +1 -0
  40. package/dist/utils/checks.js +39 -0
  41. package/dist/utils/checks.js.map +1 -0
  42. package/package.json +43 -0
package/README.md ADDED
@@ -0,0 +1,109 @@
1
+ # 🍳 Laracook CLI
2
+
3
+ > Installez et lancez vos projets [Laracook](https://laracook.dev) en une seule commande.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ # Utilisation directe (recommandé)
9
+ npx laracook install email@example.com/mon-projet --token=xxx
10
+
11
+ # Ou installation globale
12
+ npm install -g laracook
13
+ ```
14
+
15
+ ## Prérequis
16
+
17
+ | Outil | Version minimale | Requis |
18
+ |---|---|---|
19
+ | **PHP** | 8.2+ | ✅ Oui |
20
+ | **Composer** | 2.0+ | ✅ Oui |
21
+ | **Node.js** | 18+ | ⚠ RecommandĂ© |
22
+ | **npm** | 9+ | ⚠ RecommandĂ© |
23
+
24
+ ## Commandes
25
+
26
+ ### `laracook login`
27
+
28
+ Connectez-vous Ă  votre compte Laracook :
29
+
30
+ ```bash
31
+ laracook login
32
+ ```
33
+
34
+ Le token est sauvegardé dans `~/.laracook/config.json`.
35
+
36
+ ### `laracook list`
37
+
38
+ Listez vos projets disponibles :
39
+
40
+ ```bash
41
+ laracook list
42
+ ```
43
+
44
+ ### `laracook install`
45
+
46
+ Installez un projet localement :
47
+
48
+ ```bash
49
+ laracook install email@example.com/mon-projet --token=xxx
50
+ ```
51
+
52
+ #### Options
53
+
54
+ | Option | Description | Défaut |
55
+ |---|---|---|
56
+ | `--token <token>` | Token CLI (fourni dans le modal de tĂ©lĂ©chargement) | — |
57
+ | `--dir <path>` | Dossier de destination | `./project-slug` |
58
+ | `--no-serve` | Ne pas lancer le serveur de développement | `false` |
59
+ | `--no-seed` | Ne pas exécuter les seeders | `false` |
60
+ | `--port <number>` | Port du serveur | `8000` |
61
+ | `--force` | Écraser le dossier s'il existe dĂ©jĂ  | `false` |
62
+
63
+ ## Exemple complet
64
+
65
+ ```bash
66
+ # 1. Connectez-vous (optionnel si vous utilisez --token)
67
+ laracook login
68
+
69
+ # 2. Listez vos projets
70
+ laracook list
71
+
72
+ # 3. Installez un projet
73
+ laracook install john@example.com/blog-api --token=abc123
74
+
75
+ # Le CLI va :
76
+ # ✔ VĂ©rifier l'accĂšs au projet
77
+ # ✔ TĂ©lĂ©charger les fichiers
78
+ # ✔ Installer les dĂ©pendances (composer + npm)
79
+ # ✔ Configurer la base de donnĂ©es SQLite
80
+ # ✔ ExĂ©cuter les migrations et seeders
81
+ # ✔ Lancer le serveur sur http://localhost:8000
82
+ ```
83
+
84
+ ## Obtenir votre token CLI
85
+
86
+ 1. Rendez-vous sur [laracook.dev](https://laracook.dev)
87
+ 2. Ouvrez votre projet
88
+ 3. Cliquez sur **Télécharger**
89
+ 4. La commande complĂšte avec le token est affichĂ©e, prĂȘte Ă  copier
90
+
91
+ ## Détection Node.js
92
+
93
+ Le CLI adapte automatiquement les dépendances frontend selon votre version de Node :
94
+
95
+ | Node.js | Vite | laravel-vite-plugin |
96
+ |---|---|---|
97
+ | ≄ 20 (recommandĂ©) | ^7.0.0 | ^2.1.0 |
98
+ | 18.x | ^5.4.0 | ^1.0.0 |
99
+ | < 18 | ❌ Non supportĂ© | — |
100
+
101
+ ## Mise Ă  jour
102
+
103
+ ```bash
104
+ npm update -g laracook
105
+ ```
106
+
107
+ ## Licence
108
+
109
+ MIT
@@ -0,0 +1,11 @@
1
+ interface InstallOptions {
2
+ token?: string;
3
+ dir?: string;
4
+ serve?: boolean;
5
+ seed?: boolean;
6
+ port?: string;
7
+ force?: boolean;
8
+ }
9
+ export declare function installCommand(project: string, options: InstallOptions): Promise<void>;
10
+ export {};
11
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAYA,UAAU,cAAc;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,iBAsM5E"}
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.installCommand = installCommand;
7
+ const ora_1 = __importDefault(require("ora"));
8
+ const inquirer_1 = __importDefault(require("inquirer"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const chalk_1 = __importDefault(require("chalk"));
12
+ const api_1 = require("../services/api");
13
+ const auth_1 = require("../services/auth");
14
+ const checks_1 = require("../utils/checks");
15
+ const installer_1 = require("../services/installer");
16
+ const banner_1 = require("../ui/banner");
17
+ const theme_1 = require("../ui/theme");
18
+ async function installCommand(project, options) {
19
+ (0, banner_1.showBanner)();
20
+ console.log(` ${theme_1.t.info('📩')} Installation de ${theme_1.t.highlight(project)}...\n`);
21
+ // Parse email/slug
22
+ const parts = project.replace(/^@/, '').split('/');
23
+ if (parts.length !== 2) {
24
+ console.error(` ${theme_1.t.error('❌')} Format invalide. Utilisez : ${theme_1.t.muted('email@example.com/project-slug')}`);
25
+ process.exit(1);
26
+ }
27
+ const [email, slug] = parts;
28
+ let token = options.token;
29
+ // If no token provided, try saved config or prompt login
30
+ if (!token) {
31
+ const config = (0, auth_1.getConfig)();
32
+ if (config?.token && config?.user?.email === email) {
33
+ console.log(` ${theme_1.t.muted('â„č Utilisation du token sauvegardĂ© pour')} ${email}`);
34
+ const spinner = (0, ora_1.default)('Génération du token CLI...').start();
35
+ try {
36
+ const res = await api_1.apiClient.post('/cli/generate-token', { application_slug: slug }, { Authorization: `Bearer ${config.token}` });
37
+ if (res.status === 'success') {
38
+ token = res.data.token;
39
+ spinner.succeed('Token CLI généré');
40
+ }
41
+ else {
42
+ spinner.fail('Impossible de générer un token CLI. Utilisez --token=xxx');
43
+ process.exit(1);
44
+ }
45
+ }
46
+ catch {
47
+ spinner.fail('Impossible de générer un token CLI. Utilisez --token=xxx');
48
+ process.exit(1);
49
+ }
50
+ }
51
+ else {
52
+ console.error(` ${theme_1.t.error('❌')} Token manquant. Utilisez ${theme_1.t.highlight('--token=xxx')} ou lancez ${theme_1.t.info('"laracook login"')} d'abord.`);
53
+ process.exit(1);
54
+ }
55
+ }
56
+ // Step 1: Verify access
57
+ const verifySpinner = (0, ora_1.default)('Vérification de l\'accÚs...').start();
58
+ let verifyData;
59
+ try {
60
+ const verifyRes = await api_1.apiClient.post('/cli/verify', { email, slug, token });
61
+ if (verifyRes.status !== 'success') {
62
+ verifySpinner.fail(verifyRes.message || 'AccÚs refusé');
63
+ process.exit(1);
64
+ }
65
+ verifyData = verifyRes.data;
66
+ verifySpinner.succeed(`Projet trouvé : ${theme_1.t.highlight(verifyData.name)}`);
67
+ }
68
+ catch (error) {
69
+ verifySpinner.fail(error.message || 'Vérification échouée');
70
+ process.exit(1);
71
+ }
72
+ // Display project info box
73
+ (0, theme_1.projectBox)({
74
+ name: verifyData.name,
75
+ email,
76
+ models: verifyData.models_count,
77
+ files: verifyData.files_count,
78
+ });
79
+ // Stack frontend choice
80
+ const { stack } = await inquirer_1.default.prompt([{
81
+ type: 'list',
82
+ name: 'stack',
83
+ message: 'Stack frontend :',
84
+ choices: [
85
+ { name: `${chalk_1.default.green('❯')} React + shadcn/ui ${chalk_1.default.gray('(recommandĂ©)')}`, value: 'react' },
86
+ { name: ` Vue.js ${chalk_1.default.gray('(bientĂŽt)')}`, value: 'vue' },
87
+ { name: ` Svelte ${chalk_1.default.gray('(bientĂŽt)')}`, value: 'svelte' },
88
+ { name: ` Angular ${chalk_1.default.gray('(bientĂŽt)')}`, value: 'angular' },
89
+ ],
90
+ }]);
91
+ if (stack !== 'react') {
92
+ console.log(`\n ${theme_1.t.warn('⚠')} ${theme_1.t.highlight(stack)} n'est pas encore supportĂ©. Seul ${theme_1.t.info('React + shadcn/ui')} est disponible pour l'instant.\n`);
93
+ process.exit(0);
94
+ }
95
+ console.log('');
96
+ // Step 2: Choose installation mode
97
+ const { mode } = await inquirer_1.default.prompt([{
98
+ type: 'list',
99
+ name: 'mode',
100
+ message: 'Mode d\'installation :',
101
+ choices: [
102
+ { name: `đŸ“„ Cloner les fichiers uniquement`, value: 'clone' },
103
+ { name: `⚙ Cloner + Installer les dĂ©pendances`, value: 'install' },
104
+ { name: `🚀 Cloner + Installer + Lancer le serveur`, value: 'full' },
105
+ ],
106
+ }]);
107
+ // Step 3: Check prerequisites
108
+ if (mode !== 'clone') {
109
+ const prereqSpinner = (0, ora_1.default)('Vérification des prérequis...').start();
110
+ const checks = await (0, checks_1.checkPrerequisites)();
111
+ if (!checks.php) {
112
+ prereqSpinner.fail(`PHP 8.2+ requis. ${theme_1.t.muted('https://php.net')}`);
113
+ process.exit(1);
114
+ }
115
+ if (!checks.composer) {
116
+ prereqSpinner.fail(`Composer requis. ${theme_1.t.muted('https://getcomposer.org')}`);
117
+ process.exit(1);
118
+ }
119
+ prereqSpinner.succeed(`PrĂ©requis OK ${theme_1.t.muted(`(PHP ${checks.phpVersion}, Composer ✓${checks.node ? `, Node ${checks.nodeVersion}` : ''}`)}`);
120
+ }
121
+ // Step 4: Download project files
122
+ const downloadSpinner = (0, ora_1.default)('Téléchargement du projet...').start();
123
+ let projectData;
124
+ try {
125
+ projectData = await api_1.apiClient.get(`/cli/projects/${slug}/download`, {
126
+ 'X-CLI-Token': token,
127
+ });
128
+ if (projectData.status !== 'success') {
129
+ downloadSpinner.fail(projectData.message || 'Téléchargement échoué');
130
+ process.exit(1);
131
+ }
132
+ downloadSpinner.succeed('Schéma du projet récupéré');
133
+ }
134
+ catch (error) {
135
+ downloadSpinner.fail(error.message || 'Téléchargement échoué');
136
+ process.exit(1);
137
+ }
138
+ // Step 5: Generate files
139
+ const genSpinner = (0, ora_1.default)('Génération du code Laravel...').start();
140
+ const targetDir = options.dir || path_1.default.resolve(process.cwd(), slug);
141
+ if (fs_1.default.existsSync(targetDir)) {
142
+ if (!options.force) {
143
+ genSpinner.fail(`Le dossier "${slug}" existe déjà. Utilisez ${theme_1.t.highlight('--force')} pour écraser.`);
144
+ process.exit(1);
145
+ }
146
+ fs_1.default.rmSync(targetDir, { recursive: true });
147
+ }
148
+ fs_1.default.mkdirSync(targetDir, { recursive: true });
149
+ try {
150
+ const schemaData = projectData.data.schema_data;
151
+ const frontendSchema = projectData.data.frontend_schema;
152
+ fs_1.default.writeFileSync(path_1.default.join(targetDir, '.laracook.json'), JSON.stringify({
153
+ project: `${email}/${slug}`,
154
+ version: projectData.data.version,
155
+ installed_at: new Date().toISOString(),
156
+ name: projectData.data.name,
157
+ stack: 'react-shadcn',
158
+ }, null, 2));
159
+ fs_1.default.writeFileSync(path_1.default.join(targetDir, '.laracook-schema.json'), JSON.stringify({ schema_data: schemaData, frontend_schema: frontendSchema }, null, 2));
160
+ genSpinner.succeed('Fichiers de projet générés');
161
+ }
162
+ catch (error) {
163
+ genSpinner.fail(`Erreur de génération : ${error.message}`);
164
+ process.exit(1);
165
+ }
166
+ // Step 6: Setup Laravel project
167
+ if (mode !== 'clone') {
168
+ await (0, installer_1.setupLaravelProject)(targetDir, {
169
+ seed: options.seed !== false,
170
+ serve: mode === 'full' && options.serve !== false,
171
+ port: options.port || '8000',
172
+ });
173
+ }
174
+ // Done!
175
+ console.log(`\n ${theme_1.t.success('✅')} ${theme_1.t.highlight('Installation terminĂ©e !')}`);
176
+ console.log(` ${theme_1.t.muted('📁')} ${targetDir}`);
177
+ if (mode === 'clone') {
178
+ console.log(`\n ${theme_1.t.info('📋 Prochaines Ă©tapes :')}`);
179
+ console.log(theme_1.t.muted(` cd ${slug}`));
180
+ console.log(theme_1.t.muted(' composer install'));
181
+ console.log(theme_1.t.muted(' cp .env.example .env'));
182
+ console.log(theme_1.t.muted(' php artisan key:generate'));
183
+ console.log(theme_1.t.muted(' touch database/database.sqlite'));
184
+ console.log(theme_1.t.muted(' php artisan migrate --seed'));
185
+ console.log(theme_1.t.muted(' php artisan serve'));
186
+ }
187
+ (0, banner_1.showSignature)();
188
+ }
189
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":";;;;;AAqBA,wCAsMC;AA3ND,8CAAsB;AACtB,wDAAgC;AAChC,gDAAwB;AACxB,4CAAoB;AACpB,kDAA0B;AAC1B,yCAA4C;AAC5C,2CAA6C;AAC7C,4CAAqD;AACrD,qDAAwE;AACxE,yCAAyD;AACzD,uCAA4C;AAWrC,KAAK,UAAU,cAAc,CAAC,OAAe,EAAE,OAAuB;IAC3E,IAAA,mBAAU,GAAE,CAAC;IAEb,OAAO,CAAC,GAAG,CAAC,KAAK,SAAC,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,SAAC,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAE9E,mBAAmB;IACnB,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,KAAK,SAAC,CAAC,KAAK,CAAC,GAAG,CAAC,gCAAgC,SAAC,CAAC,KAAK,CAAC,gCAAgC,CAAC,EAAE,CAAC,CAAC;QAC5G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;IAC5B,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAE1B,yDAAyD;IACzD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,IAAA,gBAAS,GAAE,CAAC;QAC3B,IAAI,MAAM,EAAE,KAAK,IAAI,MAAM,EAAE,IAAI,EAAE,KAAK,KAAK,KAAK,EAAE,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,KAAK,SAAC,CAAC,KAAK,CAAC,0CAA0C,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;YACjF,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,4BAA4B,CAAC,CAAC,KAAK,EAAE,CAAC;YAC1D,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,eAAS,CAAC,IAAI,CAAC,qBAAqB,EACpD,EAAE,gBAAgB,EAAE,IAAI,EAAE,EAC1B,EAAE,aAAa,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE,EAAE,CAC5C,CAAC;gBACF,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBAC7B,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;oBACvB,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;gBACtC,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;oBACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;gBACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,SAAC,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,SAAC,CAAC,SAAS,CAAC,aAAa,CAAC,cAAc,SAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YAC3I,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,MAAM,aAAa,GAAG,IAAA,aAAG,EAAC,6BAA6B,CAAC,CAAC,KAAK,EAAE,CAAC;IACjE,IAAI,UAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,eAAS,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9E,IAAI,SAAS,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACnC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,cAAc,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC;QAC5B,aAAa,CAAC,OAAO,CAAC,mBAAmB,SAAC,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,sBAAsB,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,2BAA2B;IAC3B,IAAA,kBAAU,EAAC;QACT,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,KAAK;QACL,MAAM,EAAE,UAAU,CAAC,YAAY;QAC/B,KAAK,EAAE,UAAU,CAAC,WAAW;KAC9B,CAAC,CAAC;IAEH,wBAAwB;IACxB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC,CAAC;YACvC,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,kBAAkB;YAC3B,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,GAAG,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,eAAK,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;gBAC/F,EAAE,IAAI,EAAE,YAAY,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;gBAC7D,EAAE,IAAI,EAAE,YAAY,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;gBAChE,EAAE,IAAI,EAAE,aAAa,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;aACnE;SACF,CAAC,CAAC,CAAC;IAEJ,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,OAAO,SAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,SAAC,CAAC,SAAS,CAAC,KAAK,CAAC,oCAAoC,SAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,mCAAmC,CAAC,CAAC;QAC1J,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,mCAAmC;IACnC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,wBAAwB;YACjC,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,mCAAmC,EAAE,KAAK,EAAE,OAAO,EAAE;gBAC7D,EAAE,IAAI,EAAE,wCAAwC,EAAE,KAAK,EAAE,SAAS,EAAE;gBACpE,EAAE,IAAI,EAAE,2CAA2C,EAAE,KAAK,EAAE,MAAM,EAAE;aACrE;SACF,CAAC,CAAC,CAAC;IAEJ,8BAA8B;IAC9B,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,MAAM,aAAa,GAAG,IAAA,aAAG,EAAC,+BAA+B,CAAC,CAAC,KAAK,EAAE,CAAC;QACnE,MAAM,MAAM,GAAG,MAAM,IAAA,2BAAkB,GAAE,CAAC;QAE1C,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YAChB,aAAa,CAAC,IAAI,CAAC,oBAAoB,SAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACrB,aAAa,CAAC,IAAI,CAAC,oBAAoB,SAAC,CAAC,KAAK,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC;YAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,aAAa,CAAC,OAAO,CAAC,gBAAgB,SAAC,CAAC,KAAK,CAAC,QAAQ,MAAM,CAAC,UAAU,eAAe,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IAChJ,CAAC;IAED,iCAAiC;IACjC,MAAM,eAAe,GAAG,IAAA,aAAG,EAAC,6BAA6B,CAAC,CAAC,KAAK,EAAE,CAAC;IACnE,IAAI,WAAgB,CAAC;IACrB,IAAI,CAAC;QACH,WAAW,GAAG,MAAM,eAAS,CAAC,GAAG,CAAC,iBAAiB,IAAI,WAAW,EAAE;YAClE,aAAa,EAAE,KAAM;SACtB,CAAC,CAAC;QACH,IAAI,WAAW,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACrC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,uBAAuB,CAAC,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,eAAe,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,uBAAuB,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,yBAAyB;IACzB,MAAM,UAAU,GAAG,IAAA,aAAG,EAAC,+BAA+B,CAAC,CAAC,KAAK,EAAE,CAAC;IAEhE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,IAAI,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IAEnE,IAAI,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,UAAU,CAAC,IAAI,CAAC,eAAe,IAAI,2BAA2B,SAAC,CAAC,SAAS,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;YACtG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,YAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,YAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC;QAChD,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC;QAExD,YAAE,CAAC,aAAa,CACd,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,EACtC,IAAI,CAAC,SAAS,CAAC;YACb,OAAO,EAAE,GAAG,KAAK,IAAI,IAAI,EAAE;YAC3B,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,OAAO;YACjC,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACtC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI;YAC3B,KAAK,EAAE,cAAc;SACtB,EAAE,IAAI,EAAE,CAAC,CAAC,CACZ,CAAC;QAEF,YAAE,CAAC,aAAa,CACd,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC,EAC7C,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CACtF,CAAC;QAEF,UAAU,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,UAAU,CAAC,IAAI,CAAC,0BAA0B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,gCAAgC;IAChC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,MAAM,IAAA,+BAAmB,EAAC,SAAS,EAAE;YACnC,IAAI,EAAE,OAAO,CAAC,IAAI,KAAK,KAAK;YAC5B,KAAK,EAAE,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK;YACjD,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,MAAM;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,QAAQ;IACR,OAAO,CAAC,GAAG,CAAC,OAAO,SAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,SAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,KAAK,SAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;IAE/C,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,OAAO,SAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,SAAC,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,SAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,SAAC,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,SAAC,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,SAAC,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,SAAC,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,SAAC,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,IAAA,sBAAa,GAAE,CAAC;AAClB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function listCommand(): Promise<void>;
2
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAQA,wBAAsB,WAAW,kBAgEhC"}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.listCommand = listCommand;
7
+ const ora_1 = __importDefault(require("ora"));
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const cli_table3_1 = __importDefault(require("cli-table3"));
10
+ const api_1 = require("../services/api");
11
+ const auth_1 = require("../services/auth");
12
+ const banner_1 = require("../ui/banner");
13
+ const theme_1 = require("../ui/theme");
14
+ async function listCommand() {
15
+ (0, banner_1.showBanner)();
16
+ const config = (0, auth_1.getConfig)();
17
+ if (!config?.token) {
18
+ console.error(` ${theme_1.t.error('❌')} Vous n'ĂȘtes pas connectĂ©. Lancez ${theme_1.t.info('"laracook login"')} d'abord.`);
19
+ process.exit(1);
20
+ }
21
+ const spinner = (0, ora_1.default)('Récupération des projets...').start();
22
+ try {
23
+ const response = await api_1.apiClient.get('/applications', {
24
+ Authorization: `Bearer ${config.token}`,
25
+ });
26
+ if (response.status !== 'success') {
27
+ spinner.fail('Impossible de récupérer les projets.');
28
+ return;
29
+ }
30
+ const projects = response.data || [];
31
+ spinner.succeed(`${theme_1.t.highlight(String(projects.length))} projet(s) trouvé(s)`);
32
+ if (projects.length === 0) {
33
+ console.log(`\n Aucun projet trouvé. Créez-en un sur ${theme_1.t.link('https://laracook.dev')}\n`);
34
+ return;
35
+ }
36
+ const table = new cli_table3_1.default({
37
+ head: [
38
+ chalk_1.default.yellow('Projet'),
39
+ chalk_1.default.yellow('Référence'),
40
+ chalk_1.default.yellow('ModĂšles'),
41
+ chalk_1.default.yellow('DerniĂšre modif.'),
42
+ ],
43
+ style: { head: [] },
44
+ chars: {
45
+ top: chalk_1.default.gray('─'), 'top-mid': chalk_1.default.gray('┬'), 'top-left': chalk_1.default.gray('┌'), 'top-right': chalk_1.default.gray('┐'),
46
+ bottom: chalk_1.default.gray('─'), 'bottom-mid': chalk_1.default.gray('┮'), 'bottom-left': chalk_1.default.gray('└'), 'bottom-right': chalk_1.default.gray('┘'),
47
+ left: chalk_1.default.gray('│'), 'left-mid': chalk_1.default.gray('├'),
48
+ mid: chalk_1.default.gray('─'), 'mid-mid': chalk_1.default.gray('┌'),
49
+ right: chalk_1.default.gray('│'), 'right-mid': chalk_1.default.gray('─'),
50
+ middle: chalk_1.default.gray('│'),
51
+ },
52
+ });
53
+ for (const p of projects) {
54
+ const models = p.schema_data?.nodes?.length || 0;
55
+ const updatedAt = p.updated_at ? new Date(p.updated_at).toLocaleDateString('fr-FR') : '-';
56
+ table.push([
57
+ chalk_1.default.white(p.name || '-'),
58
+ chalk_1.default.cyan(`${config.user?.email}/${p.reference || p.id}`),
59
+ chalk_1.default.green(String(models)),
60
+ chalk_1.default.gray(updatedAt),
61
+ ]);
62
+ }
63
+ console.log('\n' + table.toString());
64
+ }
65
+ catch (error) {
66
+ spinner.fail(`Erreur : ${error.message}`);
67
+ }
68
+ (0, banner_1.showSignature)();
69
+ }
70
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function loginCommand(): Promise<void>;
2
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAOA,wBAAsB,YAAY,kBA8DjC"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.loginCommand = loginCommand;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ const ora_1 = __importDefault(require("ora"));
9
+ const api_1 = require("../services/api");
10
+ const auth_1 = require("../services/auth");
11
+ const banner_1 = require("../ui/banner");
12
+ const theme_1 = require("../ui/theme");
13
+ async function loginCommand() {
14
+ (0, banner_1.showBanner)();
15
+ const existing = (0, auth_1.getConfig)();
16
+ if (existing?.token) {
17
+ const { overwrite } = await inquirer_1.default.prompt([{
18
+ type: 'confirm',
19
+ name: 'overwrite',
20
+ message: 'Vous ĂȘtes dĂ©jĂ  connectĂ©. Voulez-vous vous reconnecter ?',
21
+ default: false,
22
+ }]);
23
+ if (!overwrite) {
24
+ console.log(` ${theme_1.t.success('✅')} Session existante conservĂ©e.`);
25
+ return;
26
+ }
27
+ }
28
+ const answers = await inquirer_1.default.prompt([
29
+ {
30
+ type: 'input',
31
+ name: 'email',
32
+ message: 'Email :',
33
+ validate: (v) => v.includes('@') || 'Email invalide',
34
+ },
35
+ {
36
+ type: 'password',
37
+ name: 'password',
38
+ message: 'Mot de passe :',
39
+ mask: '*',
40
+ },
41
+ ]);
42
+ const spinner = (0, ora_1.default)('Authentification en cours...').start();
43
+ try {
44
+ const response = await api_1.apiClient.post('/auth/login', {
45
+ email: answers.email,
46
+ password: answers.password,
47
+ });
48
+ if (response.status !== 'success' || !response.data?.token) {
49
+ spinner.fail('Identifiants incorrects.');
50
+ return;
51
+ }
52
+ (0, auth_1.saveConfig)({
53
+ token: response.data.token,
54
+ api_url: api_1.apiClient.baseUrl,
55
+ user: {
56
+ id: response.data.user?.id,
57
+ name: response.data.user?.name,
58
+ email: response.data.user?.email,
59
+ },
60
+ });
61
+ spinner.succeed(`Connecté en tant que ${theme_1.t.highlight(response.data.user?.name || answers.email)}`);
62
+ console.log(` ${theme_1.t.muted('đŸ’Ÿ Token sauvegardĂ© dans ~/.laracook/config.json')}`);
63
+ }
64
+ catch (error) {
65
+ spinner.fail(`Erreur : ${error.message || 'Connexion échouée'}`);
66
+ }
67
+ (0, banner_1.showSignature)();
68
+ }
69
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":";;;;;AAOA,oCA8DC;AArED,wDAAgC;AAChC,8CAAsB;AACtB,yCAA4C;AAC5C,2CAAyD;AACzD,yCAAyD;AACzD,uCAAgC;AAEzB,KAAK,UAAU,YAAY;IAChC,IAAA,mBAAU,GAAE,CAAC;IAEb,MAAM,QAAQ,GAAG,IAAA,gBAAS,GAAE,CAAC;IAC7B,IAAI,QAAQ,EAAE,KAAK,EAAE,CAAC;QACpB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC,CAAC;gBAC3C,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,yDAAyD;gBAClE,OAAO,EAAE,KAAK;aACf,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,SAAC,CAAC,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;YAChE,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;QACpC;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,SAAS;YAClB,QAAQ,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,gBAAgB;SAC7D;QACD;YACE,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,gBAAgB;YACzB,IAAI,EAAE,GAAG;SACV;KACF,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,8BAA8B,CAAC,CAAC,KAAK,EAAE,CAAC;IAE5D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,eAAS,CAAC,IAAI,CAAC,aAAa,EAAE;YACnD,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YACzC,OAAO;QACT,CAAC;QAED,IAAA,iBAAU,EAAC;YACT,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK;YAC1B,OAAO,EAAE,eAAS,CAAC,OAAO;YAC1B,IAAI,EAAE;gBACJ,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE;gBAC1B,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI;gBAC9B,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK;aACjC;SACF,CAAC,CAAC;QAEH,OAAO,CAAC,OAAO,CAAC,wBAAwB,SAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClG,OAAO,CAAC,GAAG,CAAC,KAAK,SAAC,CAAC,KAAK,CAAC,kDAAkD,CAAC,EAAE,CAAC,CAAC;IAClF,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,OAAO,IAAI,mBAAmB,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,IAAA,sBAAa,GAAE,CAAC;AAClB,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const commander_1 = require("commander");
5
+ const login_1 = require("./commands/login");
6
+ const install_1 = require("./commands/install");
7
+ const list_1 = require("./commands/list");
8
+ const program = new commander_1.Command();
9
+ program
10
+ .name('laracook')
11
+ .description('🍳 Laracook CLI — Install and manage Laravel projects generated from Laracook')
12
+ .version('1.0.0');
13
+ program
14
+ .command('login')
15
+ .description('Authenticate with your Laracook account')
16
+ .action(login_1.loginCommand);
17
+ program
18
+ .command('install <project>')
19
+ .description('Install a Laracook project locally (email/slug --token=xxx)')
20
+ .option('--token <token>', 'CLI token for authentication')
21
+ .option('--dir <path>', 'Destination directory')
22
+ .option('--no-serve', 'Do not start the development server')
23
+ .option('--no-seed', 'Do not run database seeders')
24
+ .option('--port <number>', 'Server port (default: 8000)', '8000')
25
+ .option('--force', 'Overwrite if directory exists')
26
+ .action(install_1.installCommand);
27
+ program
28
+ .command('list')
29
+ .description('List your available Laracook projects')
30
+ .action(list_1.listCommand);
31
+ program.parse(process.argv);
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,4CAAgD;AAChD,gDAAoD;AACpD,0CAA8C;AAE9C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,+EAA+E,CAAC;KAC5F,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,oBAAY,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,mBAAmB,CAAC;KAC5B,WAAW,CAAC,6DAA6D,CAAC;KAC1E,MAAM,CAAC,iBAAiB,EAAE,8BAA8B,CAAC;KACzD,MAAM,CAAC,cAAc,EAAE,uBAAuB,CAAC;KAC/C,MAAM,CAAC,YAAY,EAAE,qCAAqC,CAAC;KAC3D,MAAM,CAAC,WAAW,EAAE,6BAA6B,CAAC;KAClD,MAAM,CAAC,iBAAiB,EAAE,6BAA6B,EAAE,MAAM,CAAC;KAChE,MAAM,CAAC,SAAS,EAAE,+BAA+B,CAAC;KAClD,MAAM,CAAC,wBAAc,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,uCAAuC,CAAC;KACpD,MAAM,CAAC,kBAAW,CAAC,CAAC;AAEvB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ declare class ApiClient {
2
+ baseUrl: string;
3
+ constructor(baseUrl: string);
4
+ post(endpoint: string, body: Record<string, any>, extraHeaders?: Record<string, string>): Promise<any>;
5
+ get(endpoint: string, extraHeaders?: Record<string, string>): Promise<any>;
6
+ }
7
+ export declare const apiClient: ApiClient;
8
+ export {};
9
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/services/api.ts"],"names":[],"mappings":"AAIA,cAAM,SAAS;IACN,OAAO,EAAE,MAAM,CAAC;gBAEX,OAAO,EAAE,MAAM;IAIrB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;IAkBtG,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;CAejF;AAED,eAAO,MAAM,SAAS,WAA0B,CAAC"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.apiClient = void 0;
7
+ const node_fetch_1 = __importDefault(require("node-fetch"));
8
+ const BASE_URL = 'https://magical.ollaid.com/api';
9
+ class ApiClient {
10
+ baseUrl;
11
+ constructor(baseUrl) {
12
+ this.baseUrl = baseUrl;
13
+ }
14
+ async post(endpoint, body, extraHeaders) {
15
+ const res = await (0, node_fetch_1.default)(`${this.baseUrl}${endpoint}`, {
16
+ method: 'POST',
17
+ headers: {
18
+ 'Content-Type': 'application/json',
19
+ 'Accept': 'application/json',
20
+ ...extraHeaders,
21
+ },
22
+ body: JSON.stringify(body),
23
+ });
24
+ const data = await res.json();
25
+ if (!res.ok && data.status !== 'success') {
26
+ throw new Error(data.message || `HTTP ${res.status}`);
27
+ }
28
+ return data;
29
+ }
30
+ async get(endpoint, extraHeaders) {
31
+ const res = await (0, node_fetch_1.default)(`${this.baseUrl}${endpoint}`, {
32
+ method: 'GET',
33
+ headers: {
34
+ 'Accept': 'application/json',
35
+ ...extraHeaders,
36
+ },
37
+ });
38
+ const data = await res.json();
39
+ if (!res.ok && data.status !== 'success') {
40
+ throw new Error(data.message || `HTTP ${res.status}`);
41
+ }
42
+ return data;
43
+ }
44
+ }
45
+ exports.apiClient = new ApiClient(BASE_URL);
46
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/services/api.ts"],"names":[],"mappings":";;;;;;AAAA,4DAAgD;AAEhD,MAAM,QAAQ,GAAG,gCAAgC,CAAC;AAElD,MAAM,SAAS;IACN,OAAO,CAAS;IAEvB,YAAY,OAAe;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAgB,EAAE,IAAyB,EAAE,YAAqC;QAC3F,MAAM,GAAG,GAAG,MAAM,IAAA,oBAAK,EAAC,GAAG,IAAI,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE;YACpD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,QAAQ,EAAE,kBAAkB;gBAC5B,GAAG,YAAY;aAChB;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,QAAgB,EAAE,YAAqC;QAC/D,MAAM,GAAG,GAAG,MAAM,IAAA,oBAAK,EAAC,GAAG,IAAI,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE;YACpD,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,QAAQ,EAAE,kBAAkB;gBAC5B,GAAG,YAAY;aAChB;SACF,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAEY,QAAA,SAAS,GAAG,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface LaracookConfig {
2
+ token: string;
3
+ api_url: string;
4
+ user: {
5
+ id?: number;
6
+ name?: string;
7
+ email?: string;
8
+ };
9
+ }
10
+ export declare function getConfig(): LaracookConfig | null;
11
+ export declare function saveConfig(config: LaracookConfig): void;
12
+ export declare function clearConfig(): void;
13
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/services/auth.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE;QACJ,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,wBAAgB,SAAS,IAAI,cAAc,GAAG,IAAI,CAQjD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAKvD;AAED,wBAAgB,WAAW,IAAI,IAAI,CAIlC"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getConfig = getConfig;
7
+ exports.saveConfig = saveConfig;
8
+ exports.clearConfig = clearConfig;
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const os_1 = __importDefault(require("os"));
12
+ const CONFIG_DIR = path_1.default.join(os_1.default.homedir(), '.laracook');
13
+ const CONFIG_FILE = path_1.default.join(CONFIG_DIR, 'config.json');
14
+ function getConfig() {
15
+ try {
16
+ if (!fs_1.default.existsSync(CONFIG_FILE))
17
+ return null;
18
+ const content = fs_1.default.readFileSync(CONFIG_FILE, 'utf-8');
19
+ return JSON.parse(content);
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ }
25
+ function saveConfig(config) {
26
+ if (!fs_1.default.existsSync(CONFIG_DIR)) {
27
+ fs_1.default.mkdirSync(CONFIG_DIR, { recursive: true });
28
+ }
29
+ fs_1.default.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
30
+ }
31
+ function clearConfig() {
32
+ if (fs_1.default.existsSync(CONFIG_FILE)) {
33
+ fs_1.default.unlinkSync(CONFIG_FILE);
34
+ }
35
+ }
36
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/services/auth.ts"],"names":[],"mappings":";;;;;AAiBA,8BAQC;AAED,gCAKC;AAED,kCAIC;AAtCD,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AAEpB,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AACxD,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAYzD,SAAgB,SAAS;IACvB,IAAI,CAAC;QACH,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7C,MAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,UAAU,CAAC,MAAsB;IAC/C,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,YAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,YAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,SAAgB,WAAW;IACzB,IAAI,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ interface SetupOptions {
2
+ seed: boolean;
3
+ serve: boolean;
4
+ port: string;
5
+ }
6
+ export declare function runCommand(cmd: string, cwd: string, silent?: boolean): string;
7
+ export declare function setupLaravelProject(projectDir: string, options: SetupOptions): Promise<void>;
8
+ export {};
9
+ //# sourceMappingURL=installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/services/installer.ts"],"names":[],"mappings":"AAKA,UAAU,YAAY;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,MAAM,CAU3E;AAED,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,iBA2FlF"}
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.runCommand = runCommand;
40
+ exports.setupLaravelProject = setupLaravelProject;
41
+ const child_process_1 = require("child_process");
42
+ const ora_1 = __importDefault(require("ora"));
43
+ const fs_1 = __importDefault(require("fs"));
44
+ const path_1 = __importDefault(require("path"));
45
+ function runCommand(cmd, cwd, silent = false) {
46
+ try {
47
+ return (0, child_process_1.execSync)(cmd, {
48
+ cwd,
49
+ stdio: silent ? 'pipe' : 'inherit',
50
+ encoding: 'utf-8',
51
+ });
52
+ }
53
+ catch (error) {
54
+ throw new Error(`Command failed: ${cmd}\n${error.message}`);
55
+ }
56
+ }
57
+ async function setupLaravelProject(projectDir, options) {
58
+ // Composer install
59
+ const composerSpinner = (0, ora_1.default)('Installation des dépendances PHP (composer install)...').start();
60
+ try {
61
+ runCommand('composer install --no-interaction --prefer-dist', projectDir, true);
62
+ composerSpinner.succeed('Dépendances PHP installées');
63
+ }
64
+ catch (error) {
65
+ composerSpinner.fail(`composer install échoué : ${error.message}`);
66
+ return;
67
+ }
68
+ // Setup .env
69
+ const envSpinner = (0, ora_1.default)('Configuration de l\'environnement...').start();
70
+ try {
71
+ const envExample = path_1.default.join(projectDir, '.env.example');
72
+ const envFile = path_1.default.join(projectDir, '.env');
73
+ if (fs_1.default.existsSync(envExample) && !fs_1.default.existsSync(envFile)) {
74
+ fs_1.default.copyFileSync(envExample, envFile);
75
+ }
76
+ // Generate app key
77
+ runCommand('php artisan key:generate --no-interaction', projectDir, true);
78
+ envSpinner.succeed('.env configuré + APP_KEY généré');
79
+ }
80
+ catch (error) {
81
+ envSpinner.warn(`Configuration .env partielle : ${error.message}`);
82
+ }
83
+ // Create SQLite database
84
+ const dbSpinner = (0, ora_1.default)('Création de la base de données SQLite...').start();
85
+ try {
86
+ const dbDir = path_1.default.join(projectDir, 'database');
87
+ if (!fs_1.default.existsSync(dbDir))
88
+ fs_1.default.mkdirSync(dbDir, { recursive: true });
89
+ const dbFile = path_1.default.join(dbDir, 'database.sqlite');
90
+ if (!fs_1.default.existsSync(dbFile)) {
91
+ fs_1.default.writeFileSync(dbFile, '');
92
+ }
93
+ dbSpinner.succeed('Base de données SQLite créée');
94
+ }
95
+ catch (error) {
96
+ dbSpinner.fail(`Erreur SQLite : ${error.message}`);
97
+ return;
98
+ }
99
+ // Run migrations
100
+ const migrateSpinner = (0, ora_1.default)('Exécution des migrations...').start();
101
+ try {
102
+ runCommand('php artisan migrate --no-interaction --force', projectDir, true);
103
+ migrateSpinner.succeed('Migrations exécutées');
104
+ }
105
+ catch (error) {
106
+ migrateSpinner.fail(`Migrations échouées : ${error.message}`);
107
+ }
108
+ // Run seeders
109
+ if (options.seed) {
110
+ const seedSpinner = (0, ora_1.default)('Exécution des seeders...').start();
111
+ try {
112
+ runCommand('php artisan db:seed --no-interaction --force', projectDir, true);
113
+ seedSpinner.succeed('Seeders exécutés');
114
+ }
115
+ catch (error) {
116
+ seedSpinner.warn(`Seeders : ${error.message}`);
117
+ }
118
+ }
119
+ // Check for Node dependencies
120
+ const packageJson = path_1.default.join(projectDir, 'package.json');
121
+ if (fs_1.default.existsSync(packageJson)) {
122
+ const npmSpinner = (0, ora_1.default)('Installation des dépendances Node...').start();
123
+ try {
124
+ runCommand('npm install', projectDir, true);
125
+ npmSpinner.succeed('Dépendances Node installées');
126
+ }
127
+ catch (error) {
128
+ npmSpinner.warn(`npm install : ${error.message}`);
129
+ }
130
+ }
131
+ // Serve
132
+ if (options.serve) {
133
+ console.log(`\n🌐 Lancement du serveur sur http://localhost:${options.port}...`);
134
+ console.log(' Ctrl+C pour arrĂȘter.\n');
135
+ try {
136
+ const open = await Promise.resolve().then(() => __importStar(require('open')));
137
+ setTimeout(() => {
138
+ open.default(`http://localhost:${options.port}`);
139
+ }, 2000);
140
+ }
141
+ catch { /* ignore if open fails */ }
142
+ // This will block — intentional
143
+ runCommand(`php artisan serve --port=${options.port}`, projectDir);
144
+ }
145
+ }
146
+ //# sourceMappingURL=installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/services/installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function showBanner(): void;
2
+ export declare function showSignature(): void;
3
+ //# sourceMappingURL=banner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../src/ui/banner.ts"],"names":[],"mappings":"AAYA,wBAAgB,UAAU,SAKzB;AAED,wBAAgB,aAAa,SAQ5B"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.showBanner = showBanner;
7
+ exports.showSignature = showSignature;
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const VERSION = '1.0.0';
10
+ const LOGO = `
11
+ ${chalk_1.default.yellow('_ ____ _ ')}
12
+ ${chalk_1.default.yellow('| | __ _ _ __ __ _ / ___|___ ___ | | __')}
13
+ ${chalk_1.default.yellow('| | / _` | \'__/ _` || | / _ \\ / _ \\| |/ /')}
14
+ ${chalk_1.default.yellow('| |__| (_| | | | (_| || |__| (_) | (_) | < ')}
15
+ ${chalk_1.default.yellow('|_____\\__,_|_| \\__,_| \\____\\___/ \\___/|_|\\_\\')}
16
+ `;
17
+ function showBanner() {
18
+ console.log(LOGO);
19
+ console.log(` ${chalk_1.default.cyan('Laravel Code Generator')}${chalk_1.default.gray(' ·')} ${chalk_1.default.green(`v${VERSION}`)}`);
20
+ console.log(` ${chalk_1.default.gray('Développé par')} ${chalk_1.default.white('El Hadji Papa Ndiouga Diallo')}`);
21
+ console.log('');
22
+ }
23
+ function showSignature() {
24
+ const line = chalk_1.default.gray('─'.repeat(50));
25
+ console.log('');
26
+ console.log(line);
27
+ console.log(` 🍳 ${chalk_1.default.yellow('Laracook')} ${chalk_1.default.gray('— by')} ${chalk_1.default.white('El Hadji Papa Ndiouga Diallo')}`);
28
+ console.log(` 💛 ${chalk_1.default.gray('Soutenir :')} ${chalk_1.default.cyan.underline('https://www.paypal.com/ncp/payment/XZKNHJAFBUTJJ')}`);
29
+ console.log(line);
30
+ console.log('');
31
+ }
32
+ //# sourceMappingURL=banner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/ui/banner.ts"],"names":[],"mappings":";;;;;AAYA,gCAKC;AAED,sCAQC;AA3BD,kDAA0B;AAE1B,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,MAAM,IAAI,GAAG;IACT,eAAK,CAAC,MAAM,CAAC,8CAA8C,CAAC;IAC5D,eAAK,CAAC,MAAM,CAAC,+CAA+C,CAAC;IAC7D,eAAK,CAAC,MAAM,CAAC,kDAAkD,CAAC;IAChE,eAAK,CAAC,MAAM,CAAC,+CAA+C,CAAC;IAC7D,eAAK,CAAC,MAAM,CAAC,sDAAsD,CAAC;CACvE,CAAC;AAEF,SAAgB,UAAU;IACxB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClB,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,eAAK,CAAC,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1G,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,eAAK,CAAC,KAAK,CAAC,8BAA8B,CAAC,EAAE,CAAC,CAAC;IAC/F,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,SAAgB,aAAa;IAC3B,MAAM,IAAI,GAAG,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClB,OAAO,CAAC,GAAG,CAAC,QAAQ,eAAK,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,eAAK,CAAC,KAAK,CAAC,8BAA8B,CAAC,EAAE,CAAC,CAAC;IACrH,OAAO,CAAC,GAAG,CAAC,QAAQ,eAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC,kDAAkD,CAAC,EAAE,CAAC,CAAC;IAC5H,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import chalk from 'chalk';
2
+ export declare const t: {
3
+ title: chalk.Chalk;
4
+ success: chalk.Chalk;
5
+ error: chalk.Chalk;
6
+ info: chalk.Chalk;
7
+ warn: chalk.Chalk;
8
+ muted: chalk.Chalk;
9
+ highlight: chalk.Chalk;
10
+ link: chalk.Chalk;
11
+ };
12
+ export declare function box(lines: string[], width?: number): string;
13
+ export declare function projectBox(info: {
14
+ name: string;
15
+ email: string;
16
+ models: number;
17
+ files: number;
18
+ stack?: string;
19
+ }): void;
20
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,eAAO,MAAM,CAAC;;;;;;;;;CASb,CAAC;AAEF,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,SAAK,GAAG,MAAM,CAUvD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,QAmB9G"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.t = void 0;
7
+ exports.box = box;
8
+ exports.projectBox = projectBox;
9
+ const chalk_1 = __importDefault(require("chalk"));
10
+ exports.t = {
11
+ title: chalk_1.default.yellow.bold,
12
+ success: chalk_1.default.green,
13
+ error: chalk_1.default.red,
14
+ info: chalk_1.default.cyan,
15
+ warn: chalk_1.default.yellow,
16
+ muted: chalk_1.default.gray,
17
+ highlight: chalk_1.default.white.bold,
18
+ link: chalk_1.default.cyan.underline,
19
+ };
20
+ function box(lines, width = 50) {
21
+ const top = `┌${'─'.repeat(width - 2)}┐`;
22
+ const bottom = `└${'─'.repeat(width - 2)}┘`;
23
+ const padded = lines.map((line) => {
24
+ // Strip ANSI for length calc
25
+ const stripped = line.replace(/\u001b\[[0-9;]*m/g, '');
26
+ const pad = Math.max(0, width - 4 - stripped.length);
27
+ return `│ ${line}${' '.repeat(pad)}│`;
28
+ });
29
+ return [chalk_1.default.gray(top), ...padded.map(l => chalk_1.default.gray(l.replace(/│/g, chalk_1.default.gray('│')))), chalk_1.default.gray(bottom)].join('\n');
30
+ }
31
+ function projectBox(info) {
32
+ const lines = [
33
+ `📩 ${exports.t.highlight('Projet')} : ${exports.t.info(info.name)}`,
34
+ `đŸ‘€ ${exports.t.highlight('Auteur')} : ${info.email}`,
35
+ `📊 ${info.models} modĂšles · ~${info.files} fichiers`,
36
+ ];
37
+ if (info.stack) {
38
+ lines.push(`🛠 ${exports.t.highlight('Stack')} : ${info.stack}`);
39
+ }
40
+ // Simple box
41
+ const w = 50;
42
+ const top = chalk_1.default.gray(`┌${'─'.repeat(w - 2)}┐`);
43
+ const bottom = chalk_1.default.gray(`└${'─'.repeat(w - 2)}┘`);
44
+ const rows = lines.map(line => {
45
+ const stripped = line.replace(/\u001b\[[0-9;]*m/g, '');
46
+ const pad = Math.max(0, w - 4 - stripped.length);
47
+ return chalk_1.default.gray('│') + ` ${line}${' '.repeat(pad)}` + chalk_1.default.gray('│');
48
+ });
49
+ console.log('\n' + [top, ...rows, bottom].join('\n'));
50
+ }
51
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ interface PrerequisiteCheck {
2
+ php: boolean;
3
+ phpVersion: string;
4
+ composer: boolean;
5
+ node: boolean;
6
+ nodeVersion: string;
7
+ }
8
+ export declare function checkPrerequisites(): Promise<PrerequisiteCheck>;
9
+ export {};
10
+ //# sourceMappingURL=checks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checks.d.ts","sourceRoot":"","sources":["../../src/utils/checks.ts"],"names":[],"mappings":"AAEA,UAAU,iBAAiB;IACzB,GAAG,EAAE,OAAO,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAUD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CA4BrE"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkPrerequisites = checkPrerequisites;
4
+ const child_process_1 = require("child_process");
5
+ function getCommandOutput(cmd) {
6
+ try {
7
+ return (0, child_process_1.execSync)(cmd, { encoding: 'utf-8', stdio: 'pipe' }).trim();
8
+ }
9
+ catch {
10
+ return null;
11
+ }
12
+ }
13
+ async function checkPrerequisites() {
14
+ // Check PHP
15
+ let php = false;
16
+ let phpVersion = '';
17
+ const phpOut = getCommandOutput('php -v');
18
+ if (phpOut) {
19
+ const match = phpOut.match(/PHP (\d+\.\d+\.\d+)/);
20
+ if (match) {
21
+ phpVersion = match[1];
22
+ const [major, minor] = phpVersion.split('.').map(Number);
23
+ php = major > 8 || (major === 8 && minor >= 2);
24
+ }
25
+ }
26
+ // Check Composer
27
+ const composer = getCommandOutput('composer --version') !== null;
28
+ // Check Node
29
+ let node = false;
30
+ let nodeVersion = '';
31
+ const nodeOut = getCommandOutput('node -v');
32
+ if (nodeOut) {
33
+ nodeVersion = nodeOut.replace('v', '');
34
+ const major = parseInt(nodeVersion.split('.')[0], 10);
35
+ node = major >= 18;
36
+ }
37
+ return { php, phpVersion, composer, node, nodeVersion };
38
+ }
39
+ //# sourceMappingURL=checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checks.js","sourceRoot":"","sources":["../../src/utils/checks.ts"],"names":[],"mappings":";;AAkBA,gDA4BC;AA9CD,iDAAyC;AAUzC,SAAS,gBAAgB,CAAC,GAAW;IACnC,IAAI,CAAC;QACH,OAAO,IAAA,wBAAQ,EAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,kBAAkB;IACtC,YAAY;IACZ,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAClD,IAAI,KAAK,EAAE,CAAC;YACV,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACzD,GAAG,GAAG,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,oBAAoB,CAAC,KAAK,IAAI,CAAC;IAEjE,aAAa;IACb,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,MAAM,OAAO,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC5C,IAAI,OAAO,EAAE,CAAC;QACZ,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;IACrB,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AAC1D,CAAC"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "laracook",
3
+ "version": "1.0.0",
4
+ "description": "CLI tool to install and manage Laracook projects locally",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "laracook": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsc",
14
+ "dev": "tsc --watch",
15
+ "start": "node dist/index.js",
16
+ "prepublishOnly": "npm run build"
17
+ },
18
+ "keywords": ["laravel", "laracook", "cli", "generator", "api"],
19
+ "license": "MIT",
20
+ "homepage": "https://laracook.dev",
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "https://github.com/laracook/laracook-cli"
24
+ },
25
+ "engines": {
26
+ "node": ">=18"
27
+ },
28
+ "dependencies": {
29
+ "commander": "^12.0.0",
30
+ "ora": "^5.4.1",
31
+ "chalk": "^4.1.2",
32
+ "inquirer": "^9.2.0",
33
+ "node-fetch": "^2.7.0",
34
+ "open": "^8.4.2",
35
+ "cli-table3": "^0.6.4"
36
+ },
37
+ "devDependencies": {
38
+ "typescript": "^5.4.0",
39
+ "@types/node": "^20.0.0",
40
+ "@types/inquirer": "^9.0.0",
41
+ "@types/node-fetch": "^2.6.11"
42
+ }
43
+ }