miki-template 1.2.0 → 1.3.6
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/release-notes/v1.3.1.md +55 -0
- package/.github/release-notes/v1.3.3.md +77 -0
- package/.github/workflows/ci.yml +38 -54
- package/.github/workflows/release.yml +106 -0
- package/AGENT.md +71 -71
- package/API_REFERENCE.md +314 -314
- package/CHANGELOG.md +173 -97
- package/CODE_OF_CONDUCT.md +14 -14
- package/CONTRIBUTING.md +27 -27
- package/README.md +342 -304
- package/ROADMAP.md +40 -40
- package/assets/banner.png +0 -0
- package/benchmarks/report.json +16 -16
- package/benchmarks/run.js +49 -49
- package/benchmarks/stress.mjs +647 -0
- package/benchmarks/templates/large.dtpl +7 -7
- package/benchmarks/templates/medium.dtpl +3 -3
- package/benchmarks/templates/small.dtpl +7 -7
- package/context/component.md +109 -109
- package/context/prd.md +131 -131
- package/context/project-structure.md +33 -33
- package/dir/base.html +23 -0
- package/dir/cmpnt.html +11 -0
- package/dir/footer.html +3 -0
- package/dir/home.html +80 -0
- package/dir/index.html +80 -0
- package/dir/navbar.html +9 -0
- package/docs/README.md +18 -18
- package/docs/advanced_usage.md +71 -71
- package/docs/api.md +119 -102
- package/docs/filters.md +708 -540
- package/docs/installation.md +106 -106
- package/docs/overview.md +57 -57
- package/docs/partialdef.md +70 -41
- package/docs/security.md +27 -27
- package/docs/tags.md +673 -610
- package/docs/usage.md +646 -599
- package/eslint.config.mjs +42 -34
- package/ex.mjs +33 -0
- package/miki-template-extension/.github/workflows/ci.yml +116 -0
- package/miki-template-extension/.vscodeignore +7 -0
- package/miki-template-extension/CHANGELOG.md +99 -0
- package/miki-template-extension/LICENSE +21 -21
- package/miki-template-extension/README.md +273 -82
- package/miki-template-extension/extension.js +1013 -0
- package/miki-template-extension/icon.png +0 -0
- package/miki-template-extension/icon.svg +10 -10
- package/miki-template-extension/miki-template-1.7.1.vsix +0 -0
- package/miki-template-extension/package.json +280 -46
- package/miki-template-extension/snippets/miki-template.json +717 -177
- package/miki-template-extension/syntaxes/language-configuration.json +114 -26
- package/miki-template-extension/syntaxes/miki-template.tmLanguage.json +355 -146
- package/miki-template-extension/tests/grammar-tests.json +162 -0
- package/miki-template-extension/tests/run-grammar-tests.js +82 -0
- package/package.json +37 -31
- package/sample-app/package-lock.json +901 -0
- package/sample-app/package.json +9 -0
- package/sample-app/server.js +14 -0
- package/sample-app/views/index.html +1 -0
- package/scripts/build-vsix.js +129 -0
- package/scripts/build-vsix.ps1 +15 -0
- package/snippets/miki-template.json +177 -177
- package/src/asyncRender.js +20 -20
- package/src/cache.js +80 -41
- package/src/context.js +126 -122
- package/src/context_processors.js +48 -41
- package/src/esm.mjs +84 -72
- package/src/filters.js +975 -527
- package/src/i18n.js +171 -171
- package/src/index.js +974 -454
- package/src/lexer.js +114 -92
- package/src/libraries.js +371 -240
- package/src/parser.js +270 -250
- package/src/security.js +53 -51
- package/src/tags/control.js +719 -590
- package/src/tags/extra.js +154 -0
- package/src/tags/helpers.js +26 -26
- package/src/tags/i18n.js +256 -230
- package/src/tags/inheritance.js +335 -216
- package/src/tags/registry.js +18 -18
- package/src/tags/util.js +400 -322
- package/src/types.d.ts +107 -107
- package/syntaxes/language-configuration.json +26 -26
- package/syntaxes/miki-template.tmLanguage.json +146 -146
- package/tests/asyncRender.test.js +17 -17
- package/tests/base.html +6 -6
- package/tests/child.html +3 -3
- package/tests/context_processors.test.js +13 -13
- package/tests/esm.test.mjs +61 -26
- package/tests/filters.test.js +254 -99
- package/tests/include_security.test.js +9 -9
- package/tests/integration/README.md +32 -0
- package/tests/integration/features.test.cjs +1681 -0
- package/tests/integration/features.test.mjs +1697 -0
- package/tests/integration/templates/base.miki +6 -0
- package/tests/integration/templates/child.miki +6 -0
- package/tests/integration/templates/index.html +17 -0
- package/tests/lexer.test.js +45 -45
- package/tests/parser.test.js +57 -55
- package/tests/partial.html +1 -1
- package/tests/partialdef.test.js +79 -40
- package/tests/production_checks.js +57 -57
- package/tests/security.test.js +28 -28
- package/tests/tags.test.js +233 -203
- package/miki-template-1.2.0.vsix +0 -0
package/src/cache.js
CHANGED
|
@@ -1,41 +1,80 @@
|
|
|
1
|
-
// Simple AST cache module
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* In‑memory LRU cache for compiled templates.
|
|
5
|
-
* For demo purposes we use a plain Map limited to 100 entries.
|
|
6
|
-
*/
|
|
7
|
-
const CACHE_LIMIT = 100;
|
|
8
|
-
const cache = new Map();
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
if (
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
return
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
1
|
+
// Simple AST cache module
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* In‑memory LRU cache for compiled templates.
|
|
5
|
+
* For demo purposes we use a plain Map limited to 100 entries.
|
|
6
|
+
*/
|
|
7
|
+
const CACHE_LIMIT = 100;
|
|
8
|
+
const cache = new Map();
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Parent-source cache shared across renders. Populated by
|
|
12
|
+
* renderAST/renderASTAsync in src/index.js so that `{% extends %}`
|
|
13
|
+
* doesn't re-read the parent file from disk on every render.
|
|
14
|
+
*/
|
|
15
|
+
const parentSourceCache = new Map();
|
|
16
|
+
const PARENT_SOURCE_LIMIT = 64;
|
|
17
|
+
|
|
18
|
+
function getParentSource(key, loader) {
|
|
19
|
+
if (parentSourceCache.has(key)) {
|
|
20
|
+
const v = parentSourceCache.get(key);
|
|
21
|
+
parentSourceCache.delete(key);
|
|
22
|
+
parentSourceCache.set(key, v);
|
|
23
|
+
return v;
|
|
24
|
+
}
|
|
25
|
+
const v = loader();
|
|
26
|
+
if (v != null) {
|
|
27
|
+
parentSourceCache.set(key, v);
|
|
28
|
+
if (parentSourceCache.size > PARENT_SOURCE_LIMIT) {
|
|
29
|
+
const firstKey = parentSourceCache.keys().next().value;
|
|
30
|
+
parentSourceCache.delete(firstKey);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return v;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function hasParentSource(key) {
|
|
37
|
+
return parentSourceCache.has(key);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Retrieve a compiled template from cache or compile it and store.
|
|
42
|
+
* @param {string} templateStr – template source
|
|
43
|
+
* @param {object} compileOptions – options passed to compile()
|
|
44
|
+
* @param {function} compileFn – the original compile function from src/index.js
|
|
45
|
+
* @returns {object} compiled template object
|
|
46
|
+
*/
|
|
47
|
+
function getCompiled(templateStr, compileOptions, compileFn) {
|
|
48
|
+
// Build a cache key that ignores non-serializable option values
|
|
49
|
+
// (e.g. functions like urlHelper, custom callbacks) — those don't
|
|
50
|
+
// affect template compilation, only render behavior.
|
|
51
|
+
const serializable = {};
|
|
52
|
+
for (const [k, v] of Object.entries(compileOptions || {})) {
|
|
53
|
+
if (typeof v === 'function' || typeof v === 'undefined') continue;
|
|
54
|
+
serializable[k] = v;
|
|
55
|
+
}
|
|
56
|
+
const key = JSON.stringify({ templateStr, compileOptions: serializable });
|
|
57
|
+
if (cache.has(key)) {
|
|
58
|
+
// Move to end to mark as recently used
|
|
59
|
+
const value = cache.get(key);
|
|
60
|
+
cache.delete(key);
|
|
61
|
+
cache.set(key, value);
|
|
62
|
+
return value;
|
|
63
|
+
}
|
|
64
|
+
const compiled = compileFn(templateStr, compileOptions);
|
|
65
|
+
cache.set(key, compiled);
|
|
66
|
+
// Trim if we exceed limit
|
|
67
|
+
if (cache.size > CACHE_LIMIT) {
|
|
68
|
+
const firstKey = cache.keys().next().value;
|
|
69
|
+
cache.delete(firstKey);
|
|
70
|
+
}
|
|
71
|
+
return compiled;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Clear the cache – useful for tests */
|
|
75
|
+
function clearCache() {
|
|
76
|
+
cache.clear();
|
|
77
|
+
parentSourceCache.clear();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
module.exports = { getCompiled, clearCache, getParentSource, hasParentSource };
|
package/src/context.js
CHANGED
|
@@ -1,122 +1,126 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Context manager handling scopes and dotted variable lookup.
|
|
3
|
-
*/
|
|
4
|
-
class Context {
|
|
5
|
-
constructor(initial = {}, options = {}) {
|
|
6
|
-
this.scopes = [initial];
|
|
7
|
-
this.options = options;
|
|
8
|
-
this.autoescape = true; // Autoescape state
|
|
9
|
-
this.blocks = {}; // For template inheritance blocks
|
|
10
|
-
this.parentTemplate = null; // For extends tag
|
|
11
|
-
this.cycleStates = new Map(); // Store state for cycle tags
|
|
12
|
-
this.partialDefs = new Map(); // Store partial definitions
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Reset cycle state and blocks for a fresh render.
|
|
17
|
-
* Called at the start of each render pass.
|
|
18
|
-
*/
|
|
19
|
-
reset() {
|
|
20
|
-
this.cycleStates.clear();
|
|
21
|
-
this.blocks = {};
|
|
22
|
-
this.parentTemplate = null;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Push a new scope onto the stack.
|
|
27
|
-
*/
|
|
28
|
-
push(scope = {}) {
|
|
29
|
-
this.scopes.unshift(scope);
|
|
30
|
-
return this;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Pop the top scope from the stack.
|
|
35
|
-
*/
|
|
36
|
-
pop() {
|
|
37
|
-
if (this.scopes.length > 1) {
|
|
38
|
-
this.scopes.shift();
|
|
39
|
-
}
|
|
40
|
-
return this;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Resolve a dotted path lookup.
|
|
45
|
-
* Examples: 'user.name', 'items.0', 'user.profile.age'
|
|
46
|
-
*/
|
|
47
|
-
get(path) {
|
|
48
|
-
if (path === undefined || path === null || path === '') {
|
|
49
|
-
return '';
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const parts = path.split('.');
|
|
53
|
-
const baseName = parts[0];
|
|
54
|
-
|
|
55
|
-
let current =
|
|
56
|
-
let found = false;
|
|
57
|
-
|
|
58
|
-
// Search scopes from top (most local) to bottom (most global)
|
|
59
|
-
for (const scope of this.scopes) {
|
|
60
|
-
if (scope && typeof scope === 'object' && baseName in scope) {
|
|
61
|
-
current = scope[baseName];
|
|
62
|
-
found = true;
|
|
63
|
-
break;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
if (!found) {
|
|
68
|
-
return
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
current = current[
|
|
86
|
-
} else {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Context manager handling scopes and dotted variable lookup.
|
|
3
|
+
*/
|
|
4
|
+
class Context {
|
|
5
|
+
constructor(initial = {}, options = {}) {
|
|
6
|
+
this.scopes = [initial];
|
|
7
|
+
this.options = options;
|
|
8
|
+
this.autoescape = true; // Autoescape state
|
|
9
|
+
this.blocks = {}; // For template inheritance blocks
|
|
10
|
+
this.parentTemplate = null; // For extends tag
|
|
11
|
+
this.cycleStates = new Map(); // Store state for cycle tags
|
|
12
|
+
this.partialDefs = new Map(); // Store partial definitions
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Reset cycle state and blocks for a fresh render.
|
|
17
|
+
* Called at the start of each render pass.
|
|
18
|
+
*/
|
|
19
|
+
reset() {
|
|
20
|
+
this.cycleStates.clear();
|
|
21
|
+
this.blocks = {};
|
|
22
|
+
this.parentTemplate = null;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Push a new scope onto the stack.
|
|
27
|
+
*/
|
|
28
|
+
push(scope = {}) {
|
|
29
|
+
this.scopes.unshift(scope);
|
|
30
|
+
return this;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Pop the top scope from the stack.
|
|
35
|
+
*/
|
|
36
|
+
pop() {
|
|
37
|
+
if (this.scopes.length > 1) {
|
|
38
|
+
this.scopes.shift();
|
|
39
|
+
}
|
|
40
|
+
return this;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Resolve a dotted path lookup.
|
|
45
|
+
* Examples: 'user.name', 'items.0', 'user.profile.age'
|
|
46
|
+
*/
|
|
47
|
+
get(path) {
|
|
48
|
+
if (path === undefined || path === null || path === '') {
|
|
49
|
+
return '';
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const parts = path.split('.');
|
|
53
|
+
const baseName = parts[0];
|
|
54
|
+
|
|
55
|
+
let current = undefined;
|
|
56
|
+
let found = false;
|
|
57
|
+
|
|
58
|
+
// Search scopes from top (most local) to bottom (most global)
|
|
59
|
+
for (const scope of this.scopes) {
|
|
60
|
+
if (scope && typeof scope === 'object' && baseName in scope) {
|
|
61
|
+
current = scope[baseName];
|
|
62
|
+
found = true;
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (!found) {
|
|
68
|
+
// Variable truly missing — return undefined so templates can
|
|
69
|
+
// distinguish "missing" from "explicitly null". The variable node
|
|
70
|
+
// and filters handle undefined gracefully.
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Traverse the rest of the dotted segments
|
|
75
|
+
for (let i = 1; i < parts.length; i++) {
|
|
76
|
+
if (current === undefined || current === null) {
|
|
77
|
+
return current === null ? null : undefined;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const parent = current;
|
|
81
|
+
const part = parts[i];
|
|
82
|
+
|
|
83
|
+
// Resolve segment on the current value
|
|
84
|
+
if (typeof current === 'object' && part in current) {
|
|
85
|
+
current = current[part];
|
|
86
|
+
} else if (Array.isArray(current) && !isNaN(part)) {
|
|
87
|
+
// Handle array index resolution, e.g. items.0
|
|
88
|
+
current = current[parseInt(part, 10)];
|
|
89
|
+
} else {
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// If the property value is a function, evaluate it (Django style)
|
|
94
|
+
if (typeof current === 'function') {
|
|
95
|
+
current = current.call(parent);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// If the final resolved value is a function, call it with no arguments
|
|
100
|
+
if (typeof current === 'function') {
|
|
101
|
+
current = current.call(null);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Preserve null/undefined so filters like default_if_none can detect them.
|
|
105
|
+
return current;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Register a partial definition.
|
|
110
|
+
*/
|
|
111
|
+
registerPartial(name, node) {
|
|
112
|
+
this.partialDefs.set(name, node);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Retrieve a registered partial.
|
|
117
|
+
*/
|
|
118
|
+
getPartial(name) {
|
|
119
|
+
return this.partialDefs.get(name);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
module.exports = {
|
|
125
|
+
Context
|
|
126
|
+
};
|
|
@@ -1,41 +1,48 @@
|
|
|
1
|
-
// Context Processors – similar to Django's custom context processors
|
|
2
|
-
// Allows users to register functions that inject additional variables into the rendering context.
|
|
3
|
-
|
|
4
|
-
const processors = [];
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Register a context processor function.
|
|
8
|
-
* The function receives the current context object (plain JS object) and may return
|
|
9
|
-
* an object of key/value pairs to be merged into the context.
|
|
10
|
-
* @param {function(Object): (Object|undefined)} fn
|
|
11
|
-
*/
|
|
12
|
-
function registerContextProcessor(fn) {
|
|
13
|
-
if (typeof fn !== 'function') {
|
|
14
|
-
throw new Error('Context processor must be a function');
|
|
15
|
-
}
|
|
16
|
-
processors.push(fn);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Clear all registered context processors.
|
|
21
|
-
*/
|
|
22
|
-
function clearContextProcessors() {
|
|
23
|
-
processors.length = 0;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Apply all registered processors to the given context object.
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
1
|
+
// Context Processors – similar to Django's custom context processors
|
|
2
|
+
// Allows users to register functions that inject additional variables into the rendering context.
|
|
3
|
+
|
|
4
|
+
const processors = [];
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Register a context processor function.
|
|
8
|
+
* The function receives the current context object (plain JS object) and may return
|
|
9
|
+
* an object of key/value pairs to be merged into the context.
|
|
10
|
+
* @param {function(Object): (Object|undefined)} fn
|
|
11
|
+
*/
|
|
12
|
+
function registerContextProcessor(fn) {
|
|
13
|
+
if (typeof fn !== 'function') {
|
|
14
|
+
throw new Error('Context processor must be a function');
|
|
15
|
+
}
|
|
16
|
+
processors.push(fn);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Clear all registered context processors.
|
|
21
|
+
*/
|
|
22
|
+
function clearContextProcessors() {
|
|
23
|
+
processors.length = 0;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Apply all registered processors to the given context object.
|
|
28
|
+
* Values returned by a processor that are already defined in the
|
|
29
|
+
* context are kept as-is (Django-style "existing values win" semantics
|
|
30
|
+
* so explicit render-time data always takes precedence over processor
|
|
31
|
+
* defaults).
|
|
32
|
+
* @param {Object} ctx
|
|
33
|
+
*/
|
|
34
|
+
function applyContextProcessors(ctx) {
|
|
35
|
+
for (const fn of processors) {
|
|
36
|
+
const result = fn(ctx);
|
|
37
|
+
if (result && typeof result === 'object') {
|
|
38
|
+
for (const [k, v] of Object.entries(result)) {
|
|
39
|
+
if (ctx[k] === undefined) {
|
|
40
|
+
ctx[k] = v;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return ctx;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
module.exports = { registerContextProcessor, applyContextProcessors, clearContextProcessors };
|
package/src/esm.mjs
CHANGED
|
@@ -1,72 +1,84 @@
|
|
|
1
|
-
// ESM wrapper for miki-template
|
|
2
|
-
// Re-exports the CommonJS module for use with `import` syntax.
|
|
3
|
-
// Usage:
|
|
4
|
-
// import miki from 'miki-template';
|
|
5
|
-
// // or:
|
|
6
|
-
// import { render, compile, __express, SafeString, markSafe } from 'miki-template';
|
|
7
|
-
|
|
8
|
-
import cjsModule from './index.js';
|
|
9
|
-
|
|
10
|
-
const {
|
|
11
|
-
compile,
|
|
12
|
-
render,
|
|
13
|
-
asyncRender,
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
1
|
+
// ESM wrapper for miki-template
|
|
2
|
+
// Re-exports the CommonJS module for use with `import` syntax.
|
|
3
|
+
// Usage:
|
|
4
|
+
// import miki from 'miki-template';
|
|
5
|
+
// // or:
|
|
6
|
+
// import { render, compile, __express, SafeString, markSafe } from 'miki-template';
|
|
7
|
+
|
|
8
|
+
import cjsModule from './index.js';
|
|
9
|
+
|
|
10
|
+
const {
|
|
11
|
+
compile,
|
|
12
|
+
render,
|
|
13
|
+
asyncRender,
|
|
14
|
+
renderPartialFromFile,
|
|
15
|
+
renderPartialFromSource,
|
|
16
|
+
__express,
|
|
17
|
+
__expressAsync,
|
|
18
|
+
express,
|
|
19
|
+
setupExpress,
|
|
20
|
+
expressPartialRenderer,
|
|
21
|
+
stripExpressContext,
|
|
22
|
+
clearCache,
|
|
23
|
+
registerTag,
|
|
24
|
+
registerFilter,
|
|
25
|
+
registerHelper,
|
|
26
|
+
registerContextProcessor,
|
|
27
|
+
clearContextProcessors,
|
|
28
|
+
registerTranslation,
|
|
29
|
+
unregisterTranslation,
|
|
30
|
+
setLanguage,
|
|
31
|
+
getLanguage,
|
|
32
|
+
setFallbackLanguage,
|
|
33
|
+
getFallbackLanguage,
|
|
34
|
+
getAvailableLanguages,
|
|
35
|
+
registerLibrary,
|
|
36
|
+
unregisterLibrary,
|
|
37
|
+
getLibrary,
|
|
38
|
+
getLibraryNames,
|
|
39
|
+
hasLibrary,
|
|
40
|
+
registerLibraryFromPath,
|
|
41
|
+
SafeString,
|
|
42
|
+
markSafe,
|
|
43
|
+
isSafe,
|
|
44
|
+
escapeHtml
|
|
45
|
+
} = cjsModule;
|
|
46
|
+
|
|
47
|
+
export {
|
|
48
|
+
compile,
|
|
49
|
+
render,
|
|
50
|
+
asyncRender,
|
|
51
|
+
renderPartialFromFile,
|
|
52
|
+
renderPartialFromSource,
|
|
53
|
+
__express,
|
|
54
|
+
__expressAsync,
|
|
55
|
+
express,
|
|
56
|
+
setupExpress,
|
|
57
|
+
expressPartialRenderer,
|
|
58
|
+
stripExpressContext,
|
|
59
|
+
clearCache,
|
|
60
|
+
registerTag,
|
|
61
|
+
registerFilter,
|
|
62
|
+
registerHelper,
|
|
63
|
+
registerContextProcessor,
|
|
64
|
+
clearContextProcessors,
|
|
65
|
+
registerTranslation,
|
|
66
|
+
unregisterTranslation,
|
|
67
|
+
setLanguage,
|
|
68
|
+
getLanguage,
|
|
69
|
+
setFallbackLanguage,
|
|
70
|
+
getFallbackLanguage,
|
|
71
|
+
getAvailableLanguages,
|
|
72
|
+
registerLibrary,
|
|
73
|
+
unregisterLibrary,
|
|
74
|
+
getLibrary,
|
|
75
|
+
getLibraryNames,
|
|
76
|
+
hasLibrary,
|
|
77
|
+
registerLibraryFromPath,
|
|
78
|
+
SafeString,
|
|
79
|
+
markSafe,
|
|
80
|
+
isSafe,
|
|
81
|
+
escapeHtml
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
export default cjsModule;
|