@almadar/cli 1.5.4 → 1.6.5

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 (63) hide show
  1. package/package.json +6 -6
  2. package/shells/almadar-shell/.env.example +0 -12
  3. package/shells/almadar-shell/almadar-shell/.env.example +0 -12
  4. package/shells/almadar-shell/almadar-shell/package.json +0 -19
  5. package/shells/almadar-shell/almadar-shell/packages/client/index.html +0 -13
  6. package/shells/almadar-shell/almadar-shell/packages/client/package.json +0 -49
  7. package/shells/almadar-shell/almadar-shell/packages/client/postcss.config.js +0 -6
  8. package/shells/almadar-shell/almadar-shell/packages/client/src/App.tsx +0 -68
  9. package/shells/almadar-shell/almadar-shell/packages/client/src/config/firebase.ts +0 -37
  10. package/shells/almadar-shell/almadar-shell/packages/client/src/features/auth/AuthContext.tsx +0 -139
  11. package/shells/almadar-shell/almadar-shell/packages/client/src/features/auth/authService.ts +0 -83
  12. package/shells/almadar-shell/almadar-shell/packages/client/src/features/auth/components/Login.tsx +0 -218
  13. package/shells/almadar-shell/almadar-shell/packages/client/src/features/auth/components/ProtectedRoute.tsx +0 -27
  14. package/shells/almadar-shell/almadar-shell/packages/client/src/features/auth/components/UserProfile.tsx +0 -68
  15. package/shells/almadar-shell/almadar-shell/packages/client/src/features/auth/components/index.ts +0 -3
  16. package/shells/almadar-shell/almadar-shell/packages/client/src/features/auth/index.ts +0 -13
  17. package/shells/almadar-shell/almadar-shell/packages/client/src/features/auth/types.ts +0 -24
  18. package/shells/almadar-shell/almadar-shell/packages/client/src/index.css +0 -6
  19. package/shells/almadar-shell/almadar-shell/packages/client/src/main.tsx +0 -10
  20. package/shells/almadar-shell/almadar-shell/packages/client/src/navigation/index.ts +0 -55
  21. package/shells/almadar-shell/almadar-shell/packages/client/src/pages/index.ts +0 -12
  22. package/shells/almadar-shell/almadar-shell/packages/client/tailwind.config.js +0 -12
  23. package/shells/almadar-shell/almadar-shell/packages/client/tsconfig.json +0 -33
  24. package/shells/almadar-shell/almadar-shell/packages/client/vite.config.ts +0 -49
  25. package/shells/almadar-shell/almadar-shell/packages/server/package.json +0 -32
  26. package/shells/almadar-shell/almadar-shell/packages/server/src/app.ts +0 -36
  27. package/shells/almadar-shell/almadar-shell/packages/server/src/index.ts +0 -16
  28. package/shells/almadar-shell/almadar-shell/packages/server/src/routes.ts +0 -11
  29. package/shells/almadar-shell/almadar-shell/packages/server/src/types/express.d.ts +0 -15
  30. package/shells/almadar-shell/almadar-shell/packages/server/tsconfig.json +0 -23
  31. package/shells/almadar-shell/almadar-shell/packages/shared/package.json +0 -10
  32. package/shells/almadar-shell/almadar-shell/packages/shared/src/index.ts +0 -2
  33. package/shells/almadar-shell/almadar-shell/turbo.json +0 -17
  34. package/shells/almadar-shell/package.json +0 -19
  35. package/shells/almadar-shell/packages/client/index.html +0 -13
  36. package/shells/almadar-shell/packages/client/package.json +0 -49
  37. package/shells/almadar-shell/packages/client/postcss.config.js +0 -6
  38. package/shells/almadar-shell/packages/client/src/App.tsx +0 -68
  39. package/shells/almadar-shell/packages/client/src/config/firebase.ts +0 -37
  40. package/shells/almadar-shell/packages/client/src/features/auth/AuthContext.tsx +0 -139
  41. package/shells/almadar-shell/packages/client/src/features/auth/authService.ts +0 -83
  42. package/shells/almadar-shell/packages/client/src/features/auth/components/Login.tsx +0 -218
  43. package/shells/almadar-shell/packages/client/src/features/auth/components/ProtectedRoute.tsx +0 -27
  44. package/shells/almadar-shell/packages/client/src/features/auth/components/UserProfile.tsx +0 -68
  45. package/shells/almadar-shell/packages/client/src/features/auth/components/index.ts +0 -3
  46. package/shells/almadar-shell/packages/client/src/features/auth/index.ts +0 -13
  47. package/shells/almadar-shell/packages/client/src/features/auth/types.ts +0 -24
  48. package/shells/almadar-shell/packages/client/src/index.css +0 -6
  49. package/shells/almadar-shell/packages/client/src/main.tsx +0 -10
  50. package/shells/almadar-shell/packages/client/src/navigation/index.ts +0 -55
  51. package/shells/almadar-shell/packages/client/src/pages/index.ts +0 -12
  52. package/shells/almadar-shell/packages/client/tailwind.config.js +0 -12
  53. package/shells/almadar-shell/packages/client/tsconfig.json +0 -33
  54. package/shells/almadar-shell/packages/client/vite.config.ts +0 -49
  55. package/shells/almadar-shell/packages/server/package.json +0 -32
  56. package/shells/almadar-shell/packages/server/src/app.ts +0 -36
  57. package/shells/almadar-shell/packages/server/src/index.ts +0 -16
  58. package/shells/almadar-shell/packages/server/src/routes.ts +0 -11
  59. package/shells/almadar-shell/packages/server/src/types/express.d.ts +0 -15
  60. package/shells/almadar-shell/packages/server/tsconfig.json +0 -23
  61. package/shells/almadar-shell/packages/shared/package.json +0 -10
  62. package/shells/almadar-shell/packages/shared/src/index.ts +0 -2
  63. package/shells/almadar-shell/turbo.json +0 -17
