miki-template 2.3.0 → 2.3.2

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 (160) hide show
  1. package/README.md +17 -5
  2. package/package.json +45 -1
  3. package/.eslintrc.json +0 -16
  4. package/.github/release-notes/v1.3.1.md +0 -55
  5. package/.github/release-notes/v1.3.3.md +0 -77
  6. package/.github/release-notes/v1.3.7.md +0 -20
  7. package/.github/workflows/ci.yml +0 -42
  8. package/.github/workflows/docs.yml +0 -107
  9. package/.github/workflows/release.yml +0 -107
  10. package/AGENT.md +0 -71
  11. package/API_REFERENCE.md +0 -341
  12. package/CHANGELOG.md +0 -173
  13. package/CODE_OF_CONDUCT.md +0 -14
  14. package/CONTRIBUTING.md +0 -27
  15. package/ROADMAP.md +0 -40
  16. package/assets/banner.png +0 -0
  17. package/assets/logo.png +0 -0
  18. package/benchmarks/ejs-results.json +0 -17
  19. package/benchmarks/ejs.js +0 -38
  20. package/benchmarks/handlebars-results.json +0 -17
  21. package/benchmarks/handlebars.js +0 -45
  22. package/benchmarks/miki-results.json +0 -17
  23. package/benchmarks/miki.js +0 -39
  24. package/benchmarks/pug-results.json +0 -17
  25. package/benchmarks/pug.js +0 -38
  26. package/benchmarks/report.json +0 -17
  27. package/benchmarks/run.js +0 -81
  28. package/benchmarks/stress.mjs +0 -647
  29. package/benchmarks/templates/large.dtpl +0 -7
  30. package/benchmarks/templates/medium.dtpl +0 -3
  31. package/benchmarks/templates/small.dtpl +0 -7
  32. package/context/component.md +0 -109
  33. package/context/prd.md +0 -131
  34. package/context/project-structure.md +0 -33
  35. package/dir/base.html +0 -23
  36. package/dir/cmpnt.html +0 -11
  37. package/dir/footer.html +0 -3
  38. package/dir/home.html +0 -80
  39. package/dir/index.html +0 -80
  40. package/dir/navbar.html +0 -9
  41. package/docs/api/async-render.md +0 -170
  42. package/docs/api/cache.md +0 -174
  43. package/docs/api/compile.md +0 -256
  44. package/docs/api/context-processors.md +0 -154
  45. package/docs/api/filters.md +0 -437
  46. package/docs/api/finder.md +0 -188
  47. package/docs/api/helpers.md +0 -106
  48. package/docs/api/i18n.md +0 -314
  49. package/docs/api/index.md +0 -108
  50. package/docs/api/libraries.md +0 -414
  51. package/docs/api/render-partial.md +0 -162
  52. package/docs/api/render.md +0 -184
  53. package/docs/api/security.md +0 -290
  54. package/docs/api/setup-express.md +0 -152
  55. package/docs/api/tags.md +0 -268
  56. package/docs/assets/banner.png +0 -0
  57. package/docs/assets/logo.png +0 -0
  58. package/docs/filter.md +0 -0
  59. package/docs/guide/advanced-usage.md +0 -794
  60. package/docs/guide/async-rendering.md +0 -616
  61. package/docs/guide/context-processors.md +0 -514
  62. package/docs/guide/custom-filters.md +0 -622
  63. package/docs/guide/custom-tags.md +0 -542
  64. package/docs/guide/filters.md +0 -1314
  65. package/docs/guide/getting-started.md +0 -204
  66. package/docs/guide/installation.md +0 -190
  67. package/docs/guide/partial-templates.md +0 -734
  68. package/docs/guide/quick-start.md +0 -444
  69. package/docs/guide/security.md +0 -690
  70. package/docs/guide/tags.md +0 -1566
  71. package/docs/guide/template-discovery.md +0 -340
  72. package/docs/guide/template-inheritance.md +0 -546
  73. package/docs/guide/what-is-miki-template.md +0 -28
  74. package/docs/guide/why-miki-template.md +0 -75
  75. package/docs/index.md +0 -86
  76. package/docs/integrations/elysia.md +0 -80
  77. package/docs/integrations/express.md +0 -219
  78. package/docs/integrations/fastify.md +0 -79
  79. package/docs/integrations/hono.md +0 -80
  80. package/docs/integrations/index.md +0 -68
  81. package/docs/integrations/koa.md +0 -90
  82. package/docs/integrations/nestjs.md +0 -80
  83. package/docs/integrations/tsed.md +0 -83
  84. package/docs/performance.md +0 -74
  85. package/eslint.config.mjs +0 -42
  86. package/ex.mjs +0 -36
  87. package/live-test/integrations/elysia-example.js +0 -16
  88. package/live-test/integrations/express-example.js +0 -24
  89. package/live-test/integrations/fastify-example.js +0 -20
  90. package/live-test/integrations/hono-example.js +0 -16
  91. package/live-test/integrations/koa-example.js +0 -30
  92. package/live-test/integrations/nestjs-example.js +0 -25
  93. package/live-test/integrations/smoke-test.js +0 -166
  94. package/live-test/integrations/tsed-example.js +0 -23
  95. package/live-test/package-lock.json +0 -1150
  96. package/live-test/package.json +0 -13
  97. package/live-test/packages/product/templates/product/detail.html +0 -7
  98. package/live-test/server.js +0 -38
  99. package/live-test/templates/app_templates/detail.html +0 -6
  100. package/live-test/views/base.html +0 -8
  101. package/live-test/views/child.html +0 -7
  102. package/live-test/views/home.html +0 -17
  103. package/live-test/views/index.html +0 -1
  104. package/miki-template-extension/.github/workflows/ci.yml +0 -116
  105. package/miki-template-extension/.vscodeignore +0 -7
  106. package/miki-template-extension/CHANGELOG.md +0 -99
  107. package/miki-template-extension/LICENSE +0 -21
  108. package/miki-template-extension/README.md +0 -273
  109. package/miki-template-extension/extension.js +0 -1013
  110. package/miki-template-extension/icon.png +0 -0
  111. package/miki-template-extension/icon.svg +0 -10
  112. package/miki-template-extension/miki-template-1.7.1.vsix +0 -0
  113. package/miki-template-extension/package.json +0 -280
  114. package/miki-template-extension/snippets/miki-template.json +0 -717
  115. package/miki-template-extension/syntaxes/language-configuration.json +0 -114
  116. package/miki-template-extension/syntaxes/miki-template.tmLanguage.json +0 -355
  117. package/miki-template-extension/tests/grammar-tests.json +0 -162
  118. package/miki-template-extension/tests/run-grammar-tests.js +0 -82
  119. package/mkdocs.yml +0 -195
  120. package/overrides/main.html +0 -26
  121. package/requirements-docs.txt +0 -2
  122. package/sample-app/package-lock.json +0 -901
  123. package/sample-app/package.json +0 -9
  124. package/sample-app/server.js +0 -14
  125. package/sample-app/views/index.html +0 -1
  126. package/scripts/build-vsix.js +0 -129
  127. package/scripts/build-vsix.ps1 +0 -15
  128. package/snippets/miki-template.json +0 -177
  129. package/src/asyncRender.js +0 -21
  130. package/src/types.d.ts +0 -107
  131. package/syntaxes/language-configuration.json +0 -26
  132. package/syntaxes/miki-template.tmLanguage.json +0 -146
  133. package/tests/asyncRender.test.js +0 -17
  134. package/tests/base.html +0 -6
  135. package/tests/child.html +0 -3
  136. package/tests/context_processors.test.js +0 -13
  137. package/tests/esm.test.mjs +0 -61
  138. package/tests/filters.test.js +0 -263
  139. package/tests/finder-appdirs.test.js +0 -19
  140. package/tests/finder.test.js +0 -17
  141. package/tests/fixtures/views/nested/index.html +0 -1
  142. package/tests/fixtures/views/partial.html +0 -1
  143. package/tests/fixtures/views/sub/deepfile.html +0 -1
  144. package/tests/fixtures/views-appdirs/product/site/detail.html +0 -1
  145. package/tests/include_security.test.js +0 -9
  146. package/tests/integration/README.md +0 -32
  147. package/tests/integration/features.test.cjs +0 -1681
  148. package/tests/integration/features.test.mjs +0 -1697
  149. package/tests/integration/finder.esm.test.mjs +0 -13
  150. package/tests/integration/partial-render.test.cjs +0 -13
  151. package/tests/integration/templates/base.miki +0 -6
  152. package/tests/integration/templates/child.miki +0 -6
  153. package/tests/integration/templates/index.html +0 -17
  154. package/tests/lexer.test.js +0 -45
  155. package/tests/parser.test.js +0 -57
  156. package/tests/partial.html +0 -1
  157. package/tests/partialdef.test.js +0 -79
  158. package/tests/production_checks.js +0 -57
  159. package/tests/security.test.js +0 -28
  160. package/tests/tags.test.js +0 -233
