mongodash 2.0.0 → 2.1.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 +40 -22
- package/dist/dashboard/index.html +40 -0
- package/dist/lib/playground/server.js +131 -0
- package/dist/lib/playground/server.js.map +1 -0
- package/dist/lib/src/ConcurrentRunner.js +148 -0
- package/dist/lib/src/ConcurrentRunner.js.map +1 -0
- package/dist/lib/{OnError.js → src/OnError.js} +3 -3
- package/dist/lib/src/OnError.js.map +1 -0
- package/dist/lib/{OnInfo.js → src/OnInfo.js} +6 -3
- package/dist/lib/src/OnInfo.js.map +1 -0
- package/dist/lib/{createContinuousLock.js → src/createContinuousLock.js} +5 -3
- package/dist/lib/src/createContinuousLock.js.map +1 -0
- package/dist/lib/{cronTasks.js → src/cronTasks.js} +129 -73
- package/dist/lib/src/cronTasks.js.map +1 -0
- package/dist/lib/{getCollection.js → src/getCollection.js} +2 -2
- package/dist/lib/src/getCollection.js.map +1 -0
- package/dist/lib/{getMongoClient.js → src/getMongoClient.js} +2 -2
- package/dist/lib/src/getMongoClient.js.map +1 -0
- package/dist/lib/src/globalsCollection.js +10 -0
- package/dist/lib/src/globalsCollection.js.map +1 -0
- package/dist/lib/src/index.js +101 -0
- package/dist/lib/src/index.js.map +1 -0
- package/dist/lib/{initPromise.js → src/initPromise.js} +2 -3
- package/dist/lib/src/initPromise.js.map +1 -0
- package/dist/lib/src/mongoCompatibility.js +10 -0
- package/dist/lib/src/mongoCompatibility.js.map +1 -0
- package/dist/lib/src/parseInterval.js +60 -0
- package/dist/lib/src/parseInterval.js.map +1 -0
- package/dist/lib/src/prefixFilterKeys.js +69 -0
- package/dist/lib/src/prefixFilterKeys.js.map +1 -0
- package/dist/lib/src/processInBatches.js +46 -0
- package/dist/lib/src/processInBatches.js.map +1 -0
- package/dist/lib/src/reactiveTasks/LeaderElector.js +155 -0
- package/dist/lib/src/reactiveTasks/LeaderElector.js.map +1 -0
- package/dist/lib/src/reactiveTasks/MetricsCollector.js +410 -0
- package/dist/lib/src/reactiveTasks/MetricsCollector.js.map +1 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskManager.js +288 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskManager.js.map +1 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskOps.js +185 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskOps.js.map +1 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskPlanner.js +443 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskPlanner.js.map +1 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskReconciler.js +218 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskReconciler.js.map +1 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskRegistry.js +184 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskRegistry.js.map +1 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskRepository.js +355 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskRepository.js.map +1 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskRetryStrategy.js +153 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskRetryStrategy.js.map +1 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskTypes.js +34 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskTypes.js.map +1 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskWorker.js +186 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskWorker.js.map +1 -0
- package/dist/lib/src/reactiveTasks/compileWatchProjection.js +65 -0
- package/dist/lib/src/reactiveTasks/compileWatchProjection.js.map +1 -0
- package/dist/lib/src/reactiveTasks/index.js +298 -0
- package/dist/lib/src/reactiveTasks/index.js.map +1 -0
- package/dist/lib/src/reactiveTasks/queryToExpression.js +160 -0
- package/dist/lib/src/reactiveTasks/queryToExpression.js.map +1 -0
- package/dist/lib/src/reactiveTasks/validateTaskFilter.js +88 -0
- package/dist/lib/src/reactiveTasks/validateTaskFilter.js.map +1 -0
- package/dist/lib/src/task-management/OperationalTaskController.js +162 -0
- package/dist/lib/src/task-management/OperationalTaskController.js.map +1 -0
- package/dist/lib/src/task-management/index.js +27 -0
- package/dist/lib/src/task-management/index.js.map +1 -0
- package/dist/lib/src/task-management/serveDashboard.js +149 -0
- package/dist/lib/src/task-management/serveDashboard.js.map +1 -0
- package/dist/lib/src/task-management/types.js +10 -0
- package/dist/lib/src/task-management/types.js.map +1 -0
- package/dist/lib/{withLock.js → src/withLock.js} +3 -4
- package/dist/lib/src/withLock.js.map +1 -0
- package/dist/lib/{withTransaction.js → src/withTransaction.js} +4 -4
- package/dist/lib/src/withTransaction.js.map +1 -0
- package/dist/lib/tools/check-db-connection.js +28 -0
- package/dist/lib/tools/check-db-connection.js.map +1 -0
- package/dist/lib/tools/clean-testing-databases.js +12 -0
- package/dist/lib/tools/clean-testing-databases.js.map +1 -0
- package/dist/lib/tools/prepare-republish.js +27 -0
- package/dist/lib/tools/prepare-republish.js.map +1 -0
- package/dist/lib/tools/test-matrix-local.js +212 -0
- package/dist/lib/tools/test-matrix-local.js.map +1 -0
- package/dist/lib/tools/testingDatabase.js +55 -0
- package/dist/lib/tools/testingDatabase.js.map +1 -0
- package/dist/types/playground/server.d.ts +1 -0
- package/dist/types/src/ConcurrentRunner.d.ts +30 -0
- package/dist/types/{OnInfo.d.ts → src/OnInfo.d.ts} +1 -1
- package/dist/types/{cronTasks.d.ts → src/cronTasks.d.ts} +44 -1
- package/dist/types/src/globalsCollection.d.ts +4 -0
- package/dist/types/src/index.d.ts +28 -0
- package/dist/types/src/mongoCompatibility.d.ts +29 -0
- package/dist/types/src/parseInterval.d.ts +12 -0
- package/dist/types/src/prefixFilterKeys.d.ts +11 -0
- package/dist/types/src/processInBatches.d.ts +10 -0
- package/dist/types/src/reactiveTasks/LeaderElector.d.ts +42 -0
- package/dist/types/src/reactiveTasks/MetricsCollector.d.ts +73 -0
- package/dist/types/src/reactiveTasks/ReactiveTaskManager.d.ts +18 -0
- package/dist/types/src/reactiveTasks/ReactiveTaskOps.d.ts +17 -0
- package/dist/types/src/reactiveTasks/ReactiveTaskPlanner.d.ts +62 -0
- package/dist/types/src/reactiveTasks/ReactiveTaskReconciler.d.ts +29 -0
- package/dist/types/src/reactiveTasks/ReactiveTaskRegistry.d.ts +34 -0
- package/dist/types/src/reactiveTasks/ReactiveTaskRepository.d.ts +59 -0
- package/dist/types/src/reactiveTasks/ReactiveTaskRetryStrategy.d.ts +21 -0
- package/dist/types/src/reactiveTasks/ReactiveTaskTypes.d.ts +389 -0
- package/dist/types/src/reactiveTasks/ReactiveTaskWorker.d.ts +36 -0
- package/dist/types/src/reactiveTasks/compileWatchProjection.d.ts +12 -0
- package/dist/types/src/reactiveTasks/index.d.ts +82 -0
- package/dist/types/src/reactiveTasks/queryToExpression.d.ts +13 -0
- package/dist/types/src/reactiveTasks/validateTaskFilter.d.ts +10 -0
- package/dist/types/src/task-management/OperationalTaskController.d.ts +59 -0
- package/dist/types/src/task-management/index.d.ts +3 -0
- package/dist/types/src/task-management/serveDashboard.d.ts +12 -0
- package/dist/types/src/task-management/types.d.ts +95 -0
- package/dist/types/tools/check-db-connection.d.ts +2 -0
- package/dist/types/tools/clean-testing-databases.d.ts +1 -0
- package/dist/types/tools/prepare-republish.d.ts +2 -0
- package/dist/types/tools/test-matrix-local.d.ts +1 -0
- package/dist/types/tools/testingDatabase.d.ts +2 -0
- package/docs/.vitepress/cache/deps/_metadata.json +31 -0
- package/docs/.vitepress/cache/deps/chunk-LE5NDSFD.js +12824 -0
- package/docs/.vitepress/cache/deps/chunk-LE5NDSFD.js.map +7 -0
- package/docs/.vitepress/cache/deps/package.json +3 -0
- package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js +4505 -0
- package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js.map +7 -0
- package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js +9731 -0
- package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js.map +7 -0
- package/docs/.vitepress/cache/deps/vue.js +347 -0
- package/docs/.vitepress/cache/deps/vue.js.map +7 -0
- package/docs/.vitepress/config.mts +48 -0
- package/docs/.vitepress/theme/index.ts +4 -0
- package/docs/.vitepress/theme/style.css +16 -0
- package/docs/assets/dashboard.png +0 -0
- package/docs/cron-tasks.md +172 -0
- package/docs/dashboard.md +117 -0
- package/docs/getters.md +31 -0
- package/docs/getting-started.md +120 -0
- package/docs/index.md +29 -0
- package/docs/initialization.md +59 -0
- package/docs/process-in-batches.md +73 -0
- package/docs/reactive-tasks.md +914 -0
- package/docs/with-lock.md +45 -0
- package/docs/with-transaction.md +65 -0
- package/grafana/reactive_tasks.json +765 -0
- package/package.json +127 -116
- package/dist/lib/OnError.js.map +0 -1
- package/dist/lib/OnInfo.js.map +0 -1
- package/dist/lib/createContinuousLock.js.map +0 -1
- package/dist/lib/cronTasks.js.map +0 -1
- package/dist/lib/getCollection.js.map +0 -1
- package/dist/lib/getMongoClient.js.map +0 -1
- package/dist/lib/index.js +0 -64
- package/dist/lib/index.js.map +0 -1
- package/dist/lib/initPromise.js.map +0 -1
- package/dist/lib/withLock.js.map +0 -1
- package/dist/lib/withTransaction.js.map +0 -1
- package/dist/types/index.d.ts +0 -17
- /package/dist/types/{OnError.d.ts → src/OnError.d.ts} +0 -0
- /package/dist/types/{createContinuousLock.d.ts → src/createContinuousLock.d.ts} +0 -0
- /package/dist/types/{getCollection.d.ts → src/getCollection.d.ts} +0 -0
- /package/dist/types/{getMongoClient.d.ts → src/getMongoClient.d.ts} +0 -0
- /package/dist/types/{initPromise.d.ts → src/initPromise.d.ts} +0 -0
- /package/dist/types/{withLock.d.ts → src/withLock.d.ts} +0 -0
- /package/dist/types/{withTransaction.d.ts → src/withTransaction.d.ts} +0 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**!
|
|
2
|
+
* mongodash v2.1.0
|
|
3
|
+
* git+https://github.com/VaclavObornik/mongodash.git
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2025 Václav Oborník
|
|
6
|
+
* Released under the MIT license
|
|
7
|
+
*/
|
|
8
|
+
"use strict";
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.queryToExpression = queryToExpression;
|
|
11
|
+
const mongodb_1 = require("mongodb");
|
|
12
|
+
/**
|
|
13
|
+
* Converts a standard MongoDB query object into an Aggregation Expression.
|
|
14
|
+
* strict support for:
|
|
15
|
+
* - Implicit Equality: { a: 1 }
|
|
16
|
+
* - Comparisons: $eq, $ne, $gt, $gte, $lt, $lte, $in, $nin
|
|
17
|
+
* - Logical: $and, $or, $nor, $not
|
|
18
|
+
* - Regex: /pattern/, $regex
|
|
19
|
+
* - Existence: $exists
|
|
20
|
+
*
|
|
21
|
+
* THROWS error on unsupported operators (like $elemMatch, $all, $xyz) to avoid silent failures.
|
|
22
|
+
*/
|
|
23
|
+
function queryToExpression(query) {
|
|
24
|
+
if (!query || Object.keys(query).length === 0) {
|
|
25
|
+
return {};
|
|
26
|
+
}
|
|
27
|
+
const conditions = [];
|
|
28
|
+
for (const key of Object.keys(query)) {
|
|
29
|
+
const value = query[key];
|
|
30
|
+
if (key.startsWith('$')) {
|
|
31
|
+
// Logical Operators
|
|
32
|
+
if (key === '$or' || key === '$and' || key === '$nor') {
|
|
33
|
+
if (!Array.isArray(value)) {
|
|
34
|
+
throw new Error(`ReactiveTasks: Value for '${key}' must be an array.`);
|
|
35
|
+
}
|
|
36
|
+
const mapped = value.map((item) => queryToExpression(item));
|
|
37
|
+
conditions.push({ [key]: mapped });
|
|
38
|
+
}
|
|
39
|
+
else if (key === '$not') {
|
|
40
|
+
conditions.push({ $not: [queryToExpression(value)] });
|
|
41
|
+
}
|
|
42
|
+
else if (key === '$expr') {
|
|
43
|
+
// If the user mixes $expr into a query, trust it (it's already an expression)
|
|
44
|
+
conditions.push(value);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
throw new Error(`ReactiveTasks: Top-level operator '${key}' is not supported in simple filter conversion. Use Aggregation syntax.`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
// Field condition
|
|
52
|
+
const fieldCondition = parseFieldCondition(key, value);
|
|
53
|
+
if (fieldCondition) {
|
|
54
|
+
conditions.push(fieldCondition);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (conditions.length === 0) {
|
|
59
|
+
return {};
|
|
60
|
+
}
|
|
61
|
+
if (conditions.length === 1) {
|
|
62
|
+
return conditions[0];
|
|
63
|
+
}
|
|
64
|
+
return { $and: conditions };
|
|
65
|
+
}
|
|
66
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
67
|
+
function parseFieldCondition(field, value) {
|
|
68
|
+
// Escape field name if it contains dots? No, user intends dot notation -> mapped to nested access in aggregation.
|
|
69
|
+
// e.g. "meta.type" -> "$meta.type" (valid in agg if meta is object)
|
|
70
|
+
const fieldPath = `$${field}`;
|
|
71
|
+
// 1. Equality / Direct Value
|
|
72
|
+
if (typeof value !== 'object' ||
|
|
73
|
+
value === null ||
|
|
74
|
+
Array.isArray(value) ||
|
|
75
|
+
value instanceof Date ||
|
|
76
|
+
value instanceof RegExp ||
|
|
77
|
+
value instanceof mongodb_1.ObjectId ||
|
|
78
|
+
value._bsontype === 'ObjectId' // Handling different ObjectId implementations
|
|
79
|
+
) {
|
|
80
|
+
if (value instanceof RegExp) {
|
|
81
|
+
return { $regexMatch: { input: fieldPath, regex: value.source, options: value.flags } };
|
|
82
|
+
}
|
|
83
|
+
return { $eq: [fieldPath, value] };
|
|
84
|
+
}
|
|
85
|
+
const valueKeys = Object.keys(value);
|
|
86
|
+
// Check if it's an object with operators: { age: { $gt: 18 } }
|
|
87
|
+
const isOperatorObject = valueKeys.length > 0 && valueKeys.every((k) => k.startsWith('$'));
|
|
88
|
+
if (isOperatorObject) {
|
|
89
|
+
const fieldConditions = [];
|
|
90
|
+
for (const op of valueKeys) {
|
|
91
|
+
const opVal = value[op];
|
|
92
|
+
switch (op) {
|
|
93
|
+
case '$eq':
|
|
94
|
+
fieldConditions.push({ $eq: [fieldPath, opVal] });
|
|
95
|
+
break;
|
|
96
|
+
case '$ne':
|
|
97
|
+
fieldConditions.push({ $ne: [fieldPath, opVal] });
|
|
98
|
+
break;
|
|
99
|
+
case '$gt':
|
|
100
|
+
fieldConditions.push({ $gt: [fieldPath, opVal] });
|
|
101
|
+
break;
|
|
102
|
+
case '$gte':
|
|
103
|
+
fieldConditions.push({ $gte: [fieldPath, opVal] });
|
|
104
|
+
break;
|
|
105
|
+
case '$lt':
|
|
106
|
+
fieldConditions.push({ $lt: [fieldPath, opVal] });
|
|
107
|
+
break;
|
|
108
|
+
case '$lte':
|
|
109
|
+
fieldConditions.push({ $lte: [fieldPath, opVal] });
|
|
110
|
+
break;
|
|
111
|
+
case '$in':
|
|
112
|
+
fieldConditions.push({ $in: [fieldPath, opVal] });
|
|
113
|
+
break;
|
|
114
|
+
case '$nin':
|
|
115
|
+
fieldConditions.push({ $not: [{ $in: [fieldPath, opVal] }] });
|
|
116
|
+
break;
|
|
117
|
+
case '$exists':
|
|
118
|
+
// { field: { $exists: true } } -> { $ne: [{ $type: "$field" }, "missing"] }
|
|
119
|
+
if (opVal) {
|
|
120
|
+
fieldConditions.push({ $ne: [{ $type: fieldPath }, 'missing'] });
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
fieldConditions.push({ $eq: [{ $type: fieldPath }, 'missing'] });
|
|
124
|
+
}
|
|
125
|
+
break;
|
|
126
|
+
case '$regex':
|
|
127
|
+
// { name: { $regex: 'val', $options: 'i' } }
|
|
128
|
+
const options = value['$options'] || '';
|
|
129
|
+
fieldConditions.push({ $regexMatch: { input: fieldPath, regex: opVal, options } });
|
|
130
|
+
break;
|
|
131
|
+
case '$options':
|
|
132
|
+
// Handled in $regex
|
|
133
|
+
break;
|
|
134
|
+
case '$type':
|
|
135
|
+
fieldConditions.push({ $eq: [{ $type: fieldPath }, opVal] });
|
|
136
|
+
break;
|
|
137
|
+
case '$size':
|
|
138
|
+
fieldConditions.push({ $eq: [{ $size: fieldPath }, opVal] });
|
|
139
|
+
break;
|
|
140
|
+
default:
|
|
141
|
+
throw new Error(`ReactiveTasks: Operator '${op}' on field '${field}' is not supported in simple filter conversion. Use Aggregation syntax.`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (fieldConditions.length === 0) {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
if (fieldConditions.length === 1) {
|
|
148
|
+
return fieldConditions[0];
|
|
149
|
+
}
|
|
150
|
+
return { $and: fieldConditions };
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
// Direct object equality: { "meta": { type: "param" } } -> { $eq: ["$meta", { type: "param" }] }
|
|
154
|
+
// BUT if user did "meta.type": "val", it lands here.
|
|
155
|
+
// fieldPath is "$meta.type". value is "val".
|
|
156
|
+
// { $eq: ["$meta.type", "val"] } -> CORRECT.
|
|
157
|
+
return { $eq: [fieldPath, value] };
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=queryToExpression.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryToExpression.js","sourceRoot":"","sources":["../../../../src/reactiveTasks/queryToExpression.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**!
|
|
2
|
+
* mongodash v2.1.0
|
|
3
|
+
* git+https://github.com/VaclavObornik/mongodash.git
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2025 Václav Oborník
|
|
6
|
+
* Released under the MIT license
|
|
7
|
+
*/
|
|
8
|
+
"use strict";
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.normalizeTaskFilter = normalizeTaskFilter;
|
|
11
|
+
const queryToExpression_1 = require("./queryToExpression");
|
|
12
|
+
/**
|
|
13
|
+
* Normalizes the task filter into a valid Aggregation Expression.
|
|
14
|
+
* If the filter is a standard query (keys not starting with $), it is converted.
|
|
15
|
+
* If the filter is already an expression (keys starting with $), it is kept.
|
|
16
|
+
*
|
|
17
|
+
* @param filter The filter object to normalize.
|
|
18
|
+
* @param taskName The name of the task (for error context).
|
|
19
|
+
*/
|
|
20
|
+
function normalizeTaskFilter(filter, taskName) {
|
|
21
|
+
if (!filter) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
if (typeof filter !== 'object' || Array.isArray(filter)) {
|
|
25
|
+
throw new Error(`Task '${taskName}': Invalid filter. Expected an object.`);
|
|
26
|
+
}
|
|
27
|
+
const keys = Object.keys(filter);
|
|
28
|
+
if (keys.length === 0) {
|
|
29
|
+
return {};
|
|
30
|
+
}
|
|
31
|
+
// Check if it's already an expression (simple heuristic: empty or $expr)
|
|
32
|
+
// Or if it DOESN'T look like a query.
|
|
33
|
+
// However, { $and: [...] } is valid query AND valid expression (mostly).
|
|
34
|
+
// The main difference is { field: val } vs { $eq: ['$field', val] }.
|
|
35
|
+
// We assume if ANY key does NOT start with $, it is definitely a Query.
|
|
36
|
+
const hasFieldKeys = keys.some((k) => !k.startsWith('$'));
|
|
37
|
+
if (hasFieldKeys) {
|
|
38
|
+
try {
|
|
39
|
+
return (0, queryToExpression_1.queryToExpression)(filter);
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
throw new Error(`Task '${taskName}': Failed to convert simple filter to expression: ${e.message}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// If all keys start with $, it's EITHER a logical query OR an expression.
|
|
46
|
+
// queryToExpression handles $and/$or/$not recursively via queryToExpression.
|
|
47
|
+
// But if the user intended { $eq: ['$a', 1] }, queryToExpression would trip on '$eq' as top level key?
|
|
48
|
+
// queryToExpression throws on unsupported top level keys.
|
|
49
|
+
// So if the user provided a valid expression like { $eq: ... }, queryToExpression would throw.
|
|
50
|
+
// Heuristic: If it looks like an expression (keys are aggregation operators), return as is.
|
|
51
|
+
// IF the user provided { $or: [ { a: 1 } ] }, this is a query using logical op.
|
|
52
|
+
// If they provided { $or: [ { $eq: ... } ] }, this is an expression.
|
|
53
|
+
// The safest bet is: if we see field keys (not starting with $), CONVERT.
|
|
54
|
+
// If all keys start with $, we assume it is ALREADY an expression, UNLESS it is $or/$and/$nor/$not which are ambiguous.
|
|
55
|
+
// But wait, { $or: [{ a: 1 }] } -> queryToExpression handles this recursively.
|
|
56
|
+
// { $or: [{ $eq: [..] }] } -> queryToExpression -> $or -> map -> queryToExpression({ $eq: .. }) -> Throw 'Unsupported top level operator $eq'?
|
|
57
|
+
// So queryToExpression is strict about what it accepts.
|
|
58
|
+
// If the top level is $or, it descends.
|
|
59
|
+
// If we want to support both, we need to know intent.
|
|
60
|
+
// Let's rely on the previous logic: If the user provides a "Simple Filter", they imply Query Syntax.
|
|
61
|
+
// If they strictly use Expression Syntax, they usually wrap in { $expr: ... } or use operators that queryToExpression doesn't support.
|
|
62
|
+
// If validation fails (queryToExpression throws), we could assume it's an Expression and return it?
|
|
63
|
+
// But queryToExpression might partially convert deep inside?
|
|
64
|
+
// Let's assume: If it works as Query, convert it. If it throws, assume it is Expression?
|
|
65
|
+
// That is risky.
|
|
66
|
+
// Better strategy:
|
|
67
|
+
// If ANY key does NOT start with $, it MUST be a Query -> Convert.
|
|
68
|
+
// If ALL keys start with $ AND it includes $expr, it is Expression -> Return.
|
|
69
|
+
// If ALL keys start with $ AND are logical ($or/$and), checks children?
|
|
70
|
+
// Compromise:
|
|
71
|
+
// If the user uses the feature 'Simple Filtering', they should probably NOT mix Expression syntax at root unless wrapped in $expr.
|
|
72
|
+
// If they pass { $eq: ['$a', 1] }, queryToExpression throws. We catch and return original?
|
|
73
|
+
try {
|
|
74
|
+
const expr = (0, queryToExpression_1.queryToExpression)(filter);
|
|
75
|
+
if (expr && Object.keys(expr).length === 1 && expr.$expr) {
|
|
76
|
+
return expr.$expr;
|
|
77
|
+
}
|
|
78
|
+
return expr;
|
|
79
|
+
}
|
|
80
|
+
catch (_a) {
|
|
81
|
+
// If conversion failed, it might be because it was already an expression.
|
|
82
|
+
if (keys.length === 1 && keys[0] === '$expr') {
|
|
83
|
+
return filter.$expr;
|
|
84
|
+
}
|
|
85
|
+
return filter;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=validateTaskFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateTaskFilter.js","sourceRoot":"","sources":["../../../../src/reactiveTasks/validateTaskFilter.ts"],"names":[],"mappings":";;AAWA,kDAgFC;AA1FD,2DAAwD;AAExD;;;;;;;GAOG;AACH,SAAgB,mBAAmB,CAAC,MAA4B,EAAE,QAAgB;IAC9E,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,SAAS,QAAQ,wCAAwC,CAAC,CAAC;IAC/E,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,EAAE,CAAC;IACd,CAAC;IAED,yEAAyE;IACzE,sCAAsC;IACtC,yEAAyE;IACzE,qEAAqE;IAErE,wEAAwE;IACxE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAE1D,IAAI,YAAY,EAAE,CAAC;QACf,IAAI,CAAC;YACD,OAAO,IAAA,qCAAiB,EAAC,MAAM,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,SAAS,QAAQ,qDAAsD,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAClH,CAAC;IACL,CAAC;IAED,0EAA0E;IAC1E,6EAA6E;IAC7E,uGAAuG;IACvG,0DAA0D;IAC1D,+FAA+F;IAE/F,4FAA4F;IAC5F,gFAAgF;IAChF,qEAAqE;IAErE,0EAA0E;IAC1E,wHAAwH;IACxH,+EAA+E;IAC/E,+IAA+I;IAE/I,wDAAwD;IACxD,wCAAwC;IACxC,sDAAsD;IAEtD,qGAAqG;IACrG,uIAAuI;IAEvI,oGAAoG;IACpG,6DAA6D;IAE7D,yFAAyF;IACzF,iBAAiB;IAEjB,mBAAmB;IACnB,mEAAmE;IACnE,8EAA8E;IAC9E,wEAAwE;IAExE,cAAc;IACd,mIAAmI;IACnI,2FAA2F;IAE3F,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,IAAA,qCAAiB,EAAC,MAAM,CAAC,CAAC;QACvC,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACvD,OAAO,IAAI,CAAC,KAAK,CAAC;QACtB,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,WAAM,CAAC;QACL,0EAA0E;QAC1E,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;YAC3C,OAAO,MAAM,CAAC,KAAK,CAAC;QACxB,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**!
|
|
2
|
+
* mongodash v2.1.0
|
|
3
|
+
* git+https://github.com/VaclavObornik/mongodash.git
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2025 Václav Oborník
|
|
6
|
+
* Released under the MIT license
|
|
7
|
+
*/
|
|
8
|
+
"use strict";
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.OperationalTaskController = void 0;
|
|
11
|
+
const cronTasks_1 = require("../cronTasks");
|
|
12
|
+
const getMongoClient_1 = require("../getMongoClient");
|
|
13
|
+
const mongodb_1 = require("mongodb");
|
|
14
|
+
class OperationalTaskController {
|
|
15
|
+
constructor(scheduler) {
|
|
16
|
+
this.scheduler = scheduler;
|
|
17
|
+
}
|
|
18
|
+
async getReactiveTasks(params) {
|
|
19
|
+
const query = {};
|
|
20
|
+
if (params.task) {
|
|
21
|
+
query.task = params.task;
|
|
22
|
+
}
|
|
23
|
+
else if (params.collection) {
|
|
24
|
+
// Map collection to task names that belong to it
|
|
25
|
+
const allTasks = this.scheduler.getRegistry().getAllTasks();
|
|
26
|
+
const taskNamesInCollection = allTasks.filter((t) => t.sourceCollection.collectionName === params.collection).map((t) => t.task);
|
|
27
|
+
if (taskNamesInCollection.length > 0) {
|
|
28
|
+
query.task = taskNamesInCollection;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// No tasks in this collection, return empty result
|
|
32
|
+
query.task = ['__nonexistent__'];
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (params.status) {
|
|
36
|
+
query.status = params.status.split(',').map((s) => s.trim());
|
|
37
|
+
}
|
|
38
|
+
if (params.errorMessage) {
|
|
39
|
+
query.errorMessage = params.errorMessage;
|
|
40
|
+
}
|
|
41
|
+
if (params.hasError !== undefined) {
|
|
42
|
+
query.hasError = params.hasError === 'true';
|
|
43
|
+
}
|
|
44
|
+
if (params.sourceDocId) {
|
|
45
|
+
query.sourceDocFilter = this.createSmartIdFilter(params.sourceDocId);
|
|
46
|
+
}
|
|
47
|
+
const statsQuery = Object.assign({}, query);
|
|
48
|
+
delete statsQuery.status;
|
|
49
|
+
delete statsQuery.errorMessage;
|
|
50
|
+
delete statsQuery.hasError;
|
|
51
|
+
const [result, stats] = await Promise.all([
|
|
52
|
+
this.scheduler.getTaskManager().getTasks(query, {
|
|
53
|
+
limit: Number(params.limit || 50),
|
|
54
|
+
skip: Number(params.skip || 0),
|
|
55
|
+
sort: { field: 'scheduledAt', direction: 1 },
|
|
56
|
+
}),
|
|
57
|
+
this.scheduler.getTaskManager().getTaskStats(statsQuery),
|
|
58
|
+
]);
|
|
59
|
+
// Hide sensitive internal data
|
|
60
|
+
result.items.forEach((item) => {
|
|
61
|
+
delete item.lastObservedValues;
|
|
62
|
+
});
|
|
63
|
+
return Object.assign(Object.assign({}, result), { stats });
|
|
64
|
+
}
|
|
65
|
+
async retryReactiveTasks(body) {
|
|
66
|
+
const query = {};
|
|
67
|
+
if (body.task) {
|
|
68
|
+
query.task = body.task;
|
|
69
|
+
}
|
|
70
|
+
if (body.status) {
|
|
71
|
+
query.status = body.status;
|
|
72
|
+
}
|
|
73
|
+
if (body.errorMessage) {
|
|
74
|
+
query.errorMessage = body.errorMessage;
|
|
75
|
+
}
|
|
76
|
+
if (body._id) {
|
|
77
|
+
query._id = body._id;
|
|
78
|
+
}
|
|
79
|
+
if (body.sourceDocId) {
|
|
80
|
+
query.sourceDocFilter = this.createSmartIdFilter(body.sourceDocId);
|
|
81
|
+
}
|
|
82
|
+
return this.scheduler.getTaskManager().retryTasks(query);
|
|
83
|
+
}
|
|
84
|
+
createSmartIdFilter(sourceDocId) {
|
|
85
|
+
const input = sourceDocId.trim();
|
|
86
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
87
|
+
const candidates = [input];
|
|
88
|
+
// Smart ID Matching:
|
|
89
|
+
// 1. Exact String (already added)
|
|
90
|
+
// 2. ObjectId (if valid hex)
|
|
91
|
+
if (/^[0-9a-fA-F]{24}$/.test(input)) {
|
|
92
|
+
candidates.push(new mongodb_1.ObjectId(input));
|
|
93
|
+
}
|
|
94
|
+
// 3. Number (if valid number)
|
|
95
|
+
if (!isNaN(Number(input)) && input !== '') {
|
|
96
|
+
candidates.push(Number(input));
|
|
97
|
+
}
|
|
98
|
+
return { _id: { $in: candidates } };
|
|
99
|
+
}
|
|
100
|
+
async getCronTasks(params) {
|
|
101
|
+
return (0, cronTasks_1.getCronTasksList)({
|
|
102
|
+
filter: params.filter,
|
|
103
|
+
limit: Number(params.limit || 50),
|
|
104
|
+
skip: Number(params.skip || 0),
|
|
105
|
+
sort: params.sort,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
async triggerCronTask(body) {
|
|
109
|
+
if (!body.taskId)
|
|
110
|
+
throw new Error('taskId is required');
|
|
111
|
+
await (0, cronTasks_1.triggerCronTask)(body.taskId);
|
|
112
|
+
return { success: true };
|
|
113
|
+
}
|
|
114
|
+
async getInfo() {
|
|
115
|
+
const [allStats, cronPaged] = await Promise.all([this.scheduler.getTaskManager().getAllTaskStats(), (0, cronTasks_1.getCronTasksList)({ limit: 1000 })]);
|
|
116
|
+
const allTasks = this.scheduler.getRegistry().getAllTasks();
|
|
117
|
+
const reactiveTasks = allTasks
|
|
118
|
+
.map((t) => {
|
|
119
|
+
const stats = allStats[t.task] || { statuses: [], errorCount: 0 };
|
|
120
|
+
const counts = {
|
|
121
|
+
success: 0,
|
|
122
|
+
failed: 0,
|
|
123
|
+
processing: 0,
|
|
124
|
+
pending: 0,
|
|
125
|
+
error: stats.errorCount || 0,
|
|
126
|
+
};
|
|
127
|
+
for (const s of stats.statuses) {
|
|
128
|
+
const status = s._id;
|
|
129
|
+
if (status === 'completed' || status === 'success')
|
|
130
|
+
counts.success += s.count;
|
|
131
|
+
if (status === 'failed')
|
|
132
|
+
counts.failed += s.count;
|
|
133
|
+
if (status === 'processing' || status === 'processing_dirty')
|
|
134
|
+
counts.processing += s.count;
|
|
135
|
+
if (status === 'pending')
|
|
136
|
+
counts.pending += s.count;
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
name: t.task,
|
|
140
|
+
collection: t.sourceCollection.collectionName,
|
|
141
|
+
stats: counts,
|
|
142
|
+
};
|
|
143
|
+
})
|
|
144
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
145
|
+
const cronTasks = cronPaged.items.map((t) => {
|
|
146
|
+
var _a;
|
|
147
|
+
return ({
|
|
148
|
+
id: t._id,
|
|
149
|
+
status: t.status,
|
|
150
|
+
lastRunError: (_a = t.lastRun) === null || _a === void 0 ? void 0 : _a.error,
|
|
151
|
+
nextRunAt: t.nextRunAt,
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
return {
|
|
155
|
+
databaseName: (0, getMongoClient_1.getMongoClient)().db().databaseName,
|
|
156
|
+
reactiveTasks,
|
|
157
|
+
cronTasks,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
exports.OperationalTaskController = OperationalTaskController;
|
|
162
|
+
//# sourceMappingURL=OperationalTaskController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OperationalTaskController.js","sourceRoot":"","sources":["../../../../src/task-management/OperationalTaskController.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**!
|
|
2
|
+
* mongodash v2.1.0
|
|
3
|
+
* git+https://github.com/VaclavObornik/mongodash.git
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2025 Václav Oborník
|
|
6
|
+
* Released under the MIT license
|
|
7
|
+
*/
|
|
8
|
+
"use strict";
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
21
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
22
|
+
};
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
__exportStar(require("./OperationalTaskController"), exports);
|
|
25
|
+
__exportStar(require("./serveDashboard"), exports);
|
|
26
|
+
__exportStar(require("./types"), exports);
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/task-management/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8DAA4C;AAC5C,mDAAiC;AACjC,0CAAwB"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**!
|
|
2
|
+
* mongodash v2.1.0
|
|
3
|
+
* git+https://github.com/VaclavObornik/mongodash.git
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2025 Václav Oborník
|
|
6
|
+
* Released under the MIT license
|
|
7
|
+
*/
|
|
8
|
+
"use strict";
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.serveDashboard = serveDashboard;
|
|
11
|
+
const fs = require("fs");
|
|
12
|
+
const path = require("path");
|
|
13
|
+
const url_1 = require("url");
|
|
14
|
+
const index_1 = require("../reactiveTasks/index");
|
|
15
|
+
const OperationalTaskController_1 = require("./OperationalTaskController");
|
|
16
|
+
console.log('[serveDashboard.ts] Module loaded');
|
|
17
|
+
const mimeTypes = {
|
|
18
|
+
'.html': 'text/html',
|
|
19
|
+
'.js': 'text/javascript',
|
|
20
|
+
'.css': 'text/css',
|
|
21
|
+
'.json': 'application/json',
|
|
22
|
+
'.png': 'image/png',
|
|
23
|
+
'.jpg': 'image/jpeg',
|
|
24
|
+
'.gif': 'image/gif',
|
|
25
|
+
'.svg': 'image/svg+xml',
|
|
26
|
+
'.ico': 'image/x-icon',
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Serve the mongodash dashboard.
|
|
30
|
+
* Framework-agnostic: Works with Express, Koa, or native Node.js http.
|
|
31
|
+
* Returns true if the request was handled.
|
|
32
|
+
*/
|
|
33
|
+
async function serveDashboard(req, res, options = {}) {
|
|
34
|
+
const scheduler = options.scheduler || index_1._scheduler;
|
|
35
|
+
const controller = new OperationalTaskController_1.OperationalTaskController(scheduler);
|
|
36
|
+
// Default dashboard path: inside dist/dashboard of the package
|
|
37
|
+
// When running from src..., it might be elsewhere, but we assume it's integrated.
|
|
38
|
+
// __dirname is .../src/task-management
|
|
39
|
+
const dashboardPath = options.dashboardPath || path.resolve(__dirname, '../../dist/dashboard');
|
|
40
|
+
const parsedUrl = (0, url_1.parse)(req.url || '', true);
|
|
41
|
+
const pathname = parsedUrl.pathname || '/';
|
|
42
|
+
const method = (req.method || 'GET').toUpperCase();
|
|
43
|
+
// 1. Handle API Requests
|
|
44
|
+
// We look for /api/ in the path. This supports mounting with prefixes.
|
|
45
|
+
const apiIndex = pathname.indexOf('/api/');
|
|
46
|
+
if (apiIndex !== -1) {
|
|
47
|
+
const apiPath = pathname.substring(apiIndex); // e.g. /api/reactive/list
|
|
48
|
+
try {
|
|
49
|
+
if (method === 'GET' && apiPath === '/api/reactive/list') {
|
|
50
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
51
|
+
const result = await controller.getReactiveTasks(parsedUrl.query);
|
|
52
|
+
return sendJson(res, result);
|
|
53
|
+
}
|
|
54
|
+
if (method === 'POST' && apiPath === '/api/reactive/retry') {
|
|
55
|
+
const body = await getBody(req);
|
|
56
|
+
const result = await controller.retryReactiveTasks(body);
|
|
57
|
+
return sendJson(res, result);
|
|
58
|
+
}
|
|
59
|
+
if (method === 'GET' && apiPath === '/api/cron/list') {
|
|
60
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
61
|
+
const result = await controller.getCronTasks(parsedUrl.query);
|
|
62
|
+
return sendJson(res, result);
|
|
63
|
+
}
|
|
64
|
+
if (method === 'POST' && apiPath === '/api/cron/trigger') {
|
|
65
|
+
const body = await getBody(req);
|
|
66
|
+
const result = await controller.triggerCronTask(body);
|
|
67
|
+
return sendJson(res, result);
|
|
68
|
+
}
|
|
69
|
+
if (method === 'GET' && apiPath === '/api/info') {
|
|
70
|
+
const result = await controller.getInfo();
|
|
71
|
+
return sendJson(res, result);
|
|
72
|
+
}
|
|
73
|
+
// If it matched /api/ but no handler, we return false so parent can handle or 404
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
return sendError(res, err);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// 2. Handle Static Files
|
|
81
|
+
if (method === 'GET' && fs.existsSync(dashboardPath)) {
|
|
82
|
+
// We need to decide which part of pathname is the file.
|
|
83
|
+
// If mounted at /dash, pathname might be /dash/assets/log.png
|
|
84
|
+
// We try to find the file from the end of the pathname.
|
|
85
|
+
// Brute force: try suffixes? No, too slow.
|
|
86
|
+
// Better: The dashboard is a single-file build or limited assets.
|
|
87
|
+
// We can check if the pathname (or parts of it) exist in dashboardPath.
|
|
88
|
+
const pathParts = pathname.split('/').filter(Boolean);
|
|
89
|
+
// Try suffixes from longest to shortest
|
|
90
|
+
for (let i = 0; i < pathParts.length; i++) {
|
|
91
|
+
const potentialFile = pathParts.slice(i).join('/');
|
|
92
|
+
const filePath = path.join(dashboardPath, potentialFile);
|
|
93
|
+
if (fs.existsSync(filePath) && fs.statSync(filePath).isFile()) {
|
|
94
|
+
return pipeFile(res, filePath);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// 3. SPA Fallback
|
|
98
|
+
// If it's a GET request and no file found, and it looks like a dashboard route (no extension)
|
|
99
|
+
const lastPart = pathParts[pathParts.length - 1] || '';
|
|
100
|
+
if (!lastPart.includes('.') || pathname.endsWith('/')) {
|
|
101
|
+
const indexPath = path.join(dashboardPath, 'index.html');
|
|
102
|
+
if (fs.existsSync(indexPath)) {
|
|
103
|
+
return pipeFile(res, indexPath);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
async function getBody(req) {
|
|
110
|
+
// If body is already parsed (Express/Koa with body-parser)
|
|
111
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
112
|
+
if (req.body)
|
|
113
|
+
return req.body;
|
|
114
|
+
return new Promise((resolve, reject) => {
|
|
115
|
+
let body = '';
|
|
116
|
+
req.on('data', (chunk) => {
|
|
117
|
+
body += chunk.toString();
|
|
118
|
+
});
|
|
119
|
+
req.on('end', () => {
|
|
120
|
+
try {
|
|
121
|
+
resolve(body ? JSON.parse(body) : {});
|
|
122
|
+
}
|
|
123
|
+
catch (_a) {
|
|
124
|
+
reject(new Error('Invalid JSON body'));
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
req.on('error', reject);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
131
|
+
function sendJson(res, data) {
|
|
132
|
+
res.setHeader('Content-Type', 'application/json');
|
|
133
|
+
res.end(JSON.stringify(data));
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
function sendError(res, err) {
|
|
137
|
+
res.statusCode = 500;
|
|
138
|
+
res.setHeader('Content-Type', 'application/json');
|
|
139
|
+
res.end(JSON.stringify({ error: err instanceof Error ? err.message : String(err) }));
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
function pipeFile(res, filePath) {
|
|
143
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
144
|
+
const mime = mimeTypes[ext] || 'application/octet-stream';
|
|
145
|
+
res.setHeader('Content-Type', mime);
|
|
146
|
+
fs.createReadStream(filePath).pipe(res);
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=serveDashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serveDashboard.js","sourceRoot":"","sources":["../../../../src/task-management/serveDashboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**!
|
|
2
|
+
* mongodash v2.1.0
|
|
3
|
+
* git+https://github.com/VaclavObornik/mongodash.git
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2025 Václav Oborník
|
|
6
|
+
* Released under the MIT license
|
|
7
|
+
*/
|
|
8
|
+
"use strict";
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/task-management/types.ts"],"names":[],"mappings":""}
|