every-plugin 0.1.0 → 0.1.1

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.
Files changed (63) hide show
  1. package/README.md +1 -329
  2. package/dist/errors.d.ts +4 -4
  3. package/dist/errors.js +10 -10
  4. package/dist/index.d.ts +2 -4
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +1 -3
  7. package/dist/plugin.d.ts +89 -103
  8. package/dist/plugin.d.ts.map +1 -1
  9. package/dist/plugin.js +104 -23
  10. package/dist/runtime/errors.d.ts +36 -53
  11. package/dist/runtime/errors.js +8 -8
  12. package/dist/runtime/index.d.ts +17 -66
  13. package/dist/runtime/index.d.ts.map +1 -1
  14. package/dist/runtime/index.js +22 -126
  15. package/dist/runtime/services/module-federation.service.d.ts +10 -38
  16. package/dist/runtime/services/module-federation.service.d.ts.map +1 -1
  17. package/dist/runtime/services/module-federation.service.js +139 -124
  18. package/dist/runtime/services/plugin.service.d.ts +21 -67
  19. package/dist/runtime/services/plugin.service.d.ts.map +1 -1
  20. package/dist/runtime/services/plugin.service.js +263 -328
  21. package/dist/runtime/services/secrets.service.d.ts +9 -29
  22. package/dist/runtime/services/secrets.service.js +26 -30
  23. package/dist/runtime/services.d.ts +1 -1
  24. package/dist/runtime/streaming/index.d.ts +4 -0
  25. package/dist/runtime/streaming/index.d.ts.map +1 -0
  26. package/dist/runtime/streaming/index.js +2 -0
  27. package/dist/runtime/streaming/state-effects.d.ts +28 -0
  28. package/dist/runtime/streaming/state-effects.d.ts.map +1 -0
  29. package/dist/runtime/streaming/state-effects.js +30 -0
  30. package/dist/runtime/streaming/streaming.d.ts +8 -0
  31. package/dist/runtime/streaming/streaming.d.ts.map +1 -0
  32. package/dist/runtime/streaming/streaming.js +107 -0
  33. package/dist/runtime/streaming/types.d.ts +19 -0
  34. package/dist/runtime/streaming/types.d.ts.map +1 -0
  35. package/dist/runtime/streaming/types.js +1 -0
  36. package/dist/runtime/test-utils.d.ts +1 -1
  37. package/dist/runtime/test-utils.js +4 -10
  38. package/dist/runtime/types.d.ts +28 -28
  39. package/dist/runtime/types.d.ts.map +1 -1
  40. package/dist/runtime/validation.d.ts +2 -7
  41. package/dist/runtime/validation.js +11 -14
  42. package/dist/testing/index.d.ts +25 -0
  43. package/dist/testing/index.d.ts.map +1 -0
  44. package/dist/testing/index.js +40 -0
  45. package/dist/testing/mocks/module-federation.service.d.ts +8 -0
  46. package/dist/testing/mocks/module-federation.service.d.ts.map +1 -0
  47. package/dist/testing/mocks/module-federation.service.js +35 -0
  48. package/package.json +21 -4
  49. package/dist/runtime/mf.test.d.ts +0 -2
  50. package/dist/runtime/mf.test.d.ts.map +0 -1
  51. package/dist/runtime/mf.test.js +0 -135
  52. package/dist/runtime/runtime.test.d.ts +0 -2
  53. package/dist/runtime/runtime.test.d.ts.map +0 -1
  54. package/dist/runtime/runtime.test.js +0 -378
  55. package/dist/runtime/streaming.d.ts +0 -29
  56. package/dist/runtime/streaming.d.ts.map +0 -1
  57. package/dist/runtime/streaming.js +0 -59
  58. package/dist/runtime/streaming.test.d.ts +0 -2
  59. package/dist/runtime/streaming.test.d.ts.map +0 -1
  60. package/dist/runtime/streaming.test.js +0 -271
  61. package/dist/source.d.ts +0 -70
  62. package/dist/source.d.ts.map +0 -1
  63. package/dist/source.js +0 -37
@@ -1,131 +1,146 @@
1
1
  import { betterFetch } from "@better-fetch/fetch";
2
- import {
3
- createInstance,
4
- getInstance,
5
- } from "@module-federation/enhanced/runtime";
2
+ import { createInstance, getInstance, } from "@module-federation/enhanced/runtime";
6
3
  import { setGlobalFederationInstance } from "@module-federation/runtime-core";
