@nyrra/prismantix-cli 0.0.4-next.20 → 0.0.4-next.22

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 (54) hide show
  1. package/README.md +14 -0
  2. package/dist/commands/foundry/import.d.ts +17 -0
  3. package/dist/commands/foundry/import.d.ts.map +1 -0
  4. package/dist/commands/foundry/import.js +94 -0
  5. package/dist/constants.d.ts +1 -0
  6. package/dist/constants.d.ts.map +1 -1
  7. package/dist/constants.js +1 -0
  8. package/dist/foundry-import/actions.d.ts +3 -0
  9. package/dist/foundry-import/actions.d.ts.map +1 -0
  10. package/dist/foundry-import/actions.js +37 -0
  11. package/dist/foundry-import/convert.d.ts +3 -0
  12. package/dist/foundry-import/convert.d.ts.map +1 -0
  13. package/dist/foundry-import/convert.js +47 -0
  14. package/dist/foundry-import/emit.d.ts +3 -0
  15. package/dist/foundry-import/emit.d.ts.map +1 -0
  16. package/dist/foundry-import/emit.js +263 -0
  17. package/dist/foundry-import/interfaces.d.ts +3 -0
  18. package/dist/foundry-import/interfaces.d.ts.map +1 -0
  19. package/dist/foundry-import/interfaces.js +43 -0
  20. package/dist/foundry-import/names.d.ts +10 -0
  21. package/dist/foundry-import/names.d.ts.map +1 -0
  22. package/dist/foundry-import/names.js +83 -0
  23. package/dist/foundry-import/objects.d.ts +9 -0
  24. package/dist/foundry-import/objects.d.ts.map +1 -0
  25. package/dist/foundry-import/objects.js +128 -0
  26. package/dist/foundry-import/parse.d.ts +3 -0
  27. package/dist/foundry-import/parse.d.ts.map +1 -0
  28. package/dist/foundry-import/parse.js +28 -0
  29. package/dist/foundry-import/properties.d.ts +4 -0
  30. package/dist/foundry-import/properties.d.ts.map +1 -0
  31. package/dist/foundry-import/properties.js +83 -0
  32. package/dist/foundry-import/property-types.d.ts +7 -0
  33. package/dist/foundry-import/property-types.d.ts.map +1 -0
  34. package/dist/foundry-import/property-types.js +77 -0
  35. package/dist/foundry-import/relations.d.ts +11 -0
  36. package/dist/foundry-import/relations.d.ts.map +1 -0
  37. package/dist/foundry-import/relations.js +204 -0
  38. package/dist/foundry-import/types.d.ts +335 -0
  39. package/dist/foundry-import/types.d.ts.map +1 -0
  40. package/dist/foundry-import/types.js +1 -0
  41. package/dist/foundry-import/utils.d.ts +13 -0
  42. package/dist/foundry-import/utils.d.ts.map +1 -0
  43. package/dist/foundry-import/utils.js +82 -0
  44. package/dist/foundry-import/validate.d.ts +8 -0
  45. package/dist/foundry-import/validate.d.ts.map +1 -0
  46. package/dist/foundry-import/validate.js +117 -0
  47. package/dist/foundry-import/workflow.d.ts +3 -0
  48. package/dist/foundry-import/workflow.d.ts.map +1 -0
  49. package/dist/foundry-import/workflow.js +104 -0
  50. package/dist/foundry-import.d.ts +3 -0
  51. package/dist/foundry-import.d.ts.map +1 -0
  52. package/dist/foundry-import.js +1 -0
  53. package/oclif.manifest.json +62 -1
  54. package/package.json +6 -3
