@_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 +13 -0
- package/lib/esm/sparql/sparqlUtils.d.ts +7 -4
- package/lib/esm/sparql/sparqlUtils.js +11 -9
- package/lib/esm/sparql/sparqlUtils.js.map +1 -1
- package/lib/esm/utils/Prefix.d.ts +24 -0
- package/lib/esm/utils/Prefix.js +29 -1
- package/lib/esm/utils/Prefix.js.map +1 -1
- package/package.json +1 -1
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
|
|
28
|
-
*
|
|
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
|
|
46
|
-
*
|
|
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
|
|
66
|
-
*
|
|
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
|
|
110
|
-
*
|
|
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
|
|
118
|
-
|
|
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":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAC,IAAI,EAAC,MAAM,MAAM,CAAC;AAO1B,6EAA6E;AAC7E,4EAA4E;AAC5E,+EAA+E;AAC/E,yEAAyE;AACzE,MAAM,mBAAmB,GAAG,uBAAuB,CAAC;AAEpD;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CACb,kCAAkC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,4FAA4F,CAClJ,CAAC;IACJ,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,+EAA+E;AAC/E,4EAA4E;AAC5E,0EAA0E;AAC1E,0EAA0E;AAC1E,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,SAAS;IACT,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS;IACnE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,QAAQ,EAAE,aAAa;IAC9E,OAAO,EAAE,SAAS;IAClB,cAAc;IACd,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS;IACtE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW;IACvE,WAAW;IACX,UAAU;IACV,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM;IACvC,YAAY;IACZ,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK;IAC9E,OAAO;IACP,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ;IAC3C,wBAAwB;IACxB,IAAI,EAAE,UAAU;IAChB,aAAa;IACb,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc;CAC9D,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;AACrD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CACb,0CAA0C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,mDAAmD,CAClH,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,aAAa,CAAC,GAAG,CAAC,CAAC;IACnB,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,OAAO,IAAI,GAAG,GAAG,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,OAAO,KAAK;SACT,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAuC,EACvC,QAAiB;IAEjB,IAAI,OAAe,CAAC;IACpB,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QAC1B,OAAO,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAE5C,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,IAAI,OAAO,MAAM,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;IAChD,CAAC;IACD,OAAO,IAAI,OAAO,GAAG,CAAC;AACxB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,QAAkB;IAChD,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAa,EACb,OAAuB;IAEvB,MAAM,QAAQ,GACZ,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAQ,KAAI,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,yBAAyB,CAAC;IAE1E,wEAAwE;IACxE,IAAI,KAAa,CAAC;IAClB,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACxC,KAAK,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAChE,CAAC;IAED,OAAO,GAAG,QAAQ,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;AACxD,CAAC"}
|
|
@@ -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
|
/**
|
package/lib/esm/utils/Prefix.js
CHANGED
|
@@ -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 (
|
|
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":"AAAA;;;;GAIG;AACH,MAAM,OAAO,MAAM;IAIjB,MAAM,CAAC,iBAAiB;QACtB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,MAAM,CAAC,iBAAiB;QACtB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,MAAc,EAAE,OAAe;QACxC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,MAAc;QAC1B,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACjC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK;QACV,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC7C,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC/C,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,OAAe;QAC9B,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,MAAc;QAC9B,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAGD,MAAM,CAAC,SAAS,CAAC,OAAe;QAC9B,KAAK,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;YAC7D,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;gBAC5D,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,OAAe;QAC/B,IAAI,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACnD,IAAI,
|
|
1
|
+
{"version":3,"file":"Prefix.js","sourceRoot":"","sources":["../../../src/utils/Prefix.ts"],"names":[],"mappings":"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"}
|