@akanjs/common 0.9.42 → 0.9.44
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/cjs/getDependencyGraph.js +90 -0
- package/cjs/index.js +2 -0
- package/esm/getDependencyGraph.js +71 -0
- package/esm/index.js +2 -0
- package/getDependencyGraph.d.ts +16 -0
- package/index.d.ts +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var getDependencyGraph_exports = {};
|
|
19
|
+
__export(getDependencyGraph_exports, {
|
|
20
|
+
getDependencyGraph: () => getDependencyGraph
|
|
21
|
+
});
|
|
22
|
+
module.exports = __toCommonJS(getDependencyGraph_exports);
|
|
23
|
+
const sortByDependencyLevels = (items) => {
|
|
24
|
+
const graph = /* @__PURE__ */ new Map();
|
|
25
|
+
const inDegree = /* @__PURE__ */ new Map();
|
|
26
|
+
const allKeys = /* @__PURE__ */ new Set();
|
|
27
|
+
for (const item of items) {
|
|
28
|
+
allKeys.add(item.key);
|
|
29
|
+
if (!graph.has(item.key))
|
|
30
|
+
graph.set(item.key, /* @__PURE__ */ new Set());
|
|
31
|
+
if (!inDegree.has(item.key))
|
|
32
|
+
inDegree.set(item.key, 0);
|
|
33
|
+
for (const dep of item.deps) {
|
|
34
|
+
const deps = graph.get(dep) ?? /* @__PURE__ */ new Set();
|
|
35
|
+
deps.add(item.key);
|
|
36
|
+
graph.set(dep, deps);
|
|
37
|
+
inDegree.set(item.key, (inDegree.get(item.key) ?? 0) + 1);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const queue = [];
|
|
41
|
+
const levels = [];
|
|
42
|
+
const visited = /* @__PURE__ */ new Set();
|
|
43
|
+
for (const [key, degree] of inDegree.entries()) {
|
|
44
|
+
if (degree === 0)
|
|
45
|
+
queue.push(key);
|
|
46
|
+
}
|
|
47
|
+
while (queue.length > 0) {
|
|
48
|
+
const currentLevel = [];
|
|
49
|
+
const queueSize = queue.length;
|
|
50
|
+
for (let i = 0; i < queueSize; i++) {
|
|
51
|
+
const node = queue.shift();
|
|
52
|
+
if (!node)
|
|
53
|
+
continue;
|
|
54
|
+
if (allKeys.has(node))
|
|
55
|
+
currentLevel.push(node);
|
|
56
|
+
visited.add(node);
|
|
57
|
+
const dependents = graph.get(node) ?? /* @__PURE__ */ new Set();
|
|
58
|
+
for (const dependent of dependents) {
|
|
59
|
+
const newDegree = (inDegree.get(dependent) ?? 0) - 1;
|
|
60
|
+
inDegree.set(dependent, newDegree);
|
|
61
|
+
if (newDegree === 0)
|
|
62
|
+
queue.push(dependent);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (currentLevel.length > 0)
|
|
66
|
+
levels.push(currentLevel);
|
|
67
|
+
}
|
|
68
|
+
const missingDeps = [];
|
|
69
|
+
for (const item of items) {
|
|
70
|
+
for (const dep of item.deps) {
|
|
71
|
+
if (!allKeys.has(dep))
|
|
72
|
+
missingDeps.push(`${item.key} -> ${dep} (undefined)`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (missingDeps.length > 0)
|
|
76
|
+
throw new Error(`Missing dependencies: ${missingDeps.join(", ")}`);
|
|
77
|
+
if (visited.size < allKeys.size) {
|
|
78
|
+
const unvisited = Array.from(allKeys).filter((key) => !visited.has(key));
|
|
79
|
+
throw new Error(`Circular dependency detected involving: ${unvisited.join(", ")}`);
|
|
80
|
+
}
|
|
81
|
+
return levels;
|
|
82
|
+
};
|
|
83
|
+
const getDependencyGraph = (items) => {
|
|
84
|
+
const levels = sortByDependencyLevels(items);
|
|
85
|
+
const levelMap = /* @__PURE__ */ new Map();
|
|
86
|
+
levels.forEach((level, index) => {
|
|
87
|
+
level.forEach((key) => levelMap.set(key, index));
|
|
88
|
+
});
|
|
89
|
+
return { levels, levelMap };
|
|
90
|
+
};
|
package/cjs/index.js
CHANGED
|
@@ -23,6 +23,7 @@ __export(common_exports, {
|
|
|
23
23
|
deepObjectify: () => import_deepObjectify.deepObjectify,
|
|
24
24
|
formatNumber: () => import_formatNumber.formatNumber,
|
|
25
25
|
formatPhone: () => import_formatPhone.formatPhone,
|
|
26
|
+
getDependencyGraph: () => import_getDependencyGraph.getDependencyGraph,
|
|
26
27
|
isDayjs: () => import_isDayjs.isDayjs,
|
|
27
28
|
isEmail: () => import_isEmail.isEmail,
|
|
28
29
|
isPhoneNumber: () => import_isPhoneNumber.isPhoneNumber,
|
|
@@ -61,3 +62,4 @@ var import_isEmail = require("./isEmail");
|
|
|
61
62
|
var import_isPhoneNumber = require("./isPhoneNumber");
|
|
62
63
|
var import_formatNumber = require("./formatNumber");
|
|
63
64
|
var import_formatPhone = require("./formatPhone");
|
|
65
|
+
var import_getDependencyGraph = require("./getDependencyGraph");
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
const sortByDependencyLevels = (items) => {
|
|
2
|
+
const graph = /* @__PURE__ */ new Map();
|
|
3
|
+
const inDegree = /* @__PURE__ */ new Map();
|
|
4
|
+
const allKeys = /* @__PURE__ */ new Set();
|
|
5
|
+
for (const item of items) {
|
|
6
|
+
allKeys.add(item.key);
|
|
7
|
+
if (!graph.has(item.key))
|
|
8
|
+
graph.set(item.key, /* @__PURE__ */ new Set());
|
|
9
|
+
if (!inDegree.has(item.key))
|
|
10
|
+
inDegree.set(item.key, 0);
|
|
11
|
+
for (const dep of item.deps) {
|
|
12
|
+
const deps = graph.get(dep) ?? /* @__PURE__ */ new Set();
|
|
13
|
+
deps.add(item.key);
|
|
14
|
+
graph.set(dep, deps);
|
|
15
|
+
inDegree.set(item.key, (inDegree.get(item.key) ?? 0) + 1);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const queue = [];
|
|
19
|
+
const levels = [];
|
|
20
|
+
const visited = /* @__PURE__ */ new Set();
|
|
21
|
+
for (const [key, degree] of inDegree.entries()) {
|
|
22
|
+
if (degree === 0)
|
|
23
|
+
queue.push(key);
|
|
24
|
+
}
|
|
25
|
+
while (queue.length > 0) {
|
|
26
|
+
const currentLevel = [];
|
|
27
|
+
const queueSize = queue.length;
|
|
28
|
+
for (let i = 0; i < queueSize; i++) {
|
|
29
|
+
const node = queue.shift();
|
|
30
|
+
if (!node)
|
|
31
|
+
continue;
|
|
32
|
+
if (allKeys.has(node))
|
|
33
|
+
currentLevel.push(node);
|
|
34
|
+
visited.add(node);
|
|
35
|
+
const dependents = graph.get(node) ?? /* @__PURE__ */ new Set();
|
|
36
|
+
for (const dependent of dependents) {
|
|
37
|
+
const newDegree = (inDegree.get(dependent) ?? 0) - 1;
|
|
38
|
+
inDegree.set(dependent, newDegree);
|
|
39
|
+
if (newDegree === 0)
|
|
40
|
+
queue.push(dependent);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (currentLevel.length > 0)
|
|
44
|
+
levels.push(currentLevel);
|
|
45
|
+
}
|
|
46
|
+
const missingDeps = [];
|
|
47
|
+
for (const item of items) {
|
|
48
|
+
for (const dep of item.deps) {
|
|
49
|
+
if (!allKeys.has(dep))
|
|
50
|
+
missingDeps.push(`${item.key} -> ${dep} (undefined)`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (missingDeps.length > 0)
|
|
54
|
+
throw new Error(`Missing dependencies: ${missingDeps.join(", ")}`);
|
|
55
|
+
if (visited.size < allKeys.size) {
|
|
56
|
+
const unvisited = Array.from(allKeys).filter((key) => !visited.has(key));
|
|
57
|
+
throw new Error(`Circular dependency detected involving: ${unvisited.join(", ")}`);
|
|
58
|
+
}
|
|
59
|
+
return levels;
|
|
60
|
+
};
|
|
61
|
+
const getDependencyGraph = (items) => {
|
|
62
|
+
const levels = sortByDependencyLevels(items);
|
|
63
|
+
const levelMap = /* @__PURE__ */ new Map();
|
|
64
|
+
levels.forEach((level, index) => {
|
|
65
|
+
level.forEach((key) => levelMap.set(key, index));
|
|
66
|
+
});
|
|
67
|
+
return { levels, levelMap };
|
|
68
|
+
};
|
|
69
|
+
export {
|
|
70
|
+
getDependencyGraph
|
|
71
|
+
};
|
package/esm/index.js
CHANGED
|
@@ -19,6 +19,7 @@ import { isEmail } from "./isEmail";
|
|
|
19
19
|
import { isPhoneNumber } from "./isPhoneNumber";
|
|
20
20
|
import { formatNumber } from "./formatNumber";
|
|
21
21
|
import { formatPhone } from "./formatPhone";
|
|
22
|
+
import { getDependencyGraph } from "./getDependencyGraph";
|
|
22
23
|
export {
|
|
23
24
|
Logger,
|
|
24
25
|
applyMixins,
|
|
@@ -26,6 +27,7 @@ export {
|
|
|
26
27
|
deepObjectify,
|
|
27
28
|
formatNumber,
|
|
28
29
|
formatPhone,
|
|
30
|
+
getDependencyGraph,
|
|
29
31
|
isDayjs,
|
|
30
32
|
isEmail,
|
|
31
33
|
isPhoneNumber,
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
interface DependencyItem {
|
|
2
|
+
key: string;
|
|
3
|
+
deps: string[];
|
|
4
|
+
}
|
|
5
|
+
interface DependencyGraph {
|
|
6
|
+
levels: string[][];
|
|
7
|
+
levelMap: Map<string, number>;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Alternative: Returns a more detailed dependency graph with level information
|
|
11
|
+
*/
|
|
12
|
+
export declare const getDependencyGraph: (items: DependencyItem[]) => DependencyGraph;
|
|
13
|
+
export {};
|
|
14
|
+
/**
|
|
15
|
+
* Helper function to validate dependencies
|
|
16
|
+
*/
|
package/index.d.ts
CHANGED