qumra-engine 2.0.2 → 2.0.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/dist/addFilter.d.ts +1 -0
- package/dist/extensions/index.d.ts +7 -0
- package/dist/extensions/index.js +20 -0
- package/dist/extensions/logic/content copy.d.ts +7 -0
- package/dist/extensions/logic/content copy.js +32 -0
- package/dist/extensions/logic/content.d.ts +10 -0
- package/dist/extensions/logic/content.js +74 -0
- package/dist/extensions/logic/footer copy.d.ts +10 -0
- package/dist/extensions/logic/footer copy.js +43 -0
- package/dist/extensions/logic/footer.d.ts +10 -0
- package/dist/extensions/logic/footer.js +51 -0
- package/dist/extensions/logic/form.d.ts +8 -0
- package/dist/extensions/logic/form.js +41 -0
- package/dist/extensions/logic/header copy.d.ts +10 -0
- package/dist/extensions/logic/header copy.js +33 -0
- package/dist/extensions/logic/header.d.ts +10 -0
- package/dist/extensions/logic/header.js +51 -0
- package/dist/extensions/logic/qumra-head.d.ts +7 -0
- package/dist/extensions/logic/qumra-head.js +34 -0
- package/dist/extensions/logic/schema.d.ts +6 -0
- package/dist/extensions/logic/schema.js +26 -0
- package/dist/extensions/logic/schemaExtension.d.ts +0 -0
- package/dist/extensions/logic/schemaExtension.js +1 -0
- package/dist/extensions/logic/seo copy.d.ts +7 -0
- package/dist/extensions/logic/seo copy.js +32 -0
- package/dist/extensions/logic/seo.d.ts +7 -0
- package/dist/extensions/logic/seo.js +32 -0
- package/dist/extensions/logic/t.d.ts +1 -0
- package/dist/extensions/logic/t.js +10 -0
- package/dist/extensions/logic/widget copy.d.ts +10 -0
- package/dist/extensions/logic/widget copy.js +33 -0
- package/dist/extensions/logic/widget.d.ts +10 -0
- package/dist/extensions/logic/widget.js +47 -0
- package/dist/extensions/logic/widgets copy.d.ts +10 -0
- package/dist/extensions/logic/widgets copy.js +33 -0
- package/dist/extensions/logic/widgets.d.ts +10 -0
- package/dist/extensions/logic/widgets.js +33 -0
- package/dist/extensions/registerAllExtensions.d.ts +2 -0
- package/dist/extensions/registerAllExtensions.js +50 -0
- package/dist/extensions/registerAllGlobals.d.ts +2 -0
- package/dist/extensions/registerAllGlobals.js +47 -0
- package/dist/filters/addFilter.d.ts +1 -0
- package/dist/filters/capitalize.d.ts +1 -0
- package/dist/filters/discountLabel.d.ts +1 -0
- package/dist/filters/formatDate.d.ts +1 -0
- package/dist/filters/formatMoney.d.ts +1 -0
- package/dist/filters/index.d.ts +22 -0
- package/dist/filters/index.js +43 -9
- package/dist/filters/logic/array/compact.d.ts +1 -0
- package/dist/filters/logic/array/compact.js +6 -0
- package/dist/filters/logic/array/concat.d.ts +1 -0
- package/dist/filters/logic/array/concat.js +6 -0
- package/dist/filters/logic/array/find.d.ts +1 -0
- package/dist/filters/logic/array/find.js +8 -0
- package/dist/filters/logic/array/first.d.ts +1 -0
- package/dist/filters/logic/array/first.js +6 -0
- package/dist/filters/logic/array/join.d.ts +1 -0
- package/dist/filters/logic/array/join.js +8 -0
- package/dist/filters/logic/array/last.d.ts +1 -0
- package/dist/filters/logic/array/last.js +8 -0
- package/dist/filters/logic/array/size.d.ts +1 -0
- package/dist/filters/logic/array/size.js +12 -0
- package/dist/filters/logic/array/split.d.ts +1 -0
- package/dist/filters/logic/array/split.js +6 -0
- package/dist/filters/logic/array/where.d.ts +1 -0
- package/dist/filters/logic/array/where.js +8 -0
- package/dist/filters/logic/capitalize.d.ts +1 -0
- package/dist/filters/logic/color_to_hex.d.ts +1 -0
- package/dist/filters/logic/color_to_hex.js +15 -0
- package/dist/filters/logic/colors/color_to_hex.d.ts +1 -0
- package/dist/filters/logic/colors/color_to_hex.js +15 -0
- package/dist/filters/logic/component.d.ts +2 -0
- package/dist/filters/logic/data/formatDate.d.ts +1 -0
- package/dist/filters/logic/data/formatDate.js +7 -0
- package/dist/filters/logic/discountLabel.d.ts +1 -0
- package/dist/filters/logic/first.d.ts +1 -0
- package/dist/filters/logic/first.js +6 -0
- package/dist/filters/logic/formatDate.d.ts +1 -0
- package/dist/filters/logic/formatDate.js +4 -6
- package/dist/filters/logic/formatMoney.d.ts +1 -0
- package/dist/filters/logic/json/json.d.ts +2 -0
- package/dist/filters/logic/json/json.js +15 -0
- package/dist/filters/logic/json.d.ts +2 -0
- package/dist/filters/logic/json.js +15 -0
- package/dist/filters/logic/money/discountLabel.d.ts +1 -0
- package/dist/filters/logic/money/discountLabel.js +8 -0
- package/dist/filters/logic/money/money_with_currency.d.ts +1 -0
- package/dist/filters/logic/money/money_with_currency.js +8 -0
- package/dist/filters/logic/money/money_without_trailing_zeros.d.ts +1 -0
- package/dist/filters/logic/money/money_without_trailing_zeros.js +8 -0
- package/dist/filters/logic/money_with_currency.d.ts +1 -0
- package/dist/filters/logic/money_with_currency.js +8 -0
- package/dist/filters/logic/money_without_trailing_zeros.d.ts +1 -0
- package/dist/filters/logic/money_without_trailing_zeros.js +8 -0
- package/dist/filters/logic/split.d.ts +1 -0
- package/dist/filters/logic/split.js +6 -0
- package/dist/filters/logic/strings/capitalize.d.ts +1 -0
- package/dist/filters/logic/strings/capitalize.js +8 -0
- package/dist/filters/logic/strings/downcase.d.ts +1 -0
- package/dist/filters/logic/strings/downcase.js +6 -0
- package/dist/filters/logic/strings/remove.d.ts +1 -0
- package/dist/filters/logic/strings/remove.js +8 -0
- package/dist/filters/logic/strings/split.d.ts +1 -0
- package/dist/filters/logic/strings/split.js +6 -0
- package/dist/filters/logic/strings/strip.d.ts +1 -0
- package/dist/filters/logic/strings/strip.js +6 -0
- package/dist/filters/logic/strings/truncate.d.ts +1 -0
- package/dist/filters/logic/strings/truncate.js +10 -0
- package/dist/filters/logic/strings/upcase.d.ts +1 -0
- package/dist/filters/logic/strings/upcase.js +8 -0
- package/dist/filters/logic/urls/assets.d.ts +1 -0
- package/dist/filters/logic/urls/assets.js +6 -0
- package/dist/filters/logic/urls/capitalize.d.ts +1 -0
- package/dist/filters/logic/urls/capitalize.js +8 -0
- package/dist/filters/registerAllFilters.d.ts +2 -0
- package/dist/globals/index.d.ts +1 -0
- package/dist/globals/index.js +8 -0
- package/dist/globals/logic/capitalize.d.ts +1 -0
- package/dist/globals/logic/capitalize.js +8 -0
- package/dist/globals/logic/component.d.ts +2 -0
- package/dist/globals/logic/component.js +6 -0
- package/dist/globals/logic/discountLabel.d.ts +1 -0
- package/dist/globals/logic/discountLabel.js +8 -0
- package/dist/globals/logic/formatDate.d.ts +1 -0
- package/dist/globals/logic/formatDate.js +9 -0
- package/dist/globals/logic/formatMoney.d.ts +1 -0
- package/dist/globals/logic/formatMoney.js +8 -0
- package/dist/globals/logic/t.d.ts +1 -0
- package/dist/globals/logic/t.js +10 -0
- package/dist/globals/registerAllFilters.d.ts +2 -0
- package/dist/globals/registerAllFilters.js +47 -0
- package/dist/globals/registerAllGlobals.d.ts +2 -0
- package/dist/globals/registerAllGlobals.js +47 -0
- package/dist/globals copy/index.d.ts +1 -0
- package/dist/globals copy/index.js +8 -0
- package/dist/globals copy/logic/t.d.ts +1 -0
- package/dist/globals copy/logic/t.js +10 -0
- package/dist/globals copy/registerAllGlobals.d.ts +2 -0
- package/dist/globals copy/registerAllGlobals.js +47 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -1
- package/dist/middleware/extension.middleware.d.ts +2 -0
- package/dist/middleware/extension.middleware.js +12 -0
- package/dist/middleware/extensions.middleware.d.ts +2 -0
- package/dist/middleware/extensions.middleware.js +12 -0
- package/dist/middleware/filters.middleware copy.d.ts +2 -0
- package/dist/middleware/filters.middleware copy.js +12 -0
- package/dist/middleware/filters.middleware.d.ts +2 -0
- package/dist/middleware/filters.middleware.js +12 -0
- package/dist/middleware/globals.middleware copy.d.ts +2 -0
- package/dist/middleware/globals.middleware copy.js +12 -0
- package/dist/middleware/globals.middleware.d.ts +2 -0
- package/dist/middleware/globals.middleware.js +12 -0
- package/dist/middleware/init.middleware.d.ts +9 -0
- package/dist/middleware/init.middleware.js +23 -0
- package/dist/middleware/initPaths.middleware.d.ts +2 -0
- package/dist/middleware/initPaths.middleware.js +28 -0
- package/dist/middleware/locals.middleware.d.ts +2 -0
- package/dist/middleware/locals.middleware.js +29 -0
- package/dist/middleware/mergeData.middleware.d.ts +2 -0
- package/dist/middleware/mergeData.middleware.js +55 -0
- package/dist/middleware/nunjucks.d.ts +2 -0
- package/dist/middleware/nunjucks.js +22 -0
- package/dist/middleware/nunjucks.middleware copy.d.ts +2 -0
- package/dist/middleware/nunjucks.middleware copy.js +26 -0
- package/dist/middleware/nunjucks.middleware.d.ts +2 -0
- package/dist/middleware/nunjucks.middleware.js +36 -0
- package/dist/middleware/nunjucksFilters.middleware.d.ts +2 -0
- package/dist/middleware/nunjucksFilters.middleware.js +12 -0
- package/dist/middleware/prepareData.d.ts +2 -0
- package/dist/middleware/prepareData.js +46 -0
- package/dist/middleware/prepareData.middleware copy.d.ts +2 -0
- package/dist/middleware/prepareData.middleware copy.js +49 -0
- package/dist/middleware/prepareData.middleware.d.ts +2 -0
- package/dist/middleware/prepareData.middleware.js +49 -0
- package/dist/middleware/prepareDataMiddleware.d.ts +2 -0
- package/dist/middleware/prepareDataMiddleware.js +46 -0
- package/dist/middleware/render.d.ts +2 -0
- package/dist/middleware/render.js +24 -0
- package/dist/middleware/render.middleware copy.d.ts +2 -0
- package/dist/middleware/render.middleware copy.js +39 -0
- package/dist/middleware/render.middleware.d.ts +2 -0
- package/dist/middleware/render.middleware.js +24 -0
- package/dist/middleware/serve-assets.middleware.d.ts +2 -0
- package/dist/middleware/serve-assets.middleware.js +6 -0
- package/dist/middleware.d.ts +8 -0
- package/dist/middleware.js +53 -8
- package/dist/middlewares/errorHandler.d.ts +8 -0
- package/dist/middlewares/pathMiddleware.d.ts +2 -0
- package/dist/middlewares/prepareDataMiddleware.d.ts +2 -0
- package/dist/middlewares/themeMiddleware.d.ts +2 -0
- package/dist/nunjucksEnv.d.ts +6 -0
- package/dist/nunjucksEnv.js +0 -2
- package/dist/registerAllFilters.d.ts +2 -0
- package/dist/render.d.ts +1 -0
- package/dist/services/getRenderData.d.ts +3 -0
- package/dist/services/prepareData.d.ts +2 -0
- package/dist/services/prepareData.js +34 -20
- package/dist/services/prepareDataMiddleware.d.ts +2 -0
- package/dist/services/renderHandler.d.ts +2 -0
- package/dist/services/renderHandler.js +27 -25
- package/dist/store/globals.d.ts +2 -0
- package/dist/store/globals.js +12 -0
- package/dist/store/locals.d.ts +2 -0
- package/dist/store/locals.js +12 -0
- package/dist/types/sharedTypes.d.ts +26 -0
- package/dist/utils/asyncHandler.d.ts +0 -0
- package/dist/utils/asyncHandler.js +1 -0
- package/dist/utils/findAvailablePort.d.ts +1 -0
- package/dist/utils/findAvailablePort.js +28 -0
- package/dist/utils/getLocalData.d.ts +4 -0
- package/dist/utils/getLocalData.js +21 -0
- package/dist/utils/getLocalFooterData copy.d.ts +4 -0
- package/dist/utils/getLocalFooterData copy.js +22 -0
- package/dist/utils/getLocalFooterData.d.ts +4 -0
- package/dist/utils/getLocalFooterData.js +22 -0
- package/dist/utils/getLocalHeaderData.d.ts +4 -0
- package/dist/utils/getLocalHeaderData.js +22 -0
- package/dist/utils/getLocalWidgetData copy.d.ts +4 -0
- package/dist/utils/getLocalWidgetData copy.js +22 -0
- package/dist/utils/getLocalWidgetData.d.ts +4 -0
- package/dist/utils/getLocalWidgetData.js +22 -0
- package/dist/utils/getNestedValue.d.ts +1 -0
- package/dist/utils/getNestedValue.js +7 -0
- package/dist/utils/isPathAllowedToRender.d.ts +1 -0
- package/dist/utils/isPathAllowedToRender.js +8 -0
- package/dist/utils/logger.d.ts +5 -0
- package/dist/utils/mergeNestedSchemaWithData.d.ts +16 -0
- package/dist/utils/mergeNestedSchemaWithData.js +34 -0
- package/dist/utils/mergeObjects.d.ts +1 -0
- package/dist/utils/mergeObjects.js +28 -0
- package/dist/utils/mergeSchemaWithData.d.ts +14 -0
- package/dist/utils/mergeSchemaWithData.js +11 -0
- package/dist/utils/mergeWidgetSources.d.ts +1 -0
- package/dist/utils/mergeWidgetSources.js +21 -0
- package/dist/utils/normalizeWidgetPath.d.ts +1 -0
- package/dist/utils/normalizeWidgetPath.js +19 -0
- package/dist/utils/parseUrl.d.ts +2 -0
- package/dist/utils/parseUrl.js +46 -0
- package/dist/utils/render.d.ts +2 -0
- package/dist/utils/render.js +21 -20
- package/dist/utils/resolveTranslations.d.ts +1 -0
- package/dist/utils/resolveTranslations.js +21 -0
- package/package.json +5 -3
- package/todo.txt +1 -0
- package/views/home.njk +0 -15
package/dist/middleware.js
CHANGED
|
@@ -1,10 +1,55 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
const express_1 = __importDefault(require("express"));
|
|
7
|
+
const render_middleware_1 = require("./middleware/render.middleware");
|
|
8
|
+
const prepareData_middleware_1 = require("./middleware/prepareData.middleware");
|
|
9
|
+
const morgan_1 = __importDefault(require("morgan"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const findAvailablePort_1 = require("./utils/findAvailablePort");
|
|
12
|
+
const init_middleware_1 = require("./middleware/init.middleware");
|
|
13
|
+
const nunjucks_middleware_1 = require("./middleware/nunjucks.middleware");
|
|
14
|
+
const filters_middleware_1 = require("./middleware/filters.middleware");
|
|
15
|
+
const locals_middleware_1 = require("./middleware/locals.middleware");
|
|
16
|
+
const globals_middleware_1 = require("./middleware/globals.middleware");
|
|
17
|
+
const extensions_middleware_1 = require("./middleware/extensions.middleware");
|
|
18
|
+
const isPathAllowedToRender_1 = require("./utils/isPathAllowedToRender");
|
|
19
|
+
const mergeData_middleware_1 = require("./middleware/mergeData.middleware");
|
|
20
|
+
const startEngine = async ({ mode, getRender, setRender }) => {
|
|
21
|
+
try {
|
|
22
|
+
const app = (0, express_1.default)();
|
|
23
|
+
app.set("view engine", "nunjucks");
|
|
24
|
+
app.use((0, morgan_1.default)("dev"));
|
|
25
|
+
app.use((0, init_middleware_1.initMiddleware)({ mode, getRender, setRender }));
|
|
26
|
+
const port = await (0, findAvailablePort_1.findAvailablePort)(3000);
|
|
27
|
+
if (mode === "devlopment") {
|
|
28
|
+
const staticPath = path_1.default.join(process.cwd(), 'assets');
|
|
29
|
+
app.use('/assets', express_1.default.static(staticPath));
|
|
30
|
+
}
|
|
31
|
+
app.use((req, res, next) => {
|
|
32
|
+
if (!(0, isPathAllowedToRender_1.isPathAllowedToRender)(res.locals.parsedUrl.pathname)) {
|
|
33
|
+
return res.status(404).end();
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
next();
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
app.use(prepareData_middleware_1.prepareDataMiddleware);
|
|
40
|
+
app.use(nunjucks_middleware_1.nunjucksMiddleWare);
|
|
41
|
+
app.use(mergeData_middleware_1.mergeDataMiddleware);
|
|
42
|
+
app.use(locals_middleware_1.localesMiddleware);
|
|
43
|
+
app.use(filters_middleware_1.nunjucksFiltersMiddleWare);
|
|
44
|
+
app.use(globals_middleware_1.nunjucksGlobalsMiddleWare);
|
|
45
|
+
app.use(extensions_middleware_1.nunjucksExtensionsMiddleWare);
|
|
46
|
+
app.use(render_middleware_1.renderMiddleware);
|
|
47
|
+
app.listen(port, () => {
|
|
48
|
+
console.log(`Theme dev server started at http://localhost:${port}`);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
console.error("Server failed to start", err);
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
exports.default = startEngine;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Request, Response, NextFunction } from 'express';
|
|
2
|
+
export declare class AppError extends Error {
|
|
3
|
+
statusCode: number;
|
|
4
|
+
status: string;
|
|
5
|
+
isOperational: boolean;
|
|
6
|
+
constructor(message: string, statusCode: number);
|
|
7
|
+
}
|
|
8
|
+
export declare const errorHandler: (err: Error | AppError, req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>>;
|
package/dist/nunjucksEnv.js
CHANGED
|
@@ -5,7 +5,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.configureNunjucks = configureNunjucks;
|
|
7
7
|
const nunjucks_1 = __importDefault(require("nunjucks"));
|
|
8
|
-
const registerAllFilters_1 = __importDefault(require("./filters/registerAllFilters"));
|
|
9
8
|
/**
|
|
10
9
|
* إعداد Nunjucks مع مسار مخصص للقوالب
|
|
11
10
|
* @param viewsPath المسار الكامل لملفات القوالب
|
|
@@ -16,6 +15,5 @@ function configureNunjucks(viewsPath) {
|
|
|
16
15
|
noCache: true,
|
|
17
16
|
watch: false,
|
|
18
17
|
});
|
|
19
|
-
(0, registerAllFilters_1.default)(env);
|
|
20
18
|
return env;
|
|
21
19
|
}
|
package/dist/render.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function render(view: string, context?: object): Promise<string>;
|
|
@@ -1,32 +1,46 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
const
|
|
3
|
+
exports.prepareDataMiddleware = void 0;
|
|
4
|
+
const prepareDataMiddleware = async (req, res, next) => {
|
|
5
|
+
const parsedUrl = res.locals.parsedUrl;
|
|
5
6
|
try {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
const { getRender, setRender } = res.locals.cache;
|
|
8
|
+
// حاول تجيب البيانات من الكاش الأول
|
|
9
|
+
if (typeof getRender === "function") {
|
|
10
|
+
const dataFromCache = await getRender(res.locals.mode, parsedUrl.fullUrl);
|
|
9
11
|
if (dataFromCache) {
|
|
10
12
|
res.locals.render = dataFromCache;
|
|
11
|
-
return; //
|
|
13
|
+
return next(); // البيانات موجودة، نكمل
|
|
12
14
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
15
|
+
}
|
|
16
|
+
const api = false
|
|
17
|
+
? "https://store-gate.qumra-dev.site/render"
|
|
18
|
+
: "http://192.168.1.5:4019/v1/render";
|
|
19
|
+
console.log("🚀 ~ prepareDataMiddleware ~ api:", api);
|
|
20
|
+
// لو مش موجودة في الكاش، أجيبها من السيرفر
|
|
21
|
+
const engineResponse = await fetch(api, {
|
|
22
|
+
method: "POST",
|
|
23
|
+
headers: { "Content-Type": "application/json" },
|
|
24
|
+
body: JSON.stringify({
|
|
25
|
+
url: parsedUrl.fullUrl,
|
|
26
|
+
}),
|
|
27
|
+
});
|
|
28
|
+
if (engineResponse.ok) {
|
|
29
|
+
const data = await engineResponse.json();
|
|
30
|
+
// خزّن البيانات في الكاش لو دالة setRender موجودة
|
|
31
|
+
if (typeof setRender === "function") {
|
|
32
|
+
await setRender(res.locals.mode, parsedUrl.fullUrl, data);
|
|
25
33
|
}
|
|
34
|
+
res.locals.render = data;
|
|
35
|
+
return next();
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
throw new Error("Engine response not OK");
|
|
26
39
|
}
|
|
27
40
|
}
|
|
28
41
|
catch (err) {
|
|
29
|
-
console.error("
|
|
42
|
+
console.error("❌ prepareDataMiddleware error:", err);
|
|
43
|
+
return next(err);
|
|
30
44
|
}
|
|
31
45
|
};
|
|
32
|
-
exports.
|
|
46
|
+
exports.prepareDataMiddleware = prepareDataMiddleware;
|
|
@@ -1,31 +1,33 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.renderHandler = void 0;
|
|
4
|
-
|
|
4
|
+
// import { render } from "../middleware/render";
|
|
5
5
|
const renderHandler = async (res) => {
|
|
6
|
-
try {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
6
|
+
// try {
|
|
7
|
+
// const page = res.locals.render.context?.page;
|
|
8
|
+
// if (page) {
|
|
9
|
+
// await render(page.fileName, {}, res);
|
|
10
|
+
// } else {
|
|
11
|
+
// await safeRender("404.njk", res, 404, "Page not found");
|
|
12
|
+
// }
|
|
13
|
+
// } catch (error) {
|
|
14
|
+
// // console.error("🚀 ~ renderHandler ~ error:", error);
|
|
15
|
+
// await safeRender("404.njk", res, 404, "Page not found");
|
|
16
|
+
// }
|
|
17
|
+
// };
|
|
18
|
+
// const safeRender = async (
|
|
19
|
+
// fileName: string,
|
|
20
|
+
// res: Response,
|
|
21
|
+
// statusCode: number,
|
|
22
|
+
// fallbackMessage: string
|
|
23
|
+
// ) => {
|
|
24
|
+
// try {
|
|
25
|
+
// await render(fileName, {}, res);
|
|
26
|
+
// } catch (error) {
|
|
27
|
+
// // console.error(`🚀 ~ safeRender ~ error rendering ${fileName}:`, error);
|
|
28
|
+
// if (!res.headersSent) {
|
|
29
|
+
// res.status(statusCode).send(fallbackMessage);
|
|
30
|
+
// }
|
|
31
|
+
// }
|
|
19
32
|
};
|
|
20
33
|
exports.renderHandler = renderHandler;
|
|
21
|
-
const safeRender = async (fileName, res, statusCode, fallbackMessage) => {
|
|
22
|
-
try {
|
|
23
|
-
await (0, render_1.render)(fileName, {}, res);
|
|
24
|
-
}
|
|
25
|
-
catch (error) {
|
|
26
|
-
// console.error(`🚀 ~ safeRender ~ error rendering ${fileName}:`, error);
|
|
27
|
-
if (!res.headersSent) {
|
|
28
|
-
res.status(statusCode).send(fallbackMessage);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setGlobal = exports.getGlobal = void 0;
|
|
4
|
+
const globalVars = {};
|
|
5
|
+
const getGlobal = (key, defaultValue) => {
|
|
6
|
+
return globalVars[key] ?? defaultValue;
|
|
7
|
+
};
|
|
8
|
+
exports.getGlobal = getGlobal;
|
|
9
|
+
const setGlobal = (key, value) => {
|
|
10
|
+
globalVars[key] = value;
|
|
11
|
+
};
|
|
12
|
+
exports.setGlobal = setGlobal;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setLocales = exports.getLocales = void 0;
|
|
4
|
+
const locales = {};
|
|
5
|
+
const getLocales = (key) => {
|
|
6
|
+
return locales[key];
|
|
7
|
+
};
|
|
8
|
+
exports.getLocales = getLocales;
|
|
9
|
+
const setLocales = (key, value) => {
|
|
10
|
+
locales[key] = value;
|
|
11
|
+
};
|
|
12
|
+
exports.setLocales = setLocales;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface Globals {
|
|
2
|
+
app: any;
|
|
3
|
+
Setting: any;
|
|
4
|
+
}
|
|
5
|
+
export interface RenderContext {
|
|
6
|
+
page: Page;
|
|
7
|
+
[key: string]: any;
|
|
8
|
+
}
|
|
9
|
+
export type TMode = "production" | "devlopment";
|
|
10
|
+
export interface MainData {
|
|
11
|
+
globals?: Globals;
|
|
12
|
+
context?: RenderContext;
|
|
13
|
+
engine?: any;
|
|
14
|
+
themePath?: string;
|
|
15
|
+
assetsPath?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface Page {
|
|
18
|
+
title: string;
|
|
19
|
+
description: string;
|
|
20
|
+
fileName: string;
|
|
21
|
+
path: string;
|
|
22
|
+
handle: string;
|
|
23
|
+
layout: string;
|
|
24
|
+
}
|
|
25
|
+
export type CacheGetter = <T = any>(app: string, path: string) => Promise<T | null>;
|
|
26
|
+
export type CacheSetter = (app: string, path: string, value: any, ttlInSec?: number) => Promise<void> | undefined;
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const findAvailablePort: (startPort: number) => Promise<number>;
|
|
@@ -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
|
+
exports.findAvailablePort = void 0;
|
|
7
|
+
const net_1 = __importDefault(require("net"));
|
|
8
|
+
const findAvailablePort = async (startPort) => {
|
|
9
|
+
let port = startPort;
|
|
10
|
+
while (await isPortInUse(port)) {
|
|
11
|
+
port++;
|
|
12
|
+
}
|
|
13
|
+
return port;
|
|
14
|
+
};
|
|
15
|
+
exports.findAvailablePort = findAvailablePort;
|
|
16
|
+
const isPortInUse = (port) => {
|
|
17
|
+
return new Promise((resolve) => {
|
|
18
|
+
const server = net_1.default.createServer();
|
|
19
|
+
server.once('error', () => {
|
|
20
|
+
resolve(true); // البورت مستخدم
|
|
21
|
+
});
|
|
22
|
+
server.once('listening', () => {
|
|
23
|
+
server.close();
|
|
24
|
+
resolve(false); // البورت فاضي
|
|
25
|
+
});
|
|
26
|
+
server.listen(port);
|
|
27
|
+
});
|
|
28
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
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
|
+
exports.getLocalWidgetData = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const getLocalWidgetData = ({ widget, widgetPath }) => {
|
|
10
|
+
const filePath = path_1.default.join("widgets", widgetPath, "schema.njk");
|
|
11
|
+
try {
|
|
12
|
+
const fileContent = fs_1.default.readFileSync(filePath, "utf-8");
|
|
13
|
+
const jsonData = JSON.parse(fileContent);
|
|
14
|
+
return jsonData;
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
console.error(`❌ Failed to read or parse schema.njk for widget ${widget}:`, error);
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
exports.getLocalWidgetData = getLocalWidgetData;
|
|
@@ -0,0 +1,22 @@
|
|
|
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
|
+
exports.getLocalWidgetData = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const mergeSchemaWithData_1 = require("./mergeSchemaWithData");
|
|
10
|
+
const getLocalWidgetData = ({ widget, widgetPath, }) => {
|
|
11
|
+
try {
|
|
12
|
+
const filePath = path_1.default.join(widgetPath, widget, "schema.json");
|
|
13
|
+
const fileContent = fs_1.default.readFileSync(filePath, "utf-8");
|
|
14
|
+
const jsonData = JSON.parse(fileContent);
|
|
15
|
+
return (0, mergeSchemaWithData_1.mergeSchemaWithData)(jsonData, {});
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
console.error(`❌ Failed to read or parse schema.njk for widget ${widget}:`, error);
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
exports.getLocalWidgetData = getLocalWidgetData;
|
|
@@ -0,0 +1,22 @@
|
|
|
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
|
+
exports.getLocalWidgetData = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const mergeSchemaWithData_1 = require("./mergeSchemaWithData");
|
|
10
|
+
const getLocalWidgetData = ({ widget, widgetPath, }) => {
|
|
11
|
+
try {
|
|
12
|
+
const filePath = path_1.default.join(widgetPath, widget, "schema.json");
|
|
13
|
+
const fileContent = fs_1.default.readFileSync(filePath, "utf-8");
|
|
14
|
+
const jsonData = JSON.parse(fileContent);
|
|
15
|
+
return (0, mergeSchemaWithData_1.mergeSchemaWithData)(jsonData, {});
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
console.error(`❌ Failed to read or parse schema.njk for widget ${widget}:`, error);
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
exports.getLocalWidgetData = getLocalWidgetData;
|
|
@@ -0,0 +1,22 @@
|
|
|
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
|
+
exports.getLocalSettingsData = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const mergeSchemaWithData_1 = require("./mergeSchemaWithData");
|
|
10
|
+
const getLocalSettingsData = ({ widget, widgetPath, }) => {
|
|
11
|
+
try {
|
|
12
|
+
const filePath = path_1.default.join(widgetPath, widget, "schema.json");
|
|
13
|
+
const fileContent = fs_1.default.readFileSync(filePath, "utf-8");
|
|
14
|
+
const jsonData = JSON.parse(fileContent);
|
|
15
|
+
return (0, mergeSchemaWithData_1.mergeSchemaWithData)(jsonData, {});
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
console.error(`❌ Failed to read or parse schema.njk for widget ${widget}:`, error);
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
exports.getLocalSettingsData = getLocalSettingsData;
|
|
@@ -0,0 +1,22 @@
|
|
|
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
|
+
exports.getLocalWidgetData = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const mergeSchemaWithData_1 = require("./mergeSchemaWithData");
|
|
10
|
+
const getLocalWidgetData = ({ widget, widgetPath, }) => {
|
|
11
|
+
try {
|
|
12
|
+
const filePath = path_1.default.join(widgetPath, widget, "schema.json");
|
|
13
|
+
const fileContent = fs_1.default.readFileSync(filePath, "utf-8");
|
|
14
|
+
const jsonData = JSON.parse(fileContent);
|
|
15
|
+
return (0, mergeSchemaWithData_1.mergeSchemaWithData)(jsonData, {});
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
console.error(`❌ Failed to read or parse schema.njk for widget ${widget}:`, error);
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
exports.getLocalWidgetData = getLocalWidgetData;
|
|
@@ -0,0 +1,22 @@
|
|
|
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
|
+
exports.getLocalWidgetData = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const mergeSchemaWithData_1 = require("./mergeSchemaWithData");
|
|
10
|
+
const getLocalWidgetData = ({ widget, widgetPath, }) => {
|
|
11
|
+
try {
|
|
12
|
+
const filePath = path_1.default.join(widgetPath, widget, "schema.json");
|
|
13
|
+
const fileContent = fs_1.default.readFileSync(filePath, "utf-8");
|
|
14
|
+
const jsonData = JSON.parse(fileContent);
|
|
15
|
+
return (0, mergeSchemaWithData_1.mergeSchemaWithData)(jsonData, {});
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
console.error(`❌ Failed to read or parse schema.njk for widget ${widget}:`, error);
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
exports.getLocalWidgetData = getLocalWidgetData;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const getNestedValue: (obj: any, path: string) => any;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const isPathAllowedToRender: (filePath: string) => boolean;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isPathAllowedToRender = void 0;
|
|
4
|
+
const isPathAllowedToRender = (filePath) => {
|
|
5
|
+
// نتاكد إنه مفيهوش امتداد
|
|
6
|
+
return !/\.[a-z0-9]+$/i.test(filePath);
|
|
7
|
+
};
|
|
8
|
+
exports.isPathAllowedToRender = isPathAllowedToRender;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
type SchemaObject = {
|
|
2
|
+
[section: string]: {
|
|
3
|
+
[field: string]: {
|
|
4
|
+
type: string;
|
|
5
|
+
label: string;
|
|
6
|
+
default: any;
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
type DataObject = {
|
|
11
|
+
[section: string]: {
|
|
12
|
+
[field: string]: any;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
export declare const mergeNestedSchemaWithData: (schema: SchemaObject, data: DataObject) => Record<string, any>;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mergeNestedSchemaWithData = void 0;
|
|
4
|
+
const mergeNestedSchemaWithData = (schema, data) => {
|
|
5
|
+
const result = {};
|
|
6
|
+
for (const sectionKey in schema) {
|
|
7
|
+
const sectionSchema = schema[sectionKey];
|
|
8
|
+
const sectionData = data[sectionKey];
|
|
9
|
+
// لو الحقل النهائي مباشرة وليس كائن داخلي (مثلاً max)
|
|
10
|
+
const isLeafField = sectionSchema &&
|
|
11
|
+
typeof sectionSchema === "object" &&
|
|
12
|
+
"type" in sectionSchema &&
|
|
13
|
+
"default" in sectionSchema;
|
|
14
|
+
if (isLeafField) {
|
|
15
|
+
result[sectionKey] =
|
|
16
|
+
data?.[sectionKey] !== undefined
|
|
17
|
+
? data[sectionKey]
|
|
18
|
+
: sectionSchema.default;
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
// لو كائن داخلي مثل header, footer
|
|
22
|
+
result[sectionKey] = {};
|
|
23
|
+
const nestedSchema = sectionSchema || {};
|
|
24
|
+
const nestedData = sectionData || {};
|
|
25
|
+
for (const fieldKey in nestedSchema) {
|
|
26
|
+
result[sectionKey][fieldKey] =
|
|
27
|
+
nestedData[fieldKey] !== undefined
|
|
28
|
+
? nestedData[fieldKey]
|
|
29
|
+
: nestedSchema[fieldKey].default;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
exports.mergeNestedSchemaWithData = mergeNestedSchemaWithData;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const mergeObjects: (base: Record<string, any>, override: Record<string, any>, priority?: "base" | "override") => Record<string, any>;
|