@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 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
+ [![Contributors](https://contrib.rocks/image?repo=eggjs/egg)](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
@@ -0,0 +1,3 @@
1
+ import type { Application } from 'egg';
2
+ declare const _default: (app: Application) => void;
3
+ export default _default;
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,5 @@
1
+ import type { NunjucksConfig } from './config.default.ts';
2
+ declare const _default: () => {
3
+ nunjucks: Partial<NunjucksConfig>;
4
+ };
5
+ export default _default;
@@ -0,0 +1,8 @@
1
+ export default () => {
2
+ return {
3
+ nunjucks: {
4
+ cache: false,
5
+ },
6
+ };
7
+ };
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmxvY2FsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9jb25maWcubG9jYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsZUFBZSxHQUEwQyxFQUFFO0lBQ3pELE9BQU87UUFDTCxRQUFRLEVBQUU7WUFDUixLQUFLLEVBQUUsS0FBSztTQUNiO0tBQ0YsQ0FBQztBQUNKLENBQUMsQ0FBQyJ9
@@ -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
+ }
@@ -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
@@ -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
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
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
+ }