@sbee/vite-federation 0.0.1 → 0.0.2

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.
package/dist/index.js CHANGED
@@ -265,8 +265,65 @@ var NAME_CHAR_REG = /* @__PURE__ */ new RegExp("[0-9a-zA-Z@_-]+");
265
265
  //#endregion
266
266
  //#region src/dev/expose-development.ts
267
267
  function devExposePlugin(options) {
268
- parsedOptions.devExpose = parseExposeOptions(options);
269
- return { name: "sbee:expose-development" };
268
+ const exposeOptions = parseExposeOptions(options);
269
+ if (!parsedOptions.devExpose.some((expose) => {
270
+ return expose[0] === exposeOptions[0]?.[0];
271
+ })) parsedOptions.devExpose = Array.prototype.concat(parsedOptions.devExpose, exposeOptions);
272
+ for (const item of exposeOptions) {
273
+ const exposeFilepath = normalizePath((0, path.resolve)(item[1].import));
274
+ EXPOSES_MAP.set(item[0], exposeFilepath);
275
+ EXPOSES_KEY_MAP.set(item[0], `__federation_expose_${removeNonRegLetter(item[0], NAME_CHAR_REG)}`);
276
+ }
277
+ return {
278
+ name: "sbee:expose-development",
279
+ configureServer(server) {
280
+ const remoteEntryPath = `/${options.filename}`;
281
+ const virtualEntry = `
282
+ const currentImports = {}
283
+ const exportSet = new Set(['Module', '__esModule', 'default', '_export_sfc']);
284
+ let moduleMap = {${exposeOptions.map(([name, config]) => {
285
+ return `"${name}":()=>{return __federation_import('${config.import.startsWith("./") ? "/" + config.import.slice(2) : "/" + config.import}').then(module =>Object.keys(module).every(item => exportSet.has(item)) ? () => module.default : () => module)}`;
286
+ }).join(",\n")}}
287
+ const seen = {}
288
+ export const ${DYNAMIC_LOADING_CSS} = (cssFilePaths, dontAppendStylesToHead, exposeItemName) => {
289
+ // In dev mode, Vite handles CSS via HMR – no manual link injection needed.
290
+ if (dontAppendStylesToHead) {
291
+ const key = 'css__${options.name}__' + exposeItemName;
292
+ window[key] = window[key] || [];
293
+ return;
294
+ }
295
+ };
296
+ async function __federation_import(name) {
297
+ currentImports[name] ??= import(/* @vite-ignore */ name)
298
+ return currentImports[name]
299
+ };
300
+ export const get =(module) => {
301
+ if(!moduleMap[module]) throw new Error('Can not find remote module ' + module)
302
+ return moduleMap[module]();
303
+ };
304
+ export const init =(shareScope) => {
305
+ globalThis.__federation_shared__= globalThis.__federation_shared__|| {};
306
+ Object.entries(shareScope).forEach(([key, value]) => {
307
+ for (const [versionKey, versionValue] of Object.entries(value)) {
308
+ const scope = versionValue.scope || 'default'
309
+ globalThis.__federation_shared__[scope] = globalThis.__federation_shared__[scope] || {};
310
+ const shared= globalThis.__federation_shared__[scope];
311
+ (shared[key] = shared[key]||{})[versionKey] = versionValue;
312
+ }
313
+ });
314
+ }
315
+ `;
316
+ server.middlewares.use((req, res, next) => {
317
+ if ((req.url || "").split("?")[0] === remoteEntryPath) {
318
+ res.setHeader("Content-Type", "application/javascript");
319
+ res.setHeader("Access-Control-Allow-Origin", "*");
320
+ res.end(virtualEntry);
321
+ return;
322
+ }
323
+ next();
324
+ });
325
+ }
326
+ };
270
327
  }
271
328
  //#endregion
272
329
  //#region src/dev/remote-development.ts
