arcanajs 2.1.2 → 2.1.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.
|
@@ -9,7 +9,6 @@ const html_webpack_plugin_1 = __importDefault(require("html-webpack-plugin"));
|
|
|
9
9
|
const mini_css_extract_plugin_1 = __importDefault(require("mini-css-extract-plugin"));
|
|
10
10
|
const path_1 = __importDefault(require("path"));
|
|
11
11
|
const webpack_node_externals_1 = __importDefault(require("webpack-node-externals"));
|
|
12
|
-
const isProduction = process.env.NODE_ENV === "production";
|
|
13
12
|
const cwd = process.cwd();
|
|
14
13
|
// Helper to resolve loaders from the framework's node_modules
|
|
15
14
|
const resolveLoader = (loader) => require.resolve(loader);
|
|
@@ -43,6 +42,7 @@ const findEntry = (searchPaths) => {
|
|
|
43
42
|
throw new Error(`Could not find entry point. Searched in: ${searchPaths.join(", ")}`);
|
|
44
43
|
};
|
|
45
44
|
const createClientConfig = () => {
|
|
45
|
+
const isProduction = process.env.NODE_ENV === "production";
|
|
46
46
|
const clientEntry = findEntry([
|
|
47
47
|
"src/client",
|
|
48
48
|
"src/client/index",
|
|
@@ -104,9 +104,7 @@ const createClientConfig = () => {
|
|
|
104
104
|
plugins: [
|
|
105
105
|
new clean_webpack_plugin_1.CleanWebpackPlugin(),
|
|
106
106
|
new html_webpack_plugin_1.default({
|
|
107
|
-
template:
|
|
108
|
-
? path_1.default.resolve(cwd, "public/index.html")
|
|
109
|
-
: path_1.default.resolve(__dirname, "../lib/server/default-index.html"),
|
|
107
|
+
template: path_1.default.resolve(__dirname, "../lib/server/default-index.html"),
|
|
110
108
|
filename: "index.html",
|
|
111
109
|
inject: "body",
|
|
112
110
|
minify: isProduction
|
|
@@ -145,11 +143,26 @@ const createClientConfig = () => {
|
|
|
145
143
|
};
|
|
146
144
|
exports.createClientConfig = createClientConfig;
|
|
147
145
|
const createServerConfig = () => {
|
|
146
|
+
const isProduction = process.env.NODE_ENV === "production";
|
|
148
147
|
const serverEntry = findEntry([
|
|
149
148
|
"src/server",
|
|
150
149
|
"src/server/index",
|
|
151
150
|
"src/server/main",
|
|
152
151
|
]);
|
|
152
|
+
// View Injection Logic
|
|
153
|
+
const viewsDir = path_1.default.resolve(cwd, "src/views");
|
|
154
|
+
const hasViews = fs_1.default.existsSync(viewsDir);
|
|
155
|
+
const viewsLoaderPath = path_1.default.resolve(__dirname, "../../node_modules/.cache/arcanajs/views-loader.js");
|
|
156
|
+
// Ensure cache directory exists
|
|
157
|
+
const cacheDir = path_1.default.dirname(viewsLoaderPath);
|
|
158
|
+
if (!fs_1.default.existsSync(cacheDir)) {
|
|
159
|
+
fs_1.default.mkdirSync(cacheDir, { recursive: true });
|
|
160
|
+
}
|
|
161
|
+
// Generate the loader file
|
|
162
|
+
const loaderContent = hasViews
|
|
163
|
+
? `module.exports = require.context('${viewsDir}', true, /\\.(tsx|jsx)$/);`
|
|
164
|
+
: `module.exports = null;`;
|
|
165
|
+
fs_1.default.writeFileSync(viewsLoaderPath, loaderContent);
|
|
153
166
|
return {
|
|
154
167
|
mode: isProduction ? "production" : "development",
|
|
155
168
|
target: "node",
|
|
@@ -158,9 +171,16 @@ const createServerConfig = () => {
|
|
|
158
171
|
path: path_1.default.resolve(cwd, "dist"),
|
|
159
172
|
filename: "server.js",
|
|
160
173
|
},
|
|
161
|
-
externals: [
|
|
174
|
+
externals: [
|
|
175
|
+
(0, webpack_node_externals_1.default)({
|
|
176
|
+
allowlist: ["arcanajs"],
|
|
177
|
+
}),
|
|
178
|
+
],
|
|
162
179
|
resolve: {
|
|
163
180
|
extensions: [".ts", ".tsx", ".js", ".jsx"],
|
|
181
|
+
alias: {
|
|
182
|
+
"arcana-views": viewsLoaderPath,
|
|
183
|
+
},
|
|
164
184
|
},
|
|
165
185
|
resolveLoader: {
|
|
166
186
|
modules: ["node_modules", path_1.default.resolve(__dirname, "../../node_modules")],
|
|
@@ -194,7 +214,7 @@ const createServerConfig = () => {
|
|
|
194
214
|
},
|
|
195
215
|
],
|
|
196
216
|
},
|
|
197
|
-
devtool: isProduction ? "source-map" : "eval-source-map",
|
|
217
|
+
// devtool: isProduction ? "source-map" : "eval-source-map",
|
|
198
218
|
};
|
|
199
219
|
};
|
|
200
220
|
exports.createServerConfig = createServerConfig;
|
|
@@ -30,8 +30,22 @@ class ArcanaJSServer {
|
|
|
30
30
|
});
|
|
31
31
|
}
|
|
32
32
|
if (!views) {
|
|
33
|
-
//
|
|
34
|
-
|
|
33
|
+
// Try to load from injected alias (Webpack)
|
|
34
|
+
try {
|
|
35
|
+
// @ts-ignore - This alias is injected by Webpack
|
|
36
|
+
const injectedViews = require("arcana-views");
|
|
37
|
+
if (injectedViews) {
|
|
38
|
+
views = {};
|
|
39
|
+
injectedViews.keys().forEach((key) => {
|
|
40
|
+
const viewName = key.replace(/^\.\/(.*)\.tsx$/, "$1");
|
|
41
|
+
views[viewName] = injectedViews(key).default;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
// Fallback to auto-discovery using fs (Server-side only, non-bundled)
|
|
47
|
+
views = this.discoverViews();
|
|
48
|
+
}
|
|
35
49
|
}
|
|
36
50
|
if (!views || Object.keys(views).length === 0) {
|
|
37
51
|
console.warn("No views found. Please check your views directory.");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "arcanajs",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.4",
|
|
4
4
|
"description": "ArcanaJS Framework",
|
|
5
5
|
"main": "framework/lib/index.js",
|
|
6
6
|
"types": "framework/lib/index.d.ts",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"bin"
|
|
17
17
|
],
|
|
18
18
|
"scripts": {
|
|
19
|
-
"build": "tsc -p tsconfig.lib.json && cp src/lib/server/default-index.html framework/lib/server/",
|
|
19
|
+
"build": "tsc -p tsconfig.lib.json && cp src/lib/server/default-index.html framework/lib/server/ && cp src/lib/global.d.ts framework/lib/",
|
|
20
20
|
"build:app": "node bin/arcanajs.js build",
|
|
21
21
|
"dev:app": "node bin/arcanajs.js dev",
|
|
22
22
|
"start:app": "node bin/arcanajs.js start",
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
export interface ArcanaJSAppProps {
|
|
3
|
-
initialPage: string;
|
|
4
|
-
initialData: any;
|
|
5
|
-
initialUrl?: string;
|
|
6
|
-
views: Record<string, React.FC<any>>;
|
|
7
|
-
layout?: React.FC<{
|
|
8
|
-
children: React.ReactNode;
|
|
9
|
-
}>;
|
|
10
|
-
}
|
|
11
|
-
export declare const ArcanaJSApp: React.FC<ArcanaJSAppProps>;
|
|
@@ -1,79 +0,0 @@
|
|
|
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 () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.ArcanaJSApp = void 0;
|
|
37
|
-
const react_1 = __importStar(require("react"));
|
|
38
|
-
const Page_1 = require("./components/Page");
|
|
39
|
-
const RouterContext_1 = require("./context/RouterContext");
|
|
40
|
-
const ArcanaJSApp = ({ initialPage, initialData, initialUrl, views, layout: Layout, }) => {
|
|
41
|
-
const [page, setPage] = (0, react_1.useState)(initialPage);
|
|
42
|
-
const [data, setData] = (0, react_1.useState)(initialData);
|
|
43
|
-
const [url, setUrl] = (0, react_1.useState)(initialUrl ||
|
|
44
|
-
(typeof window !== "undefined" ? window.location.pathname : "/"));
|
|
45
|
-
(0, react_1.useEffect)(() => {
|
|
46
|
-
const handlePopState = (event) => {
|
|
47
|
-
if (event.state) {
|
|
48
|
-
setPage(event.state.page);
|
|
49
|
-
setData(event.state.data);
|
|
50
|
-
setUrl(window.location.pathname);
|
|
51
|
-
}
|
|
52
|
-
};
|
|
53
|
-
window.addEventListener("popstate", handlePopState);
|
|
54
|
-
return () => window.removeEventListener("popstate", handlePopState);
|
|
55
|
-
}, []);
|
|
56
|
-
const navigateTo = async (newUrl) => {
|
|
57
|
-
try {
|
|
58
|
-
const response = await fetch(newUrl, {
|
|
59
|
-
headers: { "x-arcanajs-request": "true" },
|
|
60
|
-
});
|
|
61
|
-
const json = await response.json();
|
|
62
|
-
setPage(json.page);
|
|
63
|
-
setData(json.data);
|
|
64
|
-
setUrl(newUrl);
|
|
65
|
-
window.history.pushState({ page: json.page, data: json.data }, "", newUrl);
|
|
66
|
-
}
|
|
67
|
-
catch (error) {
|
|
68
|
-
console.error("Navigation failed", error);
|
|
69
|
-
}
|
|
70
|
-
};
|
|
71
|
-
const renderPage = () => {
|
|
72
|
-
const Component = views[page] || views["NotFoundPage"] || (() => react_1.default.createElement("div", null, "404 Not Found"));
|
|
73
|
-
return (react_1.default.createElement(Page_1.Page, { data: data },
|
|
74
|
-
react_1.default.createElement(Component, { data: data, navigateTo: navigateTo })));
|
|
75
|
-
};
|
|
76
|
-
const content = renderPage();
|
|
77
|
-
return (react_1.default.createElement(RouterContext_1.RouterProvider, { value: { navigateTo, currentPage: page, currentUrl: url, params: {} } }, Layout ? react_1.default.createElement(Layout, null, content) : react_1.default.createElement(react_1.default.Fragment, null, content)));
|
|
78
|
-
};
|
|
79
|
-
exports.ArcanaJSApp = ArcanaJSApp;
|