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.
Files changed (224) hide show
  1. package/dist/extensions/index.d.ts +7 -0
  2. package/dist/extensions/index.js +20 -0
  3. package/dist/extensions/logic/content copy.d.ts +7 -0
  4. package/dist/extensions/logic/content copy.js +32 -0
  5. package/dist/extensions/logic/content.d.ts +10 -0
  6. package/dist/extensions/logic/content.js +74 -0
  7. package/dist/extensions/logic/footer copy.d.ts +10 -0
  8. package/dist/extensions/logic/footer copy.js +43 -0
  9. package/dist/extensions/logic/footer.d.ts +10 -0
  10. package/dist/extensions/logic/footer.js +51 -0
  11. package/dist/extensions/logic/form.d.ts +8 -0
  12. package/dist/extensions/logic/form.js +41 -0
  13. package/dist/extensions/logic/header copy.d.ts +10 -0
  14. package/dist/extensions/logic/header copy.js +33 -0
  15. package/dist/extensions/logic/header.d.ts +10 -0
  16. package/dist/extensions/logic/header.js +51 -0
  17. package/dist/extensions/logic/qumra-head.d.ts +7 -0
  18. package/dist/extensions/logic/qumra-head.js +34 -0
  19. package/dist/extensions/logic/schema.d.ts +6 -0
  20. package/dist/extensions/logic/schema.js +26 -0
  21. package/dist/extensions/logic/schemaExtension.d.ts +0 -0
  22. package/dist/extensions/logic/schemaExtension.js +1 -0
  23. package/dist/extensions/logic/seo copy.d.ts +7 -0
  24. package/dist/extensions/logic/seo copy.js +32 -0
  25. package/dist/extensions/logic/seo.d.ts +7 -0
  26. package/dist/extensions/logic/seo.js +32 -0
  27. package/dist/extensions/logic/t.d.ts +1 -0
  28. package/dist/extensions/logic/t.js +10 -0
  29. package/dist/extensions/logic/widget copy.d.ts +10 -0
  30. package/dist/extensions/logic/widget copy.js +33 -0
  31. package/dist/extensions/logic/widget.d.ts +10 -0
  32. package/dist/extensions/logic/widget.js +47 -0
  33. package/dist/extensions/logic/widgets copy.d.ts +10 -0
  34. package/dist/extensions/logic/widgets copy.js +33 -0
  35. package/dist/extensions/logic/widgets.d.ts +10 -0
  36. package/dist/extensions/logic/widgets.js +33 -0
  37. package/dist/extensions/registerAllExtensions.d.ts +2 -0
  38. package/dist/extensions/registerAllExtensions.js +50 -0
  39. package/dist/extensions/registerAllGlobals.d.ts +2 -0
  40. package/dist/extensions/registerAllGlobals.js +47 -0
  41. package/dist/filters/index.d.ts +22 -5
  42. package/dist/filters/index.js +43 -9
  43. package/dist/filters/logic/array/compact.d.ts +1 -0
  44. package/dist/filters/logic/array/compact.js +6 -0
  45. package/dist/filters/logic/array/concat.d.ts +1 -0
  46. package/dist/filters/logic/array/concat.js +6 -0
  47. package/dist/filters/logic/array/find.d.ts +1 -0
  48. package/dist/filters/logic/array/find.js +8 -0
  49. package/dist/filters/logic/array/first.d.ts +1 -0
  50. package/dist/filters/logic/array/first.js +6 -0
  51. package/dist/filters/logic/array/join.d.ts +1 -0
  52. package/dist/filters/logic/array/join.js +8 -0
  53. package/dist/filters/logic/array/last.d.ts +1 -0
  54. package/dist/filters/logic/array/last.js +8 -0
  55. package/dist/filters/logic/array/size.d.ts +1 -0
  56. package/dist/filters/logic/array/size.js +12 -0
  57. package/dist/filters/logic/array/split.d.ts +1 -0
  58. package/dist/filters/logic/array/split.js +6 -0
  59. package/dist/filters/logic/array/where.d.ts +1 -0
  60. package/dist/filters/logic/array/where.js +8 -0
  61. package/dist/filters/logic/color_to_hex.d.ts +1 -0
  62. package/dist/filters/logic/color_to_hex.js +15 -0
  63. package/dist/filters/logic/colors/color_to_hex.d.ts +1 -0
  64. package/dist/filters/logic/colors/color_to_hex.js +15 -0
  65. package/dist/filters/logic/data/formatDate.d.ts +1 -0
  66. package/dist/filters/logic/data/formatDate.js +7 -0
  67. package/dist/filters/logic/first.d.ts +1 -0
  68. package/dist/filters/logic/first.js +6 -0
  69. package/dist/filters/logic/formatDate.d.ts +1 -1
  70. package/dist/filters/logic/formatDate.js +4 -6
  71. package/dist/filters/logic/json/json.d.ts +2 -0
  72. package/dist/filters/logic/json/json.js +15 -0
  73. package/dist/filters/logic/json.d.ts +2 -0
  74. package/dist/filters/logic/json.js +15 -0
  75. package/dist/filters/logic/money/discountLabel.d.ts +1 -0
  76. package/dist/filters/logic/money/discountLabel.js +8 -0
  77. package/dist/filters/logic/money/money_with_currency.d.ts +1 -0
  78. package/dist/filters/logic/money/money_with_currency.js +8 -0
  79. package/dist/filters/logic/money/money_without_trailing_zeros.d.ts +1 -0
  80. package/dist/filters/logic/money/money_without_trailing_zeros.js +8 -0
  81. package/dist/filters/logic/money_with_currency.d.ts +1 -0
  82. package/dist/filters/logic/money_with_currency.js +8 -0
  83. package/dist/filters/logic/money_without_trailing_zeros.d.ts +1 -0
  84. package/dist/filters/logic/money_without_trailing_zeros.js +8 -0
  85. package/dist/filters/logic/split.d.ts +1 -0
  86. package/dist/filters/logic/split.js +6 -0
  87. package/dist/filters/logic/strings/capitalize.d.ts +1 -0
  88. package/dist/filters/logic/strings/capitalize.js +8 -0
  89. package/dist/filters/logic/strings/downcase.d.ts +1 -0
  90. package/dist/filters/logic/strings/downcase.js +6 -0
  91. package/dist/filters/logic/strings/remove.d.ts +1 -0
  92. package/dist/filters/logic/strings/remove.js +8 -0
  93. package/dist/filters/logic/strings/split.d.ts +1 -0
  94. package/dist/filters/logic/strings/split.js +6 -0
  95. package/dist/filters/logic/strings/strip.d.ts +1 -0
  96. package/dist/filters/logic/strings/strip.js +6 -0
  97. package/dist/filters/logic/strings/truncate.d.ts +1 -0
  98. package/dist/filters/logic/strings/truncate.js +10 -0
  99. package/dist/filters/logic/strings/upcase.d.ts +1 -0
  100. package/dist/filters/logic/strings/upcase.js +8 -0
  101. package/dist/filters/logic/urls/assets.d.ts +1 -0
  102. package/dist/filters/logic/urls/assets.js +6 -0
  103. package/dist/filters/logic/urls/capitalize.d.ts +1 -0
  104. package/dist/filters/logic/urls/capitalize.js +8 -0
  105. package/dist/globals/index.d.ts +1 -0
  106. package/dist/globals/index.js +8 -0
  107. package/dist/globals/logic/capitalize.d.ts +1 -0
  108. package/dist/globals/logic/capitalize.js +8 -0
  109. package/dist/globals/logic/component.d.ts +2 -0
  110. package/dist/globals/logic/component.js +6 -0
  111. package/dist/globals/logic/discountLabel.d.ts +1 -0
  112. package/dist/globals/logic/discountLabel.js +8 -0
  113. package/dist/globals/logic/formatDate.d.ts +1 -0
  114. package/dist/globals/logic/formatDate.js +9 -0
  115. package/dist/globals/logic/formatMoney.d.ts +1 -0
  116. package/dist/globals/logic/formatMoney.js +8 -0
  117. package/dist/globals/logic/t.d.ts +1 -0
  118. package/dist/globals/logic/t.js +10 -0
  119. package/dist/globals/registerAllFilters.d.ts +2 -0
  120. package/dist/globals/registerAllFilters.js +47 -0
  121. package/dist/globals/registerAllGlobals.d.ts +2 -0
  122. package/dist/globals/registerAllGlobals.js +47 -0
  123. package/dist/globals copy/index.d.ts +1 -0
  124. package/dist/globals copy/index.js +8 -0
  125. package/dist/globals copy/logic/t.d.ts +1 -0
  126. package/dist/globals copy/logic/t.js +10 -0
  127. package/dist/globals copy/registerAllGlobals.d.ts +2 -0
  128. package/dist/globals copy/registerAllGlobals.js +47 -0
  129. package/dist/index.d.ts +2 -2
  130. package/dist/index.js +2 -1
  131. package/dist/middleware/extension.middleware.d.ts +2 -0
  132. package/dist/middleware/extension.middleware.js +12 -0
  133. package/dist/middleware/extensions.middleware.d.ts +2 -0
  134. package/dist/middleware/extensions.middleware.js +12 -0
  135. package/dist/middleware/filters.middleware copy.d.ts +2 -0
  136. package/dist/middleware/filters.middleware copy.js +12 -0
  137. package/dist/middleware/filters.middleware.d.ts +2 -0
  138. package/dist/middleware/filters.middleware.js +12 -0
  139. package/dist/middleware/globals.middleware copy.d.ts +2 -0
  140. package/dist/middleware/globals.middleware copy.js +12 -0
  141. package/dist/middleware/globals.middleware.d.ts +2 -0
  142. package/dist/middleware/globals.middleware.js +12 -0
  143. package/dist/middleware/init.middleware.d.ts +9 -0
  144. package/dist/middleware/init.middleware.js +23 -0
  145. package/dist/middleware/initPaths.middleware.d.ts +2 -0
  146. package/dist/middleware/initPaths.middleware.js +28 -0
  147. package/dist/middleware/locals.middleware.d.ts +2 -0
  148. package/dist/middleware/locals.middleware.js +29 -0
  149. package/dist/middleware/mergeData.middleware.d.ts +2 -0
  150. package/dist/middleware/mergeData.middleware.js +55 -0
  151. package/dist/middleware/nunjucks.d.ts +2 -0
  152. package/dist/middleware/nunjucks.js +22 -0
  153. package/dist/middleware/nunjucks.middleware copy.d.ts +2 -0
  154. package/dist/middleware/nunjucks.middleware copy.js +26 -0
  155. package/dist/middleware/nunjucks.middleware.d.ts +2 -0
  156. package/dist/middleware/nunjucks.middleware.js +36 -0
  157. package/dist/middleware/nunjucksFilters.middleware.d.ts +2 -0
  158. package/dist/middleware/nunjucksFilters.middleware.js +12 -0
  159. package/dist/middleware/prepareData.d.ts +2 -0
  160. package/dist/middleware/prepareData.js +46 -0
  161. package/dist/middleware/prepareData.middleware copy.d.ts +2 -0
  162. package/dist/middleware/prepareData.middleware copy.js +49 -0
  163. package/dist/middleware/prepareData.middleware.d.ts +2 -0
  164. package/dist/middleware/prepareData.middleware.js +49 -0
  165. package/dist/middleware/prepareDataMiddleware.d.ts +2 -0
  166. package/dist/middleware/prepareDataMiddleware.js +46 -0
  167. package/dist/middleware/render.d.ts +2 -0
  168. package/dist/middleware/render.js +24 -0
  169. package/dist/middleware/render.middleware copy.d.ts +2 -0
  170. package/dist/middleware/render.middleware copy.js +39 -0
  171. package/dist/middleware/render.middleware.d.ts +2 -0
  172. package/dist/middleware/render.middleware.js +24 -0
  173. package/dist/middleware/serve-assets.middleware.d.ts +2 -0
  174. package/dist/middleware/serve-assets.middleware.js +6 -0
  175. package/dist/middleware.d.ts +8 -2
  176. package/dist/middleware.js +53 -8
  177. package/dist/nunjucksEnv.js +0 -2
  178. package/dist/services/prepareData.d.ts +2 -2
  179. package/dist/services/prepareData.js +34 -20
  180. package/dist/services/renderHandler.js +27 -25
  181. package/dist/store/globals.d.ts +2 -0
  182. package/dist/store/globals.js +12 -0
  183. package/dist/store/locals.d.ts +2 -0
  184. package/dist/store/locals.js +12 -0
  185. package/dist/types/sharedTypes.d.ts +6 -0
  186. package/dist/utils/asyncHandler.d.ts +0 -0
  187. package/dist/utils/asyncHandler.js +1 -0
  188. package/dist/utils/findAvailablePort.d.ts +1 -0
  189. package/dist/utils/findAvailablePort.js +28 -0
  190. package/dist/utils/getLocalData.d.ts +4 -0
  191. package/dist/utils/getLocalData.js +21 -0
  192. package/dist/utils/getLocalFooterData copy.d.ts +4 -0
  193. package/dist/utils/getLocalFooterData copy.js +22 -0
  194. package/dist/utils/getLocalFooterData.d.ts +4 -0
  195. package/dist/utils/getLocalFooterData.js +22 -0
  196. package/dist/utils/getLocalHeaderData.d.ts +4 -0
  197. package/dist/utils/getLocalHeaderData.js +22 -0
  198. package/dist/utils/getLocalWidgetData copy.d.ts +4 -0
  199. package/dist/utils/getLocalWidgetData copy.js +22 -0
  200. package/dist/utils/getLocalWidgetData.d.ts +4 -0
  201. package/dist/utils/getLocalWidgetData.js +22 -0
  202. package/dist/utils/getNestedValue.d.ts +1 -0
  203. package/dist/utils/getNestedValue.js +7 -0
  204. package/dist/utils/isPathAllowedToRender.d.ts +1 -0
  205. package/dist/utils/isPathAllowedToRender.js +8 -0
  206. package/dist/utils/mergeNestedSchemaWithData.d.ts +16 -0
  207. package/dist/utils/mergeNestedSchemaWithData.js +34 -0
  208. package/dist/utils/mergeObjects.d.ts +1 -0
  209. package/dist/utils/mergeObjects.js +28 -0
  210. package/dist/utils/mergeSchemaWithData.d.ts +14 -0
  211. package/dist/utils/mergeSchemaWithData.js +11 -0
  212. package/dist/utils/mergeWidgetSources.d.ts +1 -0
  213. package/dist/utils/mergeWidgetSources.js +21 -0
  214. package/dist/utils/normalizeWidgetPath.d.ts +1 -0
  215. package/dist/utils/normalizeWidgetPath.js +19 -0
  216. package/dist/utils/parseUrl.d.ts +2 -0
  217. package/dist/utils/parseUrl.js +46 -0
  218. package/dist/utils/render.d.ts +2 -2
  219. package/dist/utils/render.js +21 -20
  220. package/dist/utils/resolveTranslations.d.ts +1 -0
  221. package/dist/utils/resolveTranslations.js +21 -0
  222. package/package.json +5 -3
  223. package/todo.txt +1 -0
  224. package/views/home.njk +0 -15