package/dist/index.mjs CHANGED
@@ -242,8 +242,65 @@ var NAME_CHAR_REG = /* @__PURE__ */ new RegExp("[0-9a-zA-Z@_-]+");
242
242
  //#endregion
243
243
  //#region src/dev/expose-development.ts
244
244
  function devExposePlugin(options) {
245
- parsedOptions.devExpose = parseExposeOptions(options);
246
- return { name: "sbee:expose-development" };
245
+ const exposeOptions = parseExposeOptions(options);
246
+ if (!parsedOptions.devExpose.some((expose) => {
247
+ return expose[0] === exposeOptions[0]?.[0];
248
+ })) parsedOptions.devExpose = Array.prototype.concat(parsedOptions.devExpose, exposeOptions);
249
+ for (const item of exposeOptions) {
250
+ const exposeFilepath = normalizePath(resolve(item[1].import));
251
+ EXPOSES_MAP.set(item[0], exposeFilepath);
252
+ EXPOSES_KEY_MAP.set(item[0], `__federation_expose_${removeNonRegLetter(item[0], NAME_CHAR_REG)}`);
253
+ }
254
+ return {
255
+ name: "sbee:expose-development",
256
+ configureServer(server) {
257
+ const remoteEntryPath = `/${options.filename}`;
258
+ const virtualEntry = `
259
+ const currentImports = {}
260
+ const exportSet = new Set(['Module', '__esModule', 'default', '_export_sfc']);
261
+ let moduleMap = {${exposeOptions.map(([name, config]) => {
262
+ return `"${name}":()=>{return __federation_import('${config.import.startsWith("./") ? "/" + config.import.slice(2) : "/" + config.import}').then(module =>Object.keys(module).every(item => exportSet.has(item)) ? () => module.default : () => module)}`;
263
+ }).join(",\n")}}
264
+ const seen = {}
265
+ export const ${DYNAMIC_LOADING_CSS} = (cssFilePaths, dontAppendStylesToHead, exposeItemName) => {
266
+ // In dev mode, Vite handles CSS via HMR – no manual link injection needed.
267
+ if (dontAppendStylesToHead) {
268
+ const key = 'css__${options.name}__' + exposeItemName;
269
+ window[key] = window[key] || [];
270
+ return;
271
+ }
272
+ };
273
+ async function __federation_import(name) {
274
+ currentImports[name] ??= import(/* @vite-ignore */ name)
275
+ return currentImports[name]
276
+ };
277
+ export const get =(module) => {
278
+ if(!moduleMap[module]) throw new Error('Can not find remote module ' + module)
279
+ return moduleMap[module]();
280
+ };
281
+ export const init =(shareScope) => {
282
+ globalThis.__federation_shared__= globalThis.__federation_shared__|| {};
283
+ Object.entries(shareScope).forEach(([key, value]) => {
284
+ for (const [versionKey, versionValue] of Object.entries(value)) {
285
+ const scope = versionValue.scope || 'default'
286
+ globalThis.__federation_shared__[scope] = globalThis.__federation_shared__[scope] || {};
287
+ const shared= globalThis.__federation_shared__[scope];
288
+ (shared[key] = shared[key]||{})[versionKey] = versionValue;
289
+ }
290
+ });
291
+ }
292
+ `;
293
+ server.middlewares.use((req, res, next) => {
294
+ if ((req.url || "").split("?")[0] === remoteEntryPath) {
295
+ res.setHeader("Content-Type", "application/javascript");
296
+ res.setHeader("Access-Control-Allow-Origin", "*");
297
+ res.end(virtualEntry);
298
+ return;
299
+ }
300
+ next();
301
+ });
302
+ }
303
+ };
247
304
  }
248
305
  //#endregion
249
306
  //#region src/dev/remote-development.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sbee/vite-federation",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "A Vite 8 plugin for Module Federation. Zero runtime dependencies, powered by Rolldown.",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",