1 | "use strict";
|
2 | var __importDefault = (this && this.__importDefault) || function (mod) {
|
3 | return (mod && mod.__esModule) ? mod : { "default": mod };
|
4 | };
|
5 | Object.defineProperty(exports, "__esModule", { value: true });
|
6 |
|
7 | var difference_1 = __importDefault(require("lodash/difference"));
|
8 | var map_1 = __importDefault(require("lodash/map"));
|
9 | var IDENTIFIER_REGEX = /{\S+}/g;
|
10 | function getDependencies(_a) {
|
11 | var metricDefinition = _a.metricDefinition;
|
12 | return (metricDefinition.expression.match(IDENTIFIER_REGEX) || []).map(function (s) {
|
13 | return s.substring(1, s.length - 1);
|
14 | });
|
15 | }
|
16 | function getIdentifier(_a) {
|
17 | var metricDefinition = _a.metricDefinition;
|
18 | return metricDefinition.identifier;
|
19 | }
|
20 | function resolvedDependencies(resolved, _a) {
|
21 | var dependencies = _a.dependencies;
|
22 | var identifiers = map_1.default(resolved, "identifier");
|
23 | return difference_1.default(dependencies, identifiers).length === 0;
|
24 | }
|
25 | function scan(resolved, unresolved) {
|
26 | for (var i = 0; i < unresolved.length; i += 1) {
|
27 | var tested = unresolved[i];
|
28 | if (resolvedDependencies(resolved, tested)) {
|
29 | resolved.push(tested);
|
30 | unresolved.splice(i, 1);
|
31 | i -= 1;
|
32 | }
|
33 | }
|
34 | }
|
35 | function sort(unresolved) {
|
36 | var resolved = [];
|
37 | var lastLength;
|
38 | while (unresolved.length > 0) {
|
39 | lastLength = unresolved.length;
|
40 | scan(resolved, unresolved);
|
41 | if (unresolved.length === lastLength) {
|
42 | throw new Error("Metric defintions cannot be sorted due to missing dependencies.");
|
43 | }
|
44 | }
|
45 | return resolved;
|
46 | }
|
47 | function sortDefinitions(definitions) {
|
48 | var indexed = definitions.map(function (definition) { return ({
|
49 | definition: definition,
|
50 | identifier: getIdentifier(definition),
|
51 | dependencies: getDependencies(definition),
|
52 | }); });
|
53 | return map_1.default(sort(indexed), "definition");
|
54 | }
|
55 | exports.sortDefinitions = sortDefinitions;
|