rasengan 1.0.0-beta.51 → 1.0.0-beta.55

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/CHANGELOG.md ADDED
@@ -0,0 +1,9 @@
1
+ ## Unreleased
2
+
3
+ ## 1.0.0-beta.55 (2025-02-28)
4
+
5
+ ## 1.0.0-beta.54 (2025-02-28)
6
+
7
+ ## 1.0.0-beta.53 (2025-02-28)
8
+
9
+ ## 1.0.0-beta.53 (2025-02-28)
@@ -96,7 +96,7 @@ export function rasengan({ adapter = { name: Adapters.DEFAULT, prepare: async ()
96
96
  config = resolvedConfig;
97
97
  },
98
98
  async closeBundle() {
99
- // We check here if the environment is client has been built because it's the
99
+ // We check here if the environment is client has been built because it's the
100
100
  // last environment to be built in the Vite build process
101
101
  if (this.environment.name === 'client') {
102
102
  // Preparing app for deployment
@@ -17,6 +17,86 @@ export const getRouter = (routerInstance) => {
17
17
  });
18
18
  return () => _jsx(RouterProvider, { router: router });
19
19
  };
20
+ /**
21
+ * This function merge the metadata, giving priority to the ones comming from loader
22
+ */
23
+ const mergeMetaData = (responseMeta, meta) => {
24
+ let mergedMetaData = {
25
+ metaTags: [],
26
+ links: [],
27
+ };
28
+ // merge title and description
29
+ mergedMetaData['title'] =
30
+ responseMeta.title ?? meta.title;
31
+ mergedMetaData['description'] =
32
+ responseMeta.description ?? meta.description;
33
+ // merge openGraph datas
34
+ mergedMetaData['openGraph'] = {
35
+ ...meta.openGraph,
36
+ ...responseMeta.openGraph,
37
+ };
38
+ // merge twitter data
39
+ mergedMetaData['twitter'] = {
40
+ ...meta.twitter,
41
+ ...responseMeta.twitter,
42
+ };
43
+ // merge elements of type <array> eg. metaTags and links
44
+ const metaSet = new Set();
45
+ const linkSet = new Set();
46
+ if (meta['metaTags'] && Array.isArray(meta.metaTags)) {
47
+ // Loop through the metaTags and add every key to the set
48
+ for (const element of meta.metaTags) {
49
+ metaSet.add(element.name ?? element.property);
50
+ }
51
+ if (responseMeta['metaTags'] && Array.isArray(responseMeta.metaTags)) {
52
+ // Loop through the responseMeta and check if the key is already in the set
53
+ for (const element of responseMeta.metaTags) {
54
+ if (metaSet.has(element.name ?? element.property)) {
55
+ // remove the element from the set
56
+ metaSet.delete(element.name ?? element.property);
57
+ }
58
+ mergedMetaData.metaTags.push(element);
59
+ }
60
+ }
61
+ // Loop through the remaining elements in the set
62
+ for (const element of metaSet) {
63
+ const metaElement = meta.metaTags.find((el) => el.name === element);
64
+ if (metaElement) {
65
+ mergedMetaData.metaTags.push(metaElement);
66
+ }
67
+ }
68
+ }
69
+ else {
70
+ mergedMetaData.metaTags = responseMeta.metaTags ?? [];
71
+ }
72
+ if (meta['links'] && Array.isArray(meta.links)) {
73
+ // Loop through the links and add every key to the set
74
+ for (const element of meta.links) {
75
+ linkSet.add(element.rel);
76
+ }
77
+ if (responseMeta['links'] && Array.isArray(responseMeta.links)) {
78
+ // Loop through the responseMeta and check if the key is already in the set
79
+ for (const element of responseMeta.links) {
80
+ if (linkSet.has(element.rel)) {
81
+ // remove the element from the set
82
+ linkSet.delete(element.rel);
83
+ }
84
+ mergedMetaData.links.push(element);
85
+ }
86
+ }
87
+ // Loop through the remaining elements in the set
88
+ for (const element of linkSet) {
89
+ const linkElement = meta.links.find((el) => el.rel === element);
90
+ if (linkElement) {
91
+ mergedMetaData.links.push(linkElement);
92
+ }
93
+ }
94
+ }
95
+ else {
96
+ mergedMetaData.links = responseMeta.links ?? [];
97
+ }
98
+ return mergedMetaData;
99
+ };
20
100
  /**
21
101
  * This function create a loader function
22
102
  */
@@ -44,11 +124,12 @@ const createLoaderFunction = ({ loader, metadata, }) => {
44
124
  });
45
125
  }