@@ -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 prepareData: (res: Response, url: string) => Promise<void>;
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.prepareData = void 0;
4
- const prepareData = async (res, url) => {
3
+ exports.prepareDataMiddleware = void 0;
4
+ const prepareDataMiddleware = async (req, res, next) => {
5
+ const parsedUrl = res.locals.parsedUrl;
5
6
  try {
6
- if (res.locals.cache.getRender) {
7
- // أول حاجة نحاول نجيب البيانات من الكاش
8
- const dataFromCache = await res.locals.cache.getRender(url, "");
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
- const engineResponse = await fetch("https://store-gate.qumra-dev.site/render", {
15
- method: "POST",
16
- headers: {
17
- 'Content-Type': 'application/json',
18
- },
19
- body: JSON.stringify({ url }),
20
- });
21
- if (engineResponse.ok) {
22
- const data = await engineResponse.json();
23
- res.locals.cache.setRender(url, "", data);
24
- res.locals.render = data;
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("🚀 ~ prepareData error:", err);
42
+ console.error(" prepareDataMiddleware error:", err);
43
+ return next(err);
30
44
  }
31
45
  };
32
- exports.prepareData = prepareData;
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
- const render_1 = require("../utils/render");
4
+ // import { render } from "../middleware/render";
5
5
  const renderHandler = async (res) => {
6
- try {
7
- const page = res.locals.render.context?.page;
8
- if (page) {
9
- await (0, render_1.render)(page.fileName, {}, res);
10
- }
11
- else {
12
- await safeRender("404.njk", res, 404, "Page not found");
13
- }
14
- }
15
- catch (error) {
16
- // console.error("🚀 ~ renderHandler ~ error:", error);
17
- await safeRender("404.njk", res, 404, "Page not found");
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,2 @@
1
+ export declare const getGlobal: <T = any>(key: string, defaultValue?: T) => T;
2
+ export declare const setGlobal: (key: string, value: any) => void;
@@ -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,2 @@
1
+ export declare const getLocales: <T = any>(key: string) => T | undefined;
2
+ export declare const setLocales: (key: string, value: any) => void;
@@ -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,4 @@
1
+ export declare const getLocalWidgetData: ({ widget, widgetPath }: {
2
+ widget: string;
3
+ widgetPath: string;
4
+ }) => any;
@@ -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,4 @@
1
+ export declare const getLocalWidgetData: ({ widget, widgetPath, }: {
2
+ widget: string;
3
+ widgetPath: string;
4
+ }) => Record<string, any> | null;
@@ -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,4 @@
1
+ export declare const getLocalWidgetData: ({ widget, widgetPath, }: {
2
+ widget: string;
3
+ widgetPath: string;
4
+ }) => Record<string, any> | null;
@@ -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,4 @@
1
+ export declare const getLocalSettingsData: ({ widget, widgetPath, }: {
2
+ widget: string;
3
+ widgetPath: string;
4
+ }) => Record<string, any> | null;
@@ -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,4 @@
1
+ export declare const getLocalWidgetData: ({ widget, widgetPath, }: {
2
+ widget: string;
3
+ widgetPath: string;
4
+ }) => Record<string, any> | null;
@@ -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,4 @@
1
+ export declare const getLocalWidgetData: ({ widget, widgetPath, }: {
2
+ widget: string;
3
+ widgetPath: string;
4
+ }) => Record<string, any> | null;
@@ -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,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getNestedValue = void 0;
4
+ const getNestedValue = (obj, path) => {
5
+ return path.split(".").reduce((acc, key) => acc?.[key], obj);
6
+ };
7
+ exports.getNestedValue = getNestedValue;
@@ -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
+ }
@@ -0,0 +1,2 @@
1
+ import { ParsedUrl } from "../types/sharedTypes";
2
+ export declare const parseUrlString: (urlString: string) => ParsedUrl;