🚀 Big News: Socket Acquires Coana to Bring Reachability Analysis to Every Appsec Team.Learn more
Socket
DemoInstallSign in
Socket

@module-federation/sdk

Package Overview
Dependencies
Maintainers
8
Versions
916
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@module-federation/sdk - npm Package Compare versions

Comparing version

to
0.1.19

149

dist/index.cjs.js

@@ -5,3 +5,3 @@ 'use strict';

function _define_property$3(obj, key, value) {
function _define_property$4(obj, key, value) {
if (key in obj) {

@@ -29,5 +29,5 @@ Object.defineProperty(obj, key, {

var _obj;
var NameTransformMap = (_obj = {}, _define_property$3(_obj, NameTransformSymbol.AT, 'scope_'), _define_property$3(_obj, NameTransformSymbol.HYPHEN, '_'), _define_property$3(_obj, NameTransformSymbol.SLASH, '__'), _obj);
var NameTransformMap = (_obj = {}, _define_property$4(_obj, NameTransformSymbol.AT, 'scope_'), _define_property$4(_obj, NameTransformSymbol.HYPHEN, '_'), _define_property$4(_obj, NameTransformSymbol.SLASH, '__'), _obj);
var _obj1;
var EncodedNameTransformMap = (_obj1 = {}, _define_property$3(_obj1, NameTransformMap[NameTransformSymbol.AT], NameTransformSymbol.AT), _define_property$3(_obj1, NameTransformMap[NameTransformSymbol.HYPHEN], NameTransformSymbol.HYPHEN), _define_property$3(_obj1, NameTransformMap[NameTransformSymbol.SLASH], NameTransformSymbol.SLASH), _obj1);
var EncodedNameTransformMap = (_obj1 = {}, _define_property$4(_obj1, NameTransformMap[NameTransformSymbol.AT], NameTransformSymbol.AT), _define_property$4(_obj1, NameTransformMap[NameTransformSymbol.HYPHEN], NameTransformSymbol.HYPHEN), _define_property$4(_obj1, NameTransformMap[NameTransformSymbol.SLASH], NameTransformSymbol.SLASH), _obj1);
var SEPARATOR = ':';

@@ -98,3 +98,3 @@ var ManifestFileName = 'mf-manifest.json';

}
function _define_property$2(obj, key, value) {
function _define_property$3(obj, key, value) {
if (key in obj) {

@@ -150,4 +150,4 @@ Object.defineProperty(obj, key, {

_class_call_check(this, Logger);
_define_property$2(this, "enable", false);
_define_property$2(this, "identifier", void 0);
_define_property$3(this, "enable", false);
_define_property$3(this, "identifier", void 0);
this.identifier = identifier || DEBUG_LOG;

@@ -381,3 +381,3 @@ if (isBrowserEnv() && safeGetLocalStorageItem()) {

function _define_property$1(obj, key, value) {
function _define_property$2(obj, key, value) {
if (key in obj) {

@@ -395,3 +395,3 @@ Object.defineProperty(obj, key, {

}
function _object_spread$1(target) {
function _object_spread$2(target) {
for(var i = 1; i < arguments.length; i++){

@@ -406,3 +406,3 @@ var source = arguments[i] != null ? arguments[i] : {};

ownKeys.forEach(function(key) {
_define_property$1(target, key, source[key]);
_define_property$2(target, key, source[key]);
});

@@ -546,3 +546,3 @@ }

var prefetchInterface = manifest.metaData.prefetchInterface;
basicRemoteSnapshot = _object_spread_props(_object_spread$1({}, basicRemoteSnapshot), {
basicRemoteSnapshot = _object_spread_props(_object_spread$2({}, basicRemoteSnapshot), {
prefetchInterface: prefetchInterface

@@ -553,3 +553,3 @@ });

var _manifest_metaData_prefetchEntry = manifest.metaData.prefetchEntry, path = _manifest_metaData_prefetchEntry.path, name = _manifest_metaData_prefetchEntry.name, type = _manifest_metaData_prefetchEntry.type;
basicRemoteSnapshot = _object_spread_props(_object_spread$1({}, basicRemoteSnapshot), {
basicRemoteSnapshot = _object_spread_props(_object_spread$2({}, basicRemoteSnapshot), {
prefetchEntry: simpleJoinRemoteEntry(path, name),

@@ -560,7 +560,7 @@ prefetchEntryType: type

if ('publicPath' in manifest.metaData) {
remoteSnapshot = _object_spread_props(_object_spread$1({}, basicRemoteSnapshot), {
remoteSnapshot = _object_spread_props(_object_spread$2({}, basicRemoteSnapshot), {
publicPath: getPublicPath()
});
} else {
remoteSnapshot = _object_spread_props(_object_spread$1({}, basicRemoteSnapshot), {
remoteSnapshot = _object_spread_props(_object_spread$2({}, basicRemoteSnapshot), {
getPublicPath: getPublicPath()

@@ -608,2 +608,15 @@ });

}
function _define_property$1(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _instanceof(left, right) {

@@ -616,2 +629,17 @@ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {

}
function _object_spread$1(target) {
for(var i = 1; i < arguments.length; i++){
var source = arguments[i] != null ? arguments[i] : {};
var ownKeys = Object.keys(source);
if (typeof Object.getOwnPropertySymbols === "function") {
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
}));
}
ownKeys.forEach(function(key) {
_define_property$1(target, key, source[key]);
});
}
return target;
}
function _ts_generator$1(thisArg, body) {

@@ -761,3 +789,3 @@ var f, y, t, g, _ = {

}
function createScript(url, cb, attrs, createScriptHook) {
function createScript(info) {
// Retrieve the existing script element by its src attribute

@@ -772,3 +800,3 @@ var script = null;

var scriptSrc = s.getAttribute('src');
if (scriptSrc && isStaticResourcesEqual(scriptSrc, url)) {
if (scriptSrc && isStaticResourcesEqual(scriptSrc, info.url)) {
script = s;

@@ -782,5 +810,5 @@ needAttach = false;

script.type = 'text/javascript';
script.src = url;
if (createScriptHook) {
var createScriptRes = createScriptHook(url);
script.src = info.url;
if (info.createScriptHook) {
var createScriptRes = info.createScriptHook(info.url);
if (_instanceof(createScriptRes, HTMLScriptElement)) {

@@ -793,16 +821,18 @@ script = createScriptRes;

}
}
if (attrs) {
Object.keys(attrs).forEach(function(name) {
if (script) {
if (name === 'async' || name === 'defer') {
script[name] = attrs[name];
} else {
script.setAttribute(name, attrs[name]);
var attrs = info.attrs;
if (attrs) {
Object.keys(attrs).forEach(function(name) {
if (script) {
if (name === 'async' || name === 'defer') {
script[name] = attrs[name];
} else {
script.setAttribute(name, attrs[name]);
}
}
}
});
});
}
}
var onScriptComplete = function(prev, // eslint-disable-next-line @typescript-eslint/no-explicit-any
event) {
var _info_cb;
clearTimeout(timeoutId);

@@ -814,12 +844,16 @@ // Prevent memory leaks in IE.

safeWrapper(function() {
(script === null || script === void 0 ? void 0 : script.parentNode) && script.parentNode.removeChild(script);
var _info_needDeleteScript = info.needDeleteScript, needDeleteScript = _info_needDeleteScript === void 0 ? true : _info_needDeleteScript;
if (needDeleteScript) {
(script === null || script === void 0 ? void 0 : script.parentNode) && script.parentNode.removeChild(script);
}
});
if (prev) {
var _info_cb1;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
var res = prev(event);
cb();
info === null || info === void 0 ? void 0 : (_info_cb1 = info.cb) === null || _info_cb1 === void 0 ? void 0 : _info_cb1.call(info);
return res;
}
}
cb();
info === null || info === void 0 ? void 0 : (_info_cb = info.cb) === null || _info_cb === void 0 ? void 0 : _info_cb.call(info);
};

@@ -829,3 +863,3 @@ script.onerror = onScriptComplete.bind(null, script.onerror);

timeoutId = setTimeout(function() {
onScriptComplete(null, new Error('Remote script "'.concat(url, '" time-outed.')));
onScriptComplete(null, new Error('Remote script "'.concat(info.url, '" time-outed.')));
}, timeout);

@@ -837,4 +871,3 @@ return {

}
function createLink(url, cb) {
var attrs = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}, createLinkHook = arguments.length > 3 ? arguments[3] : void 0;
function createLink(info) {
// <link rel="preload" href="script.js" as="script">

@@ -849,3 +882,3 @@ // Retrieve the existing script element by its src attribute

var linkRef = l.getAttribute('ref');
if (linkHref && isStaticResourcesEqual(linkHref, url) && linkRef === attrs['ref']) {
if (linkHref && isStaticResourcesEqual(linkHref, info.url) && linkRef === info.attrs['ref']) {
link = l;

@@ -858,6 +891,5 @@ needAttach = false;

link = document.createElement('link');
link.setAttribute('href', url);
link.setAttribute('crossorigin', 'anonymous');
if (createLinkHook) {
var createLinkRes = createLinkHook(url);
link.setAttribute('href', info.url);
if (info.createLinkHook) {
var createLinkRes = info.createLinkHook(info.url);
if (_instanceof(createLinkRes, HTMLLinkElement)) {

@@ -867,10 +899,11 @@ link = createLinkRes;

}
var attrs = info.attrs;
if (attrs) {
Object.keys(attrs).forEach(function(name) {
if (link) {
link.setAttribute(name, attrs[name]);
}
});
}
}
if (attrs) {
Object.keys(attrs).forEach(function(name) {
if (link) {
link.setAttribute(name, attrs[name]);
}
});
}
var onLinkComplete = function(prev, // eslint-disable-next-line @typescript-eslint/no-explicit-any

@@ -883,3 +916,6 @@ event) {

safeWrapper(function() {
(link === null || link === void 0 ? void 0 : link.parentNode) && link.parentNode.removeChild(link);
var _info_needDeleteLink = info.needDeleteLink, needDeleteLink = _info_needDeleteLink === void 0 ? true : _info_needDeleteLink;
if (needDeleteLink) {
(link === null || link === void 0 ? void 0 : link.parentNode) && link.parentNode.removeChild(link);
}
});

@@ -889,7 +925,7 @@ if (prev) {

var res = prev(event);
cb();
info.cb();
return res;
}
}
cb();
info.cb();
};

@@ -904,6 +940,15 @@ link.onerror = onLinkComplete.bind(null, link.onerror);

function loadScript(url, info) {
var attrs = info.attrs, createScriptHook = info.createScriptHook;
var _info_attrs = info.attrs, attrs = _info_attrs === void 0 ? {} : _info_attrs, createScriptHook = info.createScriptHook;
return new Promise(function(resolve, _reject) {
var _createScript = createScript(url, resolve, attrs, createScriptHook), script = _createScript.script, needAttach = _createScript.needAttach;
needAttach && document.getElementsByTagName('head')[0].appendChild(script);
var _createScript = createScript({
url: url,
cb: resolve,
attrs: _object_spread$1({
crossorigin: 'anonymous',
fetchpriority: 'high'
}, attrs),
createScriptHook: createScriptHook,
needDeleteScript: true
}), script = _createScript.script, needAttach = _createScript.needAttach;
needAttach && document.head.appendChild(script);
});

@@ -910,0 +955,0 @@ }

@@ -1,2 +0,2 @@

function _define_property$3(obj, key, value) {
function _define_property$4(obj, key, value) {
if (key in obj) {

@@ -24,5 +24,5 @@ Object.defineProperty(obj, key, {

var _obj;
var NameTransformMap = (_obj = {}, _define_property$3(_obj, NameTransformSymbol.AT, 'scope_'), _define_property$3(_obj, NameTransformSymbol.HYPHEN, '_'), _define_property$3(_obj, NameTransformSymbol.SLASH, '__'), _obj);
var NameTransformMap = (_obj = {}, _define_property$4(_obj, NameTransformSymbol.AT, 'scope_'), _define_property$4(_obj, NameTransformSymbol.HYPHEN, '_'), _define_property$4(_obj, NameTransformSymbol.SLASH, '__'), _obj);
var _obj1;
var EncodedNameTransformMap = (_obj1 = {}, _define_property$3(_obj1, NameTransformMap[NameTransformSymbol.AT], NameTransformSymbol.AT), _define_property$3(_obj1, NameTransformMap[NameTransformSymbol.HYPHEN], NameTransformSymbol.HYPHEN), _define_property$3(_obj1, NameTransformMap[NameTransformSymbol.SLASH], NameTransformSymbol.SLASH), _obj1);
var EncodedNameTransformMap = (_obj1 = {}, _define_property$4(_obj1, NameTransformMap[NameTransformSymbol.AT], NameTransformSymbol.AT), _define_property$4(_obj1, NameTransformMap[NameTransformSymbol.HYPHEN], NameTransformSymbol.HYPHEN), _define_property$4(_obj1, NameTransformMap[NameTransformSymbol.SLASH], NameTransformSymbol.SLASH), _obj1);
var SEPARATOR = ':';

@@ -93,3 +93,3 @@ var ManifestFileName = 'mf-manifest.json';

}
function _define_property$2(obj, key, value) {
function _define_property$3(obj, key, value) {
if (key in obj) {

@@ -145,4 +145,4 @@ Object.defineProperty(obj, key, {

_class_call_check(this, Logger);
_define_property$2(this, "enable", false);
_define_property$2(this, "identifier", void 0);
_define_property$3(this, "enable", false);
_define_property$3(this, "identifier", void 0);
this.identifier = identifier || DEBUG_LOG;

@@ -376,3 +376,3 @@ if (isBrowserEnv() && safeGetLocalStorageItem()) {

function _define_property$1(obj, key, value) {
function _define_property$2(obj, key, value) {
if (key in obj) {

@@ -390,3 +390,3 @@ Object.defineProperty(obj, key, {

}
function _object_spread$1(target) {
function _object_spread$2(target) {
for(var i = 1; i < arguments.length; i++){

@@ -401,3 +401,3 @@ var source = arguments[i] != null ? arguments[i] : {};

ownKeys.forEach(function(key) {
_define_property$1(target, key, source[key]);
_define_property$2(target, key, source[key]);
});

@@ -541,3 +541,3 @@ }

var prefetchInterface = manifest.metaData.prefetchInterface;
basicRemoteSnapshot = _object_spread_props(_object_spread$1({}, basicRemoteSnapshot), {
basicRemoteSnapshot = _object_spread_props(_object_spread$2({}, basicRemoteSnapshot), {
prefetchInterface: prefetchInterface

@@ -548,3 +548,3 @@ });

var _manifest_metaData_prefetchEntry = manifest.metaData.prefetchEntry, path = _manifest_metaData_prefetchEntry.path, name = _manifest_metaData_prefetchEntry.name, type = _manifest_metaData_prefetchEntry.type;
basicRemoteSnapshot = _object_spread_props(_object_spread$1({}, basicRemoteSnapshot), {
basicRemoteSnapshot = _object_spread_props(_object_spread$2({}, basicRemoteSnapshot), {
prefetchEntry: simpleJoinRemoteEntry(path, name),

@@ -555,7 +555,7 @@ prefetchEntryType: type

if ('publicPath' in manifest.metaData) {
remoteSnapshot = _object_spread_props(_object_spread$1({}, basicRemoteSnapshot), {
remoteSnapshot = _object_spread_props(_object_spread$2({}, basicRemoteSnapshot), {
publicPath: getPublicPath()
});
} else {
remoteSnapshot = _object_spread_props(_object_spread$1({}, basicRemoteSnapshot), {
remoteSnapshot = _object_spread_props(_object_spread$2({}, basicRemoteSnapshot), {
getPublicPath: getPublicPath()

@@ -603,2 +603,15 @@ });

}
function _define_property$1(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _instanceof(left, right) {

@@ -611,2 +624,17 @@ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {

}
function _object_spread$1(target) {
for(var i = 1; i < arguments.length; i++){
var source = arguments[i] != null ? arguments[i] : {};
var ownKeys = Object.keys(source);
if (typeof Object.getOwnPropertySymbols === "function") {
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
}));
}
ownKeys.forEach(function(key) {
_define_property$1(target, key, source[key]);
});
}
return target;
}
function _ts_generator$1(thisArg, body) {

@@ -756,3 +784,3 @@ var f, y, t, g, _ = {

}
function createScript(url, cb, attrs, createScriptHook) {
function createScript(info) {
// Retrieve the existing script element by its src attribute

@@ -767,3 +795,3 @@ var script = null;

var scriptSrc = s.getAttribute('src');
if (scriptSrc && isStaticResourcesEqual(scriptSrc, url)) {
if (scriptSrc && isStaticResourcesEqual(scriptSrc, info.url)) {
script = s;

@@ -777,5 +805,5 @@ needAttach = false;

script.type = 'text/javascript';
script.src = url;
if (createScriptHook) {
var createScriptRes = createScriptHook(url);
script.src = info.url;
if (info.createScriptHook) {
var createScriptRes = info.createScriptHook(info.url);
if (_instanceof(createScriptRes, HTMLScriptElement)) {

@@ -788,16 +816,18 @@ script = createScriptRes;

}
}
if (attrs) {
Object.keys(attrs).forEach(function(name) {
if (script) {
if (name === 'async' || name === 'defer') {
script[name] = attrs[name];
} else {
script.setAttribute(name, attrs[name]);
var attrs = info.attrs;
if (attrs) {
Object.keys(attrs).forEach(function(name) {
if (script) {
if (name === 'async' || name === 'defer') {
script[name] = attrs[name];
} else {
script.setAttribute(name, attrs[name]);
}
}
}
});
});
}
}
var onScriptComplete = function(prev, // eslint-disable-next-line @typescript-eslint/no-explicit-any
event) {
var _info_cb;
clearTimeout(timeoutId);

@@ -809,12 +839,16 @@ // Prevent memory leaks in IE.

safeWrapper(function() {
(script === null || script === void 0 ? void 0 : script.parentNode) && script.parentNode.removeChild(script);
var _info_needDeleteScript = info.needDeleteScript, needDeleteScript = _info_needDeleteScript === void 0 ? true : _info_needDeleteScript;
if (needDeleteScript) {
(script === null || script === void 0 ? void 0 : script.parentNode) && script.parentNode.removeChild(script);
}
});
if (prev) {
var _info_cb1;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
var res = prev(event);
cb();
info === null || info === void 0 ? void 0 : (_info_cb1 = info.cb) === null || _info_cb1 === void 0 ? void 0 : _info_cb1.call(info);
return res;
}
}
cb();
info === null || info === void 0 ? void 0 : (_info_cb = info.cb) === null || _info_cb === void 0 ? void 0 : _info_cb.call(info);
};

@@ -824,3 +858,3 @@ script.onerror = onScriptComplete.bind(null, script.onerror);

timeoutId = setTimeout(function() {
onScriptComplete(null, new Error('Remote script "'.concat(url, '" time-outed.')));
onScriptComplete(null, new Error('Remote script "'.concat(info.url, '" time-outed.')));
}, timeout);

@@ -832,4 +866,3 @@ return {

}
function createLink(url, cb) {
var attrs = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}, createLinkHook = arguments.length > 3 ? arguments[3] : void 0;
function createLink(info) {
// <link rel="preload" href="script.js" as="script">

@@ -844,3 +877,3 @@ // Retrieve the existing script element by its src attribute

var linkRef = l.getAttribute('ref');
if (linkHref && isStaticResourcesEqual(linkHref, url) && linkRef === attrs['ref']) {
if (linkHref && isStaticResourcesEqual(linkHref, info.url) && linkRef === info.attrs['ref']) {
link = l;

@@ -853,6 +886,5 @@ needAttach = false;

link = document.createElement('link');
link.setAttribute('href', url);
link.setAttribute('crossorigin', 'anonymous');
if (createLinkHook) {
var createLinkRes = createLinkHook(url);
link.setAttribute('href', info.url);
if (info.createLinkHook) {
var createLinkRes = info.createLinkHook(info.url);
if (_instanceof(createLinkRes, HTMLLinkElement)) {

@@ -862,10 +894,11 @@ link = createLinkRes;

}
var attrs = info.attrs;
if (attrs) {
Object.keys(attrs).forEach(function(name) {
if (link) {
link.setAttribute(name, attrs[name]);
}
});
}
}
if (attrs) {
Object.keys(attrs).forEach(function(name) {
if (link) {
link.setAttribute(name, attrs[name]);
}
});
}
var onLinkComplete = function(prev, // eslint-disable-next-line @typescript-eslint/no-explicit-any

@@ -878,3 +911,6 @@ event) {

safeWrapper(function() {
(link === null || link === void 0 ? void 0 : link.parentNode) && link.parentNode.removeChild(link);
var _info_needDeleteLink = info.needDeleteLink, needDeleteLink = _info_needDeleteLink === void 0 ? true : _info_needDeleteLink;
if (needDeleteLink) {
(link === null || link === void 0 ? void 0 : link.parentNode) && link.parentNode.removeChild(link);
}
});

@@ -884,7 +920,7 @@ if (prev) {

var res = prev(event);
cb();
info.cb();
return res;
}
}
cb();
info.cb();
};

@@ -899,6 +935,15 @@ link.onerror = onLinkComplete.bind(null, link.onerror);

function loadScript(url, info) {
var attrs = info.attrs, createScriptHook = info.createScriptHook;
var _info_attrs = info.attrs, attrs = _info_attrs === void 0 ? {} : _info_attrs, createScriptHook = info.createScriptHook;
return new Promise(function(resolve, _reject) {
var _createScript = createScript(url, resolve, attrs, createScriptHook), script = _createScript.script, needAttach = _createScript.needAttach;
needAttach && document.getElementsByTagName('head')[0].appendChild(script);
var _createScript = createScript({
url: url,
cb: resolve,
attrs: _object_spread$1({
crossorigin: 'anonymous',
fetchpriority: 'high'
}, attrs),
createScriptHook: createScriptHook,
needDeleteScript: true
}), script = _createScript.script, needAttach = _createScript.needAttach;
needAttach && document.head.appendChild(script);
});

@@ -905,0 +950,0 @@ }

{
"name": "@module-federation/sdk",
"version": "0.1.18",
"version": "0.1.19",
"license": "MIT",

@@ -5,0 +5,0 @@ "description": "A sdk for support module federation",

@@ -7,7 +7,19 @@ export declare function safeWrapper<T extends (...args: Array<any>) => any>(callback: T, disableWarn?: boolean): Promise<ReturnType<T> | undefined>;

} | void;
export declare function createScript(url: string, cb: (value: void | PromiseLike<void>) => void, attrs?: Record<string, any>, createScriptHook?: (url: string) => CreateScriptHookReturn): {
export declare function createScript(info: {
url: string;
cb?: (value: void | PromiseLike<void>) => void;
attrs?: Record<string, any>;
needDeleteScript?: boolean;
createScriptHook?: (url: string) => CreateScriptHookReturn;
}): {
script: HTMLScriptElement;
needAttach: boolean;
};
export declare function createLink(url: string, cb: (value: void | PromiseLike<void>) => void, attrs?: Record<string, string>, createLinkHook?: (url: string) => HTMLLinkElement | void): {
export declare function createLink(info: {
url: string;
cb: (value: void | PromiseLike<void>) => void;
attrs: Record<string, string>;
needDeleteLink?: boolean;
createLinkHook?: (url: string) => HTMLLinkElement | void;
}): {
link: HTMLLinkElement;

@@ -14,0 +26,0 @@ needAttach: boolean;

{
"name": "@module-federation/sdk",
"version": "0.1.18",
"version": "0.1.19",
"license": "MIT",

@@ -5,0 +5,0 @@ "description": "A sdk for support module federation",