qumra-engine 2.0.3 → 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/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/index.d.ts +22 -5
- 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/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/data/formatDate.d.ts +1 -0
- package/dist/filters/logic/data/formatDate.js +7 -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 -1
- package/dist/filters/logic/formatDate.js +4 -6
- 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/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 -2
- 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 -2
- package/dist/middleware.js +53 -8
- package/dist/nunjucksEnv.js +0 -2
- package/dist/services/prepareData.d.ts +2 -2
- package/dist/services/prepareData.js +34 -20
- 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 +6 -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/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 -2
- 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/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
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Response } from "express";
|
|
2
|
-
export declare const
|
|
1
|
+
import { Request, Response, NextFunction } from "express";
|
|
2
|
+
export declare const prepareDataMiddleware: (req: Request, res: Response, next: NextFunction) => Promise<void>;
|
|
@@ -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;
|
|
@@ -6,9 +6,11 @@ export interface RenderContext {
|
|
|
6
6
|
page: Page;
|
|
7
7
|
[key: string]: any;
|
|
8
8
|
}
|
|
9
|
+
export type TMode = "production" | "devlopment";
|
|
9
10
|
export interface MainData {
|
|
10
11
|
globals?: Globals;
|
|
11
12
|
context?: RenderContext;
|
|
13
|
+
engine?: any;
|
|
12
14
|
themePath?: string;
|
|
13
15
|
assetsPath?: string;
|
|
14
16
|
}
|
|
@@ -17,4 +19,8 @@ export interface Page {
|
|
|
17
19
|
description: string;
|
|
18
20
|
fileName: string;
|
|
19
21
|
path: string;
|
|
22
|
+
handle: string;
|
|
23
|
+
layout: string;
|
|
20
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>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mergeObjects = void 0;
|
|
4
|
+
const mergeObjects = (base, override, priority = "override") => {
|
|
5
|
+
const result = {};
|
|
6
|
+
const keys = new Set([...Object.keys(base), ...Object.keys(override)]);
|
|
7
|
+
for (const key of keys) {
|
|
8
|
+
const baseValue = base[key];
|
|
9
|
+
const overrideValue = override[key];
|
|
10
|
+
if (typeof baseValue === "object" &&
|
|
11
|
+
typeof overrideValue === "object" &&
|
|
12
|
+
baseValue !== null &&
|
|
13
|
+
overrideValue !== null &&
|
|
14
|
+
!Array.isArray(baseValue) &&
|
|
15
|
+
!Array.isArray(overrideValue)) {
|
|
16
|
+
// merge nested objects recursively
|
|
17
|
+
result[key] = (0, exports.mergeObjects)(baseValue, overrideValue, priority);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
result[key] =
|
|
21
|
+
priority === "override"
|
|
22
|
+
? overrideValue ?? baseValue
|
|
23
|
+
: baseValue ?? overrideValue;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return result;
|
|
27
|
+
};
|
|
28
|
+
exports.mergeObjects = mergeObjects;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
interface SchemaField {
|
|
2
|
+
key: string;
|
|
3
|
+
type: string;
|
|
4
|
+
label: string;
|
|
5
|
+
default: any;
|
|
6
|
+
}
|
|
7
|
+
interface Schema {
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
data: SchemaField[];
|
|
11
|
+
}
|
|
12
|
+
type InputData = Record<string, any>;
|
|
13
|
+
export declare const mergeSchemaWithData: (schema: Schema, data: InputData) => Record<string, any>;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mergeSchemaWithData = void 0;
|
|
4
|
+
const mergeSchemaWithData = (schema, data) => {
|
|
5
|
+
const result = {};
|
|
6
|
+
for (const field of schema.data) {
|
|
7
|
+
result[field.key] = data[field.key] ?? field.default;
|
|
8
|
+
}
|
|
9
|
+
return result;
|
|
10
|
+
};
|
|
11
|
+
exports.mergeSchemaWithData = mergeSchemaWithData;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const mergeWidgetSources: (fileWidgets: any[], onlineWidgets: any[]) => any[];
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mergeWidgetSources = void 0;
|
|
4
|
+
const mergeObjects_1 = require("./mergeObjects");
|
|
5
|
+
const mergeWidgetSources = (fileWidgets, onlineWidgets) => {
|
|
6
|
+
const onlineMap = new Map();
|
|
7
|
+
onlineWidgets.forEach((w) => onlineMap.set(w.key, w));
|
|
8
|
+
return fileWidgets.map((fileWidget) => {
|
|
9
|
+
const matchedOnline = onlineMap.get(fileWidget.key);
|
|
10
|
+
const mergedData = matchedOnline
|
|
11
|
+
? (0, mergeObjects_1.mergeObjects)(fileWidget.data || {}, matchedOnline.data || {}, "override")
|
|
12
|
+
: fileWidget.data;
|
|
13
|
+
return {
|
|
14
|
+
...fileWidget,
|
|
15
|
+
data: mergedData,
|
|
16
|
+
schema: fileWidget.schema, // نستخدم الـ schema من الملفات دائمًا
|
|
17
|
+
...(matchedOnline?._id && { _id: matchedOnline._id }), // لو موجود حطه
|
|
18
|
+
};
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
exports.mergeWidgetSources = mergeWidgetSources;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function normalizeWidgetPath(input: string): string | null;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizeWidgetPath = normalizeWidgetPath;
|
|
4
|
+
function normalizeWidgetPath(input) {
|
|
5
|
+
if (!input || typeof input !== 'string') {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
const trimmed = input.trim().replace(/^['"]|['"]$/g, '');
|
|
9
|
+
// إزالة أي امتداد .njk لو موجود
|
|
10
|
+
let base = trimmed.replace(/\.njk$/, '');
|
|
11
|
+
// لو بيبدأ بـ widgets/ نشيله مؤقتًا
|
|
12
|
+
if (base.startsWith('widgets/')) {
|
|
13
|
+
base = base.replace(/^widgets\//, '');
|
|
14
|
+
}
|
|
15
|
+
// إزالة /widget لو موجودة في الآخر
|
|
16
|
+
base = base.replace(/\/widget$/, '');
|
|
17
|
+
// الناتج النهائي
|
|
18
|
+
return `widgets/${base}/widget.njk`;
|
|
19
|
+
}
|