qumra-engine 2.0.3 → 2.0.5

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
@@ -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.nunjucksMiddleware = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const nunjucksMiddleware = (req, res, next) => {
9
+ try {
10
+ const isDev = res.locals.mode === "devlopment";
11
+ const mainPath = isDev ? process.cwd() : res.locals.themesPath;
12
+ const pagesPath = path_1.default.join(mainPath, "pages");
13
+ const localsPath = path_1.default.join(mainPath, "locals");
14
+ const assetsPath = path_1.default.join(mainPath, "assets");
15
+ const widgetsPath = path_1.default.join(mainPath, "widgets");
16
+ res.locals.pagesPath = pagesPath;
17
+ res.locals.localsPath = localsPath;
18
+ res.locals.assetsPath = assetsPath;
19
+ res.locals.widgetsPath = widgetsPath;
20
+ res.locals.mainPath = mainPath;
21
+ next();
22
+ }
23
+ catch (error) {
24
+ console.error("❌ nunjucksMiddleware error:", error);
25
+ next(error);
26
+ }
27
+ };
28
+ exports.nunjucksMiddleware = nunjucksMiddleware;
@@ -0,0 +1,2 @@
1
+ import { Response, Request, NextFunction } from "express";
2
+ export declare const localesMiddleware: (req: Request, res: Response, next: NextFunction) => void;
@@ -0,0 +1,29 @@
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.localesMiddleware = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const locals_1 = require("../store/locals");
10
+ const localesMiddleware = (req, res, next) => {
11
+ const localesDirectory = res.locals.localesPath;
12
+ console.log("🚀 ~ localesDirectory:", localesDirectory);
13
+ const lang = res.locals.parsedUrl.language;
14
+ if (!lang)
15
+ return next();
16
+ try {
17
+ const filePath = path_1.default.join(localesDirectory, `${lang}.json`);
18
+ if (fs_1.default.existsSync(filePath)) {
19
+ const fileContent = fs_1.default.readFileSync(filePath, "utf-8");
20
+ const parsed = JSON.parse(fileContent);
21
+ (0, locals_1.setLocales)("locales", parsed);
22
+ }
23
+ }
24
+ catch (error) {
25
+ console.warn(`⚠️ خطأ أثناء تحميل ملف اللغة ${lang}:`, error);
26
+ }
27
+ next();
28
+ };
29
+ exports.localesMiddleware = localesMiddleware;
@@ -0,0 +1,2 @@
1
+ import { Request, Response, NextFunction } from "express";
2
+ export declare const mergeDataMiddleware: (req: Request, res: Response, next: NextFunction) => Promise<void>;
@@ -0,0 +1,55 @@
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.mergeDataMiddleware = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const mergeObjects_1 = require("../utils/mergeObjects");
9
+ const mergeNestedSchemaWithData_1 = require("../utils/mergeNestedSchemaWithData");
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const mergeWidgetSources_1 = require("../utils/mergeWidgetSources");
12
+ const mergeDataMiddleware = async (req, res, next) => {
13
+ try {
14
+ const pageHandle = res.locals.render.context?.page.handle;
15
+ const pageJsonPath = path_1.default.join(res.locals.env.getGlobal("pagesPath"), `${pageHandle}.json`);
16
+ const hasJson = fs_1.default.existsSync(pageJsonPath);
17
+ if (!hasJson) {
18
+ console.warn(`❌ No JSON file found for '${pageHandle}' at ${pageJsonPath}`);
19
+ return next(new Error(`No JSON file found for '${pageHandle}'`));
20
+ }
21
+ const jsonData = fs_1.default.readFileSync(pageJsonPath, "utf-8");
22
+ const fileContent = JSON.parse(jsonData);
23
+ const onlineWidgets = res.locals.render.engine.page?.widgets ?? [];
24
+ const fileWidgets = fileContent?.widgets || [];
25
+ const widgets = (0, mergeWidgetSources_1.mergeWidgetSources)(fileWidgets, onlineWidgets);
26
+ res.locals.env.addGlobal("engineData", res.locals.render.engine);
27
+ res.locals.env.addGlobal("widgets", widgets);
28
+ res.locals.env.addGlobal("pageData", {
29
+ layout: res.locals.render.engine.page?.layout ?? fileContent.layout,
30
+ title: res.locals.render.engine.page?.title ?? fileContent.title,
31
+ handle: res.locals.render.engine.page?.handle ?? fileContent.handle,
32
+ });
33
+ const settingSchemaPath = path_1.default.join(res.locals.env.getGlobal("settingsPath"), "settings-schema.json");
34
+ const settingDataPath = path_1.default.join(res.locals.env.getGlobal("settingsPath"), "settings-data.json");
35
+ let schemaJson = {};
36
+ let dataJson = {};
37
+ if (fs_1.default.existsSync(settingSchemaPath)) {
38
+ const content = fs_1.default.readFileSync(settingSchemaPath, "utf-8");
39
+ schemaJson = JSON.parse(content);
40
+ }
41
+ if (fs_1.default.existsSync(settingDataPath)) {
42
+ const content = fs_1.default.readFileSync(settingDataPath, "utf-8");
43
+ dataJson = JSON.parse(content);
44
+ }
45
+ const mergedData = (0, mergeObjects_1.mergeObjects)(dataJson, res.locals.render.engine.settings || {}, "override");
46
+ const settingsData = (0, mergeNestedSchemaWithData_1.mergeNestedSchemaWithData)(schemaJson, mergedData);
47
+ res.locals.env.addGlobal("settings", settingsData);
48
+ next();
49
+ }
50
+ catch (err) {
51
+ console.error("❌ mergeDataMiddleware error:", err);
52
+ return next(err);
53
+ }
54
+ };
55
+ exports.mergeDataMiddleware = mergeDataMiddleware;
@@ -0,0 +1,2 @@
1
+ import { Response, Request, NextFunction } from "express";
2
+ export declare const nunjucksMiddleWare: (req: Request, res: Response, next: NextFunction) => void;
@@ -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.nunjucksMiddleWare = void 0;
7
+ const nunjucksEnv_1 = require("../nunjucksEnv");
8
+ const path_1 = __importDefault(require("path"));
9
+ const nunjucksMiddleWare = (req, res, next) => {
10
+ var pagesPath;
11
+ if (res.locals.mode === "devlopment") {
12
+ pagesPath = path_1.default.join(process.cwd(), "src", "pages");
13
+ }
14
+ else {
15
+ pagesPath = path_1.default.join(res.locals.themesPath, "pages");
16
+ }
17
+ console.log("🚀 ~ returnnewPromise ~ pagesPath:", pagesPath);
18
+ const env = (0, nunjucksEnv_1.configureNunjucks)(pagesPath);
19
+ res.locals.env = env;
20
+ next();
21
+ };
22
+ exports.nunjucksMiddleWare = nunjucksMiddleWare;
@@ -0,0 +1,2 @@
1
+ import { Response, Request, NextFunction } from "express";
2
+ export declare const nunjucksMiddleWare: (req: Request, res: Response, next: NextFunction) => void;
@@ -0,0 +1,26 @@
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.nunjucksMiddleWare = void 0;
7
+ const nunjucksEnv_1 = require("../nunjucksEnv");
8
+ const path_1 = __importDefault(require("path"));
9
+ const nunjucksMiddleWare = (req, res, next) => {
10
+ const isDev = res.locals.mode === "devlopment";
11
+ const mainPath = isDev ? path_1.default.join(process.cwd(), "src") : path_1.default.join(res.locals.themesPath, "src");
12
+ const pagesPath = path_1.default.join(mainPath, "pages");
13
+ const localsPath = path_1.default.join(mainPath, "locals");
14
+ const assetsPath = path_1.default.join(mainPath, "assets");
15
+ const widgetsPath = path_1.default.join(mainPath, "widgets");
16
+ res.locals.pagesPath = pagesPath;
17
+ res.locals.localsPath = localsPath;
18
+ res.locals.assetsPath = assetsPath;
19
+ res.locals.widgetsPath = widgetsPath;
20
+ res.locals.mainPath = mainPath;
21
+ console.log("🚀 ~ pagesPath:", pagesPath);
22
+ const env = (0, nunjucksEnv_1.configureNunjucks)(mainPath);
23
+ res.locals.env = env;
24
+ next();
25
+ };
26
+ exports.nunjucksMiddleWare = nunjucksMiddleWare;
@@ -0,0 +1,2 @@
1
+ import { Response, Request, NextFunction } from "express";
2
+ export declare const nunjucksMiddleWare: (req: Request, res: Response, next: NextFunction) => void;
@@ -0,0 +1,36 @@
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.nunjucksMiddleWare = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const nunjucksEnv_1 = require("../nunjucksEnv");
9
+ const nunjucksMiddleWare = (req, res, next) => {
10
+ const isDev = res.locals.mode === "devlopment";
11
+ console.log("🚀 ~ res:", res.locals.render);
12
+ console.log("🚀 ~ res.locals:", res.locals);
13
+ console.log("🚀 ~ isDev:", isDev);
14
+ console.log("🚀 ~ res.locals.themesPath:", res.locals.themesPath);
15
+ const mainPath = isDev ? path_1.default.join(process.cwd()) : res.locals.themesPath;
16
+ const paths = {
17
+ pagesPath: path_1.default.join(mainPath, "pages"),
18
+ layoutsPath: path_1.default.join(mainPath, "layouts"),
19
+ localesPath: path_1.default.join(mainPath, "locales"),
20
+ assetsPath: path_1.default.join(mainPath, "assets"),
21
+ widgetsPath: path_1.default.join(mainPath, "widgets"),
22
+ settingsPath: path_1.default.join(mainPath, "settings"),
23
+ };
24
+ Object.entries(paths).forEach(([key, value]) => {
25
+ res.locals[key] = value;
26
+ });
27
+ res.locals.mainPath = mainPath;
28
+ const env = (0, nunjucksEnv_1.configureNunjucks)(mainPath);
29
+ for (const [key, value] of Object.entries(paths)) {
30
+ env.addGlobal(key, value);
31
+ }
32
+ env.addGlobal("mainPath", mainPath);
33
+ res.locals.env = env;
34
+ next();
35
+ };
36
+ exports.nunjucksMiddleWare = nunjucksMiddleWare;
@@ -0,0 +1,2 @@
1
+ import { Response, Request, NextFunction } from "express";
2
+ export declare const nunjucksFiltersMiddleWare: (req: Request, res: Response, next: NextFunction) => void;
@@ -0,0 +1,12 @@
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.nunjucksFiltersMiddleWare = void 0;
7
+ const registerAllFilters_1 = __importDefault(require("../filters/registerAllFilters"));
8
+ const nunjucksFiltersMiddleWare = (req, res, next) => {
9
+ (0, registerAllFilters_1.default)(res.locals.env);
10
+ next();
11
+ };
12
+ exports.nunjucksFiltersMiddleWare = nunjucksFiltersMiddleWare;
@@ -0,0 +1,2 @@
1
+ import { Request, Response, NextFunction } from "express";
2
+ export declare const prepareDataMiddleware: (req: Request, res: Response, next: NextFunction) => Promise<void>;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.prepareDataMiddleware = void 0;
4
+ const prepareDataMiddleware = async (req, res, next) => {
5
+ const parsedUrl = res.locals.parsedUrl;
6
+ try {
7
+ const { getRender, setRender } = res.locals.cache;
8
+ // حاول تجيب البيانات من الكاش الأول
9
+ if (typeof getRender === "function") {
10
+ const dataFromCache = await getRender(res.locals.mode, parsedUrl.fullUrl);
11
+ if (dataFromCache) {
12
+ res.locals.render = dataFromCache;
13
+ return next(); // البيانات موجودة، نكمل
14
+ }
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);
33
+ }
34
+ res.locals.render = data;
35
+ return next();
36
+ }
37
+ else {
38
+ throw new Error("Engine response not OK");
39
+ }
40
+ }
41
+ catch (err) {
42
+ console.error("❌ prepareDataMiddleware error:", err);
43
+ return next(err);
44
+ }
45
+ };
46
+ exports.prepareDataMiddleware = prepareDataMiddleware;
@@ -0,0 +1,2 @@
1
+ import { Request, Response, NextFunction } from "express";
2
+ export declare const prepareDataMiddleware: (req: Request, res: Response, next: NextFunction) => Promise<void>;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.prepareDataMiddleware = void 0;
4
+ const isPathAllowedToRender_1 = require("../utils/isPathAllowedToRender");
5
+ const prepareDataMiddleware = async (req, res, next) => {
6
+ if (res.locals.mode === "production") {
7
+ if ((0, isPathAllowedToRender_1.isPathAllowedToRender)(res.locals.parsedUrl.pathname)) {
8
+ next();
9
+ }
10
+ }
11
+ const parsedUrl = res.locals.parsedUrl;
12
+ try {
13
+ const { getRender, setRender } = res.locals.cache;
14
+ // حاول تجيب البيانات من الكاش الأول
15
+ if (typeof getRender === "function") {
16
+ const dataFromCache = await getRender(res.locals.mode, parsedUrl.fullUrl);
17
+ if (dataFromCache) {
18
+ res.locals.render = dataFromCache;
19
+ return next(); // البيانات موجودة، نكمل
20
+ }
21
+ }
22
+ const api = true
23
+ ? "https://store-gate.qumra-dev.site/render"
24
+ : "http://192.168.1.5:4019/v1/render";
25
+ const engineResponse = await fetch(api, {
26
+ method: "POST",
27
+ headers: { "Content-Type": "application/json" },
28
+ body: JSON.stringify({
29
+ url: parsedUrl.fullUrl,
30
+ }),
31
+ });
32
+ if (engineResponse.ok) {
33
+ const data = await engineResponse.json();
34
+ if (typeof setRender === "function") {
35
+ await setRender(res.locals.mode, parsedUrl.fullUrl, data);
36
+ }
37
+ res.locals.render = data;
38
+ return next();
39
+ }
40
+ else {
41
+ throw new Error("Engine response not OK");
42
+ }
43
+ }
44
+ catch (err) {
45
+ console.error("❌ prepareDataMiddleware error:", err);
46
+ return next(err);
47
+ }
48
+ };
49
+ exports.prepareDataMiddleware = prepareDataMiddleware;
@@ -0,0 +1,2 @@
1
+ import { Request, Response, NextFunction } from "express";
2
+ export declare const prepareDataMiddleware: (req: Request, res: Response, next: NextFunction) => Promise<void>;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.prepareDataMiddleware = void 0;
4
+ const isPathAllowedToRender_1 = require("../utils/isPathAllowedToRender");
5
+ const prepareDataMiddleware = async (req, res, next) => {
6
+ if (res.locals.mode === "production") {
7
+ if ((0, isPathAllowedToRender_1.isPathAllowedToRender)(res.locals.parsedUrl.pathname)) {
8
+ next();
9
+ }
10
+ }
11
+ const parsedUrl = res.locals.parsedUrl;
12
+ try {
13
+ const { getRender, setRender } = res.locals.cache;
14
+ // حاول تجيب البيانات من الكاش الأول
15
+ if (typeof getRender === "function") {
16
+ const dataFromCache = await getRender(res.locals.mode, parsedUrl.fullUrl);
17
+ if (dataFromCache) {
18
+ res.locals.render = dataFromCache;
19
+ return next(); // البيانات موجودة، نكمل
20
+ }
21
+ }
22
+ const api = true
23
+ ? "https://store-gate.qumra-dev.site/render"
24
+ : "http://192.168.1.5:4019/v1/render";
25
+ const engineResponse = await fetch(api, {
26
+ method: "POST",
27
+ headers: { "Content-Type": "application/json" },
28
+ body: JSON.stringify({
29
+ url: parsedUrl.fullUrl,
30
+ }),
31
+ });
32
+ if (engineResponse.ok) {
33
+ const data = await engineResponse.json();
34
+ if (typeof setRender === "function") {
35
+ await setRender(res.locals.mode, parsedUrl.fullUrl, data);
36
+ }
37
+ res.locals.render = data;
38
+ return next();
39
+ }
40
+ else {
41
+ throw new Error("Engine response not OK");
42
+ }
43
+ }
44
+ catch (err) {
45
+ console.error("❌ prepareDataMiddleware error:", err);
46
+ return next(err);
47
+ }
48
+ };
49
+ exports.prepareDataMiddleware = prepareDataMiddleware;
@@ -0,0 +1,2 @@
1
+ import { Request, Response, NextFunction } from "express";
2
+ export declare const prepareDataMiddleware: (req: Request, res: Response, next: NextFunction) => Promise<void>;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.prepareDataMiddleware = void 0;
4
+ const prepareDataMiddleware = async (req, res, next) => {
5
+ const parsedUrl = res.locals.parsedUrl;
6
+ try {
7
+ const { getRender, setRender } = res.locals.cache;
8
+ // حاول تجيب البيانات من الكاش الأول
9
+ if (typeof getRender === "function") {
10
+ const dataFromCache = await getRender(res.locals.mode, parsedUrl.fullUrl);
11
+ if (dataFromCache) {
12
+ res.locals.render = dataFromCache;
13
+ return next(); // البيانات موجودة، نكمل
14
+ }
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);
33
+ }
34
+ res.locals.render = data;
35
+ return next();
36
+ }
37
+ else {
38
+ throw new Error("Engine response not OK");
39
+ }
40
+ }
41
+ catch (err) {
42
+ console.error("❌ prepareDataMiddleware error:", err);
43
+ return next(err);
44
+ }
45
+ };
46
+ exports.prepareDataMiddleware = prepareDataMiddleware;
@@ -0,0 +1,2 @@
1
+ import { Request, Response, NextFunction } from "express";
2
+ export declare const renderMiddleware: (req: Request, res: Response, next: NextFunction) => void;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderMiddleware = void 0;
4
+ const renderMiddleware = (req, res, next) => {
5
+ const fileName = res.locals.render?.context?.page?.fileName;
6
+ const context = res.locals.render?.context || {};
7
+ if (!fileName) {
8
+ return next(new Error("Page fileName not found in res.locals.render"));
9
+ }
10
+ const env = res.locals.env;
11
+ if (!env) {
12
+ return next(new Error("Nunjucks environment not found in res.locals.env"));
13
+ }
14
+ env.render(fileName, context, (err, html) => {
15
+ if (err)
16
+ return next(err);
17
+ if (html !== null) {
18
+ res.send(html);
19
+ return;
20
+ }
21
+ return next(new Error("Nunjucks rendered null HTML"));
22
+ });
23
+ };
24
+ exports.renderMiddleware = renderMiddleware;
@@ -0,0 +1,2 @@
1
+ import { Request, Response, NextFunction } from "express";
2
+ export declare const renderMiddleware: (req: Request, res: Response, next: NextFunction) => void;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderMiddleware = void 0;
4
+ const renderMiddleware = (req, res, next) => {
5
+ const render = res.locals.render;
6
+ console.log("🚀 ~ render:", render);
7
+ const env = res.locals.env;
8
+ // if (!render?.context?.page?.fileName) {
9
+ // return next(
10
+ // new Error("❌ Missing fileName in res.locals.render.context.page")
11
+ // );
12
+ // }
13
+ // if (!env) {
14
+ // return next(
15
+ // new Error("❌ Nunjucks environment not found in res.locals.env")
16
+ // );
17
+ // }
18
+ // const fileName = render.context.page.fileName;
19
+ // const page = "index";
20
+ // const {context,globals} = render;
21
+ // const templatePath = `pages/${fileName}`;
22
+ // env.render(
23
+ // templatePath,
24
+ // {
25
+ // context,
26
+ // globals
27
+ // },
28
+ // (err: Error | null, html: string | null) => {
29
+ // if (err) {
30
+ // return next(new Error(`❌ Nunjucks render error: ${err.message}`));
31
+ // }
32
+ // if (!html) {
33
+ // return next(new Error("❌ Nunjucks rendered null HTML"));
34
+ // }
35
+ // res.send(html);
36
+ // }
37
+ // );
38
+ };
39
+ exports.renderMiddleware = renderMiddleware;
@@ -0,0 +1,2 @@
1
+ import { Request, Response, NextFunction } from "express";
2
+ export declare const renderMiddleware: (req: Request, res: Response, next: NextFunction) => void;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderMiddleware = void 0;
4
+ const resolveTranslations_1 = require("../utils/resolveTranslations");
5
+ const renderMiddleware = (req, res, next) => {
6
+ const render = res.locals.render;
7
+ const { context, globals } = render;
8
+ const env = res.locals.env;
9
+ const pageLayout = env.getGlobal("pageData").layout ?? "layout";
10
+ env.render(`layouts/${pageLayout}.njk`, (0, resolveTranslations_1.resolveTranslations)({
11
+ context,
12
+ globals,
13
+ settings: env.getGlobal("settings"),
14
+ }, env.getGlobal("t")), (err, html) => {
15
+ if (err) {
16
+ return next(new Error(`❌ Nunjucks render error: ${err.message}`));
17
+ }
18
+ if (!html) {
19
+ return next(new Error("❌ Nunjucks rendered null HTML"));
20
+ }
21
+ res.send(html);
22
+ });
23
+ };
24
+ exports.renderMiddleware = renderMiddleware;
@@ -0,0 +1,2 @@
1
+ import { Request, Response, NextFunction } from "express";
2
+ export declare const renderMiddleware: (req: Request, res: Response, next: NextFunction) => void;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderMiddleware = void 0;
4
+ const renderMiddleware = (req, res, next) => {
5
+ };
6
+ exports.renderMiddleware = renderMiddleware;
@@ -1,2 +1,8 @@
1
- import { Request, Response, NextFunction } from "express";
2
- export default function nunjucksMiddleware(req: Request, res: Response, next: NextFunction): Promise<void>;
1
+ import { CacheGetter, CacheSetter, TMode } from "./types/sharedTypes";
2
+ interface IStartEngine {
3
+ mode: TMode;
4
+ getRender?: CacheGetter;
5
+ setRender?: CacheSetter;
6
+ }
7
+ declare const startEngine: ({ mode, getRender, setRender }: IStartEngine) => Promise<void>;
8
+ export default startEngine;
@@ -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
- exports.default = nunjucksMiddleware;
4
- const prepareData_1 = require("./services/prepareData");
5
- const renderHandler_1 = require("./services/renderHandler");
6
- async function nunjucksMiddleware(req, res, next) {
7
- await (0, prepareData_1.prepareData)(res, res.locals.fullUrl);
8
- await (0, renderHandler_1.renderHandler)(res);
9
- next();
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;