@x12i/memorix-service 3.8.0 → 3.10.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.
Files changed (79) hide show
  1. package/dist/analytics/definition.d.ts +158 -0
  2. package/dist/analytics/definition.d.ts.map +1 -0
  3. package/dist/analytics/definition.js +439 -0
  4. package/dist/analytics/definition.js.map +1 -0
  5. package/dist/analytics/engine.d.ts +63 -0
  6. package/dist/analytics/engine.d.ts.map +1 -0
  7. package/dist/analytics/engine.js +181 -0
  8. package/dist/analytics/engine.js.map +1 -0
  9. package/dist/analytics/host.d.ts +15 -0
  10. package/dist/analytics/host.d.ts.map +1 -0
  11. package/dist/analytics/host.js +129 -0
  12. package/dist/analytics/host.js.map +1 -0
  13. package/dist/analytics/materializer.d.ts +88 -0
  14. package/dist/analytics/materializer.d.ts.map +1 -0
  15. package/dist/analytics/materializer.js +358 -0
  16. package/dist/analytics/materializer.js.map +1 -0
  17. package/dist/analytics/pipeline-port.d.ts +10 -0
  18. package/dist/analytics/pipeline-port.d.ts.map +1 -0
  19. package/dist/analytics/pipeline-port.js +42 -0
  20. package/dist/analytics/pipeline-port.js.map +1 -0
  21. package/dist/analytics/projector.d.ts +60 -0
  22. package/dist/analytics/projector.d.ts.map +1 -0
  23. package/dist/analytics/projector.js +262 -0
  24. package/dist/analytics/projector.js.map +1 -0
  25. package/dist/analytics/state.d.ts +83 -0
  26. package/dist/analytics/state.d.ts.map +1 -0
  27. package/dist/analytics/state.js +273 -0
  28. package/dist/analytics/state.js.map +1 -0
  29. package/dist/analytics/tracker.d.ts +182 -0
  30. package/dist/analytics/tracker.d.ts.map +1 -0
  31. package/dist/analytics/tracker.js +1302 -0
  32. package/dist/analytics/tracker.js.map +1 -0
  33. package/dist/app.d.ts.map +1 -1
  34. package/dist/app.js +8 -0
  35. package/dist/app.js.map +1 -1
  36. package/dist/caller-identity.d.ts.map +1 -1
  37. package/dist/caller-identity.js +2 -0
  38. package/dist/caller-identity.js.map +1 -1
  39. package/dist/content-census-countex.d.ts +15 -0
  40. package/dist/content-census-countex.d.ts.map +1 -0
  41. package/dist/content-census-countex.js +18 -0
  42. package/dist/content-census-countex.js.map +1 -0
  43. package/dist/datasource-backfill.d.ts +39 -0
  44. package/dist/datasource-backfill.d.ts.map +1 -0
  45. package/dist/datasource-backfill.js +206 -0
  46. package/dist/datasource-backfill.js.map +1 -0
  47. package/dist/errors.d.ts.map +1 -1
  48. package/dist/errors.js +5 -0
  49. package/dist/errors.js.map +1 -1
  50. package/dist/index.d.ts +4 -0
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +3 -0
  53. package/dist/index.js.map +1 -1
  54. package/dist/markdown-backfill.d.ts +23 -0
  55. package/dist/markdown-backfill.d.ts.map +1 -0
  56. package/dist/markdown-backfill.js +122 -0
  57. package/dist/markdown-backfill.js.map +1 -0
  58. package/dist/openapi/openapi.json +1151 -81
  59. package/dist/platform.d.ts +6 -0
  60. package/dist/platform.d.ts.map +1 -1
  61. package/dist/platform.js +55 -2
  62. package/dist/platform.js.map +1 -1
  63. package/dist/routes/analytics-counters.d.ts +8 -0
  64. package/dist/routes/analytics-counters.d.ts.map +1 -0
  65. package/dist/routes/analytics-counters.js +100 -0
  66. package/dist/routes/analytics-counters.js.map +1 -0
  67. package/dist/routes/data.d.ts.map +1 -1
  68. package/dist/routes/data.js +212 -3
  69. package/dist/routes/data.js.map +1 -1
  70. package/dist/routes/datasource-backfill.d.ts +4 -0
  71. package/dist/routes/datasource-backfill.d.ts.map +1 -0
  72. package/dist/routes/datasource-backfill.js +22 -0
  73. package/dist/routes/datasource-backfill.js.map +1 -0
  74. package/dist/routes/markdown-backfill.d.ts +4 -0
  75. package/dist/routes/markdown-backfill.d.ts.map +1 -0
  76. package/dist/routes/markdown-backfill.js +15 -0
  77. package/dist/routes/markdown-backfill.js.map +1 -0
  78. package/openapi/openapi.json +1151 -81
  79. package/package.json +5 -5