@@ -1,218 +0,0 @@
1
- import React, { useState, useEffect } from 'react';
2
- import { useAuthContext } from '../AuthContext';
3
- import { useNavigate, useSearchParams } from 'react-router-dom';
4
-
5
- const EMAIL_FOR_SIGN_IN_KEY = 'emailForSignIn';
6
-
7
- const Login: React.FC = () => {
8
- const [email, setEmail] = useState('');
9
- const [password, setPassword] = useState('');
10
- const [isSignUp, setIsSignUp] = useState(false);
11
- const [displayName, setDisplayName] = useState('');
12
- const [completingEmailLink, setCompletingEmailLink] = useState(false);
13
- const [emailForLinkCompletion, setEmailForLinkCompletion] = useState('');
14
-
15
- const {
16
- loading,
17
- error,
18
- signInWithGoogle,
19
- signInWithEmail,
20
- signUpWithEmail,
21
- signInWithEmailLink,
22
- isSignInWithEmailLink,
23
- clearError,
24
- } = useAuthContext();
25
- const navigate = useNavigate();
26
- const [searchParams] = useSearchParams();
27
-
28
- // Redirect on successful auth
29
- const { user } = useAuthContext();
30
- useEffect(() => {
31
- if (user) {
32
- const returnUrl = searchParams.get('returnUrl') || '/';
33
- navigate(returnUrl, { replace: true });
34
- }
35
- }, [user, navigate, searchParams]);
36
-
37
- // Check if user is returning from email link
38
- useEffect(() => {
39
- if (isSignInWithEmailLink(window.location.href)) {
40
- const emailForSignIn = window.localStorage.getItem(EMAIL_FOR_SIGN_IN_KEY);
41
-
42
- if (emailForSignIn) {
43
- setCompletingEmailLink(true);
44
- signInWithEmailLink(emailForSignIn, window.location.href)
45
- .then(() => {
46
- window.localStorage.removeItem(EMAIL_FOR_SIGN_IN_KEY);
47
- window.history.replaceState({}, document.title, '/login');
48
- setCompletingEmailLink(false);
49
- })
50
- .catch(() => {
51
- setCompletingEmailLink(false);
52
- setEmailForLinkCompletion(emailForSignIn);
53
- });
54
- } else {
55
- setCompletingEmailLink(true);
56
- setEmailForLinkCompletion('');
57
- }
58
- }
59
- }, [signInWithEmailLink, isSignInWithEmailLink]);
60
-
61
- const handleGoogleSignIn = async () => {
62
- clearError();
63
- await signInWithGoogle();
64
- };
65
-
66
- const handleEmailAuth = async (e: React.FormEvent) => {
67
- e.preventDefault();
68
- clearError();
69
- if (isSignUp) {
70
- await signUpWithEmail(email, password, displayName);
71
- } else {
72
- await signInWithEmail(email, password);
73
- }
74
- };
75
-
76
- const handleCompleteEmailLink = async (e: React.FormEvent) => {
77
- e.preventDefault();
78
- if (!emailForLinkCompletion.trim()) return;
79
-
80
- await signInWithEmailLink(emailForLinkCompletion, window.location.href);
81
- window.localStorage.removeItem(EMAIL_FOR_SIGN_IN_KEY);
82
- window.history.replaceState({}, document.title, '/login');
83
- setCompletingEmailLink(false);
84
- setEmailForLinkCompletion('');
85
- };
86
-
87
- return (
88
- <div className="min-h-screen flex items-center justify-center bg-gray-50 dark:bg-gray-900 py-12 px-4 sm:px-6 lg:px-8">
89
- <div className="max-w-md w-full space-y-8 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-xl p-8 shadow-lg">
90
- <div>
91
- <h2 className="mt-6 text-center text-3xl font-extrabold text-gray-900 dark:text-gray-100">
92
- {completingEmailLink
93
- ? 'Complete sign-in'
94
- : isSignUp
95
- ? 'Create your account'
96
- : 'Sign in to your account'}
97
- </h2>
98
- </div>
99
-
100
- <div className="mt-8 space-y-6">
101
- {completingEmailLink && (
102
- <form onSubmit={handleCompleteEmailLink} className="space-y-4">
103
- <div>
104
- <p className="text-sm text-gray-600 dark:text-gray-400 mb-3">
105
- Please enter your email address to complete sign-in.
106
- </p>
107
- <input
108
- type="email"
109
- autoComplete="email"
110
- required
111
- value={emailForLinkCompletion}
112
- onChange={(e) => setEmailForLinkCompletion(e.target.value)}
113
- className="appearance-none rounded-md relative block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 placeholder-gray-500 dark:placeholder-gray-400 text-gray-900 dark:text-gray-100 bg-white dark:bg-gray-700 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"
114
- placeholder="Enter your email"
115
- />
116
- </div>
117
-
118
- {error && (
119
- <div className="text-red-600 dark:text-red-300 text-sm text-center bg-red-50 dark:bg-red-900/20 p-3 rounded-md border border-red-200 dark:border-red-800">
120
- {error}
121
- </div>
122
- )}
123
-
124
- <button
125
- type="submit"
126
- disabled={loading || !emailForLinkCompletion.trim()}
127
- className="w-full flex justify-center py-2 px-4 border border-transparent text-sm font-medium rounded-md text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 disabled:opacity-50"
128
- >
129
- {loading ? 'Signing in...' : 'Complete sign-in'}
130
- </button>
131
- </form>
132
- )}
133
-
134
- {!completingEmailLink && (
135
- <>
136
- <button
137
- onClick={handleGoogleSignIn}
138
- disabled={loading}
139
- className="w-full flex justify-center py-2 px-4 border border-transparent text-sm font-medium rounded-md text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 disabled:opacity-50"
140
- >
141
- {loading ? 'Signing in...' : 'Sign in with Google'}
142
- </button>
143
-
144
- <div className="relative">
145
- <div className="absolute inset-0 flex items-center">
146
- <div className="w-full border-t border-gray-300 dark:border-gray-700" />
147
- </div>
148
- <div className="relative flex justify-center text-sm">
149
- <span className="px-2 bg-white dark:bg-gray-800 text-gray-500 dark:text-gray-400">
150
- Or sign in with email
151
- </span>
152
- </div>
153
- </div>
154
-
155
- <form className="space-y-4" onSubmit={handleEmailAuth}>
156
- {isSignUp && (
157
- <input
158
- type="text"
159
- required
160
- className="appearance-none rounded-md relative block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 placeholder-gray-500 dark:placeholder-gray-400 text-gray-900 dark:text-gray-100 bg-white dark:bg-gray-700 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"
161
- placeholder="Display Name"
162
- value={displayName}
163
- onChange={(e) => setDisplayName(e.target.value)}
164
- />
165
- )}
166
-
167
- <input
168
- type="email"
169
- autoComplete="email"
170
- required
171
- className="appearance-none rounded-md relative block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 placeholder-gray-500 dark:placeholder-gray-400 text-gray-900 dark:text-gray-100 bg-white dark:bg-gray-700 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"
172
- placeholder="Email address"
173
- value={email}
174
- onChange={(e) => setEmail(e.target.value)}
175
- />
176
-
177
- <input
178
- type="password"
179
- autoComplete={isSignUp ? 'new-password' : 'current-password'}
180
- required
181
- className="appearance-none rounded-md relative block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 placeholder-gray-500 dark:placeholder-gray-400 text-gray-900 dark:text-gray-100 bg-white dark:bg-gray-700 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"
182
- placeholder="Password"
183
- value={password}
184
- onChange={(e) => setPassword(e.target.value)}
185
- />
186
-
187
- {error && (
188
- <div className="text-red-600 dark:text-red-300 text-sm text-center bg-red-50 dark:bg-red-900/20 p-3 rounded-md border border-red-200 dark:border-red-800">
189
- {error}
190
- </div>
191
- )}
192
-
193
- <button
194
- type="submit"
195
- disabled={loading}
196
- className="w-full flex justify-center py-2 px-4 border border-transparent text-sm font-medium rounded-md text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 disabled:opacity-50"
197
- >
198
- {loading ? 'Processing...' : isSignUp ? 'Sign Up' : 'Sign In'}
199
- </button>
200
- </form>
201
-
202
- <div className="text-center">
203
- <button
204
- onClick={() => setIsSignUp(!isSignUp)}
205
- className="text-indigo-600 dark:text-indigo-400 hover:text-indigo-500 font-medium text-sm"
206
- >
207
- {isSignUp ? 'Already have an account? Sign in' : "Don't have an account? Sign up"}
208
- </button>
209
- </div>
210
- </>
211
- )}
212
- </div>
213
- </div>
214
- </div>
215
- );
216
- };
217
-
218
- export default Login;
@@ -1,27 +0,0 @@
1
- import React from 'react';
2
- import { Navigate } from 'react-router-dom';
3
- import { useAuthContext } from '../AuthContext';
4
-
5
- interface ProtectedRouteProps {
6
- children: React.ReactNode;
7
- }
8
-
9
- const ProtectedRoute: React.FC<ProtectedRouteProps> = ({ children }) => {
10
- const { user, loading } = useAuthContext();
11
-
12
- if (loading) {
13
- return (
14
- <div className="min-h-screen flex items-center justify-center">
15
- <div className="animate-spin rounded-full h-8 w-8 border-b-2 border-indigo-600" />
16
- </div>
17
- );
18
- }
19
-
20
- if (!user) {
21
- return <Navigate to="/login" replace />;
22
- }
23
-
24
- return <>{children}</>;
25
- };
26
-
27
- export default ProtectedRoute;
@@ -1,68 +0,0 @@
1
- import React, { useState, useRef, useEffect } from 'react';
2
- import { useAuthContext } from '../AuthContext';
3
-
4
- const UserProfile: React.FC = () => {
5
- const { user, loading, signOut } = useAuthContext();
6
- const [open, setOpen] = useState(false);
7
- const ref = useRef<HTMLDivElement>(null);
8
-
9
- useEffect(() => {
10
- const handleClickOutside = (e: MouseEvent) => {
11
- if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);
12
- };
13
- document.addEventListener('mousedown', handleClickOutside);
14
- return () => document.removeEventListener('mousedown', handleClickOutside);
15
- }, []);
16
-
17
- if (!user) return null;
18
-
19
- const handleSignOut = async () => {
20
- setOpen(false);
21
- await signOut();
22
- };
23
-
24
- return (
25
- <div ref={ref} className="relative">
26
- <button
27
- onClick={() => setOpen(!open)}
28
- className="flex items-center space-x-2 hover:opacity-80 transition-opacity"
29
- >
30
- {user.photoURL ? (
31
- <img
32
- className="h-8 w-8 rounded-full ring-2 ring-gray-200 dark:ring-gray-700"
33
- src={user.photoURL}
34
- alt={user.displayName || 'User'}
35
- />
36
- ) : (
37
- <div className="h-8 w-8 rounded-full bg-gray-300 dark:bg-gray-600 flex items-center justify-center text-sm font-medium text-gray-600 dark:text-gray-300">
38
- {(user.displayName || user.email || 'U')[0].toUpperCase()}
39
- </div>
40
- )}
41
- </button>
42
-
43
- {open && (
44
- <div className="absolute right-0 mt-2 w-56 rounded-md shadow-lg bg-white dark:bg-gray-800 ring-1 ring-black/5 dark:ring-white/10 z-50">
45
- <div className="px-4 py-3 border-b border-gray-100 dark:border-gray-700">
46
- <p className="text-sm font-medium text-gray-900 dark:text-gray-100 truncate">
47
- {user.displayName || 'User'}
48
- </p>
49
- <p className="text-sm text-gray-500 dark:text-gray-400 truncate">
50
- {user.email}
51
- </p>
52
- </div>
53
- <div className="py-1">
54
- <button
55
- onClick={handleSignOut}
56
- disabled={loading}
57
- className="w-full text-left px-4 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-50"
58
- >
59
- Sign Out
60
- </button>
61
- </div>
62
- </div>
63
- )}
64
- </div>
65
- );
66
- };
67
-
68
- export default UserProfile;
@@ -1,3 +0,0 @@
1
- export { default as Login } from './Login';
2
- export { default as UserProfile } from './UserProfile';
3
- export { default as ProtectedRoute } from './ProtectedRoute';
@@ -1,13 +0,0 @@
1
- // Context
2
- export { AuthProvider, useAuthContext } from './AuthContext';
3
-
4
- // Components
5
- export { default as Login } from './components/Login';
6
- export { default as UserProfile } from './components/UserProfile';
7
- export { default as ProtectedRoute } from './components/ProtectedRoute';
8
-
9
- // Service
10
- export { authService } from './authService';
11
-
12
- // Types
13
- export type { AuthContextType, LoginCredentials, SignUpCredentials } from './types';
@@ -1,24 +0,0 @@
1
- import { User } from 'firebase/auth';
2
-
3
- export interface LoginCredentials {
4
- email: string;
5
- password: string;
6
- }
7
-
8
- export interface SignUpCredentials extends LoginCredentials {
9
- displayName?: string;
10
- }
11
-
12
- export interface AuthContextType {
13
- user: User | null;
14
- loading: boolean;
15
- error: string | null;
16
- signInWithGoogle: () => Promise<void>;
17
- signOut: () => Promise<void>;
18
- signInWithEmail: (email: string, password: string) => Promise<void>;
19
- signUpWithEmail: (email: string, password: string, displayName?: string) => Promise<void>;
20
- sendSignInLinkToEmail: (email: string) => Promise<void>;
21
- signInWithEmailLink: (email: string, emailLink: string) => Promise<void>;
22
- isSignInWithEmailLink: (emailLink: string) => boolean;
23
- clearError: () => void;
24
- }
@@ -1,6 +0,0 @@
1
- @tailwind base;
2
- @tailwind components;
3
- @tailwind utilities;
4
-
5
- /* Import Almadar theme */
6
- @import '@almadar/ui/themes/almadar.css';
@@ -1,10 +0,0 @@
1
- import React from 'react';
2
- import ReactDOM from 'react-dom/client';
3
- import App from './App';
4
- import './index.css';
5
-
6
- ReactDOM.createRoot(document.getElementById('root')!).render(
7
- <React.StrictMode>
8
- <App />
9
- </React.StrictMode>
10
- );
@@ -1,55 +0,0 @@
1
- /**
2
- * Navigation Module for Compiled Shells
3
- *
4
- * Re-exports schema-driven navigation from @almadar/ui/renderer.
5
- * This module provides unified navigation that:
6
- * - Finds pages by path pattern (supports :id params)
7
- * - Switches active page via NavigationContext
8
- * - Fires INIT events with merged payload (route params + explicit)
9
- * - Optionally updates browser URL via history.pushState
10
- *
11
- * Usage in generated pages:
12
- * ```tsx
13
- * import { useNavigateTo, useInitPayload } from '../navigation';
14
- *
15
- * function InspectionsPage() {
16
- * const navigateTo = useNavigateTo();
17
- * const initPayload = useInitPayload();
18
- *
19
- * const handleRowClick = (item) => {
20
- * navigateTo(`/inspection/${item.id}`, { id: item.id });
21
- * };
22
- *
23
- * // Use initPayload for INIT event handling
24
- * }
25
- * ```
26
- *
27
- * @packageDocumentation
28
- */
29
-
30
- // Re-export all navigation utilities from @almadar/ui/renderer
31
- export {
32
- // Context and Provider
33
- NavigationProvider,
34
- useNavigation,
35
- useNavigateTo,
36
- useNavigationState,
37
- useInitPayload,
38
- useActivePage,
39
- useNavigationId,
40
- // Path utilities
41
- matchPath,
42
- extractRouteParams,
43
- pathMatches,
44
- // Page finding utilities
45
- findPageByPath,
46
- findPageByName,
47
- getDefaultPage,
48
- getAllPages,
49
- } from '@almadar/ui/renderer';
50
-
51
- export type {
52
- NavigationState,
53
- NavigationContextValue,
54
- NavigationProviderProps,
55
- } from '@almadar/ui/renderer';
@@ -1,12 +0,0 @@
1
- /**
2
- * Pages Placeholder
3
- *
4
- * This directory receives generated page components:
5
- * - Route pages from OrbitalSchema
6
- * - Layout components
7
- *
8
- * DO NOT EDIT - Contents are overwritten by compiler
9
- */
10
-
11
- // {{GENERATED_PAGE_EXPORTS}}
12
- export {};
@@ -1,12 +0,0 @@
1
- /** @type {import('tailwindcss').Config} */
2
- export default {
3
- content: [
4
- "./index.html",
5
- "./src/**/*.{js,ts,jsx,tsx}",
6
- "../../node_modules/@almadar/ui/**/*.{js,ts,jsx,tsx}",
7
- ],
8
- theme: {
9
- extend: {},
10
- },
11
- plugins: [],
12
- }
@@ -1,33 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "useDefineForClassFields": true,
5
- "lib": ["ES2022", "DOM", "DOM.Iterable"],
6
- "types": ["vite/client"],
7
- "module": "ESNext",
8
- "skipLibCheck": true,
9
- "moduleResolution": "bundler",
10
- "allowImportingTsExtensions": true,
11
- "resolveJsonModule": true,
12
- "isolatedModules": true,
13
- "noEmit": true,
14
- "jsx": "react-jsx",
15
- "strict": true,
16
- "noUnusedLocals": false,
17
- "noUnusedParameters": false,
18
- "noFallthroughCasesInSwitch": true,
19
- "baseUrl": ".",
20
- "paths": {
21
- "@/*": ["./src/*"],
22
- "@generated/*": ["./src/generated/*"],
23
- "@pages/*": ["./src/pages/*"],
24
- "@app/shared": ["../shared/src/index.ts"],
25
- "@app/shared/*": ["../shared/src/*"],
26
- "@shared/*": ["../shared/src/*"],
27
- "@design-system": ["../../../design-system/index.ts"],
28
- "@design-system/*": ["../../../design-system/*"]
29
- }
30
- },
31
- "include": ["src"],
32
- "exclude": ["node_modules", "dist", "src/**/__tests__", "src/**/*.stories.ts", "src/**/*.stories.tsx"]
33
- }
@@ -1,49 +0,0 @@
1
- import { defineConfig, loadEnv } from 'vite';
2
- import react from '@vitejs/plugin-react';
3
- import path from 'path';
4
-
5
- export default defineConfig(({ mode }) => {
6
- const env = loadEnv(mode, process.cwd(), '');
7
- const backendUrl = env.VITE_API_URL || 'http://localhost:3030';
8
- const wsUrl = backendUrl.replace('http://', 'ws://').replace('https://', 'wss://');
9
-
10
- return {
11
- plugins: [react()],
12
-
13
- resolve: {
14
- alias: {
15
- '@design-system': path.resolve(__dirname, '../../../design-system'),
16
- '@': path.resolve(__dirname, './src'),
17
- '@generated': path.resolve(__dirname, './src/generated'),
18
- '@pages': path.resolve(__dirname, './src/pages'),
19
- '@app/shared': path.resolve(__dirname, '../shared/src'),
20
- '@shared': path.resolve(__dirname, '../shared/src'),
21
- },
22
- },
23
-
24
- server: {
25
- host: true,
26
- port: 5173,
27
- proxy: {
28
- '/api': {
29
- target: backendUrl,
30
- changeOrigin: true,
31
- },
32
- '/ws': {
33
- target: wsUrl,
34
- ws: true,
35
- },
36
- },
37
- },
38
-
39
- build: {
40
- outDir: 'dist',
41
- sourcemap: true,
42
- },
43
-
44
- test: {
45
- environment: 'jsdom',
46
- globals: true,
47
- },
48
- };
49
- });
@@ -1,32 +0,0 @@
1
- {
2
- "name": "@almadar/shell-server",
3
- "version": "1.0.0",
4
- "private": true,
5
- "type": "module",
6
- "scripts": {
7
- "dev": "tsx watch src/index.ts",
8
- "build": "tsc",
9
- "start": "node dist/index.js",
10
- "typecheck": "tsc --noEmit",
11
- "lint": "eslint src/",
12
- "test": "vitest run --passWithNoTests",
13
- "test:watch": "vitest"
14
- },
15
- "dependencies": {
16
- "@almadar/server": "^1.3.1",
17
- "@almadar/evaluator": "^1.0.0",
18
- "@almadar/core": "^1.0.0",
19
- "cors": "^2.8.5",
20
- "dotenv": "^16.4.0",
21
- "express": "^4.21.0",
22
- "firebase-admin": "^12.0.0"
23
- },
24
- "devDependencies": {
25
- "@types/cors": "^2.8.17",
26
- "@types/express": "^5.0.0",
27
- "@types/node": "^20.0.0",
28
- "tsx": "^4.19.0",
29
- "typescript": "^5.7.0",
30
- "vitest": "^2.1.0"
31
- }
32
- }
@@ -1,36 +0,0 @@
1
- /**
2
- * Express Application Setup
3
- */
4
-
5
- import express from 'express';
6
- import cors from 'cors';
7
- import {
8
- env,
9
- logger,
10
- errorHandler,
11
- notFoundHandler,
12
- debugEventsRouter,
13
- } from '@almadar/server';
14
- import { registerRoutes } from './routes.js';
15
-
16
- export const app = express();
17
-
18
- // Middleware
19
- app.use(cors({ origin: true, credentials: true }));
20
- app.use(express.json());
21
- app.use(express.urlencoded({ extended: true }));
22
-
23
- // Health check
24
- app.get('/health', (_req, res) => {
25
- res.json({ status: 'ok' });
26
- });
27
-
28
- // Debug event bus endpoints (dev-only, no-op in production)
29
- app.use('/api/debug', debugEventsRouter());
30
-
31
- // Register generated routes
32
- registerRoutes(app);
33
-
34
- // Error handling
35
- app.use(notFoundHandler);
36
- app.use(errorHandler);
@@ -1,16 +0,0 @@
1
- /**
2
- * Server Entry Point
3
- */
4
-
5
- import { initializeFirebase, env, logger } from '@almadar/server';
6
-
7
- // Initialize Firebase before anything else uses it
8
- initializeFirebase();
9
-
10
- import { app } from './app.js';
11
-
12
- const PORT = env.PORT || 3030;
13
-
14
- app.listen(PORT, () => {
15
- logger.info(`Server running on port ${PORT}`);
16
- });
@@ -1,11 +0,0 @@
1
- /**
2
- * Route Registration
3
- *
4
- * Compiler generates route registration code here.
5
- */
6
-
7
- import type { Express } from 'express';
8
-
9
- export function registerRoutes(app: Express): void {
10
- // {{GENERATED_ROUTE_REGISTRATION}}
11
- }
@@ -1,15 +0,0 @@
1
- declare global {
2
- namespace Express {
3
- interface Request {
4
- firebaseUser?: {
5
- uid: string;
6
- email?: string;
7
- name?: string;
8
- picture?: string;
9
- [key: string]: unknown;
10
- };
11
- }
12
- }
13
- }
14
-
15
- export {};