@canonical/webarchitect 0.10.0-experimental.0 → 0.10.0-experimental.1

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.
Files changed (34) hide show
  1. package/dist/esm/cli.js +0 -0
  2. package/package.json +3 -2
  3. package/dist/esm/ajv.js +0 -46
  4. package/dist/esm/ajv.js.map +0 -1
  5. package/dist/esm/executeValidationRules.js +0 -26
  6. package/dist/esm/executeValidationRules.js.map +0 -1
  7. package/dist/esm/listDirectory.js +0 -12
  8. package/dist/esm/listDirectory.js.map +0 -1
  9. package/dist/esm/loadFullSchema.js +0 -15
  10. package/dist/esm/loadFullSchema.js.map +0 -1
  11. package/dist/esm/resolveSchema.js +0 -67
  12. package/dist/esm/resolveSchema.js.map +0 -1
  13. package/dist/esm/validateDirectoryRule.js +0 -120
  14. package/dist/esm/validateDirectoryRule.js.map +0 -1
  15. package/dist/esm/validateFileRule.js +0 -119
  16. package/dist/esm/validateFileRule.js.map +0 -1
  17. package/dist/esm/validateProject.js +0 -31
  18. package/dist/esm/validateProject.js.map +0 -1
  19. package/dist/types/ajv.d.ts +0 -4
  20. package/dist/types/ajv.d.ts.map +0 -1
  21. package/dist/types/executeValidationRules.d.ts +0 -3
  22. package/dist/types/executeValidationRules.d.ts.map +0 -1
  23. package/dist/types/listDirectory.d.ts +0 -5
  24. package/dist/types/listDirectory.d.ts.map +0 -1
  25. package/dist/types/loadFullSchema.d.ts +0 -3
  26. package/dist/types/loadFullSchema.d.ts.map +0 -1
  27. package/dist/types/resolveSchema.d.ts +0 -3
  28. package/dist/types/resolveSchema.d.ts.map +0 -1
  29. package/dist/types/validateDirectoryRule.d.ts +0 -3
  30. package/dist/types/validateDirectoryRule.d.ts.map +0 -1
  31. package/dist/types/validateFileRule.d.ts +0 -3
  32. package/dist/types/validateFileRule.d.ts.map +0 -1
  33. package/dist/types/validateProject.d.ts +0 -8
  34. package/dist/types/validateProject.d.ts.map +0 -1
package/dist/esm/cli.js CHANGED
File without changes
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@canonical/webarchitect",
3
3
  "description": "A tool to test the compliance with architecture specifications for packages and applications.",
4
- "version": "0.10.0-experimental.0",
4
+ "version": "0.10.0-experimental.1",
5
5
  "type": "module",
6
6
  "module": "dist/esm/index.js",
7
7
  "types": "dist/types/index.d.ts",
@@ -43,7 +43,8 @@
43
43
  },
44
44
  "dependencies": {
45
45
  "ajv": "^8.17.1",
46
+ "chalk": "^5.4.1",
46
47
  "commander": "^14.0.0"
47
48
  },
48
- "gitHead": "d38f742073a1a0e582ce138bf0eb6dd63889721b"
49
+ "gitHead": "cee6d1a320680e51c78bd301e53ed3f60182e004"
49
50
  }
