visigraph 0.0.2 → 0.0.3

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.
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerValidate(program: Command): void;
3
+ export declare function validate(file: string): Promise<number>;
@@ -0,0 +1,34 @@
1
+ import { loadModel, resolve } from "@visigraph/core";
2
+ import { EXIT } from "../exit.js";
3
+ export function registerValidate(program) {
4
+ program
5
+ .command("validate")
6
+ .argument("<model>", "path to a model file (YAML)")
7
+ .description("check a model and every model it links or requires; every identifier must resolve")
8
+ .addHelpText("after", `
9
+ Exit codes:
10
+ 0 the model is valid
11
+ 1 the model has problems; each is printed as file:path: message
12
+ 2 the file could not be read`)
13
+ .action(async (file) => {
14
+ process.exitCode = await validate(file);
15
+ });
16
+ }
17
+ export async function validate(file) {
18
+ const parsed = await loadModel(file);
19
+ let diagnostics = parsed.diagnostics;
20
+ if (parsed.model) {
21
+ diagnostics = diagnostics.concat(resolve(parsed.model, { file }).diagnostics);
22
+ }
23
+ for (const d of diagnostics) {
24
+ const where = d.path ? `${d.file ?? file}:${d.path}` : (d.file ?? file);
25
+ console.error(`${d.severity}: ${where}: ${d.message}`);
26
+ }
27
+ if (diagnostics.length > 0) {
28
+ console.error(`${diagnostics.length} error${diagnostics.length === 1 ? "" : "s"}`);
29
+ return parsed.model ? EXIT.invalid : EXIT.usage;
30
+ }
31
+ console.log(`${file}: ok`);
32
+ return EXIT.ok;
33
+ }
34
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAmB,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,QAAQ,CAAC,SAAS,EAAE,6BAA6B,CAAC;SAClD,WAAW,CAAC,mFAAmF,CAAC;SAChG,WAAW,CACV,OAAO,EACP;;;;gCAI0B,CAC3B;SACA,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC7B,OAAO,CAAC,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY;IACzC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,WAAW,GAAiB,MAAM,CAAC,WAAW,CAAC;IACnD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;IAChF,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;QACxE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,KAAK,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,MAAM,SAAS,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACnF,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IAClD,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC;IAC3B,OAAO,IAAI,CAAC,EAAE,CAAC;AACjB,CAAC"}
package/dist/exit.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ /** Exit codes shared by every command. */
2
+ export declare const EXIT: {
3
+ readonly ok: 0;
4
+ /** The model has problems (dangling references, bad shape). */
5
+ readonly invalid: 1;
6
+ /** Bad usage, unreadable file, or an unexpected failure. */
7
+ readonly usage: 2;
8
+ };
package/dist/exit.js ADDED
@@ -0,0 +1,9 @@
1
+ /** Exit codes shared by every command. */
2
+ export const EXIT = {
3
+ ok: 0,
4
+ /** The model has problems (dangling references, bad shape). */
5
+ invalid: 1,
6
+ /** Bad usage, unreadable file, or an unexpected failure. */
7
+ usage: 2,
8
+ };
9
+ //# sourceMappingURL=exit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit.js","sourceRoot":"","sources":["../src/exit.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,EAAE,EAAE,CAAC;IACL,+DAA+D;IAC/D,OAAO,EAAE,CAAC;IACV,4DAA4D;IAC5D,KAAK,EAAE,CAAC;CACA,CAAC"}
package/dist/main.js CHANGED
@@ -1,35 +1,35 @@
1
1
  #!/usr/bin/env node
