silgi 0.8.25 → 0.8.26

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.
@@ -1,4 +1,4 @@
1
- const version = "0.8.25";
1
+ const version = "0.8.26";
2
2
  const devDependencies = {
3
3
  "@antfu/eslint-config": "^4.2.0",
4
4
  "@fastify/deepmerge": "^2.0.2",
@@ -1044,11 +1044,13 @@ async function scanModules$1(silgi) {
1044
1044
  function createDependencyGraph(modules) {
1045
1045
  const graph = /* @__PURE__ */ new Map();
1046
1046
  const inDegree = /* @__PURE__ */ new Map();
1047
+ const dependencyRelations = /* @__PURE__ */ new Map();
1047
1048
  modules.forEach((module) => {
1048
1049
  const key = module.meta?.configKey;
1049
1050
  if (key) {
1050
1051
  graph.set(key, /* @__PURE__ */ new Set());
1051
1052
  inDegree.set(key, 0);
1053
+ dependencyRelations.set(key, { before: [], after: [] });
1052
1054
  logger$1.debug(`Module registered: ${key}`);
1053
1055
  }
1054
1056
  });
@@ -1058,51 +1060,65 @@ function createDependencyGraph(modules) {
1058
1060
  return;
1059
1061
  const beforeDeps = module.meta?.beforeDependencies || [];
1060
1062
  const afterDeps = module.meta?.afterDependencies || [];
1061
- logger$1.debug(`Module ${key}:`);
1062
- if (beforeDeps.length)
1063
- logger$1.debug(` beforeDeps: ${beforeDeps.join(", ")}`);
1064
- if (afterDeps.length)
1065
- logger$1.debug(` afterDeps: ${afterDeps.join(", ")}`);
1063
+ logger$1.debug(`
1064
+ Analyzing dependencies for module ${key}:`);
1066
1065
  beforeDeps.forEach((dep) => {
1067
- if (graph.has(dep)) {
1068
- graph.get(dep)?.add(key);
1069
- inDegree.set(key, (inDegree.get(key) || 0) + 1);
1066
+ if (!graph.has(dep)) {
1067
+ logger$1.warn(`Warning: Module ${key} depends on non-existent module ${dep}`);
1068
+ return;
1070
1069
  }
1070
+ graph.get(dep)?.add(key);
1071
+ inDegree.set(key, (inDegree.get(key) || 0) + 1);
1072
+ dependencyRelations.get(key)?.before.push(dep);
1073
+ logger$1.debug(` Must run after: ${dep}`);
1071
1074
  });
1072
1075
  afterDeps.forEach((dep) => {
1073
- if (graph.has(key)) {
1074
- graph.get(key)?.add(dep);
1075
- inDegree.set(dep, (inDegree.get(dep) || 0) + 1);
1076
+ if (!graph.has(key)) {
1077
+ logger$1.warn(`Warning: Module ${dep} depends on non-existent module ${key}`);
1078
+ return;
1076
1079
  }
1080
+ graph.get(key)?.add(dep);
1081
+ inDegree.set(dep, (inDegree.get(dep) || 0) + 1);
1082
+ dependencyRelations.get(key)?.after.push(dep);
1083
+ logger$1.debug(` Must run before: ${dep}`);
1077
1084
  });
1078
1085
  });
1086
+ logger$1.debug("\nDependency Summary:");
1087
+ for (const [key, relations] of dependencyRelations.entries()) {
1088
+ if (relations.before.length || relations.after.length) {
1089
+ logger$1.debug(`${key}:`);
1090
+ if (relations.before.length)
1091
+ logger$1.debug(` Must run after: ${relations.before.join(", ")}`);
1092
+ if (relations.after.length)
1093
+ logger$1.debug(` Must run before: ${relations.after.join(", ")}`);
1094
+ }
1095
+ }
1079
1096
  return { graph, inDegree };
1080
1097
  }
1081
1098
  function findCyclicDependencies(graph) {
1082
- const visited = /* @__PURE__ */ new Map();
1099
+ const visited = /* @__PURE__ */ new Set();
1100
+ const recursionStack = /* @__PURE__ */ new Set();
1083
1101
  const cycles = [];
1084
- const path = [];
1085
- function visit(node) {
1086
- if (visited.has(node)) {
1087
- if (visited.get(node) === false) {
1088
- const cycleStart = path.indexOf(node);
1102
+ function dfs(node, path = []) {
1103
+ visited.add(node);
1104
+ recursionStack.add(node);
1105
+ path.push(node);
1106
+ for (const neighbor of graph.get(node) || []) {
1107
+ if (recursionStack.has(neighbor)) {
1108
+ const cycleStart = path.indexOf(neighbor);
1089
1109
  if (cycleStart !== -1) {
1090
- cycles.push([...path.slice(cycleStart), node]);
1110
+ cycles.push([...path.slice(cycleStart), neighbor]);
1091
1111
  }
1112
+ } else if (!visited.has(neighbor)) {
1113
+ dfs(neighbor, [...path]);
1092
1114
  }
1093
- return;
1094
- }
1095
- visited.set(node, false);
1096
- path.push(node);
1097
- for (const neighbor of graph.get(node) || []) {
1098
- visit(neighbor);
1099
1115
  }
1116
+ recursionStack.delete(node);
1100
1117
  path.pop();
1101
- visited.set(node, true);
1102
1118
  }
1103
1119
  for (const node of graph.keys()) {
1104
1120
  if (!visited.has(node)) {
1105
- visit(node);
1121
+ dfs(node, []);
1106
1122
  }
1107
1123
  }
1108
1124
  return cycles;
@@ -1111,36 +1127,45 @@ function topologicalSort(graphData) {
1111
1127
  const { graph, inDegree } = graphData;
1112
1128
  const order = [];
1113
1129
  const queue = [];
1114
- logger$1.debug("\nDependency Analysis:");
1130
+ logger$1.debug("\nStarting topological sort:");
1115
1131
  logger$1.debug("Initial in-degrees:", Object.fromEntries(inDegree));
1116
1132
  for (const [node, degree] of inDegree.entries()) {
1117
1133
  if (degree === 0) {
1118
1134
  queue.push(node);
1119
- logger$1.debug(`Starting with zero-dependency module: ${node}`);
1135
+ logger$1.debug(`Adding initial module: ${node} (no dependencies)`);
1120
1136
  }
1121
1137
  }
1138
+ if (queue.length === 0) {
1139
+ logger$1.warn("No modules without dependencies found - possible circular reference");
1140
+ }
1122
1141
  while (queue.length > 0) {
1123
1142
  const node = queue.shift();
1124
1143
  order.push(node);
1125
- logger$1.debug(`Processing module: ${node}`);
1144
+ logger$1.debug(`
1145
+ Processing: ${node}`);
1126
1146
  for (const neighbor of graph.get(node) || []) {
1127
1147
  const newDegree = (inDegree.get(neighbor) || 0) - 1;
1128
1148
  inDegree.set(neighbor, newDegree);
1129
- logger$1.debug(` Reduced in-degree of ${neighbor} to ${newDegree}`);
1149
+ logger$1.debug(` ${neighbor} dependencies remaining: ${newDegree}`);
1130
1150
  if (newDegree === 0) {
1131
1151
  queue.push(neighbor);
1132
- logger$1.debug(` Added ${neighbor} to processing queue`);
1152
+ logger$1.debug(` Queuing: ${neighbor}`);
1133
1153
  }
1134
1154
  }
1135
1155
  }
1136
1156
  if (order.length !== graph.size) {
1137
1157
  const cycles = findCyclicDependencies(graph);
1158
+ logger$1.debug("\nDependency graph state:");
1159
+ graph.forEach((deps, module) => {
1160
+ logger$1.debug(`${module} -> ${Array.from(deps).join(", ")}`);
1161
+ });
1138
1162
  if (cycles.length > 0) {
1139
1163
  const cycleStr = cycles.map((cycle) => ` ${cycle.join(" -> ")}`).join("\n");
1140
1164
  throw new Error(`Circular dependencies detected:
1141
1165
  ${cycleStr}`);
1142
1166
  } else {
1143
- throw new Error("Unable to resolve dependencies - possible circular reference");
1167
+ const unresolvedModules = Array.from(graph.keys()).filter((key) => !order.includes(key));
1168
+ throw new Error(`Unable to resolve dependencies for modules: ${unresolvedModules.join(", ")}`);
1144
1169
  }
1145
1170
  }
1146
1171
  logger$1.debug("\nFinal module order:", order.join(" -> "));
@@ -1,4 +1,4 @@
1
- const version = "0.8.25";
1
+ const version = "0.8.26";
2
2
  const devDependencies = {
3
3
  "@antfu/eslint-config": "^4.2.0",
4
4
  "@fastify/deepmerge": "^2.0.2",
@@ -1,4 +1,4 @@
1
- const version = "0.8.25";
1
+ const version = "0.8.26";
2
2
  const devDependencies = {
3
3
  "@antfu/eslint-config": "^4.2.0",
4
4
  "@fastify/deepmerge": "^2.0.2",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "silgi",
3
3
  "type": "module",
4
- "version": "0.8.25",
4
+ "version": "0.8.26",
5
5
  "private": false,
6
6
  "sideEffects": false,
7
7
  "exports": {