@nitronjs/framework 0.2.2 → 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.
Files changed (71) hide show
  1. package/README.md +3 -1
  2. package/cli/create.js +88 -72
  3. package/cli/njs.js +17 -19
  4. package/lib/Auth/Auth.js +167 -0
  5. package/lib/Build/CssBuilder.js +9 -0
  6. package/lib/Build/FileAnalyzer.js +16 -0
  7. package/lib/Build/HydrationBuilder.js +17 -0
  8. package/lib/Build/Manager.js +15 -0
  9. package/lib/Build/colors.js +4 -0
  10. package/lib/Build/plugins.js +84 -20
  11. package/lib/Console/Commands/DevCommand.js +13 -9
  12. package/lib/Console/Commands/MakeCommand.js +24 -10
  13. package/lib/Console/Commands/MigrateCommand.js +4 -3
  14. package/lib/Console/Commands/MigrateFreshCommand.js +22 -27
  15. package/lib/Console/Commands/MigrateRollbackCommand.js +8 -4
  16. package/lib/Console/Commands/MigrateStatusCommand.js +8 -4
  17. package/lib/Console/Commands/SeedCommand.js +8 -28
  18. package/lib/Console/Commands/StorageLinkCommand.js +20 -5
  19. package/lib/Console/Output.js +143 -0
  20. package/lib/Core/Config.js +2 -1
  21. package/lib/Core/Paths.js +8 -8
  22. package/lib/Database/DB.js +141 -51
  23. package/lib/Database/Drivers/MySQLDriver.js +102 -157
  24. package/lib/Database/Migration/Checksum.js +3 -8
  25. package/lib/Database/Migration/MigrationRepository.js +25 -35
  26. package/lib/Database/Migration/MigrationRunner.js +59 -67
  27. package/lib/Database/Model.js +165 -75
  28. package/lib/Database/QueryBuilder.js +43 -0
  29. package/lib/Database/QueryValidation.js +51 -30
  30. package/lib/Database/Schema/Blueprint.js +25 -36
  31. package/lib/Database/Schema/Manager.js +31 -68
  32. package/lib/Database/Seeder/SeederRunner.js +24 -145
  33. package/lib/Date/DateTime.js +9 -0
  34. package/lib/Encryption/Encryption.js +52 -0
  35. package/lib/Faker/Faker.js +11 -0
  36. package/lib/Filesystem/Storage.js +120 -0
  37. package/lib/HMR/Server.js +79 -9
  38. package/lib/Hashing/Hash.js +41 -0
  39. package/lib/Http/Server.js +179 -151
  40. package/lib/Logging/{Manager.js → Log.js} +68 -80
  41. package/lib/Mail/Mail.js +187 -0
  42. package/lib/Route/Router.js +416 -0
  43. package/lib/Session/File.js +135 -233
  44. package/lib/Session/Manager.js +117 -171
  45. package/lib/Session/Memory.js +28 -38
  46. package/lib/Session/Session.js +71 -107
  47. package/lib/Support/Str.js +103 -0
  48. package/lib/Translation/Lang.js +54 -0
  49. package/lib/View/Client/hmr-client.js +87 -51
  50. package/lib/View/Client/nitronjs-icon.png +0 -0
  51. package/lib/View/{Manager.js → View.js} +44 -29
  52. package/lib/index.d.ts +49 -27
  53. package/lib/index.js +19 -13
  54. package/package.json +1 -1
  55. package/skeleton/app/Controllers/HomeController.js +7 -1
  56. package/skeleton/package.json +2 -0
  57. package/skeleton/resources/css/global.css +1 -0
  58. package/skeleton/resources/views/Site/Home.tsx +456 -79
  59. package/skeleton/tsconfig.json +6 -1
  60. package/lib/Auth/Manager.js +0 -111
  61. package/lib/Database/Connection.js +0 -61
  62. package/lib/Database/Manager.js +0 -162
  63. package/lib/Database/Migration/migrations/0000_00_00_00_01_create_seeders_table.js +0 -20
  64. package/lib/Database/Seeder/SeederRepository.js +0 -45
  65. package/lib/Encryption/Manager.js +0 -47
  66. package/lib/Filesystem/Manager.js +0 -74
  67. package/lib/Hashing/Manager.js +0 -25
  68. package/lib/Mail/Manager.js +0 -120
  69. package/lib/Route/Loader.js +0 -80
  70. package/lib/Route/Manager.js +0 -286
  71. package/lib/Translation/Manager.js +0 -49
@@ -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;