diff --git a/plugin/tegg/lib/EggModuleLoader.ts b/plugin/tegg/lib/EggModuleLoader.ts index afee5f5c..619e2116 100644 --- a/plugin/tegg/lib/EggModuleLoader.ts +++ b/plugin/tegg/lib/EggModuleLoader.ts @@ -18,6 +18,13 @@ export class EggModuleLoader { private buildAppGraph(loaderCache: Map) { const appGraph = new AppGraph(); + for (const plugin of Object.values(this.app.plugins)) { + if (!plugin.enable) continue; + const modulePlugin = this.app.moduleReferences.find(t => t.path === plugin.path); + if (modulePlugin) { + modulePlugin.optional = false; + } + } for (const moduleConfig of this.app.moduleReferences) { const modulePath = moduleConfig.path; const moduleNode = new ModuleNode(moduleConfig); diff --git a/plugin/tegg/test/OptionalPluginModule.test.ts b/plugin/tegg/test/OptionalPluginModule.test.ts new file mode 100644 index 00000000..2fb0a3c3 --- /dev/null +++ b/plugin/tegg/test/OptionalPluginModule.test.ts @@ -0,0 +1,36 @@ +import mm from 'egg-mock'; +import assert from 'assert'; +import path from 'path'; +import { UsedProto } from './fixtures/apps/plugin-module/node_modules/foo-plugin/Used'; + +describe('test/OptionalPluginModule.test.ts', () => { + let app; + const fixtureDir = path.join(__dirname, 'fixtures/apps/plugin-module'); + + after(async () => { + await app.close(); + }); + + afterEach(() => { + mm.restore(); + }); + + before(async () => { + mm(process.env, 'EGG_TYPESCRIPT', true); + mm(process, 'cwd', () => { + return path.join(__dirname, '..'); + }); + app = mm.app({ + baseDir: fixtureDir, + framework: require.resolve('egg'), + }); + await app.ready(); + }); + + it('should work', async () => { + await app.mockModuleContextScope(async ctx => { + const usedProto = await ctx.getEggObject(UsedProto); + assert(usedProto); + }); + }); +}); diff --git a/plugin/tegg/test/fixtures/apps/plugin-module/config/config.default.js b/plugin/tegg/test/fixtures/apps/plugin-module/config/config.default.js new file mode 100644 index 00000000..6d1b8de5 --- /dev/null +++ b/plugin/tegg/test/fixtures/apps/plugin-module/config/config.default.js @@ -0,0 +1,20 @@ +'use strict'; + +const path = require('path'); + +module.exports = function(appInfo) { + const config = { + keys: 'test key', + customLogger: { + xxLogger: { + file: path.join(appInfo.root, 'logs/xx.log'), + }, + }, + security: { + csrf: { + ignoreJSON: false, + } + }, + }; + return config; +}; diff --git a/plugin/tegg/test/fixtures/apps/plugin-module/config/plugin.js b/plugin/tegg/test/fixtures/apps/plugin-module/config/plugin.js new file mode 100644 index 00000000..e76785e8 --- /dev/null +++ b/plugin/tegg/test/fixtures/apps/plugin-module/config/plugin.js @@ -0,0 +1,18 @@ +'use strict'; + +exports.tracer = { + package: 'egg-tracer', + enable: true, +}; + +exports.teggConfig = { + package: '@eggjs/tegg-config', + enable: true, +}; + +exports.eggFooPlugin = { + package: 'foo-plugin', + enable: true, +}; + +exports.watcher = false; diff --git a/plugin/tegg/test/fixtures/apps/plugin-module/node_modules/foo-plugin/Used.js b/plugin/tegg/test/fixtures/apps/plugin-module/node_modules/foo-plugin/Used.js new file mode 100644 index 00000000..2bb8c288 --- /dev/null +++ b/plugin/tegg/test/fixtures/apps/plugin-module/node_modules/foo-plugin/Used.js @@ -0,0 +1,18 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UsedProto = void 0; +const tegg_core_decorator_1 = require('../../../../../../../../core/core-decorator'); +let UsedProto = class UsedProto { +}; +exports.UsedProto = UsedProto; +exports.UsedProto = UsedProto = __decorate([ + (0, tegg_core_decorator_1.SingletonProto)({ + accessLevel: tegg_core_decorator_1.AccessLevel.PUBLIC, + }) +], UsedProto); diff --git a/plugin/tegg/test/fixtures/apps/plugin-module/node_modules/foo-plugin/package.json b/plugin/tegg/test/fixtures/apps/plugin-module/node_modules/foo-plugin/package.json new file mode 100644 index 00000000..f0ff1764 --- /dev/null +++ b/plugin/tegg/test/fixtures/apps/plugin-module/node_modules/foo-plugin/package.json @@ -0,0 +1,9 @@ +{ + "name": "egg-foo-plugin", + "eggPlugin": { + "name": "eggFooPlugin" + }, + "eggModule": { + "name": "eggFooPlugin" + } +} diff --git a/plugin/tegg/test/fixtures/apps/plugin-module/node_modules/foo/package.json b/plugin/tegg/test/fixtures/apps/plugin-module/node_modules/foo/package.json new file mode 100644 index 00000000..05c96aaa --- /dev/null +++ b/plugin/tegg/test/fixtures/apps/plugin-module/node_modules/foo/package.json @@ -0,0 +1,6 @@ +{ + "name": "foo", + "dependencies": { + "foo-plugin": "*" + } +} diff --git a/plugin/tegg/test/fixtures/apps/plugin-module/package.json b/plugin/tegg/test/fixtures/apps/plugin-module/package.json new file mode 100644 index 00000000..3b868a43 --- /dev/null +++ b/plugin/tegg/test/fixtures/apps/plugin-module/package.json @@ -0,0 +1,6 @@ +{ + "name": "egg-app", + "egg": { + "framework": "foo" + } +}