@solid-stack/mason 1.0.34 → 1.0.35

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.
@@ -24,6 +24,12 @@ export interface TargetInfo {
24
24
  }
25
25
  export declare function isTestFile(filePath: string, projectRoot?: string): boolean;
26
26
  export declare function scanDirFiles(dir: string, projectRoot?: string): string[];
27
+ export declare function resolveLintEnvironment(projectRoot: string): {
28
+ featuresBase: string;
29
+ sharedBase: string;
30
+ errorsBase: string;
31
+ baseErrorAbs: string;
32
+ };
27
33
  export declare function classifyFile(fullPathAbs: string, featuresBaseAbs: string, sharedBaseAbs?: string, errorsBaseAbs?: string): {
28
34
  moduleType?: ModuleType | undefined;
29
35
  moduleName?: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"lintEngine.d.ts","sourceRoot":"","sources":["../../src/core/lintEngine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lintEngine.d.ts","sourceRoot":"","sources":["../../src/core/lintEngine.ts"],"names":[],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -220,20 +220,20 @@ function getConfiguredSharedDir(projectRoot, flags) {
220
220
  return path26__default.default.join(projectRoot, "shared");
221
221
  }
222
222
  function loadLintConfig(projectRoot) {
223
- const configPath = path26__default.default.join(projectRoot, "mason-lint.config.json");
224
- if (fs17__default.default.existsSync(configPath)) {
225
- try {
226
- return JSON.parse(fs17__default.default.readFileSync(configPath, "utf-8"));
227
- } catch {
228
- }
223
+ const masonConfig = loadMasonConfig(projectRoot);
224
+ if (masonConfig) {
225
+ return {
226
+ baseErrorPath: masonConfig.paths?.baseError,
227
+ paths: masonConfig.paths
228
+ };
229
229
  }
230
230
  return {};
231
231
  }
232
232
  function getResolvedLintPaths(projectRoot, config) {
233
233
  const masonConfig = loadMasonConfig(projectRoot);
234
- const configuredFeatures = config.paths?.features ?? masonConfig?.paths?.features;
235
- const configuredShared = config.paths?.shared ?? masonConfig?.paths?.shared;
236
- const configuredErrors = config.paths?.errors;
234
+ const configuredFeatures = config?.paths?.features ?? masonConfig?.paths?.features;
235
+ const configuredShared = config?.paths?.shared ?? masonConfig?.paths?.shared;
236
+ const configuredErrors = config?.paths?.errors ?? masonConfig?.paths?.errors;
237
237
  const resolveBase = (configuredPath, defaultSrc, defaultRoot) => {
238
238
  if (configuredPath !== void 0) {
239
239
  return path26__default.default.resolve(projectRoot, configuredPath);
@@ -4943,19 +4943,43 @@ function scanDirFiles(dir, projectRoot) {
4943
4943
  }
4944
4944
  return files;
4945
4945
  }
4946
+ function resolveLintEnvironment(projectRoot) {
4947
+ const config = loadMasonConfig(projectRoot);
4948
+ const resolveDir = (configured, defaultSrc, defaultRoot) => {
4949
+ if (configured !== void 0) {
4950
+ return path26__default.default.resolve(projectRoot, configured);
4951
+ }
4952
+ const srcPath = path26__default.default.join(projectRoot, defaultSrc);
4953
+ if (fs17__default.default.existsSync(srcPath)) return srcPath;
4954
+ const rootPath = path26__default.default.join(projectRoot, defaultRoot);
4955
+ if (fs17__default.default.existsSync(rootPath)) return rootPath;
4956
+ return srcPath;
4957
+ };
4958
+ const featuresBase = resolveDir(config?.paths?.features, "src/features", "features");
4959
+ const sharedBase = resolveDir(config?.paths?.shared, "src/shared", "shared");
4960
+ const errorsBase = resolveDir(config?.paths?.errors, "src/errors", "errors");
4961
+ const defaultBaseErrorRelative = config?.paths?.errors ? path26__default.default.join(config.paths.errors, "AppError.ts") : fs17__default.default.existsSync(path26__default.default.join(projectRoot, "src/errors")) ? "src/errors/AppError.ts" : fs17__default.default.existsSync(path26__default.default.join(projectRoot, "errors")) ? "errors/AppError.ts" : "src/errors/AppError.ts";
4962
+ const baseErrorAbs = path26__default.default.resolve(
4963
+ projectRoot,
4964
+ config?.paths?.baseError || defaultBaseErrorRelative
4965
+ );
4966
+ return { featuresBase, sharedBase, errorsBase, baseErrorAbs };
4967
+ }
4946
4968
  function classifyFile(fullPathAbs, featuresBaseAbs, sharedBaseAbs, errorsBaseAbs) {
4947
4969
  if (!sharedBaseAbs || !errorsBaseAbs) {
4948
- const paths = getResolvedLintPaths(featuresBaseAbs, loadLintConfig(featuresBaseAbs));
4949
- featuresBaseAbs = paths.featuresBase;
4950
- sharedBaseAbs = paths.sharedBase;
4951
- errorsBaseAbs = paths.errorsBase;
4970
+ const env = resolveLintEnvironment(featuresBaseAbs);
4971
+ featuresBaseAbs = env.featuresBase;
4972
+ sharedBaseAbs = env.sharedBase;
4973
+ errorsBaseAbs = env.errorsBase;
4952
4974
  }
4953
4975
  const normFullPath = path26__default.default.resolve(fullPathAbs);
4954
4976
  const normErrorsBase = path26__default.default.resolve(errorsBaseAbs);
4955
4977
  const normSharedBase = path26__default.default.resolve(sharedBaseAbs);
4956
4978
  const normFeaturesBase = path26__default.default.resolve(featuresBaseAbs);
4957
- const relErrors = path26__default.default.relative(normErrorsBase, normFullPath).replace(/\\/g, "/");
4958
- if (!relErrors.startsWith("..") && !path26__default.default.isAbsolute(relErrors)) {
4979
+ const isUnder = (base, target) => {
4980
+ return target === base || target.startsWith(base + path26__default.default.sep);
4981
+ };
4982
+ if (isUnder(normErrorsBase, normFullPath)) {
4959
4983
  return {
4960
4984
  moduleType: "error",
4961
4985
  moduleName: "global-errors",
@@ -4963,26 +4987,26 @@ function classifyFile(fullPathAbs, featuresBaseAbs, sharedBaseAbs, errorsBaseAbs
4963
4987
  layer: "domain"
4964
4988
  };
4965
4989
  }
4966
- const relShared = path26__default.default.relative(normSharedBase, normFullPath).replace(/\\/g, "/");
4967
- if (!relShared.startsWith("..") && !path26__default.default.isAbsolute(relShared)) {
4968
- const parts = relShared.split("/").filter(Boolean);
4990
+ if (isUnder(normSharedBase, normFullPath)) {
4991
+ const rel = path26__default.default.relative(normSharedBase, normFullPath).replace(/\\/g, "/");
4992
+ const parts = rel.split("/").filter(Boolean);
4969
4993
  if (parts.length >= 1) {
4970
4994
  const moduleName = parts[0];
4971
- const rest = parts.slice(1).join("/");
4995
+ const subfolder = parts[1];
4972
4996
  let layer = "root";
4973
- if (rest.startsWith("domain/") || rest === "domain" || rest.startsWith("errors/") || rest === "errors") {
4997
+ if (subfolder === "domain" || subfolder === "errors") {
4974
4998
  layer = "domain";
4975
- } else if (rest.startsWith("ports/") || rest === "ports") {
4999
+ } else if (subfolder === "ports") {
4976
5000
  layer = "ports";
4977
- } else if (rest.startsWith("infrastructure/") || rest === "infrastructure") {
5001
+ } else if (subfolder === "infrastructure") {
4978
5002
  layer = "infrastructure";
4979
5003
  }
4980
5004
  return { moduleType: "shared", moduleName, feature: moduleName, layer };
4981
5005
  }
4982
5006
  }
4983
- const relFeatures = path26__default.default.relative(normFeaturesBase, normFullPath).replace(/\\/g, "/");
4984
- if (!relFeatures.startsWith("..") && !path26__default.default.isAbsolute(relFeatures)) {
4985
- const parts = relFeatures.split("/").filter(Boolean);
5007
+ if (isUnder(normFeaturesBase, normFullPath)) {
5008
+ const rel = path26__default.default.relative(normFeaturesBase, normFullPath).replace(/\\/g, "/");
5009
+ const parts = rel.split("/").filter(Boolean);
4986
5010
  if (parts.length >= 2) {
4987
5011
  const moduleName = parts[0];
4988
5012
  const subfolder = parts[1];
@@ -4995,7 +5019,7 @@ function classifyFile(fullPathAbs, featuresBaseAbs, sharedBaseAbs, errorsBaseAbs
4995
5019
  layer = "services";
4996
5020
  } else if (subfolder === "infrastructure") {
4997
5021
  layer = "infrastructure";
4998
- } else if (subfolder === "pxExpress" || subfolder === "presentation" || subfolder === "handlers" || subfolder.startsWith("px")) {
5022
+ } else if (subfolder.startsWith("px") || subfolder === "presentation" || subfolder === "handlers" || subfolder === "transformers") {
4999
5023
  layer = "presentation";
5000
5024
  }
5001
5025
  return { moduleType: "feature", moduleName, feature: moduleName, layer };
@@ -5024,10 +5048,10 @@ function classifyTarget(specifier, sourceFileAbs, projectRoot, featuresBaseAbs,
5024
5048
  return { isExternal: true, isDiFramework: false };
5025
5049
  }
5026
5050
  if (!featuresBaseAbs || !sharedBaseAbs || !errorsBaseAbs) {
5027
- const paths = getResolvedLintPaths(projectRoot, loadLintConfig(projectRoot));
5028
- featuresBaseAbs = featuresBaseAbs || paths.featuresBase;
5029
- sharedBaseAbs = sharedBaseAbs || paths.sharedBase;
5030
- errorsBaseAbs = errorsBaseAbs || paths.errorsBase;
5051
+ const env = resolveLintEnvironment(projectRoot);
5052
+ featuresBaseAbs = featuresBaseAbs || env.featuresBase;
5053
+ sharedBaseAbs = sharedBaseAbs || env.sharedBase;
5054
+ errorsBaseAbs = errorsBaseAbs || env.errorsBase;
5031
5055
  }
5032
5056
  const isGlobalConfig = specifier === "@configs" || specifier.startsWith("@configs/") || specifier === "@/configs" || specifier.startsWith("@/configs/") || specifier === "~/configs" || specifier.startsWith("~/configs/") || specifier === "configs" || specifier.startsWith("configs/");
5033
5057
  let targetAbs = null;
@@ -5668,24 +5692,21 @@ function lintCodebase(options = {}) {
5668
5692
  const startTime = Date.now();
5669
5693
  const projectRoot = options.projectRoot || findProjectRoot(options.targetDir || process.cwd());
5670
5694
  const failFast = !options.complete;
5671
- const lintConfig = loadLintConfig(projectRoot);
5672
- const { featuresBase, sharedBase, errorsBase } = getResolvedLintPaths(projectRoot, lintConfig);
5695
+ const { featuresBase, sharedBase, errorsBase, baseErrorAbs } = resolveLintEnvironment(projectRoot);
5673
5696
  const missingFoundations = [];
5674
5697
  if (!fs17__default.default.existsSync(featuresBase)) missingFoundations.push("features/");
5675
5698
  if (!fs17__default.default.existsSync(sharedBase)) missingFoundations.push("shared/");
5676
5699
  if (!fs17__default.default.existsSync(errorsBase)) missingFoundations.push("errors/");
5677
5700
  if (missingFoundations.length > 0) {
5678
5701
  throw new DependencyRuleError(
5679
- `Project Structure Violation: Missing required foundational directories: ${missingFoundations.join(", ")}. Every project must contain 'features/', 'shared/', and 'errors/'.`,
5702
+ `Project Structure Violation: Missing required foundational directories: ${missingFoundations.join(", ")}. Every architecture must contain 'features/', 'shared/', and 'errors/'.`,
5680
5703
  [],
5681
5704
  true
5682
5705
  );
5683
5706
  }
5684
- const baseErrorRelative = lintConfig.baseErrorPath || path26__default.default.relative(projectRoot, path26__default.default.join(errorsBase, "AppError.ts")).replace(/\\/g, "/");
5685
- const baseErrorAbs = path26__default.default.resolve(projectRoot, baseErrorRelative);
5686
5707
  if (!fs17__default.default.existsSync(baseErrorAbs)) {
5687
5708
  throw new DependencyRuleError(
5688
- `Project Structure Violation: Base error class not found at '${baseErrorRelative}'. Create this file or update 'baseErrorPath' in mason-lint.config.json.`,
5709
+ `Project Structure Violation: Base error class not found at '${path26__default.default.relative(projectRoot, baseErrorAbs).replace(/\\/g, "/")}'. Configure paths.baseError in mason.config.json.`,
5689
5710
  [],
5690
5711
  true
5691
5712
  );
@@ -5763,7 +5784,7 @@ Code: ${v.code}`;
5763
5784
  code: lineCode,
5764
5785
  ruleId: "E3_PLAIN_ERROR_THROW",
5765
5786
  severity: "error",
5766
- advice: `Throwing plain 'Error' is prohibited. You must throw '${baseErrorClassName}' or a domain-specific error class that inherits from it.`,
5787
+ advice: `Throwing plain 'Error' is prohibited. You must throw '${baseErrorClassName}' or a custom error class that inherits from it.`,
5767
5788
  fixExample: {
5768
5789
  bad: lineCode,
5769
5790
  good: `throw new ${baseErrorClassName}("Something went wrong");`
@@ -5793,7 +5814,7 @@ Code: ${v.code}`;
5793
5814
  code: lineCode,
5794
5815
  ruleId: "E4_MISSING_INHERITANCE",
5795
5816
  severity: "error",
5796
- advice: `Error class '${className}' must extend '${baseErrorClassName}' (or another class that derives from it).`,
5817
+ advice: `Error class '${className}' must extend '${baseErrorClassName}'.`,
5797
5818
  fixExample: {
5798
5819
  bad: lineCode,
5799
5820
  good: `export class ${className} extends ${baseErrorClassName} { ... }`
@@ -5810,7 +5831,7 @@ Code: ${v.code}`;
5810
5831
  code: lineCode,
5811
5832
  ruleId: "E5_NATIVE_ERROR_INHERITANCE",
5812
5833
  severity: "error",
5813
- advice: `Error class '${className}' extends the native 'Error'. It must extend your base error class ('${baseErrorClassName}').`,
5834
+ advice: `Error class '${className}' extends native 'Error'. It must extend your configured base error class ('${baseErrorClassName}').`,
5814
5835
  fixExample: {
5815
5836
  bad: lineCode,
5816
5837
  good: `export class ${className} extends ${baseErrorClassName} { ... }`