@eggjs/view 3.0.0 → 4.0.0-beta.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +18 -15
  2. package/dist/app/extend/application.d.ts +15 -0
  3. package/dist/app/extend/application.js +19 -0
  4. package/dist/app/extend/context.d.ts +39 -0
  5. package/dist/app/extend/context.js +49 -0
  6. package/dist/config/config.default.d.ts +33 -0
  7. package/dist/config/config.default.js +14 -0
  8. package/dist/config/config.local.d.ts +6 -0
  9. package/dist/config/config.local.js +5 -0
  10. package/dist/index.d.ts +3 -0
  11. package/dist/index.js +8 -0
  12. package/dist/lib/context_view.d.ts +52 -0
  13. package/dist/lib/context_view.js +86 -0
  14. package/dist/lib/index.d.ts +3 -0
  15. package/dist/lib/index.js +4 -0
  16. package/dist/lib/view_manager.d.ts +61 -0
  17. package/dist/lib/view_manager.js +83 -0
  18. package/dist/types.d.ts +28 -0
  19. package/dist/types.js +1 -0
  20. package/package.json +41 -66
  21. package/dist/commonjs/app/extend/application.d.ts +0 -17
  22. package/dist/commonjs/app/extend/application.js +0 -20
  23. package/dist/commonjs/app/extend/context.d.ts +0 -44
  24. package/dist/commonjs/app/extend/context.js +0 -50
  25. package/dist/commonjs/config/config.default.d.ts +0 -52
  26. package/dist/commonjs/config/config.default.js +0 -16
  27. package/dist/commonjs/config/config.local.d.ts +0 -3
  28. package/dist/commonjs/config/config.local.js +0 -8
  29. package/dist/commonjs/index.d.ts +0 -2
  30. package/dist/commonjs/index.js +0 -5
  31. package/dist/commonjs/lib/context_view.d.ts +0 -48
  32. package/dist/commonjs/lib/context_view.js +0 -104
  33. package/dist/commonjs/lib/view_manager.d.ts +0 -57
  34. package/dist/commonjs/lib/view_manager.js +0 -98
  35. package/dist/commonjs/package.json +0 -3
  36. package/dist/esm/app/extend/application.d.ts +0 -17
  37. package/dist/esm/app/extend/application.js +0 -17
  38. package/dist/esm/app/extend/context.d.ts +0 -44
  39. package/dist/esm/app/extend/context.js +0 -47
  40. package/dist/esm/config/config.default.d.ts +0 -52
  41. package/dist/esm/config/config.default.js +0 -11
  42. package/dist/esm/config/config.local.d.ts +0 -3
  43. package/dist/esm/config/config.local.js +0 -6
  44. package/dist/esm/index.d.ts +0 -2
  45. package/dist/esm/index.js +0 -3
  46. package/dist/esm/lib/context_view.d.ts +0 -48
  47. package/dist/esm/lib/context_view.js +0 -97
  48. package/dist/esm/lib/view_manager.d.ts +0 -57
  49. package/dist/esm/lib/view_manager.js +0 -91
  50. package/dist/esm/package.json +0 -3
  51. package/dist/package.json +0 -4
  52. package/src/app/extend/application.ts +0 -25
  53. package/src/app/extend/context.ts +0 -66
  54. package/src/config/config.default.ts +0 -56
  55. package/src/config/config.local.ts +0 -7
  56. package/src/index.ts +0 -2
  57. package/src/lib/context_view.ts +0 -111
  58. package/src/lib/view_manager.ts +0 -122
  59. package/src/typings/index.d.ts +0 -4
