@module-federation/enhanced
Version:
This package provides enhanced features for module federation.
62 lines (60 loc) • 2.46 kB
JavaScript
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
const require_runtime = require('../../_virtual/_rolldown/runtime.js');
//#region src/lib/container/options.ts
/** @template T @typedef {(string | Record<string, string | string[] | T>)[] | Record<string, string | string[] | T>} ContainerOptionsFormat */
/**
* @template T
* @template N
* @param {ContainerOptionsFormat<T>} options options passed by the user
* @param {function(string | string[], string) : N} normalizeSimple normalize a simple item
* @param {function(T, string) : N} normalizeOptions normalize a complex item
* @param {function(string, N): void} fn processing function
* @returns {void}
*/
const process = (options, normalizeSimple, normalizeOptions, fn) => {
const array = (items) => {
for (const item of items) if (typeof item === "string") fn(item, normalizeSimple(item, item));
else if (item && typeof item === "object") object(item);
else throw new Error("Unexpected options format");
};
const object = (obj) => {
for (const [key, value] of Object.entries(obj)) if (typeof value === "string" || Array.isArray(value)) fn(key, normalizeSimple(value, key));
else fn(key, normalizeOptions(value, key));
};
if (!options) return;
else if (Array.isArray(options)) array(options);
else if (typeof options === "object") object(options);
else throw new Error("Unexpected options format");
};
/**
* @template T
* @template R
* @param {ContainerOptionsFormat<T>} options options passed by the user
* @param {function(string | string[], string) : R} normalizeSimple normalize a simple item
* @param {function(T, string) : R} normalizeOptions normalize a complex item
* @returns {[string, R][]} parsed options
*/
function parseOptions(options, normalizeSimple, normalizeOptions) {
const items = [];
process(options, normalizeSimple, normalizeOptions, (key, value) => {
items.push([key, value]);
});
return items;
}
/**
* @template T
* @param {string} scope scope name
* @param {ContainerOptionsFormat<T>} options options passed by the user
* @returns {Record<string, string | string[] | T>} options to spread or pass
*/
function scope(scope, options) {
const obj = {};
process(options, (item) => item, (item) => item, (key, value) => {
obj[key.startsWith("./") ? `${scope}${key.slice(1)}` : `${scope}/${key}`] = value;
});
return obj;
}
//#endregion
exports.parseOptions = parseOptions;
exports.scope = scope;
//# sourceMappingURL=options.js.map