miki-template 2.3.1 → 2.3.3
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/README.md +1 -1
- package/package.json +24 -2
- package/src/codegen.js +140 -9
- package/src/parser.js +69 -1
- package/src/tags/control.js +112 -51
- package/src/tags/extra.js +4 -17
- package/src/tags/i18n.js +6 -17
- package/src/tags/inheritance.js +6 -20
- package/src/tags/util.js +5 -20
- package/.eslintrc.json +0 -16
- package/.github/release-notes/v1.3.1.md +0 -55
- package/.github/release-notes/v1.3.3.md +0 -77
- package/.github/release-notes/v1.3.7.md +0 -20
- package/.github/workflows/ci.yml +0 -42
- package/.github/workflows/docs.yml +0 -107
- package/.github/workflows/release.yml +0 -107
- package/AGENT.md +0 -71
- package/API_REFERENCE.md +0 -341
- package/CHANGELOG.md +0 -173
- package/CODE_OF_CONDUCT.md +0 -14
- package/CONTRIBUTING.md +0 -27
- package/ROADMAP.md +0 -40
- package/assets/banner.png +0 -0
- package/assets/logo.png +0 -0
- package/benchmarks/ejs-results.json +0 -17
- package/benchmarks/ejs.js +0 -38
- package/benchmarks/handlebars-results.json +0 -17
- package/benchmarks/handlebars.js +0 -45
- package/benchmarks/miki-results.json +0 -17
- package/benchmarks/miki.js +0 -39
- package/benchmarks/pug-results.json +0 -17
- package/benchmarks/pug.js +0 -38
- package/benchmarks/report.json +0 -17
- package/benchmarks/run.js +0 -81
- package/benchmarks/stress.mjs +0 -647
- package/benchmarks/templates/large.dtpl +0 -7
- package/benchmarks/templates/medium.dtpl +0 -3
- package/benchmarks/templates/small.dtpl +0 -7
- package/context/component.md +0 -109
- package/context/prd.md +0 -131
- package/context/project-structure.md +0 -33
- package/dir/base.html +0 -23
- package/dir/cmpnt.html +0 -11
- package/dir/footer.html +0 -3
- package/dir/home.html +0 -80
- package/dir/index.html +0 -80
- package/dir/navbar.html +0 -9
- package/docs/api/async-render.md +0 -170
- package/docs/api/cache.md +0 -174
- package/docs/api/compile.md +0 -256
- package/docs/api/context-processors.md +0 -154
- package/docs/api/filters.md +0 -437
- package/docs/api/finder.md +0 -188
- package/docs/api/helpers.md +0 -106
- package/docs/api/i18n.md +0 -314
- package/docs/api/index.md +0 -108
- package/docs/api/libraries.md +0 -414
- package/docs/api/render-partial.md +0 -162
- package/docs/api/render.md +0 -184
- package/docs/api/security.md +0 -290
- package/docs/api/setup-express.md +0 -152
- package/docs/api/tags.md +0 -268
- package/docs/assets/banner.png +0 -0
- package/docs/assets/logo.png +0 -0
- package/docs/filter.md +0 -0
- package/docs/guide/advanced-usage.md +0 -794
- package/docs/guide/async-rendering.md +0 -616
- package/docs/guide/context-processors.md +0 -514
- package/docs/guide/custom-filters.md +0 -622
- package/docs/guide/custom-tags.md +0 -542
- package/docs/guide/filters.md +0 -1314
- package/docs/guide/getting-started.md +0 -204
- package/docs/guide/installation.md +0 -190
- package/docs/guide/partial-templates.md +0 -734
- package/docs/guide/quick-start.md +0 -444
- package/docs/guide/security.md +0 -690
- package/docs/guide/tags.md +0 -1566
- package/docs/guide/template-discovery.md +0 -340
- package/docs/guide/template-inheritance.md +0 -546
- package/docs/guide/what-is-miki-template.md +0 -28
- package/docs/guide/why-miki-template.md +0 -75
- package/docs/index.md +0 -86
- package/docs/integrations/elysia.md +0 -80
- package/docs/integrations/express.md +0 -219
- package/docs/integrations/fastify.md +0 -79
- package/docs/integrations/hono.md +0 -80
- package/docs/integrations/index.md +0 -68
- package/docs/integrations/koa.md +0 -90
- package/docs/integrations/nestjs.md +0 -80
- package/docs/integrations/tsed.md +0 -83
- package/docs/performance.md +0 -74
- package/eslint.config.mjs +0 -42
- package/ex.mjs +0 -36
- package/live-test/integrations/elysia-example.js +0 -16
- package/live-test/integrations/express-example.js +0 -24
- package/live-test/integrations/fastify-example.js +0 -20
- package/live-test/integrations/hono-example.js +0 -16
- package/live-test/integrations/koa-example.js +0 -30
- package/live-test/integrations/nestjs-example.js +0 -25
- package/live-test/integrations/smoke-test.js +0 -166
- package/live-test/integrations/tsed-example.js +0 -23
- package/live-test/package-lock.json +0 -1150
- package/live-test/package.json +0 -13
- package/live-test/packages/product/templates/product/detail.html +0 -7
- package/live-test/server.js +0 -38
- package/live-test/templates/app_templates/detail.html +0 -6
- package/live-test/views/base.html +0 -8
- package/live-test/views/child.html +0 -7
- package/live-test/views/home.html +0 -17
- package/live-test/views/index.html +0 -1
- package/miki-template-extension/.github/workflows/ci.yml +0 -116
- package/miki-template-extension/.vscodeignore +0 -7
- package/miki-template-extension/CHANGELOG.md +0 -99
- package/miki-template-extension/LICENSE +0 -21
- package/miki-template-extension/README.md +0 -273
- package/miki-template-extension/extension.js +0 -1013
- package/miki-template-extension/icon.png +0 -0
- package/miki-template-extension/icon.svg +0 -10
- package/miki-template-extension/miki-template-1.7.1.vsix +0 -0
- package/miki-template-extension/package.json +0 -280
- package/miki-template-extension/snippets/miki-template.json +0 -717
- package/miki-template-extension/syntaxes/language-configuration.json +0 -114
- package/miki-template-extension/syntaxes/miki-template.tmLanguage.json +0 -355
- package/miki-template-extension/tests/grammar-tests.json +0 -162
- package/miki-template-extension/tests/run-grammar-tests.js +0 -82
- package/mkdocs.yml +0 -195
- package/overrides/main.html +0 -26
- package/requirements-docs.txt +0 -2
- package/sample-app/package-lock.json +0 -901
- package/sample-app/package.json +0 -9
- package/sample-app/server.js +0 -14
- package/sample-app/views/index.html +0 -1
- package/scripts/build-vsix.js +0 -129
- package/scripts/build-vsix.ps1 +0 -15
- package/snippets/miki-template.json +0 -177
- package/src/asyncRender.js +0 -21
- package/src/types.d.ts +0 -107
- package/syntaxes/language-configuration.json +0 -26
- package/syntaxes/miki-template.tmLanguage.json +0 -146
- package/tests/asyncRender.test.js +0 -17
- package/tests/base.html +0 -6
- package/tests/child.html +0 -3
- package/tests/context_processors.test.js +0 -13
- package/tests/esm.test.mjs +0 -61
- package/tests/filters.test.js +0 -263
- package/tests/finder-appdirs.test.js +0 -19
- package/tests/finder.test.js +0 -17
- package/tests/fixtures/views/nested/index.html +0 -1
- package/tests/fixtures/views/partial.html +0 -1
- package/tests/fixtures/views/sub/deepfile.html +0 -1
- package/tests/fixtures/views-appdirs/product/site/detail.html +0 -1
- package/tests/include_security.test.js +0 -9
- package/tests/integration/README.md +0 -32
- package/tests/integration/features.test.cjs +0 -1681
- package/tests/integration/features.test.mjs +0 -1697
- package/tests/integration/finder.esm.test.mjs +0 -13
- package/tests/integration/partial-render.test.cjs +0 -13
- package/tests/integration/templates/base.miki +0 -6
- package/tests/integration/templates/child.miki +0 -6
- package/tests/integration/templates/index.html +0 -17
- package/tests/lexer.test.js +0 -45
- package/tests/parser.test.js +0 -57
- package/tests/partial.html +0 -1
- package/tests/partialdef.test.js +0 -79
- package/tests/production_checks.js +0 -57
- package/tests/security.test.js +0 -28
- package/tests/tags.test.js +0 -233
|
@@ -1,616 +0,0 @@
|
|
|
1
|
-
# Async Rendering
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
miki-template supports async rendering for templates that use async filters, async custom tags, or async library components. Use `asyncRender()` instead of `render()` to await these operations.
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
## Table of Contents
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
- [When to Use Async Rendering](#when-to-use-async-rendering)
|
|
14
|
-
|
|
15
|
-
- [asyncRender()](#asyncrender)
|
|
16
|
-
|
|
17
|
-
- [compiled.asyncRender()](#compiledasyncrender)
|
|
18
|
-
|
|
19
|
-
- [Async Filters](#async-filters)
|
|
20
|
-
|
|
21
|
-
- [Async Custom Tags](#async-custom-tags)
|
|
22
|
-
|
|
23
|
-
- [Express Async Engine](#express-async-engine)
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
---
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
## When to Use Async Rendering
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
Use `asyncRender()` when your templates contain any of the following:
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
- **Async filters** — filters that return Promises
|
|
40
|
-
|
|
41
|
-
- **Async custom tags** — custom tags whose `render()` returns a Promise
|
|
42
|
-
|
|
43
|
-
- **Async library components** — i18n translations loaded dynamically
|
|
44
|
-
|
|
45
|
-
- **Async helpers** — helpers that perform I/O
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
If you use async features with `render()` or `compiled.render()`, the engine throws:
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
> Async node encountered during sync render. Use asyncRender() instead.
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
## asyncRender()
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
=== "CommonJS"
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
```javascript
|
|
66
|
-
|
|
67
|
-
const { asyncRender } = require('miki-template');
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
const html = await asyncRender('Hello, {{ name }}!', { name: 'World' });
|
|
72
|
-
|
|
73
|
-
console.log(html);
|
|
74
|
-
|
|
75
|
-
// → "Hello, World!"
|
|
76
|
-
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
=== "ES Modules"
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
```javascript
|
|
86
|
-
|
|
87
|
-
import { asyncRender } from 'miki-template';
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
const html = await asyncRender('Hello, {{ name }}!', { name: 'World' });
|
|
92
|
-
|
|
93
|
-
console.log(html);
|
|
94
|
-
|
|
95
|
-
// → "Hello, World!"
|
|
96
|
-
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
### With Views and Partials
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
=== "CommonJS"
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
```javascript
|
|
110
|
-
|
|
111
|
-
const { asyncRender } = require('miki-template');
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
// Render a single partial from a file
|
|
116
|
-
|
|
117
|
-
const html = await asyncRender('home#card', { user: userData }, {
|
|
118
|
-
|
|
119
|
-
views: './templates'
|
|
120
|
-
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
=== "ES Modules"
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
```javascript
|
|
132
|
-
|
|
133
|
-
import { asyncRender } from 'miki-template';
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
const html = await asyncRender('home#card', { user: userData }, {
|
|
138
|
-
|
|
139
|
-
views: './templates'
|
|
140
|
-
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
## compiled.asyncRender()
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
When you pre-compile a template, the returned object has `asyncRender()` and `asyncRenderWith()` methods:
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
=== "CommonJS"
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
```javascript
|
|
160
|
-
|
|
161
|
-
const { compile } = require('miki-template');
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
const template = `
|
|
166
|
-
|
|
167
|
-
{% load markdown %}
|
|
168
|
-
|
|
169
|
-
{{ content|markdown }}
|
|
170
|
-
|
|
171
|
-
`;
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
const compiled = compile(template);
|
|
176
|
-
|
|
177
|
-
const html = await compiled.asyncRender({ content: '# Hello World' });
|
|
178
|
-
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
=== "ES Modules"
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
```javascript
|
|
188
|
-
|
|
189
|
-
import { compile } from 'miki-template';
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
const template = `
|
|
194
|
-
|
|
195
|
-
{% load markdown %}
|
|
196
|
-
|
|
197
|
-
{{ content|markdown }}
|
|
198
|
-
|
|
199
|
-
`;
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
const compiled = compile(template);
|
|
204
|
-
|
|
205
|
-
const html = await compiled.asyncRender({ content: '# Hello World' });
|
|
206
|
-
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
## Async Filters
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
Filters that return Promises are automatically awaited when using `asyncRender()`:
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
=== "CommonJS"
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
```javascript
|
|
224
|
-
|
|
225
|
-
const { registerFilter, asyncRender } = require('miki-template');
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
registerFilter('to_upper', (val) => val.toUpperCase());
|
|
230
|
-
|
|
231
|
-
registerFilter('fetch_url', async (url) => {
|
|
232
|
-
|
|
233
|
-
const res = await fetch(url);
|
|
234
|
-
|
|
235
|
-
return res.text();
|
|
236
|
-
|
|
237
|
-
});
|
|
238
|
-
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
=== "ES Modules"
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
```javascript
|
|
248
|
-
|
|
249
|
-
import { registerFilter, asyncRender } from 'miki-template';
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
registerFilter('to_upper', (val) => val.toUpperCase());
|
|
254
|
-
|
|
255
|
-
registerFilter('fetch_url', async (url) => {
|
|
256
|
-
|
|
257
|
-
const res = await fetch(url);
|
|
258
|
-
|
|
259
|
-
return res.text();
|
|
260
|
-
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
Usage:
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
```html
|
|
272
|
-
|
|
273
|
-
{{ api_endpoint|fetch_url }}
|
|
274
|
-
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
**Real-world CMS content fetch:**
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
=== "CommonJS"
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
```javascript
|
|
288
|
-
|
|
289
|
-
const { registerFilter, asyncRender } = require('miki-template');
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
registerFilter('cms_content', async (id) => {
|
|
294
|
-
|
|
295
|
-
const res = await fetch(`https://cms.example.com/api/content/${id}`);
|
|
296
|
-
|
|
297
|
-
const data = await res.json();
|
|
298
|
-
|
|
299
|
-
return data.html;
|
|
300
|
-
|
|
301
|
-
});
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
const html = await asyncRender(
|
|
306
|
-
|
|
307
|
-
'{% autoescape off %}{{ page_id|cms_content }}{% endautoescape %}',
|
|
308
|
-
|
|
309
|
-
{ page_id: 'about' }
|
|
310
|
-
|
|
311
|
-
);
|
|
312
|
-
|
|
313
|
-
```
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
=== "ES Modules"
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
```javascript
|
|
322
|
-
|
|
323
|
-
import { registerFilter, asyncRender } from 'miki-template';
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
registerFilter('cms_content', async (id) => {
|
|
328
|
-
|
|
329
|
-
const res = await fetch(`https://cms.example.com/api/content/${id}`);
|
|
330
|
-
|
|
331
|
-
const data = await res.json();
|
|
332
|
-
|
|
333
|
-
return data.html;
|
|
334
|
-
|
|
335
|
-
});
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
const html = await asyncRender(
|
|
340
|
-
|
|
341
|
-
'{% autoescape off %}{{ page_id|cms_content }}{% endautoescape %}',
|
|
342
|
-
|
|
343
|
-
{ page_id: 'about' }
|
|
344
|
-
|
|
345
|
-
);
|
|
346
|
-
|
|
347
|
-
```
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
## Async Custom Tags
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
Custom tags whose `render()` returns a Promise work with `asyncRender()`:
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
=== "CommonJS"
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
```javascript
|
|
364
|
-
|
|
365
|
-
const { registerTag, asyncRender } = require('miki-template');
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
registerTag('api_data', (tagContent, parser) => {
|
|
370
|
-
|
|
371
|
-
const endpoint = tagContent.trim();
|
|
372
|
-
|
|
373
|
-
return {
|
|
374
|
-
|
|
375
|
-
async render(context) {
|
|
376
|
-
|
|
377
|
-
const res = await fetch(context.get(endpoint));
|
|
378
|
-
|
|
379
|
-
const data = await res.json();
|
|
380
|
-
|
|
381
|
-
return JSON.stringify(data, null, 2);
|
|
382
|
-
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
};
|
|
386
|
-
|
|
387
|
-
});
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
const html = await asyncRender(
|
|
392
|
-
|
|
393
|
-
'{% api_data api_url %}',
|
|
394
|
-
|
|
395
|
-
{ api_url: 'https://api.example.com/users' }
|
|
396
|
-
|
|
397
|
-
);
|
|
398
|
-
|
|
399
|
-
```
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
=== "ES Modules"
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
```javascript
|
|
408
|
-
|
|
409
|
-
import { registerTag, asyncRender } from 'miki-template';
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
registerTag('api_data', (tagContent, parser) => {
|
|
414
|
-
|
|
415
|
-
const endpoint = tagContent.trim();
|
|
416
|
-
|
|
417
|
-
return {
|
|
418
|
-
|
|
419
|
-
async render(context) {
|
|
420
|
-
|
|
421
|
-
const res = await fetch(context.get(endpoint));
|
|
422
|
-
|
|
423
|
-
const data = await res.json();
|
|
424
|
-
|
|
425
|
-
return JSON.stringify(data, null, 2);
|
|
426
|
-
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
};
|
|
430
|
-
|
|
431
|
-
});
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
const html = await asyncRender(
|
|
436
|
-
|
|
437
|
-
'{% api_data api_url %}',
|
|
438
|
-
|
|
439
|
-
{ api_url: 'https://api.example.com/users' }
|
|
440
|
-
|
|
441
|
-
);
|
|
442
|
-
|
|
443
|
-
```
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
## Express Async Engine
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
For Express apps with async templates, use `__expressAsync` or `express({ async: true })`:
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
=== "CommonJS"
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
```javascript
|
|
460
|
-
|
|
461
|
-
const express = require('express');
|
|
462
|
-
|
|
463
|
-
const miki = require('miki-template');
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
const app = express();
|
|
468
|
-
|
|
469
|
-
app.engine('html', miki.express({ async: true }));
|
|
470
|
-
|
|
471
|
-
app.set('view engine', 'html');
|
|
472
|
-
|
|
473
|
-
app.set('views', './views');
|
|
474
|
-
|
|
475
|
-
```
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
=== "ES Modules"
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
```javascript
|
|
484
|
-
|
|
485
|
-
import express from 'express';
|
|
486
|
-
|
|
487
|
-
import miki from 'miki-template';
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
const app = express();
|
|
492
|
-
|
|
493
|
-
app.engine('html', miki.express({ async: true }));
|
|
494
|
-
|
|
495
|
-
app.set('view engine', 'html');
|
|
496
|
-
|
|
497
|
-
app.set('views', './views');
|
|
498
|
-
|
|
499
|
-
```
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
### Express 5+ Native Promise Support
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
If you're using Express 5 (which supports Promise-based view engines), use `__expressAsync` directly:
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
=== "CommonJS"
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
```javascript
|
|
516
|
-
|
|
517
|
-
const express = require('express');
|
|
518
|
-
|
|
519
|
-
const miki = require('miki-template');
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
app.engine('html', miki.__expressAsync);
|
|
524
|
-
|
|
525
|
-
```
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
=== "ES Modules"
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
```javascript
|
|
534
|
-
|
|
535
|
-
import express from 'express';
|
|
536
|
-
|
|
537
|
-
import miki from 'miki-template';
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
app.engine('html', miki.__expressAsync);
|
|
542
|
-
|
|
543
|
-
```
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
## asyncRenderWith()
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
Override compile-time options at render time:
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
=== "CommonJS"
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
```javascript
|
|
560
|
-
|
|
561
|
-
const { compile } = require('miki-template');
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
const compiled = compile(template, { views: './views' });
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
const html = await compiled.asyncRenderWith(
|
|
570
|
-
|
|
571
|
-
{ user: userData },
|
|
572
|
-
|
|
573
|
-
{ views: './other-views', customOption: true }
|
|
574
|
-
|
|
575
|
-
);
|
|
576
|
-
|
|
577
|
-
```
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
=== "ES Modules"
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
```javascript
|
|
586
|
-
|
|
587
|
-
import { compile } from 'miki-template';
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
const compiled = compile(template, { views: './views' });
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
const html = await compiled.asyncRenderWith(
|
|
596
|
-
|
|
597
|
-
{ user: userData },
|
|
598
|
-
|
|
599
|
-
{ views: './other-views', customOption: true }
|
|
600
|
-
|
|
601
|
-
);
|
|
602
|
-
|
|
603
|
-
```
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
## Next Steps
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
- [Custom Filters: Async Filters](./custom-filters.md#async-filters)
|
|
612
|
-
|
|
613
|
-
- [Custom Tags: Async Custom Tags](./custom-tags.md#async-custom-tags)
|
|
614
|
-
|
|
615
|
-
- [API Reference: asyncRender](../api/async-render.md)
|
|
616
|
-
|