@ackplus/nest-dynamic-templates 1.1.2 → 1.1.6
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/package.json +1 -1
- package/src/index.js +25 -0
- package/src/lib/constant.js +5 -0
- package/src/lib/dto/create-template-layout.dto.js +86 -0
- package/src/lib/dto/create-template.dto.js +103 -0
- package/src/lib/dto/render-content-template-layout.dto.js +40 -0
- package/src/lib/dto/render-content-template.dto.js +46 -0
- package/src/lib/dto/render-template-layout.dto.js +66 -0
- package/src/lib/dto/render-template.dto.js +90 -0
- package/src/lib/dto/template-filter.dto.js +61 -0
- package/src/lib/dto/template-layout-filter.dto.js +60 -0
- package/src/lib/engines/language/html.engine.js +80 -0
- package/src/lib/engines/language/index.js +11 -0
- package/src/lib/engines/language/markdown.engine.js +39 -0
- package/src/lib/engines/language/mjml.engine.js +75 -0
- package/src/lib/engines/language/text.engine.js +15 -0
- package/src/lib/engines/language-engine.js +6 -0
- package/src/lib/engines/template/ejs.engine.js +65 -0
- package/src/lib/engines/template/handlebars.engine.js +66 -0
- package/src/lib/engines/template/index.js +11 -0
- package/src/lib/engines/template/nunjucks.engine.js +64 -0
- package/src/lib/engines/template/pug.engine.js +74 -0
- package/src/lib/engines/template-engine.js +6 -0
- package/src/lib/entities/template-layout.entity.js +120 -0
- package/src/lib/entities/template.entity.js +127 -0
- package/src/lib/errors/template.errors.js +75 -0
- package/src/lib/interfaces/module-config.interface.js +2 -0
- package/src/lib/interfaces/template.types.js +24 -0
- package/src/lib/nest-dynamic-templates.module.js +131 -0
- package/src/lib/services/template-config.service.js +101 -0
- package/src/lib/services/template-engine.registry.js +93 -0
- package/src/lib/services/template-layout.service.js +343 -0
- package/src/lib/services/template.service.js +414 -0
- package/src/test/helpers.js +33 -0
- package/src/test/test-database.config.js +23 -0
- package/src/test/test.setup.js +30 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.HtmlEngine = void 0;
|
|
37
|
+
const template_types_1 = require("../../interfaces/template.types");
|
|
38
|
+
const language_engine_1 = require("../language-engine");
|
|
39
|
+
class HtmlEngine extends language_engine_1.LanguageEngine {
|
|
40
|
+
constructor(options) {
|
|
41
|
+
super();
|
|
42
|
+
this.options = options;
|
|
43
|
+
}
|
|
44
|
+
async render(content) {
|
|
45
|
+
try {
|
|
46
|
+
// For HTML, we just return the content as is
|
|
47
|
+
// But we validate it first to ensure it's valid HTML
|
|
48
|
+
const isValid = await this.validate(content);
|
|
49
|
+
if (!isValid) {
|
|
50
|
+
throw new Error('Invalid HTML content');
|
|
51
|
+
}
|
|
52
|
+
return content;
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
throw new Error(`Failed to render HTML: ${error?.message || 'Unknown error'}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async validate(content) {
|
|
59
|
+
try {
|
|
60
|
+
const { Parser } = await Promise.resolve().then(() => __importStar(require('htmlparser2')));
|
|
61
|
+
return new Promise((resolve) => {
|
|
62
|
+
const parser = new Parser({
|
|
63
|
+
onerror: () => {
|
|
64
|
+
resolve(false);
|
|
65
|
+
},
|
|
66
|
+
onend: () => {
|
|
67
|
+
resolve(true);
|
|
68
|
+
}
|
|
69
|
+
}, this.options);
|
|
70
|
+
parser.write(content);
|
|
71
|
+
parser.end();
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
exports.HtmlEngine = HtmlEngine;
|
|
80
|
+
HtmlEngine.engineName = template_types_1.TemplateLanguageEnum.HTML;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TextEngine = exports.MarkdownEngine = exports.HtmlEngine = exports.MjmlEngine = void 0;
|
|
4
|
+
var mjml_engine_1 = require("./mjml.engine");
|
|
5
|
+
Object.defineProperty(exports, "MjmlEngine", { enumerable: true, get: function () { return mjml_engine_1.MjmlEngine; } });
|
|
6
|
+
var html_engine_1 = require("./html.engine");
|
|
7
|
+
Object.defineProperty(exports, "HtmlEngine", { enumerable: true, get: function () { return html_engine_1.HtmlEngine; } });
|
|
8
|
+
var markdown_engine_1 = require("./markdown.engine");
|
|
9
|
+
Object.defineProperty(exports, "MarkdownEngine", { enumerable: true, get: function () { return markdown_engine_1.MarkdownEngine; } });
|
|
10
|
+
var text_engine_1 = require("./text.engine");
|
|
11
|
+
Object.defineProperty(exports, "TextEngine", { enumerable: true, get: function () { return text_engine_1.TextEngine; } });
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MarkdownEngine = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
const template_types_1 = require("../../interfaces/template.types");
|
|
7
|
+
const language_engine_1 = require("../language-engine");
|
|
8
|
+
let MarkdownEngine = class MarkdownEngine extends language_engine_1.LanguageEngine {
|
|
9
|
+
constructor(options) {
|
|
10
|
+
super();
|
|
11
|
+
this.options = options;
|
|
12
|
+
}
|
|
13
|
+
async render(content) {
|
|
14
|
+
// try {
|
|
15
|
+
// const { marked } = await import('marked');
|
|
16
|
+
// return marked(content, this.options);
|
|
17
|
+
// } catch (error: any) {
|
|
18
|
+
// throw new Error(`Failed to render Markdown: ${error?.message || 'Unknown error'}`);
|
|
19
|
+
// }
|
|
20
|
+
return content;
|
|
21
|
+
}
|
|
22
|
+
async validate(content) {
|
|
23
|
+
// try {
|
|
24
|
+
// const { marked } = await import('marked');
|
|
25
|
+
// // Basic Markdown validation - check for common syntax errors
|
|
26
|
+
// marked(content, this.options);
|
|
27
|
+
// return true;
|
|
28
|
+
// } catch (error) {
|
|
29
|
+
// return false;
|
|
30
|
+
// }
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
exports.MarkdownEngine = MarkdownEngine;
|
|
35
|
+
MarkdownEngine.engineName = template_types_1.TemplateLanguageEnum.MARKDOWN;
|
|
36
|
+
exports.MarkdownEngine = MarkdownEngine = tslib_1.__decorate([
|
|
37
|
+
(0, common_1.Injectable)(),
|
|
38
|
+
tslib_1.__metadata("design:paramtypes", [Object])
|
|
39
|
+
], MarkdownEngine);
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.MjmlEngine = void 0;
|
|
37
|
+
const template_types_1 = require("../../interfaces/template.types");
|
|
38
|
+
const language_engine_1 = require("../language-engine");
|
|
39
|
+
class MjmlEngine extends language_engine_1.LanguageEngine {
|
|
40
|
+
constructor(options = {}) {
|
|
41
|
+
super();
|
|
42
|
+
this.options = {};
|
|
43
|
+
this.options = options;
|
|
44
|
+
}
|
|
45
|
+
async render(content) {
|
|
46
|
+
try {
|
|
47
|
+
const mjml2html = (await Promise.resolve().then(() => __importStar(require('mjml')))).default;
|
|
48
|
+
const result = mjml2html(content, {
|
|
49
|
+
...this.options,
|
|
50
|
+
validationLevel: 'strict',
|
|
51
|
+
});
|
|
52
|
+
if (result.errors && result.errors.length > 0) {
|
|
53
|
+
throw new Error(`MJML validation errors: ${result.errors.join(', ')}`);
|
|
54
|
+
}
|
|
55
|
+
return result.html;
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
throw new Error(`MJML rendering error: ${error?.message || 'Unknown error'}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async validate(content) {
|
|
62
|
+
try {
|
|
63
|
+
const mjml2html = (await Promise.resolve().then(() => __importStar(require('mjml')))).default;
|
|
64
|
+
const result = mjml2html(content, {
|
|
65
|
+
validationLevel: 'strict',
|
|
66
|
+
});
|
|
67
|
+
return result.errors.length === 0;
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
exports.MjmlEngine = MjmlEngine;
|
|
75
|
+
MjmlEngine.engineName = template_types_1.TemplateLanguageEnum.MJML;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TextEngine = void 0;
|
|
4
|
+
const template_types_1 = require("../../interfaces/template.types");
|
|
5
|
+
const language_engine_1 = require("../language-engine");
|
|
6
|
+
class TextEngine extends language_engine_1.LanguageEngine {
|
|
7
|
+
async render(content) {
|
|
8
|
+
return content;
|
|
9
|
+
}
|
|
10
|
+
async validate(content) {
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.TextEngine = TextEngine;
|
|
15
|
+
TextEngine.engineName = template_types_1.TemplateLanguageEnum.TEXT;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.EjsEngine = void 0;
|
|
37
|
+
const template_engine_1 = require("../template-engine");
|
|
38
|
+
const template_types_1 = require("../../interfaces/template.types");
|
|
39
|
+
class EjsEngine extends template_engine_1.TemplateEngine {
|
|
40
|
+
constructor(options) {
|
|
41
|
+
super();
|
|
42
|
+
this.options = options || {};
|
|
43
|
+
}
|
|
44
|
+
async render(content, data) {
|
|
45
|
+
try {
|
|
46
|
+
const ejs = await Promise.resolve().then(() => __importStar(require('ejs')));
|
|
47
|
+
return ejs.render(content, data, this.options);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
throw new Error(`Failed to render EJS template: ${error?.message || 'Unknown error'}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async validate(content) {
|
|
54
|
+
try {
|
|
55
|
+
const ejs = await Promise.resolve().then(() => __importStar(require('ejs')));
|
|
56
|
+
ejs.compile(content, this.options);
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.EjsEngine = EjsEngine;
|
|
65
|
+
EjsEngine.engineName = template_types_1.TemplateEngineEnum.EJS;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.HandlebarsEngine = void 0;
|
|
37
|
+
const template_types_1 = require("../../interfaces/template.types");
|
|
38
|
+
const template_engine_1 = require("../template-engine");
|
|
39
|
+
class HandlebarsEngine extends template_engine_1.TemplateEngine {
|
|
40
|
+
constructor(options) {
|
|
41
|
+
super();
|
|
42
|
+
this.options = options || {};
|
|
43
|
+
}
|
|
44
|
+
async render(content, data) {
|
|
45
|
+
try {
|
|
46
|
+
const Handlebars = await Promise.resolve().then(() => __importStar(require('handlebars')));
|
|
47
|
+
const template = Handlebars.compile(content, this.options);
|
|
48
|
+
return template(data);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
throw new Error(`Failed to render Handlebars template: ${error?.message || 'Unknown error'}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async validate(content) {
|
|
55
|
+
try {
|
|
56
|
+
const Handlebars = await Promise.resolve().then(() => __importStar(require('handlebars')));
|
|
57
|
+
Handlebars.precompile(content, this.options);
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.HandlebarsEngine = HandlebarsEngine;
|
|
66
|
+
HandlebarsEngine.engineName = template_types_1.TemplateEngineEnum.HANDLEBARS;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PugEngine = exports.EjsEngine = exports.HandlebarsEngine = exports.NunjucksEngine = void 0;
|
|
4
|
+
var nunjucks_engine_1 = require("./nunjucks.engine");
|
|
5
|
+
Object.defineProperty(exports, "NunjucksEngine", { enumerable: true, get: function () { return nunjucks_engine_1.NunjucksEngine; } });
|
|
6
|
+
var handlebars_engine_1 = require("./handlebars.engine");
|
|
7
|
+
Object.defineProperty(exports, "HandlebarsEngine", { enumerable: true, get: function () { return handlebars_engine_1.HandlebarsEngine; } });
|
|
8
|
+
var ejs_engine_1 = require("./ejs.engine");
|
|
9
|
+
Object.defineProperty(exports, "EjsEngine", { enumerable: true, get: function () { return ejs_engine_1.EjsEngine; } });
|
|
10
|
+
var pug_engine_1 = require("./pug.engine");
|
|
11
|
+
Object.defineProperty(exports, "PugEngine", { enumerable: true, get: function () { return pug_engine_1.PugEngine; } });
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NunjucksEngine = void 0;
|
|
4
|
+
const lodash_1 = require("lodash");
|
|
5
|
+
const template_types_1 = require("../../interfaces/template.types");
|
|
6
|
+
const template_engine_1 = require("../template-engine");
|
|
7
|
+
class NunjucksEngine extends template_engine_1.TemplateEngine {
|
|
8
|
+
constructor(options, customOptions) {
|
|
9
|
+
super();
|
|
10
|
+
this.options = options;
|
|
11
|
+
this.customOptions = customOptions;
|
|
12
|
+
this.initNunjucks();
|
|
13
|
+
}
|
|
14
|
+
initNunjucks() {
|
|
15
|
+
const nunjucks = require('nunjucks');
|
|
16
|
+
const nunjucksOptions = (0, lodash_1.omit)(this.options, 'filters');
|
|
17
|
+
this.env = nunjucks.configure({
|
|
18
|
+
autoescape: true,
|
|
19
|
+
throwOnUndefined: true,
|
|
20
|
+
...nunjucksOptions,
|
|
21
|
+
});
|
|
22
|
+
// Register filters immediately
|
|
23
|
+
if (this.customOptions?.filters) {
|
|
24
|
+
Object.entries(this.customOptions.filters).forEach(([name, filter]) => {
|
|
25
|
+
this.registerFilter(name, filter);
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async render(content, data) {
|
|
30
|
+
try {
|
|
31
|
+
return new Promise((resolve, reject) => {
|
|
32
|
+
this.env.renderString(content, data || {}, (err, result) => {
|
|
33
|
+
if (err) {
|
|
34
|
+
reject(err);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
resolve(result);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
throw new Error(`Failed to render Nunjucks template: ${error?.message || 'Unknown error'}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async validate(content) {
|
|
47
|
+
try {
|
|
48
|
+
// Use renderString with empty data to validate the template
|
|
49
|
+
await this.render(content, {});
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
registerFilter(name, filter) {
|
|
57
|
+
this.env.addFilter(name, filter);
|
|
58
|
+
}
|
|
59
|
+
registerGlobal(name, global) {
|
|
60
|
+
this.env.addGlobal(name, global);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.NunjucksEngine = NunjucksEngine;
|
|
64
|
+
NunjucksEngine.engineName = template_types_1.TemplateEngineEnum.NUNJUCKS;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.PugEngine = void 0;
|
|
37
|
+
const template_types_1 = require("../../interfaces/template.types");
|
|
38
|
+
const template_engine_1 = require("../template-engine");
|
|
39
|
+
class PugEngine extends template_engine_1.TemplateEngine {
|
|
40
|
+
constructor(options, customOptions) {
|
|
41
|
+
super();
|
|
42
|
+
this.customOptions = customOptions;
|
|
43
|
+
this.options = options || {};
|
|
44
|
+
}
|
|
45
|
+
async render(content, data) {
|
|
46
|
+
try {
|
|
47
|
+
const pug = await Promise.resolve().then(() => __importStar(require('pug')));
|
|
48
|
+
const template = pug.compile(content, {
|
|
49
|
+
...this.options,
|
|
50
|
+
filters: this.customOptions?.filters
|
|
51
|
+
});
|
|
52
|
+
return template({
|
|
53
|
+
...this.options.filters,
|
|
54
|
+
...data,
|
|
55
|
+
...this.customOptions?.filters
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
throw new Error(`Failed to render Pug template: ${error?.message || 'Unknown error'}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async validate(content) {
|
|
63
|
+
try {
|
|
64
|
+
const pug = await Promise.resolve().then(() => __importStar(require('pug')));
|
|
65
|
+
pug.compile(content, this.options);
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
exports.PugEngine = PugEngine;
|
|
74
|
+
PugEngine.engineName = template_types_1.TemplateEngineEnum.PUG;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NestDynamicTemplateLayout = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const typeorm_1 = require("typeorm");
|
|
6
|
+
const class_validator_1 = require("class-validator");
|
|
7
|
+
const template_types_1 = require("../interfaces/template.types");
|
|
8
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
9
|
+
let NestDynamicTemplateLayout = class NestDynamicTemplateLayout extends typeorm_1.BaseEntity {
|
|
10
|
+
};
|
|
11
|
+
exports.NestDynamicTemplateLayout = NestDynamicTemplateLayout;
|
|
12
|
+
tslib_1.__decorate([
|
|
13
|
+
(0, swagger_1.ApiProperty)({ type: String, format: 'uuid', readOnly: true }),
|
|
14
|
+
(0, typeorm_1.PrimaryGeneratedColumn)('uuid'),
|
|
15
|
+
tslib_1.__metadata("design:type", String)
|
|
16
|
+
], NestDynamicTemplateLayout.prototype, "id", void 0);
|
|
17
|
+
tslib_1.__decorate([
|
|
18
|
+
(0, swagger_1.ApiProperty)({ type: String }),
|
|
19
|
+
(0, class_validator_1.IsString)(),
|
|
20
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
21
|
+
(0, class_validator_1.Matches)(/^[a-z0-9\-_]+$/, { message: 'Invalid template name format' }),
|
|
22
|
+
(0, typeorm_1.Column)(),
|
|
23
|
+
tslib_1.__metadata("design:type", String)
|
|
24
|
+
], NestDynamicTemplateLayout.prototype, "name", void 0);
|
|
25
|
+
tslib_1.__decorate([
|
|
26
|
+
(0, swagger_1.ApiProperty)({ type: String, nullable: true }),
|
|
27
|
+
(0, class_validator_1.IsString)(),
|
|
28
|
+
(0, class_validator_1.IsOptional)(),
|
|
29
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
30
|
+
tslib_1.__metadata("design:type", String)
|
|
31
|
+
], NestDynamicTemplateLayout.prototype, "displayName", void 0);
|
|
32
|
+
tslib_1.__decorate([
|
|
33
|
+
(0, swagger_1.ApiProperty)({ type: String, nullable: true }),
|
|
34
|
+
(0, class_validator_1.IsString)(),
|
|
35
|
+
(0, class_validator_1.IsOptional)(),
|
|
36
|
+
(0, typeorm_1.Column)({ type: 'text', nullable: true }),
|
|
37
|
+
tslib_1.__metadata("design:type", String)
|
|
38
|
+
], NestDynamicTemplateLayout.prototype, "description", void 0);
|
|
39
|
+
tslib_1.__decorate([
|
|
40
|
+
(0, swagger_1.ApiProperty)({ type: String }),
|
|
41
|
+
(0, class_validator_1.IsString)(),
|
|
42
|
+
(0, class_validator_1.IsOptional)(),
|
|
43
|
+
(0, typeorm_1.Column)({ type: 'text' }),
|
|
44
|
+
tslib_1.__metadata("design:type", String)
|
|
45
|
+
], NestDynamicTemplateLayout.prototype, "type", void 0);
|
|
46
|
+
tslib_1.__decorate([
|
|
47
|
+
(0, swagger_1.ApiProperty)({ enum: template_types_1.TemplateEngineEnum, type: String }),
|
|
48
|
+
(0, class_validator_1.IsEnum)(template_types_1.TemplateEngineEnum),
|
|
49
|
+
(0, typeorm_1.Column)({
|
|
50
|
+
type: 'text',
|
|
51
|
+
enum: template_types_1.TemplateEngineEnum,
|
|
52
|
+
default: template_types_1.TemplateEngineEnum.NUNJUCKS
|
|
53
|
+
}),
|
|
54
|
+
tslib_1.__metadata("design:type", String)
|
|
55
|
+
], NestDynamicTemplateLayout.prototype, "engine", void 0);
|
|
56
|
+
tslib_1.__decorate([
|
|
57
|
+
(0, swagger_1.ApiProperty)({ enum: template_types_1.TemplateLanguageEnum, type: String, nullable: true }),
|
|
58
|
+
(0, class_validator_1.IsEnum)(template_types_1.TemplateLanguageEnum),
|
|
59
|
+
(0, class_validator_1.IsOptional)(),
|
|
60
|
+
(0, typeorm_1.Column)({ type: 'text' }),
|
|
61
|
+
tslib_1.__metadata("design:type", String)
|
|
62
|
+
], NestDynamicTemplateLayout.prototype, "language", void 0);
|
|
63
|
+
tslib_1.__decorate([
|
|
64
|
+
(0, swagger_1.ApiProperty)({ type: String }),
|
|
65
|
+
(0, class_validator_1.IsString)(),
|
|
66
|
+
(0, class_validator_1.IsOptional)(),
|
|
67
|
+
(0, typeorm_1.Column)('text'),
|
|
68
|
+
tslib_1.__metadata("design:type", String)
|
|
69
|
+
], NestDynamicTemplateLayout.prototype, "content", void 0);
|
|
70
|
+
tslib_1.__decorate([
|
|
71
|
+
(0, swagger_1.ApiProperty)({ type: String, nullable: true }),
|
|
72
|
+
(0, class_validator_1.IsString)(),
|
|
73
|
+
(0, class_validator_1.IsOptional)(),
|
|
74
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
75
|
+
tslib_1.__metadata("design:type", String)
|
|
76
|
+
], NestDynamicTemplateLayout.prototype, "templateLayoutName", void 0);
|
|
77
|
+
tslib_1.__decorate([
|
|
78
|
+
(0, swagger_1.ApiProperty)({ type: String, nullable: true }),
|
|
79
|
+
(0, class_validator_1.IsString)(),
|
|
80
|
+
(0, typeorm_1.Column)({ nullable: true, default: 'system' }),
|
|
81
|
+
tslib_1.__metadata("design:type", String)
|
|
82
|
+
], NestDynamicTemplateLayout.prototype, "scope", void 0);
|
|
83
|
+
tslib_1.__decorate([
|
|
84
|
+
(0, swagger_1.ApiProperty)({ type: String, nullable: true }),
|
|
85
|
+
(0, class_validator_1.IsString)(),
|
|
86
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
87
|
+
tslib_1.__metadata("design:type", String)
|
|
88
|
+
], NestDynamicTemplateLayout.prototype, "scopeId", void 0);
|
|
89
|
+
tslib_1.__decorate([
|
|
90
|
+
(0, swagger_1.ApiProperty)({ type: String, nullable: true }),
|
|
91
|
+
(0, class_validator_1.IsString)(),
|
|
92
|
+
(0, typeorm_1.Column)({ nullable: true, default: 'en' }),
|
|
93
|
+
tslib_1.__metadata("design:type", String)
|
|
94
|
+
], NestDynamicTemplateLayout.prototype, "locale", void 0);
|
|
95
|
+
tslib_1.__decorate([
|
|
96
|
+
(0, swagger_1.ApiProperty)({ type: Object, nullable: true }),
|
|
97
|
+
(0, class_validator_1.IsOptional)(),
|
|
98
|
+
(0, typeorm_1.Column)('simple-json', { nullable: true }),
|
|
99
|
+
tslib_1.__metadata("design:type", Object)
|
|
100
|
+
], NestDynamicTemplateLayout.prototype, "previewContext", void 0);
|
|
101
|
+
tslib_1.__decorate([
|
|
102
|
+
(0, swagger_1.ApiProperty)({ type: Boolean }),
|
|
103
|
+
(0, class_validator_1.IsBoolean)(),
|
|
104
|
+
(0, typeorm_1.Column)({ default: true }),
|
|
105
|
+
tslib_1.__metadata("design:type", Boolean)
|
|
106
|
+
], NestDynamicTemplateLayout.prototype, "isActive", void 0);
|
|
107
|
+
tslib_1.__decorate([
|
|
108
|
+
(0, swagger_1.ApiProperty)({ type: Date, readOnly: true }),
|
|
109
|
+
(0, typeorm_1.CreateDateColumn)(),
|
|
110
|
+
tslib_1.__metadata("design:type", Date)
|
|
111
|
+
], NestDynamicTemplateLayout.prototype, "createdAt", void 0);
|
|
112
|
+
tslib_1.__decorate([
|
|
113
|
+
(0, swagger_1.ApiProperty)({ type: Date, readOnly: true }),
|
|
114
|
+
(0, typeorm_1.UpdateDateColumn)(),
|
|
115
|
+
tslib_1.__metadata("design:type", Date)
|
|
116
|
+
], NestDynamicTemplateLayout.prototype, "updatedAt", void 0);
|
|
117
|
+
exports.NestDynamicTemplateLayout = NestDynamicTemplateLayout = tslib_1.__decorate([
|
|
118
|
+
(0, typeorm_1.Entity)('nest_dynamic_template_layouts'),
|
|
119
|
+
(0, typeorm_1.Index)(['name', 'scope', 'scopeId', 'locale'], { unique: true })
|
|
120
|
+
], NestDynamicTemplateLayout);
|