miki-template 2.2.3 → 2.3.0

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 (65) hide show
  1. package/.github/workflows/docs.yml +3 -1
  2. package/.github/workflows/release.yml +0 -5
  3. package/benchmarks/ejs-results.json +6 -6
  4. package/benchmarks/ejs.js +5 -3
  5. package/benchmarks/handlebars-results.json +6 -6
  6. package/benchmarks/handlebars.js +5 -8
  7. package/benchmarks/miki-results.json +6 -6
  8. package/benchmarks/miki.js +6 -3
  9. package/benchmarks/pug-results.json +6 -6
  10. package/benchmarks/pug.js +5 -3
  11. package/docs/api/async-render.md +88 -3
  12. package/docs/api/cache.md +90 -3
  13. package/docs/api/compile.md +131 -3
  14. package/docs/api/context-processors.md +80 -3
  15. package/docs/api/filters.md +223 -3
  16. package/docs/api/finder.md +97 -3
  17. package/docs/api/helpers.md +56 -3
  18. package/docs/api/i18n.md +160 -3
  19. package/docs/api/index.md +82 -28
  20. package/docs/api/libraries.md +210 -3
  21. package/docs/api/render-partial.md +84 -3
  22. package/docs/api/render.md +95 -3
  23. package/docs/api/security.md +148 -3
  24. package/docs/api/setup-express.md +78 -2
  25. package/docs/api/tags.md +138 -4
  26. package/docs/filter.md +0 -0
  27. package/docs/guide/advanced-usage.md +403 -6
  28. package/docs/guide/async-rendering.md +312 -4
  29. package/docs/guide/context-processors.md +261 -4
  30. package/docs/guide/custom-filters.md +315 -4
  31. package/docs/guide/custom-tags.md +275 -4
  32. package/docs/guide/filters.md +675 -3
  33. package/docs/guide/getting-started.md +109 -7
  34. package/docs/guide/installation.md +99 -4
  35. package/docs/guide/partial-templates.md +371 -4
  36. package/docs/guide/quick-start.md +228 -6
  37. package/docs/guide/security.md +348 -3
  38. package/docs/guide/tags.md +789 -6
  39. package/docs/guide/template-discovery.md +174 -4
  40. package/docs/guide/template-inheritance.md +277 -4
  41. package/docs/index.md +24 -42
  42. package/docs/integrations/elysia.md +4 -2
  43. package/docs/integrations/express.md +219 -219
  44. package/docs/integrations/fastify.md +4 -2
  45. package/docs/integrations/hono.md +4 -2
  46. package/docs/integrations/index.md +68 -68
  47. package/docs/integrations/koa.md +4 -2
  48. package/docs/integrations/nestjs.md +4 -2
  49. package/docs/integrations/tsed.md +4 -2
  50. package/docs/performance.md +45 -8
  51. package/ex.mjs +1 -1
  52. package/mkdocs.yml +0 -22
  53. package/overrides/main.html +1 -1
  54. package/package.json +1 -1
  55. package/requirements-docs.txt +2 -1
  56. package/src/codegen.js +905 -0
  57. package/src/context.js +42 -30
  58. package/src/filters.js +16 -0
  59. package/src/index.js +66 -61
  60. package/src/tags/control.js +15 -12
  61. package/src/utils.js +60 -0
  62. package/tests/filters.test.js +9 -0
  63. package/docs/javascripts/extra.js +0 -174
  64. package/docs/stylesheets/extra.css +0 -819
  65. package/overrides/partials/footer.html +0 -9
package/docs/api/i18n.md CHANGED
@@ -1,157 +1,314 @@
1
- # i18n API
1
+ # i18n API
2
+
3
+
2
4
 
3
5
  ## registerTranslation
4
6
 
7
+
8
+
5
9
  Register translations for a language. Keys match the `{% trans "text" %}` source string.
6
10
 
11
+
12
+
7
13
  === "CommonJS"
8
14
 
15
+
16
+
9
17
  ```javascript
18
+
10
19
  const { registerTranslation } = require('miki-template');
11
20
 
21
+
22
+
12
23
  registerTranslation('en', {
24
+
13
25
  hello: 'Hello',
26
+
14
27
  goodbye: 'Goodbye'
28
+
15
29
  });
30
+
16
31
  ```
