@kernhq/module-tracker 0.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/LICENSE +662 -0
- package/README.md +265 -0
- package/dist/contract/events.d.ts +140 -0
- package/dist/contract/events.d.ts.map +1 -0
- package/dist/contract/events.js +51 -0
- package/dist/contract/events.js.map +1 -0
- package/dist/contract/index.d.ts +6 -0
- package/dist/contract/index.d.ts.map +1 -0
- package/dist/contract/index.js +6 -0
- package/dist/contract/index.js.map +1 -0
- package/dist/contract/models.d.ts +2547 -0
- package/dist/contract/models.d.ts.map +1 -0
- package/dist/contract/models.js +1214 -0
- package/dist/contract/models.js.map +1 -0
- package/dist/contract/notifications.d.ts +4 -0
- package/dist/contract/notifications.d.ts.map +1 -0
- package/dist/contract/notifications.js +46 -0
- package/dist/contract/notifications.js.map +1 -0
- package/dist/contract/permissions.d.ts +161 -0
- package/dist/contract/permissions.d.ts.map +1 -0
- package/dist/contract/permissions.js +192 -0
- package/dist/contract/permissions.js.map +1 -0
- package/dist/contract/router.d.ts +9659 -0
- package/dist/contract/router.d.ts.map +1 -0
- package/dist/contract/router.js +732 -0
- package/dist/contract/router.js.map +1 -0
- package/dist/kql/ast.d.ts +90 -0
- package/dist/kql/ast.d.ts.map +1 -0
- package/dist/kql/ast.js +80 -0
- package/dist/kql/ast.js.map +1 -0
- package/dist/kql/dates.d.ts +16 -0
- package/dist/kql/dates.d.ts.map +1 -0
- package/dist/kql/dates.js +54 -0
- package/dist/kql/dates.js.map +1 -0
- package/dist/kql/fields.d.ts +61 -0
- package/dist/kql/fields.d.ts.map +1 -0
- package/dist/kql/fields.js +106 -0
- package/dist/kql/fields.js.map +1 -0
- package/dist/kql/index.d.ts +16 -0
- package/dist/kql/index.d.ts.map +1 -0
- package/dist/kql/index.js +16 -0
- package/dist/kql/index.js.map +1 -0
- package/dist/kql/lexer.d.ts +28 -0
- package/dist/kql/lexer.d.ts.map +1 -0
- package/dist/kql/lexer.js +127 -0
- package/dist/kql/lexer.js.map +1 -0
- package/dist/kql/parser.d.ts +14 -0
- package/dist/kql/parser.d.ts.map +1 -0
- package/dist/kql/parser.js +290 -0
- package/dist/kql/parser.js.map +1 -0
- package/dist/kql/suggest.d.ts +8 -0
- package/dist/kql/suggest.d.ts.map +1 -0
- package/dist/kql/suggest.js +96 -0
- package/dist/kql/suggest.js.map +1 -0
- package/dist/kql/validate.d.ts +10 -0
- package/dist/kql/validate.d.ts.map +1 -0
- package/dist/kql/validate.js +84 -0
- package/dist/kql/validate.js.map +1 -0
- package/dist/server/index.d.ts +17 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +583 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/kql/compile.d.ts +49 -0
- package/dist/server/kql/compile.d.ts.map +1 -0
- package/dist/server/kql/compile.js +372 -0
- package/dist/server/kql/compile.js.map +1 -0
- package/dist/server/rank.d.ts +23 -0
- package/dist/server/rank.d.ts.map +1 -0
- package/dist/server/rank.js +66 -0
- package/dist/server/rank.js.map +1 -0
- package/dist/server/rich.d.ts +30 -0
- package/dist/server/rich.d.ts.map +1 -0
- package/dist/server/rich.js +97 -0
- package/dist/server/rich.js.map +1 -0
- package/dist/server/router.d.ts +10589 -0
- package/dist/server/router.d.ts.map +1 -0
- package/dist/server/router.js +431 -0
- package/dist/server/router.js.map +1 -0
- package/dist/server/schema.d.ts +6622 -0
- package/dist/server/schema.d.ts.map +1 -0
- package/dist/server/schema.js +581 -0
- package/dist/server/schema.js.map +1 -0
- package/dist/server/services/access.d.ts +53 -0
- package/dist/server/services/access.d.ts.map +1 -0
- package/dist/server/services/access.js +146 -0
- package/dist/server/services/access.js.map +1 -0
- package/dist/server/services/comments.d.ts +36 -0
- package/dist/server/services/comments.d.ts.map +1 -0
- package/dist/server/services/comments.js +231 -0
- package/dist/server/services/comments.js.map +1 -0
- package/dist/server/services/config.d.ts +130 -0
- package/dist/server/services/config.d.ts.map +1 -0
- package/dist/server/services/config.js +797 -0
- package/dist/server/services/config.js.map +1 -0
- package/dist/server/services/db.d.ts +93 -0
- package/dist/server/services/db.d.ts.map +1 -0
- package/dist/server/services/db.js +519 -0
- package/dist/server/services/db.js.map +1 -0
- package/dist/server/services/imports.d.ts +37 -0
- package/dist/server/services/imports.d.ts.map +1 -0
- package/dist/server/services/imports.js +324 -0
- package/dist/server/services/imports.js.map +1 -0
- package/dist/server/services/index.d.ts +36 -0
- package/dist/server/services/index.d.ts.map +1 -0
- package/dist/server/services/index.js +57 -0
- package/dist/server/services/index.js.map +1 -0
- package/dist/server/services/intake.d.ts +47 -0
- package/dist/server/services/intake.d.ts.map +1 -0
- package/dist/server/services/intake.js +268 -0
- package/dist/server/services/intake.js.map +1 -0
- package/dist/server/services/issues.d.ts +763 -0
- package/dist/server/services/issues.d.ts.map +1 -0
- package/dist/server/services/issues.js +1381 -0
- package/dist/server/services/issues.js.map +1 -0
- package/dist/server/services/notify.d.ts +51 -0
- package/dist/server/services/notify.d.ts.map +1 -0
- package/dist/server/services/notify.js +90 -0
- package/dist/server/services/notify.js.map +1 -0
- package/dist/server/services/planning.d.ts +62 -0
- package/dist/server/services/planning.d.ts.map +1 -0
- package/dist/server/services/planning.js +614 -0
- package/dist/server/services/planning.js.map +1 -0
- package/dist/server/services/projects.d.ts +43 -0
- package/dist/server/services/projects.d.ts.map +1 -0
- package/dist/server/services/projects.js +375 -0
- package/dist/server/services/projects.js.map +1 -0
- package/dist/server/services/query.d.ts +24 -0
- package/dist/server/services/query.d.ts.map +1 -0
- package/dist/server/services/query.js +312 -0
- package/dist/server/services/query.js.map +1 -0
- package/dist/server/services/reports.d.ts +30 -0
- package/dist/server/services/reports.d.ts.map +1 -0
- package/dist/server/services/reports.js +295 -0
- package/dist/server/services/reports.js.map +1 -0
- package/dist/server/services/time.d.ts +53 -0
- package/dist/server/services/time.d.ts.map +1 -0
- package/dist/server/services/time.js +192 -0
- package/dist/server/services/time.js.map +1 -0
- package/dist/server/services/transitions.d.ts +61 -0
- package/dist/server/services/transitions.d.ts.map +1 -0
- package/dist/server/services/transitions.js +493 -0
- package/dist/server/services/transitions.js.map +1 -0
- package/dist/server/services/views.d.ts +33 -0
- package/dist/server/services/views.d.ts.map +1 -0
- package/dist/server/services/views.js +195 -0
- package/dist/server/services/views.js.map +1 -0
- package/migrations/0000_init.sql +529 -0
- package/migrations/0001_rls.sql +259 -0
- package/migrations/meta/0000_snapshot.json +4140 -0
- package/migrations/meta/_journal.json +20 -0
- package/package.json +82 -0
- package/src/client/api.ts +15 -0
- package/src/client/format.ts +164 -0
- package/src/client/group.ts +150 -0
- package/src/client/index.ts +60 -0
- package/src/client/kql.ts +492 -0
- package/src/client/rank.ts +87 -0
- package/src/client/types.ts +57 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { walkComparisons } from './ast.js';
|
|
2
|
+
import { findField, KQL_FUNCTIONS, operatorsFor } from './fields.js';
|
|
3
|
+
const FUNCTIONS = new Map(KQL_FUNCTIONS.map((f) => [f.name.toLowerCase(), f]));
|
|
4
|
+
const argCountOk = (spec, got) => typeof spec === 'number' ? got === spec : spec === '0-1' ? got <= 1 : true;
|
|
5
|
+
/** Semantic checks: known fields, operators the field supports, plausible values, known functions. */
|
|
6
|
+
export function validateQuery(query, fields) {
|
|
7
|
+
const issues = [];
|
|
8
|
+
walkComparisons(query.where, (cmp) => issues.push(...checkComparison(cmp, fields)));
|
|
9
|
+
for (const order of query.orderBy) {
|
|
10
|
+
const field = findField(fields, order.field);
|
|
11
|
+
if (!field) {
|
|
12
|
+
issues.push({ message: `Unknown field "${order.field}"`, ...order.span });
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
// only fields explicitly marked sortable have a deterministic column to order by
|
|
16
|
+
if (!field.sortable)
|
|
17
|
+
issues.push({ message: `Field "${order.field}" cannot be sorted on`, ...order.span });
|
|
18
|
+
}
|
|
19
|
+
return issues;
|
|
20
|
+
}
|
|
21
|
+
function checkComparison(cmp, fields) {
|
|
22
|
+
const issues = [];
|
|
23
|
+
const field = findField(fields, cmp.field);
|
|
24
|
+
if (!field) {
|
|
25
|
+
return [{ message: `Unknown field "${cmp.field}"`, start: cmp.span.start, end: cmp.span.end }];
|
|
26
|
+
}
|
|
27
|
+
const allowed = operatorsFor(field);
|
|
28
|
+
if (!allowed.includes(cmp.op))
|
|
29
|
+
issues.push({
|
|
30
|
+
message: `Operator "${cmp.op}" is not supported for "${field.name}" (try ${allowed.join(', ')})`,
|
|
31
|
+
start: cmp.span.start,
|
|
32
|
+
end: cmp.span.end,
|
|
33
|
+
});
|
|
34
|
+
for (const v of [cmp.value, ...(cmp.values ?? [])])
|
|
35
|
+
if (v)
|
|
36
|
+
issues.push(...checkValue(v, field));
|
|
37
|
+
return issues;
|
|
38
|
+
}
|
|
39
|
+
function checkValue(value, field) {
|
|
40
|
+
if (value.kind === 'func') {
|
|
41
|
+
const spec = FUNCTIONS.get(value.name.toLowerCase());
|
|
42
|
+
if (!spec)
|
|
43
|
+
return [{ message: `Unknown function "${value.name}()"`, ...value.span }];
|
|
44
|
+
if (!argCountOk(spec.args, value.args.length))
|
|
45
|
+
return [{ message: `${value.name}() expects ${spec.args} argument(s)`, ...value.span }];
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
if (value.kind === 'null')
|
|
49
|
+
return [];
|
|
50
|
+
switch (field.kind) {
|
|
51
|
+
case 'number':
|
|
52
|
+
if (value.kind !== 'number')
|
|
53
|
+
return [{ message: `"${field.name}" expects a number`, ...value.span }];
|
|
54
|
+
return [];
|
|
55
|
+
case 'boolean':
|
|
56
|
+
if (value.kind !== 'bool')
|
|
57
|
+
return [{ message: `"${field.name}" expects true or false`, ...value.span }];
|
|
58
|
+
return [];
|
|
59
|
+
case 'date':
|
|
60
|
+
case 'datetime':
|
|
61
|
+
if (value.kind !== 'date' && value.kind !== 'reldate')
|
|
62
|
+
return [
|
|
63
|
+
{
|
|
64
|
+
message: `"${field.name}" expects a date (2026-08-22), a relative date (-7d) or a function`,
|
|
65
|
+
...value.span,
|
|
66
|
+
},
|
|
67
|
+
];
|
|
68
|
+
return [];
|
|
69
|
+
case 'enum': {
|
|
70
|
+
const text = value.kind === 'string' || value.kind === 'ident' ? String(value.value) : null;
|
|
71
|
+
if (text && field.enumValues && !field.enumValues.includes(text.toLowerCase()))
|
|
72
|
+
return [
|
|
73
|
+
{
|
|
74
|
+
message: `"${text}" is not a valid ${field.name} (${field.enumValues.join(', ')})`,
|
|
75
|
+
...value.span,
|
|
76
|
+
},
|
|
77
|
+
];
|
|
78
|
+
return [];
|
|
79
|
+
}
|
|
80
|
+
default:
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/kql/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export * from './rank.js';
|
|
3
|
+
export * from './rich.js';
|
|
4
|
+
export { trackerRouter } from './router.js';
|
|
5
|
+
export * from './schema.js';
|
|
6
|
+
export * from './services/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* The tracker module: projects, work items, workflows, KQL, planning, time tracking and reports.
|
|
9
|
+
*
|
|
10
|
+
* Hosted by the core service by default. Like every Kern module it is reachable from anywhere through
|
|
11
|
+
* `/api/tracker` and `kernel.call('tracker.*')`, so a deployment that outgrows core can move it to its
|
|
12
|
+
* own service by registering it there instead.
|
|
13
|
+
*/
|
|
14
|
+
export declare const trackerModule: import("@kernhq/kernel").ServerModule<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
|
|
15
|
+
export default trackerModule;
|
|
16
|
+
export type TrackerModule = typeof trackerModule;
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAiBvB,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,cAAc,aAAa,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AAqNnC;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,gHA0cxB,CAAA;AAsBF,eAAe,aAAa,CAAA;AAC5B,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAA"}
|