@nitronjs/framework 0.2.3 → 0.2.4
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 +3 -1
- package/cli/create.js +88 -72
- package/cli/njs.js +13 -6
- package/lib/Auth/Auth.js +167 -0
- package/lib/Build/CssBuilder.js +9 -0
- package/lib/Build/FileAnalyzer.js +16 -0
- package/lib/Build/HydrationBuilder.js +17 -0
- package/lib/Build/Manager.js +15 -0
- package/lib/Build/colors.js +4 -0
- package/lib/Build/plugins.js +84 -20
- package/lib/Console/Commands/DevCommand.js +13 -9
- package/lib/Console/Commands/MakeCommand.js +24 -10
- package/lib/Console/Commands/MigrateCommand.js +0 -1
- package/lib/Console/Commands/MigrateFreshCommand.js +18 -25
- package/lib/Console/Commands/MigrateRollbackCommand.js +6 -3
- package/lib/Console/Commands/MigrateStatusCommand.js +6 -3
- package/lib/Console/Commands/SeedCommand.js +4 -2
- package/lib/Console/Commands/StorageLinkCommand.js +20 -5
- package/lib/Console/Output.js +143 -0
- package/lib/Core/Config.js +2 -1
- package/lib/Core/Paths.js +8 -0
- package/lib/Database/DB.js +141 -51
- package/lib/Database/Drivers/MySQLDriver.js +102 -157
- package/lib/Database/Migration/Checksum.js +3 -8
- package/lib/Database/Migration/MigrationRepository.js +25 -35
- package/lib/Database/Migration/MigrationRunner.js +56 -61
- package/lib/Database/Model.js +157 -83
- package/lib/Database/QueryBuilder.js +31 -0
- package/lib/Database/QueryValidation.js +36 -44
- package/lib/Database/Schema/Blueprint.js +25 -36
- package/lib/Database/Schema/Manager.js +31 -68
- package/lib/Database/Seeder/SeederRunner.js +12 -31
- package/lib/Date/DateTime.js +9 -0
- package/lib/Encryption/Encryption.js +52 -0
- package/lib/Faker/Faker.js +11 -0
- package/lib/Filesystem/Storage.js +120 -0
- package/lib/HMR/Server.js +79 -9
- package/lib/Hashing/Hash.js +41 -0
- package/lib/Http/Server.js +177 -152
- package/lib/Logging/{Manager.js → Log.js} +68 -80
- package/lib/Mail/Mail.js +187 -0
- package/lib/Route/Router.js +416 -0
- package/lib/Session/File.js +135 -233
- package/lib/Session/Manager.js +117 -171
- package/lib/Session/Memory.js +28 -38
- package/lib/Session/Session.js +71 -107
- package/lib/Support/Str.js +103 -0
- package/lib/Translation/Lang.js +54 -0
- package/lib/View/Client/hmr-client.js +87 -51
- package/lib/View/Client/nitronjs-icon.png +0 -0
- package/lib/View/{Manager.js → View.js} +44 -29
- package/lib/index.d.ts +42 -8
- package/lib/index.js +19 -12
- package/package.json +1 -1
- package/skeleton/app/Controllers/HomeController.js +7 -1
- package/skeleton/resources/css/global.css +1 -0
- package/skeleton/resources/views/Site/Home.tsx +456 -79
- package/skeleton/tsconfig.json +6 -1
- package/lib/Auth/Manager.js +0 -111
- package/lib/Database/Connection.js +0 -61
- package/lib/Database/Manager.js +0 -162
- package/lib/Encryption/Manager.js +0 -47
- package/lib/Filesystem/Manager.js +0 -74
- package/lib/Hashing/Manager.js +0 -25
- package/lib/Mail/Manager.js +0 -120
- package/lib/Route/Loader.js +0 -80
- package/lib/Route/Manager.js +0 -286
- package/lib/Translation/Manager.js +0 -49
package/lib/Route/Manager.js
DELETED
|
@@ -1,286 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import Loader from "./Loader.js";
|
|
3
|
-
import Paths from "../Core/Paths.js";
|
|
4
|
-
import Config from "../Core/Config.js";
|
|
5
|
-
|
|
6
|
-
class Route {
|
|
7
|
-
static #routes = [];
|
|
8
|
-
static #kernel = null;
|
|
9
|
-
|
|
10
|
-
static getSessionConfig() {
|
|
11
|
-
return Config.all("session");
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
static async getKernel() {
|
|
15
|
-
if (!this.#kernel) {
|
|
16
|
-
this.#kernel = (await import(Paths.kernelUrl())).default;
|
|
17
|
-
}
|
|
18
|
-
return this.#kernel;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
static async setup(server) {
|
|
22
|
-
globalThis.route = (name, params, query) => this.route(name, params, query);
|
|
23
|
-
|
|
24
|
-
const Kernel = await this.getKernel();
|
|
25
|
-
|
|
26
|
-
for (const route of this.#routes) {
|
|
27
|
-
if (this.#shouldApplyCsrf(route)) {
|
|
28
|
-
route.middlewares.unshift("verify-csrf");
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
route.middlewares = route.middlewares.map(middleware => {
|
|
32
|
-
const [name, param] = middleware.split(":");
|
|
33
|
-
|
|
34
|
-
if (!Kernel.routeMiddlewares[name]) {
|
|
35
|
-
throw new Error(`Middleware '${name}' is not defined in Kernel.js`);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// Wrap middleware handler for hot reload
|
|
39
|
-
const handler = Loader.wrapHandler(Kernel.routeMiddlewares[name].handler);
|
|
40
|
-
|
|
41
|
-
return (request, response) => {
|
|
42
|
-
return handler(request, response, param);
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
// Wrap controller handler for hot reload
|
|
47
|
-
const handler = Loader.wrapHandler(route.handler);
|
|
48
|
-
|
|
49
|
-
server.route({
|
|
50
|
-
method: route.method,
|
|
51
|
-
url: route.url,
|
|
52
|
-
preHandler: route.middlewares,
|
|
53
|
-
handler
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
static getClientManifest() {
|
|
59
|
-
const manifest = {};
|
|
60
|
-
for (const route of this.#routes) {
|
|
61
|
-
if (route.name) {
|
|
62
|
-
manifest[route.name] = route.url;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
return manifest;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
static match(pathname, method = "GET") {
|
|
69
|
-
for (const route of this.#routes) {
|
|
70
|
-
if (route.method !== method) continue;
|
|
71
|
-
|
|
72
|
-
const pattern = route.url
|
|
73
|
-
.replace(/:[^/]+/g, "([^/]+)")
|
|
74
|
-
.replace(/\//g, "\\/");
|
|
75
|
-
const regex = new RegExp(`^${pattern}$`);
|
|
76
|
-
const match = pathname.match(regex);
|
|
77
|
-
|
|
78
|
-
if (match) {
|
|
79
|
-
const paramNames = (route.url.match(/:[^/]+/g) || [])
|
|
80
|
-
.map(p => p.slice(1));
|
|
81
|
-
const params = {};
|
|
82
|
-
paramNames.forEach((name, i) => {
|
|
83
|
-
params[name] = match[i + 1];
|
|
84
|
-
});
|
|
85
|
-
return { handler: route.handler, params, route };
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
return null;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
static get (url, handler) {
|
|
92
|
-
return this.#add("GET", url, handler);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
static post (url, handler) {
|
|
96
|
-
return this.#add("POST", url, handler);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
static put (url, handler) {
|
|
100
|
-
return this.#add("PUT", url, handler);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
static delete (url, handler) {
|
|
104
|
-
return this.#add("DELETE", url, handler);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
static prefix (url) {
|
|
108
|
-
return this.#addGroup(url, [], [], null);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
static middleware (handlers) {
|
|
112
|
-
if (typeof handlers === 'string') {
|
|
113
|
-
return this.#addGroup("", [handlers], [], null);
|
|
114
|
-
}
|
|
115
|
-
else if (Array.isArray(handlers)) {
|
|
116
|
-
return this.#addGroup("", handlers, [], null);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
static name (name) {
|
|
121
|
-
return this.#addGroup("", [], [], name);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
static #add (method, url, handler) {
|
|
125
|
-
const route = {
|
|
126
|
-
method,
|
|
127
|
-
url,
|
|
128
|
-
handler,
|
|
129
|
-
middlewares: []
|
|
130
|
-
};
|
|
131
|
-
|
|
132
|
-
this.#routes.push(route);
|
|
133
|
-
|
|
134
|
-
return new RouteItem(route);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
static #addGroup (prefix, middlewares, routes, name) {
|
|
138
|
-
const options = {
|
|
139
|
-
prefix,
|
|
140
|
-
middlewares,
|
|
141
|
-
routes,
|
|
142
|
-
name
|
|
143
|
-
};
|
|
144
|
-
|
|
145
|
-
return new RouteGroup(options, this.#routes);
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
static #resolveRouteName (name, params = {}) {
|
|
149
|
-
const route = this.#routes.find(r => r.name === name);
|
|
150
|
-
|
|
151
|
-
if (!route) {
|
|
152
|
-
throw new Error(`Route '${name}' is not defined`);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
let url = route.url;
|
|
156
|
-
|
|
157
|
-
for (const key in params) {
|
|
158
|
-
url = url.replace(`:${key}`, params[key]);
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
return url;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
static #shouldApplyCsrf (route) {
|
|
165
|
-
const sessionConfig = this.getSessionConfig();
|
|
166
|
-
const csrf = sessionConfig.csrf;
|
|
167
|
-
|
|
168
|
-
if (!csrf.enabled) {
|
|
169
|
-
return false;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
if (!csrf.methods.includes(route.method)) {
|
|
173
|
-
return false;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
for (const pattern of csrf.except) {
|
|
177
|
-
if (this.#matchPattern(route.url, pattern)) {
|
|
178
|
-
return false;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
return true;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
static #matchPattern (url, pattern) {
|
|
186
|
-
if (url === pattern) {
|
|
187
|
-
return true;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
if (pattern.includes('*')) {
|
|
191
|
-
const regex = new RegExp('^' + pattern.replace(/\*/g, '.*') + '$');
|
|
192
|
-
|
|
193
|
-
return regex.test(url);
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
return false;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
static route (name, params = {}, query = {}) {
|
|
200
|
-
let url = this.#resolveRouteName(name, params);
|
|
201
|
-
|
|
202
|
-
if (query && Object.keys(query).length > 0) {
|
|
203
|
-
url += '?' + new URLSearchParams(query).toString();
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
return url;
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
class RouteItem {
|
|
211
|
-
constructor (route) {
|
|
212
|
-
this.route = route;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
middleware (handlers) {
|
|
216
|
-
if (typeof handlers === 'string') {
|
|
217
|
-
this.route.middlewares.push(handlers);
|
|
218
|
-
}
|
|
219
|
-
else if (Array.isArray(handlers)) {
|
|
220
|
-
this.route.middlewares.push(...handlers);
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
return this;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
name (name) {
|
|
227
|
-
this.route.name = name;
|
|
228
|
-
|
|
229
|
-
return this;
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
class RouteGroup {
|
|
234
|
-
constructor (options, routes) {
|
|
235
|
-
this.groupOptions = options;
|
|
236
|
-
this.routes = routes;
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
prefix (url) {
|
|
240
|
-
this.groupOptions.prefix = url;
|
|
241
|
-
|
|
242
|
-
return this;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
middleware (handlers) {
|
|
246
|
-
if (typeof handlers === 'string') {
|
|
247
|
-
this.groupOptions.middlewares.push(handlers);
|
|
248
|
-
}
|
|
249
|
-
else if (Array.isArray(handlers)) {
|
|
250
|
-
this.groupOptions.middlewares.push(...handlers);
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
return this;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
name (name) {
|
|
257
|
-
this.groupOptions.name = name;
|
|
258
|
-
|
|
259
|
-
return this;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
group (callback) {
|
|
263
|
-
const beforeRoutes = this.routes.length;
|
|
264
|
-
callback();
|
|
265
|
-
const newRoutes = this.routes.slice(beforeRoutes);
|
|
266
|
-
|
|
267
|
-
for (const route of newRoutes) {
|
|
268
|
-
if (this.groupOptions.prefix) {
|
|
269
|
-
if (route.url === "/") {
|
|
270
|
-
route.url = this.groupOptions.prefix;
|
|
271
|
-
}
|
|
272
|
-
else {
|
|
273
|
-
route.url = this.groupOptions.prefix + route.url;
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
if (route.name && this.groupOptions.name) {
|
|
278
|
-
route.name = this.groupOptions.name + route.name;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
route.middlewares.unshift(...this.groupOptions.middlewares);
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
export default Route;
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import fs from "fs";
|
|
2
|
-
import path from "path";
|
|
3
|
-
import Paths from "../Core/Paths.js";
|
|
4
|
-
|
|
5
|
-
class TranslationManager {
|
|
6
|
-
static #cache = new Map();
|
|
7
|
-
|
|
8
|
-
static get(req, key, params = null) {
|
|
9
|
-
const currentLang = req.language;
|
|
10
|
-
const translation = this.#getTranslation(currentLang, key);
|
|
11
|
-
|
|
12
|
-
if (params) {
|
|
13
|
-
return this.#replaceParams(translation, params);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
return translation;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
static #getTranslation(lang, key) {
|
|
20
|
-
const langPath = path.join(Paths.langs, lang + ".json");
|
|
21
|
-
|
|
22
|
-
if (!fs.existsSync(langPath)) {
|
|
23
|
-
return key;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
let translations = this.#cache.get(lang);
|
|
27
|
-
|
|
28
|
-
if (!translations) {
|
|
29
|
-
const langFile = fs.readFileSync(langPath, { encoding: "utf-8", flag: "r" });
|
|
30
|
-
translations = JSON.parse(langFile);
|
|
31
|
-
this.#cache.set(lang, translations);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
return translations[key] || key;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
static #replaceParams(text, params) {
|
|
38
|
-
Object.keys(params).forEach((key) => {
|
|
39
|
-
text = text.replaceAll(":" + key, params[key]);
|
|
40
|
-
});
|
|
41
|
-
return text;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
static clearCache() {
|
|
45
|
-
this.#cache.clear();
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export default TranslationManager;
|