@@ -1,184 +0,0 @@
1
- # render()
2
-
3
-
4
-
5
- Render a template string or file partial.
6
-
7
-
8
-
9
- ## Signature
10
-
11
-
12
-
13
- ```javascript
14
-
15
- render(templateStr, contextObj = {}, options = {})
16
-
17
- ```
18
-
19
-
20
-
21
- ## Parameters
22
-
23
-
24
-
25
- | Parameter | Type | Description |
26
-
27
- |-----------|------|-------------|
28
-
29
- | `templateStr` | `string` | Template string or file path with `#partial` suffix |
30
-
31
- | `contextObj` | `object` | Variables to inject into the template |
32
-
33
- | `options` | `object` | Options including `views` directories and custom settings |
34
-
35
-
36
-
37
- ## Returns
38
-
39
-
40
-
41
- `string` — The rendered HTML.
42
-
43
-
44
-
45
- ## Examples
46
-
47
-
48
-
49
- ### Render a template string
50
-
51
-
52
-
53
- === "CommonJS"
54
-
55
-
56
-
57
- ```javascript
58
-
59
- const { render } = require('miki-template');
60
-
61
-
62
-
63
- const html = render('Hello {{ name }}!', { name: 'World' });
64
-
65
- // Output: Hello World!
66
-
67
- ```
68
-
69
-
70
-
71
- === "ES Modules"
72
-
73
-
74
-
75
- ```javascript
76
-
77
- import { render } from 'miki-template';
78
-
79
-
80
-
81
- const html = render('Hello {{ name }}!', { name: 'World' });
82
-
83
- // Output: Hello World!
84
-
85
- ```
86
-
87
-
88
-
89
- ### Render a partial from file
90
-
91
-
92
-
93
- === "CommonJS"
94
-
95
-
96
-
97
- ```javascript
98
-
99
- const { render } = require('miki-template');
100
-
101
-
102
-
103
- const html = render('home#card', { title: 'Hello' }, { views: './views' });
104
-
105
- ```
106
-
107
-
108
-
109
- === "ES Modules"
110
-
111
-
112
-
113
- ```javascript
114
-
115
- import { render } from 'miki-template';
116
-
117
-
118
-
119
- const html = render('home#card', { title: 'Hello' }, { views: './views' });
120
-
121
- ```
122
-
123
-
124
-
125
- ### Render with options
126
-
127
-
128
-
129
- === "CommonJS"
130
-
131
-
132
-
133
- ```javascript
134
-
135
- const { render } = require('miki-template');
136
-
137
-
138
-
139
- const html = render(template, context, {
140
-
141
- views: ['./views', './app/templates'],
142
-
143
- staticUrl: '/static',
144
-
145
- urlHelper: (name, ...args) => '/' + name + '/' + args.join('/')
146
-
147
- });
148
-
149
- ```
150
-
151
-
152
-
153
- === "ES Modules"
154
-
155
-
156
-
157
- ```javascript
158
-
159
- import { render } from 'miki-template';
160
-
161
-
162
-
163
- const html = render(template, context, {
164
-
165
- views: ['./views', './app/templates'],
166
-
167
- staticUrl: '/static',
168
-
169
- urlHelper: (name, ...args) => '/' + name + '/' + args.join('/')
170
-
171
- });
172
-
173
- ```
174
-
175
-
176
-
177
- ## Related
178
-
179
-
180
-
181
- - [compile()](./compile.md)
182
-
183
- - [asyncRender()](./async-render.md)
184
-
@@ -1,290 +0,0 @@
1
- # Security API
2
-
3
-
4
-
5
- ## markSafe
6
-
7
-
8
-
9
- Mark a string as safe (bypass auto-escaping).
10
-
11
-
12
-
13
- === "CommonJS"
14
-
15
-
16
-
17
- ```javascript
18
-
19
- const { markSafe } = require('miki-template');
20
-
21
-
22
-
23
- const html = markSafe('<b>ok</b>');
24
-
25
- // Will not be escaped
26
-
27
- ```
28
-
29
-
30
-
31
- === "ES Modules"
32
-
33
-
34
-
35
- ```javascript
36
-
37
- import { markSafe } from 'miki-template';
38
-
39
-
40
-
41
- const html = markSafe('<b>ok</b>');
42
-
43
- ```
44
-
45
-
46
-
47
- ## isSafe
48
-
49
-
50
-
51
- Check if a value is marked safe.
52
-
53
-
54
-
55
- === "CommonJS"
56
-
57
-
58
-
59
- ```javascript
60
-
61
- const { isSafe } = require('miki-template');
62
-
63
-
64
-
65
- if (isSafe(value)) {
66
-
67
- // value is marked safe
68
-
69
- }
70
-
71
- ```
72
-
73
-
74
-
75
- === "ES Modules"
76
-
77
-
78
-
79
- ```javascript
80
-
81
- import { isSafe } from 'miki-template';
82
-
83
-
84
-
85
- if (isSafe(value)) {
86
-
87
- // value is marked safe
88
-
89
- }
90
-
91
- ```
92
-
93
-
94
-
95
- ## escapeHtml
96
-
97
-
98
-
99
- Escape HTML special characters (`&`, `<`, `>`, `"`, `'`, `` ` ``).
100
-
101
-
102
-
103
- === "CommonJS"
104
-
105
-
106
-
107
- ```javascript
108
-
109
- const { escapeHtml } = require('miki-template');
110
-
111
-
112
-
113
- const escaped = escapeHtml('<script>');
114
-
115
- // Output: &lt;script&gt;
116
-
117
- ```
118
-
119
-
120
-
121
- === "ES Modules"
122
-
123
-
124
-
125
- ```javascript
126
-
127
- import { escapeHtml } from 'miki-template';
128
-
129
-
130
-
131
- const escaped = escapeHtml('<script>');
132
-
133
- ```
134
-
135
-
136
-
137
- ### Force-Escape SafeString
138
-
139
-
140
-
141
- Pass `true` as the second argument to force-escape a `SafeString` (matching Django's `|escape` filter behavior):
142
-
143
-
144
-
145
- === "CommonJS"
146
-
147
-
148
-
149
- ```javascript
150
-
151
- const { escapeHtml, SafeString } = require('miki-template');
152
-
153
-
154
-
155
- const safe = new SafeString('<b>bold</b>');
156
-
157
- const forced = escapeHtml(safe, true);
158
-
159
- // Output: &lt;b&gt;bold&lt;/b&gt;
160
-
161
- ```
162
-
163
-
164
-
165
- === "ES Modules"
166
-
167
-
168
-
169
- ```javascript
170
-
171
- import { escapeHtml, SafeString } from 'miki-template';
172
-
173
-
174
-
175
- const safe = new SafeString('<b>bold</b>');
176
-
177
- const forced = escapeHtml(safe, true);
178
-
179
- ```
180
-
181
-
182
-
183
- ## stripExpressContext
184
-
185
-
186
-
187
- Strip Express-specific framework keys (`_`, `settings`, `cache`) from a context object.
188
-
189
-
190
-
191
- === "CommonJS"
192
-
193
-
194
-
195
- ```javascript
196
-
197
- const { stripExpressContext } = require('miki-template');
198
-
199
-
200
-
201
- const cleanCtx = stripExpressContext(expressOptions);
202
-
203
- // Removes: _locals, settings, cache, and other _ prefixed keys
204
-
205
- ```
206
-
207
-
208
-
209
- === "ES Modules"
210
-
211
-
212
-
213
- ```javascript
214
-
215
- import { stripExpressContext } from 'miki-template';
216
-
217
-
218
-
219
- const cleanCtx = stripExpressContext(expressOptions);
220
-
221
- ```
222
-
223
-
224
-
225
- ## SafeString Class
226
-
227
-
228
-
229
- Create a SafeString instance directly.
230
-
231
-
232
-
233
- === "CommonJS"
234
-
235
-
236
-
237
- ```javascript
238
-
239
- const { SafeString } = require('miki-template');
240
-
241
-
242
-
243
- const safe = new SafeString('<b>ok</b>');
244
-
245
- ```
246
-
247
-
248
-
249
- === "ES Modules"
250
-
251
-
252
-
253
- ```javascript
254
-
255
- import { SafeString } from 'miki-template';
256
-
257
-
258
-
259
- const safe = new SafeString('<b>ok</b>');
260
-
261
- ```
262
-
263
-
264
-
265
- ## Path Traversal Protection
266
-
267
-
268
-
269
- The `extends` and `include` tags validate that resolved template paths stay within configured views directories. Attempting to traverse outside throws an error:
270
-
271
-
272
-
273
- ```html
274
-
275
- {% extends "../../etc/passwd" %} <!-- throws -->
276
-
277
- {% include "../../secrets" %} <!-- throws -->
278
-
279
- ```
280
-
281
-
282
-
283
- ## Next Steps
284
-
285
-
286
-
287
- - [Security Guide](../guide/security.md)
288
-
289
- - [API Reference](../index.md)
290
-
@@ -1,152 +0,0 @@
1
- # setupExpress()
2
-
3
-
4
-
5
- One-line Express integration that wires the view engine, views directory, and partial responses.
6
-
7
-
8
-
9
- ## Signature
10
-
11
-
12
-
13
- ```javascript
14
-
15
- setupExpress(app, options = {})
16
-
17
- ```
18
-
19
-
20
-
21
- ## Options
22
-
23
-
24
-
25
- | Option | Type | Description |
26
-
27
- |--------|------|-------------|
28
-
29
- | `extension` | `string` | View file extension, default `'html'` |
30
-
31
- | `views` | `string\|string[]` | Views directory path(s) |
32
-
33
- | `async` | `boolean` | Use async engine (`__expressAsync`) for Express 5+ |
34
-
35
-
36
-
37
- ## What It Does
38
-
39
-
40
-
41
- - Calls `app.engine()` with the miki view engine.
42
-
43
- - Sets `app.set('view engine', extension)` if not already set.
44
-
45
- - Sets `app.set('views', views)` if `options.views` is provided.
46
-
47
- - Expands `views` to include nested template directories (app-style `templates/` folders).
48
-
49
- - Patches `res.render` to support `view#partial` syntax for HTMX responses.
50
-
51
-
52
-
53
- ## Example
54
-
55
-
56
-
57
- === "CommonJS"
58
-
59
-
60
-
61
- ```javascript
62
-
63
- const express = require('express');
64
-
65
- const miki = require('miki-template');
66
-
67
-
68
-
69
- const app = express();
70
-
71
- miki.setupExpress(app, { extension: 'html', views: './views' });
72
-
73
-
74
-
75
- app.get('/', (req, res) => res.render('home', { user: req.user }));
76
-
77
- app.get('/card/:id', (req, res) =>
78
-
79
- res.render(`home#card`, { title: 'Hello' })
80
-
81
- );
82
-
83
-
84
-
85
- app.listen(3000);
86
-
87
- ```
88
-
89
-
90
-
91
- === "ES Modules"
92
-
93
-
94
-
95
- ```javascript
96
-
97
- import express from 'express';
98
-
99
- import miki from 'miki-template';
100
-
101
-
102
-
103
- const app = express();
104
-
105
- miki.setupExpress(app, { extension: 'html', views: './views' });
106
-
107
-
108
-
109
- app.get('/', (req, res) => res.render('home', { user: req.user }));
110
-
111
- app.get('/card/:id', (req, res) =>
112
-
113
- res.render(`home#card`, { title: 'Hello' })
114
-
115
- );
116
-
117
-
118
-
119
- app.listen(3000);
120
-
121
- ```
122
-
123
-
124
-
125
- ## Partial Responses
126
-
127
-
128
-
129
- `setupExpress()` patches `res.render` so that any view name containing `#` renders only the named partial:
130
-
131
-
132
-
133
- ```javascript
134
-
135
- // Renders only the "card" partialdef from home.html
136
-
137
- res.render('home#card', { title: 'Hello' });
138
-
139
- ```
140
-
141
-
142
-
143
- This is ideal for HTMX where you only need to update a portion of the page.
144
-
145
-
146
-
147
- ## Related
148
-
149
-
150
-
151
- - [Integrations: Express](../integrations/express.md)
152
-