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,444 +0,0 @@
|
|
|
1
|
-
# Quick Start
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
A hands-on tour of the most common miki-template workflows. Each example shows **CommonJS** and **ES Modules** side by side — pick the tab that matches your project.
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
## 1. Render a Template String
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
The `render()` function compiles and renders in one call. Perfect for email templates, static-site generation, or testing snippets.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
=== "CommonJS (require)"
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
```javascript
|
|
22
|
-
|
|
23
|
-
const { render } = require('miki-template');
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const template = 'Hello {{ user.name|title }}! Roles: {{ user.roles|join:", " }}';
|
|
28
|
-
|
|
29
|
-
const context = {
|
|
30
|
-
|
|
31
|
-
user: {
|
|
32
|
-
|
|
33
|
-
name: 'miki coder',
|
|
34
|
-
|
|
35
|
-
roles: ['admin', 'developer']
|
|
36
|
-
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const result = render(template, context);
|
|
44
|
-
|
|
45
|
-
console.log(result);
|
|
46
|
-
|
|
47
|
-
// Output: "Hello Miki Coder! Roles: admin, developer"
|
|
48
|
-
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
=== "ES Modules (import)"
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
```javascript
|
|
58
|
-
|
|
59
|
-
import { render } from 'miki-template';
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const template = 'Hello {{ user.name|title }}! Roles: {{ user.roles|join:", " }}';
|
|
64
|
-
|
|
65
|
-
const context = {
|
|
66
|
-
|
|
67
|
-
user: {
|
|
68
|
-
|
|
69
|
-
name: 'miki coder',
|
|
70
|
-
|
|
71
|
-
roles: ['admin', 'developer']
|
|
72
|
-
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
const result = render(template, context);
|
|
80
|
-
|
|
81
|
-
console.log(result);
|
|
82
|
-
|
|
83
|
-
// Output: "Hello Miki Coder! Roles: admin, developer"
|
|
84
|
-
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
## 2. Compile and Reuse
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
When you render the same template many times (e.g. an email template or a partial), use `compile()` to parse it once and reuse the compiled AST across many renders.
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
=== "CommonJS"
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
```javascript
|
|
102
|
-
|
|
103
|
-
const { compile } = require('miki-template');
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
const template = compile(
|
|
108
|
-
|
|
109
|
-
'<h1>Hello {{ name|title }}!</h1><p>{{ body|truncatewords:20 }}</p>'
|
|
110
|
-
|
|
111
|
-
);
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
console.log(template.render({ name: 'alice', body: 'A long body of text...' }));
|
|
116
|
-
|
|
117
|
-
console.log(template.render({ name: 'bob', body: 'Another long body...' }));
|
|
118
|
-
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
=== "ES Modules"
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
```javascript
|
|
128
|
-
|
|
129
|
-
import { compile } from 'miki-template';
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
const template = compile(
|
|
134
|
-
|
|
135
|
-
'<h1>Hello {{ name|title }}!</h1><p>{{ body|truncatewords:20 }}</p>'
|
|
136
|
-
|
|
137
|
-
);
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
console.log(template.render({ name: 'alice', body: 'A long body of text...' }));
|
|
142
|
-
|
|
143
|
-
console.log(template.render({ name: 'bob', body: 'Another long body...' }));
|
|
144
|
-
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
### Compiled Template Methods
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
The object returned by `compile()` exposes several render methods:
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
| Method | Description |
|
|
158
|
-
|
|
159
|
-
|--------|-------------|
|
|
160
|
-
|
|
161
|
-
| `render(context)` | Synchronous render. |
|
|
162
|
-
|
|
163
|
-
| `renderWith(context, callOptions)` | Sync render with per-call option overrides (e.g. a different `views` root). |
|
|
164
|
-
|
|
165
|
-
| `asyncRender(context)` | Async render — awaits Promise-returning helpers/filters. |
|
|
166
|
-
|
|
167
|
-
| `asyncRenderWith(context, callOptions)` | Async render with per-call option overrides. |
|
|
168
|
-
|
|
169
|
-
| `renderBlock(blockName, context)` | Render only a single `{% block %}` — ideal for HTMX/AJAX slices. |
|
|
170
|
-
|
|
171
|
-
| `renderPartial(partialName, context)` | Render only a `{% partialdef %}` block by name. |
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
## 3. Express: Full Page + HTMX Partials
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
`setupExpress()` wires everything in one call. After that, `res.render('home')` renders the full template, and `res.render('home#card')` renders only the `card` partial — no extra middleware required.
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
=== "CommonJS"
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
```javascript
|
|
188
|
-
|
|
189
|
-
const express = require('express');
|
|
190
|
-
|
|
191
|
-
const miki = require('miki-template');
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
const app = express();
|
|
196
|
-
|
|
197
|
-
miki.setupExpress(app, { extension: 'html', views: './views' });
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
// Full page
|
|
202
|
-
|
|
203
|
-
app.get('/', (req, res) => res.render('home', { user: req.user }));
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
// HTMX / partial response — just append #partialName to the view name
|
|
208
|
-
|
|
209
|
-
app.get('/partials/:name', (req, res) =>
|
|
210
|
-
|
|
211
|
-
res.render(`home#${req.params.name}`, { user: req.user })
|
|
212
|
-
|
|
213
|
-
);
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
app.listen(3000);
|
|
218
|
-
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
=== "ES Modules"
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
```javascript
|
|
228
|
-
|
|
229
|
-
import express from 'express';
|
|
230
|
-
|
|
231
|
-
import miki from 'miki-template';
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
const app = express();
|
|
236
|
-
|
|
237
|
-
miki.setupExpress(app, { extension: 'html', views: './views' });
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
app.get('/', (req, res) => res.render('home', { user: req.user }));
|
|
242
|
-
|
|
243
|
-
app.get('/partials/:name', (req, res) =>
|
|
244
|
-
|
|
245
|
-
res.render(`home#${req.params.name}`, { user: req.user })
|
|
246
|
-
|
|
247
|
-
);
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
app.listen(3000);
|
|
252
|
-
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
### Manual Express Setup (if you prefer full control)
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
=== "CommonJS"
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
```javascript
|
|
266
|
-
|
|
267
|
-
const express = require('express');
|
|
268
|
-
|
|
269
|
-
const { __express } = require('miki-template');
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
const app = express();
|
|
274
|
-
|
|
275
|
-
app.engine('html', __express);
|
|
276
|
-
|
|
277
|
-
app.set('view engine', 'html');
|
|
278
|
-
|
|
279
|
-
app.set('views', './views');
|
|
280
|
-
|
|
281
|
-
```
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
=== "ES Modules"
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
```javascript
|
|
290
|
-
|
|
291
|
-
import express from 'express';
|
|
292
|
-
|
|
293
|
-
import { __express } from 'miki-template';
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
const app = express();
|
|
298
|
-
|
|
299
|
-
app.engine('html', __express);
|
|
300
|
-
|
|
301
|
-
app.set('view engine', 'html');
|
|
302
|
-
|
|
303
|
-
app.set('views', './views');
|
|
304
|
-
|
|
305
|
-
```
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
## 4. Async Rendering
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
When your templates use async helpers or async filters, use `asyncRender()` (or `compiled.asyncRender()`).
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
=== "CommonJS"
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
```javascript
|
|
322
|
-
|
|
323
|
-
const { asyncRender } = require('miki-template');
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
const html = await asyncRender(
|
|
328
|
-
|
|
329
|
-
'Hello {{ name }} — {{ fetchGreeting user.id }}',
|
|
330
|
-
|
|
331
|
-
{ name: 'World', userId: 42 }
|
|
332
|
-
|
|
333
|
-
);
|
|
334
|
-
|
|
335
|
-
```
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
=== "ES Modules"
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
```javascript
|
|
344
|
-
|
|
345
|
-
import { asyncRender } from 'miki-template';
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
const html = await asyncRender(
|
|
350
|
-
|
|
351
|
-
'Hello {{ name }} — {{ fetchGreeting userId }}',
|
|
352
|
-
|
|
353
|
-
{ name: 'World', userId: 42 }
|
|
354
|
-
|
|
355
|
-
);
|
|
356
|
-
|
|
357
|
-
```
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
## 5. Defining and Rendering a Partial
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
Partials are reusable template fragments defined with `{% partialdef %}`.
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
=== "Template (home.html)"
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
```html
|
|
374
|
-
|
|
375
|
-
{% partialdef card %}
|
|
376
|
-
|
|
377
|
-
<div class="card">
|
|
378
|
-
|
|
379
|
-
<h3>{{ title|default:"Untitled" }}</h3>
|
|
380
|
-
|
|
381
|
-
<p>{{ body|truncatewords:30 }}</p>
|
|
382
|
-
|
|
383
|
-
</div>
|
|
384
|
-
|
|
385
|
-
{% endpartialdef %}
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
{% partial card with title=entry.title body=entry.body %}
|
|
390
|
-
|
|
391
|
-
```
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
=== "CommonJS"
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
```javascript
|
|
400
|
-
|
|
401
|
-
const { compile } = require('miki-template');
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
const compiled = compile('template string here', { views: './views' });
|
|
406
|
-
|
|
407
|
-
const html = compiled.renderPartial('card', { title: 'Hi', body: 'World' });
|
|
408
|
-
|
|
409
|
-
```
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
=== "ES Modules"
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
```javascript
|
|
418
|
-
|
|
419
|
-
import { compile } from 'miki-template';
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
const compiled = compile('template string here', { views: './views' });
|
|
424
|
-
|
|
425
|
-
const html = compiled.renderPartial('card', { title: 'Hi', body: 'World' });
|
|
426
|
-
|
|
427
|
-
```
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
## Next Steps
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
- [Partial Templates](./partial-templates.md)
|
|
436
|
-
|
|
437
|
-
- [Template Inheritance](./template-inheritance.md)
|
|
438
|
-
|
|
439
|
-
- [Filters](./filters.md)
|
|
440
|
-
|
|
441
|
-
- [Tags](./tags.md)
|
|
442
|
-
|
|
443
|
-
- [API Reference](../api/index.md)
|
|
444
|
-
|