@tuprolog/arg2p-ui 0.0.0-stage → 0.1.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 +48 -2
- package/dist/components/arg2p-editor.d.ts +73 -0
- package/dist/components/arg2p-editor.js +244 -0
- package/dist/components/arg2p-editor.js.map +1 -0
- package/dist/components/arg2p-flags.d.ts +58 -0
- package/dist/components/arg2p-flags.js +358 -0
- package/dist/components/arg2p-flags.js.map +1 -0
- package/dist/components/arg2p-framework.d.ts +102 -0
- package/dist/components/arg2p-framework.js +513 -0
- package/dist/components/arg2p-framework.js.map +1 -0
- package/dist/components/arg2p-graph.d.ts +112 -0
- package/dist/components/arg2p-graph.js +577 -0
- package/dist/components/arg2p-graph.js.map +1 -0
- package/dist/components/arg2p-solutions.d.ts +75 -0
- package/dist/components/arg2p-solutions.js +391 -0
- package/dist/components/arg2p-solutions.js.map +1 -0
- package/dist/data.d.ts +9 -0
- package/dist/data.js +11 -0
- package/dist/data.js.map +1 -0
- package/dist/editor/language.d.ts +9 -0
- package/dist/editor/language.js +78 -0
- package/dist/editor/language.js.map +1 -0
- package/dist/engine.d.ts +94 -0
- package/dist/engine.js +2 -0
- package/dist/engine.js.map +1 -0
- package/dist/flags/schema.d.ts +50 -0
- package/dist/flags/schema.js +195 -0
- package/dist/flags/schema.js.map +1 -0
- package/dist/flags/text.d.ts +18 -0
- package/dist/flags/text.js +85 -0
- package/dist/flags/text.js.map +1 -0
- package/dist/formats/declarations.d.ts +9 -0
- package/dist/formats/declarations.js +193 -0
- package/dist/formats/declarations.js.map +1 -0
- package/dist/formats/frameworks.d.ts +23 -0
- package/dist/formats/frameworks.js +130 -0
- package/dist/formats/frameworks.js.map +1 -0
- package/dist/graph/canvas.d.ts +21 -0
- package/dist/graph/canvas.js +76 -0
- package/dist/graph/canvas.js.map +1 -0
- package/dist/graph/drawing.d.ts +24 -0
- package/dist/graph/drawing.js +64 -0
- package/dist/graph/drawing.js.map +1 -0
- package/dist/graph/layout.d.ts +28 -0
- package/dist/graph/layout.js +167 -0
- package/dist/graph/layout.js.map +1 -0
- package/dist/graph/levels.d.ts +6 -0
- package/dist/graph/levels.js +25 -0
- package/dist/graph/levels.js.map +1 -0
- package/dist/graph/positions.d.ts +24 -0
- package/dist/graph/positions.js +43 -0
- package/dist/graph/positions.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/js/engine.d.ts +35 -0
- package/dist/js/engine.js +110 -0
- package/dist/js/engine.js.map +1 -0
- package/dist/js/host.d.ts +75 -0
- package/dist/js/host.js +237 -0
- package/dist/js/host.js.map +1 -0
- package/dist/js/index.d.ts +2 -0
- package/dist/js/index.js +4 -0
- package/dist/js/index.js.map +1 -0
- package/dist/js/worker.d.ts +1 -0
- package/dist/js/worker.js +7 -0
- package/dist/js/worker.js.map +1 -0
- package/dist/theme.d.ts +5 -0
- package/dist/theme.js +48 -0
- package/dist/theme.js.map +1 -0
- package/package.json +65 -4
package/dist/js/host.js
ADDED
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { Arg2p, Flags, Value } from '@tuprolog/arg2p';
|
|
2
|
+
import { EMPTY_GRAPH } from '../engine.js';
|
|
3
|
+
import { FLAGS } from '../flags/schema.js';
|
|
4
|
+
const WARM_UP_THEORY = 'f1 :=> bird(tweety).\nr1 : bird(X) => flies(X).\nf2 :=> -flies(tweety).';
|
|
5
|
+
export function createHost(post) {
|
|
6
|
+
let current = null;
|
|
7
|
+
function handle(request) {
|
|
8
|
+
switch (request.type) {
|
|
9
|
+
case 'warmUp': return warmUp();
|
|
10
|
+
case 'solve': return solve(request);
|
|
11
|
+
case 'next': return next(request.id);
|
|
12
|
+
case 'graphAt': return graphAt(request);
|
|
13
|
+
case 'check': return post({ type: 'checked', reqId: request.reqId, problem: check(request.text, request.kind) });
|
|
14
|
+
case 'settings': return post({ type: 'settings', reqId: request.reqId, settings: settings(request.theory, request.flags) });
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
// The first evaluation is much slower than the next ones (code compiled and initialised on first use): done
|
|
18
|
+
// unseen, in the background
|
|
19
|
+
function warmUp() {
|
|
20
|
+
try {
|
|
21
|
+
Arg2p.of(WARM_UP_THEORY).answer('flies(tweety)');
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// only a warm-up
|
|
25
|
+
}
|
|
26
|
+
post({ type: 'warm' });
|
|
27
|
+
}
|
|
28
|
+
function solve({ id, theory, query, flags }) {
|
|
29
|
+
if (/^\s*$/.test(query)) {
|
|
30
|
+
current = null;
|
|
31
|
+
return post({ type: 'failed', id, error: { name: 'Query error', message: 'Query is a mandatory field.', syntax: null } });
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
// the flags and the theory are both read as the solver is built: the error tells which one it is about
|
|
35
|
+
let parsedFlags;
|
|
36
|
+
try {
|
|
37
|
+
parsedFlags = Flags.parse(flags);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
throw failure('Flags error', error, 'flags');
|
|
41
|
+
}
|
|
42
|
+
let solver;
|
|
43
|
+
try {
|
|
44
|
+
solver = Arg2p.builder().theory(theory).flags(parsedFlags).output(text => post({ type: 'output', id, text })).build();
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
throw failure('Theory error', error, 'theory');
|
|
48
|
+
}
|
|
49
|
+
const profile = profileOf(solver);
|
|
50
|
+
const written = query.trim().replace(/\.$/, '');
|
|
51
|
+
let solutions;
|
|
52
|
+
try {
|
|
53
|
+
solutions = solver.solve(written);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
throw failure('Query error', error, 'query');
|
|
57
|
+
}
|
|
58
|
+
current = { id, solver, solutions, profile };
|
|
59
|
+
post({ type: 'started', id, query: written });
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
current = null;
|
|
63
|
+
post({ type: 'failed', id, error: error });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// A solution, and whether there is another one (known only by looking for it)
|
|
67
|
+
function next(id) {
|
|
68
|
+
if (current === null || current.id !== id) {
|
|
69
|
+
return post({ type: 'failed', id, error: { name: 'Error', message: 'This query is no longer running.', syntax: null } });
|
|
70
|
+
}
|
|
71
|
+
let solution;
|
|
72
|
+
let hasNext = false;
|
|
73
|
+
try {
|
|
74
|
+
const found = current.solutions.next();
|
|
75
|
+
const { graph, branch } = currentGraph(current.solver, current.profile);
|
|
76
|
+
solution = {
|
|
77
|
+
result: found.isYes ? 'yes' : found.isNo ? 'no' : 'halt',
|
|
78
|
+
query: found.query,
|
|
79
|
+
bindings: found.variables.map(name => ({ name, value: found.text(name) ?? '' })),
|
|
80
|
+
error: found.error ?? null,
|
|
81
|
+
graph,
|
|
82
|
+
branch,
|
|
83
|
+
};
|
|
84
|
+
hasNext = current.solutions.hasNext();
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
solution = { result: 'halt', query: '', bindings: [], error: messageOf(error), graph: EMPTY_GRAPH, branch: 0 };
|
|
88
|
+
}
|
|
89
|
+
post({ type: 'solution', id, solution, hasNext });
|
|
90
|
+
}
|
|
91
|
+
function graphAt({ id, branch, reqId }) {
|
|
92
|
+
let graph = EMPTY_GRAPH;
|
|
93
|
+
try {
|
|
94
|
+
if (current !== null && current.id === id)
|
|
95
|
+
graph = graphData(current.solver.graphAt(branch), current.profile);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// a stage that cannot be read shows as empty
|
|
99
|
+
}
|
|
100
|
+
post({ type: 'graph', reqId, graph });
|
|
101
|
+
}
|
|
102
|
+
return { handle };
|
|
103
|
+
}
|
|
104
|
+
// The graph of the last stage of the last resolution: none without one (a plain Prolog goal builds no graph)
|
|
105
|
+
function currentGraph(solver, profile) {
|
|
106
|
+
try {
|
|
107
|
+
const branch = solver.activeBranch;
|
|
108
|
+
return { graph: graphData(solver.graphAt(branch), profile), branch };
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return { graph: EMPTY_GRAPH, branch: 0 };
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// The profile in effect for the theory of [solver] (the theory states it, or the flags, or it is the default), asked
|
|
115
|
+
// before the query, as the setting does not change the context of the solver (until the API gives it)
|
|
116
|
+
function profileOf(solver) {
|
|
117
|
+
try {
|
|
118
|
+
const found = solver.solve('setting(graphBuildMode, Profile)').next();
|
|
119
|
+
return found.isYes ? found.text('Profile') ?? '' : '';
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return '';
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/** A graph of the API as plain data, read in [profile] */
|
|
126
|
+
export function graphData(graph, profile = '') {
|
|
127
|
+
return {
|
|
128
|
+
profile,
|
|
129
|
+
arguments: graph.labellings.map(({ argument, label }) => ({
|
|
130
|
+
id: argument.identifier,
|
|
131
|
+
descriptor: argument.descriptor,
|
|
132
|
+
conclusion: argument.conclusion,
|
|
133
|
+
topRule: argument.topRule,
|
|
134
|
+
label,
|
|
135
|
+
supports: argument.supports.map(it => it.identifier),
|
|
136
|
+
})),
|
|
137
|
+
attacks: graph.attacks.map(it => ({
|
|
138
|
+
from: it.attacker.identifier,
|
|
139
|
+
to: it.target.identifier,
|
|
140
|
+
type: it.type ?? null,
|
|
141
|
+
on: it.on?.identifier ?? null,
|
|
142
|
+
})),
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/** Where [text], a theory (or flags) or a query, does not parse; null if it does */
|
|
146
|
+
export function check(text, kind) {
|
|
147
|
+
if (kind === 'query' && /^\s*$/.test(text))
|
|
148
|
+
return null;
|
|
149
|
+
try {
|
|
150
|
+
// a theory read as a solver reads it (until the API checks texts by itself)
|
|
151
|
+
if (kind === 'query')
|
|
152
|
+
Value.parse(text.trim().replace(/\.$/, ''));
|
|
153
|
+
else
|
|
154
|
+
Arg2p.of(text, Flags.none());
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
return syntaxProblem(error) ?? { line: 1, column: 1, length: 1, message: messageOf(error) };
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* The values of the flags in effect for [theory] solved with [flags], as the solver checks them (setting/1 for a
|
|
163
|
+
* switch, setting/2 for the values of a flag): the flags alone when the theory does not parse, none when they do not
|
|
164
|
+
* (until the API gives them)
|
|
165
|
+
*/
|
|
166
|
+
export function settings(theory, flags) {
|
|
167
|
+
let parsed;
|
|
168
|
+
try {
|
|
169
|
+
parsed = Flags.parse(flags);
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
return {};
|
|
173
|
+
}
|
|
174
|
+
let solver;
|
|
175
|
+
try {
|
|
176
|
+
solver = Arg2p.of(theory, parsed);
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
solver = Arg2p.of('', parsed);
|
|
180
|
+
}
|
|
181
|
+
const values = {};
|
|
182
|
+
FLAGS.forEach(flag => {
|
|
183
|
+
try {
|
|
184
|
+
if (flag.kind === 'switch') {
|
|
185
|
+
values[flag.name] = solver.solve(`setting(${flag.name})`).next().isYes ? ['true'] : [];
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
const found = [];
|
|
189
|
+
const solutions = solver.solve(`setting(${flag.name}, Value)`);
|
|
190
|
+
while (solutions.hasNext()) {
|
|
191
|
+
const solution = solutions.next();
|
|
192
|
+
if (!solution.isYes)
|
|
193
|
+
break;
|
|
194
|
+
found.push(unquoted(solution.text('Value') ?? ''));
|
|
195
|
+
}
|
|
196
|
+
values[flag.name] = found;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
// a flag this version of arg2p does not know
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
values.graphBuildMode = [profileOf(solver)].filter(it => it !== '');
|
|
204
|
+
return values;
|
|
205
|
+
}
|
|
206
|
+
function unquoted(value) {
|
|
207
|
+
const quoted = /^'(.*)'$/.exec(value);
|
|
208
|
+
return quoted ? quoted[1].replace(/''/g, "'") : value;
|
|
209
|
+
}
|
|
210
|
+
// An error of the API as an EngineError, where in the text it is when the text does not parse
|
|
211
|
+
function failure(name, error, where) {
|
|
212
|
+
const problem = syntaxProblem(error);
|
|
213
|
+
return { name, message: messageOf(error), syntax: problem && { ...problem, where } };
|
|
214
|
+
}
|
|
215
|
+
// A parse error tells where it is in its message, `... at 3:12; expected ...`: the line and column (from 1) and the
|
|
216
|
+
// token it is about (until the API gives them apart)
|
|
217
|
+
function syntaxProblem(error) {
|
|
218
|
+
const message = messageOf(error);
|
|
219
|
+
const at = / at (\d+):(\d+)/.exec(message);
|
|
220
|
+
if (at === null)
|
|
221
|
+
return null;
|
|
222
|
+
const token = /Unexpected token '([^']*)'/.exec(message);
|
|
223
|
+
return {
|
|
224
|
+
line: Math.max(1, Number(at[1])),
|
|
225
|
+
column: Math.max(1, Number(at[2])),
|
|
226
|
+
length: Math.max(1, token?.[1].length ?? 1),
|
|
227
|
+
message: message.replace(/ at \d+:\d+/, ''),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
function messageOf(error) {
|
|
231
|
+
if (error instanceof Error)
|
|
232
|
+
return error.message;
|
|
233
|
+
if (typeof error === 'object' && error !== null && 'message' in error)
|
|
234
|
+
return String(error.message);
|
|
235
|
+
return String(error);
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/js/host.ts"],"names":[],"mappings":"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"}
|
package/dist/js/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/js/index.ts"],"names":[],"mappings":"AAAA,6GAA6G;AAC7G,+EAA+E;AAC/E,OAAO,EAAE,QAAQ,EAAgB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// The solver of the browser in a worker of its own (see JsEngine): the page stays responsive while it works, and an
|
|
2
|
+
// evaluation that runs too long is stopped by ending the worker.
|
|
3
|
+
import { createHost } from './host.js';
|
|
4
|
+
const scope = self;
|
|
5
|
+
const host = createHost(answer => scope.postMessage(answer));
|
|
6
|
+
scope.onmessage = event => host.handle(event.data);
|
|
7
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/js/worker.ts"],"names":[],"mappings":"AAAA,oHAAoH;AACpH,iEAAiE;AACjE,OAAO,EAAE,UAAU,EAAgB,MAAM,WAAW,CAAC;AAErD,MAAM,KAAK,GAAG,IAA6G,CAAC;AAC5H,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;AAC7D,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAe,CAAC,CAAC"}
|
package/dist/theme.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const tokens: import("lit").CSSResult;
|
|
2
|
+
/** The colour of [label] (in, out, und; any other is unlabelled) as [element] is styled, for what draws on a canvas */
|
|
3
|
+
export declare function labelColor(element: Element, label: string | null | undefined): string;
|
|
4
|
+
/** The colour [name] of the tokens as [element] is styled (in, out, und, unlabelled, support) */
|
|
5
|
+
export declare function cssColor(element: Element, name: string): string;
|
package/dist/theme.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { css } from 'lit';
|
|
2
|
+
// The look of the components, as custom properties a page sets (the dark theme of the playground, the theme of VS Code
|
|
3
|
+
// in a webview): each falls back to the light theme. The colours of the labels (in, out, und) stay the same in every
|
|
4
|
+
// theme: they carry meaning.
|
|
5
|
+
export const tokens = css `
|
|
6
|
+
:host {
|
|
7
|
+
--_surface: var(--arg2p-surface, #ffffff);
|
|
8
|
+
--_surface-2: var(--arg2p-surface-2, #f7f7f8);
|
|
9
|
+
--_hover: var(--arg2p-hover, #f4fafa);
|
|
10
|
+
--_border: var(--arg2p-border, #e3e3e3);
|
|
11
|
+
--_text: var(--arg2p-text, #212529);
|
|
12
|
+
--_muted: var(--arg2p-muted, #777777);
|
|
13
|
+
--_accent: var(--arg2p-accent, #008080);
|
|
14
|
+
--_in: var(--arg2p-in, #008080);
|
|
15
|
+
--_out: var(--arg2p-out, #800000);
|
|
16
|
+
--_und: var(--arg2p-und, #808080);
|
|
17
|
+
--_unlabelled: var(--arg2p-unlabelled, #2b7ce9);
|
|
18
|
+
--_support: var(--arg2p-support, #9a9a9a);
|
|
19
|
+
--_no: var(--arg2p-no, #c9a400);
|
|
20
|
+
--_error: var(--arg2p-error, #b00020);
|
|
21
|
+
--_atom: var(--arg2p-atom, #800000);
|
|
22
|
+
--_functor: var(--arg2p-functor, #6a1b9a);
|
|
23
|
+
--_variable: var(--arg2p-variable, var(--_text));
|
|
24
|
+
--_comment: var(--arg2p-comment, #808080);
|
|
25
|
+
--_font: var(--arg2p-font, system-ui, sans-serif);
|
|
26
|
+
--_mono: var(--arg2p-mono, ui-monospace, monospace);
|
|
27
|
+
color: var(--_text);
|
|
28
|
+
font-family: var(--_font);
|
|
29
|
+
}
|
|
30
|
+
`;
|
|
31
|
+
const DEFAULTS = {
|
|
32
|
+
in: '#008080',
|
|
33
|
+
out: '#800000',
|
|
34
|
+
und: '#808080',
|
|
35
|
+
unlabelled: '#2b7ce9',
|
|
36
|
+
support: '#9a9a9a',
|
|
37
|
+
};
|
|
38
|
+
/** The colour of [label] (in, out, und; any other is unlabelled) as [element] is styled, for what draws on a canvas */
|
|
39
|
+
export function labelColor(element, label) {
|
|
40
|
+
const key = label === 'in' || label === 'out' || label === 'und' ? label : 'unlabelled';
|
|
41
|
+
return cssColor(element, key);
|
|
42
|
+
}
|
|
43
|
+
/** The colour [name] of the tokens as [element] is styled (in, out, und, unlabelled, support) */
|
|
44
|
+
export function cssColor(element, name) {
|
|
45
|
+
const value = getComputedStyle(element).getPropertyValue(`--arg2p-${name}`).trim();
|
|
46
|
+
return value !== '' ? value : DEFAULTS[name] ?? '#000000';
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,uHAAuH;AACvH,qHAAqH;AACrH,6BAA6B;AAC7B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;CAyBxB,CAAC;AAEF,MAAM,QAAQ,GAA2B;IACrC,EAAE,EAAE,SAAS;IACb,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,SAAS;IACd,UAAU,EAAE,SAAS;IACrB,OAAO,EAAE,SAAS;CACrB,CAAC;AAEF,uHAAuH;AACvH,MAAM,UAAU,UAAU,CAAC,OAAgB,EAAE,KAAgC;IACzE,MAAM,GAAG,GAAG,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC;IACxF,OAAO,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,QAAQ,CAAC,OAAgB,EAAE,IAAY;IACnD,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC,gBAAgB,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnF,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;AAC9D,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,67 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tuprolog/arg2p-ui",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "The user interface of Arg2P as web components (graphs, solutions, ...), on any engine: the solver of the browser, or one of the JVM",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"author": "Giuseppe Pisano",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/tuProlog/arg2p-kt-web",
|
|
11
|
+
"directory": "packages/ui"
|
|
12
|
+
},
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"import": "./dist/index.js"
|
|
17
|
+
},
|
|
18
|
+
"./data": {
|
|
19
|
+
"types": "./dist/data.d.ts",
|
|
20
|
+
"import": "./dist/data.js"
|
|
21
|
+
},
|
|
22
|
+
"./js": {
|
|
23
|
+
"types": "./dist/js/index.d.ts",
|
|
24
|
+
"import": "./dist/js/index.js"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"dist",
|
|
29
|
+
"README.md"
|
|
30
|
+
],
|
|
31
|
+
"sideEffects": [
|
|
32
|
+
"./dist/index.js",
|
|
33
|
+
"./dist/components/*.js"
|
|
34
|
+
],
|
|
35
|
+
"scripts": {
|
|
36
|
+
"dev": "vite",
|
|
37
|
+
"build": "tsc -p tsconfig.build.json",
|
|
38
|
+
"check": "tsc --noEmit",
|
|
39
|
+
"test": "vitest run"
|
|
40
|
+
},
|
|
41
|
+
"peerDependencies": {
|
|
42
|
+
"@tuprolog/arg2p": ">=0.19.1"
|
|
43
|
+
},
|
|
44
|
+
"peerDependenciesMeta": {
|
|
45
|
+
"@tuprolog/arg2p": {
|
|
46
|
+
"optional": true
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"dependencies": {
|
|
50
|
+
"@codemirror/commands": "6.11.1",
|
|
51
|
+
"@codemirror/language": "6.13.1",
|
|
52
|
+
"@codemirror/lint": "6.9.7",
|
|
53
|
+
"@codemirror/search": "6.7.2",
|
|
54
|
+
"@codemirror/state": "6.7.6",
|
|
55
|
+
"@codemirror/view": "6.43.14",
|
|
56
|
+
"@lezer/highlight": "1.2.5",
|
|
57
|
+
"cytoscape": "3.34.3",
|
|
58
|
+
"lit": "3.3.3"
|
|
59
|
+
},
|
|
60
|
+
"devDependencies": {
|
|
61
|
+
"@tuprolog/arg2p": "0.19.1",
|
|
62
|
+
"happy-dom": "21.0.1",
|
|
63
|
+
"typescript": "7.0.2",
|
|
64
|
+
"vite": "8.3.4",
|
|
65
|
+
"vitest": "5.0.4"
|
|
66
|
+
}
|
|
67
|
+
}
|