qumra-engine 1.0.0 → 1.0.2
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/.babelrc +3 -0
- package/dist/bundle.js +2 -0
- package/dist/bundle.js.LICENSE.txt +1 -0
- package/package.json +9 -2
- package/lib/index.js +0 -171
- package/lib/utils/CookieParser.js +0 -37
- package/views/error.njk +0 -48
package/.babelrc
ADDED
package/dist/bundle.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! For license information please see bundle.js.LICENSE.txt */
|
|
2
|
+
(()=>{var t={920:t=>{function r(t){var r=new Error("Cannot find module '"+t+"'");throw r.code="MODULE_NOT_FOUND",r}r.keys=()=>[],r.resolve=r,r.id=920,t.exports=r},99:(t,r,e)=>{function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}function o(){"use strict";o=function(){return r};var t,r={},e=Object.prototype,i=e.hasOwnProperty,a=Object.defineProperty||function(t,r,e){t[r]=e.value},u="function"==typeof Symbol?Symbol:{},c=u.iterator||"@@iterator",l=u.asyncIterator||"@@asyncIterator",s=u.toStringTag||"@@toStringTag";function f(t,r,e){return Object.defineProperty(t,r,{value:e,enumerable:!0,configurable:!0,writable:!0}),t[r]}try{f({},"")}catch(t){f=function(t,r,e){return t[r]=e}}function h(t,r,e,n){var o=r&&r.prototype instanceof w?r:w,i=Object.create(o.prototype),u=new N(n||[]);return a(i,"_invoke",{value:k(t,e,u)}),i}function p(t,r,e){try{return{type:"normal",arg:t.call(r,e)}}catch(t){return{type:"throw",arg:t}}}r.wrap=h;var v="suspendedStart",y="suspendedYield",d="executing",g="completed",m={};function w(){}function b(){}function x(){}var E={};f(E,c,(function(){return this}));var j=Object.getPrototypeOf,L=j&&j(j(T([])));L&&L!==e&&i.call(L,c)&&(E=L);var O=x.prototype=w.prototype=Object.create(E);function S(t){["next","throw","return"].forEach((function(r){f(t,r,(function(t){return this._invoke(r,t)}))}))}function _(t,r){function e(o,a,u,c){var l=p(t[o],t,a);if("throw"!==l.type){var s=l.arg,f=s.value;return f&&"object"==n(f)&&i.call(f,"__await")?r.resolve(f.__await).then((function(t){e("next",t,u,c)}),(function(t){e("throw",t,u,c)})):r.resolve(f).then((function(t){s.value=t,u(s)}),(function(t){return e("throw",t,u,c)}))}c(l.arg)}var o;a(this,"_invoke",{value:function(t,n){function i(){return new r((function(r,o){e(t,n,r,o)}))}return o=o?o.then(i,i):i()}})}function k(r,e,n){var o=v;return function(i,a){if(o===d)throw Error("Generator is already running");if(o===g){if("throw"===i)throw a;return{value:t,done:!0}}for(n.method=i,n.arg=a;;){var u=n.delegate;if(u){var c=G(u,n);if(c){if(c===m)continue;return c}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(o===v)throw o=g,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);o=d;var l=p(r,e,n);if("normal"===l.type){if(o=n.done?g:y,l.arg===m)continue;return{value:l.arg,done:n.done}}"throw"===l.type&&(o=g,n.method="throw",n.arg=l.arg)}}}function G(r,e){var n=e.method,o=r.iterator[n];if(o===t)return e.delegate=null,"throw"===n&&r.iterator.return&&(e.method="return",e.arg=t,G(r,e),"throw"===e.method)||"return"!==n&&(e.method="throw",e.arg=new TypeError("The iterator does not provide a '"+n+"' method")),m;var i=p(o,r.iterator,e.arg);if("throw"===i.type)return e.method="throw",e.arg=i.arg,e.delegate=null,m;var a=i.arg;return a?a.done?(e[r.resultName]=a.value,e.next=r.nextLoc,"return"!==e.method&&(e.method="next",e.arg=t),e.delegate=null,m):a:(e.method="throw",e.arg=new TypeError("iterator result is not an object"),e.delegate=null,m)}function C(t){var r={tryLoc:t[0]};1 in t&&(r.catchLoc=t[1]),2 in t&&(r.finallyLoc=t[2],r.afterLoc=t[3]),this.tryEntries.push(r)}function A(t){var r=t.completion||{};r.type="normal",delete r.arg,t.completion=r}function N(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(C,this),this.reset(!0)}function T(r){if(r||""===r){var e=r[c];if(e)return e.call(r);if("function"==typeof r.next)return r;if(!isNaN(r.length)){var o=-1,a=function e(){for(;++o<r.length;)if(i.call(r,o))return e.value=r[o],e.done=!1,e;return e.value=t,e.done=!0,e};return a.next=a}}throw new TypeError(n(r)+" is not iterable")}return b.prototype=x,a(O,"constructor",{value:x,configurable:!0}),a(x,"constructor",{value:b,configurable:!0}),b.displayName=f(x,s,"GeneratorFunction"),r.isGeneratorFunction=function(t){var r="function"==typeof t&&t.constructor;return!!r&&(r===b||"GeneratorFunction"===(r.displayName||r.name))},r.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,x):(t.__proto__=x,f(t,s,"GeneratorFunction")),t.prototype=Object.create(O),t},r.awrap=function(t){return{__await:t}},S(_.prototype),f(_.prototype,l,(function(){return this})),r.AsyncIterator=_,r.async=function(t,e,n,o,i){void 0===i&&(i=Promise);var a=new _(h(t,e,n,o),i);return r.isGeneratorFunction(e)?a:a.next().then((function(t){return t.done?t.value:a.next()}))},S(O),f(O,s,"Generator"),f(O,c,(function(){return this})),f(O,"toString",(function(){return"[object Generator]"})),r.keys=function(t){var r=Object(t),e=[];for(var n in r)e.push(n);return e.reverse(),function t(){for(;e.length;){var n=e.pop();if(n in r)return t.value=n,t.done=!1,t}return t.done=!0,t}},r.values=T,N.prototype={constructor:N,reset:function(r){if(this.prev=0,this.next=0,this.sent=this._sent=t,this.done=!1,this.delegate=null,this.method="next",this.arg=t,this.tryEntries.forEach(A),!r)for(var e in this)"t"===e.charAt(0)&&i.call(this,e)&&!isNaN(+e.slice(1))&&(this[e]=t)},stop:function(){this.done=!0;var t=this.tryEntries[0].completion;if("throw"===t.type)throw t.arg;return this.rval},dispatchException:function(r){if(this.done)throw r;var e=this;function n(n,o){return u.type="throw",u.arg=r,e.next=n,o&&(e.method="next",e.arg=t),!!o}for(var o=this.tryEntries.length-1;o>=0;--o){var a=this.tryEntries[o],u=a.completion;if("root"===a.tryLoc)return n("end");if(a.tryLoc<=this.prev){var c=i.call(a,"catchLoc"),l=i.call(a,"finallyLoc");if(c&&l){if(this.prev<a.catchLoc)return n(a.catchLoc,!0);if(this.prev<a.finallyLoc)return n(a.finallyLoc)}else if(c){if(this.prev<a.catchLoc)return n(a.catchLoc,!0)}else{if(!l)throw Error("try statement without catch or finally");if(this.prev<a.finallyLoc)return n(a.finallyLoc)}}}},abrupt:function(t,r){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc<=this.prev&&i.call(n,"finallyLoc")&&this.prev<n.finallyLoc){var o=n;break}}o&&("break"===t||"continue"===t)&&o.tryLoc<=r&&r<=o.finallyLoc&&(o=null);var a=o?o.completion:{};return a.type=t,a.arg=r,o?(this.method="next",this.next=o.finallyLoc,m):this.complete(a)},complete:function(t,r){if("throw"===t.type)throw t.arg;return"break"===t.type||"continue"===t.type?this.next=t.arg:"return"===t.type?(this.rval=this.arg=t.arg,this.method="return",this.next="end"):"normal"===t.type&&r&&(this.next=r),m},finish:function(t){for(var r=this.tryEntries.length-1;r>=0;--r){var e=this.tryEntries[r];if(e.finallyLoc===t)return this.complete(e.completion,e.afterLoc),A(e),m}},catch:function(t){for(var r=this.tryEntries.length-1;r>=0;--r){var e=this.tryEntries[r];if(e.tryLoc===t){var n=e.completion;if("throw"===n.type){var o=n.arg;A(e)}return o}}throw Error("illegal catch attempt")},delegateYield:function(r,e,n){return this.delegate={iterator:T(r),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=t),m}},r}function i(t,r,e,n,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void e(t)}u.done?r(c):Promise.resolve(c).then(n,o)}function a(t){return function(){var r=this,e=arguments;return new Promise((function(n,o){var a=t.apply(r,e);function u(t){i(a,n,o,u,c,"next",t)}function c(t){i(a,n,o,u,c,"throw",t)}u(void 0)}))}}var u=e(271),c=e(928),l=e(757),s=e(168),f=e(896);function h(t){var r={language:"ar",path:null},e=t.match(/^\/([a-z]{2})\/(.*)$/);return e?(r.language=e[1],r.path="/".concat(e[2])):(e=t.match(/^\/([a-z]{2})$/))?(r.language=e[1],r.path="/"):r.path=t,r}t.exports=function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=r.viewsDirectory||c.join(__dirname,"../views"),i=c.join(c.dirname(n),"locales"),p=u.configure(n,{autoescape:!0,express:t,watch:r.watch||!1,noCache:r.noCache||!1}),v={upperCase:function(t){return t.toUpperCase()},reverse:function(t){return t.split("").reverse().join("")},capitalize:function(t){return t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()},formatCurrency:function(t){return(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"$")+parseFloat(t).toFixed(2)},money:function(){return"ToDo"},date:function(t){return new Date(t).toISOString().split("T")[0]},applyDiscount:function(t,r){return t-t*(r/100)},addVAT:function(t){return t+t*((arguments.length>1&&void 0!==arguments[1]?arguments[1]:15)/100)},pluralize:function(t,r,e){return 1===t?r:e},truncate:function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:100;return t.length>r?t.slice(0,r)+"...":t},trimSpaces:function(t){return t.trim()},isEmpty:function(t){return!t||0===t.trim().length},slugify:function(t){return t.toLowerCase().replace(/\s+/g,"-").replace(/[^\w-]+/g,"")},formatNumber:function(t){return t.toString().replace(/\B(?=(\d{3})+(?!\d))/g,",")},assets:function(t){return p.getGlobal("assets")},cdn:function(t){return p.getGlobal("cdn")}};for(var y in v)p.addFilter(y,v[y]);var d={};f.readdirSync(i).forEach((function(t){if(t.endsWith(".json")){var r=c.basename(t,".json");d[r]=e(920)(c.join(i,t))}}));var g={};return t.use(function(){var t=a(o().mark((function t(r,e,n){var i,a;return o().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:i=r.originalUrl,a=h(i),g.lang=a.language,n();case 4:case"end":return t.stop()}}),t)})));return function(r,e,n){return t.apply(this,arguments)}}()),p.addGlobal("set",(function(t,r){g[t]=r})),p.addGlobal("get",(function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return g[t]||r})),p.addGlobal("t",(function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";console.log("🚀 ~ globalVars:",g);var e=g.lang||"ar",n=d[e];return n&&function(t,r){return r.split(".").reduce((function(t,r){return t&&t[r]}),t)}(n,t)||r})),t.use(l({parameters:[l.useragent,l.acceptHeaders,l.geoip,function(t){t(null,{param1:"value1"})},function(t){t(null,{param2:"value2"})}]})),t.use(function(){var t=a(o().mark((function t(e,n,i){var a,u,c,l,f,h,v,y,d,g,m;return o().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return a=e.originalUrl,u=e.protocol,c="".concat(u,"://").concat(e.get("host")).concat(a),l="https://api.qumra.cloud/templateEngine/v1/render?path=".concat(encodeURIComponent(c)),f={"Content-Type":"application/json",secretKey:r.secretKey,fingerprint:e.fingerprint.hash,"User-Agent":e.get("User-Agent")||"",Referer:e.get("Referer")||""},h={headers:f},t.next=7,fetch(l,h);case 7:return v=t.sent,(y=v.headers.getSetCookie())&&y.forEach((function(t){var r=s(t);Object.keys(r).forEach((function(t){var e=r[t],o=e.value,i=e.attributes;n.cookie(t,o,i)}))})),t.next=12,v.json();case 12:for(m in d=t.sent,g=d.global)Object.hasOwnProperty.call(g,m)&&p.addGlobal(m,g[m]);i();case 16:case"end":return t.stop()}}),t)})));return function(r,e,n){return t.apply(this,arguments)}}()),function(){var t=a(o().mark((function t(r,e,n){return o().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:e.render("index.njk",{title:"Welcome",message:"Hello from Nunjucks with custom middleware!",cdn:"https://your-cdn-url.com/",fingerprint:r.fingerprint});case 1:case"end":return t.stop()}}),t)})));return function(r,e,n){return t.apply(this,arguments)}}()}},168:t=>{function r(t,r){return function(t){if(Array.isArray(t))return t}(t)||function(t,r){var e=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=e){var n,o,i,a,u=[],c=!0,l=!1;try{if(i=(e=e.call(t)).next,0===r){if(Object(e)!==e)return;c=!1}else for(;!(c=(n=i.call(e)).done)&&(u.push(n.value),u.length!==r);c=!0);}catch(t){l=!0,o=t}finally{try{if(!c&&null!=e.return&&(a=e.return(),Object(a)!==a))return}finally{if(l)throw o}}return u}}(t,r)||function(t,r){if(t){if("string"==typeof t)return e(t,r);var n={}.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?e(t,r):void 0}}(t,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function e(t,r){(null==r||r>t.length)&&(r=t.length);for(var e=0,n=Array(r);e<r;e++)n[e]=t[e];return n}t.exports=function(t){var e={};return t.split(/,(?![^\(\)]+\))/).forEach((function(t){var n=t.split(";"),o=r(n,1),i=r(o[0].split("="),2),a=i[0],u=i[1];if(a&&u){var c=a.trim(),l=u.trim();e[c]||(e[c]={value:l,attributes:{}});for(var s=1;s<n.length;s++){var f=r(n[s].split("="),2),h=f[0],p=f[1];h&&(e[c].attributes[h.trim()]=!p||p.trim())}}})),e}},757:t=>{"use strict";t.exports=require("express-fingerprint")},271:t=>{"use strict";t.exports=require("nunjucks")},896:t=>{"use strict";t.exports=require("fs")},928:t=>{"use strict";t.exports=require("path")}},r={};function e(n){var o=r[n];if(void 0!==o)return o.exports;var i=r[n]={exports:{}};return t[n](i,i.exports,e),i.exports}e.o=(t,r)=>Object.prototype.hasOwnProperty.call(t,r);var n=e(99);module.exports=n})();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "qumra-engine",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"main": "
|
|
3
|
+
"version": "1.0.2",
|
|
4
|
+
"main": "dist/bundle.js",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "echo \"Error: no test specified\" && exit 1"
|
|
7
7
|
},
|
|
@@ -12,5 +12,12 @@
|
|
|
12
12
|
"dependencies": {
|
|
13
13
|
"express-fingerprint": "^1.2.2",
|
|
14
14
|
"nunjucks": "^3.2.4"
|
|
15
|
+
},
|
|
16
|
+
"devDependencies": {
|
|
17
|
+
"@babel/preset-env": "^7.25.4",
|
|
18
|
+
"babel-loader": "^9.1.3",
|
|
19
|
+
"webpack": "^5.94.0",
|
|
20
|
+
"webpack-cli": "^5.1.4",
|
|
21
|
+
"webpack-node-externals": "^3.0.0"
|
|
15
22
|
}
|
|
16
23
|
}
|
package/lib/index.js
DELETED
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
const nunjucks = require("nunjucks");
|
|
2
|
-
const path = require("path");
|
|
3
|
-
const Fingerprint = require("express-fingerprint");
|
|
4
|
-
const CookieParser = require("./utils/CookieParser");
|
|
5
|
-
const fs = require("fs")
|
|
6
|
-
function extractLanguageAndPath(path) {
|
|
7
|
-
// Regular expression to match the /[lang]/[path] pattern
|
|
8
|
-
const langPattern = /^\/([a-z]{2})\/(.*)$/;
|
|
9
|
-
const rootPattern = /^\/([a-z]{2})$/;
|
|
10
|
-
|
|
11
|
-
let result = {
|
|
12
|
-
language: 'ar', // Default language is Arabic
|
|
13
|
-
path: null
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
// Check if the path matches the /[lang]/[path] pattern
|
|
17
|
-
let match = path.match(langPattern);
|
|
18
|
-
if (match) {
|
|
19
|
-
result.language = match[1]; // Extract language
|
|
20
|
-
result.path = `/${match[2]}`; // Extract path
|
|
21
|
-
} else {
|
|
22
|
-
// Check if the path matches the /[lang] pattern
|
|
23
|
-
match = path.match(rootPattern);
|
|
24
|
-
if (match) {
|
|
25
|
-
result.language = match[1]; // Extract language
|
|
26
|
-
result.path = '/'; // Root path
|
|
27
|
-
} else {
|
|
28
|
-
// If the path does not match any pattern, consider the entire path as path and language as default
|
|
29
|
-
result.path = path;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
return result;
|
|
34
|
-
}
|
|
35
|
-
function createNunjucksMiddleware(app, options = {}) {
|
|
36
|
-
const viewsDirectory = options.viewsDirectory || path.join(__dirname, "../views");
|
|
37
|
-
const localesDirectory = path.join(path.dirname(viewsDirectory), 'locales'); // الرجوع خطوة واحدة إلى مستوى أعلى ثم الوصول إلى مجلد locales
|
|
38
|
-
|
|
39
|
-
// إعداد Nunjucks
|
|
40
|
-
const env = nunjucks.configure(viewsDirectory, {
|
|
41
|
-
autoescape: true,
|
|
42
|
-
express: app,
|
|
43
|
-
watch: options.watch || false,
|
|
44
|
-
noCache: options.noCache || false,
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
const defaultFilters = {
|
|
48
|
-
upperCase: (str) => str.toUpperCase(),
|
|
49
|
-
reverse: (str) => str.split("").reverse().join(""),
|
|
50
|
-
capitalize: (str) => str.charAt(0).toUpperCase() + str.slice(1).toLowerCase(),
|
|
51
|
-
formatCurrency: (amount, symbol = "$") => symbol + parseFloat(amount).toFixed(2),
|
|
52
|
-
money: () => "ToDo",
|
|
53
|
-
date: (date, format = "YYYY-MM-DD") => new Date(date).toISOString().split("T")[0],
|
|
54
|
-
applyDiscount: (price, discountPercent) => price - price * (discountPercent / 100),
|
|
55
|
-
addVAT: (price, vatPercent = 15) => price + price * (vatPercent / 100),
|
|
56
|
-
pluralize: (quantity, singular, plural) => quantity === 1 ? singular : plural,
|
|
57
|
-
truncate: (str, length = 100) => str.length > length ? str.slice(0, length) + "..." : str,
|
|
58
|
-
trimSpaces: (str) => str.trim(),
|
|
59
|
-
isEmpty: (str) => !str || str.trim().length === 0,
|
|
60
|
-
slugify: (str) => str.toLowerCase().replace(/\s+/g, "-").replace(/[^\w-]+/g, ""),
|
|
61
|
-
formatNumber: (num) => num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","),
|
|
62
|
-
assets: (path) => env.getGlobal("assets"),
|
|
63
|
-
cdn: (path) => env.getGlobal("cdn"),
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
// إضافة الفلترات المدمجة إلى بيئة Nunjucks
|
|
67
|
-
for (const filterName in defaultFilters) {
|
|
68
|
-
env.addFilter(filterName, defaultFilters[filterName]);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
const locales = {};
|
|
72
|
-
fs.readdirSync(localesDirectory).forEach(file => {
|
|
73
|
-
if (file.endsWith('.json')) {
|
|
74
|
-
const localeName = path.basename(file, '.json');
|
|
75
|
-
locales[localeName] = require(path.join(localesDirectory, file));
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
const globalVars = {};
|
|
82
|
-
|
|
83
|
-
app.use(async (req, res, next) => {
|
|
84
|
-
const { originalUrl } = req;
|
|
85
|
-
const newPath = extractLanguageAndPath(originalUrl);
|
|
86
|
-
globalVars['lang'] = newPath.language;
|
|
87
|
-
next();
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
env.addGlobal("set", function (key, value) {
|
|
91
|
-
globalVars[key] = value;
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
env.addGlobal("get", function (key, defaultValue = null) {
|
|
95
|
-
return globalVars[key] || defaultValue;
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
function getNestedValue(obj, key) {
|
|
99
|
-
return key.split('.').reduce((acc, part) => acc && acc[part], obj);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
env.addGlobal("t", function (key, defaultValue = '') {
|
|
103
|
-
console.log("🚀 ~ globalVars:", globalVars)
|
|
104
|
-
const lang = globalVars['lang'] || 'ar';
|
|
105
|
-
const locale = locales[lang];
|
|
106
|
-
return locale ? getNestedValue(locale, key) || defaultValue : defaultValue;
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
app.use(
|
|
110
|
-
Fingerprint({
|
|
111
|
-
parameters: [
|
|
112
|
-
Fingerprint.useragent,
|
|
113
|
-
Fingerprint.acceptHeaders,
|
|
114
|
-
Fingerprint.geoip,
|
|
115
|
-
function (next) {
|
|
116
|
-
next(null, { param1: "value1" });
|
|
117
|
-
},
|
|
118
|
-
function (next) {
|
|
119
|
-
next(null, { param2: "value2" });
|
|
120
|
-
},
|
|
121
|
-
],
|
|
122
|
-
})
|
|
123
|
-
);
|
|
124
|
-
|
|
125
|
-
app.use(async (req, res, next) => {
|
|
126
|
-
const { originalUrl, protocol } = req;
|
|
127
|
-
const fullUrl = `${protocol}://${req.get("host")}${originalUrl}`;
|
|
128
|
-
const url = `https://api.qumra.cloud/templateEngine/v1/render?path=${encodeURIComponent(fullUrl)}`;
|
|
129
|
-
const headers = {
|
|
130
|
-
"Content-Type": "application/json",
|
|
131
|
-
secretKey: options.secretKey,
|
|
132
|
-
fingerprint: req.fingerprint.hash,
|
|
133
|
-
"User-Agent": req.get("User-Agent") || "",
|
|
134
|
-
Referer: req.get("Referer") || "",
|
|
135
|
-
};
|
|
136
|
-
const config = { headers };
|
|
137
|
-
|
|
138
|
-
const response = await fetch(url, config);
|
|
139
|
-
const resHeaders = response.headers.getSetCookie();
|
|
140
|
-
if (resHeaders) {
|
|
141
|
-
resHeaders.forEach((header) => {
|
|
142
|
-
const parsedCookies = CookieParser(header);
|
|
143
|
-
Object.keys(parsedCookies).forEach((name) => {
|
|
144
|
-
const { value, attributes } = parsedCookies[name];
|
|
145
|
-
res.cookie(name, value, attributes);
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
const data = await response.json();
|
|
151
|
-
const { global } = data;
|
|
152
|
-
for (const key in global) {
|
|
153
|
-
if (Object.hasOwnProperty.call(global, key)) {
|
|
154
|
-
env.addGlobal(key, global[key]);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
next();
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
return async (req, res, next) => {
|
|
162
|
-
res.render("index.njk", {
|
|
163
|
-
title: "Welcome",
|
|
164
|
-
message: "Hello from Nunjucks with custom middleware!",
|
|
165
|
-
cdn: "https://your-cdn-url.com/",
|
|
166
|
-
fingerprint: req.fingerprint,
|
|
167
|
-
});
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
module.exports = createNunjucksMiddleware;
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
const CookieParser = (setCookieHeader) => {
|
|
2
|
-
const cookies = {};
|
|
3
|
-
|
|
4
|
-
// تقسيم الكوكيز بناءً على الفواصل، مع التعامل مع الفواصل داخل القيم
|
|
5
|
-
const cookiePairs = setCookieHeader.split(/,(?![^\(\)]+\))/);
|
|
6
|
-
|
|
7
|
-
cookiePairs.forEach(cookieStr => {
|
|
8
|
-
const parts = cookieStr.split(';');
|
|
9
|
-
const [nameValue] = parts;
|
|
10
|
-
const [name, value] = nameValue.split('=');
|
|
11
|
-
|
|
12
|
-
if (name && value) {
|
|
13
|
-
// إزالة المسافات البيضاء
|
|
14
|
-
const trimmedName = name.trim();
|
|
15
|
-
const trimmedValue = value.trim();
|
|
16
|
-
|
|
17
|
-
// تهيئة الكائن للكوكي إذا لم يكن موجوداً
|
|
18
|
-
if (!cookies[trimmedName]) {
|
|
19
|
-
cookies[trimmedName] = {
|
|
20
|
-
value: trimmedValue,
|
|
21
|
-
attributes: {}
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// إضافة العلامات الأخرى
|
|
26
|
-
for (let i = 1; i < parts.length; i++) {
|
|
27
|
-
const [attributeName, attributeValue] = parts[i].split('=');
|
|
28
|
-
if (attributeName) {
|
|
29
|
-
cookies[trimmedName].attributes[attributeName.trim()] = attributeValue ? attributeValue.trim() : true;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
return cookies;
|
|
36
|
-
}
|
|
37
|
-
module.exports = CookieParser
|
package/views/error.njk
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
<!-- 404.njk -->
|
|
2
|
-
<!DOCTYPE html>
|
|
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>404 - Page Not Found</title>
|
|
8
|
-
<style>
|
|
9
|
-
body {
|
|
10
|
-
font-family: Arial, sans-serif;
|
|
11
|
-
text-align: center;
|
|
12
|
-
background-color: #f4f4f4;
|
|
13
|
-
color: #333;
|
|
14
|
-
margin: 0;
|
|
15
|
-
padding: 0;
|
|
16
|
-
}
|
|
17
|
-
.container {
|
|
18
|
-
display: flex;
|
|
19
|
-
flex-direction: column;
|
|
20
|
-
justify-content: center;
|
|
21
|
-
align-items: center;
|
|
22
|
-
height: 100vh;
|
|
23
|
-
}
|
|
24
|
-
h1 {
|
|
25
|
-
font-size: 4rem;
|
|
26
|
-
margin: 0;
|
|
27
|
-
}
|
|
28
|
-
p {
|
|
29
|
-
font-size: 1.2rem;
|
|
30
|
-
margin: 1rem 0;
|
|
31
|
-
}
|
|
32
|
-
a {
|
|
33
|
-
color: #007bff;
|
|
34
|
-
text-decoration: none;
|
|
35
|
-
}
|
|
36
|
-
a:hover {
|
|
37
|
-
text-decoration: underline;
|
|
38
|
-
}
|
|
39
|
-
</style>
|
|
40
|
-
</head>
|
|
41
|
-
<body>
|
|
42
|
-
<div class="container">
|
|
43
|
-
<h1>404</h1>
|
|
44
|
-
<p>Oops! The page you're looking for doesn't exist.</p>
|
|
45
|
-
<p><a href="/">Go back to the homepage</a></p>
|
|
46
|
-
</div>
|
|
47
|
-
</body>
|
|
48
|
-
</html>
|