@oml/cli 0.12.0 → 0.14.0
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.
- package/README.md +29 -21
- package/out/{auth.d.ts → auth/auth.d.ts} +7 -0
- package/out/{auth.js → auth/auth.js} +42 -3
- package/out/auth/auth.js.map +1 -0
- package/out/{platform-constants.js → auth/constants.js} +1 -1
- package/out/auth/constants.js.map +1 -0
- package/out/{platform.d.ts → auth/platform.d.ts} +5 -7
- package/out/{platform.js → auth/platform.js} +39 -17
- package/out/auth/platform.js.map +1 -0
- package/out/cli.d.ts +6 -0
- package/out/cli.js +214 -59
- package/out/cli.js.map +1 -1
- package/out/commands/export.d.ts +8 -0
- package/out/commands/export.js +27 -0
- package/out/commands/export.js.map +1 -0
- package/out/commands/lint.d.ts +22 -2
- package/out/commands/lint.js +64 -18
- package/out/commands/lint.js.map +1 -1
- package/out/commands/reason.d.ts +2 -9
- package/out/commands/reason.js +52 -48
- package/out/commands/reason.js.map +1 -1
- package/out/commands/render.d.ts +1 -9
- package/out/commands/render.js +15 -726
- package/out/commands/render.js.map +1 -1
- package/out/commands/server/actions.d.ts +22 -0
- package/out/commands/server/actions.js +394 -0
- package/out/commands/server/actions.js.map +1 -0
- package/out/commands/server/require.d.ts +1 -0
- package/out/commands/server/require.js +89 -0
- package/out/commands/server/require.js.map +1 -0
- package/out/commands/server/rest.d.ts +2 -0
- package/out/commands/server/rest.js +117 -0
- package/out/commands/server/rest.js.map +1 -0
- package/out/commands/validate.d.ts +3 -3
- package/out/commands/validate.js +35 -171
- package/out/commands/validate.js.map +1 -1
- package/package.json +5 -7
- package/src/{auth.ts → auth/auth.ts} +54 -3
- package/src/{platform.ts → auth/platform.ts} +41 -17
- package/src/cli.ts +249 -59
- package/src/commands/export.ts +54 -0
- package/src/commands/lint.ts +88 -18
- package/src/commands/reason.ts +69 -56
- package/src/commands/render.ts +23 -995
- package/src/commands/server/actions.ts +480 -0
- package/src/commands/server/require.ts +99 -0
- package/src/commands/server/rest.ts +135 -0
- package/src/commands/validate.ts +46 -207
- package/out/auth.js.map +0 -1
- package/out/backend/backend-types.d.ts +0 -21
- package/out/backend/backend-types.js +0 -3
- package/out/backend/backend-types.js.map +0 -1
- package/out/backend/create-backend.d.ts +0 -2
- package/out/backend/create-backend.js +0 -6
- package/out/backend/create-backend.js.map +0 -1
- package/out/backend/direct-backend.d.ts +0 -20
- package/out/backend/direct-backend.js +0 -150
- package/out/backend/direct-backend.js.map +0 -1
- package/out/backend/reasoned-output.d.ts +0 -38
- package/out/backend/reasoned-output.js +0 -568
- package/out/backend/reasoned-output.js.map +0 -1
- package/out/commands/closure.d.ts +0 -33
- package/out/commands/closure.js +0 -537
- package/out/commands/closure.js.map +0 -1
- package/out/commands/compile.d.ts +0 -11
- package/out/commands/compile.js +0 -63
- package/out/commands/compile.js.map +0 -1
- package/out/platform-constants.js.map +0 -1
- package/out/platform.js.map +0 -1
- package/src/backend/backend-types.ts +0 -27
- package/src/backend/create-backend.ts +0 -8
- package/src/backend/direct-backend.ts +0 -169
- package/src/backend/reasoned-output.ts +0 -697
- package/src/commands/closure.ts +0 -624
- package/src/commands/compile.ts +0 -88
- /package/out/{platform-constants.d.ts → auth/constants.d.ts} +0 -0
- /package/src/{platform-constants.ts → auth/constants.ts} +0 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// Copyright (c) 2026 Modelware. All rights reserved.
|
|
2
|
+
|
|
3
|
+
import * as fs from 'node:fs/promises';
|
|
4
|
+
import * as os from 'node:os';
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
import { createHash } from 'node:crypto';
|
|
7
|
+
|
|
8
|
+
const DEFAULT_HOST = '127.0.0.1';
|
|
9
|
+
|
|
10
|
+
type ServerState = {
|
|
11
|
+
pid: number;
|
|
12
|
+
port: number;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
type Envelope<T> = {
|
|
16
|
+
ok?: boolean;
|
|
17
|
+
result?: T;
|
|
18
|
+
error?: string;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
function workspaceHash(workspaceRoot: string): string {
|
|
22
|
+
return createHash('sha256').update(path.resolve(workspaceRoot)).digest('hex');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function serverLockFileForWorkspace(workspaceRoot: string): string {
|
|
26
|
+
return path.join(os.homedir(), '.oml', 'workspaces', workspaceHash(workspaceRoot), 'server.lock');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function isProcessAlive(pid: number): boolean {
|
|
30
|
+
try {
|
|
31
|
+
process.kill(pid, 0);
|
|
32
|
+
return true;
|
|
33
|
+
} catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function parseServerState(raw: string): ServerState | undefined {
|
|
39
|
+
try {
|
|
40
|
+
const parsed = JSON.parse(raw) as { pid?: unknown; port?: unknown };
|
|
41
|
+
const pid = Number(parsed.pid);
|
|
42
|
+
const port = Number(parsed.port);
|
|
43
|
+
if (!Number.isFinite(pid) || !Number.isFinite(port)) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
const pidInt = Math.trunc(pid);
|
|
47
|
+
const portInt = Math.trunc(port);
|
|
48
|
+
if (pidInt <= 0 || portInt <= 0 || portInt > 65535) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
return { pid: pidInt, port: portInt };
|
|
52
|
+
} catch {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async function readRunningState(workspaceRoot = process.cwd()): Promise<ServerState | undefined> {
|
|
58
|
+
const lockFile = serverLockFileForWorkspace(path.resolve(workspaceRoot));
|
|
59
|
+
try {
|
|
60
|
+
const raw = (await fs.readFile(lockFile, 'utf-8')).trim();
|
|
61
|
+
if (!raw) {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
const state = parseServerState(raw);
|
|
65
|
+
if (!state || !isProcessAlive(state.pid)) {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
return state;
|
|
69
|
+
} catch {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function createHeaders(token: string | undefined): Headers {
|
|
75
|
+
const headers = new Headers();
|
|
76
|
+
headers.set('content-type', 'application/json');
|
|
77
|
+
if (token && token.trim().length > 0) {
|
|
78
|
+
headers.set('authorization', `Bearer ${token.trim()}`);
|
|
79
|
+
}
|
|
80
|
+
return headers;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function ensureServerBaseUrl(state: ServerState | undefined): string {
|
|
84
|
+
if (!state) {
|
|
85
|
+
throw new Error('start server first');
|
|
86
|
+
}
|
|
87
|
+
return `http://${DEFAULT_HOST}:${state.port}`;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async function parseJsonResponse<T>(response: Response): Promise<T> {
|
|
91
|
+
const text = await response.text();
|
|
92
|
+
if (!text.trim()) {
|
|
93
|
+
throw new Error(`Server returned HTTP ${response.status} ${response.statusText} with empty response body.`);
|
|
94
|
+
}
|
|
95
|
+
try {
|
|
96
|
+
return JSON.parse(text) as T;
|
|
97
|
+
} catch {
|
|
98
|
+
throw new Error(`Server returned HTTP ${response.status} ${response.statusText} with invalid JSON response.`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export async function restGet<T>(route: string, authToken?: string): Promise<T> {
|
|
103
|
+
const baseUrl = ensureServerBaseUrl(await readRunningState());
|
|
104
|
+
const response = await fetch(`${baseUrl}${route}`, {
|
|
105
|
+
method: 'GET',
|
|
106
|
+
headers: createHeaders(authToken),
|
|
107
|
+
});
|
|
108
|
+
const payload = await parseJsonResponse<T & { error?: string }>(response);
|
|
109
|
+
if (!response.ok) {
|
|
110
|
+
const message = (payload as { error?: string }).error;
|
|
111
|
+
throw new Error(message && message.trim().length > 0 ? message : `Server request failed: GET ${route} (${response.status}).`);
|
|
112
|
+
}
|
|
113
|
+
return payload;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export async function restPost<T>(route: string, body: Record<string, unknown>, authToken?: string): Promise<T> {
|
|
117
|
+
const baseUrl = ensureServerBaseUrl(await readRunningState());
|
|
118
|
+
const response = await fetch(`${baseUrl}${route}`, {
|
|
119
|
+
method: 'POST',
|
|
120
|
+
headers: createHeaders(authToken),
|
|
121
|
+
body: JSON.stringify(body),
|
|
122
|
+
});
|
|
123
|
+
const payload = await parseJsonResponse<Envelope<T> & { error?: string }>(response);
|
|
124
|
+
if (!response.ok) {
|
|
125
|
+
const message = payload.error;
|
|
126
|
+
throw new Error(message && message.trim().length > 0 ? message : `Server request failed: POST ${route} (${response.status}).`);
|
|
127
|
+
}
|
|
128
|
+
if (payload.ok === false) {
|
|
129
|
+
throw new Error(payload.error?.trim() || `Server request failed: POST ${route}.`);
|
|
130
|
+
}
|
|
131
|
+
if (payload.result === undefined) {
|
|
132
|
+
throw new Error(`Server request failed: POST ${route} did not return a result.`);
|
|
133
|
+
}
|
|
134
|
+
return payload.result;
|
|
135
|
+
}
|
package/src/commands/validate.ts
CHANGED
|
@@ -1,226 +1,65 @@
|
|
|
1
1
|
// Copyright (c) 2026 Modelware. All rights reserved.
|
|
2
2
|
|
|
3
|
-
import { normalizeNamespace } from '@oml/language';
|
|
4
|
-
import { createDefaultShaclService, createOwlServices, type ShaclValidationIssue } from '@oml/owl';
|
|
5
|
-
import { MarkdownPreviewRuntime, MarkdownHandlerRegistry } from '@oml/markdown';
|
|
6
3
|
import chalk from 'chalk';
|
|
7
|
-
import { URI } from 'langium';
|
|
8
|
-
import { NodeFileSystem } from 'langium/node';
|
|
9
|
-
import * as fs from 'node:fs/promises';
|
|
10
|
-
import * as path from 'node:path';
|
|
11
|
-
import * as url from 'node:url';
|
|
12
|
-
import { loadPreparedDatasetFromOutput, normalizeFormatExtension } from '../backend/reasoned-output.js';
|
|
13
4
|
import { failCli } from '../cli-error.js';
|
|
14
5
|
import { formatDuration } from '../util.js';
|
|
15
|
-
import
|
|
16
|
-
import {
|
|
17
|
-
import { resolveCompileOutputRoot, resolveCompileWorkspaceRoot } from './compile.js';
|
|
6
|
+
import { restPost } from './server/rest.js';
|
|
7
|
+
import { formatLintSummary, printLintDiagnostics, type LintPayload } from './lint.js';
|
|
18
8
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
md: string;
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
type MarkdownValidationResult = {
|
|
26
|
-
markdownFile: string;
|
|
27
|
-
blockId: string;
|
|
28
|
-
lineStart: number;
|
|
29
|
-
lineEnd: number;
|
|
30
|
-
contextModelUri?: string;
|
|
31
|
-
conforms: boolean;
|
|
32
|
-
issues: ShaclValidationIssue[];
|
|
33
|
-
error?: string;
|
|
9
|
+
export type ValidateOptions = {
|
|
10
|
+
only?: boolean;
|
|
11
|
+
authToken?: string;
|
|
34
12
|
};
|
|
35
13
|
|
|
36
14
|
export const validateAction = async (opts: ValidateOptions): Promise<void> => {
|
|
37
|
-
const
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const servicesBundle = createOwlServices(NodeFileSystem);
|
|
63
|
-
await servicesBundle.Oml.shared.workspace.WorkspaceManager.initializeWorkspace([
|
|
64
|
-
{ uri: URI.file(workspaceRoot).toString(), name: path.basename(workspaceRoot) }
|
|
65
|
-
]);
|
|
66
|
-
const preparedDataset = await loadPreparedDatasetFromOutput(workspaceRoot, owlOutputRoot, rdfFormat);
|
|
67
|
-
servicesBundle.Oml.reasoning.ReasoningService.loadPreparedDataset(preparedDataset);
|
|
68
|
-
const shaclService = createDefaultShaclService(
|
|
69
|
-
servicesBundle.Oml.reasoning.ReasoningService.getSparqlService(),
|
|
70
|
-
(modelUri) => servicesBundle.Oml.reasoning.ReasoningService.ensureQueryContext(modelUri),
|
|
71
|
-
(modelUri) => servicesBundle.Oml.reasoning.ReasoningService.getContextIri(modelUri),
|
|
72
|
-
);
|
|
73
|
-
|
|
74
|
-
const validationStartedAt = Date.now();
|
|
75
|
-
const markdownFiles = await discoverMarkdownFiles(markdownRoot);
|
|
76
|
-
const results: MarkdownValidationResult[] = [];
|
|
77
|
-
for (const markdownFile of markdownFiles) {
|
|
78
|
-
const markdown = await fs.readFile(markdownFile, 'utf-8');
|
|
79
|
-
const prepared = markdownRuntime.prepare(markdown);
|
|
80
|
-
const contextModelUri = resolveContextModelUri(markdownFile, prepared.contextUri, workspaceRoot);
|
|
81
|
-
for (const block of prepared.codeBlocks) {
|
|
82
|
-
if (block.language !== 'table-editor') {
|
|
83
|
-
continue;
|
|
15
|
+
const startedAt = Date.now();
|
|
16
|
+
const result = await restPost<{
|
|
17
|
+
success: boolean;
|
|
18
|
+
filesChecked: number;
|
|
19
|
+
errors: number;
|
|
20
|
+
warnings: number;
|
|
21
|
+
elapsedMs?: number;
|
|
22
|
+
lint?: LintPayload;
|
|
23
|
+
error?: string;
|
|
24
|
+
}>('/v0/validate', {
|
|
25
|
+
only: opts.only === true,
|
|
26
|
+
}, opts.authToken);
|
|
27
|
+
|
|
28
|
+
if (result.lint) {
|
|
29
|
+
const lint = result.lint;
|
|
30
|
+
if (lint.filesChecked <= 0) {
|
|
31
|
+
console.log(chalk.yellow('No .oml files found in server workspace.'));
|
|
32
|
+
} else {
|
|
33
|
+
printLintDiagnostics(lint);
|
|
34
|
+
const lintElapsedMs = typeof lint.elapsedMs === 'number' && Number.isFinite(lint.elapsedMs) && lint.elapsedMs >= 0
|
|
35
|
+
? lint.elapsedMs
|
|
36
|
+
: Date.now() - startedAt;
|
|
37
|
+
const lintSummary = formatLintSummary(lint, lintElapsedMs);
|
|
38
|
+
if (lint.errors > 0) {
|
|
39
|
+
failCli(chalk.red(lintSummary));
|
|
84
40
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
markdownFile,
|
|
88
|
-
blockId: block.id,
|
|
89
|
-
lineStart: block.lineStart,
|
|
90
|
-
lineEnd: block.lineEnd,
|
|
91
|
-
contextModelUri,
|
|
92
|
-
conforms: validation.conforms,
|
|
93
|
-
issues: validation.issues,
|
|
94
|
-
error: validation.error,
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
reportValidationResults(results, workspaceRoot, markdownRoot, validationStartedAt);
|
|
100
|
-
if (results.some((result) => result.error || result.issues.length > 0 || !result.conforms)) {
|
|
101
|
-
failCli('');
|
|
102
|
-
}
|
|
103
|
-
};
|
|
104
|
-
|
|
105
|
-
async function discoverMarkdownFiles(root: string): Promise<string[]> {
|
|
106
|
-
const entries = await fs.readdir(root, { withFileTypes: true });
|
|
107
|
-
const markdownFiles: string[] = [];
|
|
108
|
-
for (const entry of entries) {
|
|
109
|
-
const fullPath = path.join(root, entry.name);
|
|
110
|
-
if (entry.isDirectory()) {
|
|
111
|
-
if (entry.name === 'node_modules' || entry.name.startsWith('.')) {
|
|
112
|
-
continue;
|
|
41
|
+
if (lint.warnings > 0) {
|
|
42
|
+
failCli(chalk.yellow(lintSummary));
|
|
113
43
|
}
|
|
114
|
-
|
|
115
|
-
continue;
|
|
116
|
-
}
|
|
117
|
-
if (entry.isFile() && entry.name.toLowerCase().endsWith('.md')) {
|
|
118
|
-
markdownFiles.push(fullPath);
|
|
44
|
+
console.log(chalk.green(lintSummary));
|
|
119
45
|
}
|
|
120
46
|
}
|
|
121
|
-
return markdownFiles.sort();
|
|
122
|
-
}
|
|
123
47
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
return undefined;
|
|
127
|
-
}
|
|
128
|
-
const trimmed = contextUri.trim();
|
|
129
|
-
if (!trimmed) {
|
|
130
|
-
return undefined;
|
|
131
|
-
}
|
|
132
|
-
if (trimmed.startsWith('workspace:/')) {
|
|
133
|
-
const resolved = resolveWorkspacePath(workspaceRoot, trimmed);
|
|
134
|
-
return resolved ? url.pathToFileURL(resolved).toString() : undefined;
|
|
135
|
-
}
|
|
136
|
-
if (/^[a-z][a-z0-9+.-]*:/i.test(trimmed)) {
|
|
137
|
-
return trimmed;
|
|
48
|
+
if (!result.success) {
|
|
49
|
+
failCli(chalk.red(result.error?.trim() || 'validate failed.'));
|
|
138
50
|
}
|
|
139
|
-
if (
|
|
140
|
-
|
|
141
|
-
}
|
|
142
|
-
return url.pathToFileURL(path.resolve(path.dirname(documentFile), trimmed)).toString();
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
function resolveWorkspacePath(workspaceRoot: string, href: string): string | undefined {
|
|
146
|
-
const trimmed = href.trim();
|
|
147
|
-
if (!trimmed.startsWith('workspace:/')) {
|
|
148
|
-
return undefined;
|
|
149
|
-
}
|
|
150
|
-
return path.resolve(workspaceRoot, trimmed.slice('workspace:/'.length));
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
function reportValidationResults(
|
|
154
|
-
results: ReadonlyArray<MarkdownValidationResult>,
|
|
155
|
-
workspaceRoot: string,
|
|
156
|
-
markdownRoot: string,
|
|
157
|
-
startedAt: number
|
|
158
|
-
): void {
|
|
159
|
-
if (results.length === 0) {
|
|
160
|
-
console.log(chalk.yellow(`No table-editor blocks found under ${path.relative(workspaceRoot, markdownRoot) || markdownRoot}.`));
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
let issueCount = 0;
|
|
165
|
-
let errorCount = 0;
|
|
166
|
-
let failingBlockCount = 0;
|
|
167
|
-
for (const result of results) {
|
|
168
|
-
const relativeFile = path.relative(markdownRoot, result.markdownFile) || path.basename(result.markdownFile);
|
|
169
|
-
const location = relativeFile;
|
|
170
|
-
if (result.error) {
|
|
171
|
-
failingBlockCount += 1;
|
|
172
|
-
errorCount += 1;
|
|
173
|
-
console.log(chalk.red(`Violation: ${location}: ${result.error}`));
|
|
174
|
-
continue;
|
|
175
|
-
}
|
|
176
|
-
const hasIssues = result.issues.length > 0 || !result.conforms;
|
|
177
|
-
if (!hasIssues) {
|
|
178
|
-
continue;
|
|
179
|
-
}
|
|
180
|
-
failingBlockCount += 1;
|
|
181
|
-
for (const issue of result.issues) {
|
|
182
|
-
issueCount += 1;
|
|
183
|
-
const elementLabel = issue.focusNode ? shortIri(issue.focusNode) : '-';
|
|
184
|
-
const propertyLabel = issue.propertyName ?? (issue.path ? shortIri(issue.path) : '-');
|
|
185
|
-
const severityLabel = shortIri(issue.severity || 'Violation');
|
|
186
|
-
console.log(chalk.red(`${severityLabel}: ${location} element=${elementLabel} property=${propertyLabel}: ${describeIssue(issue)}`));
|
|
187
|
-
}
|
|
188
|
-
if (!result.conforms && result.issues.length === 0) {
|
|
189
|
-
issueCount += 1;
|
|
190
|
-
console.log(chalk.red(`Violation: ${location}: SHACL validation failed without detailed issues.`));
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
const duration = formatDuration(Date.now() - startedAt);
|
|
195
|
-
const summary = `${results.length} table-editor block(s) scanned [${duration}]`;
|
|
196
|
-
if (issueCount === 0 && errorCount === 0) {
|
|
197
|
-
console.log(chalk.green(`validate: ${summary}`));
|
|
51
|
+
if (result.filesChecked === 0) {
|
|
52
|
+
console.log(chalk.yellow('No markdown/table-editor targets found in server workspace.'));
|
|
198
53
|
return;
|
|
199
54
|
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
const hashIndex = normalized.lastIndexOf('#');
|
|
206
|
-
if (hashIndex >= 0 && hashIndex < normalized.length - 1) {
|
|
207
|
-
return normalized.slice(hashIndex + 1);
|
|
55
|
+
const validateElapsedMs = typeof result.elapsedMs === 'number' && Number.isFinite(result.elapsedMs) && result.elapsedMs >= 0
|
|
56
|
+
? result.elapsedMs
|
|
57
|
+
: Date.now() - startedAt;
|
|
58
|
+
if (result.errors > 0) {
|
|
59
|
+
failCli(chalk.red(`validate: ${result.filesChecked} item(s) checked with ${result.errors} error(s) and ${result.warnings} warning(s). [${formatDuration(validateElapsedMs)}]`));
|
|
208
60
|
}
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
return normalized.slice(slashIndex + 1);
|
|
61
|
+
if (result.warnings > 0) {
|
|
62
|
+
failCli(chalk.yellow(`validate: ${result.filesChecked} item(s) checked with ${result.warnings} warning(s). [${formatDuration(validateElapsedMs)}]`));
|
|
212
63
|
}
|
|
213
|
-
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
function describeIssue(issue: ShaclValidationIssue): string {
|
|
217
|
-
const message = issue.message.trim();
|
|
218
|
-
if (message && message !== 'Validation issue.') {
|
|
219
|
-
return message;
|
|
220
|
-
}
|
|
221
|
-
const source = issue.source ? shortIri(issue.source) : undefined;
|
|
222
|
-
if (source) {
|
|
223
|
-
return source;
|
|
224
|
-
}
|
|
225
|
-
return 'Validation issue.';
|
|
226
|
-
}
|
|
64
|
+
console.log(chalk.green(`validate: ${result.filesChecked} item(s) checked. [${formatDuration(validateElapsedMs)}]`));
|
|
65
|
+
};
|
package/out/auth.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,qDAAqD;AAErD,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EACH,oBAAoB,EACpB,yBAAyB,EACzB,oBAAoB,EACvB,MAAM,yBAAyB,CAAC;AACjC,MAAM,sBAAsB,GAAG,sCAAsC,CAAC;AACtE,MAAM,gBAAgB,GAAG,6CAA6C,CAAC;AACvE,MAAM,eAAe,GAAG,6BAA6B,CAAC;AACtD,MAAM,wBAAwB,GAAG,sBAAsB,CAAC;AACxD,MAAM,gBAAgB,GAAG,sBAAsB,CAAC;AAChD,MAAM,gBAAgB,GAAG,kBAAkB,CAAC;AAC5C,MAAM,qBAAqB,GAAG,uBAAuB,CAAC;AAoBtD,MAAM,OAAO,iBAAiB;IAE1B,KAAK,CAAC,KAAK,CAAC,OAAqB;QAC7B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1C,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;QAC5B,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,KAAK,IAAI,gBAAgB,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,OAAO,QAAQ,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IACnF,CAAC;IAED,KAAK,CAAC,MAAM;QACR,MAAM,aAAa,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,MAAM;QACR,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,CAAC;QACpC,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAC9C,OAAO;QACX,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,aAAa,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,KAAK,CAAC,YAAY,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,KAAK,CAAC,eAAe,OAAO,CAAC,SAAS,IAAI,WAAW,EAAE,CAAC,CAAC;QACjE,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,CAAC,KAAK,IAAI,WAAW,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,KAAK,CAAC,SAAS,OAAO,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,KAAK,CAAC,iBAAiB,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,aAAqB;QAC3C,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,CAAC;QACpC,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,GAAG,aAAa,kDAAkD,CAAC,CAAC;QACxF,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc;QAChB,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,CAAC;QACpC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;QACpF,CAAC;QACD,OAAO,OAAO,CAAC,WAAW,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,kBAAkB;QACpB,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,CAAC;QACpC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,SAAS,CAAC;QACd,IAAI,CAAC;YACD,SAAS,GAAG,MAAM,0BAA0B,CACxC,kBAAkB,EAAE,EACpB,sBAAsB,EAAE,EACxB,OAAO,CAAC,YAAY,CACvB,CAAC;QACN,CAAC;QAAC,MAAM,CAAC;YACL,MAAM,IAAI,KAAK,CAAC,mGAAmG,CAAC,CAAC;QACzH,CAAC;QAED,MAAM,cAAc,GAAkB;YAClC,GAAG,OAAO;YACV,WAAW,EAAE,SAAS,CAAC,YAAY;YACnC,YAAY,EAAE,SAAS,CAAC,aAAa;YACrC,SAAS,EAAE,SAAS,CAAC,UAAU;YAC/B,SAAS,EAAE,SAAS,CAAC,UAAU;YAC/B,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK;SAC1C,CAAC;QAEF,MAAM,YAAY,CAAC,cAAc,CAAC,CAAC;QACnC,OAAO,cAAc,CAAC,WAAW,CAAC;IACtC,CAAC;IAEO,KAAK,CAAC,YAAY;QACtB,OAAO,sBAAsB,EAAE,CAAC;IACpC,CAAC;CACJ;AAED,KAAK,UAAU,WAAW;IACtB,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,OAAO,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA2B,CAAC;QAC3D,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrD,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACpB,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC9E,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,OAAO;YACH,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;YACzB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,UAAU,EAAE,IAAI,CAAC,UAAU;SAC9B,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,SAAS,CAAC;IACrB,CAAC;AACL,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,OAAsB;IAC9C,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACtF,CAAC;AAED,KAAK,UAAU,aAAa;IACxB,IAAI,CAAC;QACD,MAAM,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;AACL,CAAC;AAED,SAAS,cAAc;IACnB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;AACxD,CAAC;AAED,KAAK,UAAU,sBAAsB;IACjC,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QAC/B,SAAS,EAAE,QAAQ;QACnB,KAAK,EAAE,sBAAsB;KAChC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,sBAAsB,EAAE;QACjD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACL,MAAM,EAAE,kBAAkB;YAC1B,cAAc,EAAE,mCAAmC;SACtD;QACD,IAAI,EAAE,MAAM;KACf,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,4CAA4C,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAC1G,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA8B,CAAC;IACjE,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC5E,CAAC;IAED,2BAA2B,CAAC,QAAQ,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IACjF,MAAM,KAAK,GAAG,MAAM,wBAAwB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,eAAe,EAAE;QAC9C,OAAO,EAAE;YACL,MAAM,EAAE,6BAA6B;YACrC,aAAa,EAAE,UAAU,KAAK,EAAE;SACnC;KACJ,CAAC,CAAC;IACH,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,mCAAmC,YAAY,CAAC,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,CAAC,CAAC;IACzG,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,EAAwB,CAAC;IAC7D,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,eAAe,GAAG,MAAM,mBAAmB,CAAC,iBAAiB,EAAE,EAAE,KAAK,CAAC,CAAC;IAE9E,OAAO;QACH,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,eAAe,CAAC,OAAO;QAC/B,SAAS,EAAE,IAAI,CAAC,KAAK;QACrB,KAAK,EAAE,eAAe,CAAC,KAAK;QAC5B,IAAI,EAAE,eAAe,CAAC,IAAI;QAC1B,WAAW,EAAE,eAAe,CAAC,YAAY;QACzC,YAAY,EAAE,eAAe,CAAC,aAAa;QAC3C,SAAS,EAAE,eAAe,CAAC,UAAU;QACrC,SAAS,EAAE,eAAe,CAAC,UAAU;QACrC,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACvC,CAAC;AACN,CAAC;AAED,SAAS,2BAA2B,CAAC,YAAoB,EAAE,eAAuB,EAAE,QAAgB;IAChG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,oBAAoB,CAAC,CAAC,CAAC;IAC/D,OAAO,CAAC,KAAK,CAAC,SAAS,eAAe,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,KAAK,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,QAAgB,EAAE,MAAgC;IACtF,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;IACtC,IAAI,CAAC,UAAU,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;IACxD,OAAO,IAAI,EAAE,CAAC;QACV,MAAM,KAAK,CAAC,eAAe,GAAG,IAAK,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YAC/B,SAAS,EAAE,QAAQ;YACnB,WAAW,EAAE,UAAU;YACvB,UAAU,EAAE,8CAA8C;SAC7D,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,gBAAgB,EAAE;YAC3C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACL,MAAM,EAAE,kBAAkB;gBAC1B,cAAc,EAAE,mCAAmC;aACtD;YACD,IAAI,EAAE,MAAM;SACf,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,sCAAsC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACpG,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAyB,CAAC;QAC3D,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YACrB,OAAO,KAAK,CAAC,YAAY,CAAC;QAC9B,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,KAAK,uBAAuB,EAAE,CAAC;YAC1C,SAAS;QACb,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YAC9B,eAAe,IAAI,CAAC,CAAC;YACrB,SAAS;QACb,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,KAAK,eAAe,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAClF,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,KAAK,eAAe,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAClD,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,IAAI,wBAAwB,CAAC,CAAC;IACxF,CAAC;AACL,CAAC;AAED,SAAS,eAAe;IACpB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,IAAI,EAAE,IAAI,wBAAwB,CAAC;IAC7F,IAAI,UAAU,EAAE,CAAC;QACb,OAAO,UAAU,CAAC;IACtB,CAAC;IACD,MAAM,IAAI,KAAK,CACX,8HAA8H,CACjI,CAAC;AACN,CAAC;AAED,SAAS,iBAAiB;IACtB,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,IAAI,oBAAoB,CAAC;AACzE,CAAC;AAED,SAAS,kBAAkB;IACvB,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,IAAI,oBAAoB,CAAC;AACzE,CAAC;AAED,SAAS,sBAAsB;IAC3B,OAAO,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,IAAI,EAAE,IAAI,yBAAyB,CAAC;AACnF,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACrB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type { MdExecuteBlocksParams, MdExecuteBlocksResult } from '@oml/markdown';
|
|
2
|
-
export interface ValidateSummary {
|
|
3
|
-
filesChecked: number;
|
|
4
|
-
warnings: number;
|
|
5
|
-
}
|
|
6
|
-
export interface MarkdownRenderResult {
|
|
7
|
-
renderedHtml: string;
|
|
8
|
-
contextUri?: string;
|
|
9
|
-
}
|
|
10
|
-
export interface CliBackendOptions {
|
|
11
|
-
owlOutputRoot?: string;
|
|
12
|
-
rdfFormat?: string;
|
|
13
|
-
}
|
|
14
|
-
export interface CliBackend {
|
|
15
|
-
validate(fileName: string | undefined, workspaceRoot: string): Promise<ValidateSummary>;
|
|
16
|
-
renderMarkdown(markdown: string): Promise<MarkdownRenderResult>;
|
|
17
|
-
executeMarkdownBlocks(params: MdExecuteBlocksParams, workspaceRoot: string): Promise<MdExecuteBlocksResult>;
|
|
18
|
-
getContextMemberLabelSnapshot(modelUri: string, workspaceRoot: string): Promise<Record<string, string>>;
|
|
19
|
-
getWorkspaceMemberLabelSnapshot(workspaceRoot: string): Promise<Record<string, string>>;
|
|
20
|
-
dispose(): Promise<void>;
|
|
21
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"backend-types.js","sourceRoot":"","sources":["../../src/backend/backend-types.ts"],"names":[],"mappings":"AAAA,qDAAqD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-backend.js","sourceRoot":"","sources":["../../src/backend/create-backend.ts"],"names":[],"mappings":"AAAA,qDAAqD;AAErD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,MAAM,UAAU,aAAa,CAAC,UAA6B,EAAE;IACzD,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { type MdExecuteBlocksParams, type MdExecuteBlocksResult } from '@oml/markdown';
|
|
2
|
-
import type { CliBackend, CliBackendOptions, MarkdownRenderResult, ValidateSummary } from './backend-types.js';
|
|
3
|
-
export declare class DirectBackend implements CliBackend {
|
|
4
|
-
private readonly markdownRuntime;
|
|
5
|
-
private readonly owlOutputRoot?;
|
|
6
|
-
private readonly rdfFormat;
|
|
7
|
-
private readonly contextLabelSnapshots;
|
|
8
|
-
private servicesBundle?;
|
|
9
|
-
private initializedWorkspaceRoot?;
|
|
10
|
-
private loadedDatasetKey?;
|
|
11
|
-
constructor(options?: CliBackendOptions);
|
|
12
|
-
validate(fileName: string | undefined, workspaceRoot: string): Promise<ValidateSummary>;
|
|
13
|
-
renderMarkdown(markdown: string): Promise<MarkdownRenderResult>;
|
|
14
|
-
executeMarkdownBlocks(params: MdExecuteBlocksParams, workspaceRoot: string): Promise<MdExecuteBlocksResult>;
|
|
15
|
-
getContextMemberLabelSnapshot(modelUri: string, workspaceRoot: string): Promise<Record<string, string>>;
|
|
16
|
-
getWorkspaceMemberLabelSnapshot(workspaceRoot: string): Promise<Record<string, string>>;
|
|
17
|
-
dispose(): Promise<void>;
|
|
18
|
-
private ensureServices;
|
|
19
|
-
private ensurePreparedDataset;
|
|
20
|
-
}
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
// Copyright (c) 2026 Modelware. All rights reserved.
|
|
2
|
-
import { createOwlServices } from '@oml/owl';
|
|
3
|
-
import { MarkdownHandlerRegistry, MarkdownPreviewRuntime } from '@oml/markdown';
|
|
4
|
-
import { MarkdownExecutor } from '@oml/markdown';
|
|
5
|
-
import { getOntologyModelIndex } from '@oml/language';
|
|
6
|
-
import { NodeFileSystem } from 'langium/node';
|
|
7
|
-
import { URI } from 'langium';
|
|
8
|
-
import * as fs from 'node:fs/promises';
|
|
9
|
-
import * as path from 'node:path';
|
|
10
|
-
import { extractDocument } from '../util.js';
|
|
11
|
-
import { loadPreparedDatasetFromOutput, normalizeFormatExtension } from './reasoned-output.js';
|
|
12
|
-
export class DirectBackend {
|
|
13
|
-
constructor(options = {}) {
|
|
14
|
-
this.markdownRuntime = new MarkdownPreviewRuntime(new MarkdownHandlerRegistry());
|
|
15
|
-
this.contextLabelSnapshots = new Map();
|
|
16
|
-
this.owlOutputRoot = options.owlOutputRoot ? path.resolve(options.owlOutputRoot) : undefined;
|
|
17
|
-
this.rdfFormat = normalizeFormatExtension(options.rdfFormat);
|
|
18
|
-
}
|
|
19
|
-
async validate(fileName, workspaceRoot) {
|
|
20
|
-
const services = await this.ensureServices(workspaceRoot);
|
|
21
|
-
if (fileName) {
|
|
22
|
-
const document = await extractDocument(fileName, services, undefined);
|
|
23
|
-
const warnings = (document.diagnostics ?? []).filter((d) => d.severity === 2).length;
|
|
24
|
-
return { filesChecked: 1, warnings };
|
|
25
|
-
}
|
|
26
|
-
const files = await findOmlFiles(workspaceRoot);
|
|
27
|
-
let warningCount = 0;
|
|
28
|
-
for (const file of files) {
|
|
29
|
-
const document = await extractDocument(file, services, undefined);
|
|
30
|
-
warningCount += (document.diagnostics ?? []).filter((d) => d.severity === 2).length;
|
|
31
|
-
}
|
|
32
|
-
return { filesChecked: files.length, warnings: warningCount };
|
|
33
|
-
}
|
|
34
|
-
async renderMarkdown(markdown) {
|
|
35
|
-
const rendered = this.markdownRuntime.prepare(markdown);
|
|
36
|
-
return {
|
|
37
|
-
renderedHtml: rendered.renderedHtml,
|
|
38
|
-
contextUri: rendered.contextUri
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
async executeMarkdownBlocks(params, workspaceRoot) {
|
|
42
|
-
const services = await this.ensureServices(workspaceRoot);
|
|
43
|
-
await this.ensurePreparedDataset(workspaceRoot, services);
|
|
44
|
-
const reasoningService = services.reasoning.ReasoningService;
|
|
45
|
-
const ontologyIndex = getOntologyModelIndex(services.shared);
|
|
46
|
-
const knownNamespaceCache = new Map();
|
|
47
|
-
const isKnownOntologyIriNamespace = (ontologyIri) => {
|
|
48
|
-
const normalized = ontologyIri.trim().replace(/[\/#]+$/, '');
|
|
49
|
-
if (!normalized) {
|
|
50
|
-
return false;
|
|
51
|
-
}
|
|
52
|
-
const cached = knownNamespaceCache.get(normalized);
|
|
53
|
-
if (cached !== undefined) {
|
|
54
|
-
return cached;
|
|
55
|
-
}
|
|
56
|
-
if (ontologyIndex.resolveModelUri(normalized)) {
|
|
57
|
-
knownNamespaceCache.set(normalized, true);
|
|
58
|
-
return true;
|
|
59
|
-
}
|
|
60
|
-
const exists = ontologyIndex.getDuplicateWorkspaceModelUris(normalized).length > 0;
|
|
61
|
-
knownNamespaceCache.set(normalized, exists);
|
|
62
|
-
return exists;
|
|
63
|
-
};
|
|
64
|
-
const executor = new MarkdownExecutor({
|
|
65
|
-
ensureContext: (modelUri) => reasoningService.ensureQueryContext(modelUri),
|
|
66
|
-
resolveContextIri: (modelUri) => reasoningService.getContextIri(modelUri),
|
|
67
|
-
query: (modelUri, sparql) => reasoningService.getSparqlService().query(modelUri, sparql),
|
|
68
|
-
construct: (modelUri, sparql) => reasoningService.getSparqlService().construct(modelUri, sparql),
|
|
69
|
-
isKnownOntologyIriNamespace,
|
|
70
|
-
});
|
|
71
|
-
return executor.executeBlocks(params);
|
|
72
|
-
}
|
|
73
|
-
async getContextMemberLabelSnapshot(modelUri, workspaceRoot) {
|
|
74
|
-
const resolvedModelUri = modelUri.trim();
|
|
75
|
-
if (!resolvedModelUri) {
|
|
76
|
-
return {};
|
|
77
|
-
}
|
|
78
|
-
const cached = this.contextLabelSnapshots.get(resolvedModelUri);
|
|
79
|
-
if (cached) {
|
|
80
|
-
return cached;
|
|
81
|
-
}
|
|
82
|
-
const services = await this.ensureServices(workspaceRoot);
|
|
83
|
-
await this.ensurePreparedDataset(workspaceRoot, services);
|
|
84
|
-
const reasoningService = services.reasoning.ReasoningService;
|
|
85
|
-
const snapshot = await reasoningService.getContextMemberLabelSnapshot(resolvedModelUri);
|
|
86
|
-
this.contextLabelSnapshots.set(resolvedModelUri, snapshot);
|
|
87
|
-
return snapshot;
|
|
88
|
-
}
|
|
89
|
-
async getWorkspaceMemberLabelSnapshot(workspaceRoot) {
|
|
90
|
-
const cacheKey = `workspace:${path.resolve(workspaceRoot)}`;
|
|
91
|
-
const cached = this.contextLabelSnapshots.get(cacheKey);
|
|
92
|
-
if (cached) {
|
|
93
|
-
return cached;
|
|
94
|
-
}
|
|
95
|
-
const services = await this.ensureServices(workspaceRoot);
|
|
96
|
-
await this.ensurePreparedDataset(workspaceRoot, services);
|
|
97
|
-
const reasoningService = services.reasoning.ReasoningService;
|
|
98
|
-
const snapshot = await reasoningService.getWorkspaceMemberLabelSnapshot();
|
|
99
|
-
this.contextLabelSnapshots.set(cacheKey, snapshot);
|
|
100
|
-
return snapshot;
|
|
101
|
-
}
|
|
102
|
-
async dispose() {
|
|
103
|
-
this.servicesBundle = undefined;
|
|
104
|
-
this.initializedWorkspaceRoot = undefined;
|
|
105
|
-
this.loadedDatasetKey = undefined;
|
|
106
|
-
this.contextLabelSnapshots.clear();
|
|
107
|
-
}
|
|
108
|
-
async ensureServices(workspaceRoot) {
|
|
109
|
-
const resolvedRoot = path.resolve(workspaceRoot);
|
|
110
|
-
if (!this.servicesBundle || this.initializedWorkspaceRoot !== resolvedRoot) {
|
|
111
|
-
this.servicesBundle = createOwlServices(NodeFileSystem);
|
|
112
|
-
this.initializedWorkspaceRoot = resolvedRoot;
|
|
113
|
-
this.contextLabelSnapshots.clear();
|
|
114
|
-
await this.servicesBundle.Oml.shared.workspace.WorkspaceManager.initializeWorkspace([
|
|
115
|
-
{ uri: URI.file(resolvedRoot).toString(), name: path.basename(resolvedRoot) }
|
|
116
|
-
]);
|
|
117
|
-
}
|
|
118
|
-
return this.servicesBundle.Oml;
|
|
119
|
-
}
|
|
120
|
-
async ensurePreparedDataset(workspaceRoot, services) {
|
|
121
|
-
if (!this.owlOutputRoot) {
|
|
122
|
-
throw new Error('CLI markdown execution requires a prepared RDF output folder.');
|
|
123
|
-
}
|
|
124
|
-
const datasetKey = `${this.initializedWorkspaceRoot ?? ''}|${this.owlOutputRoot}|${this.rdfFormat}`;
|
|
125
|
-
if (this.loadedDatasetKey === datasetKey) {
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
const prepared = await loadPreparedDatasetFromOutput(path.resolve(workspaceRoot), this.owlOutputRoot, this.rdfFormat);
|
|
129
|
-
services.reasoning.ReasoningService.loadPreparedDataset(prepared);
|
|
130
|
-
this.loadedDatasetKey = datasetKey;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
async function findOmlFiles(root) {
|
|
134
|
-
const entries = await fs.readdir(root, { withFileTypes: true });
|
|
135
|
-
const results = [];
|
|
136
|
-
for (const entry of entries) {
|
|
137
|
-
const fullPath = path.join(root, entry.name);
|
|
138
|
-
if (entry.isDirectory()) {
|
|
139
|
-
if (entry.name === 'node_modules' || entry.name.startsWith('.')) {
|
|
140
|
-
continue;
|
|
141
|
-
}
|
|
142
|
-
results.push(...await findOmlFiles(fullPath));
|
|
143
|
-
}
|
|
144
|
-
else if (entry.isFile() && path.extname(entry.name) === '.oml') {
|
|
145
|
-
results.push(fullPath);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
return results;
|
|
149
|
-
}
|
|
150
|
-
//# sourceMappingURL=direct-backend.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"direct-backend.js","sourceRoot":"","sources":["../../src/backend/direct-backend.ts"],"names":[],"mappings":"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"}
|