@ackplus/nest-dynamic-templates 0.1.51 → 1.1.1

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 (148) hide show
  1. package/README.md +6 -284
  2. package/eslint.config.mjs +22 -0
  3. package/jest.config.ts +10 -0
  4. package/package.json +7 -58
  5. package/project.json +38 -0
  6. package/src/{index.d.ts → index.ts} +14 -1
  7. package/src/lib/constant.ts +2 -0
  8. package/src/lib/dto/create-template-layout.dto.ts +65 -0
  9. package/src/lib/dto/create-template.dto.ts +80 -0
  10. package/src/lib/dto/render-content-template-layout.dto.ts +32 -0
  11. package/src/lib/dto/render-content-template.dto.ts +37 -0
  12. package/src/lib/dto/render-template-layout.dto.ts +55 -0
  13. package/src/lib/dto/render-template.dto.ts +74 -0
  14. package/src/lib/dto/template-filter.dto.ts +52 -0
  15. package/src/lib/dto/template-layout-filter.dto.ts +51 -0
  16. package/src/lib/engines/language/html.engine.ts +49 -0
  17. package/src/lib/engines/language/markdown.engine.ts +37 -0
  18. package/src/lib/engines/language/mjml.engine.ts +44 -0
  19. package/src/lib/engines/language/text.engine.ts +15 -0
  20. package/src/lib/engines/{language-engine.d.ts → language-engine.ts} +7 -1
  21. package/src/lib/engines/template/ejs.engine.ts +33 -0
  22. package/src/lib/engines/template/handlebars.engine.ts +35 -0
  23. package/src/lib/engines/template/nunjucks.engine.ts +70 -0
  24. package/src/lib/engines/template/pug.engine.ts +43 -0
  25. package/src/lib/engines/{template-engine.d.ts → template-engine.ts} +6 -1
  26. package/src/lib/entities/template-layout.entity.ts +99 -0
  27. package/src/lib/entities/template.entity.ts +105 -0
  28. package/src/lib/errors/{template.errors.js → template.errors.ts} +20 -23
  29. package/src/lib/interfaces/{module-config.interface.d.ts → module-config.interface.ts} +16 -1
  30. package/src/lib/interfaces/template.types.ts +25 -0
  31. package/src/lib/nest-dynamic-templates.module.ts +143 -0
  32. package/src/lib/services/template-config.service.ts +112 -0
  33. package/src/lib/services/template-engine.registry.ts +109 -0
  34. package/src/lib/services/template-layout.service.ts +407 -0
  35. package/src/lib/services/template.service.ts +476 -0
  36. package/src/test/{helpers.js → helpers.ts} +5 -8
  37. package/src/test/nunjucks.service.spec.ts +157 -0
  38. package/src/test/pug.service.spec-temp +254 -0
  39. package/src/test/template-layout.service.spec.ts +422 -0
  40. package/src/test/template.service.spec.ts +862 -0
  41. package/src/test/test-database.config.ts +24 -0
  42. package/src/test/test-database.d.ts +6 -0
  43. package/src/test/test.setup.ts +34 -0
  44. package/src/types/ioredis.d.ts +6 -0
  45. package/src/types/mjml.d.ts +5 -0
  46. package/tsconfig.json +17 -0
  47. package/tsconfig.lib.json +14 -0
  48. package/tsconfig.spec.json +15 -0
  49. package/src/index.js +0 -23
  50. package/src/index.js.map +0 -1
  51. package/src/lib/constant.d.ts +0 -2
  52. package/src/lib/constant.js +0 -6
  53. package/src/lib/constant.js.map +0 -1
  54. package/src/lib/dto/create-template-layout.dto.d.ts +0 -15
  55. package/src/lib/dto/create-template-layout.dto.js +0 -87
  56. package/src/lib/dto/create-template-layout.dto.js.map +0 -1
  57. package/src/lib/dto/create-template.dto.d.ts +0 -17
  58. package/src/lib/dto/create-template.dto.js +0 -104
  59. package/src/lib/dto/create-template.dto.js.map +0 -1
  60. package/src/lib/dto/render-content-template-layout.dto.d.ts +0 -7
  61. package/src/lib/dto/render-content-template-layout.dto.js +0 -41
  62. package/src/lib/dto/render-content-template-layout.dto.js.map +0 -1
  63. package/src/lib/dto/render-content-template.dto.d.ts +0 -8
  64. package/src/lib/dto/render-content-template.dto.js +0 -47
  65. package/src/lib/dto/render-content-template.dto.js.map +0 -1
  66. package/src/lib/dto/render-template-layout.dto.d.ts +0 -10
  67. package/src/lib/dto/render-template-layout.dto.js +0 -68
  68. package/src/lib/dto/render-template-layout.dto.js.map +0 -1
  69. package/src/lib/dto/render-template.dto.d.ts +0 -14
  70. package/src/lib/dto/render-template.dto.js +0 -91
  71. package/src/lib/dto/render-template.dto.js.map +0 -1
  72. package/src/lib/dto/template-filter.dto.d.ts +0 -8
  73. package/src/lib/dto/template-filter.dto.js +0 -62
  74. package/src/lib/dto/template-filter.dto.js.map +0 -1
  75. package/src/lib/dto/template-layout-filter.dto.d.ts +0 -7
  76. package/src/lib/dto/template-layout-filter.dto.js +0 -61
  77. package/src/lib/dto/template-layout-filter.dto.js.map +0 -1
  78. package/src/lib/engines/language/html.engine.d.ts +0 -9
  79. package/src/lib/engines/language/html.engine.js +0 -79
  80. package/src/lib/engines/language/html.engine.js.map +0 -1
  81. package/src/lib/engines/language/index.js +0 -12
  82. package/src/lib/engines/language/index.js.map +0 -1
  83. package/src/lib/engines/language/markdown.engine.d.ts +0 -9
  84. package/src/lib/engines/language/markdown.engine.js +0 -26
  85. package/src/lib/engines/language/markdown.engine.js.map +0 -1
  86. package/src/lib/engines/language/mjml.engine.d.ts +0 -9
  87. package/src/lib/engines/language/mjml.engine.js +0 -76
  88. package/src/lib/engines/language/mjml.engine.js.map +0 -1
  89. package/src/lib/engines/language/text.engine.d.ts +0 -7
  90. package/src/lib/engines/language/text.engine.js +0 -16
  91. package/src/lib/engines/language/text.engine.js.map +0 -1
  92. package/src/lib/engines/language-engine.js +0 -7
  93. package/src/lib/engines/language-engine.js.map +0 -1
  94. package/src/lib/engines/template/ejs.engine.d.ts +0 -10
  95. package/src/lib/engines/template/ejs.engine.js +0 -66
  96. package/src/lib/engines/template/ejs.engine.js.map +0 -1
  97. package/src/lib/engines/template/handlebars.engine.d.ts +0 -10
  98. package/src/lib/engines/template/handlebars.engine.js +0 -67
  99. package/src/lib/engines/template/handlebars.engine.js.map +0 -1
  100. package/src/lib/engines/template/index.js +0 -12
  101. package/src/lib/engines/template/index.js.map +0 -1
  102. package/src/lib/engines/template/nunjucks.engine.d.ts +0 -16
  103. package/src/lib/engines/template/nunjucks.engine.js +0 -63
  104. package/src/lib/engines/template/nunjucks.engine.js.map +0 -1
  105. package/src/lib/engines/template/pug.engine.d.ts +0 -12
  106. package/src/lib/engines/template/pug.engine.js +0 -75
  107. package/src/lib/engines/template/pug.engine.js.map +0 -1
  108. package/src/lib/engines/template-engine.js +0 -7
  109. package/src/lib/engines/template-engine.js.map +0 -1
  110. package/src/lib/entities/template-layout.entity.d.ts +0 -20
  111. package/src/lib/entities/template-layout.entity.js +0 -121
  112. package/src/lib/entities/template-layout.entity.js.map +0 -1
  113. package/src/lib/entities/template.entity.d.ts +0 -21
  114. package/src/lib/entities/template.entity.js +0 -128
  115. package/src/lib/entities/template.entity.js.map +0 -1
  116. package/src/lib/errors/template.errors.d.ts +0 -19
  117. package/src/lib/errors/template.errors.js.map +0 -1
  118. package/src/lib/interfaces/module-config.interface.js +0 -3
  119. package/src/lib/interfaces/module-config.interface.js.map +0 -1
  120. package/src/lib/interfaces/template.types.d.ts +0 -22
  121. package/src/lib/interfaces/template.types.js +0 -25
  122. package/src/lib/interfaces/template.types.js.map +0 -1
  123. package/src/lib/nest-dynamic-templates.module.d.ts +0 -10
  124. package/src/lib/nest-dynamic-templates.module.js +0 -131
  125. package/src/lib/nest-dynamic-templates.module.js.map +0 -1
  126. package/src/lib/services/template-config.service.d.ts +0 -18
  127. package/src/lib/services/template-config.service.js +0 -66
  128. package/src/lib/services/template-config.service.js.map +0 -1
  129. package/src/lib/services/template-engine.registry.d.ts +0 -21
  130. package/src/lib/services/template-engine.registry.js +0 -94
  131. package/src/lib/services/template-engine.registry.js.map +0 -1
  132. package/src/lib/services/template-layout.service.d.ts +0 -24
  133. package/src/lib/services/template-layout.service.js +0 -301
  134. package/src/lib/services/template-layout.service.js.map +0 -1
  135. package/src/lib/services/template.service.d.ts +0 -26
  136. package/src/lib/services/template.service.js +0 -366
  137. package/src/lib/services/template.service.js.map +0 -1
  138. package/src/test/helpers.d.ts +0 -4
  139. package/src/test/helpers.js.map +0 -1
  140. package/src/test/test-database.config.d.ts +0 -4
  141. package/src/test/test-database.config.js +0 -24
  142. package/src/test/test-database.config.js.map +0 -1
  143. package/src/test/test.setup.d.ts +0 -3
  144. package/src/test/test.setup.js +0 -29
  145. package/src/test/test.setup.js.map +0 -1
  146. package/tsconfig.tsbuildinfo +0 -1
  147. /package/src/lib/engines/language/{index.d.ts → index.ts} +0 -0
  148. /package/src/lib/engines/template/{index.d.ts → index.ts} +0 -0
