@reventlessdev/reventless-core 3.0.0-alpha.145 → 3.0.0-alpha.146
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/CHANGELOG.md +7 -0
- package/package.json +7 -7
- package/src/admin/Platform_Admin.res +1 -0
- package/src/admin/Platform_Admin.res.mjs +4 -2
- package/src/plugin/component/Plugin_Builder.res +6 -0
- package/src/plugin/component/Plugin_Builder.res.mjs +2 -1
- package/src/plugin/component/Plugin_BuiltHook.res +5 -2
- package/src/plugin/lifecycle/PluginsProjection.res +1 -0
- package/src/plugin/lifecycle/PluginsProjection.res.mjs +2 -0
- package/src/plugin/lifecycle/PluginsReadModelSpec.res +7 -0
- package/src/plugin/lifecycle/PluginsReadModelSpec.res.mjs +20 -1
- package/tests/logger/LogFormatTest.res +2 -1
- package/tests/logger/LogFormatTest.res.mjs +3 -2
- package/tests/message/MessageTest.res +1 -0
- package/tests/message/MessageTest.res.mjs +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,13 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# 3.0.0-alpha.146 (2026-07-08)
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* **reventless-core:** classify plugins by kind in the lifecycle read model ([64e3f22](https://github.com/ReventlessDev/reventless-core/commit/64e3f22b8114a771886b7c8ec023e95971413c0b))
|
|
11
|
+
|
|
12
|
+
|
|
6
13
|
# 3.0.0-alpha.145 (2026-07-08)
|
|
7
14
|
|
|
8
15
|
### Bug Fixes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reventlessdev/reventless-core",
|
|
3
|
-
"version": "3.0.0-alpha.
|
|
3
|
+
"version": "3.0.0-alpha.146",
|
|
4
4
|
"description": "Core package for Reventless framework",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"jest": {
|
|
@@ -28,17 +28,17 @@
|
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"sury": "11.0.0-alpha.4",
|
|
30
30
|
"uuid": "^13.0.0",
|
|
31
|
-
"@reventlessdev/rescript-effect": "0.1.0-alpha.25",
|
|
32
31
|
"@reventlessdev/rescript-hash-object": "1.2.0-alpha.10",
|
|
33
|
-
"@reventlessdev/rescript-jest": "1.0.0-alpha.6",
|
|
34
32
|
"@reventlessdev/rescript-fast-csv": "1.2.0-alpha.11",
|
|
33
|
+
"@reventlessdev/rescript-effect": "0.1.0-alpha.25",
|
|
34
|
+
"@reventlessdev/rescript-jest": "1.0.0-alpha.6",
|
|
35
35
|
"@reventlessdev/rescript-node-streams": "1.1.0-alpha.10",
|
|
36
36
|
"@reventlessdev/rescript-pulumi-pulumi": "2.3.0-alpha.14",
|
|
37
|
-
"@reventlessdev/rescript-
|
|
38
|
-
"@reventlessdev/reventless-infra": "3.0.0-alpha.
|
|
39
|
-
"@reventlessdev/reventless-spec": "3.0.0-alpha.68",
|
|
37
|
+
"@reventlessdev/rescript-uuid": "1.1.0-alpha.14",
|
|
38
|
+
"@reventlessdev/reventless-infra": "3.0.0-alpha.91",
|
|
40
39
|
"@reventlessdev/reventless-interop": "3.0.0-alpha.24",
|
|
41
|
-
"@reventlessdev/
|
|
40
|
+
"@reventlessdev/reventless-spec": "3.0.0-alpha.69",
|
|
41
|
+
"@reventlessdev/rescript-ssh2": "1.1.0-alpha.11"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"rescript": "^12.3.0",
|
|
@@ -46,7 +46,8 @@ function Make(RuntimeEnvironment) {
|
|
|
46
46
|
apiTarget: undefined,
|
|
47
47
|
uiFragments: undefined,
|
|
48
48
|
structure: undefined,
|
|
49
|
-
dcbEventLog: undefined
|
|
49
|
+
dcbEventLog: undefined,
|
|
50
|
+
kind: "Domain"
|
|
50
51
|
};
|
|
51
52
|
let Callback = Admin_Callback$ReventlessCore.Make({
|
|
52
53
|
pluginDefinition: fakePluginDefinition,
|
|
@@ -187,7 +188,8 @@ function Make(RuntimeEnvironment) {
|
|
|
187
188
|
apiTarget: undefined,
|
|
188
189
|
uiFragments: undefined,
|
|
189
190
|
structure: undefined,
|
|
190
|
-
dcbEventLog: undefined
|
|
191
|
+
dcbEventLog: undefined,
|
|
192
|
+
kind: "Domain"
|
|
191
193
|
};
|
|
192
194
|
let Callback = Admin_Callback$ReventlessCore.Make({
|
|
193
195
|
pluginDefinition: fakePluginDefinition,
|
|
@@ -687,6 +687,12 @@ module Make = (
|
|
|
687
687
|
uiFragments,
|
|
688
688
|
structure: pluginStructure,
|
|
689
689
|
dcbEventLog: dcbEventLogDef,
|
|
690
|
+
// Business role from the deploy-time metadata registry (set via
|
|
691
|
+
// registerPluginMetadata). Unset → Domain. Rides the handshake to the
|
|
692
|
+
// plugin-lifecycle projection so the admin can segregate infrastructure.
|
|
693
|
+
kind: Plugin_Helpers.pluginMetadataRegistry.contents
|
|
694
|
+
->Option.flatMap(m => m.kind)
|
|
695
|
+
->Option.getOr(Plugin_Helpers.Domain),
|
|
690
696
|
})
|
|
691
697
|
|
|
692
698
|
// Bundled Plugin EventCollector reconstructs Extension_Operations at
|
|
@@ -462,7 +462,8 @@ function Make(Spec) {
|
|
|
462
462
|
apiTarget: capturedDeployTarget,
|
|
463
463
|
uiFragments: uiFragments,
|
|
464
464
|
structure: pluginStructure,
|
|
465
|
-
dcbEventLog: param[2]
|
|
465
|
+
dcbEventLog: param[2],
|
|
466
|
+
kind: Stdlib_Option.getOr(Stdlib_Option.flatMap(Plugin_Helpers$ReventlessCore.pluginMetadataRegistry.contents, m => m.kind), "Domain")
|
|
466
467
|
}));
|
|
467
468
|
let aggregateQueueUrls = {};
|
|
468
469
|
Object.entries(aggregateResources).forEach(param => {
|
|
@@ -12,8 +12,11 @@
|
|
|
12
12
|
// describe a plugin's role and origin.
|
|
13
13
|
// ---------------------------------------------------------------------------
|
|
14
14
|
|
|
15
|
-
/** Classifies the business role of a plugin. Absent defaults to Domain.
|
|
16
|
-
|
|
15
|
+
/** Classifies the business role of a plugin. Absent defaults to Domain.
|
|
16
|
+
Aliases the canonical `@schema` enum in `reventless-spec` (`Reventless.Plugin.pluginKind`)
|
|
17
|
+
so the deploy-time metadata registry and the serialized `pluginDefinition` share one
|
|
18
|
+
type — no mapping needed where metadata flows onto the definition. */
|
|
19
|
+
type pluginKind = Reventless.Plugin.pluginKind =
|
|
17
20
|
| Domain
|
|
18
21
|
| PlatformInfrastructure
|
|
19
22
|
| Commercial
|
|
@@ -58,6 +58,7 @@ let displayState = (
|
|
|
58
58
|
uiFragments: def.uiFragments,
|
|
59
59
|
structure: def.structure,
|
|
60
60
|
dcbEventLog: def.dcbEventLog,
|
|
61
|
+
kind: def.kind,
|
|
61
62
|
// The current version is never listed among the "other" connected versions.
|
|
62
63
|
otherConnectedVersions: otherConnectedVersions->Util.without(def.version),
|
|
63
64
|
}
|
|
@@ -74,6 +74,7 @@ function displayState(def, status, statusChange, otherConnectedVersions) {
|
|
|
74
74
|
let base_uiFragments = def.uiFragments;
|
|
75
75
|
let base_structure = def.structure;
|
|
76
76
|
let base_dcbEventLog = def.dcbEventLog;
|
|
77
|
+
let base_kind = def.kind;
|
|
77
78
|
let base_otherConnectedVersions = without(otherConnectedVersions, def.version);
|
|
78
79
|
let base = {
|
|
79
80
|
name: base_name,
|
|
@@ -89,6 +90,7 @@ function displayState(def, status, statusChange, otherConnectedVersions) {
|
|
|
89
90
|
uiFragments: base_uiFragments,
|
|
90
91
|
structure: base_structure,
|
|
91
92
|
dcbEventLog: base_dcbEventLog,
|
|
93
|
+
kind: base_kind,
|
|
92
94
|
otherConnectedVersions: base_otherConnectedVersions
|
|
93
95
|
};
|
|
94
96
|
let target = def.apiTarget;
|
|
@@ -37,6 +37,12 @@ type state = {
|
|
|
37
37
|
// from this plugin's DCB topic → peer EventCollectors (and vice-versa). None
|
|
38
38
|
// for pure-aggregate plugins or for plugins persisted before Phase 4.
|
|
39
39
|
dcbEventLog: @s.matches(Reventless.Plugin.dcbEventLogOptionSchema) option<Reventless.Plugin.dcbEventLogDefinition>,
|
|
40
|
+
// Business role of the plugin (from pluginDefinition.kind). Lets the admin Plugins
|
|
41
|
+
// view segregate PlatformInfrastructure / Commercial / Marketplace from Domain.
|
|
42
|
+
// @scan opts the field into server-side equality filtering so the connection gains
|
|
43
|
+
// a `kindEq` filter — the panel split (main list vs System/Infrastructure) pages
|
|
44
|
+
// correctly server-side rather than filtering a page client-side.
|
|
45
|
+
@scan kind: Reventless.Plugin.pluginKind,
|
|
40
46
|
// Other versions of this name that are currently **Connected** — excludes this
|
|
41
47
|
// row's own `version` (whose status is the `status` field above). Lets the
|
|
42
48
|
// projection recompute which version is current (highest Connected) during a
|
|
@@ -61,6 +67,7 @@ type queryResult = {
|
|
|
61
67
|
uiFragments: option<Reventless.Plugin.uiFragmentManifest>,
|
|
62
68
|
structure: option<Reventless.Plugin.pluginStructure>,
|
|
63
69
|
dcbEventLog: option<Reventless.Plugin.dcbEventLogDefinition>,
|
|
70
|
+
kind: Reventless.Plugin.pluginKind,
|
|
64
71
|
}
|
|
65
72
|
|
|
66
73
|
|
|
@@ -4,6 +4,7 @@ import * as S from "sury/src/S.res.mjs";
|
|
|
4
4
|
import * as Plugin$Reventless from "@reventlessdev/reventless-spec/src/components/Plugin.res.mjs";
|
|
5
5
|
import * as ReadModel$Reventless from "@reventlessdev/reventless-spec/src/components/ReadModel.res.mjs";
|
|
6
6
|
import * as Message$ReventlessCore from "../../Message.res.mjs";
|
|
7
|
+
import * as StateAnnotations$Reventless from "@reventlessdev/reventless-spec/src/components/StateAnnotations.res.mjs";
|
|
7
8
|
|
|
8
9
|
let statusSchema = S.union([
|
|
9
10
|
S.literal("Connected"),
|
|
@@ -27,11 +28,29 @@ let stateSchema = S.schema(s => ({
|
|
|
27
28
|
uiFragments: s.m(Plugin$Reventless.uiFragmentManifestOptionSchema),
|
|
28
29
|
structure: s.m(Plugin$Reventless.pluginStructureOptionSchema),
|
|
29
30
|
dcbEventLog: s.m(Plugin$Reventless.dcbEventLogOptionSchema),
|
|
31
|
+
kind: s.m(Plugin$Reventless.pluginKindSchema),
|
|
30
32
|
otherConnectedVersions: s.m(S.array(Plugin$Reventless.versionSchema))
|
|
31
33
|
}));
|
|
32
34
|
|
|
33
35
|
let config = ReadModel$Reventless.config(undefined, undefined, undefined);
|
|
34
36
|
|
|
37
|
+
let stateSchema$1 = S.Metadata.set(stateSchema, StateAnnotations$Reventless.stateAnnotationsId, {
|
|
38
|
+
ids: [],
|
|
39
|
+
compositeIds: [],
|
|
40
|
+
subIds: [],
|
|
41
|
+
compositeSubIds: [],
|
|
42
|
+
indexes: [],
|
|
43
|
+
hidden: [],
|
|
44
|
+
summary: [],
|
|
45
|
+
drillTargets: [],
|
|
46
|
+
drillTargetKeys: [],
|
|
47
|
+
collapsed: [],
|
|
48
|
+
scan: ["kind"],
|
|
49
|
+
scanSort: [],
|
|
50
|
+
status: undefined,
|
|
51
|
+
visibility: undefined
|
|
52
|
+
});
|
|
53
|
+
|
|
35
54
|
let name = "Plugins";
|
|
36
55
|
|
|
37
56
|
let Id;
|
|
@@ -48,9 +67,9 @@ export {
|
|
|
48
67
|
name,
|
|
49
68
|
Id,
|
|
50
69
|
statusSchema,
|
|
51
|
-
stateSchema,
|
|
52
70
|
config,
|
|
53
71
|
subIdConfig,
|
|
72
|
+
stateSchema$1 as stateSchema,
|
|
54
73
|
moduleUrl,
|
|
55
74
|
authorization,
|
|
56
75
|
visibility,
|
|
@@ -76,6 +76,7 @@ describe("LogFormat", () => {
|
|
|
76
76
|
uiFragments: None,
|
|
77
77
|
structure: None,
|
|
78
78
|
dcbEventLog: None,
|
|
79
|
+
kind: Domain,
|
|
79
80
|
}),
|
|
80
81
|
]
|
|
81
82
|
let meta: Message.meta = {
|
|
@@ -97,7 +98,7 @@ describe("LogFormat", () => {
|
|
|
97
98
|
},
|
|
98
99
|
)
|
|
99
100
|
let expected1 = `1/2: \x1b[1mHeartbeat\x1b[0m(0): {"command":{"TAG":"Heartbeat","_0":"0.0.0"},"meta":${metaStr},"id":"0"}`
|
|
100
|
-
let expected2 = `2/2: \x1b[1mConnect\x1b[0m(1): {"command":{"TAG":"Connect","_0":{"id":"id","name":"testName","version":"testVersion","extensionPoints":[{"name":"testExtensionPoint","commandTopic":"testCommandTopic","eventTopic":"testEventTopic"}],"extensions":[{"name":"testExtension","extensionPointName":"testExtensionPoint","dcbSources":[]}],"eventCollector":"testEventCollector","extensionProtocols":[],"apiSchemaFragment":null,"apiTarget":null,"uiFragments":null,"structure":null,"dcbEventLog":null}},"meta":${metaStr},"id":"1"}`
|
|
101
|
+
let expected2 = `2/2: \x1b[1mConnect\x1b[0m(1): {"command":{"TAG":"Connect","_0":{"id":"id","name":"testName","version":"testVersion","extensionPoints":[{"name":"testExtensionPoint","commandTopic":"testCommandTopic","eventTopic":"testEventTopic"}],"extensions":[{"name":"testExtension","extensionPointName":"testExtensionPoint","dcbSources":[]}],"eventCollector":"testEventCollector","extensionProtocols":[],"apiSchemaFragment":null,"apiTarget":null,"uiFragments":null,"structure":null,"dcbEventLog":null,"kind":"Domain"}},"meta":${metaStr},"id":"1"}`
|
|
101
102
|
expect(commandJsonsToLogMessages(arr))->toEqual([expected1, expected2])
|
|
102
103
|
},
|
|
103
104
|
)
|
|
@@ -76,7 +76,8 @@ globalThis.describe("LogFormat", () => {
|
|
|
76
76
|
apiTarget: undefined,
|
|
77
77
|
uiFragments: undefined,
|
|
78
78
|
structure: undefined,
|
|
79
|
-
dcbEventLog: undefined
|
|
79
|
+
dcbEventLog: undefined,
|
|
80
|
+
kind: "Domain"
|
|
80
81
|
}
|
|
81
82
|
}
|
|
82
83
|
];
|
|
@@ -95,7 +96,7 @@ globalThis.describe("LogFormat", () => {
|
|
|
95
96
|
commandJson: Message$ReventlessCore.encode(command, PluginSpec$ReventlessCore.commandSchema)
|
|
96
97
|
}));
|
|
97
98
|
let expected1 = `1/2: \x1b[1mHeartbeat\x1b[0m(0): {"command":{"TAG":"Heartbeat","_0":"0.0.0"},"meta":` + metaStr + `,"id":"0"}`;
|
|
98
|
-
let expected2 = `2/2: \x1b[1mConnect\x1b[0m(1): {"command":{"TAG":"Connect","_0":{"id":"id","name":"testName","version":"testVersion","extensionPoints":[{"name":"testExtensionPoint","commandTopic":"testCommandTopic","eventTopic":"testEventTopic"}],"extensions":[{"name":"testExtension","extensionPointName":"testExtensionPoint","dcbSources":[]}],"eventCollector":"testEventCollector","extensionProtocols":[],"apiSchemaFragment":null,"apiTarget":null,"uiFragments":null,"structure":null,"dcbEventLog":null}},"meta":` + metaStr + `,"id":"1"}`;
|
|
99
|
+
let expected2 = `2/2: \x1b[1mConnect\x1b[0m(1): {"command":{"TAG":"Connect","_0":{"id":"id","name":"testName","version":"testVersion","extensionPoints":[{"name":"testExtensionPoint","commandTopic":"testCommandTopic","eventTopic":"testEventTopic"}],"extensions":[{"name":"testExtension","extensionPointName":"testExtensionPoint","dcbSources":[]}],"eventCollector":"testEventCollector","extensionProtocols":[],"apiSchemaFragment":null,"apiTarget":null,"uiFragments":null,"structure":null,"dcbEventLog":null,"kind":"Domain"}},"meta":` + metaStr + `,"id":"1"}`;
|
|
99
100
|
globalThis.expect(LogFormat$ReventlessCore.commandJsonsToLogMessages(arr)).toEqual([
|
|
100
101
|
expected1,
|
|
101
102
|
expected2
|
|
@@ -43,7 +43,8 @@ globalThis.describe("Message should", () => {
|
|
|
43
43
|
apiTarget: undefined,
|
|
44
44
|
uiFragments: undefined,
|
|
45
45
|
structure: undefined,
|
|
46
|
-
dcbEventLog: undefined
|
|
46
|
+
dcbEventLog: undefined,
|
|
47
|
+
kind: "Domain"
|
|
47
48
|
}
|
|
48
49
|
};
|
|
49
50
|
let variantJson = Message$ReventlessCore.encode(variant, PluginSpec$ReventlessCore.commandSchema);
|