@@ -0,0 +1,158 @@
1
+ export type AnalyticsPredicate = {
2
+ property: string;
3
+ equals?: unknown;
4
+ in?: unknown[];
5
+ exists?: boolean;
6
+ };
7
+ export type AnalyticsWhere = AnalyticsPredicate | AnalyticsPredicate[];
8
+ export type AnalyticsWindow = "24h" | "7d" | "30d";
9
+ export type CounterScopeProperty = {
10
+ key: string;
11
+ abstractType: string;
12
+ property: string;
13
+ };
14
+ export type CounterMeasure = {
15
+ key: string;
16
+ kind: "count" | "distinct" | "sum" | "mean" | "max";
17
+ abstractType: string;
18
+ property?: string;
19
+ where?: AnalyticsWhere;
20
+ windows?: AnalyticsWindow[];
21
+ };
22
+ export type CounterGroup = {
23
+ key: string;
24
+ abstractType: string;
25
+ property: string;
26
+ buckets?: string[];
27
+ subject?: string;
28
+ where?: AnalyticsWhere;
29
+ split?: {
30
+ key: string;
31
+ property: string;
32
+ buckets: string[];
33
+ missing?: string;
34
+ };
35
+ };
36
+ export type CounterSplit = {
37
+ key: string;
38
+ abstractType: string;
39
+ property: string;
40
+ buckets: string[];
41
+ totalKey: string;
42
+ subsetKey: string;
43
+ subset: AnalyticsPredicate;
44
+ };
45
+ export type CounterUnwind = {
46
+ key: string;
47
+ abstractType: string;
48
+ arrayProperty: string;
49
+ columns: Array<{
50
+ key: string;
51
+ path: string;
52
+ }>;
53
+ aggregates?: Array<{
54
+ key: string;
55
+ kind: "count" | "sum" | "max" | "distinct" | "group-count";
56
+ path?: string;
57
+ buckets?: string[];
58
+ }>;
59
+ };
60
+ export type CounterLeaders = {
61
+ key: string;
62
+ abstractType: string;
63
+ idProperty: string;
64
+ labelProperty: string;
65
+ limit?: number;
66
+ countOf?: {
67
+ abstractType: string;
68
+ property: string;
69
+ where?: AnalyticsWhere;
70
+ };
71
+ sort?: Array<{
72
+ property: string;
73
+ direction?: "asc" | "desc";
74
+ }>;
75
+ columns?: Array<{
76
+ key: string;
77
+ kind: "value" | "count" | "max" | "sum" | "distinct";
78
+ property?: string;
79
+ }>;
80
+ };
81
+ export type CounterDefinition = {
82
+ id: string;
83
+ name: string;
84
+ scope?: [CounterScopeProperty, CounterScopeProperty];
85
+ clock?: {
86
+ abstractType: string;
87
+ property: string;
88
+ };
89
+ target: {
90
+ objectType: string;
91
+ contentType: string;
92
+ recordId: string;
93
+ };
94
+ history?: {
95
+ recordId: string;
96
+ limit?: number;
97
+ };
98
+ measures?: CounterMeasure[];
99
+ groups?: CounterGroup[];
100
+ ratios?: Array<{
101
+ key: string;
102
+ numerator: string;
103
+ denominator: string;
104
+ }>;
105
+ derived?: Array<{
106
+ key: string;
107
+ op: "sum" | "difference" | "ratio";
108
+ terms: string[];
109
+ }>;
110
+ splits?: CounterSplit[];
111
+ unwinds?: CounterUnwind[];
112
+ leaders?: CounterLeaders[];
113
+ coverage?: Array<{
114
+ key: string;
115
+ abstractType: string;
116
+ where?: AnalyticsWhere;
117
+ expected: number | {
118
+ measure: string;
119
+ };
120
+ }>;
121
+ deltas?: Array<{
122
+ key: string;
123
+ measure: string;
124
+ }>;
125
+ transitions?: Array<{
126
+ key: string;
127
+ abstractType: string;
128
+ property: string;
129
+ identityProperty?: string;
130
+ }>;
131
+ trends?: Array<{
132
+ key: string;
133
+ label: string;
134
+ measure: string;
135
+ windows: Array<"snapshots" | "7d" | "30d">;
136
+ }>;
137
+ };
138
+ export declare const PSEUDO_PROPERTIES: Set<string>;
139
+ export declare function whereList(where: AnalyticsWhere | undefined): AnalyticsPredicate[];
140
+ /** Abstract types whose subjects feed this definition, in declaration order. */
141
+ export declare function abstractTypesOf(def: CounterDefinition): string[];
142
+ export declare function usesDatasource(def: CounterDefinition): boolean;
143
+ export declare function definitionHash(def: CounterDefinition): string;
144
+ /** What the validator needs to know about installed metadata for the registering scope. */
145
+ export type CounterCatalog = {
146
+ /** Declared properties with optional enum; null when the abstract type is unknown. */
147
+ abstractProperties(abstractType: string): Map<string, {
148
+ enum?: string[];
149
+ }> | null;
150
+ hasObjectType(objectType: string): boolean;
151
+ };
152
+ export type CounterValidationIssue = {
153
+ path: string;
154
+ code: string;
155
+ message: string;
156
+ };
157
+ export declare function validateCounterDefinition(raw: unknown, catalog: CounterCatalog): CounterValidationIssue[];
158
+ //# sourceMappingURL=definition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/analytics/definition.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,kBAAkB,GAAG,kBAAkB,EAAE,CAAC;AAEvE,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC;AAEnD,MAAM,MAAM,oBAAoB,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3F,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;IACpD,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,KAAK,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAChF,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,kBAAkB,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9C,UAAU,CAAC,EAAE,KAAK,CAAC;QACjB,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,GAAG,aAAa,CAAC;QAC3D,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC,CAAC;CACJ,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,cAAc,CAAA;KAAE,CAAC;IAC7E,IAAI,CAAC,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/D,OAAO,CAAC,EAAE,KAAK,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;QACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;CACJ,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,CAAC;IACrD,KAAK,CAAC,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE,OAAO,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAC5B,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxE,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,KAAK,GAAG,YAAY,GAAG,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACtF,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,YAAY,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE,cAAc,CAAC;QACvB,QAAQ,EAAE,MAAM,GAAG;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;KACxC,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxG,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,CAAA;KAAE,CAAC,CAAC;CAC7G,CAAC;AAEF,eAAO,MAAM,iBAAiB,aAAuC,CAAC;AAGtE,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,GAAG,kBAAkB,EAAE,CAGjF;AAED,gFAAgF;AAChF,wBAAgB,eAAe,CAAC,GAAG,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAYhE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAmB9D;AAcD,wBAAgB,cAAc,CAAC,GAAG,EAAE,iBAAiB,GAAG,MAAM,CAE7D;AAED,2FAA2F;AAC3F,MAAM,MAAM,cAAc,GAAG;IAC3B,sFAAsF;IACtF,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IAClF,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAMrF,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,cAAc,GACtB,sBAAsB,EAAE,CA4V1B"}
@@ -0,0 +1,439 @@
1
+ /**
2
+ * Counter definitions — the `analytics` kind shape (memorix-metadata ≥ 3.4.0), kept local
3
+ * so the service validates runtime registrations the same way packs are validated.
4
+ */
5
+ import { createHash } from "node:crypto";
6
+ export const PSEUDO_PROPERTIES = new Set(["recordId", "@datasource"]);
7
+ const RESERVED_BUCKETS = new Set(["", "none", "unknown"]);
8
+ export function whereList(where) {
9
+ if (!where)
10
+ return [];
11
+ return Array.isArray(where) ? where : [where];
12
+ }
13
+ /** Abstract types whose subjects feed this definition, in declaration order. */
14
+ export function abstractTypesOf(def) {
15
+ const out = new Set();
16
+ for (const m of def.measures ?? [])
17
+ out.add(m.abstractType);
18
+ for (const g of def.groups ?? [])
19
+ out.add(g.abstractType);
20
+ for (const s of def.splits ?? [])
21
+ out.add(s.abstractType);
22
+ for (const u of def.unwinds ?? [])
23
+ out.add(u.abstractType);
24
+ for (const l of def.leaders ?? []) {
25
+ if (l.countOf)
26
+ out.add(l.countOf.abstractType);
27
+ }
28
+ for (const c of def.coverage ?? [])
29
+ out.add(c.abstractType);
30
+ for (const t of def.transitions ?? [])
31
+ out.add(t.abstractType);
32
+ return [...out].filter(Boolean);
33
+ }
34
+ export function usesDatasource(def) {
35
+ const props = [];
36
+ for (const m of def.measures ?? []) {
37
+ if (m.property)
38
+ props.push(m.property);
39
+ for (const p of whereList(m.where))
40
+ props.push(p.property);
41
+ }
42
+ for (const g of def.groups ?? []) {
43
+ props.push(g.property);
44
+ if (g.split)
45
+ props.push(g.split.property);
46
+ for (const p of whereList(g.where))
47
+ props.push(p.property);
48
+ }
49
+ for (const l of def.leaders ?? []) {
50
+ if (l.countOf) {
51
+ props.push(l.countOf.property);
52
+ for (const p of whereList(l.countOf.where))
53
+ props.push(p.property);
54
+ }
55
+ }
56
+ for (const c of def.coverage ?? [])
57
+ for (const p of whereList(c.where))
58
+ props.push(p.property);
59
+ return props.includes("@datasource");
60
+ }
61
+ function stable(value) {
62
+ if (Array.isArray(value))
63
+ return value.map(stable);
64
+ if (value && typeof value === "object") {
65
+ const out = {};
66
+ for (const k of Object.keys(value).sort()) {
67
+ out[k] = stable(value[k]);
68
+ }
69
+ return out;
70
+ }
71
+ return value;
72
+ }
73
+ export function definitionHash(def) {
74
+ return createHash("sha1").update(JSON.stringify(stable(def))).digest("hex").slice(0, 16);
75
+ }
76
+ function isNonEmptyString(v) {
77
+ return typeof v === "string" && v.trim().length > 0;
78
+ }
79
+ export function validateCounterDefinition(raw, catalog) {
80
+ const issues = [];
81
+ const push = (path, code, message) => issues.push({ path, code, message });
82
+ const str = (v, path) => {
83
+ if (!isNonEmptyString(v))
84
+ push(path, "META-REQUIRED", `${path} must be a non-empty string`);
85
+ return isNonEmptyString(v);
86
+ };
87
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
88
+ push("definition", "META-TYPE", "definition must be an object");
89
+ return issues;
90
+ }
91
+ const d = raw;
92
+ str(d.id, "id");
93
+ str(d.name, "name");
94
+ if (isNonEmptyString(d.id) && !/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(d.id)) {
95
+ push("id", "META-TYPE", "id may contain letters, digits, dot, underscore, and dash");
96
+ }
97
+ const prop = (abstractType, property, path) => {
98
+ const props = catalog.abstractProperties(abstractType);
99
+ if (!props) {
100
+ push(path, "META-REF-ABSTRACT", `unknown abstract "${abstractType}"`);
101
+ return null;
102
+ }
103
+ if (PSEUDO_PROPERTIES.has(property))
104
+ return null;
105
+ if (props.size > 0 && !props.has(property)) {
106
+ push(path, "META-REF-PROP", `unknown property "${property}" on "${abstractType}"`);
107
+ return null;
108
+ }
109
+ return props.get(property) ?? null;
110
+ };
111
+ const where = (w, abstractType, path) => {
112
+ if (w === undefined)
113
+ return;
114
+ const list = Array.isArray(w) ? w : [w];
115
+ if (list.length === 0)
116
+ push(path, "META-TYPE", `${path} must be a predicate or a non-empty array`);
117
+ list.forEach((p, i) => {
118
+ const pp = Array.isArray(w) ? `${path}[${i}]` : path;
119
+ if (!p || typeof p !== "object") {
120
+ push(pp, "META-TYPE", `${pp} must be an object`);
121
+ return;
122
+ }
123
+ const pr = p;
124
+ if (str(pr.property, `${pp}.property`))
125
+ prop(abstractType, pr.property, pp);
126
+ const forms = ["equals", "in", "exists"].filter((k) => k in pr);
127
+ if (forms.length !== 1)
128
+ push(pp, "META-REQUIRED", `${pp} must set exactly one of equals, in, exists`);
129
+ else if (forms[0] === "in" && (!Array.isArray(pr.in) || pr.in.length === 0)) {
130
+ push(`${pp}.in`, "META-TYPE", `${pp}.in must be a non-empty array`);
131
+ }
132
+ else if (forms[0] === "exists" && typeof pr.exists !== "boolean") {
133
+ push(`${pp}.exists`, "META-TYPE", `${pp}.exists must be a boolean`);
134
+ }
135
+ });
136
+ };
137
+ const buckets = (list, path, enumProp) => {
138
+ if (!Array.isArray(list) || list.length === 0) {
139
+ push(path, "META-REQUIRED", `${path} must be a non-empty array`);
140
+ return false;
141
+ }
142
+ const seen = new Set();
143
+ list.forEach((b, i) => {
144
+ if (typeof b !== "string") {
145
+ push(`${path}[${i}]`, "META-ENUM", `${path}[${i}] must be a string`);
146
+ return;
147
+ }
148
+ if (RESERVED_BUCKETS.has(b.trim().toLowerCase())) {
149
+ push(`${path}[${i}]`, "META-ANALYTICS-BUCKET", `"${b}" is not a vocabulary member; use split.missing for absent values`);
150
+ }
151
+ if (seen.has(b))
152
+ push(`${path}[${i}]`, "META-DUP", `duplicate bucket "${b}"`);
153
+ seen.add(b);
154
+ if (enumProp?.enum && !enumProp.enum.includes(b)) {
155
+ push(path, "META-ENUM-BUCKET", `bucket "${b}" is not in the property enum`);
156
+ }
157
+ });
158
+ return true;
159
+ };
160
+ if (d.scope !== undefined) {
161
+ if (!Array.isArray(d.scope) || d.scope.length !== 2) {
162
+ push("scope", "META-ANALYTICS-SCOPE", "scope must be an ordered pair of two properties");
163
+ }
164
+ else {
165
+ d.scope.forEach((s, i) => {
166
+ if (str(s?.key, `scope[${i}].key`) && str(s?.abstractType, `scope[${i}].abstractType`)) {
167
+ if (str(s.property, `scope[${i}].property`))
168
+ prop(s.abstractType, s.property, `scope[${i}]`);
169
+ }
170
+ });
171
+ }
172
+ }
173
+ if (d.clock !== undefined) {
174
+ if (str(d.clock?.abstractType, "clock.abstractType") && str(d.clock.property, "clock.property")) {
175
+ prop(d.clock.abstractType, d.clock.property, "clock");
176
+ }
177
+ }
178
+ if (!d.target || typeof d.target !== "object") {
179
+ push("target", "META-REQUIRED", "target is required");
180
+ }
181
+ else {
182
+ if (str(d.target.objectType, "target.objectType") && !catalog.hasObjectType(d.target.objectType)) {
183
+ push("target.objectType", "META-REF-OBJECT", `unknown object type "${d.target.objectType}"`);
184
+ }
185
+ str(d.target.contentType, "target.contentType");
186
+ str(d.target.recordId, "target.recordId");
187
+ }
188
+ if (d.history !== undefined) {
189
+ str(d.history?.recordId, "history.recordId");
190
+ if (d.history?.limit !== undefined &&
191
+ (!Number.isInteger(d.history.limit) || d.history.limit < 1)) {
192
+ push("history.limit", "META-TYPE", "history.limit must be a positive integer");
193
+ }
194
+ }
195
+ const keys = new Set();
196
+ const uniqueKey = (key, path) => {
197
+ if (!str(key, path))
198
+ return;
199
+ if (keys.has(key))
200
+ push(path, "META-DUP", `duplicate key "${key}"`);
201
+ keys.add(key);
202
+ };
203
+ const measureKeys = new Set();
204
+ (d.measures ?? []).forEach((m, i) => {
205
+ const mp = `measures[${i}]`;
206
+ uniqueKey(m?.key, `${mp}.key`);
207
+ if (isNonEmptyString(m?.key))
208
+ measureKeys.add(m.key);
209
+ if (!["count", "distinct", "sum", "mean", "max"].includes(m?.kind)) {
210
+ push(`${mp}.kind`, "META-ANALYTICS", `${mp}.kind must be count|distinct|sum|mean|max`);
211
+ }
212
+ if (!str(m?.abstractType, `${mp}.abstractType`))
213
+ return;
214
+ if (m.kind !== "count") {
215
+ if (str(m.property, `${mp}.property`))
216
+ prop(m.abstractType, m.property, `${mp}.property`);
217
+ }
218
+ else if (!catalog.abstractProperties(m.abstractType)) {
219
+ push(`${mp}.abstractType`, "META-REF-ABSTRACT", `unknown abstract "${m.abstractType}"`);
220
+ return;
221
+ }
222
+ where(m.where, m.abstractType, `${mp}.where`);
223
+ if (m.windows !== undefined) {
224
+ if (m.kind !== "count")
225
+ push(`${mp}.windows`, "META-ANALYTICS", "windows is only valid for kind count");
226
+ if (!Array.isArray(m.windows) || m.windows.length === 0) {
227
+ push(`${mp}.windows`, "META-TYPE", `${mp}.windows must be a non-empty array`);
228
+ }
229
+ else {
230
+ m.windows.forEach((w, j) => {
231
+ if (!["24h", "7d", "30d"].includes(w)) {
232
+ push(`${mp}.windows[${j}]`, "META-ANALYTICS", "window must be 24h|7d|30d");
233
+ }
234
+ });
235
+ }
236
+ }
237
+ });
238
+ const groupBuckets = new Map();
239
+ (d.groups ?? []).forEach((g, i) => {
240
+ const gp = `groups[${i}]`;
241
+ uniqueKey(g?.key, `${gp}.key`);
242
+ if (!str(g?.abstractType, `${gp}.abstractType`) || !str(g.property, `${gp}.property`))
243
+ return;
244
+ const p = prop(g.abstractType, g.property, gp);
245
+ if (g.property === "@datasource" && g.buckets === undefined) {
246
+ groupBuckets.set(g.key, "open");
247
+ }
248
+ else if (buckets(g.buckets, `${gp}.buckets`, p)) {
249
+ groupBuckets.set(g.key, new Set(g.buckets));
250
+ }
251
+ if (g.subject !== undefined)
252
+ str(g.subject, `${gp}.subject`);
253
+ where(g.where, g.abstractType, `${gp}.where`);
254
+ if (g.split !== undefined) {
255
+ const sp = `${gp}.split`;
256
+ str(g.split?.key, `${sp}.key`);
257
+ if (str(g.split?.property, `${sp}.property`)) {
258
+ const splitProp = prop(g.abstractType, g.split.property, sp);
259
+ buckets(g.split.buckets, `${sp}.buckets`, splitProp);
260
+ }
261
+ if (g.split?.missing !== undefined) {
262
+ if (str(g.split.missing, `${sp}.missing`) && g.split.buckets?.includes(g.split.missing)) {
263
+ push(`${sp}.missing`, "META-ANALYTICS-BUCKET", "missing must not also be a declared bucket");
264
+ }
265
+ }
266
+ }
267
+ });
268
+ const ratioKeys = new Set();
269
+ (d.ratios ?? []).forEach((r, i) => {
270
+ const rp = `ratios[${i}]`;
271
+ uniqueKey(r?.key, `${rp}.key`);
272
+ if (isNonEmptyString(r?.key))
273
+ ratioKeys.add(r.key);
274
+ if (str(r?.numerator, `${rp}.numerator`) && !measureKeys.has(r.numerator)) {
275
+ push(rp, "META-REF-MEASURE", `ratio numerator "${r.numerator}" unknown`);
276
+ }
277
+ if (str(r?.denominator, `${rp}.denominator`) && !measureKeys.has(r.denominator)) {
278
+ push(rp, "META-REF-MEASURE", `ratio denominator "${r.denominator}" unknown`);
279
+ }
280
+ });
281
+ const derivedKeys = new Set();
282
+ (d.derived ?? []).forEach((dv, i) => {
283
+ const dp = `derived[${i}]`;
284
+ uniqueKey(dv?.key, `${dp}.key`);
285
+ if (!["sum", "difference", "ratio"].includes(dv?.op)) {
286
+ push(`${dp}.op`, "META-ANALYTICS", `${dp}.op must be sum|difference|ratio`);
287
+ }
288
+ if (!Array.isArray(dv?.terms) || dv.terms.length === 0) {
289
+ push(`${dp}.terms`, "META-REQUIRED", `${dp}.terms must be a non-empty array`);
290
+ return;
291
+ }
292
+ if (dv.op === "ratio" && dv.terms.length !== 2) {
293
+ push(`${dp}.terms`, "META-ANALYTICS", "ratio takes exactly two terms");
294
+ }
295
+ if (dv.op === "difference" && dv.terms.length < 2) {
296
+ push(`${dp}.terms`, "META-ANALYTICS", "difference takes at least two terms");
297
+ }
298
+ for (const t of dv.terms) {
299
+ if (!isNonEmptyString(t)) {
300
+ push(`${dp}.terms`, "META-REQUIRED", "terms must be non-empty strings");
301
+ continue;
302
+ }
303
+ let known = measureKeys.has(t) || ratioKeys.has(t) || derivedKeys.has(t);
304
+ for (let dot = t.indexOf("."); !known && dot > 0; dot = t.indexOf(".", dot + 1)) {
305
+ const b = groupBuckets.get(t.slice(0, dot));
306
+ known = b === "open" || Boolean(b?.has(t.slice(dot + 1)));
307
+ }
308
+ if (!known) {
309
+ push(dp, "META-REF-MEASURE", `term "${t}" is not a measure, ratio, earlier derived key, or group.bucket`);
310
+ }
311
+ }
312
+ if (isNonEmptyString(dv.key))
313
+ derivedKeys.add(dv.key);
314
+ });
315
+ (d.splits ?? []).forEach((s, i) => {
316
+ const sp = `splits[${i}]`;
317
+ uniqueKey(s?.key, `${sp}.key`);
318
+ str(s?.totalKey, `${sp}.totalKey`);
319
+ str(s?.subsetKey, `${sp}.subsetKey`);
320
+ if (!str(s?.abstractType, `${sp}.abstractType`) || !str(s.property, `${sp}.property`))
321
+ return;
322
+ buckets(s.buckets, `${sp}.buckets`, prop(s.abstractType, s.property, sp));
323
+ if (s.subset === undefined)
324
+ push(`${sp}.subset`, "META-REQUIRED", `${sp}.subset is required`);
325
+ else
326
+ where(s.subset, s.abstractType, `${sp}.subset`);
327
+ });
328
+ (d.unwinds ?? []).forEach((u, i) => {
329
+ const up = `unwinds[${i}]`;
330
+ uniqueKey(u?.key, `${up}.key`);
331
+ if (str(u?.abstractType, `${up}.abstractType`) && str(u.arrayProperty, `${up}.arrayProperty`)) {
332
+ prop(u.abstractType, u.arrayProperty, up);
333
+ }
334
+ if (!Array.isArray(u?.columns) || u.columns.length === 0) {
335
+ push(`${up}.columns`, "META-REQUIRED", `${up}.columns must be a non-empty array`);
336
+ }
337
+ else {
338
+ u.columns.forEach((c, j) => {
339
+ str(c?.key, `${up}.columns[${j}].key`);
340
+ str(c?.path, `${up}.columns[${j}].path`);
341
+ });
342
+ }
343
+ (u?.aggregates ?? []).forEach((a, j) => {
344
+ const ap = `${up}.aggregates[${j}]`;
345
+ str(a?.key, `${ap}.key`);
346
+ if (!["count", "sum", "max", "distinct", "group-count"].includes(a?.kind)) {
347
+ push(`${ap}.kind`, "META-ANALYTICS", "kind must be count|sum|max|distinct|group-count");
348
+ }
349
+ if (a?.kind !== "count")
350
+ str(a?.path, `${ap}.path`);
351
+ if (a?.kind === "group-count")
352
+ buckets(a.buckets, `${ap}.buckets`, null);
353
+ });
354
+ });
355
+ (d.leaders ?? []).forEach((l, i) => {
356
+ const lp = `leaders[${i}]`;
357
+ uniqueKey(l?.key, `${lp}.key`);
358
+ if (!str(l?.abstractType, `${lp}.abstractType`))
359
+ return;
360
+ if (str(l.idProperty, `${lp}.idProperty`))
361
+ prop(l.abstractType, l.idProperty, `${lp}.idProperty`);
362
+ if (str(l.labelProperty, `${lp}.labelProperty`)) {
363
+ prop(l.abstractType, l.labelProperty, `${lp}.labelProperty`);
364
+ }
365
+ if (l.limit !== undefined && (!Number.isInteger(l.limit) || l.limit < 1 || l.limit > 100)) {
366
+ push(`${lp}.limit`, "META-TYPE", "limit must be an integer between 1 and 100");
367
+ }
368
+ if (l.countOf !== undefined) {
369
+ if (str(l.countOf?.abstractType, `${lp}.countOf.abstractType`)) {
370
+ if (str(l.countOf.property, `${lp}.countOf.property`)) {
371
+ prop(l.countOf.abstractType, l.countOf.property, `${lp}.countOf`);
372
+ }
373
+ where(l.countOf.where, l.countOf.abstractType, `${lp}.countOf.where`);
374
+ }
375
+ }
376
+ else if (!Array.isArray(l.sort) || l.sort.length === 0) {
377
+ push(`${lp}.sort`, "META-REQUIRED", `${lp}.sort must be a non-empty array (or declare countOf)`);
378
+ }
379
+ (l.sort ?? []).forEach((s, j) => {
380
+ if (str(s?.property, `${lp}.sort[${j}].property`)) {
381
+ prop(l.abstractType, s.property, `${lp}.sort[${j}]`);
382
+ }
383
+ });
384
+ });
385
+ (d.coverage ?? []).forEach((c, i) => {
386
+ const cp = `coverage[${i}]`;
387
+ str(c?.key, `${cp}.key`);
388
+ if (!str(c?.abstractType, `${cp}.abstractType`))
389
+ return;
390
+ if (!catalog.abstractProperties(c.abstractType)) {
391
+ push(cp, "META-REF-ABSTRACT", `unknown abstract "${c.abstractType}"`);
392
+ }
393
+ where(c.where, c.abstractType, `${cp}.where`);
394
+ if (typeof c.expected === "number") {
395
+ if (!Number.isFinite(c.expected) || c.expected < 0) {
396
+ push(`${cp}.expected`, "META-TYPE", "expected must be a non-negative number");
397
+ }
398
+ }
399
+ else if (!c.expected || typeof c.expected !== "object" || !measureKeys.has(c.expected.measure)) {
400
+ push(`${cp}.expected`, "META-REF-MEASURE", "expected must be a number or { measure } naming a measure");
401
+ }
402
+ });
403
+ (d.deltas ?? []).forEach((dl, i) => {
404
+ str(dl?.key, `deltas[${i}].key`);
405
+ if (str(dl?.measure, `deltas[${i}].measure`) && !measureKeys.has(dl.measure)) {
406
+ push(`deltas[${i}]`, "META-REF-MEASURE", `delta references unknown measure "${dl.measure}"`);
407
+ }
408
+ });
409
+ (d.transitions ?? []).forEach((t, i) => {
410
+ const tp = `transitions[${i}]`;
411
+ str(t?.key, `${tp}.key`);
412
+ if (str(t?.abstractType, `${tp}.abstractType`) && str(t.property, `${tp}.property`)) {
413
+ prop(t.abstractType, t.property, tp);
414
+ }
415
+ });
416
+ (d.trends ?? []).forEach((t, i) => {
417
+ const tp = `trends[${i}]`;
418
+ str(t?.key, `${tp}.key`);
419
+ str(t?.label, `${tp}.label`);
420
+ if (str(t?.measure, `${tp}.measure`) && !measureKeys.has(t.measure)) {
421
+ push(tp, "META-REF-MEASURE", `trend references unknown measure "${t.measure}"`);
422
+ }
423
+ if (!Array.isArray(t?.windows) || t.windows.length === 0) {
424
+ push(`${tp}.windows`, "META-REQUIRED", `${tp}.windows must be a non-empty array`);
425
+ }
426
+ else {
427
+ t.windows.forEach((w, j) => {
428
+ if (!["snapshots", "7d", "30d"].includes(w)) {
429
+ push(`${tp}.windows[${j}]`, "META-ANALYTICS", "window must be snapshots|7d|30d");
430
+ }
431
+ });
432
+ }
433
+ });
434
+ if (abstractTypesOf(d).length === 0 && issues.length === 0) {
435
+ push("definition", "META-ANALYTICS", "definition counts nothing: declare measures, groups, or leaders");
436
+ }
437
+ return issues;
438
+ }
439
+ //# sourceMappingURL=definition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.js","sourceRoot":"","sources":["../../src/analytics/definition.ts"],"names":[],"mappings":"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"}