@solidnumber/cli 1.20.1 → 1.25.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/dist/commands/brand.js +11 -2
- package/dist/commands/brand.js.map +1 -1
- package/dist/commands/domains.js +16 -2
- package/dist/commands/domains.js.map +1 -1
- package/dist/commands/graph.d.ts.map +1 -1
- package/dist/commands/graph.js +179 -0
- package/dist/commands/graph.js.map +1 -1
- package/dist/commands/push.d.ts.map +1 -1
- package/dist/commands/push.js +91 -0
- package/dist/commands/push.js.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/api-client.d.ts +5 -0
- package/dist/lib/api-client.d.ts.map +1 -1
- package/dist/lib/api-client.js +75 -0
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/graph-diff.d.ts +66 -0
- package/dist/lib/graph-diff.d.ts.map +1 -0
- package/dist/lib/graph-diff.js +181 -0
- package/dist/lib/graph-diff.js.map +1 -0
- package/dist/lib/offline-queue.d.ts +49 -0
- package/dist/lib/offline-queue.d.ts.map +1 -0
- package/dist/lib/offline-queue.js +270 -0
- package/dist/lib/offline-queue.js.map +1 -0
- package/dist/lib/sparql-bgp.d.ts +88 -0
- package/dist/lib/sparql-bgp.d.ts.map +1 -0
- package/dist/lib/sparql-bgp.js +386 -0
- package/dist/lib/sparql-bgp.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sparql-bgp — minimal SPARQL Basic Graph Pattern engine for JSON-LD.
|
|
3
|
+
*
|
|
4
|
+
* Sprint: SPRINT-JSONLD-GRAPH-MOAT.md § A+.5
|
|
5
|
+
*
|
|
6
|
+
* What's supported (intentionally small):
|
|
7
|
+
*
|
|
8
|
+
* PREFIX schema: <http://schema.org/>
|
|
9
|
+
* PREFIX solid: <https://solidnumber.com/vocab#>
|
|
10
|
+
*
|
|
11
|
+
* SELECT ?s ?type
|
|
12
|
+
* WHERE {
|
|
13
|
+
* ?s a schema:Service . # `a` is sugar for rdf:type
|
|
14
|
+
* ?s schema:provider <https://...> . # full IRI
|
|
15
|
+
* ?s schema:name ?name .
|
|
16
|
+
* }
|
|
17
|
+
*
|
|
18
|
+
* What's NOT supported (out of scope for v1; spec calls these out):
|
|
19
|
+
* - OPTIONAL { ... }
|
|
20
|
+
* - FILTER (regex(?x, "..."))
|
|
21
|
+
* - Property paths (?s schema:knows+ ?o)
|
|
22
|
+
* - UNION / MINUS
|
|
23
|
+
* - GROUP BY / ORDER BY / LIMIT (you can pipe through `head`/`sort`)
|
|
24
|
+
* - Named graphs / GRAPH ?g { ... }
|
|
25
|
+
*
|
|
26
|
+
* That gets us 80% of "find me X where Y" without writing a real
|
|
27
|
+
* SPARQL engine. For the other 20%, point apache-jena-fuseki at the
|
|
28
|
+
* RDF export from `solid graph --dump nquads`.
|
|
29
|
+
*
|
|
30
|
+
* Design notes
|
|
31
|
+
* ------------
|
|
32
|
+
* - Matcher is in-memory; the JsonLdDocument is the entire dataset.
|
|
33
|
+
* - Triples are `(subject, predicate, object)` where each component
|
|
34
|
+
* is a Term: variable, IRI, or literal.
|
|
35
|
+
* - JSON-LD edges are subject's predicate values that have shape
|
|
36
|
+
* `"<some-iri>"` (string IRI) or `{"@id": "<some-iri>"}`. Both are
|
|
37
|
+
* valid in our vocab; the matcher treats them uniformly.
|
|
38
|
+
* - `@context` aliases (e.g. `name` → `schema:name`) are NOT auto-
|
|
39
|
+
* expanded in the matcher; queries should use full IRIs or
|
|
40
|
+
* prefixed names. This is intentional: it keeps the query
|
|
41
|
+
* grammar small and means the same query works against an
|
|
42
|
+
* `expand`-ed JSON-LD doc too.
|
|
43
|
+
*/
|
|
44
|
+
import type { JsonLdDocument } from './graph-walker';
|
|
45
|
+
export type Term = {
|
|
46
|
+
kind: 'var';
|
|
47
|
+
name: string;
|
|
48
|
+
} | {
|
|
49
|
+
kind: 'iri';
|
|
50
|
+
value: string;
|
|
51
|
+
} | {
|
|
52
|
+
kind: 'literal';
|
|
53
|
+
value: string;
|
|
54
|
+
};
|
|
55
|
+
export interface Triple {
|
|
56
|
+
s: Term;
|
|
57
|
+
p: Term;
|
|
58
|
+
o: Term;
|
|
59
|
+
}
|
|
60
|
+
export interface Query {
|
|
61
|
+
prefixes: Record<string, string>;
|
|
62
|
+
selectVars: string[];
|
|
63
|
+
selectAll: boolean;
|
|
64
|
+
where: Triple[];
|
|
65
|
+
}
|
|
66
|
+
export type Bindings = Record<string, string>;
|
|
67
|
+
export interface QueryResult {
|
|
68
|
+
/** Variable names from SELECT, in declaration order. */
|
|
69
|
+
vars: string[];
|
|
70
|
+
/** Each row is one full binding for the SELECT variables. */
|
|
71
|
+
bindings: Bindings[];
|
|
72
|
+
}
|
|
73
|
+
export declare function parseQuery(text: string): Query;
|
|
74
|
+
interface DataTriple {
|
|
75
|
+
s: string;
|
|
76
|
+
p: string;
|
|
77
|
+
o: string;
|
|
78
|
+
}
|
|
79
|
+
/** Materialize a JsonLdDocument as flat (s, p, o) triples. We expand
|
|
80
|
+
* list-valued predicates so a node with `handles: ["a", "b"]` becomes
|
|
81
|
+
* two triples. `@type` becomes `rdf:type` triples (one per type). */
|
|
82
|
+
export declare function materializeTriples(doc: JsonLdDocument): DataTriple[];
|
|
83
|
+
/** Run a parsed query against a JSON-LD document. */
|
|
84
|
+
export declare function runQuery(query: Query, doc: JsonLdDocument): QueryResult;
|
|
85
|
+
/** Convenience: parse + run in one call. */
|
|
86
|
+
export declare function query(text: string, doc: JsonLdDocument): QueryResult;
|
|
87
|
+
export {};
|
|
88
|
+
//# sourceMappingURL=sparql-bgp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sparql-bgp.d.ts","sourceRoot":"","sources":["../../src/lib/sparql-bgp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,gBAAgB,CAAC;AAKjE,MAAM,MAAM,IAAI,GACZ;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvC,MAAM,WAAW,MAAM;IACrB,CAAC,EAAE,IAAI,CAAC;IACR,CAAC,EAAE,IAAI,CAAC;IACR,CAAC,EAAE,IAAI,CAAC;CACT;AAED,MAAM,WAAW,KAAK;IACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE9C,MAAM,WAAW,WAAW;IAC1B,wDAAwD;IACxD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,6DAA6D;IAC7D,QAAQ,EAAE,QAAQ,EAAE,CAAC;CACtB;AASD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CA4D9C;AA8GD,UAAU,UAAU;IAClB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAuBD;;sEAEsE;AACtE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,cAAc,GAAG,UAAU,EAAE,CAmCpE;AAyDD,qDAAqD;AACrD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,cAAc,GAAG,WAAW,CA2CvE;AAED,4CAA4C;AAC5C,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,GAAG,WAAW,CAEpE"}
|
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* sparql-bgp — minimal SPARQL Basic Graph Pattern engine for JSON-LD.
|
|
4
|
+
*
|
|
5
|
+
* Sprint: SPRINT-JSONLD-GRAPH-MOAT.md § A+.5
|
|
6
|
+
*
|
|
7
|
+
* What's supported (intentionally small):
|
|
8
|
+
*
|
|
9
|
+
* PREFIX schema: <http://schema.org/>
|
|
10
|
+
* PREFIX solid: <https://solidnumber.com/vocab#>
|
|
11
|
+
*
|
|
12
|
+
* SELECT ?s ?type
|
|
13
|
+
* WHERE {
|
|
14
|
+
* ?s a schema:Service . # `a` is sugar for rdf:type
|
|
15
|
+
* ?s schema:provider <https://...> . # full IRI
|
|
16
|
+
* ?s schema:name ?name .
|
|
17
|
+
* }
|
|
18
|
+
*
|
|
19
|
+
* What's NOT supported (out of scope for v1; spec calls these out):
|
|
20
|
+
* - OPTIONAL { ... }
|
|
21
|
+
* - FILTER (regex(?x, "..."))
|
|
22
|
+
* - Property paths (?s schema:knows+ ?o)
|
|
23
|
+
* - UNION / MINUS
|
|
24
|
+
* - GROUP BY / ORDER BY / LIMIT (you can pipe through `head`/`sort`)
|
|
25
|
+
* - Named graphs / GRAPH ?g { ... }
|
|
26
|
+
*
|
|
27
|
+
* That gets us 80% of "find me X where Y" without writing a real
|
|
28
|
+
* SPARQL engine. For the other 20%, point apache-jena-fuseki at the
|
|
29
|
+
* RDF export from `solid graph --dump nquads`.
|
|
30
|
+
*
|
|
31
|
+
* Design notes
|
|
32
|
+
* ------------
|
|
33
|
+
* - Matcher is in-memory; the JsonLdDocument is the entire dataset.
|
|
34
|
+
* - Triples are `(subject, predicate, object)` where each component
|
|
35
|
+
* is a Term: variable, IRI, or literal.
|
|
36
|
+
* - JSON-LD edges are subject's predicate values that have shape
|
|
37
|
+
* `"<some-iri>"` (string IRI) or `{"@id": "<some-iri>"}`. Both are
|
|
38
|
+
* valid in our vocab; the matcher treats them uniformly.
|
|
39
|
+
* - `@context` aliases (e.g. `name` → `schema:name`) are NOT auto-
|
|
40
|
+
* expanded in the matcher; queries should use full IRIs or
|
|
41
|
+
* prefixed names. This is intentional: it keeps the query
|
|
42
|
+
* grammar small and means the same query works against an
|
|
43
|
+
* `expand`-ed JSON-LD doc too.
|
|
44
|
+
*/
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.parseQuery = parseQuery;
|
|
47
|
+
exports.materializeTriples = materializeTriples;
|
|
48
|
+
exports.runQuery = runQuery;
|
|
49
|
+
exports.query = query;
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
// Parser — lean recursive descent, tolerant of whitespace and comments.
|
|
52
|
+
//
|
|
53
|
+
// Comments use `#` to end-of-line, matching SPARQL. We don't support
|
|
54
|
+
// the `BASE <iri>` directive (rare in practice; full IRIs work).
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
function parseQuery(text) {
|
|
57
|
+
const stripped = text
|
|
58
|
+
.split('\n')
|
|
59
|
+
.map((line) => {
|
|
60
|
+
// Strip trailing # comments but preserve content inside quoted strings.
|
|
61
|
+
// Safe simplification: a # outside a string starts a comment.
|
|
62
|
+
let inQuote = false;
|
|
63
|
+
for (let i = 0; i < line.length; i++) {
|
|
64
|
+
if (line[i] === '"' && line[i - 1] !== '\\')
|
|
65
|
+
inQuote = !inQuote;
|
|
66
|
+
if (line[i] === '#' && !inQuote)
|
|
67
|
+
return line.slice(0, i);
|
|
68
|
+
}
|
|
69
|
+
return line;
|
|
70
|
+
})
|
|
71
|
+
.join(' ')
|
|
72
|
+
.replace(/\s+/g, ' ')
|
|
73
|
+
.trim();
|
|
74
|
+
const prefixes = {
|
|
75
|
+
// Always-on prefixes so users don't have to declare what's in the
|
|
76
|
+
// tenant @context. Aligned with services/ai_context_jsonld.py.
|
|
77
|
+
schema: 'http://schema.org/',
|
|
78
|
+
solid: 'https://solidnumber.com/vocab#',
|
|
79
|
+
rdf: 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
|
|
80
|
+
};
|
|
81
|
+
// Walk PREFIX declarations.
|
|
82
|
+
let cursor = stripped;
|
|
83
|
+
const prefixRe = /^PREFIX\s+(\w+):\s+<([^>]+)>\s*/i;
|
|
84
|
+
// eslint-disable-next-line no-constant-condition
|
|
85
|
+
while (true) {
|
|
86
|
+
const m = cursor.match(prefixRe);
|
|
87
|
+
if (!m)
|
|
88
|
+
break;
|
|
89
|
+
prefixes[m[1]] = m[2];
|
|
90
|
+
cursor = cursor.slice(m[0].length);
|
|
91
|
+
}
|
|
92
|
+
// SELECT clause
|
|
93
|
+
const selectRe = /^SELECT\s+(DISTINCT\s+)?(.+?)\s+WHERE\s*\{(.+)\}\s*$/is;
|
|
94
|
+
const sel = cursor.match(selectRe);
|
|
95
|
+
if (!sel) {
|
|
96
|
+
throw new Error('Query parse error: expected `SELECT ... WHERE { ... }`');
|
|
97
|
+
}
|
|
98
|
+
const selVarsRaw = sel[2].trim();
|
|
99
|
+
let selectAll = false;
|
|
100
|
+
let selectVars = [];
|
|
101
|
+
if (selVarsRaw === '*') {
|
|
102
|
+
selectAll = true;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
selectVars = selVarsRaw.split(/\s+/).map((v) => {
|
|
106
|
+
if (!v.startsWith('?')) {
|
|
107
|
+
throw new Error(`Query parse error: SELECT vars must start with '?', got '${v}'`);
|
|
108
|
+
}
|
|
109
|
+
return v.slice(1);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
const whereBody = sel[3].trim();
|
|
113
|
+
const triples = parseTriples(whereBody, prefixes);
|
|
114
|
+
return { prefixes, selectVars, selectAll, where: triples };
|
|
115
|
+
}
|
|
116
|
+
function parseTriples(body, prefixes) {
|
|
117
|
+
// Triples are `.`-delimited, BUT `.` can appear inside `<...>` IRIs
|
|
118
|
+
// (`https://solidnumber.com/...`) and inside `"..."` literals. Split
|
|
119
|
+
// statefully so we only treat top-level dots as terminators.
|
|
120
|
+
const parts = [];
|
|
121
|
+
let buf = '';
|
|
122
|
+
let inIri = false;
|
|
123
|
+
let inLit = false;
|
|
124
|
+
for (let i = 0; i < body.length; i++) {
|
|
125
|
+
const ch = body[i];
|
|
126
|
+
if (!inLit && ch === '<') {
|
|
127
|
+
inIri = true;
|
|
128
|
+
buf += ch;
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (inIri && ch === '>') {
|
|
132
|
+
inIri = false;
|
|
133
|
+
buf += ch;
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
if (!inIri && ch === '"' && body[i - 1] !== '\\') {
|
|
137
|
+
inLit = !inLit;
|
|
138
|
+
buf += ch;
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
if (ch === '.' && !inIri && !inLit) {
|
|
142
|
+
const trimmed = buf.trim();
|
|
143
|
+
if (trimmed)
|
|
144
|
+
parts.push(trimmed);
|
|
145
|
+
buf = '';
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
buf += ch;
|
|
149
|
+
}
|
|
150
|
+
const tail = buf.trim();
|
|
151
|
+
if (tail)
|
|
152
|
+
parts.push(tail);
|
|
153
|
+
return parts.map((p) => parseTriple(p, prefixes));
|
|
154
|
+
}
|
|
155
|
+
function parseTriple(text, prefixes) {
|
|
156
|
+
// Tokenize: variables, IRIs in <>, prefixed names, literals in "".
|
|
157
|
+
const tokens = [];
|
|
158
|
+
let i = 0;
|
|
159
|
+
while (i < text.length) {
|
|
160
|
+
const ch = text[i];
|
|
161
|
+
if (/\s/.test(ch)) {
|
|
162
|
+
i++;
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
if (ch === '<') {
|
|
166
|
+
const end = text.indexOf('>', i);
|
|
167
|
+
if (end === -1)
|
|
168
|
+
throw new Error(`Unclosed IRI: ${text}`);
|
|
169
|
+
tokens.push(text.slice(i, end + 1));
|
|
170
|
+
i = end + 1;
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
if (ch === '"') {
|
|
174
|
+
let end = i + 1;
|
|
175
|
+
while (end < text.length && !(text[end] === '"' && text[end - 1] !== '\\'))
|
|
176
|
+
end++;
|
|
177
|
+
if (end >= text.length)
|
|
178
|
+
throw new Error(`Unclosed literal: ${text}`);
|
|
179
|
+
tokens.push(text.slice(i, end + 1));
|
|
180
|
+
i = end + 1;
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
// Identifier or variable: contiguous non-whitespace
|
|
184
|
+
let end = i;
|
|
185
|
+
while (end < text.length && !/\s/.test(text[end]))
|
|
186
|
+
end++;
|
|
187
|
+
tokens.push(text.slice(i, end));
|
|
188
|
+
i = end;
|
|
189
|
+
}
|
|
190
|
+
if (tokens.length !== 3) {
|
|
191
|
+
throw new Error(`Each triple must have 3 terms; got ${tokens.length}: ${text}`);
|
|
192
|
+
}
|
|
193
|
+
const [sTok, pTok, oTok] = tokens;
|
|
194
|
+
return {
|
|
195
|
+
s: parseTerm(sTok, prefixes, 'subject'),
|
|
196
|
+
p: parseTerm(pTok === 'a' ? 'rdf:type' : pTok, prefixes, 'predicate'),
|
|
197
|
+
o: parseTerm(oTok, prefixes, 'object'),
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
function parseTerm(token, prefixes, _pos) {
|
|
201
|
+
if (token.startsWith('?')) {
|
|
202
|
+
return { kind: 'var', name: token.slice(1) };
|
|
203
|
+
}
|
|
204
|
+
if (token.startsWith('<') && token.endsWith('>')) {
|
|
205
|
+
return { kind: 'iri', value: token.slice(1, -1) };
|
|
206
|
+
}
|
|
207
|
+
if (token.startsWith('"') && token.endsWith('"')) {
|
|
208
|
+
return { kind: 'literal', value: token.slice(1, -1) };
|
|
209
|
+
}
|
|
210
|
+
// Numeric literal — keep as string, the matcher will coerce both sides.
|
|
211
|
+
if (/^-?\d+(\.\d+)?$/.test(token)) {
|
|
212
|
+
return { kind: 'literal', value: token };
|
|
213
|
+
}
|
|
214
|
+
// Prefixed name `prefix:local`
|
|
215
|
+
const colon = token.indexOf(':');
|
|
216
|
+
if (colon > 0) {
|
|
217
|
+
const prefix = token.slice(0, colon);
|
|
218
|
+
const local = token.slice(colon + 1);
|
|
219
|
+
if (prefixes[prefix] !== undefined) {
|
|
220
|
+
return { kind: 'iri', value: prefixes[prefix] + local };
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
throw new Error(`Cannot parse term: '${token}' (use ?var, <iri>, prefix:name, or "literal")`);
|
|
224
|
+
}
|
|
225
|
+
const RESERVED_PREDICATE_KEYS = new Set(['@id', '@context', '@type']);
|
|
226
|
+
function valueToObjectIri(v) {
|
|
227
|
+
if (typeof v === 'string')
|
|
228
|
+
return v;
|
|
229
|
+
if (v && typeof v === 'object' && '@id' in v) {
|
|
230
|
+
const id = v['@id'];
|
|
231
|
+
return typeof id === 'string' ? id : null;
|
|
232
|
+
}
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
function valueToLiteral(v) {
|
|
236
|
+
if (typeof v === 'string')
|
|
237
|
+
return v;
|
|
238
|
+
if (typeof v === 'number' || typeof v === 'boolean')
|
|
239
|
+
return String(v);
|
|
240
|
+
if (v && typeof v === 'object' && '@value' in v) {
|
|
241
|
+
const lit = v['@value'];
|
|
242
|
+
return lit == null ? null : String(lit);
|
|
243
|
+
}
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
/** Materialize a JsonLdDocument as flat (s, p, o) triples. We expand
|
|
247
|
+
* list-valued predicates so a node with `handles: ["a", "b"]` becomes
|
|
248
|
+
* two triples. `@type` becomes `rdf:type` triples (one per type). */
|
|
249
|
+
function materializeTriples(doc) {
|
|
250
|
+
const out = [];
|
|
251
|
+
const RDF_TYPE = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type';
|
|
252
|
+
for (const node of doc.graph ?? []) {
|
|
253
|
+
if (!node || typeof node !== 'object')
|
|
254
|
+
continue;
|
|
255
|
+
const subj = node['@id'];
|
|
256
|
+
if (typeof subj !== 'string')
|
|
257
|
+
continue;
|
|
258
|
+
// @type → rdf:type triples
|
|
259
|
+
const t = node['@type'];
|
|
260
|
+
const types = Array.isArray(t) ? t : t ? [t] : [];
|
|
261
|
+
for (const ty of types) {
|
|
262
|
+
out.push({ s: subj, p: RDF_TYPE, o: String(ty) });
|
|
263
|
+
}
|
|
264
|
+
// Other predicates
|
|
265
|
+
for (const [pred, val] of Object.entries(node)) {
|
|
266
|
+
if (RESERVED_PREDICATE_KEYS.has(pred))
|
|
267
|
+
continue;
|
|
268
|
+
const values = Array.isArray(val) ? val : [val];
|
|
269
|
+
for (const v of values) {
|
|
270
|
+
// Try as IRI first (edge), then literal (data property).
|
|
271
|
+
const asIri = valueToObjectIri(v);
|
|
272
|
+
if (asIri !== null) {
|
|
273
|
+
out.push({ s: subj, p: pred, o: asIri });
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
276
|
+
const asLit = valueToLiteral(v);
|
|
277
|
+
if (asLit !== null) {
|
|
278
|
+
out.push({ s: subj, p: pred, o: asLit });
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
return out;
|
|
284
|
+
}
|
|
285
|
+
function termValue(t) {
|
|
286
|
+
switch (t.kind) {
|
|
287
|
+
case 'iri':
|
|
288
|
+
case 'literal':
|
|
289
|
+
return t.value;
|
|
290
|
+
case 'var':
|
|
291
|
+
return ''; // unreachable when caller checks kind first
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
function matchTerm(t, value, bindings) {
|
|
295
|
+
if (t.kind === 'var') {
|
|
296
|
+
const existing = bindings[t.name];
|
|
297
|
+
if (existing !== undefined) {
|
|
298
|
+
return existing === value ? bindings : null;
|
|
299
|
+
}
|
|
300
|
+
return { ...bindings, [t.name]: value };
|
|
301
|
+
}
|
|
302
|
+
return termValue(t) === value ? bindings : null;
|
|
303
|
+
}
|
|
304
|
+
/** Expand a JSON-LD term against the query's resolved aliases. We
|
|
305
|
+
* also accept short predicate names (like `name` / `provider`) and
|
|
306
|
+
* match them against the materialized triple's predicate as-is —
|
|
307
|
+
* the materializer keeps the original shorthand on triples that came
|
|
308
|
+
* from compact JSON-LD, so query like `?s name ?n` works against the
|
|
309
|
+
* compact form too. (Real SPARQL would require expansion; we cheat
|
|
310
|
+
* to keep ergonomics good. Documented in the JSDoc above.) */
|
|
311
|
+
function predicateCandidates(t) {
|
|
312
|
+
if (t.kind === 'var')
|
|
313
|
+
return [];
|
|
314
|
+
return [termValue(t)];
|
|
315
|
+
}
|
|
316
|
+
function matchTriple(pattern, data, bindings) {
|
|
317
|
+
const out = [];
|
|
318
|
+
const predFilters = predicateCandidates(pattern.p);
|
|
319
|
+
for (const d of data) {
|
|
320
|
+
if (pattern.p.kind !== 'var' && !predFilters.includes(d.p))
|
|
321
|
+
continue;
|
|
322
|
+
let b = bindings;
|
|
323
|
+
b = matchTerm(pattern.s, d.s, b);
|
|
324
|
+
if (b === null)
|
|
325
|
+
continue;
|
|
326
|
+
b = matchTerm(pattern.p, d.p, b);
|
|
327
|
+
if (b === null)
|
|
328
|
+
continue;
|
|
329
|
+
b = matchTerm(pattern.o, d.o, b);
|
|
330
|
+
if (b === null)
|
|
331
|
+
continue;
|
|
332
|
+
out.push(b);
|
|
333
|
+
}
|
|
334
|
+
return out;
|
|
335
|
+
}
|
|
336
|
+
/** Run a parsed query against a JSON-LD document. */
|
|
337
|
+
function runQuery(query, doc) {
|
|
338
|
+
const data = materializeTriples(doc);
|
|
339
|
+
let solutions = [{}];
|
|
340
|
+
for (const pattern of query.where) {
|
|
341
|
+
const next = [];
|
|
342
|
+
for (const partial of solutions) {
|
|
343
|
+
next.push(...matchTriple(pattern, data, partial));
|
|
344
|
+
}
|
|
345
|
+
solutions = next;
|
|
346
|
+
if (solutions.length === 0)
|
|
347
|
+
break;
|
|
348
|
+
}
|
|
349
|
+
// Project to selected vars. SELECT * means "every variable that
|
|
350
|
+
// appears anywhere in WHERE."
|
|
351
|
+
let vars;
|
|
352
|
+
if (query.selectAll) {
|
|
353
|
+
const seen = new Set();
|
|
354
|
+
for (const t of query.where) {
|
|
355
|
+
for (const term of [t.s, t.p, t.o]) {
|
|
356
|
+
if (term.kind === 'var')
|
|
357
|
+
seen.add(term.name);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
vars = [...seen];
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
vars = query.selectVars;
|
|
364
|
+
}
|
|
365
|
+
// De-duplicate rows (DISTINCT-by-default for projection).
|
|
366
|
+
const seenRows = new Set();
|
|
367
|
+
const projected = [];
|
|
368
|
+
for (const sol of solutions) {
|
|
369
|
+
const row = {};
|
|
370
|
+
for (const v of vars) {
|
|
371
|
+
if (sol[v] !== undefined)
|
|
372
|
+
row[v] = sol[v];
|
|
373
|
+
}
|
|
374
|
+
const key = JSON.stringify(row);
|
|
375
|
+
if (seenRows.has(key))
|
|
376
|
+
continue;
|
|
377
|
+
seenRows.add(key);
|
|
378
|
+
projected.push(row);
|
|
379
|
+
}
|
|
380
|
+
return { vars, bindings: projected };
|
|
381
|
+
}
|
|
382
|
+
/** Convenience: parse + run in one call. */
|
|
383
|
+
function query(text, doc) {
|
|
384
|
+
return runQuery(parseQuery(text), doc);
|
|
385
|
+
}
|
|
386
|
+
//# sourceMappingURL=sparql-bgp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sparql-bgp.js","sourceRoot":"","sources":["../../src/lib/sparql-bgp.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@solidnumber/cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.25.0",
|
|
4
4
|
"description": "AI business infrastructure from the terminal — CRM, payments, voice AI, 116 agents, 52 industry templates. solid clone plumber → instant business. Also: programmatic TS SDK via @solidnumber/cli/sdk.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -86,6 +86,7 @@
|
|
|
86
86
|
"figures": "^6.1.0",
|
|
87
87
|
"gradient-string": "^3.0.0",
|
|
88
88
|
"inquirer": "^9.2.0",
|
|
89
|
+
"jsonld": "^9.0.0",
|
|
89
90
|
"ora": "^8.0.0",
|
|
90
91
|
"update-notifier": "^7.3.1"
|
|
91
92
|
},
|