2
- import { parseArgs } from "node:util";
3
- import { loadModel, resolve } from "@visigraph/core";
4
- const USAGE = `usage: visigraph validate <model.yaml>
5
-
6
- Loads the model and every model it links or requires, then resolves every
7
- identifier. Exits 1 on any dangling reference.`;
8
- async function main(argv) {
9
- const { positionals } = parseArgs({ args: argv, allowPositionals: true, strict: true });
10
- const [command, file] = positionals;
11
- if (command !== "validate" || !file) {
12
- console.error(USAGE);
13
- return 2;
2
+ import { Command, CommanderError } from "commander";
3
+ import { registerValidate } from "./commands/validate.js";
4
+ import { EXIT } from "./exit.js";
5
+ import { DESCRIPTION, VERSION } from "./version.js";
6
+ const program = new Command();
7
+ program
8
+ .name("visigraph")
9
+ .description(DESCRIPTION)
10
+ .version(VERSION, "-v, --version", "print the version and exit")
11
+ .helpOption("-h, --help", "print help and exit")
12
+ .helpCommand("help [command]", "print help for a command")
13
+ .showHelpAfterError("(run with --help for usage)")
14
+ .exitOverride();
15
+ registerValidate(program);
16
+ try {
17
+ if (process.argv.length <= 2) {
18
+ program.outputHelp();
19
+ process.exitCode = EXIT.usage;
14
20
  }
15
- const parsed = await loadModel(file);
16
- let diagnostics = parsed.diagnostics;
17
- if (parsed.model) {
18
- diagnostics = diagnostics.concat(resolve(parsed.model, { file }).diagnostics);
21
+ else {
22
+ await program.parseAsync(process.argv);
19
23
  }
20
- for (const d of diagnostics) {
21
- const where = d.path ? `${d.file ?? file}:${d.path}` : (d.file ?? file);
22
- console.error(`${d.severity}: ${where}: ${d.message}`);
24
+ }
25
+ catch (e) {
26
+ if (e instanceof CommanderError) {
27
+ // --help and --version exit 0; every other commander error is a usage error.
28
+ process.exitCode = e.exitCode === 0 ? EXIT.ok : EXIT.usage;
23
29
  }
24
- if (diagnostics.length > 0) {
25
- console.error(`${diagnostics.length} error${diagnostics.length === 1 ? "" : "s"}`);
26
- return 1;
30
+ else {
31
+ console.error(`error: ${e instanceof Error ? e.message : String(e)}`);
32
+ process.exitCode = EXIT.usage;
27
33
  }
28
- console.log(`${file}: ok`);
29
- return 0;
30
34
  }
31
- main(process.argv.slice(2)).then((code) => process.exit(code), (e) => {
32
- console.error(`error: ${e instanceof Error ? e.message : String(e)}`);
33
- process.exit(2);
34
- });
35
35
  //# sourceMappingURL=main.js.map
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAmB,MAAM,iBAAiB,CAAC;AAEtE,MAAM,KAAK,GAAG;;;+CAGiC,CAAC;AAEhD,KAAK,UAAU,IAAI,CAAC,IAAc;IAChC,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACxF,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,WAAW,CAAC;IAEpC,IAAI,OAAO,KAAK,UAAU,IAAI,CAAC,IAAI,EAAE,CAAC;QACpC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,WAAW,GAAiB,MAAM,CAAC,WAAW,CAAC;IACnD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;IAChF,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;QACxE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,KAAK,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,MAAM,SAAS,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACnF,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC;IAC3B,OAAO,CAAC,CAAC;AACX,CAAC;AAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAC9B,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAC5B,CAAC,CAAU,EAAE,EAAE;IACb,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CACF,CAAC"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,WAAW,CAAC;KACxB,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,4BAA4B,CAAC;KAC/D,UAAU,CAAC,YAAY,EAAE,qBAAqB,CAAC;KAC/C,WAAW,CAAC,gBAAgB,EAAE,0BAA0B,CAAC;KACzD,kBAAkB,CAAC,6BAA6B,CAAC;KACjD,YAAY,EAAE,CAAC;AAElB,gBAAgB,CAAC,OAAO,CAAC,CAAC;AAE1B,IAAI,CAAC;IACH,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,UAAU,EAAE,CAAC;QACrB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAAC,OAAO,CAAU,EAAE,CAAC;IACpB,IAAI,CAAC,YAAY,cAAc,EAAE,CAAC;QAChC,6EAA6E;QAC7E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtE,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;IAChC,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const VERSION: string;
2
+ export declare const DESCRIPTION: string;
@@ -0,0 +1,6 @@
1
+ import { createRequire } from "node:module";
2
+ const require = createRequire(import.meta.url);
3
+ const pkg = require("../package.json");
4
+ export const VERSION = pkg.version;
5
+ export const DESCRIPTION = pkg.description;
6
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAA6C,CAAC;AAEnF,MAAM,CAAC,MAAM,OAAO,GAAW,GAAG,CAAC,OAAO,CAAC;AAC3C,MAAM,CAAC,MAAM,WAAW,GAAW,GAAG,CAAC,WAAW,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "visigraph",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "description": "VisiGraph CLI \u2014 validate architecture models and play journeys through them",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -19,7 +19,8 @@
19
19
  },
20
20
  "homepage": "https://github.com/textologylabs/visigraph",
21
21
  "dependencies": {
22
- "@visigraph/core": "0.0.2"
22
+ "@visigraph/core": "0.0.3",
23
+ "commander": "^13.1.0"
23
24
  },
24
25
  "bugs": {
25
26
  "url": "https://github.com/textologylabs/visigraph/issues"