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,514 +0,0 @@
1
- # Context Processors
2
-
3
-
4
-
5
- Context processors are functions that automatically inject variables into every template render. This follows Django's context processor pattern — ideal for injecting global settings, user data, or feature flags.
6
-
7
-
8
-
9
- ## Table of Contents
10
-
11
-
12
-
13
- - [How Context Processors Work](#how-context-processors-work)
14
-
15
- - [Register a Context Processor](#register-a-context-processor)
16
-
17
- - [Context Processor Signature](#context-processor-signature)
18
-
19
- - [Overriding Behavior](#overriding-behavior)
20
-
21
- - [Real-World Examples](#real-world-examples)
22
-
23
- - [Clearing Processors](#clearing-processors)
24
-
25
-
26
-
27
- ---
28
-
29
-
30
-
31
- ## How Context Processors Work
32
-
33
-
34
-
35
- Context processors run on **every render** (both `render()` and `compile().render()`). They return an object of key/value pairs that are merged into the rendering context **before** your template's local context is applied.
36
-
37
-
38
-
39
- ```mermaid
40
-
41
- graph LR
42
-
43
- A[Your Context] --> B[Apply Processors]
44
-
45
- B --> C[Processor adds global vars]
46
-
47
- C --> D[Your Context wins]
48
-
49
- D --> E[Template renders]
50
-
51
- ```
52
-
53
-
54
-
55
- **Key behavior:** Your explicit context values **always win** over processor values. This means you can override global defaults per-render without fighting the processor.
56
-
57
-
58
-
59
- ## Register a Context Processor
60
-
61
-
62
-
63
- === "CommonJS"
64
-
65
-
66
-
67
- ```javascript
68
-
69
- const { registerContextProcessor } = require('miki-template');
70
-
71
-
72
-
73
- registerContextProcessor((context) => {
74
-
75
- return {
76
-
77
- siteName: 'My App',
78
-
79
- currentYear: new Date().getFullYear(),
80
-
81
- debug: process.env.NODE_ENV !== 'production'
82
-
83
- };
84
-
85
- });
86
-
87
- ```
88
-
89
-
90
-
91
- === "ES Modules"
92
-
93
-
94
-
95
- ```javascript
96
-
97
- import { registerContextProcessor } from 'miki-template';
98
-
99
-
100
-
101
- registerContextProcessor((context) => {
102
-
103
- return {
104
-
105
- siteName: 'My App',
106
-
107
- currentYear: new Date().getFullYear(),
108
-
109
- debug: process.env.NODE_ENV !== 'production'
110
-
111
- };
112
-
113
- });
114
-
115
- ```
116
-
117
-
118
-
119
- ### Multiple Processors
120
-
121
-
122
-
123
- You can register multiple processors. They run in order — later processors can overwrite earlier ones:
124
-
125
-
126
-
127
- === "CommonJS"
128
-
129
-
130
-
131
- ```javascript
132
-
133
- const { registerContextProcessor } = require('miki-template');
134
-
135
-
136
-
137
- registerContextProcessor(() => ({ siteName: 'My App' }));
138
-
139
- registerContextProcessor(() => ({ version: '2.0.0' }));
140
-
141
- registerContextProcessor(() => ({
142
-
143
- footerText: '© 2024 My App. All rights reserved.'
144
-
145
- }));
146
-
147
- ```
148
-
149
-
150
-
151
- === "ES Modules"
152
-
153
-
154
-
155
- ```javascript
156
-
157
- import { registerContextProcessor } from 'miki-template';
158
-
159
-
160
-
161
- registerContextProcessor(() => ({ siteName: 'My App' }));
162
-
163
- registerContextProcessor(() => ({ version: '2.0.0' }));
164
-
165
- registerContextProcessor(() => ({
166
-
167
- footerText: '© 2024 My App. All rights reserved.'
168
-
169
- }));
170
-
171
- ```
172
-
173
-
174
-
175
- ## Context Processor Signature
176
-
177
-
178
-
179
- The processor function receives the rendering `context` as an argument and must return a plain object:
180
-
181
-
182
-
183
- ```javascript
184
-
185
- registerContextProcessor((context) => {
186
-
187
- // context is the full Context object — you can inspect contextObj
188
-
189
- // but don't mutate it
190
-
191
- return {
192
-
193
- key: 'value'
194
-
195
- };
196
-
197
- });
198
-
199
- ```
200
-
201
-
202
-
203
- **Important:** If a processor returns `null`, `undefined`, or nothing, it's treated as returning an empty object `{}`. Processors must **not** return a Promise — if you need async data, compute it before rendering and pass it as context.
204
-
205
-
206
-
207
- ## Overriding Behavior
208
-
209
-
210
-
211
- Since your explicit context always wins, you can override global defaults per-render:
212
-
213
-
214
-
215
- === "CommonJS"
216
-
217
-
218
-
219
- ```javascript
220
-
221
- const { render } = require('miki-template');
222
-
223
-
224
-
225
- // processor sets debug: false
226
-
227
- // but this render overrides it:
228
-
229
- render(template, { debug: true });
230
-
231
- ```
232
-
233
-
234
-
235
- === "ES Modules"
236
-
237
-
238
-
239
- ```javascript
240
-
241
- import { render } from 'miki-template';
242
-
243
-
244
-
245
- render(template, { debug: true });
246
-
247
- ```
248
-
249
-
250
-
251
- ## Real-World Examples
252
-
253
-
254
-
255
- ### App-wide Settings
256
-
257
-
258
-
259
- === "CommonJS"
260
-
261
-
262
-
263
- ```javascript
264
-
265
- const { registerContextProcessor } = require('miki-template');
266
-
267
-
268
-
269
- registerContextProcessor(() => ({
270
-
271
- appName: process.env.APP_NAME || 'MyApp',
272
-
273
- appVersion: require('./package.json').version,
274
-
275
- environment: process.env.NODE_ENV || 'development',
276
-
277
- apiUrl: process.env.API_URL || 'http://localhost:3000/api',
278
-
279
- assetsUrl: process.env.ASSETS_URL || '/assets'
280
-
281
- }));
282
-
283
- ```
284
-
285
-
286
-
287
- === "ES Modules"
288
-
289
-
290
-
291
- ```javascript
292
-
293
- import { registerContextProcessor } from 'miki-template';
294
-
295
- import pkg from './package.json' with { type: 'json' };
296
-
297
-
298
-
299
- registerContextProcessor(() => ({
300
-
301
- appName: process.env.APP_NAME || 'MyApp',
302
-
303
- appVersion: pkg.version,
304
-
305
- environment: process.env.NODE_ENV || 'development',
306
-
307
- apiUrl: process.env.API_URL || 'http://localhost:3000/api',
308
-
309
- assetsUrl: process.env.ASSETS_URL || '/assets'
310
-
311
- }));
312
-
313
- ```
314
-
315
-
316
-
317
- ### User Authentication
318
-
319
-
320
-
321
- === "CommonJS"
322
-
323
-
324
-
325
- ```javascript
326
-
327
- const { registerContextProcessor } = require('miki-template');
328
-
329
-
330
-
331
- registerContextProcessor((context) => {
332
-
333
- const user = context.get('user');
334
-
335
- if (!user) return {};
336
-
337
- return {
338
-
339
- user_name: user.name,
340
-
341
- user_avatar: user.avatar || '/default-avatar.png',
342
-
343
- user_is_admin: user.isAdmin || false
344
-
345
- };
346
-
347
- });
348
-
349
- ```
350
-
351
-
352
-
353
- === "ES Modules"
354
-
355
-
356
-
357
- ```javascript
358
-
359
- import { registerContextProcessor } from 'miki-template';
360
-
361
-
362
-
363
- registerContextProcessor((context) => {
364
-
365
- const user = context.get('user');
366
-
367
- if (!user) return {};
368
-
369
- return {
370
-
371
- user_name: user.name,
372
-
373
- user_avatar: user.avatar || '/default-avatar.png',
374
-
375
- user_is_admin: user.isAdmin || false
376
-
377
- };
378
-
379
- });
380
-
381
- ```
382
-
383
-
384
-
385
- ### Feature Flags
386
-
387
-
388
-
389
- === "CommonJS"
390
-
391
-
392
-
393
- ```javascript
394
-
395
- const { registerContextProcessor } = require('miki-template');
396
-
397
-
398
-
399
- registerContextProcessor(() => ({
400
-
401
- flags: {
402
-
403
- newDashboard: process.env.FEATURE_NEW_DASHBOARD === 'true',
404
-
405
- betaFeature: process.env.FEATURE_BETA === 'true',
406
-
407
- darkModeDefault: process.env.FEATURE_DARK_MODE === 'true'
408
-
409
- }
410
-
411
- }));
412
-
413
- ```
414
-
415
-
416
-
417
- === "ES Modules"
418
-
419
-
420
-
421
- ```javascript
422
-
423
- import { registerContextProcessor } from 'miki-template';
424
-
425
-
426
-
427
- registerContextProcessor(() => ({
428
-
429
- flags: {
430
-
431
- newDashboard: process.env.FEATURE_NEW_DASHBOARD === 'true',
432
-
433
- betaFeature: process.env.FEATURE_BETA === 'true',
434
-
435
- darkModeDefault: process.env.FEATURE_DARK_MODE === 'true'
436
-
437
- }
438
-
439
- }));
440
-
441
- ```
442
-
443
-
444
-
445
- Template usage:
446
-
447
-
448
-
449
- ```html
450
-
451
- {% if flags.newDashboard %}
452
-
453
- <a href="/new-dashboard">New Dashboard</a>
454
-
455
- {% else %}
456
-
457
- <a href="/dashboard">Classic Dashboard</a>
458
-
459
- {% endif %}
460
-
461
- ```
462
-
463
-
464
-
465
- ## Clearing Processors
466
-
467
-
468
-
469
- Clear all registered processors (useful in tests or dynamic configuration):
470
-
471
-
472
-
473
- === "CommonJS"
474
-
475
-
476
-
477
- ```javascript
478
-
479
- const { clearContextProcessors } = require('miki-template');
480
-
481
-
482
-
483
- clearContextProcessors();
484
-
485
- ```
486
-
487
-
488
-
489
- === "ES Modules"
490
-
491
-
492
-
493
- ```javascript
494
-
495
- import { clearContextProcessors } from 'miki-template';
496
-
497
-
498
-
499
- clearContextProcessors();
500
-
501
- ```
502
-
503
-
504
-
505
- ## Next Steps
506
-
507
-
508
-
509
- - [Advanced Usage: Context Processors](./advanced-usage.md)
510
-
511
- - [Async Rendering](./async-rendering.md)
512
-
513
- - [API Reference: Context Processors](../api/context-processors.md)
514
-