package/README.md CHANGED
@@ -1,289 +1,11 @@
1
- # NestJS Dynamic Templates
1
+ # nest-auth
2
2
 
3
- A powerful NestJS module for dynamic template management with support for multiple template engines and languages.
3
+ This library was generated with [Nx](https://nx.dev).
4
4
 
5
- ## Features
5
+ ## Building
6
6
 
7
- - 🚀 Multiple template engines (Nunjucks, Handlebars, EJS, Pug)
8
- - 🌐 Multiple language support (HTML, MJML, Markdown, Text)
9
- - 💾 Database storage for templates and layouts
10
- - 🔧 Configurable and extensible
11
- - 🎯 TypeScript support
12
- - 📦 Easy integration
7
+ Run `nx build nest-auth` to build the library.
13
8
 
14
- ## Installation
9
+ ## Running unit tests
15
10
 
16
- ```bash
17
- npm install @ackplus/nest-dynamic-templates
18
- # or
19
- yarn add @ackplus/nest-dynamic-templates
20
- ```
21
-
22
- ## Usage
23
-
24
- ### Option 1: Basic Usage (No Configuration Required)
25
-
26
- ```typescript
27
- import { Module } from '@nestjs/common';
28
- import { NestDynamicTemplatesModule } from '@ackplus/nest-dynamic-templates';
29
-
30
- @Module({
31
- imports: [
32
- NestDynamicTemplatesModule, // Provides basic services with default configuration
33
- ],
34
- })
35
- export class AppModule {}
36
- ```
37
-
38
- ### Option 2: Using forFeature() (Explicit Basic Usage)
39
-
40
- ```typescript
41
- import { Module } from '@nestjs/common';
42
- import { NestDynamicTemplatesModule } from '@ackplus/nest-dynamic-templates';
43
-
44
- @Module({
45
- imports: [
46
- NestDynamicTemplatesModule.forFeature(), // Explicitly import basic services
47
- ],
48
- })
49
- export class AppModule {}
50
- ```
51
-
52
- ### Option 3: Using forRoot() (With Configuration)
53
-
54
- ```typescript
55
- import { Module } from '@nestjs/common';
56
- import { NestDynamicTemplatesModule, TemplateEngineEnum, TemplateLanguageEnum } from '@ackplus/nest-dynamic-templates';
57
-
58
- @Module({
59
- imports: [
60
- NestDynamicTemplatesModule.forRoot({
61
- isGlobal: true,
62
- engines: {
63
- template: [TemplateEngineEnum.NUNJUCKS, TemplateEngineEnum.HANDLEBARS],
64
- language: [TemplateLanguageEnum.HTML, TemplateLanguageEnum.MJML],
65
- },
66
- enginesOptions: {
67
- filters: {
68
- uppercase: (str) => str.toUpperCase(),
69
- reverse: (str) => str.split('').reverse().join(''),
70
- },
71
- template: {
72
- [TemplateEngineEnum.NUNJUCKS]: {
73
- autoescape: true,
74
- },
75
- },
76
- },
77
- }),
78
- ],
79
- })
80
- export class AppModule {}
81
- ```
82
-
83
- ### Option 4: Using forRootAsync() (Async Configuration)
84
-
85
- #### With useFactory
86
-
87
- ```typescript
88
- import { Module } from '@nestjs/common';
89
- import { ConfigModule, ConfigService } from '@nestjs/config';
90
- import { NestDynamicTemplatesModule } from '@ackplus/nest-dynamic-templates';
91
-
92
- @Module({
93
- imports: [
94
- ConfigModule.forRoot(),
95
- NestDynamicTemplatesModule.forRootAsync({
96
- imports: [ConfigModule],
97
- useFactory: async (configService: ConfigService) => ({
98
- isGlobal: true,
99
- engines: {
100
- template: configService.get('TEMPLATE_ENGINES')?.split(',') || ['nunjucks'],
101
- language: configService.get('LANGUAGE_ENGINES')?.split(',') || ['html'],
102
- },
103
- }),
104
- inject: [ConfigService],
105
- }),
106
- ],
107
- })
108
- export class AppModule {}
109
- ```
110
-
111
- #### With useClass
112
-
113
- ```typescript
114
- import { Injectable } from '@nestjs/common';
115
- import {
116
- NestDynamicTemplatesModuleOptionsFactory,
117
- NestDynamicTemplatesModuleConfig,
118
- TemplateEngineEnum,
119
- TemplateLanguageEnum
120
- } from '@ackplus/nest-dynamic-templates';
121
-
122
- @Injectable()
123
- export class TemplatesConfigService implements NestDynamicTemplatesModuleOptionsFactory {
124
- createNestDynamicTemplatesModuleOptions(): NestDynamicTemplatesModuleConfig {
125
- return {
126
- isGlobal: true,
127
- engines: {
128
- template: [TemplateEngineEnum.NUNJUCKS],
129
- language: [TemplateLanguageEnum.HTML, TemplateLanguageEnum.MJML],
130
- },
131
- };
132
- }
133
- }
134
-
135
- @Module({
136
- imports: [
137
- NestDynamicTemplatesModule.forRootAsync({
138
- useClass: TemplatesConfigService,
139
- }),
140
- ],
141
- providers: [TemplatesConfigService],
142
- })
143
- export class AppModule {}
144
- ```
145
-
146
- ## Using the Services
147
-
148
- Once imported, you can inject and use the template services:
149
-
150
- ```typescript
151
- import { Injectable } from '@nestjs/common';
152
- import { TemplateService, TemplateLayoutService } from '@ackplus/nest-dynamic-templates';
153
-
154
- @Injectable()
155
- export class EmailService {
156
- constructor(
157
- private readonly templateService: TemplateService,
158
- private readonly templateLayoutService: TemplateLayoutService,
159
- ) {}
160
-
161
- async sendWelcomeEmail(user: any) {
162
- // Create a template
163
- const template = await this.templateService.createTemplate({
164
- name: 'welcome-email',
165
- displayName: 'Welcome Email',
166
- engine: 'nunjucks',
167
- language: 'html',
168
- subject: 'Welcome {{ user.name }}!',
169
- content: '<h1>Hello {{ user.name }}</h1><p>Welcome to our platform!</p>',
170
- scope: 'system',
171
- locale: 'en',
172
- });
173
-
174
- // Render the template
175
- const rendered = await this.templateService.renderTemplate('welcome-email', {
176
- user: { name: user.name },
177
- });
178
-
179
- console.log('Rendered email:', rendered);
180
- // Send email using your preferred email service
181
- }
182
-
183
- async createEmailLayout() {
184
- // Create a layout
185
- const layout = await this.templateLayoutService.createTemplateLayout({
186
- name: 'email-layout',
187
- displayName: 'Email Layout',
188
- engine: 'nunjucks',
189
- language: 'html',
190
- content: `
191
- <!DOCTYPE html>
192
- <html>
193
- <head><title>{{ subject }}</title></head>
194
- <body>
195
- <header>Our Company</header>
196
- <main>{{ content | safe }}</main>
197
- <footer>© 2024 Our Company</footer>
198
- </body>
199
- </html>
200
- `,
201
- scope: 'system',
202
- locale: 'en',
203
- });
204
-
205
- return layout;
206
- }
207
- }
208
- ```
209
-
210
- ## Configuration Options
211
-
212
- ### NestDynamicTemplatesModuleConfig
213
-
214
- ```typescript
215
- interface NestDynamicTemplatesModuleConfig {
216
- isGlobal?: boolean; // Make module global
217
- engines?: {
218
- template?: TemplateEngineEnum[]; // Enabled template engines
219
- language?: TemplateLanguageEnum[]; // Enabled language engines
220
- };
221
- enginesOptions?: {
222
- filters?: Record<string, Function>; // Custom filters
223
- template?: Partial<Record<TemplateEngineEnum, any>>; // Engine-specific options
224
- language?: Partial<Record<TemplateLanguageEnum, any>>; // Language-specific options
225
- };
226
- }
227
- ```
228
-
229
- ### Supported Engines
230
-
231
- #### Template Engines
232
- - `nunjucks` - Nunjucks templating
233
- - `handlebars` - Handlebars templating
234
- - `ejs` - EJS templating
235
- - `pug` - Pug templating
236
-
237
- #### Language Engines
238
- - `html` - HTML output
239
- - `mjml` - MJML email templates
240
- - `markdown` - Markdown output
241
- - `text` - Plain text output
242
-
243
- ## Benefits of Each Approach
244
-
245
- ### Basic Usage (`NestDynamicTemplatesModule`)
246
- - ✅ **Zero configuration** - Works out of the box
247
- - ✅ **Quick setup** - Just import and use
248
- - ✅ **Default engines** - Nunjucks + HTML/MJML/Text
249
- - ❌ **Limited customization** - No custom filters or options
250
-
251
- ### forFeature()
252
- - ✅ **Explicit** - Clear intent for basic usage
253
- - ✅ **Same as basic** - All benefits of basic usage
254
- - ✅ **Consistent API** - Matches other NestJS modules
255
-
256
- ### forRoot()
257
- - ✅ **Full configuration** - Complete control over engines and options
258
- - ✅ **Custom filters** - Add your own template filters
259
- - ✅ **Engine options** - Configure individual engines
260
- - ✅ **Global module** - Available throughout the app
261
-
262
- ### forRootAsync()
263
- - ✅ **Dynamic configuration** - Load config from external sources
264
- - ✅ **Dependency injection** - Use other services for configuration
265
- - ✅ **Environment-based** - Different configs for different environments
266
- - ✅ **Factory pattern** - Clean separation of configuration logic
267
-
268
- ## Migration Guide
269
-
270
- If you're upgrading from a previous version:
271
-
272
- ### Before
273
- ```typescript
274
- // Only forRoot was available
275
- NestDynamicTemplatesModule.forRoot(config)
276
- ```
277
-
278
- ### After
279
- ```typescript
280
- // Multiple options now available
281
- NestDynamicTemplatesModule // Basic usage
282
- NestDynamicTemplatesModule.forFeature() // Explicit basic usage
283
- NestDynamicTemplatesModule.forRoot(config) // With configuration
284
- NestDynamicTemplatesModule.forRootAsync(...) // Async configuration
285
- ```
286
-
287
- ## License
288
-
289
- MIT
11
+ Run `nx test nest-auth` to execute the unit tests via [Jest](https://jestjs.io).
@@ -0,0 +1,22 @@
1
+ import baseConfig from '../../eslint.base.config';
2
+
3
+ export default [
4
+ ...baseConfig,
5
+ {
6
+ files: ['**/*.json'],
7
+ rules: {
8
+ '@nx/dependency-checks': [
9
+ 'error',
10
+ {
11
+ ignoredFiles: ['{projectRoot}/eslint.config.{js,cjs,mjs,ts,cts,mts}'],
12
+ },
13
+ ],
14
+ },
15
+ languageOptions: {
16
+ parser: await import('jsonc-eslint-parser'),
17
+ },
18
+ },
19
+ {
20
+ ignores: ['**/out-tsc'],
21
+ },
22
+ ];
package/jest.config.ts ADDED
@@ -0,0 +1,10 @@
1
+ export default {
2
+ displayName: 'nest-dynamic-templates',
3
+ preset: '../../jest.preset.js',
4
+ testEnvironment: 'node',
5
+ transform: {
6
+ '^.+\\.[tj]s$': ['ts-jest', { tsconfig: '<rootDir>/tsconfig.spec.json' }],
7
+ },
8
+ moduleFileExtensions: ['ts', 'js', 'html'],
9
+ coverageDirectory: '../../coverage/packages/nest-dynamic-templates',
10
+ };
package/package.json CHANGED
@@ -1,61 +1,10 @@
1
1
  {
2
2
  "name": "@ackplus/nest-dynamic-templates",
3
- "version": "0.1.51",
4
- "description": "Dynamic template management for NestJS applications",
5
- "author": "Chetan",
6
- "dependencies": {
7
- "class-transformer": "^0.5.1",
8
- "class-validator": "^0.14.0",
9
- "reflect-metadata": "^0.1.13",
10
- "rxjs": "^7.8.1"
11
- },
12
- "optionalDependencies": {
13
- "nunjucks": "^3.2.4",
14
- "handlebars": "^4.7.8",
15
- "ejs": "^3.1.9",
16
- "pug": "^3.0.2",
17
- "mjml": "^4.14.1",
18
- "marked": "^11.1.1",
19
- "htmlparser2": "^9.0.0"
20
- },
21
- "devDependencies": {
22
- "@nestjs/common": "^10.0.0",
23
- "@nestjs/core": "^10.0.0",
24
- "@nestjs/platform-express": "^10.0.0",
25
- "@nestjs/swagger": "^7.0.0",
26
- "typeorm": "^0.3.23",
27
- "@nestjs/typeorm": "^11.0.0",
28
- "@types/jest": "^29.5.0",
29
- "@types/node": "^20.0.0",
30
- "@types/nunjucks": "^3.2.5",
31
- "@types/handlebars": "^4.1.0",
32
- "@types/ejs": "^3.1.5",
33
- "@types/pug": "^2.0.6",
34
- "@types/marked": "^5.0.2",
35
- "@types/htmlparser2": "^3.10.7",
36
- "eslint": "^8.0.0",
37
- "jest": "^29.5.0",
38
- "typescript": "^5.0.0"
39
- },
40
- "peerDependencies": {
41
- "typeorm": "^0.3.23",
42
- "@nestjs/typeorm": "^11.0.0",
43
- "@nestjs/common": "^10.4.5",
44
- "@nestjs/core": "^10.4.5"
45
- },
46
- "keywords": [
47
- "nestjs",
48
- "templates",
49
- "dynamic",
50
- "email",
51
- "mjml",
52
- "nunjucks",
53
- "handlebars",
54
- "ejs",
55
- "pug"
56
- ],
57
- "license": "MIT",
58
- "types": "./src/index.d.ts",
3
+ "version": "1.1.1",
4
+ "type": "commonjs",
59
5
  "main": "./src/index.js",
60
- "type": "commonjs"
61
- }
6
+ "types": "./src/index.d.ts",
7
+ "dependencies": {
8
+ "tslib": "^2.3.0"
9
+ }
10
+ }
package/project.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "nest-dynamic-templates",
3
+ "$schema": "../../node_modules/nx/schemas/project-schema.json",
4
+ "sourceRoot": "packages/nest-dynamic-templates/src",
5
+ "projectType": "library",
6
+ "release": {
7
+ "version": {
8
+ "manifestRootsToUpdate": [
9
+ "dist/{projectRoot}"
10
+ ],
11
+ "currentVersionResolver": "git-tag",
12
+ "fallbackCurrentVersionResolver": "disk"
13
+ }
14
+ },
15
+ "tags": [],
16
+ "targets": {
17
+ "build": {
18
+ "executor": "@nx/js:tsc",
19
+ "outputs": [
20
+ "{options.outputPath}"
21
+ ],
22
+ "options": {
23
+ "outputPath": "dist/packages/nest-dynamic-templates",
24
+ "tsConfig": "packages/nest-dynamic-templates/tsconfig.lib.json",
25
+ "packageJson": "packages/nest-dynamic-templates/package.json",
26
+ "main": "packages/nest-dynamic-templates/src/index.ts",
27
+ "assets": [
28
+ "packages/nest-dynamic-templates/*.md"
29
+ ]
30
+ }
31
+ },
32
+ "nx-release-publish": {
33
+ "options": {
34
+ "packageRoot": "dist/{projectRoot}"
35
+ }
36
+ }
37
+ }
38
+ }
@@ -1,14 +1,27 @@
1
1
  import { NestDynamicTemplateLayout } from './lib/entities/template-layout.entity';
