@bluelibs/runner-dev 6.2.0 → 6.3.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/README.md +131 -12
- package/dist/cli/generators/initUtils.js +1 -1
- package/dist/cli/generators/initUtils.js.map +1 -1
- package/dist/cli/generators/scaffold/templates/README.md.js +17 -4
- package/dist/cli/generators/scaffold/templates/README.md.js.map +1 -1
- package/dist/cli/generators/scaffold/templates/index.d.ts +2 -1
- package/dist/cli/generators/scaffold/templates/index.js +5 -3
- package/dist/cli/generators/scaffold/templates/index.js.map +1 -1
- package/dist/cli/generators/scaffold/templates/package.json.d.ts +7 -2
- package/dist/cli/generators/scaffold/templates/package.json.js +7 -2
- package/dist/cli/generators/scaffold/templates/package.json.js.map +1 -1
- package/dist/cli/generators/scaffold/templates/src/app.test.ts.d.ts +1 -0
- package/dist/cli/generators/scaffold/templates/src/app.test.ts.js +29 -0
- package/dist/cli/generators/scaffold/templates/src/app.test.ts.js.map +1 -0
- package/dist/cli/generators/scaffold/templates/src/app.ts.d.ts +1 -0
- package/dist/cli/generators/scaffold/templates/src/app.ts.js +15 -0
- package/dist/cli/generators/scaffold/templates/src/app.ts.js.map +1 -0
- package/dist/cli/generators/scaffold/templates/src/main.ts.js +3 -10
- package/dist/cli/generators/scaffold/templates/src/main.ts.js.map +1 -1
- package/dist/cli/generators/scaffold/templates/tsconfig.json.d.ts +2 -0
- package/dist/cli/generators/scaffold/templates/tsconfig.json.js +2 -0
- package/dist/cli/generators/scaffold/templates/tsconfig.json.js.map +1 -1
- package/dist/cli/generators/scaffold.js +2 -1
- package/dist/cli/generators/scaffold.js.map +1 -1
- package/dist/cli.js +0 -0
- package/dist/docs/packageDocs.d.ts +16 -0
- package/dist/docs/packageDocs.js +107 -0
- package/dist/docs/packageDocs.js.map +1 -0
- package/dist/exportDocs.d.ts +10 -0
- package/dist/exportDocs.js +98 -0
- package/dist/exportDocs.js.map +1 -0
- package/dist/generated/resolvers-types.d.ts +114 -29
- package/dist/index.d.ts +4 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/env.d.ts +5 -0
- package/dist/mcp/env.js +30 -1
- package/dist/mcp/env.js.map +1 -1
- package/dist/mcp/help.d.ts +8 -1
- package/dist/mcp/help.js +30 -4
- package/dist/mcp/help.js.map +1 -1
- package/dist/mcp/http.js +10 -0
- package/dist/mcp/http.js.map +1 -1
- package/dist/mcp/projectOverview.js +13 -4
- package/dist/mcp/projectOverview.js.map +1 -1
- package/dist/mcp/snapshot.d.ts +22 -0
- package/dist/mcp/snapshot.js +347 -0
- package/dist/mcp/snapshot.js.map +1 -0
- package/dist/mcp/tools/graphql.mutation.js +4 -1
- package/dist/mcp/tools/graphql.mutation.js.map +1 -1
- package/dist/mcp/tools/graphql.ping.js +1 -1
- package/dist/mcp/tools/graphql.ping.js.map +1 -1
- package/dist/mcp/tools/graphql.query.js +1 -1
- package/dist/mcp/tools/graphql.query.js.map +1 -1
- package/dist/mcp/tools/help.read.js +7 -5
- package/dist/mcp/tools/help.read.js.map +1 -1
- package/dist/mcp/tools/help.runner.js +3 -1
- package/dist/mcp/tools/help.runner.js.map +1 -1
- package/dist/mcp/tools/help.runnerDev.js +4 -4
- package/dist/mcp/tools/help.runnerDev.js.map +1 -1
- package/dist/mcp.js +4 -9
- package/dist/mcp.js.map +1 -1
- package/dist/resources/docsPayload.d.ts +33 -0
- package/dist/resources/docsPayload.js +171 -0
- package/dist/resources/docsPayload.js.map +1 -0
- package/dist/resources/docsUiAssets.d.ts +27 -0
- package/dist/resources/docsUiAssets.js +150 -0
- package/dist/resources/docsUiAssets.js.map +1 -0
- package/dist/resources/graphql-accumulator.resource.d.ts +1 -0
- package/dist/resources/graphql-accumulator.resource.js +30 -26
- package/dist/resources/graphql-accumulator.resource.js.map +1 -1
- package/dist/resources/live.resource.js +1 -1
- package/dist/resources/live.resource.js.map +1 -1
- package/dist/resources/models/Introspector.d.ts +12 -0
- package/dist/resources/models/Introspector.js +51 -28
- package/dist/resources/models/Introspector.js.map +1 -1
- package/dist/resources/models/initializeFromStore.js +5 -5
- package/dist/resources/models/initializeFromStore.js.map +1 -1
- package/dist/resources/models/initializeFromStore.utils.d.ts +2 -2
- package/dist/resources/models/initializeFromStore.utils.js +395 -68
- package/dist/resources/models/initializeFromStore.utils.js.map +1 -1
- package/dist/resources/models/introspector.tools.js +88 -4
- package/dist/resources/models/introspector.tools.js.map +1 -1
- package/dist/resources/routeHandlers/createDocsServeHandler.js +13 -37
- package/dist/resources/routeHandlers/createDocsServeHandler.js.map +1 -1
- package/dist/resources/routeHandlers/getDocsData.d.ts +1 -6
- package/dist/resources/routeHandlers/getDocsData.js +10 -168
- package/dist/resources/routeHandlers/getDocsData.js.map +1 -1
- package/dist/resources/server.resource.js +0 -1
- package/dist/resources/server.resource.js.map +1 -1
- package/dist/resources/ui.static.js +4 -9
- package/dist/resources/ui.static.js.map +1 -1
- package/dist/schema/model.d.ts +18 -0
- package/dist/schema/model.js +14 -0
- package/dist/schema/model.js.map +1 -1
- package/dist/schema/query.js +3 -3
- package/dist/schema/query.js.map +1 -1
- package/dist/schema/types/AllType.js +2 -21
- package/dist/schema/types/AllType.js.map +1 -1
- package/dist/schema/types/ErrorType.js +1 -3
- package/dist/schema/types/ErrorType.js.map +1 -1
- package/dist/schema/types/EventType.js +6 -19
- package/dist/schema/types/EventType.js.map +1 -1
- package/dist/schema/types/HookType.js +4 -16
- package/dist/schema/types/HookType.js.map +1 -1
- package/dist/schema/types/ResourceType.js +50 -23
- package/dist/schema/types/ResourceType.js.map +1 -1
- package/dist/schema/types/TaskLikeCommon.js +2 -2
- package/dist/schema/types/TaskLikeCommon.js.map +1 -1
- package/dist/schema/types/TaskType.js +6 -19
- package/dist/schema/types/TaskType.js.map +1 -1
- package/dist/schema/types/middleware/UsageTypes.d.ts +1 -0
- package/dist/schema/types/middleware/UsageTypes.js +16 -5
- package/dist/schema/types/middleware/UsageTypes.js.map +1 -1
- package/dist/schema/types/middleware/common.js +2 -2
- package/dist/schema/types/middleware/common.js.map +1 -1
- package/dist/ui/.vite/manifest.json +2 -2
- package/dist/ui/assets/docs-Beb_xRuE.js +304 -0
- package/dist/ui/assets/docs-Beb_xRuE.js.map +1 -0
- package/dist/ui/assets/docs-lid1amCk.css +1 -0
- package/dist/ui/docs/favicon.ico +0 -0
- package/dist/utils/lane-resources.d.ts +69 -0
- package/dist/utils/lane-resources.js +145 -0
- package/dist/utils/lane-resources.js.map +1 -1
- package/dist/utils/runner-namespace.d.ts +1 -0
- package/dist/utils/runner-namespace.js +9 -0
- package/dist/utils/runner-namespace.js.map +1 -0
- package/dist/utils/schemaFormat.d.ts +6 -0
- package/dist/utils/schemaFormat.js +244 -0
- package/dist/utils/schemaFormat.js.map +1 -0
- package/dist/utils/system-namespace.d.ts +1 -0
- package/dist/utils/system-namespace.js +9 -0
- package/dist/utils/system-namespace.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +21 -5
- package/readmes/API_REFERENCE.md +364 -0
- package/readmes/COMPACT_GUIDE.md +254 -0
- package/skills/core/SKILL.md +27 -0
- package/skills/core/references/readmes/API_REFERENCE.md +364 -0
- package/skills/core/references/readmes/COMPACT_GUIDE.md +254 -0
- package/AI.md +0 -630
- package/dist/ui/assets/docs-CWJO6emS.css +0 -1
- package/dist/ui/assets/docs-Zej7hPlV.js +0 -302
- package/dist/ui/assets/docs-Zej7hPlV.js.map +0 -1
- package/readmes/runner-AI.md +0 -917
- package/readmes/runner-durable-workflows.md +0 -2247
- package/readmes/runner-full-guide.md +0 -6010
- package/readmes/runner-remote-lanes.md +0 -910
|
@@ -25,7 +25,7 @@ exports.extractTaskIdsFromDependencies = extractTaskIdsFromDependencies;
|
|
|
25
25
|
exports.extractErrorIdsFromDependencies = extractErrorIdsFromDependencies;
|
|
26
26
|
const runner_1 = require("@bluelibs/runner");
|
|
27
27
|
const lane_resources_1 = require("../../utils/lane-resources");
|
|
28
|
-
const
|
|
28
|
+
const schemaFormat_1 = require("../../utils/schemaFormat");
|
|
29
29
|
const path_1 = require("../../utils/path");
|
|
30
30
|
const introspector_tools_1 = require("./introspector.tools");
|
|
31
31
|
function normalizeTags(tags) {
|
|
@@ -66,22 +66,169 @@ function findById(collection, id) {
|
|
|
66
66
|
Object.values(collection).find((x) => (0, introspector_tools_1.readId)(x) === id));
|
|
67
67
|
return undefined;
|
|
68
68
|
}
|
|
69
|
+
const taskMiddlewareScopeMarker = ".middleware.task.";
|
|
70
|
+
const resourceMiddlewareScopeMarker = ".middleware.resource.";
|
|
71
|
+
function getMiddlewareDuplicateKey(id) {
|
|
72
|
+
const taskScopeIndex = id.lastIndexOf(taskMiddlewareScopeMarker);
|
|
73
|
+
if (taskScopeIndex >= 0) {
|
|
74
|
+
return id.slice(taskScopeIndex + taskMiddlewareScopeMarker.length);
|
|
75
|
+
}
|
|
76
|
+
const resourceScopeIndex = id.lastIndexOf(resourceMiddlewareScopeMarker);
|
|
77
|
+
if (resourceScopeIndex >= 0) {
|
|
78
|
+
return id.slice(resourceScopeIndex + resourceMiddlewareScopeMarker.length);
|
|
79
|
+
}
|
|
80
|
+
return id;
|
|
81
|
+
}
|
|
82
|
+
function getTaskOwnerResourceChain(store, taskId) {
|
|
83
|
+
const chain = [];
|
|
84
|
+
const visited = new Set();
|
|
85
|
+
let currentOwnerId = store.getOwnerResourceId(taskId);
|
|
86
|
+
while (currentOwnerId && !visited.has(currentOwnerId)) {
|
|
87
|
+
visited.add(currentOwnerId);
|
|
88
|
+
chain.push(currentOwnerId);
|
|
89
|
+
currentOwnerId = store.getOwnerResourceId(currentOwnerId);
|
|
90
|
+
}
|
|
91
|
+
return chain;
|
|
92
|
+
}
|
|
93
|
+
function normalizeIdentityRequirementSummary(value) {
|
|
94
|
+
if (!value || typeof value !== "object")
|
|
95
|
+
return null;
|
|
96
|
+
const config = value;
|
|
97
|
+
return {
|
|
98
|
+
tenant: config.tenant ?? true,
|
|
99
|
+
user: config.user === true,
|
|
100
|
+
roles: Array.isArray(config.roles)
|
|
101
|
+
? config.roles.map((role) => String(role))
|
|
102
|
+
: [],
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function normalizeIdentityRequirementSummaries(value) {
|
|
106
|
+
const entries = Array.isArray(value)
|
|
107
|
+
? value
|
|
108
|
+
: value && typeof value === "object"
|
|
109
|
+
? [value]
|
|
110
|
+
: [];
|
|
111
|
+
return entries
|
|
112
|
+
.map((entry) => normalizeIdentityRequirementSummary(entry))
|
|
113
|
+
.filter((entry) => Boolean(entry));
|
|
114
|
+
}
|
|
115
|
+
function normalizeIdentityScopeSummary(value) {
|
|
116
|
+
if (!value || typeof value !== "object")
|
|
117
|
+
return null;
|
|
118
|
+
const config = value;
|
|
119
|
+
return {
|
|
120
|
+
tenant: config.tenant ?? true,
|
|
121
|
+
user: config.user === true,
|
|
122
|
+
required: config.required ?? true,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
function getSubtreePolicies(resource) {
|
|
126
|
+
const rawSubtree = resource?.subtree;
|
|
127
|
+
if (!rawSubtree || typeof rawSubtree !== "object")
|
|
128
|
+
return [];
|
|
129
|
+
return Array.isArray(rawSubtree)
|
|
130
|
+
? rawSubtree.filter((policy) => Boolean(policy) && typeof policy === "object")
|
|
131
|
+
: [rawSubtree];
|
|
132
|
+
}
|
|
133
|
+
function readSubtreeMiddlewareEntryId(entry) {
|
|
134
|
+
if (typeof entry === "string")
|
|
135
|
+
return entry;
|
|
136
|
+
if (!entry || typeof entry !== "object")
|
|
137
|
+
return null;
|
|
138
|
+
if ("use" in entry) {
|
|
139
|
+
return readSubtreeMiddlewareEntryId(entry.use ?? null);
|
|
140
|
+
}
|
|
141
|
+
const id = (0, introspector_tools_1.readId)(entry);
|
|
142
|
+
return id ? id : null;
|
|
143
|
+
}
|
|
144
|
+
function resolveTaskSubtreeMiddlewareEntry(entry, task) {
|
|
145
|
+
if (typeof entry === "string") {
|
|
146
|
+
return entry;
|
|
147
|
+
}
|
|
148
|
+
if (!entry || typeof entry !== "object") {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
if ("use" in entry) {
|
|
152
|
+
const conditionalEntry = entry;
|
|
153
|
+
if (typeof conditionalEntry.when === "function") {
|
|
154
|
+
try {
|
|
155
|
+
if (!conditionalEntry.when(task)) {
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return readSubtreeMiddlewareEntryId(conditionalEntry.use ?? null);
|
|
164
|
+
}
|
|
165
|
+
return readSubtreeMiddlewareEntryId(entry);
|
|
166
|
+
}
|
|
167
|
+
function collectSubtreeTaskMiddlewareOwnerIds(store, task) {
|
|
168
|
+
const ownerIds = new Map();
|
|
169
|
+
const chainRootToNearest = [
|
|
170
|
+
...getTaskOwnerResourceChain(store, task.id),
|
|
171
|
+
].reverse();
|
|
172
|
+
for (const ownerResourceId of chainRootToNearest) {
|
|
173
|
+
const ownerResource = store.resources.get(ownerResourceId)?.resource;
|
|
174
|
+
if (!ownerResource)
|
|
175
|
+
continue;
|
|
176
|
+
for (const policy of getSubtreePolicies(ownerResource)) {
|
|
177
|
+
const taskMiddlewares = Array.isArray(policy.tasks?.middleware)
|
|
178
|
+
? policy.tasks.middleware
|
|
179
|
+
: [];
|
|
180
|
+
for (const entry of taskMiddlewares) {
|
|
181
|
+
const middlewareId = resolveTaskSubtreeMiddlewareEntry(entry, task);
|
|
182
|
+
if (!middlewareId)
|
|
183
|
+
continue;
|
|
184
|
+
const duplicateKey = getMiddlewareDuplicateKey(middlewareId);
|
|
185
|
+
if (!ownerIds.has(duplicateKey)) {
|
|
186
|
+
ownerIds.set(duplicateKey, ownerResourceId);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return ownerIds;
|
|
192
|
+
}
|
|
193
|
+
function hasMiddlewareConfig(middleware) {
|
|
194
|
+
return (Boolean(middleware?.[runner_1.definitions.symbolMiddlewareConfigured]) ||
|
|
195
|
+
middleware?.config !== undefined);
|
|
196
|
+
}
|
|
197
|
+
function buildEffectiveTaskMiddlewareUsages(store, task) {
|
|
198
|
+
const resolver = store.getMiddlewareManager()?.middlewareResolver;
|
|
199
|
+
const effectiveMiddlewares = resolver
|
|
200
|
+
? resolver.getApplicableTaskMiddlewares(task)
|
|
201
|
+
: task.middleware;
|
|
202
|
+
const subtreeOwnersByKey = collectSubtreeTaskMiddlewareOwnerIds(store, task);
|
|
203
|
+
return effectiveMiddlewares.map((middleware) => {
|
|
204
|
+
const duplicateKey = getMiddlewareDuplicateKey(String(middleware.id));
|
|
205
|
+
const subtreeOwnerId = subtreeOwnersByKey.get(duplicateKey) ?? null;
|
|
206
|
+
return {
|
|
207
|
+
id: String(middleware.id),
|
|
208
|
+
config: hasMiddlewareConfig(middleware)
|
|
209
|
+
? (0, introspector_tools_1.stringifyIfObject)(middleware.config)
|
|
210
|
+
: null,
|
|
211
|
+
origin: subtreeOwnerId ? "subtree" : "local",
|
|
212
|
+
subtreeOwnerId,
|
|
213
|
+
};
|
|
214
|
+
});
|
|
215
|
+
}
|
|
69
216
|
// Mapping helpers
|
|
70
|
-
function mapStoreTaskToTaskModel(task, taskStoreElement) {
|
|
217
|
+
function mapStoreTaskToTaskModel(task, store, taskStoreElement) {
|
|
71
218
|
const depsObj = normalizeDependencies(task?.dependencies);
|
|
72
219
|
const eventIdsFromDeps = extractEventIdsFromDependencies(depsObj);
|
|
73
220
|
const resourceIdsFromDeps = extractResourceIdsFromDependencies(depsObj);
|
|
74
221
|
const taskIdsFromDeps = extractTaskIdsFromDependencies(depsObj);
|
|
75
222
|
const errorIdsFromDeps = extractErrorIdsFromDependencies(depsObj);
|
|
76
223
|
const tagIdsFromDeps = extractTagIdsFromDependencies(depsObj);
|
|
77
|
-
const middlewareDetailed =
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
m
|
|
82
|
-
|
|
83
|
-
: null,
|
|
84
|
-
|
|
224
|
+
const middlewareDetailed = store
|
|
225
|
+
? buildEffectiveTaskMiddlewareUsages(store, task)
|
|
226
|
+
: (task.middleware || []).map((m) => ({
|
|
227
|
+
id: String(m.id),
|
|
228
|
+
config: hasMiddlewareConfig(m) ? (0, introspector_tools_1.stringifyIfObject)(m.config) : null,
|
|
229
|
+
origin: "local",
|
|
230
|
+
subtreeOwnerId: null,
|
|
231
|
+
}));
|
|
85
232
|
const { ids: tagIds, detailed: tagsDetailed } = normalizeTags(task?.tags);
|
|
86
233
|
const interceptorOwnerIds = Array.from(new Set(taskStoreElement?.interceptors
|
|
87
234
|
?.map((record) => record.ownerResourceId)
|
|
@@ -101,7 +248,7 @@ function mapStoreTaskToTaskModel(task, taskStoreElement) {
|
|
|
101
248
|
...errorIdsFromDeps,
|
|
102
249
|
...tagIdsFromDeps,
|
|
103
250
|
],
|
|
104
|
-
middleware:
|
|
251
|
+
middleware: middlewareDetailed.map((m) => m.id),
|
|
105
252
|
middlewareDetailed,
|
|
106
253
|
registeredBy: null,
|
|
107
254
|
kind: "TASK",
|
|
@@ -109,8 +256,8 @@ function mapStoreTaskToTaskModel(task, taskStoreElement) {
|
|
|
109
256
|
visibilityReason: null,
|
|
110
257
|
// Emits any events present in its dependencies
|
|
111
258
|
emits: eventIdsFromDeps,
|
|
112
|
-
inputSchema: (0,
|
|
113
|
-
resultSchema: (0,
|
|
259
|
+
inputSchema: (0, schemaFormat_1.formatSchemaIfZod)(task.inputSchema),
|
|
260
|
+
resultSchema: (0, schemaFormat_1.formatSchemaIfZod)(task.resultSchema),
|
|
114
261
|
rpcLane: extractRpcLaneSummary(tagsDetailed),
|
|
115
262
|
interceptorCount: taskStoreElement?.interceptors?.length ?? 0,
|
|
116
263
|
hasInterceptors: (taskStoreElement?.interceptors?.length ?? 0) > 0,
|
|
@@ -120,7 +267,7 @@ function mapStoreTaskToTaskModel(task, taskStoreElement) {
|
|
|
120
267
|
function mapStoreTaskToHookModel(_task) {
|
|
121
268
|
throw new Error("deprecated");
|
|
122
269
|
}
|
|
123
|
-
function mapStoreHookToHookModel(hkStoreElement) {
|
|
270
|
+
function mapStoreHookToHookModel(hkStoreElement, store) {
|
|
124
271
|
const hk = hkStoreElement.hook;
|
|
125
272
|
const depsObj = normalizeDependencies(hk?.dependencies);
|
|
126
273
|
const eventIdsFromDeps = extractEventIdsFromDependencies(depsObj);
|
|
@@ -129,9 +276,7 @@ function mapStoreHookToHookModel(hkStoreElement) {
|
|
|
129
276
|
const errorIdsFromDeps = extractErrorIdsFromDependencies(depsObj);
|
|
130
277
|
const tagIdsFromDeps = extractTagIdsFromDependencies(depsObj);
|
|
131
278
|
const { ids: tagIds, detailed: tagsDetailed } = normalizeTags(hk.tags);
|
|
132
|
-
const eventIds =
|
|
133
|
-
? hk.on.map((e) => String(e.id))
|
|
134
|
-
: [String(hk.on?.id ?? "*")];
|
|
279
|
+
const eventIds = resolveHookEventIds(hk, store);
|
|
135
280
|
return (0, introspector_tools_1.stampElementKind)({
|
|
136
281
|
id: String(hk?.id),
|
|
137
282
|
meta: buildMetaWithNormalizedTags(hk?.meta, hk),
|
|
@@ -220,7 +365,7 @@ function mapStoreResourceToResourceModel(resource, resourceConfig) {
|
|
|
220
365
|
hasHealthCheck,
|
|
221
366
|
context: (0, introspector_tools_1.stringifyIfObject)(resource.context),
|
|
222
367
|
registeredBy: null,
|
|
223
|
-
configSchema: (0,
|
|
368
|
+
configSchema: (0, schemaFormat_1.formatSchemaIfZod)(resource.configSchema),
|
|
224
369
|
isPrivate: false,
|
|
225
370
|
visibilityReason: null,
|
|
226
371
|
}, "RESOURCE");
|
|
@@ -238,25 +383,22 @@ function normalizeResourceConfig(config) {
|
|
|
238
383
|
function buildEvents(store) {
|
|
239
384
|
const eventsCollection = Array.from(store.events.values()).map((e) => e.event);
|
|
240
385
|
const allEventIds = eventsCollection.map((e) => e.id.toString());
|
|
241
|
-
const
|
|
386
|
+
const hookEntries = Array.from(store.hooks.values());
|
|
387
|
+
const hookTargetEventIdsByHookId = new Map();
|
|
388
|
+
const eventLaneByEventId = buildEventLaneSummaryByEventId(store);
|
|
389
|
+
for (const hookEntry of hookEntries) {
|
|
390
|
+
hookTargetEventIdsByHookId.set(hookEntry.hook.id, resolveHookEventIds(hookEntry.hook, store));
|
|
391
|
+
}
|
|
242
392
|
return allEventIds.map((eventId) => {
|
|
243
393
|
const e = findById(eventsCollection, eventId);
|
|
244
394
|
const { ids: tagIds, detailed: tagsDetailed } = normalizeTags(e.tags);
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
.
|
|
248
|
-
const on = h?.on;
|
|
249
|
-
if (on === "*")
|
|
395
|
+
const hooksListeningToEvent = hookEntries
|
|
396
|
+
.filter(({ hook }) => {
|
|
397
|
+
if (hook.on === "*")
|
|
250
398
|
return true;
|
|
251
|
-
|
|
252
|
-
return on === eventId;
|
|
253
|
-
if (on && typeof on === "object" && !Array.isArray(on))
|
|
254
|
-
return String(on.id) === eventId;
|
|
255
|
-
if (Array.isArray(on))
|
|
256
|
-
return on.some((v) => typeof v === "string" ? v === eventId : String(v?.id) === eventId);
|
|
257
|
-
return false;
|
|
399
|
+
return (hookTargetEventIdsByHookId.get(hook.id)?.includes(eventId) ?? false);
|
|
258
400
|
})
|
|
259
|
-
.map((
|
|
401
|
+
.map(({ hook }) => hook.id);
|
|
260
402
|
return (0, introspector_tools_1.stampElementKind)({
|
|
261
403
|
id: eventId,
|
|
262
404
|
meta: buildMetaWithNormalizedTags(e?.meta ?? null, e),
|
|
@@ -264,17 +406,175 @@ function buildEvents(store) {
|
|
|
264
406
|
tagsDetailed,
|
|
265
407
|
transactional: Boolean(e?.transactional),
|
|
266
408
|
parallel: Boolean(e?.parallel),
|
|
267
|
-
eventLane:
|
|
409
|
+
eventLane: eventLaneByEventId.get(eventId) ?? null,
|
|
268
410
|
rpcLane: extractRpcLaneSummary(tagsDetailed),
|
|
269
411
|
filePath: (0, path_1.sanitizePath)((e && e[runner_1.definitions.symbolFilePath]) ?? e?.filePath ?? null),
|
|
270
412
|
listenedToBy: hooksListeningToEvent,
|
|
271
413
|
registeredBy: null,
|
|
272
|
-
payloadSchema: (0,
|
|
414
|
+
payloadSchema: (0, schemaFormat_1.formatSchemaIfZod)(e.payloadSchema),
|
|
273
415
|
isPrivate: false,
|
|
274
416
|
visibilityReason: null,
|
|
275
417
|
}, "EVENT");
|
|
276
418
|
});
|
|
277
419
|
}
|
|
420
|
+
function resolveHookEventIds(hook, store) {
|
|
421
|
+
if (hook.on === "*") {
|
|
422
|
+
return ["*"];
|
|
423
|
+
}
|
|
424
|
+
if (store && hook.on) {
|
|
425
|
+
return store.resolveHookTargets(hook).map((entry) => entry.event.id);
|
|
426
|
+
}
|
|
427
|
+
if (Array.isArray(hook.on)) {
|
|
428
|
+
return hook.on.map((entry) => typeof entry === "string" ? entry : String(entry?.id));
|
|
429
|
+
}
|
|
430
|
+
return [String(hook.on?.id ?? "*")];
|
|
431
|
+
}
|
|
432
|
+
function buildEventLaneSummaryByEventId(store) {
|
|
433
|
+
const laneByEventId = new Map();
|
|
434
|
+
const buildLaneApplyTargetKey = (target) => {
|
|
435
|
+
if (typeof target === "string") {
|
|
436
|
+
return `id:${target}`;
|
|
437
|
+
}
|
|
438
|
+
const targetId = (0, lane_resources_1.extractLaneId)(target);
|
|
439
|
+
if (targetId) {
|
|
440
|
+
return `id:${targetId}`;
|
|
441
|
+
}
|
|
442
|
+
const serializedTarget = (0, introspector_tools_1.stringifyIfObject)(target);
|
|
443
|
+
if (serializedTarget) {
|
|
444
|
+
return `json:${serializedTarget}`;
|
|
445
|
+
}
|
|
446
|
+
return `raw:${String(target)}`;
|
|
447
|
+
};
|
|
448
|
+
const mergeLaneApplyTo = (existingApplyTo, incomingApplyTo) => {
|
|
449
|
+
if (incomingApplyTo === undefined) {
|
|
450
|
+
return existingApplyTo;
|
|
451
|
+
}
|
|
452
|
+
if (existingApplyTo === undefined) {
|
|
453
|
+
return incomingApplyTo;
|
|
454
|
+
}
|
|
455
|
+
if (Array.isArray(existingApplyTo) && Array.isArray(incomingApplyTo)) {
|
|
456
|
+
const mergedTargets = new Map();
|
|
457
|
+
for (const target of [...existingApplyTo, ...incomingApplyTo]) {
|
|
458
|
+
mergedTargets.set(buildLaneApplyTargetKey(target), target);
|
|
459
|
+
}
|
|
460
|
+
return Array.from(mergedTargets.values());
|
|
461
|
+
}
|
|
462
|
+
return incomingApplyTo;
|
|
463
|
+
};
|
|
464
|
+
const mergeTopologyLaneEntry = (existingEntry, incomingEntry) => {
|
|
465
|
+
if (!existingEntry) {
|
|
466
|
+
return incomingEntry;
|
|
467
|
+
}
|
|
468
|
+
return {
|
|
469
|
+
id: incomingEntry.id,
|
|
470
|
+
applyTo: mergeLaneApplyTo(existingEntry.applyTo, incomingEntry.applyTo),
|
|
471
|
+
orderingKey: incomingEntry.orderingKey ?? existingEntry.orderingKey,
|
|
472
|
+
metadata: incomingEntry.metadata ?? existingEntry.metadata,
|
|
473
|
+
};
|
|
474
|
+
};
|
|
475
|
+
const upsertTopologyLaneEntry = (entry) => {
|
|
476
|
+
topologyLanesById.set(entry.id, mergeTopologyLaneEntry(topologyLanesById.get(entry.id), entry));
|
|
477
|
+
};
|
|
478
|
+
const topologyLanesById = new Map();
|
|
479
|
+
for (const resourceEntry of store.resources.values()) {
|
|
480
|
+
const resource = resourceEntry.resource;
|
|
481
|
+
const normalizedTags = normalizeTags(resource?.tags).ids;
|
|
482
|
+
if (!(0, lane_resources_1.isEventLanesResource)({
|
|
483
|
+
id: String(resource.id),
|
|
484
|
+
tags: normalizedTags,
|
|
485
|
+
})) {
|
|
486
|
+
continue;
|
|
487
|
+
}
|
|
488
|
+
const topology = resourceEntry
|
|
489
|
+
.config?.topology;
|
|
490
|
+
if (Array.isArray(topology?.bindings)) {
|
|
491
|
+
for (const binding of topology.bindings) {
|
|
492
|
+
const laneId = (0, lane_resources_1.extractLaneId)(binding?.lane);
|
|
493
|
+
if (!laneId || !binding?.lane)
|
|
494
|
+
continue;
|
|
495
|
+
upsertTopologyLaneEntry({
|
|
496
|
+
id: laneId,
|
|
497
|
+
applyTo: normalizeEventLaneApplyTo(binding.lane.applyTo),
|
|
498
|
+
orderingKey: typeof binding.lane.orderingKey === "string"
|
|
499
|
+
? binding.lane.orderingKey
|
|
500
|
+
: null,
|
|
501
|
+
metadata: (0, introspector_tools_1.stringifyIfObject)(binding.lane.metadata),
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
if (topology?.profiles && typeof topology.profiles === "object") {
|
|
506
|
+
for (const profile of Object.values(topology.profiles)) {
|
|
507
|
+
if (!Array.isArray(profile?.consume))
|
|
508
|
+
continue;
|
|
509
|
+
for (const entry of profile.consume) {
|
|
510
|
+
const laneId = (0, lane_resources_1.extractLaneId)(entry?.lane);
|
|
511
|
+
if (!laneId || !entry?.lane)
|
|
512
|
+
continue;
|
|
513
|
+
upsertTopologyLaneEntry({
|
|
514
|
+
id: laneId,
|
|
515
|
+
applyTo: normalizeEventLaneApplyTo(entry.lane.applyTo),
|
|
516
|
+
orderingKey: typeof entry.lane.orderingKey === "string"
|
|
517
|
+
? entry.lane.orderingKey
|
|
518
|
+
: null,
|
|
519
|
+
metadata: (0, introspector_tools_1.stringifyIfObject)(entry.lane.metadata),
|
|
520
|
+
});
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
const registeredEvents = Array.from(store.events.values()).map((eventEntry) => eventEntry.event);
|
|
526
|
+
for (const lane of topologyLanesById.values()) {
|
|
527
|
+
if (typeof lane.applyTo === "function") {
|
|
528
|
+
for (const event of registeredEvents) {
|
|
529
|
+
if (laneByEventId.has(event.id))
|
|
530
|
+
continue;
|
|
531
|
+
let matchesEvent = false;
|
|
532
|
+
try {
|
|
533
|
+
matchesEvent = lane.applyTo(event);
|
|
534
|
+
}
|
|
535
|
+
catch {
|
|
536
|
+
matchesEvent = false;
|
|
537
|
+
}
|
|
538
|
+
if (!matchesEvent)
|
|
539
|
+
continue;
|
|
540
|
+
laneByEventId.set(event.id, {
|
|
541
|
+
laneId: lane.id,
|
|
542
|
+
orderingKey: lane.orderingKey,
|
|
543
|
+
metadata: lane.metadata,
|
|
544
|
+
});
|
|
545
|
+
}
|
|
546
|
+
continue;
|
|
547
|
+
}
|
|
548
|
+
if (!Array.isArray(lane.applyTo)) {
|
|
549
|
+
continue;
|
|
550
|
+
}
|
|
551
|
+
for (const target of lane.applyTo) {
|
|
552
|
+
const targetId = typeof target === "string"
|
|
553
|
+
? target
|
|
554
|
+
: store.findIdByDefinition(target) ?? (0, lane_resources_1.extractLaneId)(target);
|
|
555
|
+
if (!targetId)
|
|
556
|
+
continue;
|
|
557
|
+
const event = store.events.get(targetId)?.event;
|
|
558
|
+
if (!event || laneByEventId.has(event.id))
|
|
559
|
+
continue;
|
|
560
|
+
laneByEventId.set(event.id, {
|
|
561
|
+
laneId: lane.id,
|
|
562
|
+
orderingKey: lane.orderingKey,
|
|
563
|
+
metadata: lane.metadata,
|
|
564
|
+
});
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
return laneByEventId;
|
|
568
|
+
}
|
|
569
|
+
function normalizeEventLaneApplyTo(applyTo) {
|
|
570
|
+
if (Array.isArray(applyTo)) {
|
|
571
|
+
return applyTo;
|
|
572
|
+
}
|
|
573
|
+
if (typeof applyTo === "function") {
|
|
574
|
+
return applyTo;
|
|
575
|
+
}
|
|
576
|
+
return undefined;
|
|
577
|
+
}
|
|
278
578
|
function buildMiddlewaresGeneric(middlewaresCollection, tasks, resources, kind) {
|
|
279
579
|
const matchesMiddlewareId = (candidateIds, middlewareId) => (candidateIds ?? []).some((candidateId) => candidateId === middlewareId ||
|
|
280
580
|
candidateId.endsWith(`.${middlewareId}`) ||
|
|
@@ -318,7 +618,7 @@ function buildMiddlewaresGeneric(middlewaresCollection, tasks, resources, kind)
|
|
|
318
618
|
usedByResources,
|
|
319
619
|
overriddenBy: mw?.overriddenBy ?? null,
|
|
320
620
|
registeredBy: null,
|
|
321
|
-
configSchema: (0,
|
|
621
|
+
configSchema: (0, schemaFormat_1.formatSchemaIfZod)(mw.configSchema),
|
|
322
622
|
type: kind,
|
|
323
623
|
isPrivate: false,
|
|
324
624
|
visibilityReason: null,
|
|
@@ -332,6 +632,20 @@ function buildResourceMiddlewares(middlewaresCollection, tasks, resources) {
|
|
|
332
632
|
return buildMiddlewaresGeneric(middlewaresCollection, tasks, resources, "resource");
|
|
333
633
|
}
|
|
334
634
|
function attachRegisteredBy(resources, tasks, hooks, middlewares, events) {
|
|
635
|
+
const matchesRegisteredElement = (candidateId, referenceId) => candidateId === referenceId ||
|
|
636
|
+
candidateId.endsWith(`.${referenceId}`) ||
|
|
637
|
+
referenceId.endsWith(`.${candidateId}`);
|
|
638
|
+
const resolveRegisteredElement = (map, referenceId) => {
|
|
639
|
+
const direct = map.get(referenceId);
|
|
640
|
+
if (direct)
|
|
641
|
+
return direct;
|
|
642
|
+
for (const element of map.values()) {
|
|
643
|
+
if (matchesRegisteredElement(element.id, referenceId)) {
|
|
644
|
+
return element;
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
return null;
|
|
648
|
+
};
|
|
335
649
|
const taskMap = (0, introspector_tools_1.buildIdMap)(tasks);
|
|
336
650
|
const hookMap = (0, introspector_tools_1.buildIdMap)(hooks);
|
|
337
651
|
const resourceMap = (0, introspector_tools_1.buildIdMap)(resources);
|
|
@@ -339,16 +653,30 @@ function attachRegisteredBy(resources, tasks, hooks, middlewares, events) {
|
|
|
339
653
|
const eventMap = (0, introspector_tools_1.buildIdMap)(events);
|
|
340
654
|
for (const r of resources) {
|
|
341
655
|
for (const id of r.registers ?? []) {
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
656
|
+
const task = resolveRegisteredElement(taskMap, id);
|
|
657
|
+
if (task) {
|
|
658
|
+
task.registeredBy = r.id;
|
|
659
|
+
continue;
|
|
660
|
+
}
|
|
661
|
+
const hook = resolveRegisteredElement(hookMap, id);
|
|
662
|
+
if (hook) {
|
|
663
|
+
hook.registeredBy = r.id;
|
|
664
|
+
continue;
|
|
665
|
+
}
|
|
666
|
+
const resource = resolveRegisteredElement(resourceMap, id);
|
|
667
|
+
if (resource) {
|
|
668
|
+
resource.registeredBy = r.id;
|
|
669
|
+
continue;
|
|
670
|
+
}
|
|
671
|
+
const middleware = resolveRegisteredElement(middlewareMap, id);
|
|
672
|
+
if (middleware) {
|
|
673
|
+
middleware.registeredBy = r.id;
|
|
674
|
+
continue;
|
|
675
|
+
}
|
|
676
|
+
const event = resolveRegisteredElement(eventMap, id);
|
|
677
|
+
if (event) {
|
|
678
|
+
event.registeredBy = r.id;
|
|
679
|
+
}
|
|
352
680
|
}
|
|
353
681
|
}
|
|
354
682
|
}
|
|
@@ -592,8 +920,8 @@ function toSubtreeMiddlewareIds(entries) {
|
|
|
592
920
|
if (!Array.isArray(entries))
|
|
593
921
|
return [];
|
|
594
922
|
const ids = entries
|
|
595
|
-
.map((entry) =>
|
|
596
|
-
.filter(Boolean);
|
|
923
|
+
.map((entry) => typeof entry === "string" ? entry : readSubtreeMiddlewareEntryId(entry))
|
|
924
|
+
.filter((id) => Boolean(id));
|
|
597
925
|
return Array.from(new Set(ids));
|
|
598
926
|
}
|
|
599
927
|
function appendSubtreeMiddlewareIds(target, entries) {
|
|
@@ -602,16 +930,12 @@ function appendSubtreeMiddlewareIds(target, entries) {
|
|
|
602
930
|
}
|
|
603
931
|
}
|
|
604
932
|
function normalizeSubtreePolicy(resource) {
|
|
605
|
-
const
|
|
606
|
-
if (!rawSubtree || typeof rawSubtree !== "object")
|
|
607
|
-
return null;
|
|
608
|
-
const subtreePolicies = Array.isArray(rawSubtree)
|
|
609
|
-
? rawSubtree.filter((policy) => Boolean(policy) && typeof policy === "object")
|
|
610
|
-
: [rawSubtree];
|
|
933
|
+
const subtreePolicies = getSubtreePolicies(resource);
|
|
611
934
|
if (subtreePolicies.length === 0)
|
|
612
935
|
return null;
|
|
613
936
|
const taskMiddlewareIds = new Set();
|
|
614
937
|
const resourceMiddlewareIds = new Set();
|
|
938
|
+
const taskIdentityRequirements = [];
|
|
615
939
|
let tasksValidatorCount = 0;
|
|
616
940
|
let resourcesValidatorCount = 0;
|
|
617
941
|
let hooksValidatorCount = 0;
|
|
@@ -619,11 +943,16 @@ function normalizeSubtreePolicy(resource) {
|
|
|
619
943
|
let resourceMiddlewareValidatorCount = 0;
|
|
620
944
|
let eventsValidatorCount = 0;
|
|
621
945
|
let tagsValidatorCount = 0;
|
|
946
|
+
let subtreeMiddlewareIdentityScope = null;
|
|
622
947
|
for (const subtree of subtreePolicies) {
|
|
623
948
|
if (subtree.tasks) {
|
|
624
949
|
appendSubtreeMiddlewareIds(taskMiddlewareIds, subtree.tasks.middleware);
|
|
950
|
+
taskIdentityRequirements.push(...normalizeIdentityRequirementSummaries(subtree.tasks.identity));
|
|
625
951
|
tasksValidatorCount += normalizeSubtreeValidatorCount(subtree.tasks.validate);
|
|
626
952
|
}
|
|
953
|
+
if (subtree.middleware && "identityScope" in subtree.middleware) {
|
|
954
|
+
subtreeMiddlewareIdentityScope = normalizeIdentityScopeSummary(subtree.middleware.identityScope);
|
|
955
|
+
}
|
|
627
956
|
if (subtree.resources) {
|
|
628
957
|
appendSubtreeMiddlewareIds(resourceMiddlewareIds, subtree.resources.middleware);
|
|
629
958
|
resourcesValidatorCount += normalizeSubtreeValidatorCount(subtree.resources.validate);
|
|
@@ -644,10 +973,20 @@ function normalizeSubtreePolicy(resource) {
|
|
|
644
973
|
tagsValidatorCount += normalizeSubtreeValidatorCount(subtree.tags.validate);
|
|
645
974
|
}
|
|
646
975
|
}
|
|
647
|
-
const tasks = taskMiddlewareIds.size > 0 ||
|
|
976
|
+
const tasks = taskMiddlewareIds.size > 0 ||
|
|
977
|
+
tasksValidatorCount > 0 ||
|
|
978
|
+
taskIdentityRequirements.length > 0
|
|
648
979
|
? {
|
|
649
980
|
middleware: Array.from(taskMiddlewareIds),
|
|
650
981
|
validatorCount: tasksValidatorCount,
|
|
982
|
+
...(taskIdentityRequirements.length > 0
|
|
983
|
+
? { identity: taskIdentityRequirements }
|
|
984
|
+
: {}),
|
|
985
|
+
}
|
|
986
|
+
: null;
|
|
987
|
+
const middleware = subtreeMiddlewareIdentityScope !== null
|
|
988
|
+
? {
|
|
989
|
+
identityScope: subtreeMiddlewareIdentityScope,
|
|
651
990
|
}
|
|
652
991
|
: null;
|
|
653
992
|
const resources = resourceMiddlewareIds.size > 0 || resourcesValidatorCount > 0
|
|
@@ -682,6 +1021,7 @@ function normalizeSubtreePolicy(resource) {
|
|
|
682
1021
|
}
|
|
683
1022
|
: null;
|
|
684
1023
|
if (!tasks &&
|
|
1024
|
+
!middleware &&
|
|
685
1025
|
!resources &&
|
|
686
1026
|
!hooks &&
|
|
687
1027
|
!taskMiddleware &&
|
|
@@ -692,6 +1032,7 @@ function normalizeSubtreePolicy(resource) {
|
|
|
692
1032
|
}
|
|
693
1033
|
return {
|
|
694
1034
|
tasks,
|
|
1035
|
+
middleware,
|
|
695
1036
|
resources,
|
|
696
1037
|
hooks,
|
|
697
1038
|
taskMiddleware,
|
|
@@ -710,20 +1051,6 @@ function parseTagConfigJson(config) {
|
|
|
710
1051
|
return null;
|
|
711
1052
|
}
|
|
712
1053
|
}
|
|
713
|
-
function extractEventLaneSummary(tagsDetailed) {
|
|
714
|
-
const laneTag = tagsDetailed.find((tag) => matchesTagId(tag.id, lane_resources_1.EVENT_LANE_TAG_ID));
|
|
715
|
-
if (!laneTag)
|
|
716
|
-
return null;
|
|
717
|
-
const parsed = parseTagConfigJson(laneTag.config);
|
|
718
|
-
const laneId = (0, lane_resources_1.extractLaneId)(parsed?.lane);
|
|
719
|
-
if (!laneId)
|
|
720
|
-
return null;
|
|
721
|
-
return {
|
|
722
|
-
laneId,
|
|
723
|
-
orderingKey: parsed?.orderingKey != null ? String(parsed.orderingKey) : null,
|
|
724
|
-
metadata: parsed?.metadata != null ? (0, introspector_tools_1.stringifyIfObject)(parsed.metadata) : null,
|
|
725
|
-
};
|
|
726
|
-
}
|
|
727
1054
|
function extractRpcLaneSummary(tagsDetailed) {
|
|
728
1055
|
const laneTag = tagsDetailed.find((tag) => matchesTagId(tag.id, lane_resources_1.RPC_LANE_TAG_ID));
|
|
729
1056
|
if (!laneTag)
|