package/dist/esm/ajv.js DELETED
@@ -1,46 +0,0 @@
1
- import ajvPackage from "ajv";
2
- import draft202012 from "./schemas/draft-2020-12.json" with { type: "json" };
3
- import metaApplicator from "./schemas/meta/applicator.json" with {
4
- type: "json"
5
- };
6
- import metaContent from "./schemas/meta/content.json" with { type: "json" };
7
- import metaCore from "./schemas/meta/core.json" with { type: "json" };
8
- import metaFormatAnnotation from "./schemas/meta/format-annotation.json" with {
9
- type: "json"
10
- };
11
- import metaMetaData from "./schemas/meta/meta-data.json" with { type: "json" };
12
- import metaUnevaluated from "./schemas/meta/unevaluated.json" with {
13
- type: "json"
14
- };
15
- import metaValidation from "./schemas/meta/validation.json" with {
16
- type: "json"
17
- };
18
- const Ajv = ajvPackage.default;
19
- // Create AJV instance with configuration optimized for our use case
20
- const ajv = new Ajv({
21
- strict: false, // Allow unknown keywords without throwing errors
22
- allErrors: true, // Collect all validation errors, not just the first one
23
- validateSchema: false, // Temporarily disable automatic schema validation during setup
24
- });
25
- // Step 1: Register all the foundational meta-schemas first
26
- // These are the building blocks that the main Draft 2020-12 schema depends on
27
- ajv.addSchema(metaCore, "https://json-schema.org/draft/2020-12/meta/core");
28
- ajv.addSchema(metaApplicator, "https://json-schema.org/draft/2020-12/meta/applicator");
29
- ajv.addSchema(metaUnevaluated, "https://json-schema.org/draft/2020-12/meta/unevaluated");
30
- ajv.addSchema(metaValidation, "https://json-schema.org/draft/2020-12/meta/validation");
31
- ajv.addSchema(metaMetaData, "https://json-schema.org/draft/2020-12/meta/meta-data");
32
- ajv.addSchema(metaFormatAnnotation, "https://json-schema.org/draft/2020-12/meta/format-annotation");
33
- ajv.addSchema(metaContent, "https://json-schema.org/draft/2020-12/meta/content");
34
- // Step 2: Now register the main Draft 2020-12 schema
35
- // This schema composes all the meta-schemas above into the complete specification
36
- ajv.addSchema(draft202012, "https://json-schema.org/draft/2020-12/schema");
37
- ajv.addSchema(draft202012, "http://json-schema.org/draft/2020-12/schema");
38
- // Step 3: Re-enable schema validation now that all pieces are in place
39
- ajv.opts.validateSchema = true;
40
- // Step 4: Add format validation support manually to avoid type issues
41
- // Instead of using ajv-formats, we'll add the most common formats we need
42
- ajv.addFormat("email", /^[^\s@]+@[^\s@]+\.[^\s@]+$/);
43
- ajv.addFormat("uri", /^https?:\/\/[^\s]+$/);
44
- ajv.addFormat("uri-reference", /^[^\s]*$/);
45
- export default ajv;
46
- //# sourceMappingURL=ajv.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ajv.js","sourceRoot":"","sources":["../../src/ajv.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,KAAK,CAAC;AAC7B,OAAO,WAAW,MAAM,8BAA8B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC7E,OAAO,cAAc,MAAM,gCAAgC,CAAC;IAC1D,IAAI,EAAE,MAAM;CACb,CAAC;AACF,OAAO,WAAW,MAAM,6BAA6B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC5E,OAAO,QAAQ,MAAM,0BAA0B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACtE,OAAO,oBAAoB,MAAM,uCAAuC,CAAC;IACvE,IAAI,EAAE,MAAM;CACb,CAAC;AACF,OAAO,YAAY,MAAM,+BAA+B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC/E,OAAO,eAAe,MAAM,iCAAiC,CAAC;IAC5D,IAAI,EAAE,MAAM;CACb,CAAC;AACF,OAAO,cAAc,MAAM,gCAAgC,CAAC;IAC1D,IAAI,EAAE,MAAM;CACb,CAAC;AAEF,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC;AAE/B,oEAAoE;AACpE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC;IAClB,MAAM,EAAE,KAAK,EAAE,iDAAiD;IAChE,SAAS,EAAE,IAAI,EAAE,wDAAwD;IACzE,cAAc,EAAE,KAAK,EAAE,+DAA+D;CACvF,CAAC,CAAC;AAEH,2DAA2D;AAC3D,8EAA8E;AAC9E,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,iDAAiD,CAAC,CAAC;AAC3E,GAAG,CAAC,SAAS,CACX,cAAc,EACd,uDAAuD,CACxD,CAAC;AACF,GAAG,CAAC,SAAS,CACX,eAAe,EACf,wDAAwD,CACzD,CAAC;AACF,GAAG,CAAC,SAAS,CACX,cAAc,EACd,uDAAuD,CACxD,CAAC;AACF,GAAG,CAAC,SAAS,CACX,YAAY,EACZ,sDAAsD,CACvD,CAAC;AACF,GAAG,CAAC,SAAS,CACX,oBAAoB,EACpB,8DAA8D,CAC/D,CAAC;AACF,GAAG,CAAC,SAAS,CACX,WAAW,EACX,oDAAoD,CACrD,CAAC;AAEF,qDAAqD;AACrD,kFAAkF;AAClF,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,8CAA8C,CAAC,CAAC;AAC3E,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,6CAA6C,CAAC,CAAC;AAE1E,uEAAuE;AACvE,GAAG,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;AAE/B,sEAAsE;AACtE,0EAA0E;AAC1E,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,4BAA4B,CAAC,CAAC;AACrD,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;AAC5C,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;AAE3C,eAAe,GAAG,CAAC"}
@@ -1,26 +0,0 @@
1
- import validateDirectoryRule from "./validateDirectoryRule.js";
2
- import validateFileRule from "./validateFileRule.js";
3
- export default async function executeValidationRules(projectPath, schema) {
4
- const results = [];
5
- // Iterate through each rule in the schema
6
- for (const [ruleName, rule] of Object.entries(schema)) {
7
- // Skip meta-properties that aren't validation rules
8
- if (ruleName === "$schema" || ruleName === "name" || ruleName === "extends")
9
- continue;
10
- // Type guard to ensure rule is an object with 'file' or 'directory'
11
- if (typeof rule === "object" && rule !== null) {
12
- if ("file" in rule) {
13
- // Pass the rule name context to file validation
14
- const fileResults = await validateFileRule(projectPath, rule.file, ruleName);
15
- results.push(...fileResults);
16
- }
17
- else if ("directory" in rule) {
18
- // Pass the rule name context to directory validation
19
- const dirResults = await validateDirectoryRule(projectPath, rule.directory, ruleName);
20
- results.push(...dirResults);
21
- }
22
- }
23
- }
24
- return results;
25
- }
26
- //# sourceMappingURL=executeValidationRules.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"executeValidationRules.js","sourceRoot":"","sources":["../../src/executeValidationRules.ts"],"names":[],"mappings":"AACA,OAAO,qBAAqB,MAAM,4BAA4B,CAAC;AAC/D,OAAO,gBAAgB,MAAM,uBAAuB,CAAC;AAErD,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,sBAAsB,CAClD,WAAmB,EACnB,MAAc;IAEd,MAAM,OAAO,GAAuB,EAAE,CAAC;IAEvC,0CAA0C;IAC1C,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACtD,oDAAoD;QACpD,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,SAAS;YACzE,SAAS;QAEX,oEAAoE;QACpE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAC9C,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBACnB,gDAAgD;gBAChD,MAAM,WAAW,GAAG,MAAM,gBAAgB,CACxC,WAAW,EACX,IAAI,CAAC,IAAI,EACT,QAAQ,CACT,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;YAC/B,CAAC;iBAAM,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;gBAC/B,qDAAqD;gBACrD,MAAM,UAAU,GAAG,MAAM,qBAAqB,CAC5C,WAAW,EACX,IAAI,CAAC,SAAS,EACd,QAAQ,CACT,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -1,12 +0,0 @@
1
- import { readdir } from "node:fs/promises";
2
- export default async function listDirectory(path) {
3
- const entries = await readdir(path, { withFileTypes: true });
4
- const files = entries
5
- .filter((entry) => entry.isFile())
6
- .map((entry) => entry.name);
7
- const directories = entries
8
- .filter((entry) => entry.isDirectory())
9
- .map((entry) => entry.name);
10
- return { files, directories };
11
- }
12
- //# sourceMappingURL=listDirectory.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"listDirectory.js","sourceRoot":"","sources":["../../src/listDirectory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,aAAa,CACzC,IAAY;IAEZ,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,OAAO;SAClB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;SACjC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,WAAW,GAAG,OAAO;SACxB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;SACtC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AAChC,CAAC"}
@@ -1,15 +0,0 @@
1
- import resolveSchema from "./resolveSchema.js";
2
- export default async function loadFullSchema(schemaArg) {
3
- const schema = await resolveSchema(schemaArg);
4
- if (schema.extends) {
5
- const baseSchemas = await Promise.all(schema.extends.map(loadFullSchema));
6
- const baseRules = baseSchemas.reduce((acc, s) => {
7
- const { $schema, name, extends: _, ...rules } = s;
8
- return Object.assign(acc, rules);
9
- }, {});
10
- const { $schema, name, extends: _, ...rules } = schema;
11
- return Object.assign({}, baseRules, rules, { $schema, name });
12
- }
13
- return schema;
14
- }
15
- //# sourceMappingURL=loadFullSchema.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"loadFullSchema.js","sourceRoot":"","sources":["../../src/loadFullSchema.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAG/C,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,cAAc,CAC1C,SAAiB;IAEjB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;QAC1E,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YAC9C,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC;YAClD,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC;QACvD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,67 +0,0 @@
1
- import { readFile } from "node:fs/promises";
2
- import { dirname, join } from "node:path";
3
- import { fileURLToPath } from "node:url";
4
- import ajv from "./ajv.js";
5
- import motherSchema from "./schema.json" with { type: "json" };
6
- const __filename = fileURLToPath(import.meta.url);
7
- const __dirname = dirname(__filename);
8
- const validateSchema = ajv.compile(motherSchema);
9
- function formatValidationErrors(errors) {
10
- // Group errors by property path
11
- const errorsByPath = new Map();
12
- for (const error of errors) {
13
- const path = error.instancePath || "/";
14
- const message = error.message || "validation failed";
15
- if (!errorsByPath.has(path)) {
16
- errorsByPath.set(path, []);
17
- }
18
- // Safe access using optional chaining
19
- errorsByPath.get(path)?.push(message);
20
- }
21
- // Format as readable list
22
- const formattedErrors = Array.from(errorsByPath.entries())
23
- .map(([path, messages]) => {
24
- const uniqueMessages = [...new Set(messages)]; // Remove duplicates
25
- const property = path === "/" ? "root" : path.replace("/", "");
26
- return ` ${property}: ${uniqueMessages.join(", ")}`;
27
- })
28
- .join("\n");
29
- return `Schema validation failed:\n${formattedErrors}`;
30
- }
31
- export default async function resolveSchema(schemaArg) {
32
- let schemaData;
33
- let schemaSource;
34
- if (schemaArg.startsWith("http://") || schemaArg.startsWith("https://")) {
35
- schemaSource = schemaArg;
36
- const response = await fetch(schemaArg);
37
- schemaData = (await response.json());
38
- }
39
- else {
40
- let schemaPath = schemaArg;
41
- if (!schemaPath.endsWith(".json")) {
42
- schemaPath += ".json";
43
- }
44
- try {
45
- schemaSource = schemaPath;
46
- schemaData = JSON.parse(await readFile(schemaPath, "utf-8"));
47
- }
48
- catch (e) {
49
- const bundledPath = join(__dirname, "../../rulesets", schemaPath);
50
- try {
51
- schemaSource = bundledPath;
52
- schemaData = JSON.parse(await readFile(bundledPath, "utf-8"));
53
- }
54
- catch (bundledError) {
55
- throw new Error(`Could not find ruleset: '${schemaArg}'. Checked local path '${schemaPath}' and bundled path '${bundledPath}'. Available bundled rulesets: base, package, package-react`);
56
- }
57
- }
58
- }
59
- // Log where the ruleset was successfully loaded from
60
- console.log(`Loaded ruleset from: ${schemaSource}`);
61
- if (!validateSchema(schemaData)) {
62
- const errorMessage = formatValidationErrors(validateSchema.errors || []);
63
- throw new Error(`Invalid ruleset from ${schemaSource}:\n${errorMessage}`);
64
- }
65
- return schemaData;
66
- }
67
- //# sourceMappingURL=resolveSchema.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolveSchema.js","sourceRoot":"","sources":["../../src/resolveSchema.ts"],"names":[],"mappings":"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"}
@@ -1,120 +0,0 @@
1
- import { stat } from "node:fs/promises";
2
- import { join } from "node:path";
3
- import listDirectory from "./listDirectory.js";
4
- import validateFileRule from "./validateFileRule.js";
5
- export default async function validateDirectoryRule(projectPath, dirRule, ruleName) {
6
- const dirPath = join(projectPath, dirRule.name);
7
- const results = [];
8
- // Check if directory exists
9
- try {
10
- const stats = await stat(dirPath);
11
- if (!stats.isDirectory()) {
12
- return [
13
- {
14
- rule: ruleName, // Use the rule name from schema
15
- passed: false,
16
- message: `Expected directory but found file: ${dirPath}`,
17
- context: {
18
- type: "directory",
19
- target: dirPath,
20
- description: `Validates directory structure for ${dirRule.name}`,
21
- actualValue: "[File found instead of directory]",
22
- },
23
- },
24
- ];
25
- }
26
- }
27
- catch (e) {
28
- if (e.code === "ENOENT") {
29
- return [
30
- {
31
- rule: ruleName, // Use the rule name from schema
32
- passed: false,
33
- message: `Directory not found: ${dirPath}`,
34
- context: {
35
- type: "directory",
36
- target: dirPath,
37
- description: `Validates directory structure for ${dirRule.name}`,
38
- actualValue: "[Directory not found]",
39
- },
40
- },
41
- ];
42
- }
43
- return [
44
- {
45
- rule: ruleName, // Use the rule name from schema
46
- passed: false,
47
- message: `Error accessing directory: ${e.message}`,
48
- context: {
49
- type: "directory",
50
- target: dirPath,
51
- description: `Validates directory structure for ${dirRule.name}`,
52
- actualValue: `[Access Error: ${e.message}]`,
53
- },
54
- },
55
- ];
56
- }
57
- // Validate contained files and directories
58
- if (dirRule.contains) {
59
- if (dirRule.contains.files) {
60
- for (const fileRule of dirRule.contains.files) {
61
- // When validating files within a directory rule, use a combined rule name
62
- const fileRuleName = `${ruleName}/${fileRule.name}`;
63
- const fileResults = await validateFileRule(dirPath, fileRule, fileRuleName);
64
- results.push(...fileResults);
65
- }
66
- }
67
- if (dirRule.contains.directories) {
68
- for (const subDirRule of dirRule.contains.directories) {
69
- // When validating subdirectories, use a combined rule name
70
- const subDirRuleName = `${ruleName}/${subDirRule.name}`;
71
- const subDirResults = await validateDirectoryRule(dirPath, subDirRule, subDirRuleName);
72
- results.push(...subDirResults);
73
- }
74
- }
75
- }
76
- // Strict mode validation
77
- if (dirRule.strict) {
78
- const { files, directories } = await listDirectory(dirPath);
79
- const expectedFiles = dirRule.contains?.files?.map((f) => f.name) || [];
80
- const expectedDirs = dirRule.contains?.directories?.map((d) => d.name) || [];
81
- const extraFiles = files.filter((f) => !expectedFiles.includes(f));
82
- const extraDirs = directories.filter((d) => !expectedDirs.includes(d));
83
- if (extraFiles.length > 0 || extraDirs.length > 0) {
84
- let message = "Strict mode: ";
85
- if (extraFiles.length > 0)
86
- message += `extra files found: ${extraFiles.join(", ")}`;
87
- if (extraDirs.length > 0) {
88
- if (extraFiles.length > 0)
89
- message += "; ";
90
- message += `extra directories found: ${extraDirs.join(", ")}`;
91
- }
92
- results.push({
93
- rule: ruleName, // Use the rule name from schema
94
- passed: false,
95
- message,
96
- context: {
97
- type: "directory",
98
- target: dirPath,
99
- description: `Strict validation for ${dirRule.name}`,
100
- actualValue: { extraFiles, extraDirs },
101
- },
102
- });
103
- }
104
- }
105
- // If no errors were found (or all were passing), add a success result
106
- if (results.length === 0 || results.every((r) => r.passed)) {
107
- results.push({
108
- rule: ruleName, // Use the rule name from schema
109
- passed: true,
110
- context: {
111
- type: "directory",
112
- target: dirPath,
113
- description: `Validates directory structure for ${dirRule.name}`,
114
- actualValue: "[Directory exists and structure is valid]",
115
- },
116
- });
117
- }
118
- return results;
119
- }
120
- //# sourceMappingURL=validateDirectoryRule.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validateDirectoryRule.js","sourceRoot":"","sources":["../../src/validateDirectoryRule.ts"],"names":[],"mappings":"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"}
@@ -1,119 +0,0 @@
1
- import { readFile } from "node:fs/promises";
2
- import { join } from "node:path";
3
- import ajv from "./ajv.js";
4
- // Generate a human-readable description of what a schema validates
5
- // Using JSONSchema7 type for better type safety than 'any'
6
- function describeSchema(schema) {
7
- const descriptions = [];
8
- if (schema.type) {
9
- if (typeof schema.type === "string") {
10
- descriptions.push(`must be ${schema.type}`);
11
- }
12
- else if (Array.isArray(schema.type)) {
13
- descriptions.push(`must be one of: ${schema.type.join(", ")}`);
14
- }
15
- }
16
- if (schema.const !== undefined) {
17
- descriptions.push(`must equal "${schema.const}"`);
18
- }
19
- if (typeof schema.pattern === "string") {
20
- descriptions.push(`must match pattern /${schema.pattern}/`);
21
- }
22
- if (schema.required && Array.isArray(schema.required)) {
23
- descriptions.push(`must have properties: ${schema.required.join(", ")}`);
24
- }
25
- if (schema.properties && typeof schema.properties === "object") {
26
- const propNames = Object.keys(schema.properties);
27
- if (propNames.length <= 3) {
28
- descriptions.push(`expected properties: ${propNames.join(", ")}`);
29
- }
30
- else {
31
- descriptions.push(`validates ${propNames.length} properties`);
32
- }
33
- }
34
- if (descriptions.length === 0) {
35
- return "validates file content structure";
36
- }
37
- return descriptions.join(", ");
38
- }
39
- export default async function validateFileRule(projectPath, fileRule, ruleName) {
40
- const filePath = join(projectPath, fileRule.name);
41
- // Prepare base context for verbose output using the actual rule name
42
- const baseContext = {
43
- type: "file",
44
- target: filePath,
45
- description: `Validates that ${fileRule.name} ${describeSchema(fileRule.contains)}`,
46
- schema: fileRule.contains,
47
- };
48
- try {
49
- const content = await readFile(filePath, "utf-8");
50
- try {
51
- const json = JSON.parse(content);
52
- const validate = ajv.compile(fileRule.contains);
53
- const valid = validate(json);
54
- if (valid) {
55
- return [
56
- {
57
- rule: ruleName, // Use the rule name from schema, not filename
58
- passed: true,
59
- context: {
60
- ...baseContext,
61
- actualValue: json,
62
- },
63
- },
64
- ];
65
- }
66
- return [
67
- {
68
- rule: ruleName, // Use the rule name from schema, not filename
69
- passed: false,
70
- message: `Validation failed: ${JSON.stringify(validate.errors)}`,
71
- context: {
72
- ...baseContext,
73
- actualValue: json,
74
- },
75
- },
76
- ];
77
- }
78
- catch (parseError) {
79
- return [
80
- {
81
- rule: ruleName, // Use the rule name from schema, not filename
82
- passed: false,
83
- message: `Invalid JSON: ${parseError.message}`,
84
- context: {
85
- ...baseContext,
86
- actualValue: `[Parse Error: ${parseError.message}]`,
87
- },
88
- },
89
- ];
90
- }
91
- }
92
- catch (readError) {
93
- if (readError.code === "ENOENT") {
94
- return [
95
- {
96
- rule: ruleName, // Use the rule name from schema, not filename
97
- passed: false,
98
- message: `File not found: ${filePath}`,
99
- context: {
100
- ...baseContext,
101
- actualValue: "[File not found]",
102
- },
103
- },
104
- ];
105
- }
106
- return [
107
- {
108
- rule: ruleName, // Use the rule name from schema, not filename
109
- passed: false,
110
- message: `Error reading file: ${readError.message}`,
111
- context: {
112
- ...baseContext,
113
- actualValue: `[Read Error: ${readError.message}]`,
114
- },
115
- },
116
- ];
117
- }
118
- }
119
- //# sourceMappingURL=validateFileRule.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validateFileRule.js","sourceRoot":"","sources":["../../src/validateFileRule.ts"],"names":[],"mappings":"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"}
@@ -1,31 +0,0 @@
1
- import validateDirectoryRule from "./validateDirectoryRule.js";
2
- import validateFileRule from "./validateFileRule.js";
3
- /**
4
- * Legacy validation function maintained for backward compatibility.
5
- * Consider using executeValidationRules.ts for new code as it provides
6
- * better rule name tracking and inheritance support.
7
- */
8
- export default async function validateProject(projectPath, schema) {
9
- const results = [];
10
- // Iterate through schema rules, similar to executeValidationRules but simpler
11
- for (const [ruleName, rule] of Object.entries(schema)) {
12
- // Skip meta-properties that aren't validation rules
13
- if (ruleName === "$schema" || ruleName === "name" || ruleName === "extends")
14
- continue;
15
- // Type guard to ensure rule is an object with 'file' or 'directory'
16
- if (typeof rule === "object" && rule !== null) {
17
- if ("file" in rule) {
18
- // Pass the rule name context to match current function signature
19
- const fileResults = await validateFileRule(projectPath, rule.file, ruleName);
20
- results.push(...fileResults);
21
- }
22
- else if ("directory" in rule) {
23
- // Pass the rule name context to match current function signature
24
- const dirResults = await validateDirectoryRule(projectPath, rule.directory, ruleName);
25
- results.push(...dirResults);
26
- }
27
- }
28
- }
29
- return results;
30
- }
31
- //# sourceMappingURL=validateProject.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validateProject.js","sourceRoot":"","sources":["../../src/validateProject.ts"],"names":[],"mappings":"AACA,OAAO,qBAAqB,MAAM,4BAA4B,CAAC;AAC/D,OAAO,gBAAgB,MAAM,uBAAuB,CAAC;AAErD;;;;GAIG;AACH,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,eAAe,CAC3C,WAAmB,EACnB,MAAc;IAEd,MAAM,OAAO,GAAuB,EAAE,CAAC;IAEvC,8EAA8E;IAC9E,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACtD,oDAAoD;QACpD,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,SAAS;YACzE,SAAS;QAEX,oEAAoE;QACpE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAC9C,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBACnB,iEAAiE;gBACjE,MAAM,WAAW,GAAG,MAAM,gBAAgB,CACxC,WAAW,EACX,IAAI,CAAC,IAAI,EACT,QAAQ,CACT,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;YAC/B,CAAC;iBAAM,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;gBAC/B,iEAAiE;gBACjE,MAAM,UAAU,GAAG,MAAM,qBAAqB,CAC5C,WAAW,EACX,IAAI,CAAC,SAAS,EACd,QAAQ,CACT,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -1,4 +0,0 @@
1
- import ajvPackage from "ajv";
2
- declare const ajv: ajvPackage.Ajv;
3
- export default ajv;
4
- //# sourceMappingURL=ajv.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ajv.d.ts","sourceRoot":"","sources":["../../src/ajv.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,KAAK,CAAC;AAqB7B,QAAA,MAAM,GAAG,gBAIP,CAAC;AA4CH,eAAe,GAAG,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { Schema, ValidationResult } from "./types.js";
2
- export default function executeValidationRules(projectPath: string, schema: Schema): Promise<ValidationResult[]>;
3
- //# sourceMappingURL=executeValidationRules.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"executeValidationRules.d.ts","sourceRoot":"","sources":["../../src/executeValidationRules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAI3D,wBAA8B,sBAAsB,CAClD,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA+B7B"}
@@ -1,5 +0,0 @@
1
- export default function listDirectory(path: string): Promise<{
2
- files: string[];
3
- directories: string[];
4
- }>;
5
- //# sourceMappingURL=listDirectory.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"listDirectory.d.ts","sourceRoot":"","sources":["../../src/listDirectory.ts"],"names":[],"mappings":"AAEA,wBAA8B,aAAa,CACzC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CASrD"}
@@ -1,3 +0,0 @@
1
- import type { Schema } from "./types.js";
2
- export default function loadFullSchema(schemaArg: string): Promise<Schema>;
3
- //# sourceMappingURL=loadFullSchema.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"loadFullSchema.d.ts","sourceRoot":"","sources":["../../src/loadFullSchema.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,wBAA8B,cAAc,CAC1C,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAYjB"}
@@ -1,3 +0,0 @@
1
- import type { Schema } from "./types.js";
2
- export default function resolveSchema(schemaArg: string): Promise<Schema>;
3
- //# sourceMappingURL=resolveSchema.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolveSchema.d.ts","sourceRoot":"","sources":["../../src/resolveSchema.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAkCzC,wBAA8B,aAAa,CACzC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAuCjB"}
@@ -1,3 +0,0 @@
1
- import type { DirectoryRule, ValidationResult } from "./types.js";
2
- export default function validateDirectoryRule(projectPath: string, dirRule: DirectoryRule, ruleName: string): Promise<ValidationResult[]>;
3
- //# sourceMappingURL=validateDirectoryRule.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validateDirectoryRule.d.ts","sourceRoot":"","sources":["../../src/validateDirectoryRule.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGlE,wBAA8B,qBAAqB,CACjD,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA8H7B"}
@@ -1,3 +0,0 @@
1
- import type { FileRule, ValidationResult } from "./types.js";
2
- export default function validateFileRule(projectPath: string, fileRule: FileRule, ruleName: string): Promise<ValidationResult[]>;
3
- //# sourceMappingURL=validateFileRule.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validateFileRule.d.ts","sourceRoot":"","sources":["../../src/validateFileRule.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AA2C7D,wBAA8B,gBAAgB,CAC5C,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAiF7B"}
@@ -1,8 +0,0 @@
1
- import type { Schema, ValidationResult } from "./types.js";
2
- /**
3
- * Legacy validation function maintained for backward compatibility.
4
- * Consider using executeValidationRules.ts for new code as it provides
5
- * better rule name tracking and inheritance support.
6
- */
7
- export default function validateProject(projectPath: string, schema: Schema): Promise<ValidationResult[]>;
8
- //# sourceMappingURL=validateProject.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validateProject.d.ts","sourceRoot":"","sources":["../../src/validateProject.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAI3D;;;;GAIG;AACH,wBAA8B,eAAe,CAC3C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA+B7B"}