qumra-engine 1.0.21 → 1.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/index.js +16 -0
- package/app/src/locales/ar.json +25 -0
- package/app/src/locales/en.json +25 -0
- package/app/src/locales/es.json +25 -0
- package/app/src/locales/fr.json +25 -0
- package/app/src/views/forms.njk +18 -0
- package/app/src/views/home.njk +24 -0
- package/package.json +1 -1
- package/dist/bundle.cjs.js.map +0 -1
- package/dist/bundle.esm.js.map +0 -1
package/app/index.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const express = require('express');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const createNunjucksMiddleware = require('../lib');
|
|
4
|
+
|
|
5
|
+
const app = express();
|
|
6
|
+
|
|
7
|
+
app.use("*",createNunjucksMiddleware(app, {
|
|
8
|
+
viewsDirectory: path.join(__dirname, "src" , 'views'),
|
|
9
|
+
secretKey: "5cd7670387f5eed1ea597d46dbb45d791516a02b7df3c8e9f81f59a9266ad7ca",
|
|
10
|
+
watch: true,
|
|
11
|
+
}));
|
|
12
|
+
|
|
13
|
+
// تشغيل الخادم
|
|
14
|
+
app.listen(3000, () => {
|
|
15
|
+
console.log('Server is running on http://localhost:3000');
|
|
16
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"blocks": {
|
|
3
|
+
"header": {
|
|
4
|
+
"cart": "السلة"
|
|
5
|
+
},
|
|
6
|
+
"appBanner": {
|
|
7
|
+
"download_now": "حمله الان"
|
|
8
|
+
}
|
|
9
|
+
},
|
|
10
|
+
"pages": {
|
|
11
|
+
"cart": {
|
|
12
|
+
"cart_options": "خيارات السلة"
|
|
13
|
+
},
|
|
14
|
+
"order": {
|
|
15
|
+
"can_edit_or_delete_your_review_within": "يمكنك تعديل أو حذف تقييمك خلال",
|
|
16
|
+
"edit_period_ended": "تم انتهاء المدة المحددة لتعديل التقييم",
|
|
17
|
+
"delete_period_ended": "تم انتهاء المدة المحددة لحذف التقييم",
|
|
18
|
+
"days_since_added": "أيام من إضافته"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"common": {
|
|
22
|
+
"bank_offer_sub_title_multiple": "ادفع قيمة مشترياتك عبر أحد البطاقات البنكة التالية واحصل على الخصم المحدد",
|
|
23
|
+
"bank_offer_sub_title_single": "ادفع قيمة مشترياتك عبر أحد بطاقات بنك :bank_name واحصل على خصم بنسبة "
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"blocks": {
|
|
3
|
+
"header": {
|
|
4
|
+
"cart": "Cart"
|
|
5
|
+
},
|
|
6
|
+
"appBanner": {
|
|
7
|
+
"download_now": "download now"
|
|
8
|
+
}
|
|
9
|
+
},
|
|
10
|
+
"pages": {
|
|
11
|
+
"cart": {
|
|
12
|
+
"cart_options": "Cart Options"
|
|
13
|
+
},
|
|
14
|
+
"order": {
|
|
15
|
+
"can_edit_or_delete_your_review_within": "You can edit or delete your review within",
|
|
16
|
+
"edit_period_ended": "The period to edit the review has ended",
|
|
17
|
+
"delete_period_ended": "The period to delete the review has ended",
|
|
18
|
+
"days_since_added": "days since it was added"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"common": {
|
|
22
|
+
"bank_offer_sub_title_multiple": "Pay for your purchases via one of the following bank cards and get the specified discount",
|
|
23
|
+
"bank_offer_sub_title_single": "Pay for your purchases via :bank_name bank card and get discount"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"blocks": {
|
|
3
|
+
"header": {
|
|
4
|
+
"cart": "Panier9999999"
|
|
5
|
+
},
|
|
6
|
+
"appBanner": {
|
|
7
|
+
"download_now": "télécharger maintenant"
|
|
8
|
+
}
|
|
9
|
+
},
|
|
10
|
+
"pages": {
|
|
11
|
+
"cart": {
|
|
12
|
+
"cart_options": "Options du panier"
|
|
13
|
+
},
|
|
14
|
+
"order": {
|
|
15
|
+
"can_edit_or_delete_your_review_within": "Vous pouvez modifier ou supprimer votre avis dans",
|
|
16
|
+
"edit_period_ended": "La période pour modifier l'avis est terminée",
|
|
17
|
+
"delete_period_ended": "La période pour supprimer l'avis est terminée",
|
|
18
|
+
"days_since_added": "jours depuis son ajout"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"common": {
|
|
22
|
+
"bank_offer_sub_title_multiple": "Payez vos achats avec l'une des cartes bancaires suivantes et obtenez la réduction spécifiée",
|
|
23
|
+
"bank_offer_sub_title_single": "Payez vos achats avec la carte bancaire :bank_name et obtenez une réduction"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"blocks": {
|
|
3
|
+
"header": {
|
|
4
|
+
"cart": "Panier"
|
|
5
|
+
},
|
|
6
|
+
"appBanner": {
|
|
7
|
+
"download_now": "télécharger maintenant"
|
|
8
|
+
}
|
|
9
|
+
},
|
|
10
|
+
"pages": {
|
|
11
|
+
"cart": {
|
|
12
|
+
"cart_options": "Options du panier"
|
|
13
|
+
},
|
|
14
|
+
"order": {
|
|
15
|
+
"can_edit_or_delete_your_review_within": "Vous pouvez modifier ou supprimer votre avis dans",
|
|
16
|
+
"edit_period_ended": "La période pour modifier l'avis est terminée",
|
|
17
|
+
"delete_period_ended": "La période pour supprimer l'avis est terminée",
|
|
18
|
+
"days_since_added": "jours depuis son ajout"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"common": {
|
|
22
|
+
"bank_offer_sub_title_multiple": "Payez vos achats avec l'une des cartes bancaires suivantes et obtenez la réduction spécifiée",
|
|
23
|
+
"bank_offer_sub_title_single": "Payez vos achats avec la carte bancaire :bank_name et obtenez une réduction"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{% macro field(name, value = '', type = 'text') %}
|
|
2
|
+
<div class="field">
|
|
3
|
+
<p>
|
|
4
|
+
{{"123456789" | reverse}}
|
|
5
|
+
</p>
|
|
6
|
+
<input type="{{ type }}" name="{{ name }}"
|
|
7
|
+
value="{{ value | escape }}"/>
|
|
8
|
+
</div>
|
|
9
|
+
{% endmacro %}
|
|
10
|
+
|
|
11
|
+
{% macro label(text) %}
|
|
12
|
+
<div>
|
|
13
|
+
<p>
|
|
14
|
+
{{"123456789" | assets}}
|
|
15
|
+
</p>
|
|
16
|
+
<label>{{ text }}</label>
|
|
17
|
+
</div>
|
|
18
|
+
{% endmacro %}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{% import "forms.njk" as forms %}
|
|
2
|
+
|
|
3
|
+
<html lang="en">
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="UTF-8">
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
|
+
<title>Document</title>
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
|
|
11
|
+
{{ set('theme_color', '#ffaaa0000') }}
|
|
12
|
+
{{ set('font_size', '16px') }}
|
|
13
|
+
|
|
14
|
+
{{ forms.label('Username') }}
|
|
15
|
+
|
|
16
|
+
{{fingerprint.hash}}
|
|
17
|
+
{{"123456789" | reverse}}
|
|
18
|
+
<div>{{t("blocks.header.cart", "no")}}</div>
|
|
19
|
+
asd
|
|
20
|
+
<div>
|
|
21
|
+
Default Background Color: {{ get('theme_color', '#ffffff') }}
|
|
22
|
+
</div>
|
|
23
|
+
</body>
|
|
24
|
+
</html>
|
package/package.json
CHANGED
package/dist/bundle.cjs.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bundle.cjs.js","sources":["../lib/utils/CookieParser.js","../lib/index.js"],"sourcesContent":["const CookieParser = (setCookieHeader) => {\n const cookies = {};\n\n // تقسيم الكوكيز بناءً على الفواصل، مع التعامل مع الفواصل داخل القيم\n const cookiePairs = setCookieHeader.split(/,(?![^\\(\\)]+\\))/);\n\n cookiePairs.forEach(cookieStr => {\n const parts = cookieStr.split(';');\n const [nameValue] = parts;\n const [name, value] = nameValue.split('=');\n\n if (name && value) {\n // إزالة المسافات البيضاء\n const trimmedName = name.trim();\n const trimmedValue = value.trim();\n \n // تهيئة الكائن للكوكي إذا لم يكن موجوداً\n if (!cookies[trimmedName]) {\n cookies[trimmedName] = {\n value: trimmedValue,\n attributes: {}\n };\n }\n\n // إضافة العلامات الأخرى\n for (let i = 1; i < parts.length; i++) {\n const [attributeName, attributeValue] = parts[i].split('=');\n if (attributeName) {\n cookies[trimmedName].attributes[attributeName.trim()] = attributeValue ? attributeValue.trim() : true;\n }\n }\n }\n });\n\n return cookies;\n}\nmodule.exports = CookieParser","const nunjucks = require(\"nunjucks\");\nconst path = require(\"path\");\nconst Fingerprint = require(\"express-fingerprint\");\nconst CookieParser = require(\"./utils/CookieParser\");\nconst fs = require(\"fs\")\nfunction extractLanguageAndPath(path) {\n // Regular expression to match the /[lang]/[path] pattern\n const langPattern = /^\\/([a-z]{2})\\/(.*)$/;\n const rootPattern = /^\\/([a-z]{2})$/;\n\n let result = {\n language: 'ar', // Default language is Arabic\n path: null\n };\n\n // Check if the path matches the /[lang]/[path] pattern\n let match = path.match(langPattern);\n if (match) {\n result.language = match[1]; // Extract language\n result.path = `/${match[2]}`; // Extract path\n } else {\n // Check if the path matches the /[lang] pattern\n match = path.match(rootPattern);\n if (match) {\n result.language = match[1]; // Extract language\n result.path = '/'; // Root path\n } else {\n // If the path does not match any pattern, consider the entire path as path and language as default\n result.path = path;\n }\n }\n\n return result;\n}\nfunction createNunjucksMiddleware(app, options = {}) {\n const viewsDirectory = options.viewsDirectory;\n const localesDirectory = path.join(viewsDirectory , \"../\", 'locales'); // الرجوع خطوة واحدة إلى مستوى أعلى ثم الوصول إلى مجلد locales\n\n // إعداد Nunjucks\n const env = nunjucks.configure(viewsDirectory, {\n autoescape: true,\n express: app,\n watch: options.watch || false,\n noCache: options.noCache || false,\n });\n\n const defaultFilters = {\n upperCase: (str) => str.toUpperCase(),\n reverse: (str) => str.split(\"\").reverse().join(\"\"),\n capitalize: (str) => str.charAt(0).toUpperCase() + str.slice(1).toLowerCase(),\n formatCurrency: (amount, symbol = \"$\") => symbol + parseFloat(amount).toFixed(2),\n money: () => \"ToDo\",\n date: (date, format = \"YYYY-MM-DD\") => new Date(date).toISOString().split(\"T\")[0],\n applyDiscount: (price, discountPercent) => price - price * (discountPercent / 100),\n addVAT: (price, vatPercent = 15) => price + price * (vatPercent / 100),\n pluralize: (quantity, singular, plural) => quantity === 1 ? singular : plural,\n truncate: (str, length = 100) => str.length > length ? str.slice(0, length) + \"...\" : str,\n trimSpaces: (str) => str.trim(),\n isEmpty: (str) => !str || str.trim().length === 0,\n slugify: (str) => str.toLowerCase().replace(/\\s+/g, \"-\").replace(/[^\\w-]+/g, \"\"),\n formatNumber: (num) => num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"),\n assets: (path) => env.getGlobal(\"assets\"),\n cdn: (path) => env.getGlobal(\"cdn\"),\n };\n\n // إضافة الفلترات المدمجة إلى بيئة Nunjucks\n for (const filterName in defaultFilters) {\n env.addFilter(filterName, defaultFilters[filterName]);\n }\n\n const locales = {};\n fs.readdirSync(localesDirectory).forEach(file => {\n if (file.endsWith('.json')) {\n const localeName = path.basename(file, '.json');\n locales[localeName] = require(path.join(localesDirectory, file));\n }\n });\n\n\n\n const globalVars = {};\n\n app.use(async (req, res, next) => {\n const { originalUrl } = req;\n const newPath = extractLanguageAndPath(originalUrl);\n globalVars['lang'] = newPath.language;\n next();\n })\n\n env.addGlobal(\"set\", function (key, value) {\n globalVars[key] = value;\n });\n\n env.addGlobal(\"get\", function (key, defaultValue = null) {\n return globalVars[key] || defaultValue;\n });\n\n function getNestedValue(obj, key) {\n return key.split('.').reduce((acc, part) => acc && acc[part], obj);\n }\n\n env.addGlobal(\"t\", function (key, defaultValue = '') {\n console.log(\"🚀 ~ globalVars:\", globalVars)\n const lang = globalVars['lang'] || 'ar';\n const locale = locales[lang];\n return locale ? getNestedValue(locale, key) || defaultValue : defaultValue;\n });\n\n app.use(\n Fingerprint({\n parameters: [\n Fingerprint.useragent,\n Fingerprint.acceptHeaders,\n Fingerprint.geoip,\n function (next) {\n next(null, { param1: \"value1\" });\n },\n function (next) {\n next(null, { param2: \"value2\" });\n },\n ],\n })\n );\n\n app.use(async (req, res, next) => {\n const { originalUrl, protocol } = req;\n const fullUrl = `${protocol}://${req.get(\"host\")}${originalUrl}`;\n const url = `https://api.qumra.cloud/templateEngine/v1/render?path=${encodeURIComponent(fullUrl)}`;\n const headers = {\n \"Content-Type\": \"application/json\",\n secretKey: options.secretKey,\n fingerprint: req.fingerprint.hash,\n \"User-Agent\": req.get(\"User-Agent\") || \"\",\n Referer: req.get(\"Referer\") || \"\",\n };\n const config = { headers };\n\n const response = await fetch(url, config);\n const resHeaders = response.headers.getSetCookie();\n if (resHeaders) {\n resHeaders.forEach((header) => {\n const parsedCookies = CookieParser(header);\n Object.keys(parsedCookies).forEach((name) => {\n const { value, attributes } = parsedCookies[name];\n res.cookie(name, value, attributes);\n });\n });\n }\n\n const data = await response.json();\n console.log(\"🚀 ~ app.use ~ data:\", data)\n const { global } = data;\n for (const key in global) {\n if (Object.hasOwnProperty.call(global, key)) {\n env.addGlobal(key, global[key]);\n }\n }\n\n next();\n });\n\n return async (req, res, next) => {\n res.render(\"index.njk\", {\n title: \"Welcome\",\n message: \"Hello from Nunjucks with custom middleware!\",\n cdn: \"https://your-cdn-url.com/\",\n fingerprint: req.fingerprint,\n });\n };\n}\n\nmodule.exports = createNunjucksMiddleware;"],"names":["CookieParser_1","setCookieHeader","cookies","split","forEach","cookieStr","parts","_parts","_slicedToArray","_nameValue$split2","name","value","trimmedName","trim","trimmedValue","attributes","i","length","_parts$i$split2","attributeName","attributeValue","nunjucks","require$$0","path","require$$1","Fingerprint","require$$2","CookieParser","require$$3","fs","require$$4","extractLanguageAndPath","result","language","match","concat","app","options","arguments","undefined","viewsDirectory","localesDirectory","join","env","configure","autoescape","express","watch","noCache","defaultFilters","upperCase","str","toUpperCase","reverse","capitalize","charAt","slice","toLowerCase","formatCurrency","amount","parseFloat","toFixed","money","date","Date","toISOString","applyDiscount","price","discountPercent","addVAT","pluralize","quantity","singular","plural","truncate","trimSpaces","isEmpty","slugify","replace","formatNumber","num","toString","assets","getGlobal","cdn","filterName","addFilter","locales","readdirSync","file","endsWith","localeName","basename","require","globalVars","use","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","req","res","next","originalUrl","newPath","wrap","_context","prev","stop","_x","_x2","_x3","apply","this","addGlobal","key","defaultValue","console","log","lang","locale","obj","reduce","acc","part","getNestedValue","parameters","useragent","acceptHeaders","geoip","param1","param2","_ref2","_callee2","protocol","fullUrl","url","headers","config","response","resHeaders","data","global","_context2","get","encodeURIComponent","secretKey","fingerprint","hash","Referer","fetch","sent","getSetCookie","header","parsedCookies","Object","keys","_parsedCookies$name","cookie","json","hasOwnProperty","call","_x4","_x5","_x6","_ref3","_callee3","_context3","render","title","message","_x7","_x8","_x9"],"mappings":"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"}
|
package/dist/bundle.esm.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bundle.esm.js","sources":["../lib/utils/CookieParser.js","../lib/index.js"],"sourcesContent":["const CookieParser = (setCookieHeader) => {\n const cookies = {};\n\n // تقسيم الكوكيز بناءً على الفواصل، مع التعامل مع الفواصل داخل القيم\n const cookiePairs = setCookieHeader.split(/,(?![^\\(\\)]+\\))/);\n\n cookiePairs.forEach(cookieStr => {\n const parts = cookieStr.split(';');\n const [nameValue] = parts;\n const [name, value] = nameValue.split('=');\n\n if (name && value) {\n // إزالة المسافات البيضاء\n const trimmedName = name.trim();\n const trimmedValue = value.trim();\n \n // تهيئة الكائن للكوكي إذا لم يكن موجوداً\n if (!cookies[trimmedName]) {\n cookies[trimmedName] = {\n value: trimmedValue,\n attributes: {}\n };\n }\n\n // إضافة العلامات الأخرى\n for (let i = 1; i < parts.length; i++) {\n const [attributeName, attributeValue] = parts[i].split('=');\n if (attributeName) {\n cookies[trimmedName].attributes[attributeName.trim()] = attributeValue ? attributeValue.trim() : true;\n }\n }\n }\n });\n\n return cookies;\n}\nmodule.exports = CookieParser","const nunjucks = require(\"nunjucks\");\nconst path = require(\"path\");\nconst Fingerprint = require(\"express-fingerprint\");\nconst CookieParser = require(\"./utils/CookieParser\");\nconst fs = require(\"fs\")\nfunction extractLanguageAndPath(path) {\n // Regular expression to match the /[lang]/[path] pattern\n const langPattern = /^\\/([a-z]{2})\\/(.*)$/;\n const rootPattern = /^\\/([a-z]{2})$/;\n\n let result = {\n language: 'ar', // Default language is Arabic\n path: null\n };\n\n // Check if the path matches the /[lang]/[path] pattern\n let match = path.match(langPattern);\n if (match) {\n result.language = match[1]; // Extract language\n result.path = `/${match[2]}`; // Extract path\n } else {\n // Check if the path matches the /[lang] pattern\n match = path.match(rootPattern);\n if (match) {\n result.language = match[1]; // Extract language\n result.path = '/'; // Root path\n } else {\n // If the path does not match any pattern, consider the entire path as path and language as default\n result.path = path;\n }\n }\n\n return result;\n}\nfunction createNunjucksMiddleware(app, options = {}) {\n const viewsDirectory = options.viewsDirectory;\n const localesDirectory = path.join(viewsDirectory , \"../\", 'locales'); // الرجوع خطوة واحدة إلى مستوى أعلى ثم الوصول إلى مجلد locales\n\n // إعداد Nunjucks\n const env = nunjucks.configure(viewsDirectory, {\n autoescape: true,\n express: app,\n watch: options.watch || false,\n noCache: options.noCache || false,\n });\n\n const defaultFilters = {\n upperCase: (str) => str.toUpperCase(),\n reverse: (str) => str.split(\"\").reverse().join(\"\"),\n capitalize: (str) => str.charAt(0).toUpperCase() + str.slice(1).toLowerCase(),\n formatCurrency: (amount, symbol = \"$\") => symbol + parseFloat(amount).toFixed(2),\n money: () => \"ToDo\",\n date: (date, format = \"YYYY-MM-DD\") => new Date(date).toISOString().split(\"T\")[0],\n applyDiscount: (price, discountPercent) => price - price * (discountPercent / 100),\n addVAT: (price, vatPercent = 15) => price + price * (vatPercent / 100),\n pluralize: (quantity, singular, plural) => quantity === 1 ? singular : plural,\n truncate: (str, length = 100) => str.length > length ? str.slice(0, length) + \"...\" : str,\n trimSpaces: (str) => str.trim(),\n isEmpty: (str) => !str || str.trim().length === 0,\n slugify: (str) => str.toLowerCase().replace(/\\s+/g, \"-\").replace(/[^\\w-]+/g, \"\"),\n formatNumber: (num) => num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"),\n assets: (path) => env.getGlobal(\"assets\"),\n cdn: (path) => env.getGlobal(\"cdn\"),\n };\n\n // إضافة الفلترات المدمجة إلى بيئة Nunjucks\n for (const filterName in defaultFilters) {\n env.addFilter(filterName, defaultFilters[filterName]);\n }\n\n const locales = {};\n fs.readdirSync(localesDirectory).forEach(file => {\n if (file.endsWith('.json')) {\n const localeName = path.basename(file, '.json');\n locales[localeName] = require(path.join(localesDirectory, file));\n }\n });\n\n\n\n const globalVars = {};\n\n app.use(async (req, res, next) => {\n const { originalUrl } = req;\n const newPath = extractLanguageAndPath(originalUrl);\n globalVars['lang'] = newPath.language;\n next();\n })\n\n env.addGlobal(\"set\", function (key, value) {\n globalVars[key] = value;\n });\n\n env.addGlobal(\"get\", function (key, defaultValue = null) {\n return globalVars[key] || defaultValue;\n });\n\n function getNestedValue(obj, key) {\n return key.split('.').reduce((acc, part) => acc && acc[part], obj);\n }\n\n env.addGlobal(\"t\", function (key, defaultValue = '') {\n console.log(\"🚀 ~ globalVars:\", globalVars)\n const lang = globalVars['lang'] || 'ar';\n const locale = locales[lang];\n return locale ? getNestedValue(locale, key) || defaultValue : defaultValue;\n });\n\n app.use(\n Fingerprint({\n parameters: [\n Fingerprint.useragent,\n Fingerprint.acceptHeaders,\n Fingerprint.geoip,\n function (next) {\n next(null, { param1: \"value1\" });\n },\n function (next) {\n next(null, { param2: \"value2\" });\n },\n ],\n })\n );\n\n app.use(async (req, res, next) => {\n const { originalUrl, protocol } = req;\n const fullUrl = `${protocol}://${req.get(\"host\")}${originalUrl}`;\n const url = `https://api.qumra.cloud/templateEngine/v1/render?path=${encodeURIComponent(fullUrl)}`;\n const headers = {\n \"Content-Type\": \"application/json\",\n secretKey: options.secretKey,\n fingerprint: req.fingerprint.hash,\n \"User-Agent\": req.get(\"User-Agent\") || \"\",\n Referer: req.get(\"Referer\") || \"\",\n };\n const config = { headers };\n\n const response = await fetch(url, config);\n const resHeaders = response.headers.getSetCookie();\n if (resHeaders) {\n resHeaders.forEach((header) => {\n const parsedCookies = CookieParser(header);\n Object.keys(parsedCookies).forEach((name) => {\n const { value, attributes } = parsedCookies[name];\n res.cookie(name, value, attributes);\n });\n });\n }\n\n const data = await response.json();\n console.log(\"🚀 ~ app.use ~ data:\", data)\n const { global } = data;\n for (const key in global) {\n if (Object.hasOwnProperty.call(global, key)) {\n env.addGlobal(key, global[key]);\n }\n }\n\n next();\n });\n\n return async (req, res, next) => {\n res.render(\"index.njk\", {\n title: \"Welcome\",\n message: \"Hello from Nunjucks with custom middleware!\",\n cdn: \"https://your-cdn-url.com/\",\n fingerprint: req.fingerprint,\n });\n };\n}\n\nmodule.exports = createNunjucksMiddleware;"],"names":["nunjucks","require$$0","path","require$$1","Fingerprint","require$$2","CookieParser","setCookieHeader","cookies","split","forEach","cookieStr","parts","_parts","_slicedToArray","_nameValue$split2","name","value","trimmedName","trim","trimmedValue","attributes","i","length","_parts$i$split2","attributeName","attributeValue","fs","require$$4","extractLanguageAndPath","result","language","match","concat","app","options","arguments","undefined","viewsDirectory","localesDirectory","join","env","configure","autoescape","express","watch","noCache","defaultFilters","upperCase","str","toUpperCase","reverse","capitalize","charAt","slice","toLowerCase","formatCurrency","amount","parseFloat","toFixed","money","date","Date","toISOString","applyDiscount","price","discountPercent","addVAT","pluralize","quantity","singular","plural","truncate","trimSpaces","isEmpty","slugify","replace","formatNumber","num","toString","assets","getGlobal","cdn","filterName","addFilter","locales","readdirSync","file","endsWith","localeName","basename","require","globalVars","use","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","req","res","next","originalUrl","newPath","wrap","_context","prev","stop","_x","_x2","_x3","apply","this","addGlobal","key","defaultValue","console","log","lang","locale","obj","reduce","acc","part","getNestedValue","parameters","useragent","acceptHeaders","geoip","param1","param2","_ref2","_callee2","protocol","fullUrl","url","headers","config","response","resHeaders","data","global","_context2","get","encodeURIComponent","secretKey","fingerprint","hash","Referer","fetch","sent","getSetCookie","header","parsedCookies","Object","keys","_parsedCookies$name","cookie","json","hasOwnProperty","call","_x4","_x5","_x6","_ref3","_callee3","_context3","render","title","message","_x7","_x8","_x9"],"mappings":"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"}
|