@nitronjs/framework 0.1.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 +429 -0
- package/cli/create.js +260 -0
- package/cli/njs.js +164 -0
- package/lib/Auth/Manager.js +111 -0
- package/lib/Build/Manager.js +1232 -0
- package/lib/Console/Commands/BuildCommand.js +25 -0
- package/lib/Console/Commands/DevCommand.js +385 -0
- package/lib/Console/Commands/MakeCommand.js +110 -0
- package/lib/Console/Commands/MigrateCommand.js +98 -0
- package/lib/Console/Commands/MigrateFreshCommand.js +97 -0
- package/lib/Console/Commands/SeedCommand.js +92 -0
- package/lib/Console/Commands/StorageLinkCommand.js +31 -0
- package/lib/Console/Stubs/controller.js +19 -0
- package/lib/Console/Stubs/middleware.js +9 -0
- package/lib/Console/Stubs/migration.js +23 -0
- package/lib/Console/Stubs/model.js +7 -0
- package/lib/Console/Stubs/page-hydration.tsx +54 -0
- package/lib/Console/Stubs/seeder.js +9 -0
- package/lib/Console/Stubs/vendor.tsx +11 -0
- package/lib/Core/Config.js +86 -0
- package/lib/Core/Environment.js +21 -0
- package/lib/Core/Paths.js +188 -0
- package/lib/Database/Connection.js +61 -0
- package/lib/Database/DB.js +84 -0
- package/lib/Database/Drivers/MySQLDriver.js +234 -0
- package/lib/Database/Manager.js +162 -0
- package/lib/Database/Model.js +161 -0
- package/lib/Database/QueryBuilder.js +714 -0
- package/lib/Database/QueryValidation.js +62 -0
- package/lib/Database/Schema/Blueprint.js +126 -0
- package/lib/Database/Schema/Manager.js +116 -0
- package/lib/Date/DateTime.js +108 -0
- package/lib/Date/Locale.js +68 -0
- package/lib/Encryption/Manager.js +47 -0
- package/lib/Filesystem/Manager.js +49 -0
- package/lib/Hashing/Manager.js +25 -0
- package/lib/Http/Server.js +317 -0
- package/lib/Logging/Manager.js +153 -0
- package/lib/Mail/Manager.js +120 -0
- package/lib/Route/Loader.js +81 -0
- package/lib/Route/Manager.js +265 -0
- package/lib/Runtime/Entry.js +11 -0
- package/lib/Session/File.js +299 -0
- package/lib/Session/Manager.js +259 -0
- package/lib/Session/Memory.js +67 -0
- package/lib/Session/Session.js +196 -0
- package/lib/Support/Str.js +100 -0
- package/lib/Translation/Manager.js +49 -0
- package/lib/Validation/MimeTypes.js +39 -0
- package/lib/Validation/Validator.js +691 -0
- package/lib/View/Manager.js +544 -0
- package/lib/View/Templates/default/Home.tsx +262 -0
- package/lib/View/Templates/default/MainLayout.tsx +44 -0
- package/lib/View/Templates/errors/404.tsx +13 -0
- package/lib/View/Templates/errors/500.tsx +13 -0
- package/lib/View/Templates/errors/ErrorLayout.tsx +112 -0
- package/lib/View/Templates/messages/Maintenance.tsx +17 -0
- package/lib/View/Templates/messages/MessageLayout.tsx +136 -0
- package/lib/index.js +57 -0
- package/package.json +47 -0
- package/skeleton/.env.example +26 -0
- package/skeleton/app/Controllers/HomeController.js +9 -0
- package/skeleton/app/Kernel.js +11 -0
- package/skeleton/app/Middlewares/Authentication.js +9 -0
- package/skeleton/app/Middlewares/Guest.js +9 -0
- package/skeleton/app/Middlewares/VerifyCsrf.js +24 -0
- package/skeleton/app/Models/User.js +7 -0
- package/skeleton/config/app.js +4 -0
- package/skeleton/config/auth.js +16 -0
- package/skeleton/config/database.js +27 -0
- package/skeleton/config/hash.js +3 -0
- package/skeleton/config/server.js +28 -0
- package/skeleton/config/session.js +21 -0
- package/skeleton/database/migrations/2025_01_01_00_00_users.js +20 -0
- package/skeleton/database/seeders/UserSeeder.js +15 -0
- package/skeleton/globals.d.ts +1 -0
- package/skeleton/package.json +24 -0
- package/skeleton/public/.gitkeep +0 -0
- package/skeleton/resources/css/.gitkeep +0 -0
- package/skeleton/resources/langs/.gitkeep +0 -0
- package/skeleton/resources/views/Site/Home.tsx +66 -0
- package/skeleton/routes/web.js +4 -0
- package/skeleton/storage/app/private/.gitkeep +0 -0
- package/skeleton/storage/app/public/.gitkeep +0 -0
- package/skeleton/storage/framework/sessions/.gitkeep +0 -0
- package/skeleton/storage/logs/.gitkeep +0 -0
- package/skeleton/tsconfig.json +33 -0
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import MainLayout from "./MainLayout";
|
|
2
|
+
|
|
3
|
+
type HomeProps = {
|
|
4
|
+
name: string;
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
export default function Home({ name }: HomeProps) {
|
|
8
|
+
return (
|
|
9
|
+
<MainLayout title="Welcome to NitronJS">
|
|
10
|
+
<main style={{
|
|
11
|
+
flex: '1',
|
|
12
|
+
display: 'flex',
|
|
13
|
+
flexDirection: 'column',
|
|
14
|
+
justifyContent: 'center',
|
|
15
|
+
alignItems: 'center',
|
|
16
|
+
padding: '5rem 2rem',
|
|
17
|
+
textAlign: 'center',
|
|
18
|
+
position: 'relative'
|
|
19
|
+
}}>
|
|
20
|
+
{/* Animated gradient orb */}
|
|
21
|
+
<div style={{
|
|
22
|
+
position: 'absolute',
|
|
23
|
+
top: '20%',
|
|
24
|
+
left: '50%',
|
|
25
|
+
transform: 'translate(-50%, -50%)',
|
|
26
|
+
width: '500px',
|
|
27
|
+
height: '500px',
|
|
28
|
+
background: 'radial-gradient(circle, rgba(0,112,243,0.15) 0%, transparent 70%)',
|
|
29
|
+
borderRadius: '50%',
|
|
30
|
+
filter: 'blur(60px)',
|
|
31
|
+
pointerEvents: 'none',
|
|
32
|
+
zIndex: '0'
|
|
33
|
+
}} />
|
|
34
|
+
|
|
35
|
+
<div style={{ position: 'relative', zIndex: '1' }}>
|
|
36
|
+
<h1 style={{
|
|
37
|
+
fontSize: '5rem',
|
|
38
|
+
fontWeight: '800',
|
|
39
|
+
margin: '0 0 1.5rem 0',
|
|
40
|
+
lineHeight: '1.1',
|
|
41
|
+
letterSpacing: '-0.03em'
|
|
42
|
+
}}>
|
|
43
|
+
Welcome to{' '}
|
|
44
|
+
<span style={{
|
|
45
|
+
background: 'linear-gradient(90deg, #0070f3 0%, #00d4ff 100%)',
|
|
46
|
+
WebkitBackgroundClip: 'text',
|
|
47
|
+
WebkitTextFillColor: 'transparent',
|
|
48
|
+
backgroundClip: 'text',
|
|
49
|
+
position: 'relative'
|
|
50
|
+
}}>NitronJS!</span>
|
|
51
|
+
</h1>
|
|
52
|
+
|
|
53
|
+
<p style={{
|
|
54
|
+
fontSize: '1.25rem',
|
|
55
|
+
color: '#888',
|
|
56
|
+
maxWidth: '600px',
|
|
57
|
+
margin: '0 auto 3rem',
|
|
58
|
+
lineHeight: '1.6'
|
|
59
|
+
}}>
|
|
60
|
+
The modern JavaScript framework for building fast, scalable applications
|
|
61
|
+
</p>
|
|
62
|
+
|
|
63
|
+
<div style={{
|
|
64
|
+
display: 'flex',
|
|
65
|
+
gap: '1rem',
|
|
66
|
+
justifyContent: 'center',
|
|
67
|
+
flexWrap: 'wrap',
|
|
68
|
+
marginBottom: '4rem'
|
|
69
|
+
}}>
|
|
70
|
+
<a href="#" style={{
|
|
71
|
+
padding: '0.875rem 2rem',
|
|
72
|
+
background: '#0070f3',
|
|
73
|
+
color: '#fff',
|
|
74
|
+
borderRadius: '8px',
|
|
75
|
+
textDecoration: 'none',
|
|
76
|
+
fontWeight: '600',
|
|
77
|
+
fontSize: '1rem',
|
|
78
|
+
border: 'none',
|
|
79
|
+
transition: 'all 0.2s ease',
|
|
80
|
+
cursor: 'pointer'
|
|
81
|
+
}}>
|
|
82
|
+
Get Started →
|
|
83
|
+
</a>
|
|
84
|
+
<a href="#" style={{
|
|
85
|
+
padding: '0.875rem 2rem',
|
|
86
|
+
background: 'transparent',
|
|
87
|
+
color: '#fff',
|
|
88
|
+
borderRadius: '8px',
|
|
89
|
+
textDecoration: 'none',
|
|
90
|
+
fontWeight: '600',
|
|
91
|
+
fontSize: '1rem',
|
|
92
|
+
border: '1px solid #333',
|
|
93
|
+
transition: 'all 0.2s ease',
|
|
94
|
+
cursor: 'pointer'
|
|
95
|
+
}}>
|
|
96
|
+
Documentation
|
|
97
|
+
</a>
|
|
98
|
+
</div>
|
|
99
|
+
|
|
100
|
+
<div style={{
|
|
101
|
+
display: 'grid',
|
|
102
|
+
gridTemplateColumns: 'repeat(auto-fit, minmax(280px, 1fr))',
|
|
103
|
+
gap: '1.5rem',
|
|
104
|
+
maxWidth: '1000px',
|
|
105
|
+
margin: '0 auto 3rem'
|
|
106
|
+
}}>
|
|
107
|
+
<div style={{
|
|
108
|
+
padding: '2rem',
|
|
109
|
+
background: 'rgba(255, 255, 255, 0.03)',
|
|
110
|
+
border: '1px solid rgba(255, 255, 255, 0.1)',
|
|
111
|
+
borderRadius: '12px',
|
|
112
|
+
textAlign: 'left',
|
|
113
|
+
transition: 'all 0.3s ease'
|
|
114
|
+
}}>
|
|
115
|
+
<div style={{
|
|
116
|
+
fontSize: '2rem',
|
|
117
|
+
marginBottom: '1rem',
|
|
118
|
+
display: 'inline-block',
|
|
119
|
+
padding: '0.75rem',
|
|
120
|
+
background: 'rgba(0, 112, 243, 0.1)',
|
|
121
|
+
borderRadius: '10px'
|
|
122
|
+
}}>⚡</div>
|
|
123
|
+
<h3 style={{
|
|
124
|
+
fontSize: '1.25rem',
|
|
125
|
+
fontWeight: '600',
|
|
126
|
+
marginBottom: '0.75rem',
|
|
127
|
+
color: '#fff'
|
|
128
|
+
}}>Lightning Fast</h3>
|
|
129
|
+
<p style={{
|
|
130
|
+
fontSize: '0.95rem',
|
|
131
|
+
color: '#888',
|
|
132
|
+
lineHeight: '1.6',
|
|
133
|
+
margin: '0'
|
|
134
|
+
}}>Optimized for performance with modern JavaScript and SSR capabilities</p>
|
|
135
|
+
</div>
|
|
136
|
+
|
|
137
|
+
<div style={{
|
|
138
|
+
padding: '2rem',
|
|
139
|
+
background: 'rgba(255, 255, 255, 0.03)',
|
|
140
|
+
border: '1px solid rgba(255, 255, 255, 0.1)',
|
|
141
|
+
borderRadius: '12px',
|
|
142
|
+
textAlign: 'left',
|
|
143
|
+
transition: 'all 0.3s ease'
|
|
144
|
+
}}>
|
|
145
|
+
<div style={{
|
|
146
|
+
fontSize: '2rem',
|
|
147
|
+
marginBottom: '1rem',
|
|
148
|
+
display: 'inline-block',
|
|
149
|
+
padding: '0.75rem',
|
|
150
|
+
background: 'rgba(0, 212, 255, 0.1)',
|
|
151
|
+
borderRadius: '10px'
|
|
152
|
+
}}>🔧</div>
|
|
153
|
+
<h3 style={{
|
|
154
|
+
fontSize: '1.25rem',
|
|
155
|
+
fontWeight: '600',
|
|
156
|
+
marginBottom: '0.75rem',
|
|
157
|
+
color: '#fff'
|
|
158
|
+
}}>Developer First</h3>
|
|
159
|
+
<p style={{
|
|
160
|
+
fontSize: '0.95rem',
|
|
161
|
+
color: '#888',
|
|
162
|
+
lineHeight: '1.6',
|
|
163
|
+
margin: '0'
|
|
164
|
+
}}>Intuitive API design with TypeScript support for rapid development</p>
|
|
165
|
+
</div>
|
|
166
|
+
|
|
167
|
+
<div style={{
|
|
168
|
+
padding: '2rem',
|
|
169
|
+
background: 'rgba(255, 255, 255, 0.03)',
|
|
170
|
+
border: '1px solid rgba(255, 255, 255, 0.1)',
|
|
171
|
+
borderRadius: '12px',
|
|
172
|
+
textAlign: 'left',
|
|
173
|
+
transition: 'all 0.3s ease'
|
|
174
|
+
}}>
|
|
175
|
+
<div style={{
|
|
176
|
+
fontSize: '2rem',
|
|
177
|
+
marginBottom: '1rem',
|
|
178
|
+
display: 'inline-block',
|
|
179
|
+
padding: '0.75rem',
|
|
180
|
+
background: 'rgba(0, 112, 243, 0.1)',
|
|
181
|
+
borderRadius: '10px'
|
|
182
|
+
}}>🚀</div>
|
|
183
|
+
<h3 style={{
|
|
184
|
+
fontSize: '1.25rem',
|
|
185
|
+
fontWeight: '600',
|
|
186
|
+
marginBottom: '0.75rem',
|
|
187
|
+
color: '#fff'
|
|
188
|
+
}}>Production Ready</h3>
|
|
189
|
+
<p style={{
|
|
190
|
+
fontSize: '0.95rem',
|
|
191
|
+
color: '#888',
|
|
192
|
+
lineHeight: '1.6',
|
|
193
|
+
margin: '0'
|
|
194
|
+
}}>Built-in routing, authentication, and database ORM out of the box</p>
|
|
195
|
+
</div>
|
|
196
|
+
</div>
|
|
197
|
+
|
|
198
|
+
<div style={{
|
|
199
|
+
padding: '2rem',
|
|
200
|
+
background: 'rgba(255, 255, 255, 0.02)',
|
|
201
|
+
border: '1px solid rgba(255, 255, 255, 0.1)',
|
|
202
|
+
borderRadius: '12px',
|
|
203
|
+
maxWidth: '700px',
|
|
204
|
+
margin: '0 auto',
|
|
205
|
+
textAlign: 'left'
|
|
206
|
+
}}>
|
|
207
|
+
<div style={{
|
|
208
|
+
display: 'flex',
|
|
209
|
+
alignItems: 'center',
|
|
210
|
+
justifyContent: 'space-between',
|
|
211
|
+
marginBottom: '1rem'
|
|
212
|
+
}}>
|
|
213
|
+
<span style={{
|
|
214
|
+
fontSize: '0.875rem',
|
|
215
|
+
color: '#666',
|
|
216
|
+
fontFamily: 'Monaco, Courier, monospace'
|
|
217
|
+
}}>terminal</span>
|
|
218
|
+
<div style={{
|
|
219
|
+
display: 'flex',
|
|
220
|
+
gap: '0.5rem'
|
|
221
|
+
}}>
|
|
222
|
+
<div style={{ width: '12px', height: '12px', borderRadius: '50%', background: '#ff5f56' }} />
|
|
223
|
+
<div style={{ width: '12px', height: '12px', borderRadius: '50%', background: '#ffbd2e' }} />
|
|
224
|
+
<div style={{ width: '12px', height: '12px', borderRadius: '50%', background: '#27c93f' }} />
|
|
225
|
+
</div>
|
|
226
|
+
</div>
|
|
227
|
+
<code style={{
|
|
228
|
+
display: 'block',
|
|
229
|
+
background: 'rgba(0, 0, 0, 0.5)',
|
|
230
|
+
color: '#4ade80',
|
|
231
|
+
padding: '1.25rem',
|
|
232
|
+
borderRadius: '8px',
|
|
233
|
+
fontSize: '0.95rem',
|
|
234
|
+
fontFamily: 'Monaco, Courier, monospace',
|
|
235
|
+
border: '1px solid rgba(255, 255, 255, 0.05)'
|
|
236
|
+
}}>
|
|
237
|
+
<span style={{ color: '#666' }}>$</span> npm create nitronjs-app my-app
|
|
238
|
+
</code>
|
|
239
|
+
</div>
|
|
240
|
+
</div>
|
|
241
|
+
</main>
|
|
242
|
+
|
|
243
|
+
<footer style={{
|
|
244
|
+
borderTop: '1px solid #1a1a1a',
|
|
245
|
+
width: '100%',
|
|
246
|
+
display: 'flex',
|
|
247
|
+
justifyContent: 'center',
|
|
248
|
+
alignItems: 'center',
|
|
249
|
+
padding: '2rem 0',
|
|
250
|
+
fontSize: '0.875rem',
|
|
251
|
+
color: '#666'
|
|
252
|
+
}}>
|
|
253
|
+
<span>Powered by{' '}
|
|
254
|
+
<span style={{
|
|
255
|
+
fontWeight: '600',
|
|
256
|
+
color: '#fff'
|
|
257
|
+
}}>NitronJS</span>
|
|
258
|
+
</span>
|
|
259
|
+
</footer>
|
|
260
|
+
</MainLayout>
|
|
261
|
+
);
|
|
262
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
export default function MainLayout({ title, children }: { title: string; children: React.ReactNode }) {
|
|
4
|
+
return (
|
|
5
|
+
<html lang="en">
|
|
6
|
+
<head>
|
|
7
|
+
<meta charSet="utf-8" />
|
|
8
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
9
|
+
<title>{title}</title>
|
|
10
|
+
<style dangerouslySetInnerHTML={{ __html: `
|
|
11
|
+
* {
|
|
12
|
+
margin: 0;
|
|
13
|
+
padding: 0;
|
|
14
|
+
box-sizing: border-box;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
body {
|
|
18
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
|
|
19
|
+
-webkit-font-smoothing: antialiased;
|
|
20
|
+
-moz-osx-font-smoothing: grayscale;
|
|
21
|
+
background: #000;
|
|
22
|
+
min-height: 100vh;
|
|
23
|
+
display: flex;
|
|
24
|
+
flex-direction: column;
|
|
25
|
+
align-items: center;
|
|
26
|
+
justify-content: center;
|
|
27
|
+
color: #fff;
|
|
28
|
+
margin: 0;
|
|
29
|
+
padding: 0;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
#app {
|
|
33
|
+
width: 100%;
|
|
34
|
+
max-width: 1200px;
|
|
35
|
+
padding: 2rem;
|
|
36
|
+
}
|
|
37
|
+
`}}></style>
|
|
38
|
+
</head>
|
|
39
|
+
<body>
|
|
40
|
+
<div id="app">{children}</div>
|
|
41
|
+
</body>
|
|
42
|
+
</html>
|
|
43
|
+
);
|
|
44
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import ErrorLayout from "./ErrorLayout";
|
|
2
|
+
|
|
3
|
+
export default function Error404() {
|
|
4
|
+
return (
|
|
5
|
+
<ErrorLayout title="404 – Not Found">
|
|
6
|
+
<div>
|
|
7
|
+
<h1>404</h1>
|
|
8
|
+
<p>The page you're looking for can't be found.</p>
|
|
9
|
+
<p className="subtitle" style={{ marginTop: 16 }}>Check the URL and try again.</p>
|
|
10
|
+
</div>
|
|
11
|
+
</ErrorLayout>
|
|
12
|
+
);
|
|
13
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import ErrorLayout from "./ErrorLayout";
|
|
2
|
+
|
|
3
|
+
export default function Error500({ message }: { message?: string }) {
|
|
4
|
+
return (
|
|
5
|
+
<ErrorLayout title="500 – Server Error">
|
|
6
|
+
<div>
|
|
7
|
+
<h1>500</h1>
|
|
8
|
+
<p>An unexpected server error occurred.</p>
|
|
9
|
+
<p className="subtitle" style={{ marginTop: 16 }}>Please try again later.</p>
|
|
10
|
+
</div>
|
|
11
|
+
</ErrorLayout>
|
|
12
|
+
);
|
|
13
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
export default function SystemLayout({ title, children }: { title: string; children: React.ReactNode }) {
|
|
2
|
+
return (
|
|
3
|
+
<html lang="en">
|
|
4
|
+
<head>
|
|
5
|
+
<meta charSet="utf-8" />
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
7
|
+
<title>{title}</title>
|
|
8
|
+
<style dangerouslySetInnerHTML={{ __html: `
|
|
9
|
+
* {
|
|
10
|
+
box-sizing: border-box;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
body {
|
|
14
|
+
margin: 0;
|
|
15
|
+
min-height: 100vh;
|
|
16
|
+
display: flex;
|
|
17
|
+
align-items: center;
|
|
18
|
+
justify-content: center;
|
|
19
|
+
background: #000000;
|
|
20
|
+
color: #f5f5f7;
|
|
21
|
+
font-family: -apple-system, BlinkMacSystemFont, "SF Pro Display", "SF Pro Text", "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
22
|
+
-webkit-font-smoothing: antialiased;
|
|
23
|
+
-moz-osx-font-smoothing: grayscale;
|
|
24
|
+
padding: 40px 20px;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.container {
|
|
28
|
+
max-width: 580px;
|
|
29
|
+
width: 100%;
|
|
30
|
+
text-align: center;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
h1 {
|
|
34
|
+
margin: 0 0 20px;
|
|
35
|
+
font-size: 96px;
|
|
36
|
+
font-weight: 600;
|
|
37
|
+
letter-spacing: -0.015em;
|
|
38
|
+
color: #f5f5f7;
|
|
39
|
+
line-height: 1;
|
|
40
|
+
background: linear-gradient(135deg, #f5f5f7 0%, #98989d 100%);
|
|
41
|
+
-webkit-background-clip: text;
|
|
42
|
+
-webkit-text-fill-color: transparent;
|
|
43
|
+
background-clip: text;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
p {
|
|
47
|
+
margin: 0;
|
|
48
|
+
font-size: 21px;
|
|
49
|
+
line-height: 1.381;
|
|
50
|
+
font-weight: 400;
|
|
51
|
+
color: #f5f5f7;
|
|
52
|
+
letter-spacing: 0.011em;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.subtitle {
|
|
56
|
+
margin-top: 8px;
|
|
57
|
+
font-size: 17px;
|
|
58
|
+
line-height: 1.47059;
|
|
59
|
+
color: #98989d;
|
|
60
|
+
font-weight: 400;
|
|
61
|
+
letter-spacing: -0.022em;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.error-message {
|
|
65
|
+
margin-top: 32px;
|
|
66
|
+
padding: 16px 20px;
|
|
67
|
+
background: #1c1c1e;
|
|
68
|
+
border: 1px solid #38383a;
|
|
69
|
+
border-radius: 12px;
|
|
70
|
+
font-size: 15px;
|
|
71
|
+
line-height: 1.4667;
|
|
72
|
+
color: #a1a1a6;
|
|
73
|
+
text-align: left;
|
|
74
|
+
word-break: break-word;
|
|
75
|
+
font-weight: 400;
|
|
76
|
+
letter-spacing: -0.016em;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.divider {
|
|
80
|
+
height: 1px;
|
|
81
|
+
margin: 64px auto;
|
|
82
|
+
max-width: 300px;
|
|
83
|
+
background: linear-gradient(90deg, transparent, #38383a 20%, #38383a 80%, transparent);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.brand {
|
|
87
|
+
font-size: 12px;
|
|
88
|
+
color: #636366;
|
|
89
|
+
font-weight: 400;
|
|
90
|
+
letter-spacing: -0.01em;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
@media (max-width: 734px) {
|
|
94
|
+
h1 {
|
|
95
|
+
font-size: 64px;
|
|
96
|
+
}
|
|
97
|
+
p {
|
|
98
|
+
font-size: 19px;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
`}}></style>
|
|
102
|
+
</head>
|
|
103
|
+
<body>
|
|
104
|
+
<div className="container">
|
|
105
|
+
{children}
|
|
106
|
+
<div className="divider"></div>
|
|
107
|
+
<div className="brand">NitronJS</div>
|
|
108
|
+
</div>
|
|
109
|
+
</body>
|
|
110
|
+
</html>
|
|
111
|
+
);
|
|
112
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import MessageLayout from "./MessageLayout";
|
|
2
|
+
|
|
3
|
+
export default function Maintenance() {
|
|
4
|
+
return (
|
|
5
|
+
<MessageLayout title="Under Maintenance">
|
|
6
|
+
<div className="icon">
|
|
7
|
+
<svg viewBox="0 0 24 24">
|
|
8
|
+
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" />
|
|
9
|
+
</svg>
|
|
10
|
+
</div>
|
|
11
|
+
<h1>Under Maintenance</h1>
|
|
12
|
+
<p>We're making improvements to serve you better.</p>
|
|
13
|
+
<p className="subtitle">We'll be back online shortly. Thank you for your patience.</p>
|
|
14
|
+
<div className="info-box">Our team is working to enhance your experience. Check back soon.</div>
|
|
15
|
+
</MessageLayout>
|
|
16
|
+
);
|
|
17
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
export default function MessageLayout({ title, children }: { title: string; children: React.ReactNode }) {
|
|
2
|
+
return (
|
|
3
|
+
<html lang="en">
|
|
4
|
+
<head>
|
|
5
|
+
<meta charSet="utf-8" />
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
7
|
+
<title>{title}</title>
|
|
8
|
+
<style dangerouslySetInnerHTML={{ __html: `
|
|
9
|
+
* {
|
|
10
|
+
box-sizing: border-box;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
body {
|
|
14
|
+
margin: 0;
|
|
15
|
+
min-height: 100vh;
|
|
16
|
+
display: flex;
|
|
17
|
+
align-items: center;
|
|
18
|
+
justify-content: center;
|
|
19
|
+
background: #fbfbfd;
|
|
20
|
+
color: #1d1d1f;
|
|
21
|
+
font-family: -apple-system, BlinkMacSystemFont, "SF Pro Display", "SF Pro Text", "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
22
|
+
-webkit-font-smoothing: antialiased;
|
|
23
|
+
-moz-osx-font-smoothing: grayscale;
|
|
24
|
+
padding: 40px 20px;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.container {
|
|
28
|
+
max-width: 580px;
|
|
29
|
+
width: 100%;
|
|
30
|
+
text-align: center;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.icon {
|
|
34
|
+
width: 80px;
|
|
35
|
+
height: 80px;
|
|
36
|
+
margin: 0 auto 32px;
|
|
37
|
+
border-radius: 50%;
|
|
38
|
+
background: linear-gradient(135deg, #007aff 0%, #0051d5 100%);
|
|
39
|
+
display: flex;
|
|
40
|
+
align-items: center;
|
|
41
|
+
justify-content: center;
|
|
42
|
+
box-shadow: 0 8px 24px rgba(0, 122, 255, 0.25);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.icon svg {
|
|
46
|
+
width: 40px;
|
|
47
|
+
height: 40px;
|
|
48
|
+
stroke: white;
|
|
49
|
+
fill: none;
|
|
50
|
+
stroke-width: 2;
|
|
51
|
+
stroke-linecap: round;
|
|
52
|
+
stroke-linejoin: round;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
h1 {
|
|
56
|
+
margin: 0 0 16px;
|
|
57
|
+
font-size: 48px;
|
|
58
|
+
font-weight: 600;
|
|
59
|
+
letter-spacing: -0.015em;
|
|
60
|
+
color: #1d1d1f;
|
|
61
|
+
line-height: 1.08;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
p {
|
|
65
|
+
margin: 0;
|
|
66
|
+
font-size: 21px;
|
|
67
|
+
line-height: 1.381;
|
|
68
|
+
font-weight: 400;
|
|
69
|
+
color: #1d1d1f;
|
|
70
|
+
letter-spacing: 0.011em;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.subtitle {
|
|
74
|
+
margin-top: 12px;
|
|
75
|
+
font-size: 17px;
|
|
76
|
+
line-height: 1.47059;
|
|
77
|
+
color: #86868b;
|
|
78
|
+
font-weight: 400;
|
|
79
|
+
letter-spacing: -0.022em;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.info-box {
|
|
83
|
+
margin-top: 40px;
|
|
84
|
+
padding: 20px 24px;
|
|
85
|
+
background: #f5f5f7;
|
|
86
|
+
border-radius: 12px;
|
|
87
|
+
font-size: 15px;
|
|
88
|
+
line-height: 1.4667;
|
|
89
|
+
color: #6e6e73;
|
|
90
|
+
text-align: center;
|
|
91
|
+
font-weight: 400;
|
|
92
|
+
letter-spacing: -0.016em;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.divider {
|
|
96
|
+
height: 1px;
|
|
97
|
+
margin: 64px auto;
|
|
98
|
+
max-width: 300px;
|
|
99
|
+
background: linear-gradient(90deg, transparent, #d2d2d7 20%, #d2d2d7 80%, transparent);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.brand {
|
|
103
|
+
font-size: 12px;
|
|
104
|
+
color: #86868b;
|
|
105
|
+
font-weight: 400;
|
|
106
|
+
letter-spacing: -0.01em;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
@media (max-width: 734px) {
|
|
110
|
+
h1 {
|
|
111
|
+
font-size: 40px;
|
|
112
|
+
}
|
|
113
|
+
p {
|
|
114
|
+
font-size: 19px;
|
|
115
|
+
}
|
|
116
|
+
.icon {
|
|
117
|
+
width: 64px;
|
|
118
|
+
height: 64px;
|
|
119
|
+
}
|
|
120
|
+
.icon svg {
|
|
121
|
+
width: 32px;
|
|
122
|
+
height: 32px;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
`}}></style>
|
|
126
|
+
</head>
|
|
127
|
+
<body>
|
|
128
|
+
<div className="container">
|
|
129
|
+
{children}
|
|
130
|
+
<div className="divider"></div>
|
|
131
|
+
<div className="brand">NitronJS</div>
|
|
132
|
+
</div>
|
|
133
|
+
</body>
|
|
134
|
+
</html>
|
|
135
|
+
);
|
|
136
|
+
}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// Core
|
|
2
|
+
export { default as Config } from "./Core/Config.js";
|
|
3
|
+
export { default as Paths } from "./Core/Paths.js";
|
|
4
|
+
export { default as Environment } from "./Core/Environment.js";
|
|
5
|
+
|
|
6
|
+
// Http
|
|
7
|
+
export { default as Server } from "./Http/Server.js";
|
|
8
|
+
export { start } from "./Runtime/Entry.js";
|
|
9
|
+
|
|
10
|
+
// Routing
|
|
11
|
+
export { default as Route } from "./Route/Manager.js";
|
|
12
|
+
|
|
13
|
+
// Database
|
|
14
|
+
export { default as DB } from "./Database/DB.js";
|
|
15
|
+
export { default as Model } from "./Database/Model.js";
|
|
16
|
+
export { default as Schema } from "./Database/Schema/Manager.js";
|
|
17
|
+
export { default as DatabaseManager } from "./Database/Manager.js";
|
|
18
|
+
|
|
19
|
+
// Authentication
|
|
20
|
+
export { default as Auth } from "./Auth/Manager.js";
|
|
21
|
+
|
|
22
|
+
// Session
|
|
23
|
+
export { default as Session } from "./Session/Session.js";
|
|
24
|
+
export { default as SessionManager } from "./Session/Manager.js";
|
|
25
|
+
|
|
26
|
+
// View
|
|
27
|
+
export { default as View } from "./View/Manager.js";
|
|
28
|
+
|
|
29
|
+
// Hashing
|
|
30
|
+
export { default as Hash } from "./Hashing/Manager.js";
|
|
31
|
+
|
|
32
|
+
// Logging
|
|
33
|
+
export { default as Log } from "./Logging/Manager.js";
|
|
34
|
+
|
|
35
|
+
// Filesystem
|
|
36
|
+
export { default as Storage } from "./Filesystem/Manager.js";
|
|
37
|
+
|
|
38
|
+
// Mail
|
|
39
|
+
export { default as Mail } from "./Mail/Manager.js";
|
|
40
|
+
|
|
41
|
+
// Encryption
|
|
42
|
+
export { default as AES } from "./Encryption/Manager.js";
|
|
43
|
+
|
|
44
|
+
// Validation
|
|
45
|
+
export { default as Validator } from "./Validation/Validator.js";
|
|
46
|
+
|
|
47
|
+
// Translation
|
|
48
|
+
export { default as Lang } from "./Translation/Manager.js";
|
|
49
|
+
|
|
50
|
+
// Date
|
|
51
|
+
export { default as DateTime } from "./Date/DateTime.js";
|
|
52
|
+
|
|
53
|
+
// Support
|
|
54
|
+
export { default as Str } from "./Support/Str.js";
|
|
55
|
+
|
|
56
|
+
// Backward Compatibility Aliases
|
|
57
|
+
export { default as Enviroment } from "./Core/Environment.js";
|