2
+ import { NestDynamicTemplate } from './lib/entities/template.entity';
3
+
2
4
  export * from './lib/nest-dynamic-templates.module';
5
+
6
+ // Services
3
7
  export * from './lib/services/template.service';
4
8
  export * from './lib/services/template-layout.service';
5
9
  export * from './lib/services/template-config.service';
10
+
11
+ // Interfaces
6
12
  export * from './lib/interfaces/module-config.interface';
7
13
  export * from './lib/interfaces/template.types';
14
+
15
+ // DTOs
8
16
  export * from './lib/dto/create-template.dto';
9
17
  export * from './lib/dto/render-template.dto';
10
18
  export * from './lib/dto/template-filter.dto';
11
19
  export * from './lib/dto/create-template-layout.dto';
12
20
  export * from './lib/dto/render-template-layout.dto';
13
21
  export * from './lib/dto/template-layout-filter.dto';
14
- export declare const NestDynamicTemplatesEntities: (typeof NestDynamicTemplateLayout)[];
22
+
23
+
24
+ export const NestDynamicTemplatesEntities = [
25
+ NestDynamicTemplate,
26
+ NestDynamicTemplateLayout,
27
+ ];
@@ -0,0 +1,2 @@
1
+ export const NEST_DYNAMIC_TEMPLATES_MODULE_CONFIG = Symbol('NEST_DYNAMIC_TEMPLATES_MODULE_CONFIG');
2
+ export const NEST_DYNAMIC_TEMPLATES_ASYNC_OPTIONS_PROVIDER = 'NEST_DYNAMIC_TEMPLATES_ASYNC_OPTIONS_PROVIDER';
@@ -0,0 +1,65 @@
1
+ import { IsString, IsEnum, IsOptional, IsNotEmpty, Matches } from 'class-validator';
2
+ import { TemplateEngineEnum, TemplateLanguageEnum } from '../interfaces/template.types';
3
+ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
4
+
5
+
6
+ export class CreateTemplateLayoutDto {
7
+
8
+ @ApiProperty({ type: String })
9
+ @IsString()
10
+ @IsNotEmpty()
11
+ @Matches(/^[a-z0-9\-_]+$/, { message: 'Invalid template name format' })
12
+ name: string;
13
+
14
+ @ApiProperty({ type: String })
15
+ @IsString()
16
+ @IsOptional()
17
+ type?: string;
18
+
19
+ @ApiPropertyOptional({ type: String })
20
+ @IsString()
21
+ @IsNotEmpty()
22
+ displayName: string;
23
+
24
+ @ApiProperty({ type: String, nullable: true })
25
+ @IsString()
26
+ @IsOptional()
27
+ description?: string;
28
+
29
+ @ApiProperty({ enum: TemplateEngineEnum, type: String })
30
+ @IsEnum(TemplateEngineEnum)
31
+ @IsOptional()
32
+ engine: TemplateEngineEnum = TemplateEngineEnum.NUNJUCKS;
33
+
34
+ @ApiProperty({ enum: TemplateLanguageEnum, type: String })
35
+ @IsEnum(TemplateLanguageEnum)
36
+ @IsNotEmpty()
37
+ language: TemplateLanguageEnum;
38
+
39
+ @ApiProperty({ type: String, nullable: true })
40
+ @IsString()
41
+ content: string;
42
+
43
+ @ApiPropertyOptional({ type: String, default: 'system' })
44
+ @IsString()
45
+ @IsOptional()
46
+ scope: string = 'system';
47
+
48
+ @ApiPropertyOptional({ type: String })
49
+ @IsString()
50
+ @IsOptional()
51
+ scopeId?: string;
52
+
53
+ @ApiPropertyOptional({ type: String, nullable: true, default: 'en' })
54
+ @IsString()
55
+ @IsOptional()
56
+ locale?: string = 'en';
57
+
58
+ @ApiPropertyOptional({ type: Object, nullable: true })
59
+ @IsOptional()
60
+ previewContext?: Record<string, any>;
61
+
62
+ @ApiPropertyOptional({ type: Boolean, nullable: true })
63
+ @IsOptional()
64
+ isActive?: boolean = true;
65
+ }
@@ -0,0 +1,80 @@
1
+ import { IsString, IsEnum, IsOptional, IsNotEmpty, Matches, IsBoolean } from 'class-validator';
2
+ import { TemplateEngineEnum, TemplateLanguageEnum, TemplateTypeEnum } from '../interfaces/template.types';
3
+ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
4
+ import { Transform } from 'class-transformer';
5
+
6
+ export class CreateTemplateDto {
7
+
8
+ @ApiProperty({ type: String })
9
+ @IsString()
10
+ @IsNotEmpty()
11
+ @Matches(/^[a-z0-9\-_]+$/, { message: 'Invalid template name format' })
12
+ name: string;
13
+
14
+ @ApiPropertyOptional({ type: String, nullable: true })
15
+ @IsString()
16
+ @IsOptional()
17
+ templateLayoutName?: string;
18
+
19
+ @ApiProperty({ type: String })
20
+ @IsString()
21
+ @IsOptional()
22
+ type?: string;
23
+
24
+ @ApiPropertyOptional({ type: String })
25
+ @IsString()
26
+ @IsNotEmpty()
27
+ displayName: string;
28
+
29
+ @ApiProperty({ type: String, nullable: true })
30
+ @IsString()
31
+ @IsOptional()
32
+ description?: string;
33
+
34
+ @ApiProperty({ enum: TemplateEngineEnum, type: String })
35
+ @IsEnum(TemplateEngineEnum)
36
+ @IsOptional()
37
+ engine: TemplateEngineEnum = TemplateEngineEnum.NUNJUCKS;
38
+
39
+ @ApiProperty({ enum: TemplateLanguageEnum, type: String })
40
+ @IsEnum(TemplateLanguageEnum)
41
+ language: TemplateLanguageEnum;
42
+
43
+ @ApiProperty({ type: String, nullable: true })
44
+ @IsString()
45
+ @IsOptional()
46
+ content: string;
47
+
48
+ @ApiPropertyOptional({ type: String, nullable: true })
49
+ @IsString()
50
+ @IsOptional()
51
+ subject?: string;
52
+
53
+ @ApiPropertyOptional({ type: String, default: 'system' })
54
+ @IsString()
55
+ @IsOptional()
56
+ @Transform(({ value }) => value || 'system')
57
+ scope: string = 'system';
58
+
59
+ @ApiPropertyOptional({ type: String })
60
+ @IsString()
61
+ @IsOptional()
62
+ scopeId?: string;
63
+
64
+ @ApiPropertyOptional({ type: String, nullable: true, default: 'en' })
65
+ @IsString()
66
+ @IsOptional()
67
+ @IsNotEmpty()
68
+ @Transform(({ value }) => value || 'en')
69
+ locale?: string = 'en';
70
+
71
+ @ApiPropertyOptional({ type: Object, nullable: true })
72
+ @IsOptional()
73
+ previewContext?: Record<string, any>;
74
+
75
+ @ApiPropertyOptional({ type: Boolean, nullable: true })
76
+ @IsBoolean()
77
+ @IsOptional()
78
+ isActive?: boolean = true;
79
+
80
+ }
@@ -0,0 +1,32 @@
1
+ import { IsString, IsEnum, IsObject, IsOptional, IsNotEmpty } from 'class-validator';
2
+ import { TemplateEngineEnum, TemplateLanguageEnum } from '../interfaces/template.types';
3
+ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
4
+ import { Transform } from 'class-transformer';
5
+
6
+
7
+ export class RenderContentTemplateLayoutDto {
8
+ @ApiProperty({ type: String })
9
+ @IsString()
10
+ @IsNotEmpty()
11
+ content?: string;
12
+
13
+ @ApiProperty({ enum: TemplateLanguageEnum, type: String })
14
+ @IsEnum(TemplateLanguageEnum)
15
+ @IsNotEmpty()
16
+ @Transform(({ value }) => value || TemplateLanguageEnum.HTML)
17
+ language?: TemplateLanguageEnum;
18
+
19
+ @ApiProperty({ enum: TemplateEngineEnum, type: String })
20
+ @IsEnum(TemplateEngineEnum)
21
+ @Transform(({ value }) => value || TemplateEngineEnum.NUNJUCKS)
22
+ engine?: TemplateEngineEnum;
23
+
24
+ @ApiPropertyOptional({
25
+ type: String,
26
+ nullable: true,
27
+ description: 'The context of the template'
28
+ })
29
+ @IsObject()
30
+ @IsOptional()
31
+ context?: Record<string, any>;
32
+ }
@@ -0,0 +1,37 @@
1
+ import { IsString, IsEnum, IsObject, IsOptional, IsNotEmpty } from 'class-validator';
2
+ import { TemplateEngineEnum, TemplateLanguageEnum } from '../interfaces/template.types';
3
+ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
4
+ import { Transform } from 'class-transformer';
5
+
6
+
7
+ export class RenderContentTemplateDto {
8
+ @ApiProperty({ type: String })
9
+ @IsString()
10
+ @IsNotEmpty()
11
+ content?: string;
12
+
13
+ @ApiProperty({ enum: TemplateLanguageEnum, type: String })
14
+ @IsEnum(TemplateLanguageEnum)
15
+ @IsNotEmpty()
16
+ @Transform(({ value }) => value || TemplateLanguageEnum.HTML)
17
+ language?: TemplateLanguageEnum;
18
+
19
+ @ApiProperty({ enum: TemplateEngineEnum, type: String })
20
+ @IsEnum(TemplateEngineEnum)
21
+ @Transform(({ value }) => value || TemplateEngineEnum.NUNJUCKS)
22
+ engine?: TemplateEngineEnum;
23
+
24
+ @ApiPropertyOptional({
25
+ type: String,
26
+ nullable: true,
27
+ description: 'The context of the template'
28
+ })
29
+ @IsObject()
30
+ @IsOptional()
31
+ context?: Record<string, any>;
32
+
33
+ @ApiPropertyOptional({ type: String })
34
+ @IsString()
35
+ @IsOptional()
36
+ templateLayoutId?: string;
37
+ }