@base44-preview/cli 0.0.1-pr.15.8b10ac1 → 0.0.1-pr.16.c796b32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +548 -363
- package/dist/cli/templates/backend-and-client/README.md +41 -0
- package/dist/cli/templates/backend-and-client/base44/config.jsonc.ejs +17 -0
- package/dist/cli/templates/backend-and-client/base44/entities/task.jsonc +16 -0
- package/dist/cli/templates/backend-and-client/components.json +16 -0
- package/dist/cli/templates/backend-and-client/index.html +13 -0
- package/dist/cli/templates/backend-and-client/jsconfig.json +13 -0
- package/dist/cli/templates/backend-and-client/package.json +24 -0
- package/dist/cli/templates/backend-and-client/postcss.config.js +6 -0
- package/dist/cli/templates/backend-and-client/src/App.jsx +135 -0
- package/dist/cli/templates/backend-and-client/src/api/base44Client.js.ejs +5 -0
- package/dist/cli/templates/backend-and-client/src/components/ui/button.jsx +23 -0
- package/dist/cli/templates/backend-and-client/src/components/ui/checkbox.jsx +20 -0
- package/dist/cli/templates/backend-and-client/src/components/ui/input.jsx +13 -0
- package/dist/cli/templates/backend-and-client/src/index.css +37 -0
- package/dist/cli/templates/backend-and-client/src/main.jsx +6 -0
- package/dist/cli/templates/backend-and-client/tailwind.config.js +41 -0
- package/dist/cli/templates/backend-and-client/vite.config.js +12 -0
- package/dist/cli/templates/backend-only/base44/.env.local.ejs +6 -0
- package/dist/cli/templates/backend-only/base44/config.jsonc.ejs +17 -0
- package/dist/cli/templates/templates.json +16 -0
- package/package.json +6 -1
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Todo App
|
|
2
|
+
|
|
3
|
+
A simple todo list app built with React and Base44 backend.
|
|
4
|
+
|
|
5
|
+
## Structure
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
base44/ # Backend configuration
|
|
9
|
+
├── config.jsonc # Project settings
|
|
10
|
+
└── entities/ # Data schemas
|
|
11
|
+
└── task.jsonc # Task entity
|
|
12
|
+
|
|
13
|
+
src/ # Frontend code
|
|
14
|
+
├── App.jsx # Main todo app
|
|
15
|
+
├── api/ # Base44 client
|
|
16
|
+
├── components/ui/ # UI components
|
|
17
|
+
└── lib/ # Utilities
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Development
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npm install
|
|
24
|
+
npm run dev
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Commands
|
|
28
|
+
|
|
29
|
+
| Command | Description |
|
|
30
|
+
|---------|-------------|
|
|
31
|
+
| `npm run dev` | Start dev server |
|
|
32
|
+
| `npm run build` | Build for production |
|
|
33
|
+
| `npm run preview` | Preview production build |
|
|
34
|
+
|
|
35
|
+
## Base44 CLI
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
base44 login # Authenticate
|
|
39
|
+
base44 entities push # Push entity schemas
|
|
40
|
+
base44 deploy # Deploy backend + hosting
|
|
41
|
+
```
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Base44 Project Configuration
|
|
2
|
+
// JSONC enables inline documentation and discoverability directly in config files.
|
|
3
|
+
// Full-stack template with backend and client configuration.
|
|
4
|
+
|
|
5
|
+
{
|
|
6
|
+
"name": "<%= name %>"<% if (description) { %>,
|
|
7
|
+
"description": "<%= description %>"<% } %>,
|
|
8
|
+
|
|
9
|
+
// Site/hosting configuration for the client application
|
|
10
|
+
// Docs: https://docs.base44.com/configuration/hosting
|
|
11
|
+
"site": {
|
|
12
|
+
"buildCommand": "npm run build",
|
|
13
|
+
"serveCommand": "npm run dev",
|
|
14
|
+
"outputDirectory": "./dist",
|
|
15
|
+
"installCommand": "npm ci"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Task",
|
|
3
|
+
"type": "object",
|
|
4
|
+
"properties": {
|
|
5
|
+
"title": {
|
|
6
|
+
"type": "string",
|
|
7
|
+
"description": "Task title"
|
|
8
|
+
},
|
|
9
|
+
"completed": {
|
|
10
|
+
"type": "boolean",
|
|
11
|
+
"default": false,
|
|
12
|
+
"description": "Whether the task is completed"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"required": ["title"]
|
|
16
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://ui.shadcn.com/schema.json",
|
|
3
|
+
"style": "new-york",
|
|
4
|
+
"rsc": false,
|
|
5
|
+
"tsx": false,
|
|
6
|
+
"tailwind": {
|
|
7
|
+
"config": "tailwind.config.js",
|
|
8
|
+
"css": "src/index.css",
|
|
9
|
+
"baseColor": "slate",
|
|
10
|
+
"cssVariables": true
|
|
11
|
+
},
|
|
12
|
+
"aliases": {
|
|
13
|
+
"components": "@/components",
|
|
14
|
+
"ui": "@/components/ui"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<link rel="icon" type="image/svg+xml" href="https://base44.com/logo_v2.svg" />
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
|
+
<title>Todo App</title>
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<div id="root"></div>
|
|
11
|
+
<script type="module" src="/src/main.jsx"></script>
|
|
12
|
+
</body>
|
|
13
|
+
</html>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "base44-app",
|
|
3
|
+
"private": true,
|
|
4
|
+
"version": "0.0.0",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"dev": "vite",
|
|
8
|
+
"build": "vite build",
|
|
9
|
+
"preview": "vite preview"
|
|
10
|
+
},
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"@base44/sdk": "^0.8.3",
|
|
13
|
+
"lucide-react": "^0.475.0",
|
|
14
|
+
"react": "^18.2.0",
|
|
15
|
+
"react-dom": "^18.2.0"
|
|
16
|
+
},
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"@vitejs/plugin-react": "^4.3.4",
|
|
19
|
+
"autoprefixer": "^10.4.20",
|
|
20
|
+
"postcss": "^8.5.3",
|
|
21
|
+
"tailwindcss": "^3.4.17",
|
|
22
|
+
"vite": "^6.1.0"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { useState, useEffect } from 'react';
|
|
2
|
+
import { base44 } from '@/api/base44Client';
|
|
3
|
+
import { Button } from '@/components/ui/button';
|
|
4
|
+
import { Checkbox } from '@/components/ui/checkbox';
|
|
5
|
+
import { Input } from '@/components/ui/input';
|
|
6
|
+
import { Plus, Trash2, CheckCircle2 } from 'lucide-react';
|
|
7
|
+
|
|
8
|
+
const Task = base44.entities.Task;
|
|
9
|
+
|
|
10
|
+
export default function App() {
|
|
11
|
+
const [tasks, setTasks] = useState([]);
|
|
12
|
+
const [newTaskTitle, setNewTaskTitle] = useState('');
|
|
13
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
14
|
+
|
|
15
|
+
const fetchTasks = async () => {
|
|
16
|
+
const data = await Task.list();
|
|
17
|
+
setTasks(data);
|
|
18
|
+
setIsLoading(false);
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
fetchTasks();
|
|
23
|
+
}, []);
|
|
24
|
+
|
|
25
|
+
const handleSubmit = async (e) => {
|
|
26
|
+
e.preventDefault();
|
|
27
|
+
if (!newTaskTitle.trim()) return;
|
|
28
|
+
await Task.create({ title: newTaskTitle.trim(), completed: false });
|
|
29
|
+
setNewTaskTitle('');
|
|
30
|
+
fetchTasks();
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const toggleTask = async (id, completed) => {
|
|
34
|
+
await Task.update(id, { completed });
|
|
35
|
+
fetchTasks();
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const deleteTask = async (id) => {
|
|
39
|
+
await Task.delete(id);
|
|
40
|
+
fetchTasks();
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const clearCompleted = async () => {
|
|
44
|
+
await Promise.all(tasks.filter((t) => t.completed).map((t) => Task.delete(t.id)));
|
|
45
|
+
fetchTasks();
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const completedCount = tasks.filter((t) => t.completed).length;
|
|
49
|
+
const totalCount = tasks.length;
|
|
50
|
+
|
|
51
|
+
return (
|
|
52
|
+
<div className="min-h-screen bg-gradient-to-br from-slate-50 via-white to-orange-50/30">
|
|
53
|
+
<div className="max-w-lg mx-auto px-6 py-16">
|
|
54
|
+
{/* Header */}
|
|
55
|
+
<div className="text-center mb-12">
|
|
56
|
+
<div className="inline-flex items-center justify-center w-14 h-14 rounded-2xl bg-gradient-to-br from-orange-500 to-orange-600 shadow-lg shadow-orange-500/25 mb-6">
|
|
57
|
+
<CheckCircle2 className="w-7 h-7 text-white" />
|
|
58
|
+
</div>
|
|
59
|
+
<h1 className="text-3xl font-semibold text-slate-900 tracking-tight">Tasks</h1>
|
|
60
|
+
{totalCount > 0 && (
|
|
61
|
+
<p className="text-slate-500 mt-2 text-sm">
|
|
62
|
+
{completedCount} of {totalCount} completed
|
|
63
|
+
</p>
|
|
64
|
+
)}
|
|
65
|
+
</div>
|
|
66
|
+
|
|
67
|
+
{/* Add Task Form */}
|
|
68
|
+
<form onSubmit={handleSubmit} className="mb-8">
|
|
69
|
+
<div className="flex gap-3">
|
|
70
|
+
<Input
|
|
71
|
+
type="text"
|
|
72
|
+
value={newTaskTitle}
|
|
73
|
+
onChange={(e) => setNewTaskTitle(e.target.value)}
|
|
74
|
+
placeholder="What needs to be done?"
|
|
75
|
+
className="flex-1 h-12 bg-white border-slate-200 rounded-xl shadow-sm"
|
|
76
|
+
/>
|
|
77
|
+
<Button
|
|
78
|
+
type="submit"
|
|
79
|
+
disabled={!newTaskTitle.trim()}
|
|
80
|
+
className="h-12 px-5 rounded-xl bg-slate-900 hover:bg-slate-800 shadow-sm"
|
|
81
|
+
>
|
|
82
|
+
<Plus className="w-5 h-5" />
|
|
83
|
+
</Button>
|
|
84
|
+
</div>
|
|
85
|
+
</form>
|
|
86
|
+
|
|
87
|
+
{/* Task List */}
|
|
88
|
+
<div className="space-y-2">
|
|
89
|
+
{isLoading ? (
|
|
90
|
+
<div className="flex items-center justify-center py-12">
|
|
91
|
+
<div className="w-6 h-6 border-2 border-slate-200 border-t-orange-500 rounded-full animate-spin" />
|
|
92
|
+
</div>
|
|
93
|
+
) : tasks.length === 0 ? (
|
|
94
|
+
<div className="text-center py-12">
|
|
95
|
+
<p className="text-slate-400">No tasks yet. Add one above!</p>
|
|
96
|
+
</div>
|
|
97
|
+
) : (
|
|
98
|
+
tasks.map((task) => (
|
|
99
|
+
<div
|
|
100
|
+
key={task.id}
|
|
101
|
+
className="group flex items-center gap-4 p-4 bg-white rounded-xl border border-slate-100 shadow-sm hover:shadow-md transition-all duration-200"
|
|
102
|
+
>
|
|
103
|
+
<Checkbox
|
|
104
|
+
checked={task.completed}
|
|
105
|
+
onCheckedChange={(checked) => toggleTask(task.id, checked)}
|
|
106
|
+
className="w-5 h-5 rounded-md border-slate-300 data-[state=checked]:bg-orange-500 data-[state=checked]:border-orange-500"
|
|
107
|
+
/>
|
|
108
|
+
<span className={`flex-1 text-slate-700 transition-all ${task.completed ? 'line-through text-slate-400' : ''}`}>
|
|
109
|
+
{task.title}
|
|
110
|
+
</span>
|
|
111
|
+
<Button
|
|
112
|
+
variant="ghost"
|
|
113
|
+
size="icon"
|
|
114
|
+
onClick={() => deleteTask(task.id)}
|
|
115
|
+
className="opacity-0 group-hover:opacity-100 h-8 w-8 text-slate-400 hover:text-red-500 hover:bg-red-50 transition-all"
|
|
116
|
+
>
|
|
117
|
+
<Trash2 className="w-4 h-4" />
|
|
118
|
+
</Button>
|
|
119
|
+
</div>
|
|
120
|
+
))
|
|
121
|
+
)}
|
|
122
|
+
</div>
|
|
123
|
+
|
|
124
|
+
{/* Footer */}
|
|
125
|
+
{completedCount > 0 && (
|
|
126
|
+
<div className="mt-8 text-center">
|
|
127
|
+
<button onClick={clearCompleted} className="text-sm text-slate-400 hover:text-slate-600 transition-colors">
|
|
128
|
+
Clear completed
|
|
129
|
+
</button>
|
|
130
|
+
</div>
|
|
131
|
+
)}
|
|
132
|
+
</div>
|
|
133
|
+
</div>
|
|
134
|
+
);
|
|
135
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { forwardRef } from 'react';
|
|
2
|
+
|
|
3
|
+
const Button = forwardRef(({ className = '', variant, size, ...props }, ref) => {
|
|
4
|
+
const baseStyles = 'inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50';
|
|
5
|
+
|
|
6
|
+
const variantStyles = variant === 'ghost'
|
|
7
|
+
? 'hover:bg-slate-100'
|
|
8
|
+
: 'bg-slate-900 text-white shadow hover:bg-slate-800';
|
|
9
|
+
|
|
10
|
+
const sizeStyles = size === 'icon' ? 'h-9 w-9' : 'h-9 px-4 py-2';
|
|
11
|
+
|
|
12
|
+
return (
|
|
13
|
+
<button
|
|
14
|
+
ref={ref}
|
|
15
|
+
className={`${baseStyles} ${variantStyles} ${sizeStyles} ${className}`}
|
|
16
|
+
{...props}
|
|
17
|
+
/>
|
|
18
|
+
);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
Button.displayName = 'Button';
|
|
22
|
+
|
|
23
|
+
export { Button };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { forwardRef } from 'react';
|
|
2
|
+
import { Check } from 'lucide-react';
|
|
3
|
+
|
|
4
|
+
const Checkbox = forwardRef(({ className = '', checked, onCheckedChange, ...props }, ref) => (
|
|
5
|
+
<button
|
|
6
|
+
ref={ref}
|
|
7
|
+
type="button"
|
|
8
|
+
role="checkbox"
|
|
9
|
+
aria-checked={checked}
|
|
10
|
+
onClick={() => onCheckedChange?.(!checked)}
|
|
11
|
+
className={`h-4 w-4 shrink-0 rounded-sm border border-slate-300 shadow-sm flex items-center justify-center focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-slate-400 disabled:cursor-not-allowed disabled:opacity-50 ${checked ? 'bg-slate-900 text-white border-slate-900' : 'bg-white'} ${className}`}
|
|
12
|
+
{...props}
|
|
13
|
+
>
|
|
14
|
+
{checked && <Check className="h-3 w-3" />}
|
|
15
|
+
</button>
|
|
16
|
+
));
|
|
17
|
+
|
|
18
|
+
Checkbox.displayName = 'Checkbox';
|
|
19
|
+
|
|
20
|
+
export { Checkbox };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { forwardRef } from 'react';
|
|
2
|
+
|
|
3
|
+
const Input = forwardRef(({ className = '', ...props }, ref) => (
|
|
4
|
+
<input
|
|
5
|
+
ref={ref}
|
|
6
|
+
className={`flex h-9 w-full rounded-md border border-slate-200 bg-white px-3 py-1 text-sm shadow-sm transition-colors placeholder:text-slate-400 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-slate-400 disabled:cursor-not-allowed disabled:opacity-50 ${className}`}
|
|
7
|
+
{...props}
|
|
8
|
+
/>
|
|
9
|
+
));
|
|
10
|
+
|
|
11
|
+
Input.displayName = 'Input';
|
|
12
|
+
|
|
13
|
+
export { Input };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
@tailwind base;
|
|
2
|
+
@tailwind components;
|
|
3
|
+
@tailwind utilities;
|
|
4
|
+
|
|
5
|
+
@layer base {
|
|
6
|
+
:root {
|
|
7
|
+
--background: 0 0% 100%;
|
|
8
|
+
--foreground: 222.2 84% 4.9%;
|
|
9
|
+
--card: 0 0% 100%;
|
|
10
|
+
--card-foreground: 222.2 84% 4.9%;
|
|
11
|
+
--popover: 0 0% 100%;
|
|
12
|
+
--popover-foreground: 222.2 84% 4.9%;
|
|
13
|
+
--primary: 222.2 47.4% 11.2%;
|
|
14
|
+
--primary-foreground: 210 40% 98%;
|
|
15
|
+
--secondary: 210 40% 96.1%;
|
|
16
|
+
--secondary-foreground: 222.2 47.4% 11.2%;
|
|
17
|
+
--muted: 210 40% 96.1%;
|
|
18
|
+
--muted-foreground: 215.4 16.3% 46.9%;
|
|
19
|
+
--accent: 210 40% 96.1%;
|
|
20
|
+
--accent-foreground: 222.2 47.4% 11.2%;
|
|
21
|
+
--destructive: 0 84.2% 60.2%;
|
|
22
|
+
--destructive-foreground: 210 40% 98%;
|
|
23
|
+
--border: 214.3 31.8% 91.4%;
|
|
24
|
+
--input: 214.3 31.8% 91.4%;
|
|
25
|
+
--ring: 222.2 84% 4.9%;
|
|
26
|
+
--radius: 0.5rem;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
@layer base {
|
|
31
|
+
* {
|
|
32
|
+
@apply border-border;
|
|
33
|
+
}
|
|
34
|
+
body {
|
|
35
|
+
@apply bg-background text-foreground antialiased;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/** @type {import('tailwindcss').Config} */
|
|
2
|
+
export default {
|
|
3
|
+
content: ['./index.html', './src/**/*.{js,jsx}'],
|
|
4
|
+
theme: {
|
|
5
|
+
extend: {
|
|
6
|
+
borderRadius: {
|
|
7
|
+
lg: 'var(--radius)',
|
|
8
|
+
md: 'calc(var(--radius) - 2px)',
|
|
9
|
+
sm: 'calc(var(--radius) - 4px)',
|
|
10
|
+
},
|
|
11
|
+
colors: {
|
|
12
|
+
background: 'hsl(var(--background))',
|
|
13
|
+
foreground: 'hsl(var(--foreground))',
|
|
14
|
+
primary: {
|
|
15
|
+
DEFAULT: 'hsl(var(--primary))',
|
|
16
|
+
foreground: 'hsl(var(--primary-foreground))',
|
|
17
|
+
},
|
|
18
|
+
secondary: {
|
|
19
|
+
DEFAULT: 'hsl(var(--secondary))',
|
|
20
|
+
foreground: 'hsl(var(--secondary-foreground))',
|
|
21
|
+
},
|
|
22
|
+
muted: {
|
|
23
|
+
DEFAULT: 'hsl(var(--muted))',
|
|
24
|
+
foreground: 'hsl(var(--muted-foreground))',
|
|
25
|
+
},
|
|
26
|
+
accent: {
|
|
27
|
+
DEFAULT: 'hsl(var(--accent))',
|
|
28
|
+
foreground: 'hsl(var(--accent-foreground))',
|
|
29
|
+
},
|
|
30
|
+
destructive: {
|
|
31
|
+
DEFAULT: 'hsl(var(--destructive))',
|
|
32
|
+
foreground: 'hsl(var(--destructive-foreground))',
|
|
33
|
+
},
|
|
34
|
+
border: 'hsl(var(--border))',
|
|
35
|
+
input: 'hsl(var(--input))',
|
|
36
|
+
ring: 'hsl(var(--ring))',
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
plugins: [],
|
|
41
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Base44 Project Configuration
|
|
2
|
+
// JSONC enables inline documentation and discoverability directly in config files.
|
|
3
|
+
// Commented-out properties show available options you can enable.
|
|
4
|
+
|
|
5
|
+
{
|
|
6
|
+
"name": "<%= name %>"<% if (description) { %>,
|
|
7
|
+
"description": "<%= description %>"<% } %>
|
|
8
|
+
|
|
9
|
+
// Site/hosting configuration
|
|
10
|
+
// Docs: https://docs.base44.com/configuration/hosting
|
|
11
|
+
// "site": {
|
|
12
|
+
// "buildCommand": "npm run build",
|
|
13
|
+
// "serveCommand": "npm run dev",
|
|
14
|
+
// "outputDirectory": "./dist",
|
|
15
|
+
// "installCommand": "npm ci"
|
|
16
|
+
// }
|
|
17
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"templates": [
|
|
3
|
+
{
|
|
4
|
+
"id": "backend-only",
|
|
5
|
+
"name": "Backend Only",
|
|
6
|
+
"description": "Create a Base44 backend project with entities, functions, and APIs",
|
|
7
|
+
"path": "backend-only"
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"id": "backend-and-client",
|
|
11
|
+
"name": "To Do App - Backend + Client",
|
|
12
|
+
"description": "Full-stack project with Base44 backend, Vite and a React client application",
|
|
13
|
+
"path": "backend-and-client"
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@base44-preview/cli",
|
|
3
|
-
"version": "0.0.1-pr.
|
|
3
|
+
"version": "0.0.1-pr.16.c796b32",
|
|
4
4
|
"description": "Base44 CLI - Unified interface for managing Base44 applications",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/cli/index.js",
|
|
@@ -36,14 +36,19 @@
|
|
|
36
36
|
"@clack/prompts": "^0.11.0",
|
|
37
37
|
"chalk": "^5.6.2",
|
|
38
38
|
"commander": "^12.1.0",
|
|
39
|
+
"dotenv": "^17.2.3",
|
|
40
|
+
"ejs": "^3.1.10",
|
|
39
41
|
"globby": "^16.1.0",
|
|
40
42
|
"jsonc-parser": "^3.3.1",
|
|
41
43
|
"ky": "^1.14.2",
|
|
44
|
+
"lodash.kebabcase": "^4.1.1",
|
|
42
45
|
"p-wait-for": "^6.0.0",
|
|
43
46
|
"zod": "^4.3.5"
|
|
44
47
|
},
|
|
45
48
|
"devDependencies": {
|
|
46
49
|
"@stylistic/eslint-plugin": "^5.6.1",
|
|
50
|
+
"@types/ejs": "^3.1.5",
|
|
51
|
+
"@types/lodash.kebabcase": "^4.1.9",
|
|
47
52
|
"@types/node": "^22.10.5",
|
|
48
53
|
"@typescript-eslint/eslint-plugin": "^8.51.0",
|
|
49
54
|
"@typescript-eslint/parser": "^8.51.0",
|