rasengan 1.0.0-beta.13 → 1.0.0-beta.15

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 (38) hide show
  1. package/README.md +1 -1
  2. package/lib/cjs/cli/index.js +20 -1
  3. package/lib/cjs/core/components/index.js +11 -5
  4. package/lib/cjs/index.js +4 -2
  5. package/lib/cjs/routing/components/index.js +12 -7
  6. package/lib/cjs/routing/utils/index.js +32 -12
  7. package/lib/cjs/scripts/copy-extra-files.js +28 -0
  8. package/lib/cjs/server/functions/netlify/functions/api.js +48 -0
  9. package/lib/cjs/server/functions/netlify/netlify.toml +26 -0
  10. package/lib/cjs/server/functions/vercel/api/index.js +4 -111
  11. package/lib/cjs/server/utils/createFetchRequest.js +3 -1
  12. package/lib/cjs/server/utils/handleError.js +0 -4
  13. package/lib/cjs/server/utils/handleRequest.js +168 -0
  14. package/lib/cjs/server/utils/log.js +3 -1
  15. package/lib/esm/cli/index.js +20 -1
  16. package/lib/esm/core/components/index.js +12 -6
  17. package/lib/esm/index.js +3 -2
  18. package/lib/esm/routing/components/index.js +12 -7
  19. package/lib/esm/routing/utils/index.js +33 -13
  20. package/lib/esm/scripts/copy-extra-files.js +23 -0
  21. package/lib/esm/server/functions/netlify/functions/api.js +46 -0
  22. package/lib/esm/server/functions/netlify/netlify.toml +26 -0
  23. package/lib/esm/server/functions/vercel/api/index.js +5 -86
  24. package/lib/esm/server/utils/createFetchRequest.js +3 -1
  25. package/lib/esm/server/utils/handleError.js +0 -4
  26. package/lib/esm/server/utils/handleRequest.js +139 -0
  27. package/lib/esm/server/utils/log.js +3 -1
  28. package/lib/types/core/components/index.d.ts +1 -1
  29. package/lib/types/core/types.d.ts +5 -1
  30. package/lib/types/index.d.ts +2 -1
  31. package/lib/types/routing/components/index.d.ts +5 -3
  32. package/lib/types/scripts/copy-extra-files.d.ts +1 -0
  33. package/lib/types/server/functions/netlify/functions/api.d.ts +2 -0
  34. package/lib/types/server/functions/vercel/api/index.d.ts +1 -1
  35. package/lib/types/server/utils/handleRequest.d.ts +1 -0
  36. package/package.json +20 -7
  37. package/tsconfig.json +1 -0
  38. package/vite.config.ts +9 -1
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- [![Rasengan Logo](/assets/cards/1.png)](https://rasengan.dev)
1
+ [![Rasengan Logo](./assets/cards/1.png)](https://rasengan.dev)
2
2
 
3
3
  [![npm version](https://badge.fury.io/js/rasengan.svg)](https://badge.fury.io/js/rasengan)
4
4
  [![npm downloads](https://img.shields.io/npm/dm/rasengan)](https://www.npmjs.com/package/rasengan)
@@ -123,7 +123,26 @@ program
123
123
  stdio: "inherit",
124
124
  });
125
125
  }
126
- else if (hostingStrategy === "netlify") { }
126
+ else if (hostingStrategy === "netlify") {
127
+ // Displaying the message
128
+ console.log("Your project is configured to be hosted on ".concat(chalk_1.default.bold.blue(hostingStrategy), "\n"));
129
+ // create a netlify folder at the root
130
+ (0, execa_1.execa)("mkdir", ["-p", "netlify"], {
131
+ stdio: "inherit",
132
+ });
133
+ // Copying the netlify folder to the root directory
134
+ (0, execa_1.execa)("cp", [
135
+ "-r",
136
+ "node_modules/rasengan/lib/esm/server/functions/netlify/functions",
137
+ "./netlify",
138
+ ], {
139
+ stdio: "inherit",
140
+ });
141
+ // Copying the netlify.toml file to the root directory
142
+ (0, execa_1.execa)("cp", ["node_modules/rasengan/lib/esm/server/functions/netlify/netlify.toml", "."], {
143
+ stdio: "inherit",
144
+ });
145
+ }
127
146
  });
128
147
  // Handle the start command
129
148
  program
@@ -79,16 +79,22 @@ exports.Component = Component;
79
79
  */
80
80
  var PageToRender = function (_a) {
81
81
  var _b, _c;
82
- var Page = _a.page, data = _a.data;
82
+ var Page = _a.page, data = _a.data, layoutMetadata = _a.layoutMetadata;
83
83
  // Get the page props
84
84
  var props = data.props || {};
85
+ // get params
86
+ var params = (0, react_router_dom_1.useParams)();
87
+ var finalProps = __assign(__assign({}, props), { params: params });
85
88
  // Generate meta tags
86
89
  var metaTags = react_1.default.useMemo(function () {
87
- if (!Page.metadata)
88
- return [];
89
- return (0, index_js_1.generateMetadata)([Page.metadata]);
90
+ var metadatas = [];
91
+ if (Page.metadata)
92
+ metadatas.push(Page.metadata);
93
+ if (layoutMetadata)
94
+ metadatas.push(layoutMetadata);
95
+ return (0, index_js_1.generateMetadata)(metadatas);
90
96
  }, []);
91
- return ((0, jsx_runtime_1.jsxs)(react_1.default.Fragment, { children: [(0, jsx_runtime_1.jsxs)(H.Helmet, { children: [metaTags.map(function (meta) { return meta; }), (0, jsx_runtime_1.jsx)("meta", { name: "description", content: ((_b = Page.metadata) === null || _b === void 0 ? void 0 : _b.description) || "" }), (0, jsx_runtime_1.jsx)("title", { children: ((_c = Page.metadata) === null || _c === void 0 ? void 0 : _c.title) || Page.name })] }), (0, jsx_runtime_1.jsx)(Page, __assign({}, props))] }));
97
+ return ((0, jsx_runtime_1.jsxs)(react_1.default.Fragment, { children: [(0, jsx_runtime_1.jsxs)(H.Helmet, { children: [metaTags.map(function (meta) { return meta; }), (0, jsx_runtime_1.jsx)("meta", { name: "description", content: ((_b = Page.metadata) === null || _b === void 0 ? void 0 : _b.description) || "" }), (0, jsx_runtime_1.jsx)("title", { children: ((_c = Page.metadata) === null || _c === void 0 ? void 0 : _c.title) || Page.name })] }), (0, jsx_runtime_1.jsx)(Page, __assign({}, finalProps))] }));
92
98
  };
93
99
  exports.PageToRender = PageToRender;
94
100
  /**
package/lib/cjs/index.js CHANGED
@@ -17,12 +17,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
17
17
  return (mod && mod.__esModule) ? mod : { "default": mod };
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.createFetchRequest = void 0;
20
+ exports.handleRequest = exports.createFetchRequest = void 0;
21
21
  // Imports
22
22
  var createFetchRequest_js_1 = __importDefault(require("./server/utils/createFetchRequest.js"));
23
23
  exports.createFetchRequest = createFetchRequest_js_1.default;
24
+ var handleRequest_js_1 = __importDefault(require("./server/utils/handleRequest.js"));
25
+ exports.handleRequest = handleRequest_js_1.default;
24
26
  // Exports
27
+ // export * from "./decorators/index.js";
25
28
  __exportStar(require("./core/index.js"), exports);
26
29
  __exportStar(require("./routing/index.js"), exports);
27
- // export * from "./decorators/index.js";
28
30
  __exportStar(require("./config/index.js"), exports);
@@ -41,12 +41,15 @@ exports.ErrorBoundary = ErrorBoundary;
41
41
  * @returns React.ReactNode
42
42
  */
43
43
  var ServerComponent = function (_a) {
44
- var page = _a.page;
44
+ var page = _a.page, layoutMetadata = _a.layoutMetadata;
45
45
  // Default data
46
- var data = {
47
- props: {},
46
+ var defaultData = {
47
+ props: {
48
+ params: {}
49
+ },
48
50
  };
49
- return ((0, jsx_runtime_1.jsx)(index_js_1.PageToRender, { page: page, data: data }));
51
+ var data = (0, react_router_dom_1.useLoaderData)() || defaultData;
52
+ return ((0, jsx_runtime_1.jsx)(index_js_1.PageToRender, { page: page, data: data, layoutMetadata: layoutMetadata }));
50
53
  };
51
54
  exports.ServerComponent = ServerComponent;
52
55
  /**
@@ -54,13 +57,15 @@ exports.ServerComponent = ServerComponent;
54
57
  * @returns React.ReactNode
55
58
  */
56
59
  var ClientComponent = function (_a) {
57
- var page = _a.page;
60
+ var page = _a.page, layoutMetadata = _a.layoutMetadata;
58
61
  // Default data
59
62
  var defaultData = {
60
- props: {},
63
+ props: {
64
+ params: {}
65
+ },
61
66
  };
62
67
  var data = (0, react_router_dom_1.useLoaderData)() || defaultData;
63
- return ((0, jsx_runtime_1.jsx)(index_js_1.PageToRender, { page: page, data: data }));
68
+ return ((0, jsx_runtime_1.jsx)(index_js_1.PageToRender, { page: page, data: data, layoutMetadata: layoutMetadata }));
64
69
  };
65
70
  exports.ClientComponent = ClientComponent;
66
71
  /**
@@ -80,7 +80,10 @@ var generateBrowserRoutes = function (router, isRoot) {
80
80
  props: {},
81
81
  };
82
82
  var props = ((0, react_router_dom_1.useLoaderData)() || defaultData).props;
83
- return (0, jsx_runtime_1.jsx)(Layout, __assign({}, props));
83
+ // get params
84
+ var params = (0, react_router_dom_1.useParams)();
85
+ var finalProps = __assign(__assign({}, props), { params: params });
86
+ return (0, jsx_runtime_1.jsx)(Layout, __assign({}, finalProps));
84
87
  },
85
88
  children: [],
86
89
  };
@@ -93,14 +96,18 @@ var generateBrowserRoutes = function (router, isRoot) {
93
96
  }
94
97
  // Get informations about pages
95
98
  var pages = router.pages.map(function (Page) {
99
+ var pagePathFormated = Page.path[0] === "/" && Page.path !== "/"
100
+ ? Page.path.slice(1)
101
+ : Page.path;
96
102
  // Get the path of the page
97
- var path = Page.path === "/" ? Layout.path : Page.path;
98
- // TODO: Find a good way to use the layout metadata in the page
99
- // Add metadata to the page
100
- // page.addMetadata(layout.metadata);
103
+ var path = Page.path === "/"
104
+ ? Layout.path
105
+ : Layout.path.length > 1
106
+ ? pagePathFormated
107
+ : Page.path;
101
108
  return {
102
109
  path: path,
103
- element: ((0, jsx_runtime_1.jsx)(index_js_1.ClientComponent, { page: Page, loader: router.loaderComponent({}) })),
110
+ element: ((0, jsx_runtime_1.jsx)(index_js_1.ClientComponent, { page: Page, loader: router.loaderComponent({}), layoutMetadata: Layout.metadata })),
104
111
  elementError: (0, jsx_runtime_1.jsx)(index_js_2.ErrorBoundary, {}),
105
112
  };
106
113
  });
@@ -141,7 +148,16 @@ var generateStaticRoutes = function (router, isRoot) {
141
148
  path: Layout.path,
142
149
  elementError: (0, jsx_runtime_1.jsx)(index_js_2.ErrorBoundary, {}),
143
150
  Component: function () {
144
- return (0, jsx_runtime_1.jsx)(Layout, {});
151
+ // Default data
152
+ var defaultData = {
153
+ props: {},
154
+ };
155
+ // Get SSR data
156
+ var props = ((0, react_router_dom_1.useLoaderData)() || defaultData).props;
157
+ // get params
158
+ var params = (0, react_router_dom_1.useParams)();
159
+ var finalProps = __assign(__assign({}, props), { params: params });
160
+ return (0, jsx_runtime_1.jsx)(Layout, __assign({}, finalProps));
145
161
  },
146
162
  loader: function (_a) {
147
163
  var params = _a.params, request = _a.request;
@@ -191,11 +207,15 @@ var generateStaticRoutes = function (router, isRoot) {
191
207
  }
192
208
  // Get informations about pages
193
209
  var pages = router.pages.map(function (Page) {
210
+ var pagePathFormated = Page.path[0] === "/" && Page.path !== "/"
211
+ ? Page.path.slice(1)
212
+ : Page.path;
194
213
  // Get the path of the page
195
- var path = Page.path === "/" ? Layout.path : Page.path;
196
- // TODO: Find a good way to use the layout metadata in the page
197
- // Add metadata to the page
198
- // Page.addMetadata(layout.metadata);
214
+ var path = Page.path === "/"
215
+ ? Layout.path
216
+ : Layout.path.length > 1
217
+ ? pagePathFormated
218
+ : Page.path;
199
219
  return {
200
220
  path: path,
201
221
  loader: function (_a) {
@@ -236,7 +256,7 @@ var generateStaticRoutes = function (router, isRoot) {
236
256
  });
237
257
  },
238
258
  Component: function () {
239
- return ((0, jsx_runtime_1.jsx)(index_js_1.ServerComponent, { page: Page, loader: router.loaderComponent({}) }));
259
+ return ((0, jsx_runtime_1.jsx)(index_js_1.ServerComponent, { page: Page, loader: router.loaderComponent({}), layoutMetadata: Layout.metadata }));
240
260
  },
241
261
  elementError: (0, jsx_runtime_1.jsx)(index_js_2.ErrorBoundary, {}),
242
262
  };
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ var node_fs_1 = __importDefault(require("node:fs"));
7
+ var node_path_1 = __importDefault(require("node:path"));
8
+ var execa_1 = require("execa");
9
+ var buildDir = "./lib";
10
+ function copyExtraFiles() {
11
+ node_fs_1.default.readdir(buildDir, function (err, dirs) {
12
+ if (err) {
13
+ throw err;
14
+ }
15
+ dirs.forEach(function (dir) {
16
+ if (dir === "esm" || dir === "cjs") {
17
+ var targetDir = node_path_1.default.join(buildDir, dir);
18
+ (0, execa_1.execa)("cp", [
19
+ "./src/server/functions/netlify/netlify.toml",
20
+ "".concat(targetDir, "/server/functions/netlify"),
21
+ ], {
22
+ stdio: "inherit",
23
+ });
24
+ }
25
+ });
26
+ });
27
+ }
28
+ copyExtraFiles();
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ // @ts-ignore
40
+ var rasengan_1 = require("rasengan");
41
+ exports.default = (function (req, context) { return __awaiter(void 0, void 0, void 0, function () {
42
+ return __generator(this, function (_a) {
43
+ switch (_a.label) {
44
+ case 0: return [4 /*yield*/, (0, rasengan_1.handleRequest)(req)];
45
+ case 1: return [2 /*return*/, _a.sent()];
46
+ }
47
+ });
48
+ }); });
@@ -0,0 +1,26 @@
1
+ [dev]
2
+ command = "npm run start"
3
+ publish = "dist"
4
+ # We need another port for the application because Vite occupies the 3000.
5
+ port = 5000
6
+
7
+ [build]
8
+ command = "npm run build"
9
+ publish = "dist"
10
+
11
+ [functions]
12
+ # We are goint to use ES modules so we need esbuild to transpile the code.
13
+ node_bundler = "esbuild"
14
+
15
+ [[redirects]]
16
+ from = "/assets/*"
17
+ to = "/assets/:splat"
18
+ status = 200
19
+ conditions = { Path = "/assets/*" }
20
+
21
+ # We have to tell the Netlify that this URL will be served by the books.js function.
22
+ [[redirects]]
23
+ from = "/*"
24
+ to = "/.netlify/functions/api"
25
+ status = 200
26
+ conditions = { not = { Path = "/assets/*" }}
@@ -1,27 +1,4 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
2
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
3
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
4
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -58,100 +35,16 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
58
35
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
59
36
  }
