From f36ae6c702b662430e1f6ddc3d4bd61b267388ff Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Fri, 21 Jun 2024 17:01:58 +0300 Subject: [PATCH] test: added --- .../container/0-eager-shared/App.js | 7 ++ .../container/0-eager-shared/emitter.js | 9 +++ .../container/0-eager-shared/index.js | 6 ++ .../node_modules/tiny-emitter/index.js | 67 +++++++++++++++++++ .../node_modules/tiny-emitter/package.json | 7 ++ .../container/0-eager-shared/package.json | 9 +++ .../0-eager-shared/webpack.config.js | 26 +++++++ .../container/eager-shared/index.js | 13 ++++ .../node_modules/tiny-emitter/index.js | 66 ++++++++++++++++++ .../node_modules/tiny-emitter/package.json | 7 ++ .../container/eager-shared/package.json | 9 +++ .../container/eager-shared/webpack.config.js | 25 +++++++ 12 files changed, 251 insertions(+) create mode 100644 test/configCases/container/0-eager-shared/App.js create mode 100644 test/configCases/container/0-eager-shared/emitter.js create mode 100644 test/configCases/container/0-eager-shared/index.js create mode 100644 test/configCases/container/0-eager-shared/node_modules/tiny-emitter/index.js create mode 100644 test/configCases/container/0-eager-shared/node_modules/tiny-emitter/package.json create mode 100644 test/configCases/container/0-eager-shared/package.json create mode 100644 test/configCases/container/0-eager-shared/webpack.config.js create mode 100644 test/configCases/container/eager-shared/index.js create mode 100644 test/configCases/container/eager-shared/node_modules/tiny-emitter/index.js create mode 100644 test/configCases/container/eager-shared/node_modules/tiny-emitter/package.json create mode 100644 test/configCases/container/eager-shared/package.json create mode 100644 test/configCases/container/eager-shared/webpack.config.js diff --git a/test/configCases/container/0-eager-shared/App.js b/test/configCases/container/0-eager-shared/App.js new file mode 100644 index 000000000..aa4e4480b --- /dev/null +++ b/test/configCases/container/0-eager-shared/App.js @@ -0,0 +1,7 @@ +import { emitter } from "./emitter.js"; + +function App() { + return emitter; +} + +export default App; diff --git a/test/configCases/container/0-eager-shared/emitter.js b/test/configCases/container/0-eager-shared/emitter.js new file mode 100644 index 000000000..199bf88f9 --- /dev/null +++ b/test/configCases/container/0-eager-shared/emitter.js @@ -0,0 +1,9 @@ +import { TinyEmitter } from 'tiny-emitter' + +const emitter = new TinyEmitter() + +emitter.on('hello', () => console.log('hello[service]')) + +export { + emitter, +} diff --git a/test/configCases/container/0-eager-shared/index.js b/test/configCases/container/0-eager-shared/index.js new file mode 100644 index 000000000..d512f6141 --- /dev/null +++ b/test/configCases/container/0-eager-shared/index.js @@ -0,0 +1,6 @@ +it("should allow to import exposed modules sync", () => { + return import("./App").then(({ default: App }) => { + expect(App().e.hello).toBeDefined(); + }); +}); + diff --git a/test/configCases/container/0-eager-shared/node_modules/tiny-emitter/index.js b/test/configCases/container/0-eager-shared/node_modules/tiny-emitter/index.js new file mode 100644 index 000000000..7ca4a606e --- /dev/null +++ b/test/configCases/container/0-eager-shared/node_modules/tiny-emitter/index.js @@ -0,0 +1,67 @@ +function E () { + // Keep this empty so it's easier to inherit from + // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3) +} + +E.prototype = { + on: function (name, callback, ctx) { + var e = this.e || (this.e = {}); + + (e[name] || (e[name] = [])).push({ + fn: callback, + ctx: ctx + }); + + return this; + }, + + once: function (name, callback, ctx) { + var self = this; + function listener () { + self.off(name, listener); + callback.apply(ctx, arguments); + }; + + listener._ = callback + return this.on(name, listener, ctx); + }, + + emit: function (name) { + var data = [].slice.call(arguments, 1); + var evtArr = ((this.e || (this.e = {}))[name] || []).slice(); + var i = 0; + var len = evtArr.length; + + for (i; i < len; i++) { + evtArr[i].fn.apply(evtArr[i].ctx, data); + } + + return this; + }, + + off: function (name, callback) { + var e = this.e || (this.e = {}); + var evts = e[name]; + var liveEvents = []; + + if (evts && callback) { + for (var i = 0, len = evts.length; i < len; i++) { + if (evts[i].fn !== callback && evts[i].fn._ !== callback) + liveEvents.push(evts[i]); + } + } + + // Remove event from queue to prevent memory leak + // Suggested by https://github.com/lazd + // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910 + + (liveEvents.length) + ? e[name] = liveEvents + : delete e[name]; + + return this; + } +}; + +module.exports = E; +module.exports.TinyEmitter = E; diff --git a/test/configCases/container/0-eager-shared/node_modules/tiny-emitter/package.json b/test/configCases/container/0-eager-shared/node_modules/tiny-emitter/package.json new file mode 100644 index 000000000..4bf445b8e --- /dev/null +++ b/test/configCases/container/0-eager-shared/node_modules/tiny-emitter/package.json @@ -0,0 +1,7 @@ +{ + "name": "tiny-emitter", + "version": "2.1.0", + "description": "A tiny (less than 1k) event emitter library", + "main": "index.js", + "license": "MIT" +} diff --git a/test/configCases/container/0-eager-shared/package.json b/test/configCases/container/0-eager-shared/package.json new file mode 100644 index 000000000..7fc07107a --- /dev/null +++ b/test/configCases/container/0-eager-shared/package.json @@ -0,0 +1,9 @@ +{ + "private": true, + "engines": { + "node": ">=10.13.0" + }, + "dependencies": { + "tiny-emitter": "^2.1.0" + } +} diff --git a/test/configCases/container/0-eager-shared/webpack.config.js b/test/configCases/container/0-eager-shared/webpack.config.js new file mode 100644 index 000000000..f50ceb497 --- /dev/null +++ b/test/configCases/container/0-eager-shared/webpack.config.js @@ -0,0 +1,26 @@ +const { dependencies } = require("./package.json"); +const { ModuleFederationPlugin } = require("../../../../").container; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + chunkIds: "named", + moduleIds: "named" + }, + plugins: [ + new ModuleFederationPlugin({ + name: "container", + filename: "container.js", + library: { type: "commonjs-module" }, + exposes: { + "./emitter": { + name: "emitter", + import: "./emitter.js" + } + }, + shared: { + ...dependencies + } + }) + ] +}; diff --git a/test/configCases/container/eager-shared/index.js b/test/configCases/container/eager-shared/index.js new file mode 100644 index 000000000..6ca58a719 --- /dev/null +++ b/test/configCases/container/eager-shared/index.js @@ -0,0 +1,13 @@ +import TinyEmitter from 'tiny-emitter' + +it("should load the component from container", () => { + const emitter = new TinyEmitter() + + emitter.on('hello', () => {}) + + expect(emitter.e.hello).toBeDefined(); + + return import('service/emitter').then(({ emitter }) => { + expect(emitter.e.hello).toBeDefined(); + }) +}); diff --git a/test/configCases/container/eager-shared/node_modules/tiny-emitter/index.js b/test/configCases/container/eager-shared/node_modules/tiny-emitter/index.js new file mode 100644 index 000000000..b85d89217 --- /dev/null +++ b/test/configCases/container/eager-shared/node_modules/tiny-emitter/index.js @@ -0,0 +1,66 @@ +function E () { + // Keep this empty so it's easier to inherit from + // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3) +} + +E.prototype = { + on: function (name, callback, ctx) { + var e = this.e || (this.e = {}); + + (e[name] || (e[name] = [])).push({ + fn: callback, + ctx: ctx + }); + + return this; + }, + + once: function (name, callback, ctx) { + var self = this; + function listener () { + self.off(name, listener); + callback.apply(ctx, arguments); + }; + + listener._ = callback + return this.on(name, listener, ctx); + }, + + emit: function (name) { + var data = [].slice.call(arguments, 1); + var evtArr = ((this.e || (this.e = {}))[name] || []).slice(); + var i = 0; + var len = evtArr.length; + + for (i; i < len; i++) { + evtArr[i].fn.apply(evtArr[i].ctx, data); + } + + return this; + }, + + off: function (name, callback) { + var e = this.e || (this.e = {}); + var evts = e[name]; + var liveEvents = []; + + if (evts && callback) { + for (var i = 0, len = evts.length; i < len; i++) { + if (evts[i].fn !== callback && evts[i].fn._ !== callback) + liveEvents.push(evts[i]); + } + } + + // Remove event from queue to prevent memory leak + // Suggested by https://github.com/lazd + // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910 + + (liveEvents.length) + ? e[name] = liveEvents + : delete e[name]; + + return this; + } +}; + +module.exports = E; diff --git a/test/configCases/container/eager-shared/node_modules/tiny-emitter/package.json b/test/configCases/container/eager-shared/node_modules/tiny-emitter/package.json new file mode 100644 index 000000000..00786ca09 --- /dev/null +++ b/test/configCases/container/eager-shared/node_modules/tiny-emitter/package.json @@ -0,0 +1,7 @@ +{ + "name": "tiny-emitter", + "version": "2.0.0", + "description": "A tiny (less than 1k) event emitter library", + "main": "index.js", + "license": "MIT" +} diff --git a/test/configCases/container/eager-shared/package.json b/test/configCases/container/eager-shared/package.json new file mode 100644 index 000000000..4460fc7aa --- /dev/null +++ b/test/configCases/container/eager-shared/package.json @@ -0,0 +1,9 @@ +{ + "private": true, + "engines": { + "node": ">=10.13.0" + }, + "dependencies": { + "tiny-emitter": "=2.0.0" + } +} diff --git a/test/configCases/container/eager-shared/webpack.config.js b/test/configCases/container/eager-shared/webpack.config.js new file mode 100644 index 000000000..0d31eaeb6 --- /dev/null +++ b/test/configCases/container/eager-shared/webpack.config.js @@ -0,0 +1,25 @@ +const { dependencies } = require("./package.json"); +const { ModuleFederationPlugin } = require("../../../../").container; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + chunkIds: "named", + moduleIds: "named" + }, + plugins: [ + new ModuleFederationPlugin({ + remoteType: "commonjs-module", + remotes: { + service: "../0-eager-shared/container.js" + }, + shared: { + "tiny-emitter": { + eager: true, + singleton: true, + requiredVersion: dependencies["tiny-emitter"] + } + } + }) + ] +};