46
126
  return {
47
- ...response,
48
- meta: metadata,
127
+ props: response.props,
128
+ meta: mergeMetaData(response.meta, metadata),
49
129
  };
50
130
  }
51
131
  catch (error) {
132
+ console.error(error);
52
133
  return {
53
134
  props: {},
54
135
  meta: {},
@@ -3,6 +3,7 @@ import ora from 'ora';
3
3
  import fs from 'fs/promises';
4
4
  import openBrowser from 'open';
5
5
  import os from 'node:os';
6
+ import readline from 'node:readline';
6
7
  // Get local IP
7
8
  export default function getIPAddress() {
8
9
  // Get network interfaces
@@ -69,6 +70,7 @@ export async function logServerInfo(port, mode, open = false) {
69
70
  if (open) {
70
71
  openBrowser(`http://localhost:${port}`);
71
72
  }
73
+ readline.emitKeypressEvents(process.stdin);
72
74
  // Listen on user keyboard input on the terminal
73
75
  process.stdin.on('keypress', (_, key) => {
74
76
  // Check if the key pressed is 'c'
@@ -1 +1 @@
1
- {"root":["../src/client.ts","../src/index.ts","../src/plugin.ts","../src/server.ts","../src/cli/index.ts","../src/core/index.ts","../src/core/types.ts","../src/core/config/index.ts","../src/core/config/type.ts","../src/core/config/utils/define-config.ts","../src/core/config/utils/load-modules.ts","../src/core/config/utils/path.ts","../src/core/config/vite/defaults.ts","../src/core/dynamic/index.tsx","../src/core/middlewares/index.ts","../src/core/middlewares/logger.ts","../src/core/plugins/index.ts","../src/core/utils/log.ts","../src/entries/client/render.tsx","../src/entries/server/entry.server.tsx","../src/entries/server/index.tsx","../src/routing/index.ts","../src/routing/interfaces.tsx","../src/routing/types.ts","../src/routing/components/index.tsx","../src/routing/components/template.tsx","../src/routing/utils/define-router.tsx","../src/routing/utils/define-routes-group.tsx","../src/routing/utils/generate-metadata.tsx","../src/routing/utils/generate-routes.tsx","../src/routing/utils/index.tsx","../src/scripts/build-command.js","../src/scripts/generate-package-json.js","../src/scripts/utils/check-os.js","../src/scripts/utils/copy.js","../src/server/build/index.ts","../src/server/build/manifest.tsx","../src/server/dev/handlers.tsx","../src/server/dev/server.ts","../src/server/dev/utils.ts","../src/server/node/index.tsx","../src/server/node/rendering.ts","../src/server/node/stream.ts","../src/server/node/utils.ts","../src/server/runtime/mode.ts","../src/server/utils/handleerror.ts","../src/server/utils/handlerequest.ts","../src/server/utils/index.ts","../src/server/virtual/index.ts","../types/client.d.ts"],"version":"5.7.2"}
1
+ {"root":["../src/client.ts","../src/index.ts","../src/plugin.ts","../src/server.ts","../src/cli/index.ts","../src/core/index.ts","../src/core/types.ts","../src/core/config/index.ts","../src/core/config/type.ts","../src/core/config/utils/define-config.ts","../src/core/config/utils/load-modules.ts","../src/core/config/utils/path.ts","../src/core/config/vite/defaults.ts","../src/core/dynamic/index.tsx","../src/core/middlewares/index.ts","../src/core/middlewares/logger.ts","../src/core/plugins/index.ts","../src/core/utils/log.ts","../src/entries/client/render.tsx","../src/entries/server/entry.server.tsx","../src/entries/server/index.tsx","../src/routing/index.ts","../src/routing/interfaces.tsx","../src/routing/types.ts","../src/routing/components/index.tsx","../src/routing/components/template.tsx","../src/routing/utils/define-router.tsx","../src/routing/utils/define-routes-group.tsx","../src/routing/utils/generate-metadata.tsx","../src/routing/utils/generate-routes.tsx","../src/routing/utils/index.tsx","../src/scripts/build-command.js","../src/scripts/generate-package-json.js","../src/scripts/utils/check-os.js","../src/scripts/utils/copy.js","../src/server/build/index.ts","../src/server/build/manifest.tsx","../src/server/dev/handlers.tsx","../src/server/dev/server.ts","../src/server/dev/utils.ts","../src/server/node/index.tsx","../src/server/node/rendering.ts","../src/server/node/stream.ts","../src/server/node/utils.ts","../src/server/runtime/mode.ts","../src/server/virtual/index.ts","../types/client.d.ts"],"version":"5.7.2"}
@@ -1 +1 @@
1
- {"root":["../src/client.ts","../src/index.ts","../src/plugin.ts","../src/server.ts","../src/cli/index.ts","../src/core/index.ts","../src/core/types.ts","../src/core/config/index.ts","../src/core/config/type.ts","../src/core/config/utils/define-config.ts","../src/core/config/utils/load-modules.ts","../src/core/config/utils/path.ts","../src/core/config/vite/defaults.ts","../src/core/dynamic/index.tsx","../src/core/middlewares/index.ts","../src/core/middlewares/logger.ts","../src/core/plugins/index.ts","../src/core/utils/log.ts","../src/entries/client/render.tsx","../src/entries/server/entry.server.tsx","../src/entries/server/index.tsx","../src/routing/index.ts","../src/routing/interfaces.tsx","../src/routing/types.ts","../src/routing/components/index.tsx","../src/routing/components/template.tsx","../src/routing/utils/define-router.tsx","../src/routing/utils/define-routes-group.tsx","../src/routing/utils/generate-metadata.tsx","../src/routing/utils/generate-routes.tsx","../src/routing/utils/index.tsx","../src/scripts/build-command.js","../src/scripts/generate-package-json.js","../src/scripts/utils/check-os.js","../src/scripts/utils/copy.js","../src/server/build/index.ts","../src/server/build/manifest.tsx","../src/server/dev/handlers.tsx","../src/server/dev/server.ts","../src/server/dev/utils.ts","../src/server/node/index.tsx","../src/server/node/rendering.ts","../src/server/node/stream.ts","../src/server/node/utils.ts","../src/server/runtime/mode.ts","../src/server/utils/handleerror.ts","../src/server/utils/handlerequest.ts","../src/server/utils/index.ts","../src/server/virtual/index.ts","../types/client.d.ts"],"version":"5.7.2"}
1
+ {"root":["../src/client.ts","../src/index.ts","../src/plugin.ts","../src/server.ts","../src/cli/index.ts","../src/core/index.ts","../src/core/types.ts","../src/core/config/index.ts","../src/core/config/type.ts","../src/core/config/utils/define-config.ts","../src/core/config/utils/load-modules.ts","../src/core/config/utils/path.ts","../src/core/config/vite/defaults.ts","../src/core/dynamic/index.tsx","../src/core/middlewares/index.ts","../src/core/middlewares/logger.ts","../src/core/plugins/index.ts","../src/core/utils/log.ts","../src/entries/client/render.tsx","../src/entries/server/entry.server.tsx","../src/entries/server/index.tsx","../src/routing/index.ts","../src/routing/interfaces.tsx","../src/routing/types.ts","../src/routing/components/index.tsx","../src/routing/components/template.tsx","../src/routing/utils/define-router.tsx","../src/routing/utils/define-routes-group.tsx","../src/routing/utils/generate-metadata.tsx","../src/routing/utils/generate-routes.tsx","../src/routing/utils/index.tsx","../src/scripts/build-command.js","../src/scripts/generate-package-json.js","../src/scripts/utils/check-os.js","../src/scripts/utils/copy.js","../src/server/build/index.ts","../src/server/build/manifest.tsx","../src/server/dev/handlers.tsx","../src/server/dev/server.ts","../src/server/dev/utils.ts","../src/server/node/index.tsx","../src/server/node/rendering.ts","../src/server/node/stream.ts","../src/server/node/utils.ts","../src/server/runtime/mode.ts","../src/server/virtual/index.ts","../types/client.d.ts"],"version":"5.7.2"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "rasengan",
3
3
  "private": false,
4
- "version": "1.0.0-beta.51",
4
+ "version": "1.0.0-beta.55",
5
5
  "description": "The modern React Framework",
6
6
  "type": "module",
7
7
  "main": "lib/esm/index.js",
@@ -79,7 +79,7 @@
79
79
  "sass": "*",
80
80
  "stylus": "*",
81
81
  "vite": "^6.0.0",
82
- "@rasenganjs/mdx": "1.0.5"
82
+ "@rasenganjs/mdx": "^1.0.6"
83
83
  },
84
84
  "peerDependenciesMeta": {
85
85
  "@types/node": {
@@ -1,23 +0,0 @@
1
- import path, { join } from 'node:path';
2
- export function fix404(url, res, appPath) {
3
- // ! Robots Fix
4
- if (url === '/robots.txt') {
5
- return res.send(`
6
- user-agent: *
7
- disallow: /downloads/
8
- disallow: /private/
9
- allow: /
10
-
11
- user-agent: magicsearchbot
12
- disallow: /uploads/
13
- `);
14
- }
15
- // ! Sitemap Fix
16
- if (url === '/sitemap.xml') {
17
- return res.sendFile(path.resolve(join(appPath, 'dist/client/sitemap.xml')));
18
- }
19
- // ! Manifest Fix
20
- if (url === '/manifest.json') {
21
- return res.sendFile(path.resolve(join(appPath, 'dist/client/manifest.json')));
22
- }
23
- }
@@ -1,185 +0,0 @@
1
- import fs from 'node:fs/promises';
2
- import fsSync from 'node:fs';
3
- import path, { join } from 'node:path';
4
- import { createStaticHandler, createStaticRouter, } from 'react-router';
5
- // @ts-ignore
6
- import { createFetchRequest } from 'rasengan';
7
- // Create server for production only
8
- export async function handleRequest(req, res) {
9
- try {
10
- // Get URL
11
- const url = req.url;
12
- const host = req.headers.host
13
- ? req.headers.host
14
- : req.headers.get('host') || '';
15
- // Get app path
16
- const appPath = process.cwd();
17
- // ! Robots Fix
18
- if (url === '/robots.txt') {
19
- // Check if robots.txt exists using fs
20
- // If it does, return it
21
- try {
22
- await fs.access(path.resolve(join(appPath, 'dist/client/robots.txt')));
23
- if (res)
24
- return res.send(path.resolve(join(appPath, 'dist/client/robots.txt')));
25
- return new Response(path.resolve(join(appPath, 'dist/client/robots.txt')), {
26
- status: 200,
27
- });
28
- }
29
- catch (err) {
30
- if (res)
31
- return res.send(`
32
- user-agent: *
33
- disallow: /downloads/
34
- disallow: /private/
35
- allow: /
36
-
37
- user-agent: magicsearchbot
38
- disallow: /uploads/
39
- `);
40
- return new Response(`
41
- user-agent: *
42
- disallow: /downloads/
43
- disallow: /private/
44
- allow: /
45
-
46
- user-agent: magicsearchbot
47
- disallow: /uploads/
48
- `, {
49
- status: 200,
50
- });
51
- }
52
- }
53
- // ! Sitemap Fix
54
- if (url === '/sitemap.xml') {
55
- if (res)
56
- return res.send(path.resolve(join(appPath, 'dist/client/sitemap.xml')));
57
- return new Response(path.resolve(join(appPath, 'dist/client/sitemap.xml')), {
58
- status: 200,
59
- });
60
- }
61
- // ! Manifest Fix
62
- if (url === '/manifest.json') {
63
- if (res)
64
- return res.send(path.resolve(join(appPath, 'dist/client/manifest.json')));
65
- return new Response(path.resolve(join(appPath, 'dist/client/manifest.json')), {
66
- status: 200,
67
- });
68
- }
69
- // ! Handle assets
70
- if (url.includes('/assets')) {
71
- // get segments from /assets to the end
72
- const segments = url.split('/');
73
- const segmentsWithoutOrigin = [...segments];
74
- for (let segment of segments) {
75
- if (segment === 'assets') {
76
- break;
77
- }
78
- segmentsWithoutOrigin.shift();
79
- }
80
- // replace assets by client/assets
81
- const filePath = join(appPath, 'dist/client', segmentsWithoutOrigin.join('/'));
82
- const file = await fs.readFile(filePath, 'utf-8');
83
- if (res) {
84
- return res
85
- .status(200)
86
- .setHeader('Content-Type', url.endsWith('.js') ? 'text/javascript' : 'text/css')
87
- .setHeader('Cache-Control', 'max-age=31536000')
88
- .end(file);
89
- }
90
- return new Response(file, {
91
- headers: {
92
- 'Content-Type': url.endsWith('.js') ? 'text/javascript' : 'text/css',
93
- 'Cache-Control': 'max-age=31536000',
94
- },
95
- });
96
- }
97
- // Handle js and css files
98
- if (url.endsWith('.js') || url.endsWith('.css')) {
99
- const file = await fs.readFile(url, 'utf-8');
100
- if (res) {
101
- return res
102
- .status(200)
103
- .setHeader('Content-Type', url.endsWith('.js') ? 'text/javascript' : 'text/css')
104
- .setHeader('Cache-Control', 'max-age=31536000')
105
- .end(file);
106
- }
107
- return new Response(file, {
108
- headers: {
109
- 'Content-Type': url.endsWith('.js') ? 'text/javascript' : 'text/css',
110
- 'Cache-Control': 'max-age=31536000',
111
- },
112
- });
113
- }
114
- // Template html
115
- let templateHtml = '';
116
- // Always read fresh template in development
117
- const serverFilePath = join(appPath, 'dist/server/entry-server.js');
118
- const bootstrapDirPath = join(appPath, 'dist/client/assets');
119
- // Read the entry sever file
120
- let entry = await import(serverFilePath);
121
- // replace bootstrap script with compiled scripts
122
- let bootstrap = '/assets/' +
123
- fsSync
124
- .readdirSync(bootstrapDirPath)
125
- .filter((fn) => fn.includes('entry-client') && fn.endsWith('.js'))[0];
126
- // replace styles with compiled styles
127
- let styles = '/assets/' +
128
- fsSync
129
- .readdirSync(join(appPath, 'dist/client/assets'))
130
- .filter((fn) => fn.includes('entry-client') && fn.endsWith('.css'))[0];
131
- // Extract render and staticRoutes from entry
132
- const { render, staticRoutes, loadTemplateHtml } = entry;
133
- // Create static handler
134
- let handler = createStaticHandler(staticRoutes);
135
- // Create fetch request for static routing
136
- // @ts-ignore
137
- let fetchRequest = createFetchRequest(req, host);
138
- let context = await handler.query(fetchRequest);
139
- // Handle redirects
140
- const status = context.status;
141
- if (status === 302) {
142
- const redirect = context.headers.get('Location');
143
- if (redirect) {
144
- if (res)
145
- return res.redirect(redirect);
146
- return Response.redirect(redirect);
147
- }
148
- }
149
- // Helmet context
150
- const helmetContext = {};
151
- // Create static router
152
- let router = createStaticRouter(handler.dataRoutes, context);
153
- const rendered = await render(router, context, helmetContext);
154
- // Load template html
155
- if (!templateHtml) {
156
- templateHtml = loadTemplateHtml(helmetContext, bootstrap, styles);
157
- }
158
- // Replacing the app-html placeholder with the rendered html
159
- let html = templateHtml.replace(`rasengan-body-app`, rendered.html ?? '');
160
- // Send the rendered html page
161
- if (res) {
162
- return res
163
- .status(200)
164
- .setHeader('Content-Type', 'text/html')
165
- .setHeader('Cache-Control', 'max-age=31536000')
166
- .end(html);
167
- }
168
- return new Response(html, {
169
- status: 200,
170
- headers: {
171
- 'Content-Type': 'text/html',
172
- 'Cache-Control': 'max-age=31536000',
173
- },
174
- });
175
- }
176
- catch (e) {
177
- console.log(e.stack);
178
- if (res) {
179
- return res.status(500).end(e.stack);
180
- }
181
- return new Response(e.stack, {
182
- status: 500,
183
- });
184
- }
185
- }
@@ -1,4 +0,0 @@
1
- // Import section
2
- import { fix404 } from './handleError.js';
3
- // Export section
4
- export { fix404 };
@@ -1,2 +0,0 @@
1
- import { Response } from 'express';
2
- export declare function fix404(url: string, res: Response, appPath: string): void | Response<any, Record<string, any>>;
@@ -1 +0,0 @@
1
- export declare function handleRequest(req: any, res?: any): Promise<any>;
@@ -1,2 +0,0 @@
1
- import { fix404 } from './handleError.js';
2
- export { fix404 };