miki-template 2.2.3 → 2.3.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.
- package/.github/workflows/docs.yml +3 -1
- package/.github/workflows/release.yml +0 -5
- package/README.md +17 -5
- package/benchmarks/ejs-results.json +6 -6
- package/benchmarks/ejs.js +5 -3
- package/benchmarks/handlebars-results.json +6 -6
- package/benchmarks/handlebars.js +5 -8
- package/benchmarks/miki-results.json +6 -6
- package/benchmarks/miki.js +6 -3
- package/benchmarks/pug-results.json +6 -6
- package/benchmarks/pug.js +5 -3
- package/docs/api/async-render.md +88 -3
- package/docs/api/cache.md +90 -3
- package/docs/api/compile.md +131 -3
- package/docs/api/context-processors.md +80 -3
- package/docs/api/filters.md +223 -3
- package/docs/api/finder.md +97 -3
- package/docs/api/helpers.md +56 -3
- package/docs/api/i18n.md +160 -3
- package/docs/api/index.md +82 -28
- package/docs/api/libraries.md +210 -3
- package/docs/api/render-partial.md +84 -3
- package/docs/api/render.md +95 -3
- package/docs/api/security.md +148 -3
- package/docs/api/setup-express.md +78 -2
- package/docs/api/tags.md +138 -4
- package/docs/filter.md +0 -0
- package/docs/guide/advanced-usage.md +403 -6
- package/docs/guide/async-rendering.md +312 -4
- package/docs/guide/context-processors.md +261 -4
- package/docs/guide/custom-filters.md +315 -4
- package/docs/guide/custom-tags.md +275 -4
- package/docs/guide/filters.md +675 -3
- package/docs/guide/getting-started.md +109 -7
- package/docs/guide/installation.md +99 -4
- package/docs/guide/partial-templates.md +371 -4
- package/docs/guide/quick-start.md +228 -6
- package/docs/guide/security.md +348 -3
- package/docs/guide/tags.md +789 -6
- package/docs/guide/template-discovery.md +174 -4
- package/docs/guide/template-inheritance.md +277 -4
- package/docs/index.md +24 -42
- package/docs/integrations/elysia.md +4 -2
- package/docs/integrations/express.md +219 -219
- package/docs/integrations/fastify.md +4 -2
- package/docs/integrations/hono.md +4 -2
- package/docs/integrations/index.md +68 -68
- package/docs/integrations/koa.md +4 -2
- package/docs/integrations/nestjs.md +4 -2
- package/docs/integrations/tsed.md +4 -2
- package/docs/performance.md +45 -8
- package/ex.mjs +1 -1
- package/mkdocs.yml +0 -22
- package/overrides/main.html +1 -1
- package/package.json +1 -1
- package/requirements-docs.txt +2 -1
- package/src/codegen.js +905 -0
- package/src/context.js +42 -30
- package/src/filters.js +16 -0
- package/src/index.js +66 -61
- package/src/tags/control.js +15 -12
- package/src/utils.js +60 -0
- package/tests/filters.test.js +9 -0
- package/docs/javascripts/extra.js +0 -174
- package/docs/stylesheets/extra.css +0 -819
- 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
|
-
|
|
157
|
-
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
- [
|
|
8
|
-
|
|
9
|
-
- [
|
|
10
|
-
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
- [
|
|
17
|
-
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
- [
|
|
24
|
-
|
|
25
|
-
- [
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
- [
|
|
32
|
-
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
- [
|
|
47
|
-
|
|
48
|
-
- [
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
- [
|
|
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
|
+
|