@_linked/core 2.18.0-next.20260904105507 → 2.18.0-next.20260904141443

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/CHANGELOG.md CHANGED
@@ -136,6 +136,19 @@
136
136
 
137
137
  ### Patch Changes
138
138
 
139
+ - [#207](https://github.com/linked-cm/core/pull/207) [`02a32e2`](https://github.com/linked-cm/core/commit/02a32e2bd3483e601b1761ea950e3771ff1c419b) Thanks [@flyon](https://github.com/flyon)! - Never emit a prefixed name whose local part is not a legal SPARQL `PN_LOCAL`.
140
+
141
+ `Prefix.toPrefixed()` guarded only against `/`, so when a registered namespace was a proper
142
+ string prefix of an IRI's own namespace the compaction produced names like
143
+ `create-now:access#PolicyRegistry`. `#` is not in `PN_LOCAL`: the tokenizer ends the name at
144
+ `create-now:access` and reads the rest of the line as a **comment**, eating the triple
145
+ terminator and yielding a query the store rejects — with a parse error pointing at the
146
+ _following_ line, which is why this was hard to attribute.
147
+
148
+ The local part is now validated against a conservative `PN_LOCAL` allowlist and falls back to
149
+ `<full-iri>` when it does not fit. `collectPrefixes` asks `toPrefixed` rather than
150
+ re-implementing the rule, so the `PREFIX` block and the terms can never disagree.
151
+
139
152
  - [#209](https://github.com/linked-cm/core/pull/209) [`0eb6b3c`](https://github.com/linked-cm/core/commit/0eb6b3ce841d895734f2c94602f25d412b9fef25) Thanks [@flyon](https://github.com/flyon)! - Fix `update(expr).where(…)` writing one value per node in the store when the expression traverses a
140
153
  relation.
141
154
 
@@ -24,8 +24,8 @@ export declare function sanitizeVarName(name: string): string;
24
24
  export declare function assertSafeCallName(name: string): void;
25
25
  /**
26
26
  * Format a URI for SPARQL output.
27
- * Returns prefixed form (e.g. `rdf:type`) if a prefix is registered and the
28
- * suffix doesn't contain `/`. Otherwise returns `<full-uri>`.
27
+ * Returns prefixed form (e.g. `rdf:type`) if a prefix is registered AND the
28
+ * resulting local part is a legal SPARQL `PN_LOCAL`. Otherwise `<full-uri>`.
29
29
  * Throws if the IRI contains characters that could break out of the IRIREF.
30
30
  */
31
31
  export declare function formatUri(uri: string): string;
@@ -42,8 +42,11 @@ export declare function escapeSparqlString(value: string): string;
42
42
  export declare function formatLiteral(value: string | number | boolean | Date, datatype?: string): string;
43
43
  /**
44
44
  * Collect the minimal set of prefix→URI mappings needed for a set of URIs.
45
- * Only includes prefixes that are actually used (i.e. `Prefix.toPrefixed`
46
- * returns a value for at least one URI in the list).
45
+ * Only includes prefixes that are actually used.
46
+ *
47
+ * The prefixable rule lives in `Prefix.toPrefixed` and is asked here, never
48
+ * re-implemented: this block and the terms it serves must agree, or a query
49
+ * declares a prefix nothing uses — or worse, uses one it never declared.
47
50
  */
48
51
  export declare function collectPrefixes(usedUris: string[]): Record<string, string>;
49
52
  /**
@@ -62,8 +62,8 @@ export function assertSafeCallName(name) {
62
62
  }
63
63
  /**
64
64
  * Format a URI for SPARQL output.
65
- * Returns prefixed form (e.g. `rdf:type`) if a prefix is registered and the
66
- * suffix doesn't contain `/`. Otherwise returns `<full-uri>`.
65
+ * Returns prefixed form (e.g. `rdf:type`) if a prefix is registered AND the
66
+ * resulting local part is a legal SPARQL `PN_LOCAL`. Otherwise `<full-uri>`.
67
67
  * Throws if the IRI contains characters that could break out of the IRIREF.
68
68
  */
69
69
  export function formatUri(uri) {
@@ -106,19 +106,21 @@ export function formatLiteral(value, datatype) {
106
106
  }
107
107
  /**
108
108
  * Collect the minimal set of prefix→URI mappings needed for a set of URIs.
109
- * Only includes prefixes that are actually used (i.e. `Prefix.toPrefixed`
110
- * returns a value for at least one URI in the list).
109
+ * Only includes prefixes that are actually used.
110
+ *
111
+ * The prefixable rule lives in `Prefix.toPrefixed` and is asked here, never
112
+ * re-implemented: this block and the terms it serves must agree, or a query
113
+ * declares a prefix nothing uses — or worse, uses one it never declared.
111
114
  */
112
115
  export function collectPrefixes(usedUris) {
113
116
  const result = {};
114
117
  for (const uri of usedUris) {
118
+ if (!Prefix.toPrefixed(uri))
119
+ continue;
115
120
  const match = Prefix.findMatch(uri);
116
121
  if (match.length > 0) {
117
- const [ontologyUri, prefix, postFix] = match;
118
- // Only include if the postfix is actually prefixable (no `/`)
119
- if (!postFix.includes('/')) {
120
- result[prefix] = ontologyUri;
121
- }
122
+ const [ontologyUri, prefix] = match;
123
+ result[prefix] = ontologyUri;
122
124
  }
123
125
  }
124
126
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"sparqlUtils.js","sourceRoot":"","sources":["../../../src/sparql/sparqlUtils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sparqlUtils.js","sourceRoot":"","sources":["../../../src/sparql/sparqlUtils.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,31 @@ export declare class Prefix {
9
9
  static getPrefix(fullURI: string): string;
10
10
  static getFullURI(prefix: string): string;
11
11
  static findMatch(fullURI: string): [string, string, string] | [];
12
+ /**
13
+ * Compact a full IRI to `prefix:local`, but ONLY when `local` is a legal
14
+ * SPARQL 1.1 `PN_LOCAL`. Otherwise undefined, so callers emit `<full-iri>`.
15
+ *
16
+ * Returning an invalid prefixed name is not a cosmetic problem: `#` is not in
17
+ * `PN_LOCAL`, so a namespace that merely string-prefixes another one turns
18
+ * `https://data.create.now/access#PolicyRegistry` into
19
+ * `create-now:access#PolicyRegistry`, where the tokenizer ends the name at
20
+ * `create-now:access` and reads `#PolicyRegistry .` as a COMMENT — eating the
21
+ * triple terminator and producing a query the store rejects with a parse
22
+ * error that points at the *next* line. See docs/plans/041.
23
+ *
24
+ * The check is an allowlist on purpose. A blocklist (this used to exclude
25
+ * only `/`) is wrong again the moment another illegal character shows up;
26
+ * over-rejecting only costs a longer full IRI, never correctness.
27
+ */
12
28
  static toPrefixed(fullURI: string): string;
29
+ /**
30
+ * Is this a local part we can safely emit after `prefix:`?
31
+ *
32
+ * A conservative ASCII subset of `PN_LOCAL`: no leading/trailing `.`, no `%`
33
+ * escapes, and none of the characters (`#`, `/`, `?`, `@`, ...) that would
34
+ * end the token early. Empty is allowed — `prefix:` is a valid PNAME_LN.
35
+ */
36
+ static isValidLocalName(local: string): boolean;
13
37
  static toPrefixedIfPossible(fullURI: string): string;
14
38
  static toFullIfPossible(fullURI: string): string;
15
39
  /**
@@ -44,15 +44,43 @@ export class Prefix {
44
44
  }
45
45
  return [];
46
46
  }
47
+ /**
48
+ * Compact a full IRI to `prefix:local`, but ONLY when `local` is a legal
49
+ * SPARQL 1.1 `PN_LOCAL`. Otherwise undefined, so callers emit `<full-iri>`.
50
+ *
51
+ * Returning an invalid prefixed name is not a cosmetic problem: `#` is not in
52
+ * `PN_LOCAL`, so a namespace that merely string-prefixes another one turns
53
+ * `https://data.create.now/access#PolicyRegistry` into
54
+ * `create-now:access#PolicyRegistry`, where the tokenizer ends the name at
55
+ * `create-now:access` and reads `#PolicyRegistry .` as a COMMENT — eating the
56
+ * triple terminator and producing a query the store rejects with a parse
57
+ * error that points at the *next* line. See docs/plans/041.
58
+ *
59
+ * The check is an allowlist on purpose. A blocklist (this used to exclude
60
+ * only `/`) is wrong again the moment another illegal character shows up;
61
+ * over-rejecting only costs a longer full IRI, never correctness.
62
+ */
47
63
  static toPrefixed(fullURI) {
48
64
  let match = this.findMatch(fullURI);
49
65
  if (match.length > 0) {
50
66
  const postFix = fullURI.substring(match[0].length);
51
- if (!postFix.includes('/')) {
67
+ if (Prefix.isValidLocalName(postFix)) {
52
68
  return match[1] + ':' + postFix;
53
69
  }
54
70
  }
55
71
  }
72
+ /**
73
+ * Is this a local part we can safely emit after `prefix:`?
74
+ *
75
+ * A conservative ASCII subset of `PN_LOCAL`: no leading/trailing `.`, no `%`
76
+ * escapes, and none of the characters (`#`, `/`, `?`, `@`, ...) that would
77
+ * end the token early. Empty is allowed — `prefix:` is a valid PNAME_LN.
78
+ */
79
+ static isValidLocalName(local) {
80
+ if (local === '')
81
+ return true;
82
+ return /^[A-Za-z0-9_:](?:[A-Za-z0-9_:.-]*[A-Za-z0-9_:-])?$/.test(local);
83
+ }
56
84
  static toPrefixedIfPossible(fullURI) {
57
85
  return this.toPrefixed(fullURI) || fullURI;
58
86
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Prefix.js","sourceRoot":"","sources":["../../../src/utils/Prefix.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Prefix.js","sourceRoot":"","sources":["../../../src/utils/Prefix.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@_linked/core",
3
- "version": "2.18.0-next.20260904105507",
3
+ "version": "2.18.0-next.20260904141443",
4
4
  "license": "MIT",
5
5
  "linkedPackage": true,
6
6
  "type": "module",