silgi 0.8.28 → 0.8.30

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.28";
1
+ const version = "0.8.30";
2
2
  const devDependencies = {
3
3
  "@antfu/eslint-config": "^4.2.0",
4
4
  "@fastify/deepmerge": "^2.0.2",
@@ -1050,7 +1050,7 @@ function createDependencyGraph(modules) {
1050
1050
  if (key) {
1051
1051
  graph.set(key, /* @__PURE__ */ new Set());
1052
1052
  inDegree.set(key, 0);
1053
- dependencyRelations.set(key, { before: [], after: [] });
1053
+ dependencyRelations.set(key, { required: [], before: [], after: [] });
1054
1054
  logger$1.debug(`Module registered: ${key}`);
1055
1055
  }
1056
1056
  });
@@ -1058,15 +1058,22 @@ function createDependencyGraph(modules) {
1058
1058
  const key = module.meta?.configKey;
1059
1059
  if (!key)
1060
1060
  return;
1061
+ const requiredDeps = module.meta?.requiredDependencies || [];
1061
1062
  const beforeDeps = module.meta?.beforeDependencies || [];
1062
1063
  const afterDeps = module.meta?.afterDependencies || [];
1063
- const conflicts = beforeDeps.filter((dep) => afterDeps.includes(dep));
1064
- if (conflicts.length > 0) {
1065
- logger$1.error(`Module ${key} has conflicting dependencies: ${conflicts.join(", ")}`);
1064
+ const missingRequired = requiredDeps.filter((dep) => !graph.has(dep));
1065
+ if (missingRequired.length > 0) {
1066
+ throw new Error(`Module ${key} is missing required dependencies: ${missingRequired.join(", ")}`);
1067
+ }
1068
+ const allDeps = /* @__PURE__ */ new Set([...requiredDeps, ...beforeDeps, ...afterDeps]);
1069
+ if (allDeps.size < requiredDeps.length + beforeDeps.length + afterDeps.length) {
1070
+ logger$1.error(`Module ${key} has overlapping dependencies`);
1066
1071
  return;
1067
1072
  }
1068
1073
  logger$1.debug(`
1069
1074
  Module ${key} dependencies:`);
1075
+ if (requiredDeps.length)
1076
+ logger$1.debug(` Required: ${requiredDeps.join(", ")}`);
1070
1077
  if (beforeDeps.length)
1071
1078
  logger$1.debug(` Must run after: ${beforeDeps.join(", ")}`);
1072
1079
  if (afterDeps.length)
@@ -1076,31 +1083,41 @@ Module ${key} dependencies:`);
1076
1083
  const key = module.meta?.configKey;
1077
1084
  if (!key)
1078
1085
  return;
1086
+ const requiredDeps = module.meta?.requiredDependencies || [];
1079
1087
  const beforeDeps = module.meta?.beforeDependencies || [];
1080
1088
  const afterDeps = module.meta?.afterDependencies || [];
1089
+ requiredDeps.forEach((dep) => {
1090
+ if (!graph.has(dep)) {
1091
+ throw new Error(`Required dependency "${dep}" for module "${key}" is missing`);
1092
+ }
1093
+ graph.get(dep)?.add(key);
1094
+ inDegree.set(key, (inDegree.get(key) || 0) + 1);
1095
+ logger$1.debug(`${key} requires ${dep}`);
1096
+ });
1081
1097
  beforeDeps.forEach((dep) => {
1082
1098
  if (!graph.has(dep)) {
1083
- logger$1.warn(`Missing module: ${dep} required by ${key}`);
1099
+ logger$1.debug(`Optional dependency for ${key}: "${dep}" (beforeDependencies) not found, skipping`);
1084
1100
  return;
1085
1101
  }
1086
1102
  graph.get(dep)?.add(key);
1087
1103
  inDegree.set(key, (inDegree.get(key) || 0) + 1);
1088
- logger$1.debug(`${key} depends on ${dep}`);
1104
+ logger$1.debug(`${key} will run after ${dep}`);
1089
1105
  });
1090
1106
  afterDeps.forEach((dep) => {
1091
- if (!graph.has(key)) {
1092
- logger$1.warn(`Missing module: ${key} required by ${dep}`);
1107
+ if (!graph.has(dep)) {
1108
+ logger$1.debug(`Optional dependency for ${key}: "${dep}" (afterDependencies) not found, skipping`);
1093
1109
  return;
1094
1110
  }
1095
1111
  graph.get(key)?.add(dep);
1096
1112
  inDegree.set(dep, (inDegree.get(dep) || 0) + 1);
1097
- logger$1.debug(`${dep} depends on ${key}`);
1113
+ logger$1.debug(`${key} will run before ${dep}`);
1098
1114
  });
1099
1115
  });
1100
1116
  logger$1.debug("\nDependency Graph:");
1101
1117
  for (const [module, deps] of graph.entries()) {
1102
1118
  const depsStr = Array.from(deps).join(", ");
1103
- logger$1.debug(`${module} -> [${depsStr}] (in-degree: ${inDegree.get(module)})`);
1119
+ const required = dependencyRelations.get(module)?.required || [];
1120
+ logger$1.debug(`${module} -> [${depsStr}] (required: ${required.join(", ")}) (in-degree: ${inDegree.get(module)})`);
1104
1121
  }
1105
1122
  return { graph, inDegree };
1106
1123
  }
@@ -91,5 +91,13 @@ declare function toArray<T>(value: T | T[]): T[];
91
91
  */
92
92
  declare function filterInPlace<T>(array: T[], predicate: (item: T, index: number, arr: T[]) => unknown): T[];
93
93
  declare const MODE_RE: RegExp;
94
+ /**
95
+ * Check if a Silgi module is installed by name.
96
+ *
97
+ * This will check both the installed modules and the modules to be installed. Note
98
+ * that it cannot detect if a module is _going to be_ installed programmatically by another module.
99
+ */
100
+ declare function hasSilgiModule(moduleKey: string, silgi?: SilgiCLI): boolean;
101
+ declare function hasInstalledModule(moduleKey: string, silgi?: SilgiCLI): boolean;
94
102
 
95
- export { MODE_RE, addTemplate, createResolver, defineSilgiModule, defineSilgiPreset, filterInPlace, isDirectory, isH3, isNitro, isNuxt, normalizeTemplate, prettyPath, relativeWithDot, resolveAlias, resolvePath, resolveSilgiModule, resolveSilgiPath, toArray, tryResolveModule, useLogger, writeFile };
103
+ export { MODE_RE, addTemplate, createResolver, defineSilgiModule, defineSilgiPreset, filterInPlace, hasInstalledModule, hasSilgiModule, isDirectory, isH3, isNitro, isNuxt, normalizeTemplate, prettyPath, relativeWithDot, resolveAlias, resolvePath, resolveSilgiModule, resolveSilgiPath, toArray, tryResolveModule, useLogger, writeFile };
@@ -91,5 +91,13 @@ declare function toArray<T>(value: T | T[]): T[];
91
91
  */
92
92
  declare function filterInPlace<T>(array: T[], predicate: (item: T, index: number, arr: T[]) => unknown): T[];
93
93
  declare const MODE_RE: RegExp;
94
+ /**
95
+ * Check if a Silgi module is installed by name.
96
+ *
97
+ * This will check both the installed modules and the modules to be installed. Note
98
+ * that it cannot detect if a module is _going to be_ installed programmatically by another module.
99
+ */
100
+ declare function hasSilgiModule(moduleKey: string, silgi?: SilgiCLI): boolean;
101
+ declare function hasInstalledModule(moduleKey: string, silgi?: SilgiCLI): boolean;
94
102
 
95
- export { MODE_RE, addTemplate, createResolver, defineSilgiModule, defineSilgiPreset, filterInPlace, isDirectory, isH3, isNitro, isNuxt, normalizeTemplate, prettyPath, relativeWithDot, resolveAlias, resolvePath, resolveSilgiModule, resolveSilgiPath, toArray, tryResolveModule, useLogger, writeFile };
103
+ export { MODE_RE, addTemplate, createResolver, defineSilgiModule, defineSilgiPreset, filterInPlace, hasInstalledModule, hasSilgiModule, isDirectory, isH3, isNitro, isNuxt, normalizeTemplate, prettyPath, relativeWithDot, resolveAlias, resolvePath, resolveSilgiModule, resolveSilgiPath, toArray, tryResolveModule, useLogger, writeFile };
@@ -255,6 +255,13 @@ function filterInPlace(array, predicate) {
255
255
  return array;
256
256
  }
257
257
  const MODE_RE = /\.(server|client)(\.\w+)*$/;
258
+ function hasSilgiModule(moduleKey, silgi = useSilgiCLI()) {
259
+ return silgi.scanModules.some(({ meta }) => meta.configKey === moduleKey) || Object.keys(silgi.scanModules).includes(moduleKey);
260
+ }
261
+ function hasInstalledModule(moduleKey, silgi = useSilgiCLI()) {
262
+ const find = silgi.scanModules.find(({ meta }) => meta.configKey === moduleKey);
263
+ return find?.installed ?? false;
264
+ }
258
265
 
259
266
  function addTemplate(_template) {
260
267
  const silgi = useSilgiCLI();
@@ -298,4 +305,4 @@ function normalizeTemplate(template, buildDir) {
298
305
  return template;
299
306
  }
300
307
 
301
- export { MODE_RE, addTemplate, createResolver, defineSilgiModule, defineSilgiPreset, filterInPlace, isDirectory$1 as isDirectory, isH3, isNitro, isNuxt, normalizeTemplate, prettyPath, relativeWithDot, resolveAlias, resolvePath, resolveSilgiModule, resolveSilgiPath, toArray, tryResolveModule, useLogger, writeFile };
308
+ export { MODE_RE, addTemplate, createResolver, defineSilgiModule, defineSilgiPreset, filterInPlace, hasInstalledModule, hasSilgiModule, isDirectory$1 as isDirectory, isH3, isNitro, isNuxt, normalizeTemplate, prettyPath, relativeWithDot, resolveAlias, resolvePath, resolveSilgiModule, resolveSilgiPath, toArray, tryResolveModule, useLogger, writeFile };
@@ -1,4 +1,4 @@
1
- const version = "0.8.28";
1
+ const version = "0.8.30";
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.28";
1
+ const version = "0.8.30";
2
2
  const devDependencies = {
3
3
  "@antfu/eslint-config": "^4.2.0",
4
4
  "@fastify/deepmerge": "^2.0.2",
@@ -469,6 +469,7 @@ interface ModuleMeta {
469
469
  _packageName?: string;
470
470
  readonly afterDependencies?: ReadonlyArray<string>;
471
471
  readonly beforeDependencies?: ReadonlyArray<string>;
472
+ readonly requiredDependencies?: ReadonlyArray<string>;
472
473
  [key: string]: unknown;
473
474
  }
474
475
  interface ResolvedModuleMeta extends ModuleMeta {
@@ -469,6 +469,7 @@ interface ModuleMeta {
469
469
  _packageName?: string;
470
470
  readonly afterDependencies?: ReadonlyArray<string>;
471
471
  readonly beforeDependencies?: ReadonlyArray<string>;
472
+ readonly requiredDependencies?: ReadonlyArray<string>;
472
473
  [key: string]: unknown;
473
474
  }
474
475
  interface ResolvedModuleMeta extends ModuleMeta {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "silgi",
3
3
  "type": "module",
4
- "version": "0.8.28",
4
+ "version": "0.8.30",
5
5
  "private": false,
6
6
  "sideEffects": false,
7
7
  "exports": {