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
@@ -0,0 +1,7 @@
1
+ export { default as seo } from './logic/seo';
2
+ export { default as widget } from './logic/widget';
3
+ export { default as form } from './logic/form';
4
+ export { default as header } from './logic/header';
5
+ export { default as footer } from './logic/footer';
6
+ export { default as content } from './logic/content';
7
+ export { default as qumra_head } from './logic/qumra-head';
@@ -0,0 +1,20 @@
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.qumra_head = exports.content = exports.footer = exports.header = exports.form = exports.widget = exports.seo = void 0;
7
+ var seo_1 = require("./logic/seo");
8
+ Object.defineProperty(exports, "seo", { enumerable: true, get: function () { return __importDefault(seo_1).default; } });
9
+ var widget_1 = require("./logic/widget");
10
+ Object.defineProperty(exports, "widget", { enumerable: true, get: function () { return __importDefault(widget_1).default; } });
11
+ var form_1 = require("./logic/form");
12
+ Object.defineProperty(exports, "form", { enumerable: true, get: function () { return __importDefault(form_1).default; } });
13
+ var header_1 = require("./logic/header");
14
+ Object.defineProperty(exports, "header", { enumerable: true, get: function () { return __importDefault(header_1).default; } });
15
+ var footer_1 = require("./logic/footer");
16
+ Object.defineProperty(exports, "footer", { enumerable: true, get: function () { return __importDefault(footer_1).default; } });
17
+ var content_1 = require("./logic/content");
18
+ Object.defineProperty(exports, "content", { enumerable: true, get: function () { return __importDefault(content_1).default; } });
19
+ var qumra_head_1 = require("./logic/qumra-head");
20
+ Object.defineProperty(exports, "qumra_head", { enumerable: true, get: function () { return __importDefault(qumra_head_1).default; } });
@@ -0,0 +1,7 @@
1
+ import nunjucks from "nunjucks";
2
+ declare const _default: {
3
+ tags: string[];
4
+ parse(parser: any, nodes: any): any;
5
+ run({ ctx, env }: any, widgetPath: string): nunjucks.runtime.SafeString;
6
+ };
7
+ export default _default;
@@ -0,0 +1,32 @@
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
+ const nunjucks_1 = __importDefault(require("nunjucks"));
7
+ const normalizeWidgetPath_1 = require("../../utils/normalizeWidgetPath");
8
+ exports.default = new (class WidgetExtension {
9
+ constructor() {
10
+ this.tags = ["widget"];
11
+ }
12
+ parse(parser, nodes) {
13
+ const tok = parser.nextToken();
14
+ const args = parser.parseSignature(true, true);
15
+ parser.advanceAfterBlockEnd(tok.value);
16
+ return new nodes.CallExtension(this, "run", args);
17
+ }
18
+ run({ ctx, env }, widgetPath) {
19
+ const widget = (0, normalizeWidgetPath_1.normalizeWidgetPath)(widgetPath);
20
+ try {
21
+ const rendered = env.render(widget, ctx);
22
+ return new nunjucks_1.default.runtime.SafeString(rendered);
23
+ }
24
+ catch (err) {
25
+ return new nunjucks_1.default.runtime.SafeString(`
26
+ <div style="padding: 12px; background-color: #f8d7da; color: #721c24; border: 1px solid #f5c6cb; border-radius: 4px; margin: 8px 0;">
27
+ ⚠️ <strong>تعذر تضمين الويجيت:</strong> ${widget}
28
+ </div>
29
+ `);
30
+ }
31
+ }
32
+ })();
@@ -0,0 +1,10 @@
1
+ import nunjucks from "nunjucks";
2
+ declare const _default: {
3
+ tags: string[];
4
+ parse(parser: any, nodes: any): any;
5
+ run({ ctx, env }: {
6
+ ctx: any;
7
+ env: nunjucks.Environment;
8
+ }): nunjucks.runtime.SafeString;
9
+ };
10
+ export default _default;
@@ -0,0 +1,74 @@
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
+ const nunjucks_1 = __importDefault(require("nunjucks"));
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const normalizeWidgetPath_1 = require("../../utils/normalizeWidgetPath");
10
+ const getLocalWidgetData_1 = require("../../utils/getLocalWidgetData");
11
+ const mergeObjects_1 = require("../../utils/mergeObjects");
12
+ const resolveTranslations_1 = require("../../utils/resolveTranslations");
13
+ exports.default = new (class WidgetExtension {
14
+ constructor() {
15
+ this.tags = ["content"];
16
+ }
17
+ parse(parser, nodes) {
18
+ const tok = parser.nextToken();
19
+ const args = parser.parseSignature(true, true); // مستقبلًا ممكن نمرر الصفحة
20
+ parser.advanceAfterBlockEnd(tok.value);
21
+ return new nodes.CallExtension(this, "run", args);
22
+ }
23
+ run({ ctx, env }) {
24
+ const pageHandle = env.getGlobal("pageData").handle;
25
+ const pageJsonPath = path_1.default.join(env.getGlobal("pagesPath"), `${pageHandle}.json`);
26
+ const pageNunjucksPath = path_1.default.join(env.getGlobal("pagesPath"), `${pageHandle}.njk`);
27
+ const hasJson = fs_1.default.existsSync(pageJsonPath);
28
+ const hasNunjucks = fs_1.default.existsSync(pageNunjucksPath);
29
+ if (!hasJson && !hasNunjucks) {
30
+ return new nunjucks_1.default.runtime.SafeString(`
31
+ <div style="padding:10px;background:#fee;border:1px solid #f99;color:#900">
32
+ ❌ No JSON or NJK file found for '${pageHandle}'
33
+ </div>
34
+ `);
35
+ }
36
+ const widgets = env.getGlobal("widgets");
37
+ const renderedWidgets = [];
38
+ for (const widget of widgets) {
39
+ const finalDataFromLocal = (0, getLocalWidgetData_1.getLocalWidgetData)({
40
+ widget: widget.widget,
41
+ widgetPath: env.getGlobal("widgetsPath"),
42
+ }) ?? {};
43
+ const finalData = (0, mergeObjects_1.mergeObjects)(finalDataFromLocal, widget.data, "override") || {};
44
+ const widgetTemplatePath = (0, normalizeWidgetPath_1.normalizeWidgetPath)(widget.widget);
45
+ if (!widgetTemplatePath) {
46
+ return new nunjucks_1.default.runtime.SafeString(`
47
+ <div style="padding: 12px; background-color: #f8d7da; color: #721c24; border: 1px solid #f5c6cb; border-radius: 4px; margin: 8px 0;">
48
+ ⚠️ <strong>مسار الويجيت غير صالح:</strong> ${widget.widget}
49
+ </div>
50
+ `);
51
+ }
52
+ try {
53
+ const html = env.render(widgetTemplatePath, {
54
+ context: ctx.context,
55
+ globals: ctx.globals,
56
+ widget: {
57
+ id: widget.id,
58
+ type: widget.widget,
59
+ data: (0, resolveTranslations_1.resolveTranslations)(finalData, env.getGlobal("t")),
60
+ },
61
+ });
62
+ renderedWidgets.push(html);
63
+ }
64
+ catch (err) {
65
+ renderedWidgets.push(`
66
+ <div style="padding:10px;background:#ffe;border:1px solid #fc0;color:#aa0">
67
+ ⚠️ Error rendering widget '${widget.widget}': ${err.message}
68
+ </div>
69
+ `);
70
+ }
71
+ }
72
+ return new nunjucks_1.default.runtime.SafeString(renderedWidgets.join("\n"));
73
+ }
74
+ })();
@@ -0,0 +1,10 @@
1
+ import nunjucks from "nunjucks";
2
+ declare const _default: {
3
+ tags: string[];
4
+ parse(parser: any, nodes: any): any;
5
+ run({ ctx, env }: {
6
+ ctx: any;
7
+ env: nunjucks.Environment;
8
+ }): nunjucks.runtime.SafeString;
9
+ };
10
+ export default _default;
@@ -0,0 +1,43 @@
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
+ const nunjucks_1 = __importDefault(require("nunjucks"));
7
+ const normalizeWidgetPath_1 = require("../../utils/normalizeWidgetPath");
8
+ exports.default = new (class WidgetExtension {
9
+ constructor() {
10
+ this.tags = ["footer"];
11
+ }
12
+ parse(parser, nodes) {
13
+ const tok = parser.nextToken();
14
+ const args = parser.parseSignature(true, true); // مستقبلًا نقدر نمرر widget name
15
+ parser.advanceAfterBlockEnd(tok.value);
16
+ return new nodes.CallExtension(this, "run", args);
17
+ }
18
+ run({ ctx, env }) {
19
+ try {
20
+ const pageRenderData = env.getGlobal("pageRenderData");
21
+ const footer = pageRenderData?.system?.footer;
22
+ if (!footer) {
23
+ throw new Error("Footer data is missing in pageRenderData.system.footer");
24
+ }
25
+ const widgetPath = (0, normalizeWidgetPath_1.normalizeWidgetPath)(footer.Widget || "footer");
26
+ const rendered = env.render(widgetPath, {
27
+ ...ctx,
28
+ footer: {
29
+ data: footer.data,
30
+ },
31
+ });
32
+ return new nunjucks_1.default.runtime.SafeString(rendered);
33
+ }
34
+ catch (err) {
35
+ return new nunjucks_1.default.runtime.SafeString(`
36
+ <div style="padding: 12px; background-color: #fdecea; color: #b71c1c; border: 1px solid #f5c6cb; border-radius: 4px; margin: 8px 0;">
37
+ ⚠️ <strong>تعذر تضمين الـ Footer Widget:</strong><br>
38
+ <code>${err.message}</code>
39
+ </div>
40
+ `);
41
+ }
42
+ }
43
+ })();
@@ -0,0 +1,10 @@
1
+ import nunjucks from "nunjucks";
2
+ declare const _default: {
3
+ tags: string[];
4
+ parse(parser: any, nodes: any): any;
5
+ run({ ctx, env }: {
6
+ ctx: any;
7
+ env: nunjucks.Environment;
8
+ }): nunjucks.runtime.SafeString;
9
+ };
10
+ export default _default;
@@ -0,0 +1,51 @@
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
+ const nunjucks_1 = __importDefault(require("nunjucks"));
7
+ const normalizeWidgetPath_1 = require("../../utils/normalizeWidgetPath");
8
+ const resolveTranslations_1 = require("../../utils/resolveTranslations");
9
+ exports.default = new (class WidgetExtension {
10
+ constructor() {
11
+ this.tags = ["footer"];
12
+ }
13
+ parse(parser, nodes) {
14
+ const tok = parser.nextToken();
15
+ const args = parser.parseSignature(true, true); // مستقبلًا نقدر نمرر widget name
16
+ parser.advanceAfterBlockEnd(tok.value);
17
+ return new nodes.CallExtension(this, "run", args);
18
+ }
19
+ run({ ctx, env }) {
20
+ try {
21
+ const setting = env.getGlobal("settings");
22
+ const footer = setting?.footer;
23
+ if (!footer) {
24
+ throw new Error("Footer data is missing in engineData.system.footer");
25
+ }
26
+ const widgetPath = (0, normalizeWidgetPath_1.normalizeWidgetPath)(footer.Widget || "footer");
27
+ if (!widgetPath) {
28
+ return new nunjucks_1.default.runtime.SafeString(`
29
+ <div style="padding: 12px; background-color: #f8d7da; color: #721c24; border: 1px solid #f5c6cb; border-radius: 4px; margin: 8px 0;">
30
+ ⚠️ <strong>مسار الويجيت غير صالح:</strong> ${footer.Widget}
31
+ </div>
32
+ `);
33
+ }
34
+ const rendered = env.render(widgetPath, {
35
+ ...ctx,
36
+ footer: {
37
+ data: (0, resolveTranslations_1.resolveTranslations)(footer.data, env.getGlobal("t")),
38
+ },
39
+ });
40
+ return new nunjucks_1.default.runtime.SafeString(rendered);
41
+ }
42
+ catch (err) {
43
+ return new nunjucks_1.default.runtime.SafeString(`
44
+ <div style="padding: 12px; background-color: #fdecea; color: #b71c1c; border: 1px solid #f5c6cb; border-radius: 4px; margin: 8px 0;">
45
+ ⚠️ <strong>تعذر تضمين الـ Footer Widget:</strong><br>
46
+ <code>${err.message}</code>
47
+ </div>
48
+ `);
49
+ }
50
+ }
51
+ })();
@@ -0,0 +1,8 @@
1
+ import nunjucks from 'nunjucks';
2
+ declare const _default: {
3
+ tags: string[];
4
+ parse(parser: any, nodes: any): any;
5
+ run(context: any, type: string, options: any | undefined, body: any): nunjucks.runtime.SafeString;
6
+ getDefaultAction(type: string): string;
7
+ };
8
+ export default _default;
@@ -0,0 +1,41 @@
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
+ const nunjucks_1 = __importDefault(require("nunjucks"));
7
+ exports.default = new (class FormExtension {
8
+ constructor() {
9
+ this.tags = ['form'];
10
+ }
11
+ parse(parser, nodes) {
12
+ const tok = parser.nextToken();
13
+ const args = parser.parseSignature(true, true);
14
+ parser.advanceAfterBlockEnd(tok.value);
15
+ const body = parser.parseUntilBlocks('endform');
16
+ parser.advanceAfterBlockEnd();
17
+ return new nodes.CallExtension(this, 'run', args, [body]);
18
+ }
19
+ run(context, type, options = {}, body) {
20
+ const method = options.method || 'POST';
21
+ const action = options.action || this.getDefaultAction(type);
22
+ return new nunjucks_1.default.runtime.SafeString(`
23
+ <form method="${method}" action="${action}">
24
+ ${body()}
25
+ </form>
26
+ `);
27
+ }
28
+ // 🟢 خلتها public بدون أي كلمة
29
+ getDefaultAction(type) {
30
+ switch (type) {
31
+ case 'search':
32
+ return '/search';
33
+ case 'customer_login':
34
+ return '/account/login';
35
+ case 'product':
36
+ return '/cart/add';
37
+ default:
38
+ return '/';
39
+ }
40
+ }
41
+ })();
@@ -0,0 +1,10 @@
1
+ import nunjucks from "nunjucks";
2
+ declare const _default: {
3
+ tags: string[];
4
+ parse(parser: any, nodes: any): any;
5
+ run({ ctx, env }: {
6
+ ctx: any;
7
+ env: nunjucks.Environment;
8
+ }, widgetPath: string): nunjucks.runtime.SafeString;
9
+ };
10
+ export default _default;
@@ -0,0 +1,33 @@
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
+ const nunjucks_1 = __importDefault(require("nunjucks"));
7
+ const normalizeWidgetPath_1 = require("../../utils/normalizeWidgetPath");
8
+ exports.default = new (class WidgetExtension {
9
+ constructor() {
10
+ this.tags = ["widgets"];
11
+ }
12
+ parse(parser, nodes) {
13
+ const tok = parser.nextToken();
14
+ const args = parser.parseSignature(true, true);
15
+ parser.advanceAfterBlockEnd(tok.value);
16
+ return new nodes.CallExtension(this, "run", args);
17
+ }
18
+ run({ ctx, env }, widgetPath) {
19
+ const widget = (0, normalizeWidgetPath_1.normalizeWidgetPath)(widgetPath);
20
+ try {
21
+ console.log("🚀 ~ WidgetExtension ~ run ~ ctx:", env.getGlobal("pageRenderData"));
22
+ const rendered = env.render(widget, ctx);
23
+ return new nunjucks_1.default.runtime.SafeString(rendered);
24
+ }
25
+ catch (err) {
26
+ return new nunjucks_1.default.runtime.SafeString(`
27
+ <div style="padding: 12px; background-color: #f8d7da; color: #721c24; border: 1px solid #f5c6cb; border-radius: 4px; margin: 8px 0;">
28
+ ⚠️ <strong>تعذر تضمين الويجيت:</strong> ${widget}
29
+ </div>
30
+ `);
31
+ }
32
+ }
33
+ })();
@@ -0,0 +1,10 @@
1
+ import nunjucks from "nunjucks";
2
+ declare const _default: {
3
+ tags: string[];
4
+ parse(parser: any, nodes: any): any;
5
+ run({ ctx, env }: {
6
+ ctx: any;
7
+ env: nunjucks.Environment;
8
+ }): nunjucks.runtime.SafeString;
9
+ };
10
+ export default _default;
@@ -0,0 +1,51 @@
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
+ const nunjucks_1 = __importDefault(require("nunjucks"));
7
+ const normalizeWidgetPath_1 = require("../../utils/normalizeWidgetPath");
8
+ const resolveTranslations_1 = require("../../utils/resolveTranslations");
9
+ exports.default = new (class HeaderExtension {
10
+ constructor() {
11
+ this.tags = ["header"];
12
+ }
13
+ parse(parser, nodes) {
14
+ const tok = parser.nextToken();
15
+ const args = parser.parseSignature(true, true);
16
+ parser.advanceAfterBlockEnd(tok.value);
17
+ return new nodes.CallExtension(this, "run", args);
18
+ }
19
+ run({ ctx, env }) {
20
+ try {
21
+ const setting = env.getGlobal("settings");
22
+ const header = setting?.header;
23
+ if (!header) {
24
+ throw new Error("Header data is missing in engineData.system.header");
25
+ }
26
+ const widgetPath = (0, normalizeWidgetPath_1.normalizeWidgetPath)("header");
27
+ if (!widgetPath) {
28
+ return new nunjucks_1.default.runtime.SafeString(`
29
+ <div style="padding: 12px; background-color: #f8d7da; color: #721c24; border: 1px solid #f5c6cb; border-radius: 4px; margin: 8px 0;">
30
+ ⚠️ <strong>مسار الويجيت غير صالح:</strong> ${header.Widget}
31
+ </div>
32
+ `);
33
+ }
34
+ const rendered = env.render(widgetPath, {
35
+ ...ctx,
36
+ header: {
37
+ data: (0, resolveTranslations_1.resolveTranslations)(header, env.getGlobal("t")),
38
+ },
39
+ });
40
+ return new nunjucks_1.default.runtime.SafeString(rendered);
41
+ }
42
+ catch (err) {
43
+ return new nunjucks_1.default.runtime.SafeString(`
44
+ <div style="padding: 12px; background-color: #fdecea; color: #b71c1c; border: 1px solid #f5c6cb; border-radius: 4px; margin: 8px 0;">
45
+ ⚠️ <strong>تعذر تضمين الـ Header Widget:</strong><br>
46
+ <code>${err.message}</code>
47
+ </div>
48
+ `);
49
+ }
50
+ }
51
+ })();
@@ -0,0 +1,7 @@
1
+ import { runtime } from "nunjucks";
2
+ declare const _default: {
3
+ tags: string[];
4
+ parse(parser: any, nodes: any): any;
5
+ run({ env, ctx }: any): runtime.SafeString;
6
+ };
7
+ export default _default;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const nunjucks_1 = require("nunjucks");
4
+ exports.default = new (class SeoExtension {
5
+ constructor() {
6
+ this.tags = ["qumra_head"];
7
+ }
8
+ parse(parser, nodes) {
9
+ const tok = parser.nextToken();
10
+ parser.advanceAfterBlockEnd(tok.value);
11
+ return new nodes.CallExtension(this, "run", null);
12
+ }
13
+ run({ env, ctx }) {
14
+ const contextData = JSON.stringify({ ...ctx.context || {} });
15
+ return new nunjucks_1.runtime.SafeString(`
16
+ <script>
17
+ window.__qumra__ = window.__qumra__ || {};
18
+ window.__qumra__.context = ${contextData};
19
+ </script>
20
+ <style>
21
+ :root {
22
+ --primary-color: #0070f3;
23
+ --secondary-color: #7928ca;
24
+ --background-color: #f9f9f9;
25
+ --text-color: #333333;
26
+ --border-color: #eaeaea;
27
+ --success-color: #22c55e;
28
+ --danger-color: #ef4444;
29
+ --warning-color: #facc15;
30
+ }
31
+ </style>
32
+ `);
33
+ }
34
+ })();
@@ -0,0 +1,6 @@
1
+ import nunjucks from 'nunjucks';
2
+ export default class SchemaExtension implements nunjucks.Extension {
3
+ tags: string[];
4
+ parse(parser: any, nodes: any): any;
5
+ run(context: any, body: () => string): string;
6
+ }
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class SchemaExtension {
4
+ constructor() {
5
+ this.tags = ['schema'];
6
+ }
7
+ parse(parser, nodes) {
8
+ const tok = parser.nextToken();
9
+ const body = parser.parseUntilBlocks('endschema');
10
+ parser.advanceAfterBlockEnd();
11
+ return new nodes.CallExtension(this, 'run', null, [body]);
12
+ }
13
+ run(context, body) {
14
+ const schemaString = body().trim();
15
+ try {
16
+ const parsed = JSON.parse(schemaString);
17
+ context.ctx.__schema = parsed;
18
+ }
19
+ catch (err) {
20
+ console.warn('خطأ في schema:', err);
21
+ context.ctx.__schema = null;
22
+ }
23
+ return '';
24
+ }
25
+ }
26
+ exports.default = SchemaExtension;
File without changes
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1,7 @@
1
+ import { runtime } from "nunjucks";
2
+ declare const _default: {
3
+ tags: string[];
4
+ parse(parser: any, nodes: any): any;
5
+ run({ env, ctx, blocks }: any): runtime.SafeString;
6
+ };
7
+ export default _default;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const nunjucks_1 = require("nunjucks");
4
+ exports.default = new (class SeoExtension {
5
+ constructor() {
6
+ this.tags = ["seo"];
7
+ }
8
+ parse(parser, nodes) {
9
+ const tok = parser.nextToken();
10
+ parser.advanceAfterBlockEnd(tok.value);
11
+ return new nodes.CallExtension(this, "run", null);
12
+ }
13
+ run({ env, ctx, blocks }) {
14
+ const pageSeo = ctx.context.page?.seo || {};
15
+ const page = ctx.context.page || {};
16
+ const appUrl = ctx.globals?.app?.url || "";
17
+ const pageUrl = `${appUrl}${page.path || ""}`;
18
+ const pageTitle = pageSeo.title || page.title || "Store";
19
+ const pageDescription = pageSeo.description || "";
20
+ const pageKeywords = (pageSeo.keywords || []).join(", ");
21
+ const pageImage = pageSeo.image || "";
22
+ return new nunjucks_1.runtime.SafeString(`
23
+ <title>${pageTitle}</title>
24
+ <meta name="description" content="${pageDescription}">
25
+ <meta name="keywords" content="${pageKeywords}">
26
+ <link rel="canonical" href="${pageSeo.canonicalUrl || pageUrl}">
27
+ <meta property="og:title" content="${pageTitle}">
28
+ <meta property="og:description" content="${pageDescription}">
29
+ <meta property="og:image" content="${pageImage}">
30
+ `);
31
+ }
32
+ })();
@@ -0,0 +1,7 @@
1
+ import { runtime } from "nunjucks";
2
+ declare const _default: {
3
+ tags: string[];
4
+ parse(parser: any, nodes: any): any;
5
+ run({ env, ctx, blocks }: any): runtime.SafeString;
6
+ };
7
+ export default _default;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const nunjucks_1 = require("nunjucks");
4
+ exports.default = new (class SeoExtension {
5
+ constructor() {
6
+ this.tags = ["seo"];
7
+ }
8
+ parse(parser, nodes) {
9
+ const tok = parser.nextToken();
10
+ parser.advanceAfterBlockEnd(tok.value);
11
+ return new nodes.CallExtension(this, "run", null);
12
+ }
13
+ run({ env, ctx, blocks }) {
14
+ const pageSeo = ctx.context.page?.seo || {};
15
+ const page = ctx.context.page || {};
16
+ const appUrl = ctx.globals?.app?.url || "";
17
+ const pageUrl = `${appUrl}${page.path || ""}`;
18
+ const pageTitle = pageSeo.title || page.title || "Store";
19
+ const pageDescription = pageSeo.description || "";
20
+ const pageKeywords = (pageSeo.keywords || []).join(", ");
21
+ const pageImage = pageSeo.image || "";
22
+ return new nunjucks_1.runtime.SafeString(`
23
+ <title>${pageTitle}</title>
24
+ <meta name="description" content="${pageDescription}">
25
+ <meta name="keywords" content="${pageKeywords}">
26
+ <link rel="canonical" href="${pageSeo.canonicalUrl || pageUrl}">
27
+ <meta property="og:title" content="${pageTitle}">
28
+ <meta property="og:description" content="${pageDescription}">
29
+ <meta property="og:image" content="${pageImage}">
30
+ `);
31
+ }
32
+ })();
@@ -0,0 +1 @@
1
+ export default function t(key: string): string;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = t;
4
+ const locals_1 = require("../../store/locals");
5
+ const getNestedValue_1 = require("../../utils/getNestedValue");
6
+ function t(key) {
7
+ const dict = (0, locals_1.getLocales)("locales") || {};
8
+ const result = (0, getNestedValue_1.getNestedValue)(dict, key);
9
+ return typeof result === "string" ? result : key;
10
+ }
@@ -0,0 +1,10 @@
1
+ import nunjucks from "nunjucks";
2
+ declare const _default: {
3
+ tags: string[];
4
+ parse(parser: any, nodes: any): any;
5
+ run({ ctx, env }: {
6
+ ctx: any;
7
+ env: nunjucks.Environment;
8
+ }, widgetPath: string): nunjucks.runtime.SafeString;
9
+ };
10
+ export default _default;