@@ -1,98 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.ViewManager = void 0;
7
- const node_assert_1 = __importDefault(require("node:assert"));
8
- const node_path_1 = __importDefault(require("node:path"));
9
- const node_fs_1 = require("node:fs");
10
- const utility_1 = require("utility");
11
- const is_type_of_1 = require("is-type-of");
12
- /**
13
- * ViewManager will manage all view engine that is registered.
14
- *
15
- * It can find the real file, then retrieve the view engine based on extension.
16
- * The plugin just register view engine using {@link ViewManager#use}
17
- */
18
- class ViewManager extends Map {
19
- config;
20
- extMap;
21
- fileMap;
22
- /**
23
- * @param {Application} app - application instance
24
- */
25
- constructor(app) {
26
- super();
27
- this.config = app.config.view;
28
- this.config.root = app.config.view.root
29
- .split(/\s*,\s*/g)
30
- .filter(filepath => (0, node_fs_1.existsSync)(filepath));
31
- this.extMap = new Map();
32
- this.fileMap = new Map();
33
- for (const ext of Object.keys(this.config.mapping)) {
34
- this.extMap.set(ext, this.config.mapping[ext]);
35
- }
36
- }
37
- /**
38
- * This method can register view engine.
39
- *
40
- * You can define a view engine class contains two method, `render` and `renderString`
41
- *
42
- * ```js
43
- * class View {
44
- * render() {}
45
- * renderString() {}
46
- * }
47
- * ```
48
- * @param {String} name - the name of view engine
49
- * @param {Object} viewEngine - the class of view engine
50
- */
51
- use(name, viewEngine) {
52
- (0, node_assert_1.default)(name, 'name is required');
53
- (0, node_assert_1.default)(!this.has(name), `${name} has been registered`);
54
- (0, node_assert_1.default)(viewEngine, 'viewEngine is required');
55
- (0, node_assert_1.default)(viewEngine.prototype.render, 'viewEngine should implement `render` method');
56
- (0, node_assert_1.default)(!(0, is_type_of_1.isGeneratorFunction)(viewEngine.prototype.render), 'viewEngine `render` method should not be generator function');
57
- (0, node_assert_1.default)(viewEngine.prototype.renderString, 'viewEngine should implement `renderString` method');
58
- (0, node_assert_1.default)(!(0, is_type_of_1.isGeneratorFunction)(viewEngine.prototype.renderString), 'viewEngine `renderString` method should not be generator function');
59
- this.set(name, viewEngine);
60
- }
61
- /**
62
- * Resolve the path based on the given name,
63
- * if the name is `user.html` and root is `app/view` (by default),
64
- * it will return `app/view/user.html`
65
- * @param {String} name - the given path name, it's relative to config.root
66
- * @return {String} filename - the full path
67
- */
68
- async resolve(name) {
69
- const config = this.config;
70
- // check cache
71
- let filename = this.fileMap.get(name);
72
- if (config.cache && filename)
73
- return filename;
74
- // try find it with default extension
75
- filename = await resolvePath([name, name + config.defaultExtension], config.root);
76
- (0, node_assert_1.default)(filename, `Can't find ${name} from ${config.root.join(',')}`);
77
- // set cache
78
- this.fileMap.set(name, filename);
79
- return filename;
80
- }
81
- }
82
- exports.ViewManager = ViewManager;
83
- async function resolvePath(names, root) {
84
- for (const name of names) {
85
- for (const dir of root) {
86
- const filename = node_path_1.default.join(dir, name);
87
- if (await (0, utility_1.exists)(filename)) {
88
- if (inpath(dir, filename)) {
89
- return filename;
90
- }
91
- }
92
- }
93
- }
94
- }
95
- function inpath(parent, sub) {
96
- return sub.indexOf(parent) > -1;
97
- }
98
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld19tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi92aWV3X21hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsOERBQWlDO0FBQ2pDLDBEQUE2QjtBQUM3QixxQ0FBcUM7QUFDckMscUNBQWlDO0FBRWpDLDJDQUFpRDtBQXVCakQ7Ozs7O0dBS0c7QUFDSCxNQUFhLFdBQVksU0FBUSxHQUE0QjtJQUMzRCxNQUFNLENBQW9CO0lBQzFCLE1BQU0sQ0FBc0I7SUFDNUIsT0FBTyxDQUFzQjtJQUU3Qjs7T0FFRztJQUNILFlBQVksR0FBWTtRQUN0QixLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSTthQUNwQyxLQUFLLENBQUMsVUFBVSxDQUFDO2FBQ2pCLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUEsb0JBQVUsRUFBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDekIsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSCxHQUFHLENBQUMsSUFBWSxFQUFF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
@@ -1,3 +0,0 @@
1
- {
2
- "type": "commonjs"
3
- }
@@ -1,17 +0,0 @@
1
- import { EggCore } from '@eggjs/core';
2
- import { ViewManager } from '../../lib/view_manager.js';
3
- declare const VIEW: unique symbol;
4
- export default class Application extends EggCore {
5
- [VIEW]: ViewManager;
6
- /**
7
- * Retrieve ViewManager instance
8
- * @member {ViewManager} Application#view
9
- */
10
- get view(): ViewManager;
11
- }
12
- declare module '@eggjs/core' {
13
- interface EggCore {
14
- get view(): ViewManager;
15
- }
16
- }
17
- export {};
@@ -1,17 +0,0 @@
1
- import { EggCore } from '@eggjs/core';
2
- import { ViewManager } from '../../lib/view_manager.js';
3
- const VIEW = Symbol('Application#view');
4
- export default class Application extends EggCore {
5
- [VIEW];
6
- /**
7
- * Retrieve ViewManager instance
8
- * @member {ViewManager} Application#view
9
- */
10
- get view() {
11
- if (!this[VIEW]) {
12
- this[VIEW] = new ViewManager(this);
13
- }
14
- return this[VIEW];
15
- }
16
- }
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbGljYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBwL2V4dGVuZC9hcHBsaWNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV4RCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUV4QyxNQUFNLENBQUMsT0FBTyxPQUFPLFdBQVksU0FBUSxPQUFPO0lBQzlDLENBQUMsSUFBSSxDQUFDLENBQWM7SUFFcEI7OztPQUdHO0lBQ0gsSUFBSSxJQUFJO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEIsQ0FBQztDQUNGIn0=
@@ -1,44 +0,0 @@
1
- import { Context } from '@eggjs/core';
2
- import { ContextView } from '../../lib/context_view.js';
3
- import { RenderOptions } from '../../lib/view_manager.js';
4
- declare const VIEW: unique symbol;
5
- export default class ViewContext extends Context {
6
- [VIEW]: ContextView;
7
- /**
8
- * Render a file by view engine, then set to body
9
- * @param {String} name - the file path based on root
10
- * @param {Object} [locals] - data used by template
11
- * @param {Object} [options] - view options, you can use `options.viewEngine` to specify view engine
12
- */
13
- render(name: string, locals?: Record<string, any>, options?: RenderOptions): Promise<void>;
14
- /**
15
- * Render a file by view engine and return it
16
- * @param {String} name - the file path based on root
17
- * @param {Object} [locals] - data used by template
18
- * @param {Object} [options] - view options, you can use `options.viewEngine` to specify view engine
19
- * @return {Promise<String>} result - return a promise with a render result
20
- */
21
- renderView(name: string, locals?: Record<string, any>, options?: RenderOptions): Promise<string>;
22
- /**
23
- * Render template string by view engine and return it
24
- * @param {String} tpl - template string
25
- * @param {Object} [locals] - data used by template
26
- * @param {Object} [options] - view options, you can use `options.viewEngine` to specify view engine
27
- * @return {Promise<String>} result - return a promise with a render result
28
- */
29
- renderString(tpl: string, locals?: Record<string, any>, options?: RenderOptions): Promise<string>;
30
- /**
31
- * View instance that is created every request
32
- * @member {ContextView} Context#view
33
- */
34
- get view(): ContextView;
35
- }
36
- declare module '@eggjs/core' {
37
- interface Context {
38
- view: ContextView;
39
- render(name: string, locals?: Record<string, any>, options?: RenderOptions): Promise<void>;
40
- renderView(name: string, locals?: Record<string, any>, options?: RenderOptions): Promise<string>;
41
- renderString(tpl: string, locals?: Record<string, any>, options?: RenderOptions): Promise<string>;
42
- }
43
- }
44
- export {};
@@ -1,47 +0,0 @@
1
- import { Context } from '@eggjs/core';
2
- import { ContextView } from '../../lib/context_view.js';
3
- const VIEW = Symbol('Context#view');
4
- export default class ViewContext extends Context {
5
- [VIEW];
6
- /**
7
- * Render a file by view engine, then set to body
8
- * @param {String} name - the file path based on root
9
- * @param {Object} [locals] - data used by template
10
- * @param {Object} [options] - view options, you can use `options.viewEngine` to specify view engine
11
- */
12
- async render(name, locals, options) {
13
- const body = await this.renderView(name, locals, options);
14
- this.body = body;
15
- }
16
- /**
17
- * Render a file by view engine and return it
18
- * @param {String} name - the file path based on root
19
- * @param {Object} [locals] - data used by template
20
- * @param {Object} [options] - view options, you can use `options.viewEngine` to specify view engine
21
- * @return {Promise<String>} result - return a promise with a render result
22
- */
23
- async renderView(name, locals, options) {
24
- return await this.view.render(name, locals, options);
25
- }
26
- /**
27
- * Render template string by view engine and return it
28
- * @param {String} tpl - template string
29
- * @param {Object} [locals] - data used by template
30
- * @param {Object} [options] - view options, you can use `options.viewEngine` to specify view engine
31
- * @return {Promise<String>} result - return a promise with a render result
32
- */
33
- async renderString(tpl, locals, options) {
34
- return await this.view.renderString(tpl, locals, options);
35
- }
36
- /**
37
- * View instance that is created every request
38
- * @member {ContextView} Context#view
39
- */
40
- get view() {
41
- if (!this[VIEW]) {
42
- this[VIEW] = new ContextView(this);
43
- }
44
- return this[VIEW];
45
- }
46
- }
47
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvZXh0ZW5kL2NvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFHeEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRXBDLE1BQU0sQ0FBQyxPQUFPLE9BQU8sV0FBWSxTQUFRLE9BQU87SUFDOUMsQ0FBQyxJQUFJLENBQUMsQ0FBYztJQUVwQjs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBWSxFQUFFLE1BQTRCLEVBQUUsT0FBdUI7UUFDOUUsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxVQUFVLENBQ2QsSUFBWSxFQUNaLE1BQTRCLEVBQzVCLE9BQXVCO1FBRXZCLE9BQU8sTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQVcsRUFBRSxNQUE0QixFQUFFLE9BQXVCO1FBQ25GLE9BQU8sTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFJLElBQUk7UUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQixDQUFDO0NBQ0YifQ==
@@ -1,52 +0,0 @@
1
- import type { EggAppInfo } from '@eggjs/core';
2
- /**
3
- * view default config
4
- * @member Config#view
5
- * @property {String} [root=${baseDir}/app/view] - give a path to find the file, you can specify multiple path with `,` delimiter
6
- * @property {Boolean} [cache=true] - whether cache the file's path
7
- * @property {String} [defaultExtension] - defaultExtension can be added automatically when there is no extension when call `ctx.render`
8
- * @property {String} [defaultViewEngine] - set the default view engine if you don't want specify the viewEngine every request.
9
- * @property {Object} mapping - map the file extension to view engine, such as `{ '.ejs': 'ejs' }`
10
- */
11
- export interface ViewConfig {
12
- /**
13
- * give a path to find the file, you can specify multiple path with `,` delimiter
14
- * Default is `${baseDir}/app/view`
15
- */
16
- root: string;
17
- /**
18
- * whether cache the file's path
19
- * Default is `true`
20
- */
21
- cache: boolean;
22
- /**
23
- * defaultExtension can be added automatically when there is no extension when call `ctx.render`
24
- * Default is `.html`
25
- */
26
- defaultExtension: string;
27
- /**
28
- * set the default view engine if you don't want specify the viewEngine every request.
29
- * Default is `''`
30
- */
31
- defaultViewEngine: string;
32
- /**
33
- * map the file extension to view engine, such as `{ '.ejs': 'ejs' }`
34
- * Default is `{}`
35
- */
36
- mapping: Record<string, string>;
37
- }
38
- declare const _default: (appInfo: EggAppInfo) => {
39
- view: {
40
- root: string;
41
- cache: boolean;
42
- defaultExtension: string;
43
- defaultViewEngine: string;
44
- mapping: {};
45
- };
46
- };
47
- export default _default;
48
- declare module '@eggjs/core' {
49
- interface EggAppConfig {
50
- view: ViewConfig;
51
- }
52
- }
@@ -1,11 +0,0 @@
1
- import path from 'node:path';
2
- export default (appInfo) => ({
3
- view: {
4
- root: path.join(appInfo.baseDir, 'app/view'),
5
- cache: true,
6
- defaultExtension: '.html',
7
- defaultViewEngine: '',
8
- mapping: {},
9
- },
10
- });
11
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmRlZmF1bHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29uZmlnL2NvbmZpZy5kZWZhdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQXdDN0IsZUFBZSxDQUFDLE9BQW1CLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdkMsSUFBSSxFQUFFO1FBQ0osSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUM7UUFDNUMsS0FBSyxFQUFFLElBQUk7UUFDWCxnQkFBZ0IsRUFBRSxPQUFPO1FBQ3pCLGlCQUFpQixFQUFFLEVBQUU7UUFDckIsT0FBTyxFQUFFLEVBQUU7S0FDWjtDQUNGLENBQUMsQ0FBQyJ9
@@ -1,3 +0,0 @@
1
- import type { EggAppConfig } from '@eggjs/core';
2
- declare const _default: EggAppConfig;
3
- export default _default;
@@ -1,6 +0,0 @@
1
- export default {
2
- view: {
3
- cache: false,
4
- },
5
- };
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmxvY2FsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbmZpZy9jb25maWcubG9jYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsZUFBZTtJQUNiLElBQUksRUFBRTtRQUNKLEtBQUssRUFBRSxLQUFLO0tBQ2I7Q0FDYyxDQUFDIn0=
@@ -1,2 +0,0 @@
1
- import './config/config.default.js';
2
- import './app/extend/application.js';
package/dist/esm/index.js DELETED
@@ -1,3 +0,0 @@
1
- import './config/config.default.js';
2
- import './app/extend/application.js';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLDZCQUE2QixDQUFDIn0=
@@ -1,48 +0,0 @@
1
- import type { Context, EggCore } from '@eggjs/core';
2
- import { ViewManager, type ViewManagerConfig, type RenderOptions } from './view_manager.js';
3
- declare const RENDER: unique symbol;
4
- declare const RENDER_STRING: unique symbol;
5
- declare const GET_VIEW_ENGINE: unique symbol;
6
- declare const SET_LOCALS: unique symbol;
7
- /**
8
- * View instance for each request.
9
- *
10
- * It will find the view engine, and render it.
11
- * The view engine should be registered in {@link ViewManager}.
12
- */
13
- export declare class ContextView {
14
- protected ctx: Context;
15
- protected app: EggCore;
16
- protected viewManager: ViewManager;
17
- protected config: ViewManagerConfig;
18
- constructor(ctx: Context);
19
- /**
20
- * Render a file by view engine
21
- * @param {String} name - the file path based on root
22
- * @param {Object} [locals] - data used by template
23
- * @param {Object} [options] - view options, you can use `options.viewEngine` to specify view engine
24
- * @return {Promise<String>} result - return a promise with a render result
25
- */
26
- render(name: string, locals?: Record<string, any>, options?: RenderOptions): Promise<string>;
27
- /**
28
- * Render a template string by view engine
29
- * @param {String} tpl - template string
30
- * @param {Object} [locals] - data used by template
31
- * @param {Object} [options] - view options, you can use `options.viewEngine` to specify view engine
32
- * @return {Promise<String>} result - return a promise with a render result
33
- */
34
- renderString(tpl: string, locals?: Record<string, any>, options?: RenderOptions): Promise<string>;
35
- [RENDER](name: string, locals?: Record<string, any>, options?: RenderOptions): Promise<string>;
36
- [RENDER_STRING](tpl: string, locals?: Record<string, any>, options?: RenderOptions): Promise<string>;
37
- [GET_VIEW_ENGINE](name: string): import("./view_manager.js").ViewEngine;
38
- /**
39
- * set locals for view, inject `locals.ctx`, `locals.request`, `locals.helper`
40
- * @private
41
- */
42
- [SET_LOCALS](locals?: Record<string, any>): {
43
- ctx: Context;
44
- request: import("@eggjs/core").Request;
45
- helper: import("egg").Helper;
46
- } & Record<string, any>;
47
- }
48
- export {};
@@ -1,97 +0,0 @@
1
- import path from 'node:path';
2
- import assert from 'node:assert';
3
- const RENDER = Symbol.for('contextView#render');
4
- const RENDER_STRING = Symbol.for('contextView#renderString');
5
- const GET_VIEW_ENGINE = Symbol.for('contextView#getViewEngine');
6
- const SET_LOCALS = Symbol.for('contextView#setLocals');
7
- /**
8
- * View instance for each request.
9
- *
10
- * It will find the view engine, and render it.
11
- * The view engine should be registered in {@link ViewManager}.
12
- */
13
- export class ContextView {
14
- ctx;
15
- app;
16
- viewManager;
17
- config;
18
- constructor(ctx) {
19
- this.ctx = ctx;
20
- this.app = this.ctx.app;
21
- this.viewManager = this.app.view;
22
- this.config = this.app.view.config;
23
- }
24
- /**
25
- * Render a file by view engine
26
- * @param {String} name - the file path based on root
27
- * @param {Object} [locals] - data used by template
28
- * @param {Object} [options] - view options, you can use `options.viewEngine` to specify view engine
29
- * @return {Promise<String>} result - return a promise with a render result
30
- */
31
- async render(name, locals, options) {
32
- return await this[RENDER](name, locals, options);
33
- }
34
- /**
35
- * Render a template string by view engine
36
- * @param {String} tpl - template string
37
- * @param {Object} [locals] - data used by template
38
- * @param {Object} [options] - view options, you can use `options.viewEngine` to specify view engine
39
- * @return {Promise<String>} result - return a promise with a render result
40
- */
41
- async renderString(tpl, locals, options) {
42
- return await this[RENDER_STRING](tpl, locals, options);
43
- }
44
- // ext -> viewEngineName -> viewEngine
45
- async [RENDER](name, locals, options = {}) {
46
- // retrieve fullpath matching name from `config.root`
47
- const filename = await this.viewManager.resolve(name);
48
- options.name = name;
49
- options.root = filename.replace(path.normalize(name), '').replace(/[\/\\]$/, '');
50
- options.locals = locals;
51
- // get the name of view engine,
52
- // if viewEngine is specified in options, don't match extension
53
- let viewEngineName = options.viewEngine;
54
- if (!viewEngineName) {
55
- const ext = path.extname(filename);
56
- viewEngineName = this.viewManager.extMap.get(ext);
57
- }
58
- // use the default view engine that is configured if no matching above
59
- if (!viewEngineName) {
60
- viewEngineName = this.config.defaultViewEngine;
61
- }
62
- assert(viewEngineName, `Can't find viewEngine for ${filename}`);
63
- // get view engine and render
64
- const viewEngine = this[GET_VIEW_ENGINE](viewEngineName);
65
- return await viewEngine.render(filename, this[SET_LOCALS](locals), options);
66
- }
67
- async [RENDER_STRING](tpl, locals, options) {
68
- let viewEngineName = options && options.viewEngine;
69
- if (!viewEngineName) {
70
- viewEngineName = this.config.defaultViewEngine;
71
- }
72
- assert(viewEngineName, 'Can\'t find viewEngine');
73
- // get view engine and render
74
- const viewEngine = this[GET_VIEW_ENGINE](viewEngineName);
75
- return await viewEngine.renderString(tpl, this[SET_LOCALS](locals), options);
76
- }
77
- [GET_VIEW_ENGINE](name) {
78
- // get view engine
79
- const ViewEngine = this.viewManager.get(name);
80
- assert(ViewEngine, `Can't find ViewEngine "${name}"`);
81
- // use view engine to render
82
- const engine = new ViewEngine(this.ctx);
83
- return engine;
84
- }
85
- /**
86
- * set locals for view, inject `locals.ctx`, `locals.request`, `locals.helper`
87
- * @private
88
- */
89
- [SET_LOCALS](locals) {
90
- return Object.assign({
91
- ctx: this.ctx,
92
- request: this.ctx.request,
93
- helper: this.ctx.helper,
94
- }, this.ctx.locals, locals);
95
- }
96
- }
97
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dF92aWV3LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jb250ZXh0X3ZpZXcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQztBQUlqQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDaEQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0FBQzdELE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsQ0FBQztBQUNoRSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLENBQUM7QUFFdkQ7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sV0FBVztJQUNaLEdBQUcsQ0FBVTtJQUNiLEdBQUcsQ0FBVTtJQUNiLFdBQVcsQ0FBYztJQUN6QixNQUFNLENBQW9CO0lBRXBDLFlBQVksR0FBWTtRQUN0QixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFDeEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztRQUNqQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFZLEVBQUUsTUFBNEIsRUFBRSxPQUF1QjtRQUM5RSxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFD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
@@ -1,57 +0,0 @@
1
- import type { Context, EggCore } from '@eggjs/core';
2
- import type { ViewConfig } from '../config/config.default.js';
3
- export interface ViewManagerConfig extends Omit<ViewConfig, 'root'> {
4
- root: string[];
5
- }
6
- export type PlainObject<T = any> = {
7
- [key: string]: T;
8
- };
9
- export interface RenderOptions extends PlainObject {
10
- name?: string;
11
- root?: string;
12
- locals?: PlainObject;
13
- viewEngine?: string;
14
- }
15
- export interface ViewEngine {
16
- render: (name: string, locals?: Record<string, any>, options?: RenderOptions) => Promise<string>;
17
- renderString: (tpl: string, locals?: Record<string, any>, options?: RenderOptions) => Promise<string>;
18
- }
19
- export type ViewEngineClass = new (app: Context) => ViewEngine;
20
- /**
21
- * ViewManager will manage all view engine that is registered.
22
- *
23
- * It can find the real file, then retrieve the view engine based on extension.
24
- * The plugin just register view engine using {@link ViewManager#use}
25
- */
26
- export declare class ViewManager extends Map<string, ViewEngineClass> {
27
- config: ViewManagerConfig;
28
- extMap: Map<string, string>;
29
- fileMap: Map<string, string>;
30
- /**
31
- * @param {Application} app - application instance
32
- */
33
- constructor(app: EggCore);
34
- /**
35
- * This method can register view engine.
36
- *
37
- * You can define a view engine class contains two method, `render` and `renderString`
38
- *
39
- * ```js
40
- * class View {
41
- * render() {}
42
- * renderString() {}
43
- * }
44
- * ```
45
- * @param {String} name - the name of view engine
46
- * @param {Object} viewEngine - the class of view engine
47
- */
48
- use(name: string, viewEngine: ViewEngineClass): void;
49
- /**
50
- * Resolve the path based on the given name,
51
- * if the name is `user.html` and root is `app/view` (by default),
52
- * it will return `app/view/user.html`
53
- * @param {String} name - the given path name, it's relative to config.root
54
- * @return {String} filename - the full path
55
- */
56
- resolve(name: string): Promise<string>;
57
- }
@@ -1,91 +0,0 @@
1
- import assert from 'node:assert';
2
- import path from 'node:path';
3
- import { existsSync } from 'node:fs';
4
- import { exists } from 'utility';
5
- import { isGeneratorFunction } from 'is-type-of';
6
- /**
7
- * ViewManager will manage all view engine that is registered.
8
- *
9
- * It can find the real file, then retrieve the view engine based on extension.
10
- * The plugin just register view engine using {@link ViewManager#use}
11
- */
12
- export class ViewManager extends Map {
13
- config;
14
- extMap;
15
- fileMap;
16
- /**
17
- * @param {Application} app - application instance
18
- */
19
- constructor(app) {
20
- super();
21
- this.config = app.config.view;
22
- this.config.root = app.config.view.root
23
- .split(/\s*,\s*/g)
24
- .filter(filepath => existsSync(filepath));
25
- this.extMap = new Map();
26
- this.fileMap = new Map();
27
- for (const ext of Object.keys(this.config.mapping)) {
28
- this.extMap.set(ext, this.config.mapping[ext]);
29
- }
30
- }
31
- /**
32
- * This method can register view engine.
33
- *
34
- * You can define a view engine class contains two method, `render` and `renderString`
35
- *
36
- * ```js
37
- * class View {
38
- * render() {}
39
- * renderString() {}
40
- * }
41
- * ```
42
- * @param {String} name - the name of view engine
43
- * @param {Object} viewEngine - the class of view engine
44
- */
45
- use(name, viewEngine) {
46
- assert(name, 'name is required');
47
- assert(!this.has(name), `${name} has been registered`);
48
- assert(viewEngine, 'viewEngine is required');
49
- assert(viewEngine.prototype.render, 'viewEngine should implement `render` method');
50
- assert(!isGeneratorFunction(viewEngine.prototype.render), 'viewEngine `render` method should not be generator function');
51
- assert(viewEngine.prototype.renderString, 'viewEngine should implement `renderString` method');
52
- assert(!isGeneratorFunction(viewEngine.prototype.renderString), 'viewEngine `renderString` method should not be generator function');
53
- this.set(name, viewEngine);
54
- }
55
- /**
56
- * Resolve the path based on the given name,
57
- * if the name is `user.html` and root is `app/view` (by default),
58
- * it will return `app/view/user.html`
59
- * @param {String} name - the given path name, it's relative to config.root
60
- * @return {String} filename - the full path
61
- */
62
- async resolve(name) {
63
- const config = this.config;
64
- // check cache
65
- let filename = this.fileMap.get(name);
66
- if (config.cache && filename)
67
- return filename;
68
- // try find it with default extension
69
- filename = await resolvePath([name, name + config.defaultExtension], config.root);
70
- assert(filename, `Can't find ${name} from ${config.root.join(',')}`);
71
- // set cache
72
- this.fileMap.set(name, filename);
73
- return filename;
74
- }
75
- }
76
- async function resolvePath(names, root) {
77
- for (const name of names) {
78
- for (const dir of root) {
79
- const filename = path.join(dir, name);
80
- if (await exists(filename)) {
81
- if (inpath(dir, filename)) {
82
- return filename;
83
- }
84
- }
85
- }
86
- }
87
- }
88
- function inpath(parent, sub) {
89
- return sub.indexOf(parent) > -1;
90
- }
91
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld19tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi92aWV3X21hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFakMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBdUJqRDs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxXQUFZLFNBQVEsR0FBNEI7SUFDM0QsTUFBTSxDQUFvQjtJQUMxQixNQUFNLENBQXNCO0lBQzVCLE9BQU8sQ0FBc0I7SUFFN0I7O09BRUc7SUFDSCxZQUFZLEdBQVk7UUFDdEIsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBVyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUk7YUFDcEMsS0FBSyxDQUFDLFVBQVUsQ0FBQzthQUNqQixNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElB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
@@ -1,3 +0,0 @@
1
- {
2
- "type": "module"
3
- }
package/dist/package.json DELETED
@@ -1,4 +0,0 @@
1
- {
2
- "name": "@eggjs/view",
3
- "version": "3.0.0"
4
- }