60
37
  };
61
- var __importDefault = (this && this.__importDefault) || function (mod) {
62
- return (mod && mod.__esModule) ? mod : { "default": mod };
63
- };
64
38
  Object.defineProperty(exports, "__esModule", { value: true });
65
- var promises_1 = __importDefault(require("node:fs/promises"));
66
- var node_fs_1 = __importDefault(require("node:fs"));
67
- var node_path_1 = __importStar(require("node:path"));
68
- var node_url_1 = require("node:url");
69
- var server_js_1 = require("react-router-dom/server.js");
70
39
  // @ts-ignore
71
40
  var rasengan_1 = require("rasengan");
72
- // @ts-ignore
73
- var __filename = (0, node_url_1.fileURLToPath)(import.meta.url);
74
- var __dirname = (0, node_path_1.dirname)(__filename);
75
41
  // Create server for production only
76
42
  function handler(req, res) {
77
- var _a;
78
43
  return __awaiter(this, void 0, void 0, function () {
79
- var url, host, appPath, err_1, templateHtml, serverFilePath, bootstrapDirPath, entry, bootstrap, styles, render, staticRoutes, loadTemplateHtml, handler_1, fetchRequest, context, status_1, redirect, helmetContext, router, rendered, html, e_1;
80
- return __generator(this, function (_b) {
81
- switch (_b.label) {
82
- case 0:
83
- _b.trys.push([0, 8, , 9]);
84
- url = req.url;
85
- host = req.headers.host;
86
- appPath = (0, node_path_1.join)(__dirname, "..");
87
- if (!(url === "/robots.txt")) return [3 /*break*/, 4];
88
- _b.label = 1;
89
- case 1:
90
- _b.trys.push([1, 3, , 4]);
91
- return [4 /*yield*/, promises_1.default.access(node_path_1.default.resolve((0, node_path_1.join)(appPath, "dist/client/robots.txt")))];
92
- case 2:
93
- _b.sent();
94
- return [2 /*return*/, res.send(node_path_1.default.resolve((0, node_path_1.join)(appPath, "dist/client/robots.txt")))];
95
- case 3:
96
- err_1 = _b.sent();
97
- return [2 /*return*/, res.send("\n user-agent: *\n disallow: /downloads/\n disallow: /private/\n allow: /\n \n user-agent: magicsearchbot\n disallow: /uploads/\n ")];
98
- case 4:
99
- // ! Sitemap Fix
100
- if (url === "/sitemap.xml") {
101
- return [2 /*return*/, res.send(node_path_1.default.resolve((0, node_path_1.join)(appPath, "dist/client/sitemap.xml")))];
102
- }
103
- // ! Manifest Fix
104
- if (url === "/manifest.json") {
105
- return [2 /*return*/, res.send(node_path_1.default.resolve((0, node_path_1.join)(appPath, "dist/client/manifest.json")))];
106
- }
107
- templateHtml = "";
108
- serverFilePath = (0, node_path_1.join)(appPath, "dist/server/entry-server.js");
109
- bootstrapDirPath = (0, node_path_1.join)(appPath, "dist/client/assets");
110
- return [4 /*yield*/, Promise.resolve("".concat(serverFilePath)).then(function (s) { return __importStar(require(s)); })];
111
- case 5:
112
- entry = _b.sent();
113
- bootstrap = "/assets/" +
114
- node_fs_1.default
115
- .readdirSync(bootstrapDirPath)
116
- .filter(function (fn) { return fn.includes("entry-client") && fn.endsWith(".js"); })[0];
117
- styles = "/assets/" +
118
- node_fs_1.default
119
- .readdirSync((0, node_path_1.join)(appPath, "dist/client/assets"))
120
- .filter(function (fn) { return fn.includes("entry-client") && fn.endsWith(".css"); })[0];
121
- render = entry.render, staticRoutes = entry.staticRoutes, loadTemplateHtml = entry.loadTemplateHtml;
122
- handler_1 = (0, server_js_1.createStaticHandler)(staticRoutes);
123
- fetchRequest = (0, rasengan_1.createFetchRequest)(req, host);
124
- return [4 /*yield*/, handler_1.query(fetchRequest)];
125
- case 6:
126
- context = _b.sent();
127
- status_1 = context.status;
128
- if (status_1 === 302) {
129
- redirect = context.headers.get("Location");
130
- if (redirect)
131
- return [2 /*return*/, res.redirect(redirect)];
132
- }
133
- helmetContext = {};
134
- router = (0, server_js_1.createStaticRouter)(handler_1.dataRoutes, context);
135
- return [4 /*yield*/, render(router, context, helmetContext)];
136
- case 7:
137
- rendered = _b.sent();
138
- // Load template html
139
- if (!templateHtml) {
140
- templateHtml = loadTemplateHtml(helmetContext, bootstrap, styles);
141
- }
142
- html = templateHtml.replace("rasengan-body-app", (_a = rendered.html) !== null && _a !== void 0 ? _a : "");
143
- // Send the rendered html page
144
- return [2 /*return*/, res
145
- .status(200)
146
- .setHeader("Content-Type", "text/html")
147
- .setHeader("Cache-Control", "max-age=31536000")
148
- .end(html)];
149
- case 8:
150
- e_1 = _b.sent();
151
- console.log(e_1.stack);
152
- res.status(500).end(e_1.stack);
153
- return [3 /*break*/, 9];
154
- case 9: return [2 /*return*/];
44
+ return __generator(this, function (_a) {
45
+ switch (_a.label) {
46
+ case 0: return [4 /*yield*/, (0, rasengan_1.handleRequest)(req, res)];
47
+ case 1: return [2 /*return*/, _a.sent()];
155
48
  }
156
49
  });
157
50
  });
@@ -8,7 +8,9 @@ function createFetchRequest(req, host) {
8
8
  // Note: This had to take originalUrl into account for presumably vite's proxying
9
9
  var url = new URL(req.originalUrl || req.url, origin);
10
10
  var controller = new AbortController();
11
- req.on("close", function () { return controller.abort(); });
11
+ if (req.on) {
12
+ req.on("close", function () { return controller.abort(); });
13
+ }
12
14
  var headers = new Headers();
13
15
  for (var _i = 0, _a = Object.entries(req.headers); _i < _a.length; _i++) {
14
16
  var _b = _a[_i], key = _b[0], values = _b[1];
@@ -26,10 +26,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.fix404 = void 0;
27
27
  var node_path_1 = __importStar(require("node:path"));
28
28
  function fix404(url, res, appPath) {
29
- // ! Favicon Fix
30
- if (url === "/favicon.ico") {
31
- return res.sendFile(node_path_1.default.resolve((0, node_path_1.join)(appPath, "dist/client/rasengan.png")));
32
- }
33
29
  // ! Robots Fix
34
30
  if (url === "/robots.txt") {
35
31
  return res.send("\n user-agent: *\n disallow: /downloads/\n disallow: /private/\n allow: /\n \n user-agent: magicsearchbot\n disallow: /uploads/\n ");
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __generator = (this && this.__generator) || function (thisArg, body) {
35
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
36
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
37
+ function verb(n) { return function (v) { return step([n, v]); }; }
38
+ function step(op) {
39
+ if (f) throw new TypeError("Generator is already executing.");
40
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
41
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
42
+ if (y = 0, t) op = [op[0] & 2, t.value];
43
+ switch (op[0]) {
44
+ case 0: case 1: t = op; break;
45
+ case 4: _.label++; return { value: op[1], done: false };
46
+ case 5: _.label++; y = op[1]; op = [0]; continue;
47
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
48
+ default:
49
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
50
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
51
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
52
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
53
+ if (t[2]) _.ops.pop();
54
+ _.trys.pop(); continue;
55
+ }
56
+ op = body.call(thisArg, _);
57
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
58
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
59
+ }
60
+ };
61
+ var __importDefault = (this && this.__importDefault) || function (mod) {
62
+ return (mod && mod.__esModule) ? mod : { "default": mod };
63
+ };
64
+ Object.defineProperty(exports, "__esModule", { value: true });
65
+ var promises_1 = __importDefault(require("node:fs/promises"));
66
+ var node_fs_1 = __importDefault(require("node:fs"));
67
+ var node_path_1 = __importStar(require("node:path"));
68
+ var server_js_1 = require("react-router-dom/server.js");
69
+ // @ts-ignore
70
+ var rasengan_1 = require("rasengan");
71
+ // Create server for production only
72
+ function handleRequest(req, res) {
73
+ var _a;
74
+ return __awaiter(this, void 0, void 0, function () {
75
+ var url, host, appPath, err_1, templateHtml, serverFilePath, bootstrapDirPath, entry, bootstrap, styles, render, staticRoutes, loadTemplateHtml, handler, fetchRequest, context, status_1, redirect, helmetContext, router, rendered, html, e_1;
76
+ return __generator(this, function (_b) {
77
+ switch (_b.label) {
78
+ case 0:
79
+ _b.trys.push([0, 8, , 9]);
80
+ url = req.url;
81
+ host = req.headers.host;
82
+ appPath = process.cwd();
83
+ if (!(url === "/robots.txt")) return [3 /*break*/, 4];
84
+ _b.label = 1;
85
+ case 1:
86
+ _b.trys.push([1, 3, , 4]);
87
+ return [4 /*yield*/, promises_1.default.access(node_path_1.default.resolve((0, node_path_1.join)(appPath, "dist/client/robots.txt")))];
88
+ case 2:
89
+ _b.sent();
90
+ return [2 /*return*/, res.send(node_path_1.default.resolve((0, node_path_1.join)(appPath, "dist/client/robots.txt")))];
91
+ case 3:
92
+ err_1 = _b.sent();
93
+ return [2 /*return*/, res.send("\n user-agent: *\n disallow: /downloads/\n disallow: /private/\n allow: /\n \n user-agent: magicsearchbot\n disallow: /uploads/\n ")];
94
+ case 4:
95
+ // ! Sitemap Fix
96
+ if (url === "/sitemap.xml") {
97
+ return [2 /*return*/, res.send(node_path_1.default.resolve((0, node_path_1.join)(appPath, "dist/client/sitemap.xml")))];
98
+ }
99
+ // ! Manifest Fix
100
+ if (url === "/manifest.json") {
101
+ return [2 /*return*/, res.send(node_path_1.default.resolve((0, node_path_1.join)(appPath, "dist/client/manifest.json")))];
102
+ }
103
+ templateHtml = "";
104
+ serverFilePath = (0, node_path_1.join)(appPath, "dist/server/entry-server.js");
105
+ bootstrapDirPath = (0, node_path_1.join)(appPath, "dist/client/assets");
106
+ return [4 /*yield*/, Promise.resolve("".concat(serverFilePath)).then(function (s) { return __importStar(require(s)); })];
107
+ case 5:
108
+ entry = _b.sent();
109
+ bootstrap = "/assets/" +
110
+ node_fs_1.default
111
+ .readdirSync(bootstrapDirPath)
112
+ .filter(function (fn) { return fn.includes("entry-client") && fn.endsWith(".js"); })[0];
113
+ styles = "/assets/" +
114
+ node_fs_1.default
115
+ .readdirSync((0, node_path_1.join)(appPath, "dist/client/assets"))
116
+ .filter(function (fn) { return fn.includes("entry-client") && fn.endsWith(".css"); })[0];
117
+ render = entry.render, staticRoutes = entry.staticRoutes, loadTemplateHtml = entry.loadTemplateHtml;
118
+ handler = (0, server_js_1.createStaticHandler)(staticRoutes);
119
+ fetchRequest = (0, rasengan_1.createFetchRequest)(req, host);
120
+ return [4 /*yield*/, handler.query(fetchRequest)];
121
+ case 6:
122
+ context = _b.sent();
123
+ status_1 = context.status;
124
+ if (status_1 === 302) {
125
+ redirect = context.headers.get("Location");
126
+ if (redirect)
127
+ return [2 /*return*/, res.redirect(redirect)];
128
+ }
129
+ helmetContext = {};
130
+ router = (0, server_js_1.createStaticRouter)(handler.dataRoutes, context);
131
+ return [4 /*yield*/, render(router, context, helmetContext)];
132
+ case 7:
133
+ rendered = _b.sent();
134
+ // Load template html
135
+ if (!templateHtml) {
136
+ templateHtml = loadTemplateHtml(helmetContext, bootstrap, styles);
137
+ }
138
+ html = templateHtml.replace("rasengan-body-app", (_a = rendered.html) !== null && _a !== void 0 ? _a : "");
139
+ // Send the rendered html page
140
+ if (res) {
141
+ return [2 /*return*/, res
142
+ .status(200)
143
+ .setHeader("Content-Type", "text/html")
144
+ .setHeader("Cache-Control", "max-age=31536000")
145
+ .end(html)];
146
+ }
147
+ return [2 /*return*/, new Response(html, {
148
+ status: 200,
149
+ headers: {
150
+ "Content-Type": "text/html",
151
+ "Cache-Control": "max-age=31536000",
152
+ },
153
+ })];
154
+ case 8:
155
+ e_1 = _b.sent();
156
+ console.log(e_1.stack);
157
+ if (res) {
158
+ return [2 /*return*/, res.status(500).end(e_1.stack)];
159
+ }
160
+ return [2 /*return*/, new Response(e_1.stack, {
161
+ status: 500,
162
+ })];
163
+ case 9: return [2 /*return*/];
164
+ }
165
+ });
166
+ });
167
+ }
168
+ exports.default = handleRequest;
@@ -114,7 +114,9 @@ function logServerInfo(port, isProduction, open) {
114
114
  }
115
115
  });
116
116
  // Allow the process to exit when Ctrl+C is pressed
117
- process.stdin.setRawMode(true);
117
+ if (process.stdin.setRawMode instanceof Function) {
118
+ process.stdin.setRawMode(true);
119
+ }
118
120
  process.stdin.resume();
119
121
  // Set a higher limit for the number of listeners
120
122
  process.stdin.setMaxListeners(100);