17
32
 
33
+
34
+
18
35
  === "ES Modules"
19
36
 
37
+
38
+
20
39
  ```javascript
40
+
21
41
  import { registerTranslation } from 'miki-template';
22
42
 
43
+
44
+
23
45
  registerTranslation('en', {
46
+
24
47
  hello: 'Hello',
48
+
25
49
  goodbye: 'Goodbye'
50
+
26
51
  });
52
+
27
53
  ```
28
54
 
55
+
56
+
29
57
  You can also register nested keys for `blocktrans` with variables:
30
58
 
59
+
60
+
31
61
  === "CommonJS"
32
62
 
63
+
64
+
33
65
  ```javascript
66
+
34
67
  const { registerTranslation, setLanguage } = require('miki-template');
35
68
 
69
+
70
+
36
71
  setLanguage('en');
72
+
37
73
  registerTranslation('en', {
74
+
38
75
  'Welcome, {name}!': 'Welcome, {name}!',
76
+
39
77
  'Goodbye, {name}!': 'Goodbye, {name}!'
78
+
40
79
  });
80
+
41
81
  ```
42
82
 
83
+
84
+
43
85
  === "ES Modules"
44
86
 
87
+
88
+
45
89
  ```javascript
90
+
46
91
  import { registerTranslation, setLanguage } from 'miki-template';
47
92
 
93
+
94
+
48
95
  setLanguage('en');
96
+
49
97
  registerTranslation('en', {
98
+
50
99
  'Welcome, {name}!': 'Welcome, {name}!',
100
+
51
101
  'Goodbye, {name}!': 'Goodbye, {name}!'
102
+
52
103
  });
104
+
53
105
  ```
54
106
 
107
+
108
+
55
109
  ## unregisterTranslation
56
110
 
111
+
112
+
57
113
  === "CommonJS"
58
114
 
115
+
116
+
59
117
  ```javascript
118
+
60
119
  const { unregisterTranslation } = require('miki-template');
61
120
 
121
+
122
+
62
123
  // Unregister a specific key
124
+
63
125
  unregisterTranslation('en', 'hello');
64
126
 
127
+
128
+
65
129
  // Unregister entire language
130
+
66
131
  unregisterTranslation('en');
67
132
 
133
+
134
+
68
135
  // Unregister all translations
136
+
69
137
  unregisterTranslation();
138
+
70
139
  ```
71
140
 
141
+
142
+
72
143
  === "ES Modules"
73
144
 
145
+
146
+
74
147
  ```javascript
148
+
75
149
  import { unregisterTranslation } from 'miki-template';
76
150
 
151
+
152
+
77
153
  unregisterTranslation('en', 'hello');
154
+
78
155
  ```
79
156
 
157
+
158
+
80
159
  ## setLanguage / getLanguage
81
160
 
161
+
162
+
82
163
  Set or get the active language.
83
164
 
165
+
166
+
84
167
  === "CommonJS"
85
168
 
169
+
170
+
86
171
  ```javascript
172
+
87
173
  const { setLanguage, getLanguage } = require('miki-template');
88
174
 
175
+
176
+
89
177
  setLanguage('fr');
178
+
90
179
  console.log(getLanguage()); // 'fr'
180
+
91
181
  ```
92
182
 
183
+
184
+
93
185
  === "ES Modules"
94
186
 
187
+
188
+
95
189
  ```javascript
190
+
96
191
  import { setLanguage, getLanguage } from 'miki-template';
97
192
 
193
+
194
+
98
195
  setLanguage('fr');
196
+
99
197
  console.log(getLanguage()); // 'fr'
198
+
100
199
  ```
101
200
 
201
+
202
+
102
203
  ## setFallbackLanguage / getFallbackLanguage
103
204
 
205
+
206
+
104
207
  Set or get the fallback language (used when a key is missing from the active language).
105
208
 
209
+
210
+
106
211
  === "CommonJS"
107
212
 
213
+
214
+
108
215
  ```javascript
216
+
109
217
  const { setFallbackLanguage, getFallbackLanguage } = require('miki-template');
110
218
 
219
+
220
+
111
221
  setFallbackLanguage('en');
222
+
112
223
  console.log(getFallbackLanguage()); // 'en'
224
+
113
225
  ```
