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.
- package/README.md +109 -0
- package/dist/commands/install.d.ts +11 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +189 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +70 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +69 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/services/api.d.ts +9 -0
- package/dist/services/api.d.ts.map +1 -0
- package/dist/services/api.js +46 -0
- package/dist/services/api.js.map +1 -0
- package/dist/services/auth.d.ts +13 -0
- package/dist/services/auth.d.ts.map +1 -0
- package/dist/services/auth.js +36 -0
- package/dist/services/auth.js.map +1 -0
- package/dist/services/installer.d.ts +9 -0
- package/dist/services/installer.d.ts.map +1 -0
- package/dist/services/installer.js +146 -0
- package/dist/services/installer.js.map +1 -0
- package/dist/ui/banner.d.ts +3 -0
- package/dist/ui/banner.d.ts.map +1 -0
- package/dist/ui/banner.js +32 -0
- package/dist/ui/banner.js.map +1 -0
- package/dist/ui/theme.d.ts +20 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +51 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/utils/checks.d.ts +10 -0
- package/dist/utils/checks.d.ts.map +1 -0
- package/dist/utils/checks.js +39 -0
- package/dist/utils/checks.js.map +1 -0
- 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":"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"}
|
|
@@ -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 @@
|
|
|
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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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"}
|
package/dist/ui/theme.js
ADDED
|
@@ -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":";;;;;;AAaA,kBAUC;AAED,gCAmBC;AA5CD,kDAA0B;AAEb,QAAA,CAAC,GAAG;IACf,KAAK,EAAE,eAAK,CAAC,MAAM,CAAC,IAAI;IACxB,OAAO,EAAE,eAAK,CAAC,KAAK;IACpB,KAAK,EAAE,eAAK,CAAC,GAAG;IAChB,IAAI,EAAE,eAAK,CAAC,IAAI;IAChB,IAAI,EAAE,eAAK,CAAC,MAAM;IAClB,KAAK,EAAE,eAAK,CAAC,IAAI;IACjB,SAAS,EAAE,eAAK,CAAC,KAAK,CAAC,IAAI;IAC3B,IAAI,EAAE,eAAK,CAAC,IAAI,CAAC,SAAS;CAC3B,CAAC;AAEF,SAAgB,GAAG,CAAC,KAAe,EAAE,KAAK,GAAG,EAAE;IAC7C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;IAC5C,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAChC,6BAA6B;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QACrD,OAAO,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;IACzC,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,eAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5H,CAAC;AAED,SAAgB,UAAU,CAAC,IAAoF;IAC7G,MAAM,KAAK,GAAG;QACZ,MAAM,SAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,SAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACpD,MAAM,SAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE;QAC7C,MAAM,IAAI,CAAC,MAAM,eAAe,IAAI,CAAC,KAAK,WAAW;KACtD,CAAC;IACF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,OAAO,SAAC,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,aAAa;IACb,MAAM,CAAC,GAAG,EAAE,CAAC;IACb,MAAM,GAAG,GAAG,eAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,eAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QACjD,OAAO,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACxD,CAAC"}
|
|
@@ -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
|
+
}
|