7
- import * as EffectModule from "effect";
8
4
  import { Effect, Layer } from "effect";
9
- import * as ZodModule from "zod";
10
5
  import { ModuleFederationError } from "../errors";
11
-
12
- const createModuleFederationInstance = Effect.cached(
13
- Effect.sync(() => {
14
- try {
15
- let instance = getInstance();
16
- if (!instance) {
17
- instance = createInstance({
18
- name: "host",
19
- remotes: [],
20
- shared: {
21
- effect: {
22
- shareConfig: {
23
- singleton: true,
24
- requiredVersion: "^3.17.6",
25
- eager: true,
26
- },
27
- lib: () => EffectModule,
28
- },
29
- zod: {
30
- shareConfig: {
31
- singleton: true,
32
- requiredVersion: "^4.0.8",
33
- eager: true,
34
- },
35
- lib: () => ZodModule,
36
- },
37
- },
38
- });
39
- setGlobalFederationInstance(instance);
40
- }
41
- return instance;
42
- } catch (error) {
43
- throw new Error(`Failed to initialize Module Federation: ${error}`);
44
- }
45
- }),
46
- );
47
- export class ModuleFederationService extends Effect.Tag(
48
- "ModuleFederationService",
49
- )() {
50
- static Live = Layer.effect(
51
- ModuleFederationService,
52
- Effect.gen(function* () {
53
- const mf = yield* Effect.flatten(createModuleFederationInstance);
54
- return {
55
- registerRemote: (pluginId, url) =>
56
- Effect.gen(function* () {
57
- // Check if remote is available
58
- const { error } = yield* Effect.tryPromise({
59
- try: () => betterFetch(url, { method: "HEAD" }),
60
- catch: (error) =>
61
- new ModuleFederationError({
62
- pluginId,
63
- remoteUrl: url,
64
- cause:
65
- error instanceof Error ? error : new Error(String(error)),
66
- }),
67
- });
68
- if (error) {
69
- return yield* Effect.fail(
70
- new ModuleFederationError({
71
- pluginId,
72
- remoteUrl: url,
73
- cause: new Error(`Remote not available: ${error}`),
74
- }),
75
- );
76
- }
77
- // Register remote
78
- const remoteName = pluginId
79
- .toLowerCase()
80
- .replace("@", "")
81
- .replace("/", "_");
82
- yield* Effect.try({
83
- try: () => mf.registerRemotes([{ name: remoteName, entry: url }]),
84
- catch: (error) =>
85
- new ModuleFederationError({
86
- pluginId,
87
- remoteUrl: url,
88
- cause:
89
- error instanceof Error ? error : new Error(String(error)),
90
- }),
91
- });
92
- }),
93
- loadRemoteConstructor: (pluginId, url) =>
94
- Effect.gen(function* () {
95
- const remoteName = pluginId
96
- .toLowerCase()
97
- .replace("@", "")
98
- .replace("/", "_");
99
- const modulePath = `${remoteName}/plugin`;
100
- return yield* Effect.tryPromise({
101
- try: async () => {
102
- const container = await mf.loadRemote(modulePath);
103
- if (!container) {
104
- throw new Error(`No container returned for ${modulePath}`);
105
- }
106
- const Constructor =
107
- typeof container === "function"
108
- ? container
109
- : container?.default;
110
- if (!Constructor || typeof Constructor !== "function") {
111
- throw new Error(
112
- `No valid constructor found. Container type: ${typeof container}`,
113
- );
114
- }
115
- return Constructor;
116
- },
117
- catch: (error) =>
118
- new ModuleFederationError({
119
- pluginId,
120
- remoteUrl: url,
121
- cause:
122
- error instanceof Error ? error : new Error(String(error)),
123
- }),
124
- });
125
- }),
126
- };
127
- }),
128
- );
6
+ const normalizePluginId = (pluginId) => {
7
+ return pluginId
8
+ .toLowerCase()
9
+ .replace(/^@/, "")
10
+ .replace(/\//g, "_");
11
+ };
12
+ const createModuleFederationInstance = Effect.cached(Effect.sync(() => {
13
+ try {
14
+ let instance = getInstance();
15
+ if (!instance) {
16
+ instance = createInstance({
17
+ name: "host",
18
+ remotes: [],
19
+ shared: {
20
+ effect: {
21
+ shareConfig: {
22
+ singleton: true,
23
+ requiredVersion: "^3.17.0",
24
+ eager: false,
25
+ strictVersion: false,
26
+ },
27
+ },
28
+ zod: {
29
+ shareConfig: {
30
+ singleton: true,
31
+ requiredVersion: "^4.0.0",
32
+ eager: false,
33
+ strictVersion: false,
34
+ },
35
+ },
36
+ "@orpc/contract": {
37
+ shareConfig: {
38
+ singleton: true,
39
+ requiredVersion: "^1.8.0",
40
+ eager: false,
41
+ strictVersion: false,
42
+ },
43
+ },
44
+ "@orpc/server": {
45
+ shareConfig: {
46
+ singleton: true,
47
+ requiredVersion: "^1.8.0",
48
+ eager: false,
49
+ strictVersion: false,
50
+ },
51
+ },
52
+ "@module-federation/enhanced": {
53
+ shareConfig: {
54
+ singleton: true,
55
+ requiredVersion: "^0.18.0",
56
+ eager: false,
57
+ strictVersion: false,
58
+ },
59
+ },
60
+ "@module-federation/runtime-core": {
61
+ shareConfig: {
62
+ singleton: true,
63
+ requiredVersion: "^0.18.0",
64
+ eager: false,
65
+ strictVersion: false,
66
+ },
67
+ },
68
+ },
69
+ });
70
+ setGlobalFederationInstance(instance);
71
+ }
72
+ return instance;
73
+ }
74
+ catch (error) {
75
+ throw new Error(`Failed to initialize Module Federation: ${error}`);
76
+ }
77
+ }));
78
+ export class ModuleFederationService extends Effect.Tag("ModuleFederationService")() {
79
+ static Live = Layer.effect(ModuleFederationService, Effect.gen(function* () {
80
+ const mf = yield* Effect.flatten(createModuleFederationInstance);
81
+ return {
82
+ registerRemote: (pluginId, url) => Effect.gen(function* () {
83
+ console.log(`[MF] Registering ${pluginId}`);
84
+ // Check if remote is available
85
+ const { error } = yield* Effect.tryPromise({
86
+ try: () => betterFetch(url, { method: "HEAD" }),
87
+ catch: (error) => new ModuleFederationError({
88
+ pluginId,
89
+ remoteUrl: url,
90
+ cause: error instanceof Error ? error : new Error(String(error)),
91
+ }),
92
+ });
93
+ if (error) {
94
+ console.log(`[MF] ❌ Remote not available for ${pluginId}`);
95
+ return yield* Effect.fail(new ModuleFederationError({
96
+ pluginId,
97
+ remoteUrl: url,
98
+ cause: new Error(`Remote not available (${url}): ${JSON.stringify(error)}`),
99
+ }));
100
+ }
101
+ // Register remote
102
+ const remoteName = pluginId
103
+ .toLowerCase()
104
+ .replace(/^@/, "")
105
+ .replace(/\//g, "_");
106
+ yield* Effect.try({
107
+ try: () => mf.registerRemotes([{ name: remoteName, entry: url }]),
108
+ catch: (error) => new ModuleFederationError({
109
+ pluginId,
110
+ remoteUrl: url,
111
+ cause: error instanceof Error ? error : new Error(String(error)),
112
+ }),
113
+ });
114
+ console.log(`[MF] ✅ Registered ${pluginId}`);
115
+ }),
116
+ loadRemoteConstructor: (pluginId, url) => Effect.gen(function* () {
117
+ const remoteName = normalizePluginId(pluginId);
118
+ console.log(`[MF] Loading remote ${remoteName}`);
119
+ const modulePath = `${remoteName}/plugin`;
120
+ return yield* Effect.tryPromise({
121
+ try: async () => {
122
+ const container = await mf.loadRemote(modulePath);
123
+ if (!container) {
124
+ throw new Error(`No container returned for ${modulePath}`);
125
+ }
126
+ const Constructor = typeof container === "function"
127
+ ? container
128
+ : container?.default;
129
+ if (!Constructor || typeof Constructor !== "function") {
130
+ throw new Error(`No valid constructor found. Container type: ${typeof container}`);
131
+ }
132
+ console.log(`[MF] ✅ Loaded constructor for ${pluginId}`);
133
+ return Constructor;
134
+ },
135
+ catch: (error) => new ModuleFederationError({
136
+ pluginId,
137
+ remoteUrl: url,
138
+ cause: error instanceof Error ? error : new Error(String(error)),
139
+ }),
140
+ });
141
+ }),
142
+ };
143
+ }));
129
144
  }
130
145
  export const ModuleFederationServiceTag = ModuleFederationService;
131
146
  export const ModuleFederationServiceLive = ModuleFederationService.Live;
@@ -1,75 +1,29 @@
1
- import { Effect, Layer } from "effect";
2
- import { PluginLoggerTag, type PluginRegistry } from "../../plugin";
1
+ import { Effect, Layer, type Stream } from "effect";
2
+ import type { z } from "zod";
3
+ import { type Plugin, PluginLoggerTag, type PluginRegistry } from "../../plugin";
3
4
  import { PluginRuntimeError } from "../errors";
4
- import type {
5
- AnyPlugin,
6
- InitializedPlugin,
7
- PluginConstructor,
8
- PluginInstance,
9
- SecretsConfig,
10
- } from "../types";
5
+ import { type StreamingOptions } from "../streaming";
6
+ import type { AnyPlugin, InitializedPlugin, PluginConstructor, PluginInstance, SecretsConfig } from "../types";
11
7
  import { ModuleFederationService } from "./module-federation.service";
12
8
  import { SecretsService } from "./secrets.service";
13
9
  export interface IPluginService {
14
- readonly loadPlugin: (
15
- pluginId: string,
16
- ) => Effect.Effect<PluginConstructor, PluginRuntimeError>;
17
- readonly instantiatePlugin: <T extends AnyPlugin>(
18
- pluginConstructor: PluginConstructor,
19
- ) => Effect.Effect<PluginInstance<T>, PluginRuntimeError>;
20
- readonly initializePlugin: <T extends AnyPlugin>(
21
- pluginInstance: PluginInstance<T>,
22
- config: unknown,
23
- ) => Effect.Effect<InitializedPlugin<T>, PluginRuntimeError>;
24
- readonly executePlugin: <T extends AnyPlugin>(
25
- initializedPlugin: InitializedPlugin<T>,
26
- input: unknown,
27
- ) => Effect.Effect<any, PluginRuntimeError>;
28
- readonly usePlugin: <T extends AnyPlugin>(
29
- pluginId: string,
30
- config: unknown,
31
- ) => Effect.Effect<InitializedPlugin<T>, PluginRuntimeError>;
32
- readonly shutdownPlugin: (
33
- plugin: InitializedPlugin<AnyPlugin>,
34
- ) => Effect.Effect<void, PluginRuntimeError>;
35
- readonly clearCache: () => Effect.Effect<void, never>;
36
- readonly cleanup: () => Effect.Effect<void, never>;
10
+ readonly loadPlugin: (pluginId: string) => Effect.Effect<PluginConstructor, PluginRuntimeError>;
11
+ readonly instantiatePlugin: <T extends AnyPlugin>(pluginConstructor: PluginConstructor) => Effect.Effect<PluginInstance<T>, PluginRuntimeError>;
12
+ readonly initializePlugin: <T extends AnyPlugin>(pluginInstance: PluginInstance<T>, config: unknown) => Effect.Effect<InitializedPlugin<T>, PluginRuntimeError>;
13
+ readonly executePlugin: <T extends AnyPlugin>(initializedPlugin: InitializedPlugin<T>, input: z.infer<T["inputSchema"]>) => Effect.Effect<z.infer<T["outputSchema"]>, PluginRuntimeError>;
14
+ readonly usePlugin: <T extends AnyPlugin>(pluginId: string, config: unknown) => Effect.Effect<InitializedPlugin<T>, PluginRuntimeError>;
15
+ readonly streamPlugin: <T extends Plugin, TInput extends z.infer<T["inputSchema"]> = z.infer<T["inputSchema"]>, TItem = unknown, TPluginState extends z.infer<T["stateSchema"]> = z.infer<T["stateSchema"]>>(pluginId: string, config: z.infer<T["configSchema"]>, input: TInput, options?: StreamingOptions<TItem, TPluginState>) => Effect.Effect<Stream.Stream<TItem, PluginRuntimeError>, PluginRuntimeError>;
16
+ readonly shutdownPlugin: (plugin: InitializedPlugin<AnyPlugin>) => Effect.Effect<void, PluginRuntimeError>;
17
+ readonly clearCache: () => Effect.Effect<void, never>;
18
+ readonly cleanup: () => Effect.Effect<void, never>;
37
19
  }
38
- declare const PluginService_base: import("effect/Context").TagClass<
39
- PluginService,
40
- "PluginService",
41
- IPluginService
42
- > &
43
- Effect.Tag.Proxy<PluginService, IPluginService> & {
44
- use: <X>(
45
- body: (_: IPluginService) => X,
46
- ) => [X] extends [Effect.Effect<infer A, infer E, infer R>]
47
- ? Effect.Effect<A, E, R | PluginService>
48
- : [X] extends [PromiseLike<infer A_1>]
49
- ? Effect.Effect<
50
- A_1,
51
- import("effect/Cause").UnknownException,
52
- PluginService
53
- >
54
- : Effect.Effect<X, never, PluginService>;
55
- };
20
+ declare const PluginService_base: import("effect/Context").TagClass<PluginService, "PluginService", IPluginService> & Effect.Tag.Proxy<PluginService, IPluginService> & {
21
+ use: <X>(body: (_: IPluginService) => X) => [X] extends [Effect.Effect<infer A, infer E, infer R>] ? Effect.Effect<A, E, R | PluginService> : [X] extends [PromiseLike<infer A_1>] ? Effect.Effect<A_1, import("effect/Cause").UnknownException, PluginService> : Effect.Effect<X, never, PluginService>;
22
+ };
56
23
  export declare class PluginService extends PluginService_base {
57
- static Live: (
58
- registry: PluginRegistry,
59
- secrets: SecretsConfig,
60
- ) => Layer.Layer<
61
- PluginService,
62
- never,
63
- PluginLoggerTag | SecretsService | ModuleFederationService
64
- >;
24
+ static Live: (registry: PluginRegistry, secrets: SecretsConfig) => Layer.Layer<PluginService, never, PluginLoggerTag | SecretsService | ModuleFederationService>;
65
25
  }
66
26
  export declare const PluginServiceTag: typeof PluginService;
67
- export declare const PluginServiceLive: (
68
- registry: PluginRegistry,
69
- secrets: SecretsConfig,
70
- ) => Layer.Layer<
71
- PluginService,
72
- never,
73
- PluginLoggerTag | SecretsService | ModuleFederationService
74
- >;
75
- //# sourceMappingURL=plugin.service.d.ts.map
27
+ export declare const PluginServiceLive: (registry: PluginRegistry, secrets: SecretsConfig) => Layer.Layer<PluginService, never, PluginLoggerTag | SecretsService | ModuleFederationService>;
28
+ export {};
29
+ //# sourceMappingURL=plugin.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.service.d.ts","sourceRoot":"","sources":["../../../src/runtime/services/plugin.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,MAAM,EAAQ,KAAK,EAAY,MAAM,QAAQ,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,KAAK,EACX,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,UAAU,EAAE,CACpB,QAAQ,EAAE,MAAM,KACZ,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;IAC1D,QAAQ,CAAC,iBAAiB,EAAE,CAAC,CAAC,SAAS,SAAS,EAC/C,iBAAiB,EAAE,iBAAiB,KAChC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAC1D,QAAQ,CAAC,gBAAgB,EAAE,CAAC,CAAC,SAAS,SAAS,EAC9C,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC,EACjC,MAAM,EAAE,OAAO,KACX,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAC7D,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,SAAS,SAAS,EAC3C,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC,EACvC,KAAK,EAAE,OAAO,KACV,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,SAAS,EACvC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,KACX,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAC7D,QAAQ,CAAC,cAAc,EAAE,CAAC,MAAM,EAAE,iBAAiB,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IAC3G,QAAQ,CAAC,UAAU,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACtD,QAAQ,CAAC,OAAO,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;CACnD;;;;AAED,qBAAa,aAAc,SAAQ,kBAGhC;IACF,MAAM,CAAC,IAAI,GAAI,UAAU,cAAc,EAAE,SAAS,aAAa,mGAiY5D;CACH;AAED,eAAO,MAAM,gBAAgB,sBAAgB,CAAC;AAC9C,eAAO,MAAM,iBAAiB,aArYJ,cAAc,WAAW,aAAa,kGAqYb,CAAC"}
1
+ {"version":3,"file":"plugin.service.d.ts","sourceRoot":"","sources":["../../../src/runtime/services/plugin.service.ts"],"names":[],"mappings":"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"}