114
226
 
227
+
228
+
115
229
  === "ES Modules"
116
230
 
231
+
232
+
117
233
  ```javascript
234
+
118
235
  import { setFallbackLanguage, getFallbackLanguage } from 'miki-template';
119
236
 
237
+
238
+
120
239
  setFallbackLanguage('en');
240
+
121
241
  ```
122
242
 
243
+
244
+
123
245
  ## getAvailableLanguages
124
246
 
247
+
248
+
125
249
  List all registered languages.
126
250
 
251
+
252
+
127
253
  === "CommonJS"
128
254
 
255
+
256
+
129
257
  ```javascript
258
+
130
259
  const { getAvailableLanguages } = require('miki-template');
131
260
 
261
+
262
+
132
263
  console.log(getAvailableLanguages());
264
+
133
265
  // ['en', 'fr', 'es']
266
+
134
267
  ```
135
268
 
269
+
270
+
136
271
  === "ES Modules"
137
272
 
273
+
274
+
138
275
  ```javascript
276
+
139
277
  import { getAvailableLanguages } from 'miki-template';
140
278
 
279
+
280
+
141
281
  console.log(getAvailableLanguages());
282
+
142
283
  ```
143
284
 
285
+
286
+
144
287
  ## Template Tags
145
288
 
289
+
290
+
146
291
  The `{% trans %}` and `{% blocktrans %}` tags are provided by the auto-activated `i18n` library:
147
292
 
293
+
294
+
148
295
  ```html
296
+
149
297
  {% trans "Hello" %}
298
+
150
299
  {% blocktrans %}Welcome, {{ name }}!{% endblocktrans %}
300
+
151
301
  {% language "fr" %}...{% endlanguage %}
302
+
152
303
  ```
153
304
 
305
+
306
+
154
307
  ## Next Steps
155
308
 
