every-plugin 2.10.1 → 3.0.0-rc.0
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/bin/every-plugin-serve.mjs +12 -0
- package/bin/every-plugin.mjs +59 -0
- package/dist/_virtual/_rolldown/runtime.cjs +1 -2
- package/dist/build/artifact-names.cjs +119 -0
- package/dist/build/artifact-names.cjs.map +1 -0
- package/dist/build/artifact-names.d.cts +68 -0
- package/dist/build/artifact-names.d.cts.map +1 -0
- package/dist/build/artifact-names.d.mts +68 -0
- package/dist/build/artifact-names.d.mts.map +1 -0
- package/dist/build/artifact-names.mjs +102 -0
- package/dist/build/artifact-names.mjs.map +1 -0
- package/dist/build/contract-types.cjs +89 -0
- package/dist/build/contract-types.cjs.map +1 -0
- package/dist/build/contract-types.mjs +81 -0
- package/dist/build/contract-types.mjs.map +1 -0
- package/dist/build/rspack/build-report-plugin.cjs +37 -0
- package/dist/build/rspack/build-report-plugin.cjs.map +1 -0
- package/dist/build/rspack/build-report-plugin.d.cts +18 -0
- package/dist/build/rspack/build-report-plugin.d.cts.map +1 -0
- package/dist/build/rspack/build-report-plugin.d.mts +18 -0
- package/dist/build/rspack/build-report-plugin.d.mts.map +1 -0
- package/dist/build/rspack/build-report-plugin.mjs +37 -0
- package/dist/build/rspack/build-report-plugin.mjs.map +1 -0
- package/dist/build/rspack/chunk-completeness-plugin.cjs +47 -0
- package/dist/build/rspack/chunk-completeness-plugin.cjs.map +1 -0
- package/dist/build/rspack/chunk-completeness-plugin.mjs +47 -0
- package/dist/build/rspack/chunk-completeness-plugin.mjs.map +1 -0
- package/dist/build/rspack/compose.cjs +69 -0
- package/dist/build/rspack/compose.cjs.map +1 -0
- package/dist/build/rspack/compose.d.cts +20 -0
- package/dist/build/rspack/compose.d.cts.map +1 -0
- package/dist/build/rspack/compose.d.mts +20 -0
- package/dist/build/rspack/compose.d.mts.map +1 -0
- package/dist/build/rspack/compose.mjs +65 -0
- package/dist/build/rspack/compose.mjs.map +1 -0
- package/dist/build/rspack/fix-mf-data-uri-plugin.cjs +11 -11
- package/dist/build/rspack/fix-mf-data-uri-plugin.cjs.map +1 -1
- package/dist/build/rspack/fix-mf-data-uri-plugin.d.cts +2 -0
- package/dist/build/rspack/fix-mf-data-uri-plugin.d.cts.map +1 -1
- package/dist/build/rspack/fix-mf-data-uri-plugin.d.mts +2 -0
- package/dist/build/rspack/fix-mf-data-uri-plugin.d.mts.map +1 -1
- package/dist/build/rspack/fix-mf-data-uri-plugin.mjs +11 -10
- package/dist/build/rspack/fix-mf-data-uri-plugin.mjs.map +1 -1
- package/dist/build/rspack/generated-config.cjs +35 -0
- package/dist/build/rspack/generated-config.cjs.map +1 -0
- package/dist/build/rspack/generated-config.mjs +32 -0
- package/dist/build/rspack/generated-config.mjs.map +1 -0
- package/dist/build/rspack/index.cjs +8 -5
- package/dist/build/rspack/index.d.cts +5 -3
- package/dist/build/rspack/index.d.mts +5 -3
- package/dist/build/rspack/index.mjs +5 -3
- package/dist/build/rspack/module-federation.cjs +2 -2
- package/dist/build/rspack/module-federation.cjs.map +1 -1
- package/dist/build/rspack/module-federation.mjs +1 -1
- package/dist/build/rspack/module-federation.mjs.map +1 -1
- package/dist/build/rspack/plugin.cjs +44 -69
- package/dist/build/rspack/plugin.cjs.map +1 -1
- package/dist/build/rspack/plugin.d.cts +4 -13
- package/dist/build/rspack/plugin.d.cts.map +1 -1
- package/dist/build/rspack/plugin.d.mts +4 -13
- package/dist/build/rspack/plugin.d.mts.map +1 -1
- package/dist/build/rspack/plugin.mjs +44 -69
- package/dist/build/rspack/plugin.mjs.map +1 -1
- package/dist/build/rspack/utils.cjs +7 -5
- package/dist/build/rspack/utils.cjs.map +1 -1
- package/dist/build/rspack/utils.mjs +7 -6
- package/dist/build/rspack/utils.mjs.map +1 -1
- package/dist/build/ui/factory.cjs +88 -0
- package/dist/build/ui/factory.cjs.map +1 -0
- package/dist/build/ui/factory.d.cts +11 -0
- package/dist/build/ui/factory.d.cts.map +1 -0
- package/dist/build/ui/factory.d.mts +11 -0
- package/dist/build/ui/factory.d.mts.map +1 -0
- package/dist/build/ui/factory.mjs +80 -0
- package/dist/build/ui/factory.mjs.map +1 -0
- package/dist/build/ui/generated-config.cjs +118 -0
- package/dist/build/ui/generated-config.cjs.map +1 -0
- package/dist/build/ui/generated-config.d.cts +33 -0
- package/dist/build/ui/generated-config.d.cts.map +1 -0
- package/dist/build/ui/generated-config.d.mts +33 -0
- package/dist/build/ui/generated-config.d.mts.map +1 -0
- package/dist/build/ui/generated-config.mjs +111 -0
- package/dist/build/ui/generated-config.mjs.map +1 -0
- package/dist/build/ui/hash-artifacts-plugin.cjs +61 -0
- package/dist/build/ui/hash-artifacts-plugin.cjs.map +1 -0
- package/dist/build/ui/hash-artifacts-plugin.d.cts +20 -0
- package/dist/build/ui/hash-artifacts-plugin.d.cts.map +1 -0
- package/dist/build/ui/hash-artifacts-plugin.d.mts +20 -0
- package/dist/build/ui/hash-artifacts-plugin.d.mts.map +1 -0
- package/dist/build/ui/hash-artifacts-plugin.mjs +58 -0
- package/dist/build/ui/hash-artifacts-plugin.mjs.map +1 -0
- package/dist/build/ui/index.cjs +90 -0
- package/dist/build/ui/index.cjs.map +1 -0
- package/dist/build/ui/index.d.cts +29 -0
- package/dist/build/ui/index.d.cts.map +1 -0
- package/dist/build/ui/index.d.mts +29 -0
- package/dist/build/ui/index.d.mts.map +1 -0
- package/dist/build/ui/index.mjs +68 -0
- package/dist/build/ui/index.mjs.map +1 -0
- package/dist/build/ui/manifest-plugin.cjs +37 -0
- package/dist/build/ui/manifest-plugin.cjs.map +1 -0
- package/dist/build/ui/manifest-plugin.d.cts +19 -0
- package/dist/build/ui/manifest-plugin.d.cts.map +1 -0
- package/dist/build/ui/manifest-plugin.d.mts +19 -0
- package/dist/build/ui/manifest-plugin.d.mts.map +1 -0
- package/dist/build/ui/manifest-plugin.mjs +37 -0
- package/dist/build/ui/manifest-plugin.mjs.map +1 -0
- package/dist/build/ui/rsbuild-config.cjs +203 -0
- package/dist/build/ui/rsbuild-config.cjs.map +1 -0
- package/dist/build/ui/rsbuild-config.d.cts +45 -0
- package/dist/build/ui/rsbuild-config.d.cts.map +1 -0
- package/dist/build/ui/rsbuild-config.d.mts +45 -0
- package/dist/build/ui/rsbuild-config.d.mts.map +1 -0
- package/dist/build/ui/rsbuild-config.mjs +200 -0
- package/dist/build/ui/rsbuild-config.mjs.map +1 -0
- package/dist/build/ui/stubs.cjs +107 -0
- package/dist/build/ui/stubs.cjs.map +1 -0
- package/dist/build/ui/stubs.d.cts +25 -0
- package/dist/build/ui/stubs.d.cts.map +1 -0
- package/dist/build/ui/stubs.d.mts +25 -0
- package/dist/build/ui/stubs.d.mts.map +1 -0
- package/dist/build/ui/stubs.mjs +106 -0
- package/dist/build/ui/stubs.mjs.map +1 -0
- package/dist/cli.cjs +83 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.cts +6 -0
- package/dist/cli.d.cts.map +1 -0
- package/dist/cli.d.mts +6 -0
- package/dist/cli.d.mts.map +1 -0
- package/dist/cli.mjs +82 -0
- package/dist/cli.mjs.map +1 -0
- package/dist/dev/serve.cjs +390 -0
- package/dist/dev/serve.cjs.map +1 -0
- package/dist/dev/serve.d.cts +23 -0
- package/dist/dev/serve.d.cts.map +1 -0
- package/dist/dev/serve.d.mts +23 -0
- package/dist/dev/serve.d.mts.map +1 -0
- package/dist/dev/serve.mjs +384 -0
- package/dist/dev/serve.mjs.map +1 -0
- package/dist/dev/watch-kill.cjs +39 -0
- package/dist/dev/watch-kill.cjs.map +1 -0
- package/dist/dev/watch-kill.mjs +38 -0
- package/dist/dev/watch-kill.mjs.map +1 -0
- package/dist/effect-helpers.cjs +23 -0
- package/dist/effect-helpers.cjs.map +1 -0
- package/dist/effect-helpers.d.cts +20 -0
- package/dist/effect-helpers.d.cts.map +1 -0
- package/dist/effect-helpers.d.mts +20 -0
- package/dist/effect-helpers.d.mts.map +1 -0
- package/dist/effect-helpers.mjs +22 -0
- package/dist/effect-helpers.mjs.map +1 -0
- package/dist/errors.cjs +49 -69
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.d.cts +13 -96
- package/dist/errors.d.cts.map +1 -1
- package/dist/errors.d.mts +13 -96
- package/dist/errors.d.mts.map +1 -1
- package/dist/errors.mjs +16 -34
- package/dist/errors.mjs.map +1 -1
- package/dist/identity.cjs +19 -0
- package/dist/identity.cjs.map +1 -0
- package/dist/identity.d.cts +33 -0
- package/dist/identity.d.cts.map +1 -0
- package/dist/identity.d.mts +33 -0
- package/dist/identity.d.mts.map +1 -0
- package/dist/identity.mjs +16 -0
- package/dist/identity.mjs.map +1 -0
- package/dist/index.cjs +8 -5
- package/dist/index.d.cts +8 -6
- package/dist/index.d.mts +8 -6
- package/dist/index.mjs +6 -4
- package/dist/plugin.cjs +12 -26
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.cts +44 -25
- package/dist/plugin.d.cts.map +1 -1
- package/dist/plugin.d.mts +45 -26
- package/dist/plugin.d.mts.map +1 -1
- package/dist/plugin.mjs +15 -29
- package/dist/plugin.mjs.map +1 -1
- package/dist/remote-entry.cjs +103 -0
- package/dist/remote-entry.cjs.map +1 -0
- package/dist/remote-entry.d.cts +53 -0
- package/dist/remote-entry.d.cts.map +1 -0
- package/dist/remote-entry.d.mts +53 -0
- package/dist/remote-entry.d.mts.map +1 -0
- package/dist/remote-entry.mjs +98 -0
- package/dist/remote-entry.mjs.map +1 -0
- package/dist/runtime/errors.cjs +140 -34
- package/dist/runtime/errors.cjs.map +1 -1
- package/dist/runtime/errors.d.cts +42 -7
- package/dist/runtime/errors.d.cts.map +1 -1
- package/dist/runtime/errors.d.mts +42 -7
- package/dist/runtime/errors.d.mts.map +1 -1
- package/dist/runtime/errors.mjs +136 -31
- package/dist/runtime/errors.mjs.map +1 -1
- package/dist/runtime/index.cjs +95 -23
- package/dist/runtime/index.cjs.map +1 -1
- package/dist/runtime/index.d.cts +16 -0
- package/dist/runtime/index.d.cts.map +1 -1
- package/dist/runtime/index.d.mts +16 -0
- package/dist/runtime/index.d.mts.map +1 -1
- package/dist/runtime/index.mjs +98 -26
- package/dist/runtime/index.mjs.map +1 -1
- package/dist/runtime/mf-config.cjs +3 -78
- package/dist/runtime/mf-config.cjs.map +1 -1
- package/dist/runtime/mf-config.d.cts +3 -49
- package/dist/runtime/mf-config.d.cts.map +1 -1
- package/dist/runtime/mf-config.d.mts +3 -49
- package/dist/runtime/mf-config.d.mts.map +1 -1
- package/dist/runtime/mf-config.mjs +5 -78
- package/dist/runtime/mf-config.mjs.map +1 -1
- package/dist/runtime/services/module-federation.service.cjs +63 -12
- package/dist/runtime/services/module-federation.service.cjs.map +1 -1
- package/dist/runtime/services/module-federation.service.d.cts +4 -13
- package/dist/runtime/services/module-federation.service.d.mts +4 -13
- package/dist/runtime/services/module-federation.service.mjs +63 -14
- package/dist/runtime/services/module-federation.service.mjs.map +1 -1
- package/dist/runtime/services/normalize.cjs +2 -22
- package/dist/runtime/services/normalize.d.cts +2 -21
- package/dist/runtime/services/normalize.d.mts +2 -21
- package/dist/runtime/services/normalize.mjs +2 -21
- package/dist/runtime/services/plugin-lifecycle.service.cjs +9 -11
- package/dist/runtime/services/plugin-lifecycle.service.cjs.map +1 -1
- package/dist/runtime/services/plugin-lifecycle.service.d.cts +3 -16
- package/dist/runtime/services/plugin-lifecycle.service.d.mts +3 -16
- package/dist/runtime/services/plugin-lifecycle.service.mjs +10 -13
- package/dist/runtime/services/plugin-lifecycle.service.mjs.map +1 -1
- package/dist/runtime/services/plugin-loader.service.cjs +30 -29
- package/dist/runtime/services/plugin-loader.service.cjs.map +1 -1
- package/dist/runtime/services/plugin-loader.service.d.cts +6 -53
- package/dist/runtime/services/plugin-loader.service.d.mts +6 -53
- package/dist/runtime/services/plugin-loader.service.mjs +29 -30
- package/dist/runtime/services/plugin-loader.service.mjs.map +1 -1
- package/dist/runtime/services/plugin.service.cjs +10 -12
- package/dist/runtime/services/plugin.service.cjs.map +1 -1
- package/dist/runtime/services/plugin.service.d.cts +14 -36
- package/dist/runtime/services/plugin.service.d.cts.map +1 -1
- package/dist/runtime/services/plugin.service.d.mts +14 -36
- package/dist/runtime/services/plugin.service.d.mts.map +1 -1
- package/dist/runtime/services/plugin.service.mjs +14 -18
- package/dist/runtime/services/plugin.service.mjs.map +1 -1
- package/dist/runtime/services/secrets.service.cjs +12 -12
- package/dist/runtime/services/secrets.service.cjs.map +1 -1
- package/dist/runtime/services/secrets.service.d.cts +3 -15
- package/dist/runtime/services/secrets.service.d.mts +3 -15
- package/dist/runtime/services/secrets.service.mjs +12 -13
- package/dist/runtime/services/secrets.service.mjs.map +1 -1
- package/dist/runtime/services/shared-identity.cjs +40 -0
- package/dist/runtime/services/shared-identity.cjs.map +1 -0
- package/dist/runtime/services/shared-identity.mjs +38 -0
- package/dist/runtime/services/shared-identity.mjs.map +1 -0
- package/dist/runtime/validation.cjs +2 -2
- package/dist/runtime/validation.cjs.map +1 -1
- package/dist/runtime/validation.mjs +2 -2
- package/dist/runtime/validation.mjs.map +1 -1
- package/dist/shared-deps-spec.cjs +384 -0
- package/dist/shared-deps-spec.cjs.map +1 -0
- package/dist/shared-deps-spec.d.cts +182 -0
- package/dist/shared-deps-spec.d.cts.map +1 -0
- package/dist/shared-deps-spec.d.mts +182 -0
- package/dist/shared-deps-spec.d.mts.map +1 -0
- package/dist/shared-deps-spec.mjs +368 -0
- package/dist/shared-deps-spec.mjs.map +1 -0
- package/dist/types.d.cts +22 -41
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +22 -41
- package/dist/types.d.mts.map +1 -1
- package/dist/ui/manifest/construct.cjs +268 -0
- package/dist/ui/manifest/construct.cjs.map +1 -0
- package/dist/ui/manifest/construct.d.cts +48 -0
- package/dist/ui/manifest/construct.d.cts.map +1 -0
- package/dist/ui/manifest/construct.d.mts +48 -0
- package/dist/ui/manifest/construct.d.mts.map +1 -0
- package/dist/ui/manifest/construct.mjs +268 -0
- package/dist/ui/manifest/construct.mjs.map +1 -0
- package/dist/ui/manifest/contract.cjs +34 -0
- package/dist/ui/manifest/contract.cjs.map +1 -0
- package/dist/ui/manifest/contract.d.cts +26 -0
- package/dist/ui/manifest/contract.d.cts.map +1 -0
- package/dist/ui/manifest/contract.d.mts +26 -0
- package/dist/ui/manifest/contract.d.mts.map +1 -0
- package/dist/ui/manifest/contract.mjs +26 -0
- package/dist/ui/manifest/contract.mjs.map +1 -0
- package/dist/ui/manifest/descriptor.cjs +64 -0
- package/dist/ui/manifest/descriptor.cjs.map +1 -0
- package/dist/ui/manifest/descriptor.d.cts +60 -0
- package/dist/ui/manifest/descriptor.d.cts.map +1 -0
- package/dist/ui/manifest/descriptor.d.mts +60 -0
- package/dist/ui/manifest/descriptor.d.mts.map +1 -0
- package/dist/ui/manifest/descriptor.mjs +61 -0
- package/dist/ui/manifest/descriptor.mjs.map +1 -0
- package/dist/ui/manifest/generator.cjs +128 -0
- package/dist/ui/manifest/generator.cjs.map +1 -0
- package/dist/ui/manifest/generator.d.cts +41 -0
- package/dist/ui/manifest/generator.d.cts.map +1 -0
- package/dist/ui/manifest/generator.d.mts +41 -0
- package/dist/ui/manifest/generator.d.mts.map +1 -0
- package/dist/ui/manifest/generator.mjs +125 -0
- package/dist/ui/manifest/generator.mjs.map +1 -0
- package/dist/ui/manifest/index.cjs +35 -0
- package/dist/ui/manifest/index.d.cts +9 -0
- package/dist/ui/manifest/index.d.mts +9 -0
- package/dist/ui/manifest/index.mjs +9 -0
- package/dist/ui/manifest/manifest-schema.cjs +97 -0
- package/dist/ui/manifest/manifest-schema.cjs.map +1 -0
- package/dist/ui/manifest/manifest-schema.d.cts +132 -0
- package/dist/ui/manifest/manifest-schema.d.cts.map +1 -0
- package/dist/ui/manifest/manifest-schema.d.mts +132 -0
- package/dist/ui/manifest/manifest-schema.d.mts.map +1 -0
- package/dist/ui/manifest/manifest-schema.mjs +90 -0
- package/dist/ui/manifest/manifest-schema.mjs.map +1 -0
- package/dist/ui/manifest/mount-registry.cjs +52 -0
- package/dist/ui/manifest/mount-registry.cjs.map +1 -0
- package/dist/ui/manifest/mount-registry.d.cts +61 -0
- package/dist/ui/manifest/mount-registry.d.cts.map +1 -0
- package/dist/ui/manifest/mount-registry.d.mts +61 -0
- package/dist/ui/manifest/mount-registry.d.mts.map +1 -0
- package/dist/ui/manifest/mount-registry.mjs +48 -0
- package/dist/ui/manifest/mount-registry.mjs.map +1 -0
- package/dist/ui/manifest/nav.cjs +13 -0
- package/dist/ui/manifest/nav.cjs.map +1 -0
- package/dist/ui/manifest/nav.d.cts +34 -0
- package/dist/ui/manifest/nav.d.cts.map +1 -0
- package/dist/ui/manifest/nav.d.mts +34 -0
- package/dist/ui/manifest/nav.d.mts.map +1 -0
- package/dist/ui/manifest/nav.mjs +13 -0
- package/dist/ui/manifest/nav.mjs.map +1 -0
- package/dist/ui/manifest/route-config.cjs +33 -0
- package/dist/ui/manifest/route-config.cjs.map +1 -0
- package/dist/ui/manifest/route-config.d.cts +40 -0
- package/dist/ui/manifest/route-config.d.cts.map +1 -0
- package/dist/ui/manifest/route-config.d.mts +40 -0
- package/dist/ui/manifest/route-config.d.mts.map +1 -0
- package/dist/ui/manifest/route-config.mjs +33 -0
- package/dist/ui/manifest/route-config.mjs.map +1 -0
- package/dist/version-manifest.cjs +65 -0
- package/dist/version-manifest.cjs.map +1 -0
- package/dist/version-manifest.d.cts +52 -0
- package/dist/version-manifest.d.cts.map +1 -0
- package/dist/version-manifest.d.mts +52 -0
- package/dist/version-manifest.d.mts.map +1 -0
- package/dist/version-manifest.mjs +63 -0
- package/dist/version-manifest.mjs.map +1 -0
- package/package.json +165 -68
- package/skills/plugin-client/SKILL.md +24 -5
- package/skills/plugin-development/SKILL.md +79 -47
- package/skills/plugin-testing/SKILL.md +41 -12
- package/src/build/artifact-names.ts +117 -0
- package/src/build/contract-types.ts +101 -0
- package/src/build/rspack/build-report-plugin.ts +34 -0
- package/src/build/rspack/chunk-completeness-plugin.ts +57 -0
- package/src/build/rspack/compose.ts +87 -0
- package/src/build/rspack/fix-mf-data-uri-plugin.ts +23 -12
- package/src/build/rspack/generated-config.ts +35 -0
- package/src/build/rspack/index.ts +10 -5
- package/src/build/rspack/module-federation.ts +1 -1
- package/src/build/rspack/plugin.ts +103 -105
- package/src/build/rspack/utils.ts +8 -2
- package/src/build/ui/factory.ts +96 -0
- package/src/build/ui/generated-config.ts +133 -0
- package/src/build/ui/hash-artifacts-plugin.ts +79 -0
- package/src/build/ui/index.ts +98 -0
- package/src/build/ui/manifest-plugin.ts +54 -0
- package/src/build/ui/rsbuild-config.ts +256 -0
- package/src/build/ui/stubs.ts +103 -0
- package/src/cli.ts +100 -0
- package/src/dev/serve.ts +477 -0
- package/src/dev/watch-kill.ts +58 -0
- package/src/effect-helpers.ts +25 -0
- package/src/errors.ts +16 -18
- package/src/identity.ts +36 -0
- package/src/index.ts +4 -0
- package/src/plugin.ts +70 -92
- package/src/remote-entry.ts +171 -0
- package/src/runtime/errors.ts +186 -27
- package/src/runtime/index.ts +132 -43
- package/src/runtime/mf-config.ts +12 -107
- package/src/runtime/services/module-federation.service.ts +221 -117
- package/src/runtime/services/normalize.ts +1 -18
- package/src/runtime/services/plugin-lifecycle.service.ts +66 -75
- package/src/runtime/services/plugin-loader.service.ts +239 -212
- package/src/runtime/services/plugin.service.ts +61 -43
- package/src/runtime/services/secrets.service.ts +20 -15
- package/src/runtime/services/shared-identity.ts +68 -0
- package/src/runtime/validation.ts +5 -7
- package/src/shared-deps-spec.ts +478 -0
- package/src/types.ts +22 -48
- package/src/ui/manifest/construct.ts +403 -0
- package/src/ui/manifest/contract.ts +33 -0
- package/src/ui/manifest/descriptor.ts +96 -0
- package/src/ui/manifest/generator.ts +238 -0
- package/src/ui/manifest/index.ts +55 -0
- package/src/ui/manifest/manifest-schema.ts +107 -0
- package/src/ui/manifest/mount-registry.ts +50 -0
- package/src/ui/manifest/nav.ts +43 -0
- package/src/ui/manifest/route-config.ts +82 -0
- package/src/version-manifest.ts +88 -0
- package/dist/build/rspack/dev-server-middleware.cjs +0 -248
- package/dist/build/rspack/dev-server-middleware.cjs.map +0 -1
- package/dist/build/rspack/dev-server-middleware.mjs +0 -247
- package/dist/build/rspack/dev-server-middleware.mjs.map +0 -1
- package/dist/build/shared-deps.cjs +0 -83
- package/dist/build/shared-deps.cjs.map +0 -1
- package/dist/build/shared-deps.d.cts +0 -67
- package/dist/build/shared-deps.d.cts.map +0 -1
- package/dist/build/shared-deps.d.mts +0 -67
- package/dist/build/shared-deps.d.mts.map +0 -1
- package/dist/build/shared-deps.mjs +0 -79
- package/dist/build/shared-deps.mjs.map +0 -1
- package/dist/effect.cjs +0 -9
- package/dist/effect.d.cts +0 -1
- package/dist/effect.d.mts +0 -1
- package/dist/effect.mjs +0 -3
- package/dist/orpc-openapi.cjs +0 -17
- package/dist/orpc-openapi.d.cts +0 -2
- package/dist/orpc-openapi.d.mts +0 -2
- package/dist/orpc-openapi.mjs +0 -5
- package/dist/orpc.cjs +0 -46
- package/dist/orpc.d.cts +0 -7
- package/dist/orpc.d.mts +0 -7
- package/dist/orpc.mjs +0 -11
- package/dist/package.cjs +0 -23
- package/dist/package.cjs.map +0 -1
- package/dist/package.mjs +0 -17
- package/dist/package.mjs.map +0 -1
- package/dist/runtime/services/module-federation.service.d.cts.map +0 -1
- package/dist/runtime/services/module-federation.service.d.mts.map +0 -1
- package/dist/runtime/services/normalize.cjs.map +0 -1
- package/dist/runtime/services/normalize.d.cts.map +0 -1
- package/dist/runtime/services/normalize.d.mts.map +0 -1
- package/dist/runtime/services/normalize.mjs.map +0 -1
- package/dist/runtime/services/plugin-lifecycle.service.d.cts.map +0 -1
- package/dist/runtime/services/plugin-lifecycle.service.d.mts.map +0 -1
- package/dist/runtime/services/plugin-loader.service.d.cts.map +0 -1
- package/dist/runtime/services/plugin-loader.service.d.mts.map +0 -1
- package/dist/runtime/services/secrets.service.d.cts.map +0 -1
- package/dist/runtime/services/secrets.service.d.mts.map +0 -1
- package/dist/testing/index.cjs +0 -57
- package/dist/testing/index.cjs.map +0 -1
- package/dist/testing/index.d.cts +0 -54
- package/dist/testing/index.d.cts.map +0 -1
- package/dist/testing/index.d.mts +0 -54
- package/dist/testing/index.d.mts.map +0 -1
- package/dist/testing/index.mjs +0 -55
- package/dist/testing/index.mjs.map +0 -1
- package/dist/zod-core.cjs +0 -9
- package/dist/zod-core.d.cts +0 -1
- package/dist/zod-core.d.mts +0 -1
- package/dist/zod-core.mjs +0 -3
- package/dist/zod.cjs +0 -11
- package/dist/zod.d.cts +0 -2
- package/dist/zod.d.mts +0 -2
- package/dist/zod.mjs +0 -3
- package/src/build/rspack/dev-server-middleware.ts +0 -324
- package/src/build/shared-deps.ts +0 -102
- package/src/effect.ts +0 -1
- package/src/orpc-openapi.ts +0 -2
- package/src/orpc.ts +0 -9
- package/src/testing/index.ts +0 -87
- package/src/testing/mocks/module-federation.service.ts +0 -41
- package/src/zod-core.ts +0 -1
- package/src/zod.ts +0 -3
|
@@ -1,83 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
4
|
-
import { dirname, join } from "node:path";
|
|
1
|
+
import { buildMfCoreSharedDependencies } from "../shared-deps-spec.mjs";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
5
3
|
|
|
6
4
|
//#region src/runtime/mf-config.ts
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
try {
|
|
10
|
-
let currentDir = dirname(require.resolve(packageName));
|
|
11
|
-
for (let i = 0; i < 5; i += 1) {
|
|
12
|
-
const packageJsonPath = join(currentDir, "package.json");
|
|
13
|
-
if (existsSync(packageJsonPath)) return JSON.parse(readFileSync(packageJsonPath, "utf-8")).version;
|
|
14
|
-
currentDir = dirname(currentDir);
|
|
15
|
-
}
|
|
16
|
-
throw new Error(`Could not resolve installed version for ${packageName}`);
|
|
17
|
-
} catch {
|
|
18
|
-
const match = fallbackRange.match(/\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?/);
|
|
19
|
-
return match ? match[0] : fallbackRange.replace(/^[\^~>=<\s]+/, "");
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
const PLUGIN_VERSION = "2.10.1";
|
|
23
|
-
const SHARE_CONFIG = {
|
|
24
|
-
singleton: true,
|
|
25
|
-
requiredVersion: false,
|
|
26
|
-
strictVersion: false,
|
|
27
|
-
eager: false
|
|
28
|
-
};
|
|
29
|
-
const MF_CORE_SHARED_DEPS = {
|
|
30
|
-
"every-plugin": {
|
|
31
|
-
version: PLUGIN_VERSION,
|
|
32
|
-
shareScope: "default",
|
|
33
|
-
shareConfig: SHARE_CONFIG
|
|
34
|
-
},
|
|
35
|
-
effect: {
|
|
36
|
-
version: getInstalledPackageVersion("effect", peerDependencies.effect),
|
|
37
|
-
shareScope: "default",
|
|
38
|
-
shareConfig: SHARE_CONFIG
|
|
39
|
-
},
|
|
40
|
-
zod: {
|
|
41
|
-
version: getInstalledPackageVersion("zod", peerDependencies.zod),
|
|
42
|
-
shareScope: "default",
|
|
43
|
-
shareConfig: SHARE_CONFIG
|
|
44
|
-
},
|
|
45
|
-
"@orpc/contract": {
|
|
46
|
-
version: getInstalledPackageVersion("@orpc/contract", peerDependencies["@orpc/contract"]),
|
|
47
|
-
shareScope: "default",
|
|
48
|
-
shareConfig: SHARE_CONFIG
|
|
49
|
-
},
|
|
50
|
-
"@orpc/client": {
|
|
51
|
-
version: getInstalledPackageVersion("@orpc/client", peerDependencies["@orpc/client"]),
|
|
52
|
-
shareScope: "default",
|
|
53
|
-
shareConfig: SHARE_CONFIG
|
|
54
|
-
},
|
|
55
|
-
"@orpc/server": {
|
|
56
|
-
version: getInstalledPackageVersion("@orpc/server", peerDependencies["@orpc/server"]),
|
|
57
|
-
shareScope: "default",
|
|
58
|
-
shareConfig: SHARE_CONFIG
|
|
59
|
-
}
|
|
60
|
-
};
|
|
61
|
-
function buildMergedSharedDeps(appShared) {
|
|
62
|
-
const merged = {};
|
|
63
|
-
for (const [name, config] of Object.entries(MF_CORE_SHARED_DEPS)) merged[name] = {
|
|
64
|
-
version: config.version,
|
|
65
|
-
shareScope: config.shareScope,
|
|
66
|
-
shareConfig: config.shareConfig
|
|
67
|
-
};
|
|
68
|
-
if (appShared) for (const [name, config] of Object.entries(appShared)) merged[name] = {
|
|
69
|
-
version: config.version,
|
|
70
|
-
shareScope: config.shareScope ?? "default",
|
|
71
|
-
shareConfig: {
|
|
72
|
-
singleton: config.singleton ?? false,
|
|
73
|
-
requiredVersion: config.requiredVersion ?? false,
|
|
74
|
-
strictVersion: config.strictVersion ?? false,
|
|
75
|
-
eager: config.eager ?? false
|
|
76
|
-
}
|
|
77
|
-
};
|
|
78
|
-
return merged;
|
|
79
|
-
}
|
|
5
|
+
const PLUGIN_VERSION = "3.0.0-rc.0";
|
|
6
|
+
const MF_CORE_SHARED_DEPS = buildMfCoreSharedDependencies({ ownVersion: PLUGIN_VERSION });
|
|
80
7
|
|
|
81
8
|
//#endregion
|
|
82
|
-
export { MF_CORE_SHARED_DEPS, PLUGIN_VERSION
|
|
9
|
+
export { MF_CORE_SHARED_DEPS, PLUGIN_VERSION };
|
|
83
10
|
//# sourceMappingURL=mf-config.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mf-config.mjs","names":[],"sources":["../../src/runtime/mf-config.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"mf-config.mjs","names":[],"sources":["../../src/runtime/mf-config.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { buildMfCoreSharedDependencies, type CoreSharedDepName } from \"../shared-deps-spec\";\n\ndeclare const __EVERY_PLUGIN_VERSION__: string | undefined;\n\nfunction readPackageVersion(): string {\n try {\n // Not createRequire(import.meta.url): under tsx the require's resolution\n // base can come up empty in spawned child processes (\"Cannot find module\n // from ''\"), reading 0.0.0 and tripping the shared-identity check.\n return (\n JSON.parse(readFileSync(new URL(\"../../package.json\", import.meta.url), \"utf-8\")) as {\n version: string;\n }\n ).version;\n } catch {\n return \"0.0.0\";\n }\n}\n\nexport const PLUGIN_VERSION =\n typeof __EVERY_PLUGIN_VERSION__ === \"string\" ? __EVERY_PLUGIN_VERSION__ : readPackageVersion();\n\nexport interface SharedConfig {\n singleton: boolean;\n requiredVersion: string | false;\n strictVersion: boolean;\n eager: boolean;\n}\n\nexport const MF_CORE_SHARED_DEPS = buildMfCoreSharedDependencies({ ownVersion: PLUGIN_VERSION });\n\nexport type { CoreSharedDepName };\n"],"mappings":";;;;AAoBA,MAAa;AAUb,MAAa,sBAAsB,8BAA8B,EAAE,YAAY,eAAe,CAAC"}
|
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
const require_errors = require('../errors.cjs');
|
|
2
|
+
const require_build_artifact_names = require('../../build/artifact-names.cjs');
|
|
2
3
|
const require_runtime_mf_config = require('../mf-config.cjs');
|
|
3
|
-
const
|
|
4
|
+
const require_identity = require('../../identity.cjs');
|
|
5
|
+
const require_shared_identity = require('./shared-identity.cjs');
|
|
4
6
|
let effect = require("effect");
|
|
5
7
|
let _module_federation_enhanced_runtime = require("@module-federation/enhanced/runtime");
|
|
6
8
|
let _module_federation_runtime_core = require("@module-federation/runtime-core");
|
|
7
9
|
|
|
8
10
|
//#region src/runtime/services/module-federation.service.ts
|
|
11
|
+
function expectedSharedIdentity() {
|
|
12
|
+
return new Map(Object.entries(require_runtime_mf_config.MF_CORE_SHARED_DEPS).map(([name, config]) => [name, config.version]));
|
|
13
|
+
}
|
|
14
|
+
const loadEveryPluginSharedModule = () => Promise.resolve().then(() => require("../../index.cjs"));
|
|
9
15
|
const coreModuleLoaders = {
|
|
10
|
-
"every-plugin":
|
|
16
|
+
"every-plugin": loadEveryPluginSharedModule,
|
|
11
17
|
effect: () => import("effect"),
|
|
12
18
|
zod: () => import("zod"),
|
|
13
19
|
"@orpc/contract": () => import("@orpc/contract"),
|
|
@@ -40,16 +46,54 @@ const createModuleFederationInstance = effect.Effect.cached(effect.Effect.sync((
|
|
|
40
46
|
} else instance.registerShared(shared);
|
|
41
47
|
return instance;
|
|
42
48
|
} catch (error) {
|
|
43
|
-
throw new Error(`Failed to initialize Module Federation: ${error}`);
|
|
49
|
+
throw new Error(`Failed to initialize Module Federation: ${String(error)}`);
|
|
44
50
|
}
|
|
45
51
|
}));
|
|
46
|
-
|
|
52
|
+
const remoteSelfNames = /* @__PURE__ */ new Map();
|
|
53
|
+
const resolveRemoteSelfName = (pluginId, url) => effect.Effect.gen(function* () {
|
|
54
|
+
const memoKey = `${pluginId}@${url}`;
|
|
55
|
+
const memo = remoteSelfNames.get(memoKey);
|
|
56
|
+
if (memo) return memo;
|
|
57
|
+
let selfName = null;
|
|
58
|
+
try {
|
|
59
|
+
selfName = (yield* effect.Effect.promise(() => require_shared_identity.fetchRemoteIdentityManifest(url)))?.metaData?.name?.trim() || null;
|
|
60
|
+
} catch {
|
|
61
|
+
selfName = null;
|
|
62
|
+
}
|
|
63
|
+
const resolved = selfName ?? require_identity.remoteName(pluginId);
|
|
64
|
+
remoteSelfNames.set(memoKey, resolved);
|
|
65
|
+
return resolved;
|
|
66
|
+
});
|
|
67
|
+
var ModuleFederationService = class extends effect.Context.Service()("ModuleFederationService") {};
|
|
68
|
+
const ModuleFederationServiceDefault = effect.Layer.effect(ModuleFederationService, effect.Effect.gen(function* () {
|
|
47
69
|
const mf = yield* effect.Effect.flatten(createModuleFederationInstance);
|
|
70
|
+
const expectedIdentity = expectedSharedIdentity();
|
|
71
|
+
const buildSharedIdentityError = async (pluginId, url) => {
|
|
72
|
+
let manifest = null;
|
|
73
|
+
try {
|
|
74
|
+
manifest = await require_shared_identity.fetchRemoteIdentityManifest(url);
|
|
75
|
+
} catch (error) {
|
|
76
|
+
console.warn(`[SharedIdentity] Could not fetch mf-manifest.json for plugin "${pluginId}" at ${url} (${error instanceof Error ? error.message : String(error)}); proceeding without identity verification`);
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
if (!manifest) return null;
|
|
80
|
+
const mismatches = require_shared_identity.compareSharedIdentity(manifest.shared, expectedIdentity);
|
|
81
|
+
if (mismatches.length === 0) return null;
|
|
82
|
+
if (process.env.BOS_MF_IDENTITY === "warn") {
|
|
83
|
+
console.warn(`${require_shared_identity.describeSharedIdentityMismatch(pluginId, mismatches, "this runtime")} (BOS_MF_IDENTITY=warn: loading anyway)`);
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
return new require_errors.ModuleFederationError({
|
|
87
|
+
pluginId,
|
|
88
|
+
remoteUrl: url,
|
|
89
|
+
cause: new Error(require_shared_identity.describeSharedIdentityMismatch(pluginId, mismatches, "this runtime"))
|
|
90
|
+
});
|
|
91
|
+
};
|
|
48
92
|
return {
|
|
49
93
|
registerRemote: (pluginId, url) => effect.Effect.gen(function* () {
|
|
50
|
-
yield*
|
|
51
|
-
|
|
52
|
-
const type = url.endsWith("/mf-manifest.json") ? "manifest" : url.endsWith("
|
|
94
|
+
const remoteName = yield* resolveRemoteSelfName(pluginId, url);
|
|
95
|
+
yield* effect.Effect.logDebug(`[MF][${pluginId}] Registering as "${remoteName}"`);
|
|
96
|
+
const type = url.endsWith("/mf-manifest.json") ? "manifest" : url.endsWith(`/${"remoteEntry.js"}`) ? "script" : void 0;
|
|
53
97
|
yield* effect.Effect.try({
|
|
54
98
|
try: () => mf.registerRemotes([{
|
|
55
99
|
name: remoteName,
|
|
@@ -62,11 +106,16 @@ var ModuleFederationService = class extends effect.Effect.Service()("ModuleFeder
|
|
|
62
106
|
cause: error instanceof Error ? error : new Error(String(error))
|
|
63
107
|
})
|
|
64
108
|
});
|
|
65
|
-
yield* effect.Effect.logInfo(`[MF] ✅ Registered
|
|
109
|
+
yield* effect.Effect.logInfo(`[MF][${pluginId}] ✅ Registered`);
|
|
66
110
|
}),
|
|
67
111
|
loadRemoteConstructor: (pluginId, url) => effect.Effect.gen(function* () {
|
|
68
|
-
const remoteName =
|
|
69
|
-
yield* effect.Effect.logDebug(`[MF] Loading remote ${remoteName}`);
|
|
112
|
+
const remoteName = yield* resolveRemoteSelfName(pluginId, url);
|
|
113
|
+
yield* effect.Effect.logDebug(`[MF][${pluginId}] Loading remote ${remoteName}`);
|
|
114
|
+
const identityError = yield* effect.Effect.promise(() => buildSharedIdentityError(pluginId, url));
|
|
115
|
+
if (identityError) {
|
|
116
|
+
yield* effect.Effect.logError(`[MF][${pluginId}] ❌ shared identity mismatch: ${identityError.cause instanceof Error ? identityError.cause.message : String(identityError.cause ?? "shared identity mismatch")}`);
|
|
117
|
+
return yield* identityError;
|
|
118
|
+
}
|
|
70
119
|
const modulePath = `${remoteName}/plugin`;
|
|
71
120
|
const pluginConstructor = yield* effect.Effect.tryPromise({
|
|
72
121
|
try: async () => {
|
|
@@ -95,12 +144,14 @@ var ModuleFederationService = class extends effect.Effect.Service()("ModuleFeder
|
|
|
95
144
|
cause: error instanceof Error ? error : new Error(String(error))
|
|
96
145
|
})
|
|
97
146
|
});
|
|
98
|
-
yield* effect.Effect.logInfo(`[MF] ✅ Loaded constructor
|
|
147
|
+
yield* effect.Effect.logInfo(`[MF][${pluginId}] ✅ Loaded constructor`);
|
|
99
148
|
return pluginConstructor;
|
|
100
149
|
})
|
|
101
150
|
};
|
|
102
|
-
})
|
|
151
|
+
}));
|
|
103
152
|
|
|
104
153
|
//#endregion
|
|
105
154
|
exports.ModuleFederationService = ModuleFederationService;
|
|
155
|
+
exports.ModuleFederationServiceDefault = ModuleFederationServiceDefault;
|
|
156
|
+
exports.loadEveryPluginSharedModule = loadEveryPluginSharedModule;
|
|
106
157
|
//# sourceMappingURL=module-federation.service.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-federation.service.cjs","names":["MF_CORE_SHARED_DEPS","Effect","getNormalizedRemoteName","ModuleFederationError"],"sources":["../../../src/runtime/services/module-federation.service.ts"],"sourcesContent":["import { createInstance, getInstance } from \"@module-federation/enhanced/runtime\";\nimport { setGlobalFederationInstance } from \"@module-federation/runtime-core\";\nimport { Effect } from \"effect\";\nimport type { AnyPlugin } from \"../../types\";\nimport { ModuleFederationError } from \"../errors\";\nimport { type CoreSharedDepName, MF_CORE_SHARED_DEPS } from \"../mf-config\";\nimport { getNormalizedRemoteName } from \"./normalize\";\n\ntype RemoteModule = (new () => AnyPlugin) | { default: new () => AnyPlugin };\n\nconst coreModuleLoaders: Record<CoreSharedDepName, () => Promise<unknown>> = {\n \"every-plugin\": () => import(\"every-plugin\"),\n effect: () => import(\"effect\"),\n zod: () => import(\"zod\"),\n \"@orpc/contract\": () => import(\"@orpc/contract\"),\n \"@orpc/client\": () => import(\"@orpc/client\"),\n \"@orpc/server\": () => import(\"@orpc/server\"),\n};\n\nfunction buildSharedConfig(): Record<\n string,\n {\n version: string;\n shareScope: string;\n get: () => Promise<() => unknown>;\n shareConfig: (typeof MF_CORE_SHARED_DEPS)[CoreSharedDepName][\"shareConfig\"];\n }\n> {\n return Object.fromEntries(\n (\n Object.entries(MF_CORE_SHARED_DEPS) as [\n CoreSharedDepName,\n (typeof MF_CORE_SHARED_DEPS)[CoreSharedDepName],\n ][]\n ).map(([name, config]) => {\n const load = coreModuleLoaders[name];\n\n if (!load) {\n throw new Error(`Missing core shared module loader for ${name}`);\n }\n\n return [\n name,\n {\n version: config.version,\n shareScope: config.shareScope,\n get: () => load().then((mod) => () => mod),\n shareConfig: config.shareConfig,\n },\n ];\n }),\n );\n}\n\nconst createModuleFederationInstance = Effect.cached(\n Effect.sync(() => {\n try {\n const shared = buildSharedConfig();\n let instance = getInstance();\n\n if (!instance) {\n instance = createInstance({\n name: \"host\",\n remotes: [],\n shared,\n });\n\n setGlobalFederationInstance(instance);\n } else {\n instance.registerShared(shared);\n }\n\n return instance;\n } catch (error) {\n throw new Error(`Failed to initialize Module Federation: ${error}`);\n }\n }),\n);\n\nexport class ModuleFederationService extends Effect.Service<ModuleFederationService>()(\n \"ModuleFederationService\",\n {\n effect: Effect.gen(function* () {\n const mf = yield* Effect.flatten(createModuleFederationInstance);\n\n return {\n registerRemote: (pluginId: string, url: string) =>\n Effect.gen(function* () {\n yield* Effect.logDebug(`[MF] Registering ${pluginId}`);\n\n const remoteName = getNormalizedRemoteName(pluginId);\n const type = url.endsWith(\"/mf-manifest.json\")\n ? (\"manifest\" as const)\n : url.endsWith(\"/remoteEntry.js\")\n ? (\"script\" as const)\n : undefined;\n\n yield* Effect.try({\n try: () =>\n mf.registerRemotes([\n {\n name: remoteName,\n entry: url,\n ...(type ? { type } : {}),\n },\n ]),\n catch: (error): ModuleFederationError =>\n new ModuleFederationError({\n pluginId,\n remoteUrl: url,\n cause: error instanceof Error ? error : new Error(String(error)),\n }),\n });\n\n yield* Effect.logInfo(`[MF] ✅ Registered ${pluginId}`);\n }),\n\n loadRemoteConstructor: (pluginId: string, url: string) =>\n Effect.gen(function* () {\n const remoteName = getNormalizedRemoteName(pluginId);\n yield* Effect.logDebug(`[MF] Loading remote ${remoteName}`);\n const modulePath = `${remoteName}/plugin`;\n\n const pluginConstructor = yield* Effect.tryPromise({\n try: async () => {\n const container = await mf.loadRemote<RemoteModule>(modulePath);\n if (!container) {\n throw new Error(`No container returned for ${modulePath}`);\n }\n\n // Support multiple export patterns: direct function, default export, named exports\n let Constructor: any;\n\n if (typeof container === \"function\") {\n // Direct function export\n Constructor = container;\n } else if (container.default) {\n // Default export\n Constructor = container.default;\n } else {\n // Named export fallback - prioritize exports with 'binding' property (plugin classes)\n Constructor = Object.values(container).find(\n (exp) => typeof exp === \"function\" && (exp as any).binding !== undefined,\n );\n\n // Fallback to any function export if no binding found\n if (!Constructor) {\n Constructor = Object.values(container).find(\n (exp) => typeof exp === \"function\" && exp.prototype?.constructor === exp,\n );\n }\n }\n\n if (!Constructor || typeof Constructor !== \"function\") {\n const containerInfo =\n typeof container === \"object\"\n ? `Available exports: ${Object.keys(container).join(\", \")}`\n : `Container type: ${typeof container}`;\n\n throw new Error(\n `No valid plugin constructor found for '${pluginId}'.\\n` +\n `Supported patterns:\\n` +\n ` - export const YourPlugin = createPlugin({...})\\n` +\n ` - export default createPlugin({...})\\n` +\n `${containerInfo}`,\n );\n }\n\n // Validate it looks like a plugin constructor (has binding property)\n if (!(Constructor as any).binding) {\n const containerInfo =\n typeof container === \"object\"\n ? `Found exports: ${Object.keys(container).join(\", \")}`\n : `Container type: ${typeof container}`;\n\n throw new Error(\n `Invalid plugin constructor for '${pluginId}'. ` +\n `The exported value must be created with createPlugin(). ` +\n `Found a function but it's missing the required 'binding' property.\\n` +\n `${containerInfo}`,\n );\n }\n\n return Constructor;\n },\n catch: (error): ModuleFederationError =>\n new ModuleFederationError({\n pluginId,\n remoteUrl: url,\n cause: error instanceof Error ? error : new Error(String(error)),\n }),\n });\n\n yield* Effect.logInfo(`[MF] ✅ Loaded constructor for ${pluginId}`);\n return pluginConstructor;\n }),\n };\n }),\n },\n) {}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"module-federation.service.cjs","names":["MF_CORE_SHARED_DEPS","Effect","getInstance","createInstance","fetchRemoteIdentityManifest","getNormalizedRemoteName","Context","Layer","compareSharedIdentity","describeSharedIdentityMismatch","ModuleFederationError"],"sources":["../../../src/runtime/services/module-federation.service.ts"],"sourcesContent":["import { createInstance, getInstance } from \"@module-federation/enhanced/runtime\";\nimport { setGlobalFederationInstance } from \"@module-federation/runtime-core\";\nimport { Context, Effect, Layer } from \"effect\";\nimport { DEV_ENTRY_FILENAME } from \"../../build/artifact-names\";\nimport type { AnyPlugin } from \"../../types\";\nimport { ModuleFederationError } from \"../errors\";\nimport { type CoreSharedDepName, MF_CORE_SHARED_DEPS } from \"../mf-config\";\nimport { getNormalizedRemoteName } from \"./normalize\";\nimport {\n compareSharedIdentity,\n describeSharedIdentityMismatch,\n fetchRemoteIdentityManifest,\n} from \"./shared-identity\";\n\nfunction expectedSharedIdentity(): Map<string, string> {\n return new Map(\n Object.entries(MF_CORE_SHARED_DEPS).map(([name, config]) => [name, config.version]),\n );\n}\n\ntype RemoteModule = (new () => AnyPlugin) | { default: new () => AnyPlugin };\n\nexport const loadEveryPluginSharedModule = () => import(\"../../index\");\n\nconst coreModuleLoaders: Record<CoreSharedDepName, () => Promise<unknown>> = {\n // Keep the host-provided framework share on the same source graph as the\n // runtime. A package self-import can resolve the published entry when a\n // workspace script is launched through its package manager shim.\n \"every-plugin\": loadEveryPluginSharedModule,\n effect: () => import(\"effect\"),\n zod: () => import(\"zod\"),\n \"@orpc/contract\": () => import(\"@orpc/contract\"),\n \"@orpc/client\": () => import(\"@orpc/client\"),\n \"@orpc/server\": () => import(\"@orpc/server\"),\n};\n\nfunction buildSharedConfig(): Record<\n string,\n {\n version: string;\n shareScope: string;\n get: () => Promise<() => unknown>;\n shareConfig: (typeof MF_CORE_SHARED_DEPS)[CoreSharedDepName][\"shareConfig\"];\n }\n> {\n return Object.fromEntries(\n (\n Object.entries(MF_CORE_SHARED_DEPS) as [\n CoreSharedDepName,\n (typeof MF_CORE_SHARED_DEPS)[CoreSharedDepName],\n ][]\n ).map(([name, config]) => {\n const load = coreModuleLoaders[name];\n\n if (!load) {\n throw new Error(`Missing core shared module loader for ${name}`);\n }\n\n return [\n name,\n {\n version: config.version,\n shareScope: config.shareScope,\n get: () => load().then((mod) => () => mod),\n shareConfig: config.shareConfig,\n },\n ];\n }),\n );\n}\n\nconst createModuleFederationInstance = Effect.cached(\n Effect.sync(() => {\n try {\n const shared = buildSharedConfig();\n let instance = getInstance();\n\n if (!instance) {\n instance = createInstance({\n name: \"host\",\n remotes: [],\n shared,\n });\n\n setGlobalFederationInstance(instance);\n } else {\n instance.registerShared(shared);\n }\n\n return instance;\n } catch (error) {\n throw new Error(`Failed to initialize Module Federation: ${String(error)}`);\n }\n }),\n);\n\n// A built container's runtime code looks up its own chunks through the node\n// runtime's entry-URL fallback keyed by the container's SELF name\n// (`mf-manifest.json` metaData.name — the composition key, e.g.\n// \"everything-dev_registry-plugin\"), while the host registers the remote\n// under the plugin id (\"registry\"). When those differ, the fallback misses,\n// resolveUrl returns null, and the node runtime hands back an empty chunk as\n// if it had loaded — the exposed module then requires ids nothing registered\n// (\"__webpack_modules__[r] is not a function\"). Registering and loading the\n// remote under the container's own name keeps that lookup a hit.\nconst remoteSelfNames = new Map<string, string>();\n\nconst resolveRemoteSelfName = (pluginId: string, url: string) =>\n Effect.gen(function* () {\n const memoKey = `${pluginId}@${url}`;\n const memo = remoteSelfNames.get(memoKey);\n if (memo) return memo;\n\n let selfName: string | null = null;\n try {\n const manifest = yield* Effect.promise(() => fetchRemoteIdentityManifest(url));\n selfName = manifest?.metaData?.name?.trim() || null;\n } catch {\n selfName = null;\n }\n\n const resolved = selfName ?? getNormalizedRemoteName(pluginId);\n remoteSelfNames.set(memoKey, resolved);\n return resolved;\n });\n\nexport interface ModuleFederationServiceShape {\n registerRemote: (pluginId: string, url: string) => Effect.Effect<void, ModuleFederationError>;\n loadRemoteConstructor: (\n pluginId: string,\n url: string,\n ) => Effect.Effect<new () => AnyPlugin, ModuleFederationError>;\n}\n\nexport class ModuleFederationService extends Context.Service<\n ModuleFederationService,\n ModuleFederationServiceShape\n>()(\"ModuleFederationService\") {}\n\nexport const ModuleFederationServiceDefault = Layer.effect(\n ModuleFederationService,\n Effect.gen(function* () {\n const mf = yield* Effect.flatten(createModuleFederationInstance);\n const expectedIdentity = expectedSharedIdentity();\n\n const buildSharedIdentityError = async (\n pluginId: string,\n url: string,\n ): Promise<ModuleFederationError | null> => {\n let manifest: Awaited<ReturnType<typeof fetchRemoteIdentityManifest>> | null = null;\n try {\n manifest = await fetchRemoteIdentityManifest(url);\n } catch (error) {\n console.warn(\n `[SharedIdentity] Could not fetch mf-manifest.json for plugin \"${pluginId}\" at ${url} (${error instanceof Error ? error.message : String(error)}); proceeding without identity verification`,\n );\n return null;\n }\n if (!manifest) return null;\n const mismatches = compareSharedIdentity(manifest.shared, expectedIdentity);\n if (mismatches.length === 0) return null;\n const warnOnly = process.env.BOS_MF_IDENTITY === \"warn\";\n if (warnOnly) {\n console.warn(\n `${describeSharedIdentityMismatch(pluginId, mismatches, \"this runtime\")} (BOS_MF_IDENTITY=warn: loading anyway)`,\n );\n return null;\n }\n return new ModuleFederationError({\n pluginId,\n remoteUrl: url,\n cause: new Error(describeSharedIdentityMismatch(pluginId, mismatches, \"this runtime\")),\n });\n };\n\n return {\n registerRemote: (pluginId: string, url: string) =>\n Effect.gen(function* () {\n const remoteName = yield* resolveRemoteSelfName(pluginId, url);\n yield* Effect.logDebug(`[MF][${pluginId}] Registering as \"${remoteName}\"`);\n\n const type = url.endsWith(\"/mf-manifest.json\")\n ? (\"manifest\" as const)\n : url.endsWith(`/${DEV_ENTRY_FILENAME}`)\n ? (\"script\" as const)\n : undefined;\n\n yield* Effect.try({\n try: () =>\n mf.registerRemotes([\n {\n name: remoteName,\n entry: url,\n ...(type ? { type } : {}),\n },\n ]),\n catch: (error): ModuleFederationError =>\n new ModuleFederationError({\n pluginId,\n remoteUrl: url,\n cause: error instanceof Error ? error : new Error(String(error)),\n }),\n });\n\n yield* Effect.logInfo(`[MF][${pluginId}] ✅ Registered`);\n }),\n\n loadRemoteConstructor: (pluginId: string, url: string) =>\n Effect.gen(function* () {\n const remoteName = yield* resolveRemoteSelfName(pluginId, url);\n yield* Effect.logDebug(`[MF][${pluginId}] Loading remote ${remoteName}`);\n\n const identityError = yield* Effect.promise(() =>\n buildSharedIdentityError(pluginId, url),\n );\n if (identityError) {\n yield* Effect.logError(\n `[MF][${pluginId}] ❌ shared identity mismatch: ${\n identityError.cause instanceof Error\n ? identityError.cause.message\n : String(identityError.cause ?? \"shared identity mismatch\")\n }`,\n );\n return yield* identityError;\n }\n\n const modulePath = `${remoteName}/plugin`;\n\n const pluginConstructor = yield* Effect.tryPromise({\n try: async () => {\n const container = await mf.loadRemote<RemoteModule>(modulePath);\n if (!container) {\n throw new Error(`No container returned for ${modulePath}`);\n }\n\n // Support multiple export patterns: direct function, default export, named exports\n let Constructor: any;\n\n if (typeof container === \"function\") {\n // Direct function export\n Constructor = container;\n } else if (container.default) {\n // Default export\n Constructor = container.default;\n } else {\n // Named export fallback - prioritize exports with 'binding' property (plugin classes)\n Constructor = Object.values(container).find(\n (exp) => typeof exp === \"function\" && (exp as any).binding !== undefined,\n );\n\n // Fallback to any function export if no binding found\n if (!Constructor) {\n Constructor = Object.values(container).find(\n (exp) => typeof exp === \"function\" && exp.prototype?.constructor === exp,\n );\n }\n }\n\n if (!Constructor || typeof Constructor !== \"function\") {\n const containerInfo =\n typeof container === \"object\"\n ? `Available exports: ${Object.keys(container).join(\", \")}`\n : `Container type: ${typeof container}`;\n\n throw new Error(\n `No valid plugin constructor found for '${pluginId}'.\\n` +\n `Supported patterns:\\n` +\n ` - export const YourPlugin = createPlugin({...})\\n` +\n ` - export default createPlugin({...})\\n` +\n `${containerInfo}`,\n );\n }\n\n // Validate it looks like a plugin constructor (has binding property)\n if (!(Constructor as any).binding) {\n const containerInfo =\n typeof container === \"object\"\n ? `Found exports: ${Object.keys(container).join(\", \")}`\n : `Container type: ${typeof container}`;\n\n throw new Error(\n `Invalid plugin constructor for '${pluginId}'. ` +\n `The exported value must be created with createPlugin(). ` +\n `Found a function but it's missing the required 'binding' property.\\n` +\n `${containerInfo}`,\n );\n }\n\n return Constructor;\n },\n catch: (error): ModuleFederationError =>\n new ModuleFederationError({\n pluginId,\n remoteUrl: url,\n cause: error instanceof Error ? error : new Error(String(error)),\n }),\n });\n\n yield* Effect.logInfo(`[MF][${pluginId}] ✅ Loaded constructor`);\n return pluginConstructor;\n }),\n };\n }),\n);\n"],"mappings":"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"}
|
|
@@ -1,13 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
readonly effect: Effect.Effect<{
|
|
6
|
-
registerRemote: (pluginId: string, url: string) => Effect.Effect<void, ModuleFederationError, never>;
|
|
7
|
-
loadRemoteConstructor: (pluginId: string, url: string) => Effect.Effect<any, ModuleFederationError, never>;
|
|
8
|
-
}, never, never>;
|
|
9
|
-
}>;
|
|
10
|
-
declare class ModuleFederationService extends ModuleFederationService_base {}
|
|
11
|
-
//#endregion
|
|
12
|
-
export { ModuleFederationService };
|
|
13
|
-
//# sourceMappingURL=module-federation.service.d.cts.map
|
|
1
|
+
import "../errors.cjs";
|
|
2
|
+
import "../../types.cjs";
|
|
3
|
+
import "../../index.cjs";
|
|
4
|
+
import { Context, Effect, Layer } from "effect";
|
|
@@ -1,13 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
readonly effect: Effect.Effect<{
|
|
6
|
-
registerRemote: (pluginId: string, url: string) => Effect.Effect<void, ModuleFederationError, never>;
|
|
7
|
-
loadRemoteConstructor: (pluginId: string, url: string) => Effect.Effect<any, ModuleFederationError, never>;
|
|
8
|
-
}, never, never>;
|
|
9
|
-
}>;
|
|
10
|
-
declare class ModuleFederationService extends ModuleFederationService_base {}
|
|
11
|
-
//#endregion
|
|
12
|
-
export { ModuleFederationService };
|
|
13
|
-
//# sourceMappingURL=module-federation.service.d.mts.map
|
|
1
|
+
import "../errors.mjs";
|
|
2
|
+
import "../../types.mjs";
|
|
3
|
+
import "../../index.mjs";
|
|
4
|
+
import { Context, Effect, Layer } from "effect";
|
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
import { ModuleFederationError } from "../errors.mjs";
|
|
2
|
+
import { DEV_ENTRY_FILENAME } from "../../build/artifact-names.mjs";
|
|
2
3
|
import { MF_CORE_SHARED_DEPS } from "../mf-config.mjs";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
4
|
+
import { remoteName } from "../../identity.mjs";
|
|
5
|
+
import { compareSharedIdentity, describeSharedIdentityMismatch, fetchRemoteIdentityManifest } from "./shared-identity.mjs";
|
|
6
|
+
import { Context, Effect, Layer } from "effect";
|
|
5
7
|
import { createInstance, getInstance } from "@module-federation/enhanced/runtime";
|
|
6
8
|
import { setGlobalFederationInstance } from "@module-federation/runtime-core";
|
|
7
9
|
|
|
8
10
|
//#region src/runtime/services/module-federation.service.ts
|
|
11
|
+
function expectedSharedIdentity() {
|
|
12
|
+
return new Map(Object.entries(MF_CORE_SHARED_DEPS).map(([name, config]) => [name, config.version]));
|
|
13
|
+
}
|
|
14
|
+
const loadEveryPluginSharedModule = () => import("../../index.mjs");
|
|
9
15
|
const coreModuleLoaders = {
|
|
10
|
-
"every-plugin":
|
|
16
|
+
"every-plugin": loadEveryPluginSharedModule,
|
|
11
17
|
effect: () => import("effect"),
|
|
12
18
|
zod: () => import("zod"),
|
|
13
19
|
"@orpc/contract": () => import("@orpc/contract"),
|
|
@@ -40,16 +46,54 @@ const createModuleFederationInstance = Effect.cached(Effect.sync(() => {
|
|
|
40
46
|
} else instance.registerShared(shared);
|
|
41
47
|
return instance;
|
|
42
48
|
} catch (error) {
|
|
43
|
-
throw new Error(`Failed to initialize Module Federation: ${error}`);
|
|
49
|
+
throw new Error(`Failed to initialize Module Federation: ${String(error)}`);
|
|
44
50
|
}
|
|
45
51
|
}));
|
|
46
|
-
|
|
52
|
+
const remoteSelfNames = /* @__PURE__ */ new Map();
|
|
53
|
+
const resolveRemoteSelfName = (pluginId, url) => Effect.gen(function* () {
|
|
54
|
+
const memoKey = `${pluginId}@${url}`;
|
|
55
|
+
const memo = remoteSelfNames.get(memoKey);
|
|
56
|
+
if (memo) return memo;
|
|
57
|
+
let selfName = null;
|
|
58
|
+
try {
|
|
59
|
+
selfName = (yield* Effect.promise(() => fetchRemoteIdentityManifest(url)))?.metaData?.name?.trim() || null;
|
|
60
|
+
} catch {
|
|
61
|
+
selfName = null;
|
|
62
|
+
}
|
|
63
|
+
const resolved = selfName ?? remoteName(pluginId);
|
|
64
|
+
remoteSelfNames.set(memoKey, resolved);
|
|
65
|
+
return resolved;
|
|
66
|
+
});
|
|
67
|
+
var ModuleFederationService = class extends Context.Service()("ModuleFederationService") {};
|
|
68
|
+
const ModuleFederationServiceDefault = Layer.effect(ModuleFederationService, Effect.gen(function* () {
|
|
47
69
|
const mf = yield* Effect.flatten(createModuleFederationInstance);
|
|
70
|
+
const expectedIdentity = expectedSharedIdentity();
|
|
71
|
+
const buildSharedIdentityError = async (pluginId, url) => {
|
|
72
|
+
let manifest = null;
|
|
73
|
+
try {
|
|
74
|
+
manifest = await fetchRemoteIdentityManifest(url);
|
|
75
|
+
} catch (error) {
|
|
76
|
+
console.warn(`[SharedIdentity] Could not fetch mf-manifest.json for plugin "${pluginId}" at ${url} (${error instanceof Error ? error.message : String(error)}); proceeding without identity verification`);
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
if (!manifest) return null;
|
|
80
|
+
const mismatches = compareSharedIdentity(manifest.shared, expectedIdentity);
|
|
81
|
+
if (mismatches.length === 0) return null;
|
|
82
|
+
if (process.env.BOS_MF_IDENTITY === "warn") {
|
|
83
|
+
console.warn(`${describeSharedIdentityMismatch(pluginId, mismatches, "this runtime")} (BOS_MF_IDENTITY=warn: loading anyway)`);
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
return new ModuleFederationError({
|
|
87
|
+
pluginId,
|
|
88
|
+
remoteUrl: url,
|
|
89
|
+
cause: new Error(describeSharedIdentityMismatch(pluginId, mismatches, "this runtime"))
|
|
90
|
+
});
|
|
91
|
+
};
|
|
48
92
|
return {
|
|
49
93
|
registerRemote: (pluginId, url) => Effect.gen(function* () {
|
|
50
|
-
yield*
|
|
51
|
-
|
|
52
|
-
const type = url.endsWith("/mf-manifest.json") ? "manifest" : url.endsWith("
|
|
94
|
+
const remoteName = yield* resolveRemoteSelfName(pluginId, url);
|
|
95
|
+
yield* Effect.logDebug(`[MF][${pluginId}] Registering as "${remoteName}"`);
|
|
96
|
+
const type = url.endsWith("/mf-manifest.json") ? "manifest" : url.endsWith(`/${"remoteEntry.js"}`) ? "script" : void 0;
|
|
53
97
|
yield* Effect.try({
|
|
54
98
|
try: () => mf.registerRemotes([{
|
|
55
99
|
name: remoteName,
|
|
@@ -62,11 +106,16 @@ var ModuleFederationService = class extends Effect.Service()("ModuleFederationSe
|
|
|
62
106
|
cause: error instanceof Error ? error : new Error(String(error))
|
|
63
107
|
})
|
|
64
108
|
});
|
|
65
|
-
yield* Effect.logInfo(`[MF] ✅ Registered
|
|
109
|
+
yield* Effect.logInfo(`[MF][${pluginId}] ✅ Registered`);
|
|
66
110
|
}),
|
|
67
111
|
loadRemoteConstructor: (pluginId, url) => Effect.gen(function* () {
|
|
68
|
-
const remoteName =
|
|
69
|
-
yield* Effect.logDebug(`[MF] Loading remote ${remoteName}`);
|
|
112
|
+
const remoteName = yield* resolveRemoteSelfName(pluginId, url);
|
|
113
|
+
yield* Effect.logDebug(`[MF][${pluginId}] Loading remote ${remoteName}`);
|
|
114
|
+
const identityError = yield* Effect.promise(() => buildSharedIdentityError(pluginId, url));
|
|
115
|
+
if (identityError) {
|
|
116
|
+
yield* Effect.logError(`[MF][${pluginId}] ❌ shared identity mismatch: ${identityError.cause instanceof Error ? identityError.cause.message : String(identityError.cause ?? "shared identity mismatch")}`);
|
|
117
|
+
return yield* identityError;
|
|
118
|
+
}
|
|
70
119
|
const modulePath = `${remoteName}/plugin`;
|
|
71
120
|
const pluginConstructor = yield* Effect.tryPromise({
|
|
72
121
|
try: async () => {
|
|
@@ -95,12 +144,12 @@ var ModuleFederationService = class extends Effect.Service()("ModuleFederationSe
|
|
|
95
144
|
cause: error instanceof Error ? error : new Error(String(error))
|
|
96
145
|
})
|
|
97
146
|
});
|
|
98
|
-
yield* Effect.logInfo(`[MF] ✅ Loaded constructor
|
|
147
|
+
yield* Effect.logInfo(`[MF][${pluginId}] ✅ Loaded constructor`);
|
|
99
148
|
return pluginConstructor;
|
|
100
149
|
})
|
|
101
150
|
};
|
|
102
|
-
})
|
|
151
|
+
}));
|
|
103
152
|
|
|
104
153
|
//#endregion
|
|
105
|
-
export { ModuleFederationService };
|
|
154
|
+
export { ModuleFederationService, ModuleFederationServiceDefault, loadEveryPluginSharedModule };
|
|
106
155
|
//# sourceMappingURL=module-federation.service.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-federation.service.mjs","names":[],"sources":["../../../src/runtime/services/module-federation.service.ts"],"sourcesContent":["import { createInstance, getInstance } from \"@module-federation/enhanced/runtime\";\nimport { setGlobalFederationInstance } from \"@module-federation/runtime-core\";\nimport { Effect } from \"effect\";\nimport type { AnyPlugin } from \"../../types\";\nimport { ModuleFederationError } from \"../errors\";\nimport { type CoreSharedDepName, MF_CORE_SHARED_DEPS } from \"../mf-config\";\nimport { getNormalizedRemoteName } from \"./normalize\";\n\ntype RemoteModule = (new () => AnyPlugin) | { default: new () => AnyPlugin };\n\nconst coreModuleLoaders: Record<CoreSharedDepName, () => Promise<unknown>> = {\n \"every-plugin\": () => import(\"every-plugin\"),\n effect: () => import(\"effect\"),\n zod: () => import(\"zod\"),\n \"@orpc/contract\": () => import(\"@orpc/contract\"),\n \"@orpc/client\": () => import(\"@orpc/client\"),\n \"@orpc/server\": () => import(\"@orpc/server\"),\n};\n\nfunction buildSharedConfig(): Record<\n string,\n {\n version: string;\n shareScope: string;\n get: () => Promise<() => unknown>;\n shareConfig: (typeof MF_CORE_SHARED_DEPS)[CoreSharedDepName][\"shareConfig\"];\n }\n> {\n return Object.fromEntries(\n (\n Object.entries(MF_CORE_SHARED_DEPS) as [\n CoreSharedDepName,\n (typeof MF_CORE_SHARED_DEPS)[CoreSharedDepName],\n ][]\n ).map(([name, config]) => {\n const load = coreModuleLoaders[name];\n\n if (!load) {\n throw new Error(`Missing core shared module loader for ${name}`);\n }\n\n return [\n name,\n {\n version: config.version,\n shareScope: config.shareScope,\n get: () => load().then((mod) => () => mod),\n shareConfig: config.shareConfig,\n },\n ];\n }),\n );\n}\n\nconst createModuleFederationInstance = Effect.cached(\n Effect.sync(() => {\n try {\n const shared = buildSharedConfig();\n let instance = getInstance();\n\n if (!instance) {\n instance = createInstance({\n name: \"host\",\n remotes: [],\n shared,\n });\n\n setGlobalFederationInstance(instance);\n } else {\n instance.registerShared(shared);\n }\n\n return instance;\n } catch (error) {\n throw new Error(`Failed to initialize Module Federation: ${error}`);\n }\n }),\n);\n\nexport class ModuleFederationService extends Effect.Service<ModuleFederationService>()(\n \"ModuleFederationService\",\n {\n effect: Effect.gen(function* () {\n const mf = yield* Effect.flatten(createModuleFederationInstance);\n\n return {\n registerRemote: (pluginId: string, url: string) =>\n Effect.gen(function* () {\n yield* Effect.logDebug(`[MF] Registering ${pluginId}`);\n\n const remoteName = getNormalizedRemoteName(pluginId);\n const type = url.endsWith(\"/mf-manifest.json\")\n ? (\"manifest\" as const)\n : url.endsWith(\"/remoteEntry.js\")\n ? (\"script\" as const)\n : undefined;\n\n yield* Effect.try({\n try: () =>\n mf.registerRemotes([\n {\n name: remoteName,\n entry: url,\n ...(type ? { type } : {}),\n },\n ]),\n catch: (error): ModuleFederationError =>\n new ModuleFederationError({\n pluginId,\n remoteUrl: url,\n cause: error instanceof Error ? error : new Error(String(error)),\n }),\n });\n\n yield* Effect.logInfo(`[MF] ✅ Registered ${pluginId}`);\n }),\n\n loadRemoteConstructor: (pluginId: string, url: string) =>\n Effect.gen(function* () {\n const remoteName = getNormalizedRemoteName(pluginId);\n yield* Effect.logDebug(`[MF] Loading remote ${remoteName}`);\n const modulePath = `${remoteName}/plugin`;\n\n const pluginConstructor = yield* Effect.tryPromise({\n try: async () => {\n const container = await mf.loadRemote<RemoteModule>(modulePath);\n if (!container) {\n throw new Error(`No container returned for ${modulePath}`);\n }\n\n // Support multiple export patterns: direct function, default export, named exports\n let Constructor: any;\n\n if (typeof container === \"function\") {\n // Direct function export\n Constructor = container;\n } else if (container.default) {\n // Default export\n Constructor = container.default;\n } else {\n // Named export fallback - prioritize exports with 'binding' property (plugin classes)\n Constructor = Object.values(container).find(\n (exp) => typeof exp === \"function\" && (exp as any).binding !== undefined,\n );\n\n // Fallback to any function export if no binding found\n if (!Constructor) {\n Constructor = Object.values(container).find(\n (exp) => typeof exp === \"function\" && exp.prototype?.constructor === exp,\n );\n }\n }\n\n if (!Constructor || typeof Constructor !== \"function\") {\n const containerInfo =\n typeof container === \"object\"\n ? `Available exports: ${Object.keys(container).join(\", \")}`\n : `Container type: ${typeof container}`;\n\n throw new Error(\n `No valid plugin constructor found for '${pluginId}'.\\n` +\n `Supported patterns:\\n` +\n ` - export const YourPlugin = createPlugin({...})\\n` +\n ` - export default createPlugin({...})\\n` +\n `${containerInfo}`,\n );\n }\n\n // Validate it looks like a plugin constructor (has binding property)\n if (!(Constructor as any).binding) {\n const containerInfo =\n typeof container === \"object\"\n ? `Found exports: ${Object.keys(container).join(\", \")}`\n : `Container type: ${typeof container}`;\n\n throw new Error(\n `Invalid plugin constructor for '${pluginId}'. ` +\n `The exported value must be created with createPlugin(). ` +\n `Found a function but it's missing the required 'binding' property.\\n` +\n `${containerInfo}`,\n );\n }\n\n return Constructor;\n },\n catch: (error): ModuleFederationError =>\n new ModuleFederationError({\n pluginId,\n remoteUrl: url,\n cause: error instanceof Error ? error : new Error(String(error)),\n }),\n });\n\n yield* Effect.logInfo(`[MF] ✅ Loaded constructor for ${pluginId}`);\n return pluginConstructor;\n }),\n };\n }),\n },\n) {}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"module-federation.service.mjs","names":["getNormalizedRemoteName"],"sources":["../../../src/runtime/services/module-federation.service.ts"],"sourcesContent":["import { createInstance, getInstance } from \"@module-federation/enhanced/runtime\";\nimport { setGlobalFederationInstance } from \"@module-federation/runtime-core\";\nimport { Context, Effect, Layer } from \"effect\";\nimport { DEV_ENTRY_FILENAME } from \"../../build/artifact-names\";\nimport type { AnyPlugin } from \"../../types\";\nimport { ModuleFederationError } from \"../errors\";\nimport { type CoreSharedDepName, MF_CORE_SHARED_DEPS } from \"../mf-config\";\nimport { getNormalizedRemoteName } from \"./normalize\";\nimport {\n compareSharedIdentity,\n describeSharedIdentityMismatch,\n fetchRemoteIdentityManifest,\n} from \"./shared-identity\";\n\nfunction expectedSharedIdentity(): Map<string, string> {\n return new Map(\n Object.entries(MF_CORE_SHARED_DEPS).map(([name, config]) => [name, config.version]),\n );\n}\n\ntype RemoteModule = (new () => AnyPlugin) | { default: new () => AnyPlugin };\n\nexport const loadEveryPluginSharedModule = () => import(\"../../index\");\n\nconst coreModuleLoaders: Record<CoreSharedDepName, () => Promise<unknown>> = {\n // Keep the host-provided framework share on the same source graph as the\n // runtime. A package self-import can resolve the published entry when a\n // workspace script is launched through its package manager shim.\n \"every-plugin\": loadEveryPluginSharedModule,\n effect: () => import(\"effect\"),\n zod: () => import(\"zod\"),\n \"@orpc/contract\": () => import(\"@orpc/contract\"),\n \"@orpc/client\": () => import(\"@orpc/client\"),\n \"@orpc/server\": () => import(\"@orpc/server\"),\n};\n\nfunction buildSharedConfig(): Record<\n string,\n {\n version: string;\n shareScope: string;\n get: () => Promise<() => unknown>;\n shareConfig: (typeof MF_CORE_SHARED_DEPS)[CoreSharedDepName][\"shareConfig\"];\n }\n> {\n return Object.fromEntries(\n (\n Object.entries(MF_CORE_SHARED_DEPS) as [\n CoreSharedDepName,\n (typeof MF_CORE_SHARED_DEPS)[CoreSharedDepName],\n ][]\n ).map(([name, config]) => {\n const load = coreModuleLoaders[name];\n\n if (!load) {\n throw new Error(`Missing core shared module loader for ${name}`);\n }\n\n return [\n name,\n {\n version: config.version,\n shareScope: config.shareScope,\n get: () => load().then((mod) => () => mod),\n shareConfig: config.shareConfig,\n },\n ];\n }),\n );\n}\n\nconst createModuleFederationInstance = Effect.cached(\n Effect.sync(() => {\n try {\n const shared = buildSharedConfig();\n let instance = getInstance();\n\n if (!instance) {\n instance = createInstance({\n name: \"host\",\n remotes: [],\n shared,\n });\n\n setGlobalFederationInstance(instance);\n } else {\n instance.registerShared(shared);\n }\n\n return instance;\n } catch (error) {\n throw new Error(`Failed to initialize Module Federation: ${String(error)}`);\n }\n }),\n);\n\n// A built container's runtime code looks up its own chunks through the node\n// runtime's entry-URL fallback keyed by the container's SELF name\n// (`mf-manifest.json` metaData.name — the composition key, e.g.\n// \"everything-dev_registry-plugin\"), while the host registers the remote\n// under the plugin id (\"registry\"). When those differ, the fallback misses,\n// resolveUrl returns null, and the node runtime hands back an empty chunk as\n// if it had loaded — the exposed module then requires ids nothing registered\n// (\"__webpack_modules__[r] is not a function\"). Registering and loading the\n// remote under the container's own name keeps that lookup a hit.\nconst remoteSelfNames = new Map<string, string>();\n\nconst resolveRemoteSelfName = (pluginId: string, url: string) =>\n Effect.gen(function* () {\n const memoKey = `${pluginId}@${url}`;\n const memo = remoteSelfNames.get(memoKey);\n if (memo) return memo;\n\n let selfName: string | null = null;\n try {\n const manifest = yield* Effect.promise(() => fetchRemoteIdentityManifest(url));\n selfName = manifest?.metaData?.name?.trim() || null;\n } catch {\n selfName = null;\n }\n\n const resolved = selfName ?? getNormalizedRemoteName(pluginId);\n remoteSelfNames.set(memoKey, resolved);\n return resolved;\n });\n\nexport interface ModuleFederationServiceShape {\n registerRemote: (pluginId: string, url: string) => Effect.Effect<void, ModuleFederationError>;\n loadRemoteConstructor: (\n pluginId: string,\n url: string,\n ) => Effect.Effect<new () => AnyPlugin, ModuleFederationError>;\n}\n\nexport class ModuleFederationService extends Context.Service<\n ModuleFederationService,\n ModuleFederationServiceShape\n>()(\"ModuleFederationService\") {}\n\nexport const ModuleFederationServiceDefault = Layer.effect(\n ModuleFederationService,\n Effect.gen(function* () {\n const mf = yield* Effect.flatten(createModuleFederationInstance);\n const expectedIdentity = expectedSharedIdentity();\n\n const buildSharedIdentityError = async (\n pluginId: string,\n url: string,\n ): Promise<ModuleFederationError | null> => {\n let manifest: Awaited<ReturnType<typeof fetchRemoteIdentityManifest>> | null = null;\n try {\n manifest = await fetchRemoteIdentityManifest(url);\n } catch (error) {\n console.warn(\n `[SharedIdentity] Could not fetch mf-manifest.json for plugin \"${pluginId}\" at ${url} (${error instanceof Error ? error.message : String(error)}); proceeding without identity verification`,\n );\n return null;\n }\n if (!manifest) return null;\n const mismatches = compareSharedIdentity(manifest.shared, expectedIdentity);\n if (mismatches.length === 0) return null;\n const warnOnly = process.env.BOS_MF_IDENTITY === \"warn\";\n if (warnOnly) {\n console.warn(\n `${describeSharedIdentityMismatch(pluginId, mismatches, \"this runtime\")} (BOS_MF_IDENTITY=warn: loading anyway)`,\n );\n return null;\n }\n return new ModuleFederationError({\n pluginId,\n remoteUrl: url,\n cause: new Error(describeSharedIdentityMismatch(pluginId, mismatches, \"this runtime\")),\n });\n };\n\n return {\n registerRemote: (pluginId: string, url: string) =>\n Effect.gen(function* () {\n const remoteName = yield* resolveRemoteSelfName(pluginId, url);\n yield* Effect.logDebug(`[MF][${pluginId}] Registering as \"${remoteName}\"`);\n\n const type = url.endsWith(\"/mf-manifest.json\")\n ? (\"manifest\" as const)\n : url.endsWith(`/${DEV_ENTRY_FILENAME}`)\n ? (\"script\" as const)\n : undefined;\n\n yield* Effect.try({\n try: () =>\n mf.registerRemotes([\n {\n name: remoteName,\n entry: url,\n ...(type ? { type } : {}),\n },\n ]),\n catch: (error): ModuleFederationError =>\n new ModuleFederationError({\n pluginId,\n remoteUrl: url,\n cause: error instanceof Error ? error : new Error(String(error)),\n }),\n });\n\n yield* Effect.logInfo(`[MF][${pluginId}] ✅ Registered`);\n }),\n\n loadRemoteConstructor: (pluginId: string, url: string) =>\n Effect.gen(function* () {\n const remoteName = yield* resolveRemoteSelfName(pluginId, url);\n yield* Effect.logDebug(`[MF][${pluginId}] Loading remote ${remoteName}`);\n\n const identityError = yield* Effect.promise(() =>\n buildSharedIdentityError(pluginId, url),\n );\n if (identityError) {\n yield* Effect.logError(\n `[MF][${pluginId}] ❌ shared identity mismatch: ${\n identityError.cause instanceof Error\n ? identityError.cause.message\n : String(identityError.cause ?? \"shared identity mismatch\")\n }`,\n );\n return yield* identityError;\n }\n\n const modulePath = `${remoteName}/plugin`;\n\n const pluginConstructor = yield* Effect.tryPromise({\n try: async () => {\n const container = await mf.loadRemote<RemoteModule>(modulePath);\n if (!container) {\n throw new Error(`No container returned for ${modulePath}`);\n }\n\n // Support multiple export patterns: direct function, default export, named exports\n let Constructor: any;\n\n if (typeof container === \"function\") {\n // Direct function export\n Constructor = container;\n } else if (container.default) {\n // Default export\n Constructor = container.default;\n } else {\n // Named export fallback - prioritize exports with 'binding' property (plugin classes)\n Constructor = Object.values(container).find(\n (exp) => typeof exp === \"function\" && (exp as any).binding !== undefined,\n );\n\n // Fallback to any function export if no binding found\n if (!Constructor) {\n Constructor = Object.values(container).find(\n (exp) => typeof exp === \"function\" && exp.prototype?.constructor === exp,\n );\n }\n }\n\n if (!Constructor || typeof Constructor !== \"function\") {\n const containerInfo =\n typeof container === \"object\"\n ? `Available exports: ${Object.keys(container).join(\", \")}`\n : `Container type: ${typeof container}`;\n\n throw new Error(\n `No valid plugin constructor found for '${pluginId}'.\\n` +\n `Supported patterns:\\n` +\n ` - export const YourPlugin = createPlugin({...})\\n` +\n ` - export default createPlugin({...})\\n` +\n `${containerInfo}`,\n );\n }\n\n // Validate it looks like a plugin constructor (has binding property)\n if (!(Constructor as any).binding) {\n const containerInfo =\n typeof container === \"object\"\n ? `Found exports: ${Object.keys(container).join(\", \")}`\n : `Container type: ${typeof container}`;\n\n throw new Error(\n `Invalid plugin constructor for '${pluginId}'. ` +\n `The exported value must be created with createPlugin(). ` +\n `Found a function but it's missing the required 'binding' property.\\n` +\n `${containerInfo}`,\n );\n }\n\n return Constructor;\n },\n catch: (error): ModuleFederationError =>\n new ModuleFederationError({\n pluginId,\n remoteUrl: url,\n cause: error instanceof Error ? error : new Error(String(error)),\n }),\n });\n\n yield* Effect.logInfo(`[MF][${pluginId}] ✅ Loaded constructor`);\n return pluginConstructor;\n }),\n };\n }),\n);\n"],"mappings":"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"}
|
|
@@ -1,24 +1,4 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
const require_identity = require('../../identity.cjs');
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Normalizes a package name into the module federation remote name.
|
|
6
|
-
* This function must produce identical results in both runtime and build contexts.
|
|
7
|
-
*
|
|
8
|
-
* Normalization rules:
|
|
9
|
-
* - Convert to lowercase
|
|
10
|
-
* - Strip a single leading '@' symbol
|
|
11
|
-
* - Replace '/' with '_'
|
|
12
|
-
* - Preserve hyphens and other characters
|
|
13
|
-
*
|
|
14
|
-
* Examples:
|
|
15
|
-
* - "@scope/my-plugin" → "scope_my-plugin"
|
|
16
|
-
* - "@SCOPE/Foo/Bar" → "scope_foo_bar"
|
|
17
|
-
* - "foo/bar" → "foo_bar"
|
|
18
|
-
* - "simple-plugin" → "simple-plugin"
|
|
19
|
-
*/
|
|
20
|
-
const getNormalizedRemoteName = (name) => name.toLowerCase().replace(/^@/, "").replace(/\//g, "_");
|
|
21
|
-
|
|
22
|
-
//#endregion
|
|
23
|
-
exports.getNormalizedRemoteName = getNormalizedRemoteName;
|
|
24
|
-
//# sourceMappingURL=normalize.cjs.map
|
|
4
|
+
exports.getNormalizedRemoteName = require_identity.remoteName;
|
|
@@ -1,21 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* Normalizes a package name into the module federation remote name.
|
|
4
|
-
* This function must produce identical results in both runtime and build contexts.
|
|
5
|
-
*
|
|
6
|
-
* Normalization rules:
|
|
7
|
-
* - Convert to lowercase
|
|
8
|
-
* - Strip a single leading '@' symbol
|
|
9
|
-
* - Replace '/' with '_'
|
|
10
|
-
* - Preserve hyphens and other characters
|
|
11
|
-
*
|
|
12
|
-
* Examples:
|
|
13
|
-
* - "@scope/my-plugin" → "scope_my-plugin"
|
|
14
|
-
* - "@SCOPE/Foo/Bar" → "scope_foo_bar"
|
|
15
|
-
* - "foo/bar" → "foo_bar"
|
|
16
|
-
* - "simple-plugin" → "simple-plugin"
|
|
17
|
-
*/
|
|
18
|
-
declare const getNormalizedRemoteName: (name: string) => string;
|
|
19
|
-
//#endregion
|
|
20
|
-
export { getNormalizedRemoteName };
|
|
21
|
-
//# sourceMappingURL=normalize.d.cts.map
|
|
1
|
+
import { remoteName } from "../../identity.cjs";
|
|
2
|
+
export { remoteName as getNormalizedRemoteName };
|
|
@@ -1,21 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* Normalizes a package name into the module federation remote name.
|
|
4
|
-
* This function must produce identical results in both runtime and build contexts.
|
|
5
|
-
*
|
|
6
|
-
* Normalization rules:
|
|
7
|
-
* - Convert to lowercase
|
|
8
|
-
* - Strip a single leading '@' symbol
|
|
9
|
-
* - Replace '/' with '_'
|
|
10
|
-
* - Preserve hyphens and other characters
|
|
11
|
-
*
|
|
12
|
-
* Examples:
|
|
13
|
-
* - "@scope/my-plugin" → "scope_my-plugin"
|
|
14
|
-
* - "@SCOPE/Foo/Bar" → "scope_foo_bar"
|
|
15
|
-
* - "foo/bar" → "foo_bar"
|
|
16
|
-
* - "simple-plugin" → "simple-plugin"
|
|
17
|
-
*/
|
|
18
|
-
declare const getNormalizedRemoteName: (name: string) => string;
|
|
19
|
-
//#endregion
|
|
20
|
-
export { getNormalizedRemoteName };
|
|
21
|
-
//# sourceMappingURL=normalize.d.mts.map
|
|
1
|
+
import { remoteName } from "../../identity.mjs";
|
|
2
|
+
export { remoteName as getNormalizedRemoteName };
|
|
@@ -1,22 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* Normalizes a package name into the module federation remote name.
|
|
4
|
-
* This function must produce identical results in both runtime and build contexts.
|
|
5
|
-
*
|
|
6
|
-
* Normalization rules:
|
|
7
|
-
* - Convert to lowercase
|
|
8
|
-
* - Strip a single leading '@' symbol
|
|
9
|
-
* - Replace '/' with '_'
|
|
10
|
-
* - Preserve hyphens and other characters
|
|
11
|
-
*
|
|
12
|
-
* Examples:
|
|
13
|
-
* - "@scope/my-plugin" → "scope_my-plugin"
|
|
14
|
-
* - "@SCOPE/Foo/Bar" → "scope_foo_bar"
|
|
15
|
-
* - "foo/bar" → "foo_bar"
|
|
16
|
-
* - "simple-plugin" → "simple-plugin"
|
|
17
|
-
*/
|
|
18
|
-
const getNormalizedRemoteName = (name) => name.toLowerCase().replace(/^@/, "").replace(/\//g, "_");
|
|
1
|
+
import { remoteName } from "../../identity.mjs";
|
|
19
2
|
|
|
20
|
-
|
|
21
|
-
export { getNormalizedRemoteName };
|
|
22
|
-
//# sourceMappingURL=normalize.mjs.map
|
|
3
|
+
export { remoteName as getNormalizedRemoteName };
|