@@ -0,0 +1,104 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import { basename, dirname, join, resolve } from "node:path";
3
+ import { DEFAULT_FOUNDRY_IMPORT_OUTPUT_ROOT } from "../constants.js";
4
+ import { CliUserError } from "../errors.js";
5
+ import { convertFoundryV2Export } from "./convert.js";
6
+ import { emitFoundryImportFiles } from "./emit.js";
7
+ import { formatErrorMessage, summarizeConversion, summarizeDiagnostics, } from "./utils.js";
8
+ import { validateFoundryImportOutput } from "./validate.js";
9
+ export async function runFoundryImportWorkflow(options, runtime = {}) {
10
+ const paths = resolveImportPaths(options, runtimeCwd(runtime));
11
+ const io = runtimeIo(runtime);
12
+ const emit = runtimeEmitter(runtime);
13
+ emit({ inputPath: paths.inputPath, type: "read" });
14
+ const conversion = convertInput(await readInputJson(paths.inputPath, io.readFile), paths.inputPath);
15
+ const counts = summarizeConversion(conversion);
16
+ const diagnostics = summarizeDiagnostics(conversion.diagnostics);
17
+ emit({ counts, diagnostics, type: "converted" });
18
+ await io.mkdir(paths.outputDir, { recursive: true });
19
+ const files = await writeEmittedFiles(conversion, paths.outputDir, paths.ontologyName, io, (file) => emit({ file, type: "write-file" }));
20
+ const validation = await maybeValidateImport(options, paths.outputDir, files);
21
+ if (validation) {
22
+ emit({ type: "validated", validation });
23
+ }
24
+ return {
25
+ counts,
26
+ diagnostics,
27
+ files,
28
+ inputPath: paths.inputPath,
29
+ ontologyName: paths.ontologyName,
30
+ outputDir: paths.outputDir,
31
+ validation,
32
+ };
33
+ }
34
+ function runtimeCwd(runtime) {
35
+ return runtime.cwd ?? process.cwd();
36
+ }
37
+ function runtimeIo(runtime) {
38
+ return {
39
+ mkdir: runtime.mkdir ?? mkdir,
40
+ readFile: runtime.readFile ?? readFile,
41
+ writeFile: runtime.writeFile ?? writeFile,
42
+ };
43
+ }
44
+ function runtimeEmitter(runtime) {
45
+ return runtime.onEvent ?? (() => undefined);
46
+ }
47
+ function resolveImportPaths(options, cwd) {
48
+ const input = options.input?.trim();
49
+ if (!input) {
50
+ throw new CliUserError("missing_input", "Pass --input with a Foundry ontology export JSON file.");
51
+ }
52
+ const inputPath = resolve(cwd, input);
53
+ const ontologyName = options.ontologyName?.trim() || basename(inputPath, ".json");
54
+ const outputDir = resolve(cwd, options.outputDir ?? join(DEFAULT_FOUNDRY_IMPORT_OUTPUT_ROOT, ontologyName));
55
+ return { inputPath, ontologyName, outputDir };
56
+ }
57
+ async function readInputJson(inputPath, readFileImpl) {
58
+ try {
59
+ return JSON.parse(await readFileImpl(inputPath, "utf-8"));
60
+ }
61
+ catch (error) {
62
+ throw readError(inputPath, error);
63
+ }
64
+ }
65
+ function readError(inputPath, error) {
66
+ if (error instanceof SyntaxError) {
67
+ return new CliUserError("invalid_json", `Could not parse Foundry export JSON at ${inputPath}: ${formatErrorMessage(error)}`);
68
+ }
69
+ return new CliUserError("read_failed", `Could not read Foundry export JSON at ${inputPath}: ${formatErrorMessage(error)}`);
70
+ }
71
+ function convertInput(input, inputPath) {
72
+ try {
73
+ return convertFoundryV2Export(input);
74
+ }
75
+ catch (error) {
76
+ throw new CliUserError("invalid_export", `Could not convert Foundry export at ${inputPath}: ${formatErrorMessage(error)}`);
77
+ }
78
+ }
79
+ async function writeEmittedFiles(conversion, outputDir, ontologyName, io, onWriteFile) {
80
+ const files = [];
81
+ for (const file of emitFoundryImportFiles(conversion, { ontologyName })) {
82
+ const writtenFile = await writeEmittedFile(file, outputDir, io);
83
+ files.push(writtenFile);
84
+ onWriteFile(writtenFile);
85
+ }
86
+ return files;
87
+ }
88
+ async function writeEmittedFile(file, outputDir, io) {
89
+ const fullPath = join(outputDir, file.path);
90
+ await io.mkdir(dirname(fullPath), { recursive: true });
91
+ await io.writeFile(fullPath, file.content, "utf-8");
92
+ return { path: fullPath, relativePath: file.path };
93
+ }
94
+ async function maybeValidateImport(options, outputDir, files) {
95
+ if (!options.validate) {
96
+ return undefined;
97
+ }
98
+ try {
99
+ return await validateFoundryImportOutput({ files, outputDir });
100
+ }
101
+ catch (error) {
102
+ throw new CliUserError("validation_failed", `Generated OAC failed upstream @osdk/maker validation: ${formatErrorMessage(error)}`);
103
+ }
104
+ }
@@ -0,0 +1,3 @@
1
+ export type { FoundryImportEvent, FoundryImportResult, } from "./foundry-import/types.js";
2
+ export { runFoundryImportWorkflow } from "./foundry-import/workflow.js";
3
+ //# sourceMappingURL=foundry-import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foundry-import.d.ts","sourceRoot":"","sources":["../src/foundry-import.ts"],"names":[],"mappings":"AAAA,YAAY,EACX,kBAAkB,EAClB,mBAAmB,GACnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1 @@
1
+ export { runFoundryImportWorkflow } from "./foundry-import/workflow.js";
@@ -121,7 +121,68 @@
121
121
  "commands",