156
- - [Advanced Usage: i18n](../guide/advanced-usage#i18n--internationalization)
157
- - [API Reference](../)
309
+
310
+
311
+ - [Advanced Usage: i18n](../guide/advanced-usage.md#i18n--internationalization)
312
+
313
+ - [API Reference](../index.md)
314
+
package/docs/api/index.md CHANGED
@@ -1,54 +1,108 @@
1
- # API Reference
1
+ # API Reference
2
+
3
+
2
4
 
3
5
  ## Core Functions
4
6
 
5
- - [render()](./render) — Render a template string or file partial
6
- - [compile()](./compile) — Compile a template into a reusable object with `render()`, `asyncRender()`, `renderBlock()`, `renderPartial()`
7
- - [asyncRender()](./async-render) — Asynchronous rendering (supports async filters/tags)
8
- - [renderPartialFromFile()](./render-partial) — Render a named partial from a file
9
- - [renderPartialFromSource()](./render-partial) — Render a named partial from source
10
- - [setupExpress()](./setup-express) — One-line Express integration
7
+
8
+
9
+ - [render()](./render.md) — Render a template string or file partial
10
+
11
+ - [compile()](./compile.md) — Compile a template into a reusable object with `render()`, `asyncRender()`, `renderBlock()`, `renderPartial()`
12
+
13
+ - [asyncRender()](./async-render.md) — Asynchronous rendering (supports async filters/tags)
14
+
15
+ - [renderPartialFromFile()](./render-partial.md) — Render a named partial from a file
16
+
17
+ - [renderPartialFromSource()](./render-partial.md) — Render a named partial from source
18
+
19
+ - [setupExpress()](./setup-express.md) — One-line Express integration
20
+
21
+
11
22
 
12
23
  ## Tag and Filter Registration
13
24
 
14
- - [registerFilter()](./filters) — Register a custom filter
15
- - [getFilter()](./filters) — Retrieve a registered filter
16
- - [registerTag()](./tags) — Register a custom tag
17
- - [registerHelper()](./helpers) — Register a custom helper
25
+
26
+
27
+ - [registerFilter()](./filters.md) — Register a custom filter
28
+
29
+ - [getFilter()](./filters.md) — Retrieve a registered filter
30
+
31
+ - [registerTag()](./tags.md) — Register a custom tag
32
+
33
+ - [registerHelper()](./helpers.md) — Register a custom helper
34
+
35
+
18
36
 
19
37
  ## Utilities
20
38
 
21
- - [findTemplateInViews()](./finder) — Locate a template in views directories
22
- - [setAppTemplateDirNames()](./finder) — Configure app-style template directory names
23
- - [clearCache()](./cache) — Clear the compiled template cache
24
- - [registerContextProcessor()](./context-processors) — Register a global context processor
25
- - [clearContextProcessors()](./context-processors) — Clear all context processors
39
+
40
+
41
+ - [findTemplateInViews()](./finder.md) — Locate a template in views directories
42
+
43
+ - [setAppTemplateDirNames()](./finder.md) — Configure app-style template directory names
44
+
45
+ - [clearCache()](./cache.md) — Clear the compiled template cache
46
+
47
+ - [registerContextProcessor()](./context-processors.md) — Register a global context processor
48
+
49
+ - [clearContextProcessors()](./context-processors.md) — Clear all context processors
50
+
51
+
26
52
 
27
53
  ## Security
28
54
 
29
- - [markSafe()](./security) — Mark a string as safe (bypass escaping)
30
- - [isSafe()](./security) — Check if a value is marked safe
31
- - [escapeHtml()](./security) — Escape HTML special characters
32
- - [SafeString](./security) — SafeString class
55
+
56
+
57
+ - [markSafe()](./security.md) — Mark a string as safe (bypass escaping)
58
+
59
+ - [isSafe()](./security.md) — Check if a value is marked safe
60
+
61
+ - [escapeHtml()](./security.md) — Escape HTML special characters
62
+
63
+ - [SafeString](./security.md) — SafeString class
64
+
65
+
33
66
 
34
67
  ## Express Engine Functions
35
68
 
69
+
70
+
36
71
  - `__express(filePath, options, callback)` — Express-compatible sync view engine
72
+
37
73
  - `__expressAsync(filePath, options)` — Express 5 async view engine (returns Promise)
74
+
38
75
  - `express(options)` — Returns a view engine function for `app.engine()`
76
+
39
77
  - `expressPartialRenderer()` — Express middleware adding `res.renderPartial()`
78
+
40
79
  - `stripExpressContext(options)` — Remove Express framework keys from context
41
80
 
81
+
82
+
42
83
  ## i18n
43
84
 
44
- - [registerTranslation()](./i18n) — Register translations for a language
45
- - [unregisterTranslation()](./i18n) — Unregister translations
46
- - [setLanguage()](./i18n) / [getLanguage()](./i18n) — Set/get active language
47
- - [setFallbackLanguage()](./i18n) / [getFallbackLanguage()](./i18n) — Set/get fallback language
48
- - [getAvailableLanguages()](./i18n) — List registered languages
85
+
86
+
87
+ - [registerTranslation()](./i18n.md) — Register translations for a language
88
+
89
+ - [unregisterTranslation()](./i18n.md) — Unregister translations
90
+
91
+ - [setLanguage()](./i18n.md) / [getLanguage()](./i18n.md) — Set/get active language
92
+
93
+ - [setFallbackLanguage()](./i18n.md) / [getFallbackLanguage()](./i18n.md) — Set/get fallback language
94
+
95
+ - [getAvailableLanguages()](./i18n.md) — List registered languages
96
+
97
+
49
98
 
50
99
  ## Libraries
51
100
 
52
- - [registerLibrary()](./libraries) — Register a named library (filters, tags, helpers)
53
- - [activateLibrary()](./libraries) / [registerLibraryFromPath()](./libraries) — Activate or load from file
54
- - [unregisterLibrary()](./libraries) / [hasLibrary()](./libraries) / [getLibraryNames()](./libraries) — Library management
101
+
102
+
103
+ - [registerLibrary()](./libraries.md) — Register a named library (filters, tags, helpers)
104
+
105
+ - [activateLibrary()](./libraries.md) / [registerLibraryFromPath()](./libraries.md) — Activate or load from file
106
+
107
+ - [unregisterLibrary()](./libraries.md) / [hasLibrary()](./libraries.md) / [getLibraryNames()](./libraries.md) — Library management
108
+