@eggjs/view-nunjucks 3.0.0-beta.0
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/LICENSE +21 -0
- package/README.md +153 -0
- package/dist/app/extend/application.d.ts +9 -0
- package/dist/app/extend/application.js +16 -0
- package/dist/app.d.ts +3 -0
- package/dist/app.js +5 -0
- package/dist/config/config.default.d.ts +39 -0
- package/dist/config/config.default.js +12 -0
- package/dist/config/config.local.d.ts +5 -0
- package/dist/config/config.local.js +8 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +6 -0
- package/dist/lib/engine.d.ts +8 -0
- package/dist/lib/engine.js +16 -0
- package/dist/lib/environment.d.ts +18 -0
- package/dist/lib/environment.js +76 -0
- package/dist/lib/file_loader.d.ts +19 -0
- package/dist/lib/file_loader.js +37 -0
- package/dist/lib/helper.d.ts +11 -0
- package/dist/lib/helper.js +67 -0
- package/dist/lib/view.d.ts +26 -0
- package/dist/lib/view.js +56 -0
- package/dist/types.d.ts +14 -0
- package/dist/types.js +2 -0
- package/package.json +81 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2017 Alibaba Group Holding Limited and other contributors.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
# @eggjs/view-nunjucks
|
|
2
|
+
|
|
3
|
+
[![NPM version][npm-image]][npm-url]
|
|
4
|
+
[![Known Vulnerabilities][snyk-image]][snyk-url]
|
|
5
|
+
[![npm download][download-image]][download-url]
|
|
6
|
+
|
|
7
|
+
[npm-image]: https://img.shields.io/npm/v/@eggjs/view-nunjucks.svg?style=flat-square
|
|
8
|
+
[npm-url]: https://npmjs.org/package/@eggjs/view-nunjucks
|
|
9
|
+
[snyk-image]: https://snyk.io/test/npm/@eggjs/view-nunjucks/badge.svg?style=flat-square
|
|
10
|
+
[snyk-url]: https://snyk.io/test/npm/@eggjs/view-nunjucks
|
|
11
|
+
[download-image]: https://img.shields.io/npm/dm/@eggjs/view-nunjucks.svg?style=flat-square
|
|
12
|
+
[download-url]: https://npmjs.org/package/@eggjs/view-nunjucks
|
|
13
|
+
|
|
14
|
+
[nunjucks](http://mozilla.github.io/nunjucks/) view plugin for egg.
|
|
15
|
+
|
|
16
|
+
## Install
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install @eggjs/view-nunjucks
|
|
20
|
+
pnpm add @eggjs/view-nunjucks
|
|
21
|
+
yarn add @eggjs/view-nunjucks
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Usage
|
|
25
|
+
|
|
26
|
+
Enable plugin in `config/plugin.ts`
|
|
27
|
+
|
|
28
|
+
```ts
|
|
29
|
+
export default {
|
|
30
|
+
nunjucks: {
|
|
31
|
+
enable: true,
|
|
32
|
+
package: '@eggjs/view-nunjucks',
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Set mapping in `config/config.default.ts`
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
import { defineConfig } from 'egg';
|
|
41
|
+
|
|
42
|
+
export default defineConfig({
|
|
43
|
+
view: {
|
|
44
|
+
defaultViewEngine: 'nunjucks',
|
|
45
|
+
mapping: {
|
|
46
|
+
'.nj': 'nunjucks',
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Render in controller by `ctx.render`
|
|
53
|
+
|
|
54
|
+
```ts
|
|
55
|
+
// {app_root}/app/controller/test.ts
|
|
56
|
+
import { Controller } from 'egg';
|
|
57
|
+
|
|
58
|
+
class TestController extends Controller {
|
|
59
|
+
async list() {
|
|
60
|
+
const ctx = this.ctx;
|
|
61
|
+
// ctx.body = await ctx.renderString('{{ name }}', { name: 'local' });
|
|
62
|
+
// not need to assign `ctx.render` to `ctx.body`
|
|
63
|
+
// https://github.com/mozilla/nunjucks/blob/6f3e4a36a71cfd59ddc8c1fc5dcd77b8c24d83f3/nunjucks/src/environment.js#L318
|
|
64
|
+
await ctx.render(
|
|
65
|
+
'test.nj',
|
|
66
|
+
{ name: 'view test' },
|
|
67
|
+
{
|
|
68
|
+
path: '***',
|
|
69
|
+
}
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Features
|
|
76
|
+
|
|
77
|
+
### Filter
|
|
78
|
+
|
|
79
|
+
- `escape` filter is replaced by `helper.escape` which is provided by [@eggjs/security](https://github.com/eggjs/egg/tree/next/plugins/security) for better performance
|
|
80
|
+
- Add your filters to `app/extend/filter.ts`, then they will be injected automatically to nunjucks
|
|
81
|
+
|
|
82
|
+
```ts
|
|
83
|
+
// {app_root}/app/extend/filter.ts
|
|
84
|
+
export const hello = (name: string) => `hi, ${name}`;
|
|
85
|
+
|
|
86
|
+
// so you could use it at template
|
|
87
|
+
// {app_root}/app/controller/test.ts
|
|
88
|
+
import { Controller } from 'egg';
|
|
89
|
+
|
|
90
|
+
class TestController extends Controller {
|
|
91
|
+
async list() {
|
|
92
|
+
const ctx = this.ctx;
|
|
93
|
+
ctx.body = await ctx.renderString(
|
|
94
|
+
'{{ name | hello }}',
|
|
95
|
+
{ name: 'egg' },
|
|
96
|
+
{
|
|
97
|
+
path: '***',
|
|
98
|
+
}
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Tag
|
|
105
|
+
|
|
106
|
+
you can extend custom tag like this:
|
|
107
|
+
|
|
108
|
+
```ts
|
|
109
|
+
// {app_root}/app/extend/application.ts
|
|
110
|
+
import { Application } from 'egg';
|
|
111
|
+
import markdown from 'nunjucks-markdown';
|
|
112
|
+
import marked from 'marked';
|
|
113
|
+
|
|
114
|
+
export default (app: Application) => {
|
|
115
|
+
markdown.register(app.nunjucks, marked);
|
|
116
|
+
};
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Security
|
|
120
|
+
|
|
121
|
+
see [@eggjs/security](https://github.com/eggjs/egg/tree/next/plugins/security)
|
|
122
|
+
|
|
123
|
+
- auto inject `_csrf` attr to form field
|
|
124
|
+
- auto inject `nonce` attr to script tag
|
|
125
|
+
|
|
126
|
+
### Helper / Locals
|
|
127
|
+
|
|
128
|
+
- you can use `helper/ctx/request` in template, such as `helper.shtml('<div></div>')`
|
|
129
|
+
- nunjucks build-in filters is injected to helper, such as `helper.upper('test')`
|
|
130
|
+
- `helper.shtml/surl/sjs/escape` is auto wrapped with `safe`
|
|
131
|
+
|
|
132
|
+
### More
|
|
133
|
+
|
|
134
|
+
- `app.nunjucks` - nunjucks environment
|
|
135
|
+
- `app.nunjucks.cleanCache(fullPath/tplName)` to easy clean cache, can use with custom [@eggjs/watcher](https://github.com/eggjs/egg/tree/next/plugins/watcher)
|
|
136
|
+
|
|
137
|
+
## Configuration
|
|
138
|
+
|
|
139
|
+
see [config/config.default.ts](https://github.com/eggjs/egg/blob/next/plugins/view-nunjucks/src/config/config.default.ts) for more details.
|
|
140
|
+
|
|
141
|
+
## Questions & Suggestions
|
|
142
|
+
|
|
143
|
+
Please open an issue [here](https://github.com/eggjs/egg/issues).
|
|
144
|
+
|
|
145
|
+
## License
|
|
146
|
+
|
|
147
|
+
[MIT](LICENSE)
|
|
148
|
+
|
|
149
|
+
## Contributors
|
|
150
|
+
|
|
151
|
+
[](https://github.com/eggjs/egg/graphs/contributors)
|
|
152
|
+
|
|
153
|
+
Made with [contributors-img](https://contrib.rocks).
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { NunjucksEnvironment } from '../../lib/environment.ts';
|
|
2
|
+
declare const _default: {
|
|
3
|
+
/**
|
|
4
|
+
* nunjucks environment
|
|
5
|
+
* @see https://mozilla.github.io/nunjucks/api.html#environment
|
|
6
|
+
*/
|
|
7
|
+
readonly nunjucks: NunjucksEnvironment;
|
|
8
|
+
};
|
|
9
|
+
export default _default;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { createEngine } from "../../lib/engine.js";
|
|
2
|
+
const NUNJUCKS = Symbol('app#nunjucks');
|
|
3
|
+
export default {
|
|
4
|
+
/**
|
|
5
|
+
* nunjucks environment
|
|
6
|
+
* @see https://mozilla.github.io/nunjucks/api.html#environment
|
|
7
|
+
*/
|
|
8
|
+
get nunjucks() {
|
|
9
|
+
const app = this;
|
|
10
|
+
if (!app[NUNJUCKS]) {
|
|
11
|
+
app[NUNJUCKS] = createEngine(app);
|
|
12
|
+
}
|
|
13
|
+
return app[NUNJUCKS];
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbGljYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwL2V4dGVuZC9hcHBsaWNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHbkQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRXhDLGVBQWU7SUFDYjs7O09BR0c7SUFDSCxJQUFJLFFBQVE7UUFDVixNQUFNLEdBQUcsR0FBRyxJQUE4QixDQUFDO1FBQzNDLElBQUksQ0FBRSxHQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUMzQixHQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxPQUFRLEdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoQyxDQUFDO0NBQ0YsQ0FBQyJ9
|
package/dist/app.d.ts
ADDED
package/dist/app.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { NunjucksView } from "./lib/view.js";
|
|
2
|
+
export default (app) => {
|
|
3
|
+
app.view.use('nunjucks', NunjucksView);
|
|
4
|
+
};
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdDLGVBQWUsQ0FBQyxHQUFnQixFQUFRLEVBQUU7SUFDeEMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLFlBQW1CLENBQUMsQ0FBQztBQUNoRCxDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nunjucks plugin configuration
|
|
3
|
+
*/
|
|
4
|
+
export interface NunjucksConfig {
|
|
5
|
+
/**
|
|
6
|
+
* Controls if output with dangerous characters are escaped automatically
|
|
7
|
+
* @default true
|
|
8
|
+
*/
|
|
9
|
+
autoescape: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Throw errors when outputting a null/undefined value
|
|
12
|
+
* @default false
|
|
13
|
+
*/
|
|
14
|
+
throwOnUndefined: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Automatically remove trailing newlines from a block/tag
|
|
17
|
+
* @default false
|
|
18
|
+
*/
|
|
19
|
+
trimBlocks: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Automatically remove leading whitespace from a block/tag
|
|
22
|
+
* @default false
|
|
23
|
+
*/
|
|
24
|
+
lstripBlocks: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Use a cache and recompile templates each time. false in local env.
|
|
27
|
+
* @default true
|
|
28
|
+
*/
|
|
29
|
+
cache: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Internal property set by engine, do not set directly
|
|
32
|
+
* @internal
|
|
33
|
+
*/
|
|
34
|
+
noCache?: boolean;
|
|
35
|
+
}
|
|
36
|
+
declare const _default: () => {
|
|
37
|
+
nunjucks: NunjucksConfig;
|
|
38
|
+
};
|
|
39
|
+
export default _default;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export default () => {
|
|
2
|
+
return {
|
|
3
|
+
nunjucks: {
|
|
4
|
+
autoescape: true,
|
|
5
|
+
throwOnUndefined: false,
|
|
6
|
+
trimBlocks: false,
|
|
7
|
+
lstripBlocks: false,
|
|
8
|
+
cache: true,
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmRlZmF1bHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL2NvbmZpZy5kZWZhdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW9DQSxlQUFlLEdBQWlDLEVBQUU7SUFDaEQsT0FBTztRQUNMLFFBQVEsRUFBRTtZQUNSLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLGdCQUFnQixFQUFFLEtBQUs7WUFDdkIsVUFBVSxFQUFFLEtBQUs7WUFDakIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsS0FBSyxFQUFFLElBQUk7U0FDWjtLQUNGLENBQUM7QUFDSixDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export default () => {
|
|
2
|
+
return {
|
|
3
|
+
nunjucks: {
|
|
4
|
+
cache: false,
|
|
5
|
+
},
|
|
6
|
+
};
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmxvY2FsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9jb25maWcubG9jYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsZUFBZSxHQUEwQyxFQUFFO0lBQ3pELE9BQU87UUFDTCxRQUFRLEVBQUU7WUFDUixLQUFLLEVBQUUsS0FBSztTQUNiO0tBQ0YsQ0FBQztBQUNKLENBQUMsQ0FBQyJ9
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { NunjucksEnvironment } from './lib/environment.ts';
|
|
2
|
+
export { NunjucksFileLoader } from './lib/file_loader.ts';
|
|
3
|
+
export { createHelper } from './lib/helper.ts';
|
|
4
|
+
export { NunjucksView } from './lib/view.ts';
|
|
5
|
+
export { createEngine } from './lib/engine.ts';
|
|
6
|
+
export type { NunjucksConfig } from './config/config.default.ts';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { NunjucksEnvironment } from "./lib/environment.js";
|
|
2
|
+
export { NunjucksFileLoader } from "./lib/file_loader.js";
|
|
3
|
+
export { createHelper } from "./lib/helper.js";
|
|
4
|
+
export { NunjucksView } from "./lib/view.js";
|
|
5
|
+
export { createEngine } from "./lib/engine.js";
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDIn0=
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Application } from 'egg';
|
|
2
|
+
import { NunjucksEnvironment } from './environment.ts';
|
|
3
|
+
/**
|
|
4
|
+
* Create nunjucks environment
|
|
5
|
+
* @param app - application instance
|
|
6
|
+
* @returns nunjucks environment instance
|
|
7
|
+
*/
|
|
8
|
+
export declare function createEngine(app: Application): NunjucksEnvironment;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { NunjucksEnvironment } from "./environment.js";
|
|
2
|
+
/**
|
|
3
|
+
* Create nunjucks environment
|
|
4
|
+
* @param app - application instance
|
|
5
|
+
* @returns nunjucks environment instance
|
|
6
|
+
*/
|
|
7
|
+
export function createEngine(app) {
|
|
8
|
+
const coreLogger = app.loggers.coreLogger;
|
|
9
|
+
const viewPaths = app.config.view.root;
|
|
10
|
+
coreLogger.info('[egg-view-nunjucks] loading templates from %j', viewPaths);
|
|
11
|
+
const config = app.config.nunjucks;
|
|
12
|
+
config.noCache = !config.cache;
|
|
13
|
+
delete config.cache;
|
|
14
|
+
return new NunjucksEnvironment(app);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9lbmdpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFdkQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsR0FBZ0I7SUFDM0MsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7SUFFMUMsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3ZDLFVBQVUsQ0FBQyxJQUFJLENBQUMsK0NBQStDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFNUUsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFlLENBQUM7SUFDMUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDL0IsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBRXBCLE9BQU8sSUFBSSxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QyxDQUFDIn0=
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import nunjucks from 'nunjucks';
|
|
2
|
+
import type { Application } from 'egg';
|
|
3
|
+
import { createHelper } from './helper.ts';
|
|
4
|
+
/**
|
|
5
|
+
* Extend nunjucks environment, see {@link https://mozilla.github.io/nunjucks/api.html#environment}
|
|
6
|
+
*/
|
|
7
|
+
export declare class NunjucksEnvironment extends nunjucks.Environment {
|
|
8
|
+
app: Application;
|
|
9
|
+
ViewHelper: ReturnType<typeof createHelper>;
|
|
10
|
+
constructor(app: Application);
|
|
11
|
+
/**
|
|
12
|
+
* clean template cache
|
|
13
|
+
* @param name - full path
|
|
14
|
+
* @return clean count
|
|
15
|
+
*/
|
|
16
|
+
cleanCache(name?: string): number;
|
|
17
|
+
private loadFilter;
|
|
18
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import nunjucks from 'nunjucks';
|
|
3
|
+
import { NunjucksFileLoader } from "./file_loader.js";
|
|
4
|
+
import { createHelper } from "./helper.js";
|
|
5
|
+
/**
|
|
6
|
+
* Extend nunjucks environment, see {@link https://mozilla.github.io/nunjucks/api.html#environment}
|
|
7
|
+
*/
|
|
8
|
+
export class NunjucksEnvironment extends nunjucks.Environment {
|
|
9
|
+
app;
|
|
10
|
+
ViewHelper;
|
|
11
|
+
constructor(app) {
|
|
12
|
+
const fileLoader = new NunjucksFileLoader(app);
|
|
13
|
+
super(fileLoader, app.config.nunjucks);
|
|
14
|
+
this.app = app;
|
|
15
|
+
this.loadFilter();
|
|
16
|
+
// monkey patch `escape` with `app.Helper.prototype.escape` provided by `egg-security` for better performance
|
|
17
|
+
nunjucks.lib.escape = app.Helper.prototype.escape;
|
|
18
|
+
// http://disse.cting.org/2016/08/02/2016-08-02-sandbox-break-out-nunjucks-template-engine
|
|
19
|
+
const originMemberLookup = nunjucks.runtime.memberLookup;
|
|
20
|
+
nunjucks.runtime.memberLookup = function (...args) {
|
|
21
|
+
const val = args[1];
|
|
22
|
+
if (val === 'prototype' || val === 'constructor')
|
|
23
|
+
return null;
|
|
24
|
+
return originMemberLookup(...args);
|
|
25
|
+
};
|
|
26
|
+
this.ViewHelper = createHelper(app, this.filters);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* clean template cache
|
|
30
|
+
* @param name - full path
|
|
31
|
+
* @return clean count
|
|
32
|
+
*/
|
|
33
|
+
cleanCache(name) {
|
|
34
|
+
let count = 0;
|
|
35
|
+
const loaders = this.loaders;
|
|
36
|
+
for (const loader of loaders) {
|
|
37
|
+
if (name) {
|
|
38
|
+
// support full path && tpl name
|
|
39
|
+
/* istanbul ignore else */
|
|
40
|
+
if (loader.cache[name]) {
|
|
41
|
+
count++;
|
|
42
|
+
loader.cache[name] = null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
for (const cacheName in loader.cache) {
|
|
47
|
+
count++;
|
|
48
|
+
loader.cache[cacheName] = null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return count;
|
|
53
|
+
}
|
|
54
|
+
// load `app/extend/filter.js` from app/framework/plugin into nunjucks
|
|
55
|
+
loadFilter() {
|
|
56
|
+
for (const unit of this.app.loader.getLoadUnits()) {
|
|
57
|
+
const filterPath = resolveModule(path.join(unit.path, 'app/extend/filter'));
|
|
58
|
+
if (!filterPath)
|
|
59
|
+
continue;
|
|
60
|
+
const filters = this.app.loader.loadFile(filterPath) || {};
|
|
61
|
+
const filterKeys = Object.keys(filters);
|
|
62
|
+
for (const key of filterKeys) {
|
|
63
|
+
this.addFilter(key, filters[key]);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function resolveModule(filepath) {
|
|
69
|
+
try {
|
|
70
|
+
return require.resolve(filepath);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL2Vudmlyb25tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLFFBQVEsTUFBTSxVQUFVLENBQUM7QUFFaEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUUzQzs7R0FFRztBQUNILE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxRQUFRLENBQUMsV0FBVztJQUMzRCxHQUFHLENBQWM7SUFDakIsVUFBVSxDQUFrQztJQUU1QyxZQUFZLEdBQWdCO1FBQzFCLE1BQU0sVUFBVSxHQUFHLElBQUksa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0MsS0FBSyxDQUFDLFVBQWlCLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU5QyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUVmLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVsQiw2R0FBNkc7UUFDNUcsUUFBUSxDQUFDLEdBQVcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBRTNELDBGQUEwRjtRQUMxRixNQUFNLGtCQUFrQixHQUFJLFFBQVEsQ0FBQyxPQUFlLENBQUMsWUFBWSxDQUFDO1FBQ2pFLFFBQVEsQ0FBQyxPQUFlLENBQUMsWUFBWSxHQUFHLFVBQVUsR0FBRyxJQUFXO1lBQy9ELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQixJQUFJLEdBQUcsS0FBSyxXQUFXLElBQUksR0FBRyxLQUFLLGFBQWE7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDOUQsT0FBTyxrQkFBa0IsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQztRQUVGLElBQUksQ0FBQyxVQUFVLEdBQUcsWUFBWSxDQUFDLEdBQUcsRUFBRyxJQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxVQUFVLENBQUMsSUFBYTtRQUN0QixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxNQUFNLE9BQU8sR0FBSSxJQUFZLENBQUMsT0FBTyxDQUFDO1FBQ3RDLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7WUFDN0IsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDVCxnQ0FBZ0M7Z0JBQ2hDLDBCQUEwQjtnQkFDMUIsSUFBSyxNQUFjLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ2hDLEtBQUssRUFBRSxDQUFDO29CQUNQLE1BQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO2dCQUNyQyxDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLEtBQUssTUFBTSxTQUFTLElBQUssTUFBYyxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUM5QyxLQUFLLEVBQUUsQ0FBQztvQkFDUCxNQUFjLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQztnQkFDMUMsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsc0VBQXNFO0lBQzlELFVBQVU7UUFDaEIsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO1lBQ2xELE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1lBQzVFLElBQUksQ0FBQyxVQUFVO2dCQUFFLFNBQVM7WUFDMUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMzRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hDLEtBQUssTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFHLE9BQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzdDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBRUQsU0FBUyxhQUFhLENBQUMsUUFBZ0I7SUFDckMsSUFBSSxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQyJ9
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { FileSystemLoader } from 'nunjucks';
|
|
2
|
+
import type { Application } from 'egg';
|
|
3
|
+
/**
|
|
4
|
+
* Extended nunjucks FileSystemLoader, will auto inject csrf && nonce
|
|
5
|
+
*/
|
|
6
|
+
export declare class NunjucksFileLoader extends FileSystemLoader {
|
|
7
|
+
private app;
|
|
8
|
+
/**
|
|
9
|
+
* @param app - application instance
|
|
10
|
+
*/
|
|
11
|
+
constructor(app: Application);
|
|
12
|
+
/**
|
|
13
|
+
* Override getSource {@link https://mozilla.github.io/nunjucks/api.html#writing-a-loader},
|
|
14
|
+
* inject csrfTag and nonce
|
|
15
|
+
* @param name - the name of the template
|
|
16
|
+
* @return html
|
|
17
|
+
*/
|
|
18
|
+
getSource(name: string): any;
|
|
19
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { FileSystemLoader } from 'nunjucks';
|
|
2
|
+
/**
|
|
3
|
+
* Extended nunjucks FileSystemLoader, will auto inject csrf && nonce
|
|
4
|
+
*/
|
|
5
|
+
export class NunjucksFileLoader extends FileSystemLoader {
|
|
6
|
+
app;
|
|
7
|
+
/**
|
|
8
|
+
* @param app - application instance
|
|
9
|
+
*/
|
|
10
|
+
constructor(app) {
|
|
11
|
+
super(app.config.view.root, { noCache: app.config.nunjucks.noCache });
|
|
12
|
+
this.app = app;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Override getSource {@link https://mozilla.github.io/nunjucks/api.html#writing-a-loader},
|
|
16
|
+
* inject csrfTag and nonce
|
|
17
|
+
* @param name - the name of the template
|
|
18
|
+
* @return html
|
|
19
|
+
*/
|
|
20
|
+
getSource(name) {
|
|
21
|
+
const result = super.getSource(name);
|
|
22
|
+
/* istanbul ignore else */
|
|
23
|
+
if (result) {
|
|
24
|
+
const config = this.app.config.security;
|
|
25
|
+
// auto inject `_csrf` attr to form field, rely on `app.injectCsrf` provided by `security` plugin
|
|
26
|
+
if (!(config.csrf === false || config.csrf.enable === false)) {
|
|
27
|
+
result.src = this.app.injectCsrf(result.src);
|
|
28
|
+
}
|
|
29
|
+
// auto inject `nonce` attr to script tag, rely on `app.injectNonce` provided by `security` plugin
|
|
30
|
+
if (!(config.csp === false || config.csp.enable === false)) {
|
|
31
|
+
result.src = this.app.injectNonce(result.src);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZV9sb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL2ZpbGVfbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUc1Qzs7R0FFRztBQUNILE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxnQkFBZ0I7SUFDOUMsR0FBRyxDQUFjO0lBRXpCOztPQUVHO0lBQ0gsWUFBWSxHQUFnQjtRQUMxQixLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ00sU0FBUyxDQUFDLElBQVk7UUFDN0IsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQywwQkFBMEI7UUFDMUIsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztZQUN4QyxpR0FBaUc7WUFDakcsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxLQUFLLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDN0QsTUFBTSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDL0MsQ0FBQztZQUNELGtHQUFrRztZQUNsRyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLEtBQUssSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUMzRCxNQUFNLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoRCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Q0FDRiJ9
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Application, Context } from 'egg';
|
|
2
|
+
type BuildInFilters = Record<string, any>;
|
|
3
|
+
type HelperClass = new (ctx: Context) => any;
|
|
4
|
+
/**
|
|
5
|
+
* Create NunjucksViewHelper class
|
|
6
|
+
* @param app - application instance
|
|
7
|
+
* @param buildInFilters - nunjucks built-in filters
|
|
8
|
+
* @returns NunjucksViewHelper class
|
|
9
|
+
*/
|
|
10
|
+
export declare function createHelper(app: Application, buildInFilters: BuildInFilters): HelperClass;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create NunjucksViewHelper class
|
|
3
|
+
* @param app - application instance
|
|
4
|
+
* @param buildInFilters - nunjucks built-in filters
|
|
5
|
+
* @returns NunjucksViewHelper class
|
|
6
|
+
*/
|
|
7
|
+
export function createHelper(app, buildInFilters) {
|
|
8
|
+
/**
|
|
9
|
+
* NunjucksViewHelper extends {@link Helper} for nunjucks templates.
|
|
10
|
+
* Wrap some helpers for safe string, and transform build-in filters to helpers
|
|
11
|
+
*/
|
|
12
|
+
class NunjucksViewHelper extends app.Helper {
|
|
13
|
+
constructor(ctx) {
|
|
14
|
+
super(ctx);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* See {@link Helper#shtml}
|
|
18
|
+
* @param str - the string that will be transformed to safe html
|
|
19
|
+
* @return the result
|
|
20
|
+
*/
|
|
21
|
+
shtml(str) {
|
|
22
|
+
return this.safe(super.shtml(str));
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* See {@link Helper#surl}
|
|
26
|
+
* @param str - the string that will be transformed to safe url
|
|
27
|
+
* @return the result
|
|
28
|
+
*/
|
|
29
|
+
surl(str) {
|
|
30
|
+
return this.safe(super.surl(str));
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* See {@link Helper#sjs}
|
|
34
|
+
* @param str - the string that will be transformed to safe js
|
|
35
|
+
* @return the result
|
|
36
|
+
*/
|
|
37
|
+
sjs(str) {
|
|
38
|
+
return this.safe(super.sjs(str));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* don't use `super.helper.escape` directly due to `SafeString` checking
|
|
42
|
+
* see https://github.com/mozilla/nunjucks/blob/master/src/filters.js#L119
|
|
43
|
+
* buildInFilters.escape is `nunjucks.filters.escape` which will call `nunjucks.lib.escape`
|
|
44
|
+
* and `nunjucks.lib.escape` is overrided by `app.Helper.escape` for better performance
|
|
45
|
+
* @param str - the string that will be escaped
|
|
46
|
+
* @return the result
|
|
47
|
+
*/
|
|
48
|
+
escape(str) {
|
|
49
|
+
return buildInFilters.escape(str);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* get hidden filed for `csrf`
|
|
53
|
+
* @return html string
|
|
54
|
+
*/
|
|
55
|
+
csrfTag() {
|
|
56
|
+
return this.safe(`<input type="hidden" name="_csrf" value="${this.ctx.csrf}" />`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// fill view helper with nunjucks build-in filters
|
|
60
|
+
for (const key in buildInFilters) {
|
|
61
|
+
if (NunjucksViewHelper.prototype[key] == null) {
|
|
62
|
+
NunjucksViewHelper.prototype[key] = buildInFilters[key];
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return NunjucksViewHelper;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0E7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLEdBQWdCLEVBQUUsY0FBOEI7SUFDM0U7OztPQUdHO0lBQ0gsTUFBTSxrQkFBbUIsU0FBUSxHQUFHLENBQUMsTUFBTTtRQUN6QyxZQUFZLEdBQVk7WUFDdEIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsQ0FBQztRQUVEOzs7O1dBSUc7UUFDSCxLQUFLLENBQUMsR0FBVztZQUNmLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDckMsQ0FBQztRQUVEOzs7O1dBSUc7UUFDSCxJQUFJLENBQUMsR0FBVztZQUNkLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUVEOzs7O1dBSUc7UUFDSCxHQUFHLENBQUMsR0FBVztZQUNiLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUVEOzs7Ozs7O1dBT0c7UUFDSCxNQUFNLENBQUMsR0FBVztZQUNoQixPQUFPLGNBQWMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUVEOzs7V0FHRztRQUNILE9BQU87WUFDTCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsNENBQTRDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQztRQUNwRixDQUFDO0tBQ0Y7SUFFRCxrREFBa0Q7SUFDbEQsS0FBSyxNQUFNLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUNqQyxJQUFLLGtCQUFrQixDQUFDLFNBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdEQsa0JBQWtCLENBQUMsU0FBaUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkUsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLGtCQUFpQyxDQUFDO0FBQzNDLENBQUMifQ==
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Context } from 'egg';
|
|
2
|
+
import type { createHelper } from './helper.ts';
|
|
3
|
+
/**
|
|
4
|
+
* Nunjucks view class for rendering templates
|
|
5
|
+
*/
|
|
6
|
+
export declare class NunjucksView {
|
|
7
|
+
ctx: Context;
|
|
8
|
+
app: Context['app'];
|
|
9
|
+
viewHelper: InstanceType<ReturnType<typeof createHelper>>;
|
|
10
|
+
constructor(ctx: Context);
|
|
11
|
+
/**
|
|
12
|
+
* Render a template file
|
|
13
|
+
* @param name - template name
|
|
14
|
+
* @param locals - template locals
|
|
15
|
+
* @returns rendered html string
|
|
16
|
+
*/
|
|
17
|
+
render(name: string, locals: Record<string, any>): Promise<string>;
|
|
18
|
+
/**
|
|
19
|
+
* Render a template string
|
|
20
|
+
* @param tpl - template string
|
|
21
|
+
* @param locals - template locals
|
|
22
|
+
* @param opts - render options
|
|
23
|
+
* @returns rendered html string
|
|
24
|
+
*/
|
|
25
|
+
renderString(tpl: string, locals: Record<string, any>, opts?: any): Promise<string>;
|
|
26
|
+
}
|
package/dist/lib/view.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nunjucks view class for rendering templates
|
|
3
|
+
*/
|
|
4
|
+
export class NunjucksView {
|
|
5
|
+
ctx;
|
|
6
|
+
app;
|
|
7
|
+
viewHelper;
|
|
8
|
+
constructor(ctx) {
|
|
9
|
+
this.ctx = ctx;
|
|
10
|
+
this.app = ctx.app;
|
|
11
|
+
this.viewHelper = new this.app.nunjucks.ViewHelper(ctx);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Render a template file
|
|
15
|
+
* @param name - template name
|
|
16
|
+
* @param locals - template locals
|
|
17
|
+
* @returns rendered html string
|
|
18
|
+
*/
|
|
19
|
+
render(name, locals) {
|
|
20
|
+
locals.helper = this.viewHelper;
|
|
21
|
+
return new Promise((resolve, reject) => {
|
|
22
|
+
this.app.nunjucks.render(name, locals, (err, result) => {
|
|
23
|
+
if (err)
|
|
24
|
+
return reject(err);
|
|
25
|
+
resolve(result);
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Render a template string
|
|
31
|
+
* @param tpl - template string
|
|
32
|
+
* @param locals - template locals
|
|
33
|
+
* @param opts - render options
|
|
34
|
+
* @returns rendered html string
|
|
35
|
+
*/
|
|
36
|
+
renderString(tpl, locals, opts) {
|
|
37
|
+
locals.helper = this.viewHelper;
|
|
38
|
+
return new Promise((resolve, reject) => {
|
|
39
|
+
if (opts) {
|
|
40
|
+
this.app.nunjucks.renderString(tpl, locals, opts, (err, result) => {
|
|
41
|
+
if (err)
|
|
42
|
+
return reject(err);
|
|
43
|
+
resolve(result);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
this.app.nunjucks.renderString(tpl, locals, (err, result) => {
|
|
48
|
+
if (err)
|
|
49
|
+
return reject(err);
|
|
50
|
+
resolve(result);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlldy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvdmlldy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQTs7R0FFRztBQUNILE1BQU0sT0FBTyxZQUFZO0lBQ3ZCLEdBQUcsQ0FBVTtJQUNiLEdBQUcsQ0FBaUI7SUFDcEIsVUFBVSxDQUFnRDtJQUUxRCxZQUFZLEdBQVk7UUFDdEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsSUFBWSxFQUFFLE1BQTJCO1FBQzlDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNoQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3BDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBZ0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQWlCLEVBQUUsTUFBZSxFQUFFLEVBQUU7Z0JBQ3JGLElBQUksR0FBRztvQkFBRSxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDNUIsT0FBTyxDQUFDLE1BQU8sQ0FBQyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsWUFBWSxDQUFDLEdBQVcsRUFBRSxNQUEyQixFQUFFLElBQVU7UUFDL0QsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ2hDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDUixJQUFJLENBQUMsR0FBRyxDQUFDLFFBQWdCLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBaUIsRUFBRSxNQUFlLEVBQUUsRUFBRTtvQkFDaEcsSUFBSSxHQUFHO3dCQUFFLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUM1QixPQUFPLENBQUMsTUFBTyxDQUFDLENBQUM7Z0JBQ25CLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxDQUFDO2dCQUNMLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBZ0IsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQWlCLEVBQUUsTUFBZSxFQUFFLEVBQUU7b0JBQzFGLElBQUksR0FBRzt3QkFBRSxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDNUIsT0FBTyxDQUFDLE1BQU8sQ0FBQyxDQUFDO2dCQUNuQixDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiJ9
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { NunjucksConfig } from './config/config.default.ts';
|
|
2
|
+
import type { NunjucksEnvironment } from './lib/environment.ts';
|
|
3
|
+
declare module 'egg' {
|
|
4
|
+
interface EggAppConfig {
|
|
5
|
+
nunjucks: NunjucksConfig;
|
|
6
|
+
}
|
|
7
|
+
interface Application {
|
|
8
|
+
/**
|
|
9
|
+
* Nunjucks environment instance
|
|
10
|
+
* @see https://mozilla.github.io/nunjucks/api.html#environment
|
|
11
|
+
*/
|
|
12
|
+
get nunjucks(): NunjucksEnvironment;
|
|
13
|
+
}
|
|
14
|
+
}
|
package/dist/types.js
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@eggjs/view-nunjucks",
|
|
3
|
+
"version": "3.0.0-beta.0",
|
|
4
|
+
"description": "nunjucks view plugin for egg",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": "./dist/index.js",
|
|
8
|
+
"./app": "./dist/app.js",
|
|
9
|
+
"./app/extend/application": "./dist/app/extend/application.js",
|
|
10
|
+
"./config/config.default": "./dist/config/config.default.js",
|
|
11
|
+
"./config/config.local": "./dist/config/config.local.js",
|
|
12
|
+
"./lib/engine": "./dist/lib/engine.js",
|
|
13
|
+
"./lib/environment": "./dist/lib/environment.js",
|
|
14
|
+
"./lib/file_loader": "./dist/lib/file_loader.js",
|
|
15
|
+
"./lib/helper": "./dist/lib/helper.js",
|
|
16
|
+
"./lib/view": "./dist/lib/view.js",
|
|
17
|
+
"./types": "./dist/types.js",
|
|
18
|
+
"./package.json": "./package.json"
|
|
19
|
+
},
|
|
20
|
+
"publishConfig": {
|
|
21
|
+
"access": "public"
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"dist"
|
|
25
|
+
],
|
|
26
|
+
"eggPlugin": {
|
|
27
|
+
"name": "nunjucks",
|
|
28
|
+
"dep": [
|
|
29
|
+
"security",
|
|
30
|
+
"view"
|
|
31
|
+
]
|
|
32
|
+
},
|
|
33
|
+
"keywords": [
|
|
34
|
+
"egg",
|
|
35
|
+
"eggPlugin",
|
|
36
|
+
"egg-plugin",
|
|
37
|
+
"egg-view",
|
|
38
|
+
"nunjucks",
|
|
39
|
+
"view",
|
|
40
|
+
"template"
|
|
41
|
+
],
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"nunjucks": "^3.2.4"
|
|
44
|
+
},
|
|
45
|
+
"peerDependencies": {
|
|
46
|
+
"egg": "4.1.0-beta.28"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@types/nunjucks": "^3.2.6",
|
|
50
|
+
"cheerio": "^1.0.0",
|
|
51
|
+
"common-tags": "^1.8.2",
|
|
52
|
+
"marked": "^15.0.12",
|
|
53
|
+
"nunjucks-markdown": "^2.0.1",
|
|
54
|
+
"oxlint": "^1.23.0",
|
|
55
|
+
"rimraf": "^6.0.1",
|
|
56
|
+
"tsdown": "0.15.6",
|
|
57
|
+
"typescript": "^5.9.3",
|
|
58
|
+
"vitest": "4.0.0-beta.18"
|
|
59
|
+
},
|
|
60
|
+
"engines": {
|
|
61
|
+
"node": ">=22.18.0"
|
|
62
|
+
},
|
|
63
|
+
"repository": {
|
|
64
|
+
"type": "git",
|
|
65
|
+
"url": "git+https://github.com/eggjs/egg.git",
|
|
66
|
+
"directory": "plugins/view-nunjucks"
|
|
67
|
+
},
|
|
68
|
+
"bugs": "https://github.com/eggjs/egg/issues",
|
|
69
|
+
"homepage": "https://github.com/eggjs/egg/tree/next/plugins/view-nunjucks#readme",
|
|
70
|
+
"author": "TZ <atian25@qq.com>",
|
|
71
|
+
"license": "MIT",
|
|
72
|
+
"main": "./dist/index.js",
|
|
73
|
+
"module": "./dist/index.js",
|
|
74
|
+
"types": "./dist/index.d.ts",
|
|
75
|
+
"scripts": {
|
|
76
|
+
"build": "tsdown && rimraf dist *.tsbuildinfo && tsc -p tsconfig.build.json",
|
|
77
|
+
"typecheck": "tsc --noEmit",
|
|
78
|
+
"lint": "oxlint --type-aware",
|
|
79
|
+
"test": "vitest run"
|
|
80
|
+
}
|
|
81
|
+
}
|