122
122
  "guided.js"
123
123
  ]
124
+ },
125
+ "foundry:import": {
126
+ "aliases": [],
127
+ "args": {},
128
+ "description": "Convert a Foundry ontology export JSON into best-effort Ontology-as-Code source.",
129
+ "examples": [
130
+ "<%= config.bin %> foundry import --input ontology.json --output ./oac",
131
+ "<%= config.bin %> foundry import --input ontology.json --ontology-name devcon --json"
132
+ ],
133
+ "flags": {
134
+ "input": {
135
+ "description": "Foundry ontology export JSON file.",
136
+ "env": "PRISMANTIX_FOUNDRY_EXPORT",
137
+ "name": "input",
138
+ "hasDynamicHelp": false,
139
+ "multiple": false,
140
+ "type": "option"
141
+ },
142
+ "json": {
143
+ "description": "Print machine-readable JSON to stdout.",
144
+ "name": "json",
145
+ "allowNo": false,
146
+ "type": "boolean"
147
+ },
148
+ "ontology-name": {
149
+ "description": "Name to write into generated source file headers.",
150
+ "name": "ontology-name",
151
+ "hasDynamicHelp": false,
152
+ "multiple": false,
153
+ "type": "option"
154
+ },
155
+ "output": {
156
+ "description": "Output directory.",
157
+ "env": "PRISMANTIX_OUTPUT_DIR",
158
+ "name": "output",
159
+ "hasDynamicHelp": false,
160
+ "multiple": false,
161
+ "type": "option"
162
+ },
163
+ "validate": {
164
+ "description": "Compile generated source and run upstream @osdk/maker OntologyIr conversion.",
165
+ "name": "validate",
166
+ "allowNo": false,
167
+ "type": "boolean"
168
+ }
169
+ },
170
+ "hasDynamicHelp": false,
171
+ "hiddenAliases": [],
172
+ "id": "foundry:import",
173
+ "pluginAlias": "@nyrra/prismantix-cli",
174
+ "pluginName": "@nyrra/prismantix-cli",
175
+ "pluginType": "core",
176
+ "strict": true,
177
+ "enableJsonFlag": false,
178
+ "isESM": true,
179
+ "relativePath": [
180
+ "dist",
181
+ "commands",
182
+ "foundry",
183
+ "import.js"
184
+ ]
124
185
  }
125
186
  },
126
- "version": "0.0.4-next.20"
187
+ "version": "0.0.4-next.22"
127
188
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nyrra/prismantix-cli",
3
3
  "description": "PrismantiX API client CLI.",
4
- "version": "0.0.4-next.20",
4
+ "version": "0.0.4-next.22",
5
5
  "author": "NYRRA Inc.",
6
6
  "bin": {
7
7
  "prismantix-cli": "bin/run.js"
@@ -13,9 +13,11 @@
13
13
  "@inkjs/ui": "^2.0.0",
14
14
  "@oclif/core": "^4.11.4",
15
15
  "@oclif/plugin-help": "^6.2.49",
16
+ "@osdk/maker": "0.44.0",
16
17
  "ink": "^7.0.4",
17
18
  "react": "19.2.6",
18
19
  "react-devtools-core": "^6.1.2",
20
+ "typescript": "^5.9.3",
19
21
  "zod": "^4.2.1"
20
22
  },
21
23
  "devDependencies": {
@@ -23,8 +25,7 @@
23
25
  "@types/node": "^25.9.1",
24
26
  "ink-testing-library": "^4.0.0",
25
27
  "oclif": "^4.23.8",
26
- "shx": "^0.3.3",
27
- "typescript": "^5"
28
+ "shx": "^0.3.3"
28
29
  },
29
30
  "engines": {
30
31
  "node": ">=22.0.0"
@@ -39,6 +40,8 @@
39
40
  "keywords": [
40
41
  "prismantix",
41
42
  "export",
43
+ "foundry",
44
+ "ontology",
42
45
  "api",
43
46
  "cli"
44
47
  ],