@traqula/rules-sparql-1-1 0.0.22 → 0.0.24

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.
Files changed (76) hide show
  1. package/dist/cjs/lib/MinimalSparqlParser.js +35 -58
  2. package/dist/cjs/lib/MinimalSparqlParser.js.map +1 -0
  3. package/dist/cjs/lib/Sparql11types.js +2 -15
  4. package/dist/cjs/lib/Sparql11types.js.map +1 -0
  5. package/dist/cjs/lib/astFactory.js +107 -119
  6. package/dist/cjs/lib/astFactory.js.map +1 -0
  7. package/dist/cjs/lib/expressionHelpers.js +181 -191
  8. package/dist/cjs/lib/expressionHelpers.js.map +1 -0
  9. package/dist/cjs/lib/factoryMixins/ContextFactory.js +30 -52
  10. package/dist/cjs/lib/factoryMixins/ContextFactory.js.map +1 -0
  11. package/dist/cjs/lib/factoryMixins/ExpressionFactory.js +83 -102
  12. package/dist/cjs/lib/factoryMixins/ExpressionFactory.js.map +1 -0
  13. package/dist/cjs/lib/factoryMixins/GraphRefFactory.js +51 -73
  14. package/dist/cjs/lib/factoryMixins/GraphRefFactory.js.map +1 -0
  15. package/dist/cjs/lib/factoryMixins/PathFactory.js +68 -87
  16. package/dist/cjs/lib/factoryMixins/PathFactory.js.map +1 -0
  17. package/dist/cjs/lib/factoryMixins/Patternfactory.js +98 -120
  18. package/dist/cjs/lib/factoryMixins/Patternfactory.js.map +1 -0
  19. package/dist/cjs/lib/factoryMixins/QueryFactory.js +43 -65
  20. package/dist/cjs/lib/factoryMixins/QueryFactory.js.map +1 -0
  21. package/dist/cjs/lib/factoryMixins/SolutionModifiersFactory.js +55 -77
  22. package/dist/cjs/lib/factoryMixins/SolutionModifiersFactory.js.map +1 -0
  23. package/dist/cjs/lib/factoryMixins/TermFactory.js +81 -102
  24. package/dist/cjs/lib/factoryMixins/TermFactory.js.map +1 -0
  25. package/dist/cjs/lib/factoryMixins/UpdateOperationFactory.js +126 -147
  26. package/dist/cjs/lib/factoryMixins/UpdateOperationFactory.js.map +1 -0
  27. package/dist/cjs/lib/factoryMixins/mixins.js +21 -38
  28. package/dist/cjs/lib/factoryMixins/mixins.js.map +1 -0
  29. package/dist/cjs/lib/grammar/builtIn.js +277 -377
  30. package/dist/cjs/lib/grammar/builtIn.js.map +1 -0
  31. package/dist/cjs/lib/grammar/dataSetClause.js +110 -109
  32. package/dist/cjs/lib/grammar/dataSetClause.js.map +1 -0
  33. package/dist/cjs/lib/grammar/expression.js +387 -358
  34. package/dist/cjs/lib/grammar/expression.js.map +1 -0
  35. package/dist/cjs/lib/grammar/general.js +173 -158
  36. package/dist/cjs/lib/grammar/general.js.map +1 -0
  37. package/dist/cjs/lib/grammar/index.js +94 -111
  38. package/dist/cjs/lib/grammar/index.js.map +1 -0
  39. package/dist/cjs/lib/grammar/literals.js +282 -266
  40. package/dist/cjs/lib/grammar/literals.js.map +1 -0
  41. package/dist/cjs/lib/grammar/propertyPaths.js +206 -193
  42. package/dist/cjs/lib/grammar/propertyPaths.js.map +1 -0
  43. package/dist/cjs/lib/grammar/queryUnit.js +395 -372
  44. package/dist/cjs/lib/grammar/queryUnit.js.map +1 -0
  45. package/dist/cjs/lib/grammar/solutionModifier.js +281 -265
  46. package/dist/cjs/lib/grammar/solutionModifier.js.map +1 -0
  47. package/dist/cjs/lib/grammar/tripleBlock.js +390 -355
  48. package/dist/cjs/lib/grammar/tripleBlock.js.map +1 -0
  49. package/dist/cjs/lib/grammar/updateUnit.js +551 -519
  50. package/dist/cjs/lib/grammar/updateUnit.js.map +1 -0
  51. package/dist/cjs/lib/grammar/whereClause.js +486 -459
  52. package/dist/cjs/lib/grammar/whereClause.js.map +1 -0
  53. package/dist/cjs/lib/index.js +47 -54
  54. package/dist/cjs/lib/index.js.map +1 -0
  55. package/dist/cjs/lib/lexer/BuiltInCalls.js +188 -333
  56. package/dist/cjs/lib/lexer/BuiltInCalls.js.map +1 -0
  57. package/dist/cjs/lib/lexer/graph.js +10 -40
  58. package/dist/cjs/lib/lexer/graph.js.map +1 -0
  59. package/dist/cjs/lib/lexer/index.js +43 -48
  60. package/dist/cjs/lib/lexer/index.js.map +1 -0
  61. package/dist/cjs/lib/lexer/lexer.js +84 -195
  62. package/dist/cjs/lib/lexer/lexer.js.map +1 -0
  63. package/dist/cjs/lib/lexer/lexerPatterns.js +40 -132
  64. package/dist/cjs/lib/lexer/lexerPatterns.js.map +1 -0
  65. package/dist/cjs/lib/lexer/symbols.js +31 -106
  66. package/dist/cjs/lib/lexer/symbols.js.map +1 -0
  67. package/dist/cjs/lib/lexer/terminals.js +100 -102
  68. package/dist/cjs/lib/lexer/terminals.js.map +1 -0
  69. package/dist/cjs/lib/sparql11HelperTypes.js +2 -15
  70. package/dist/cjs/lib/sparql11HelperTypes.js.map +1 -0
  71. package/dist/cjs/lib/utils.js +40 -58
  72. package/dist/cjs/lib/utils.js.map +1 -0
  73. package/dist/cjs/lib/validation/validators.js +197 -186
  74. package/dist/cjs/lib/validation/validators.js.map +1 -0
  75. package/dist/cjs/package.json +1 -0
  76. package/package.json +10 -9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sparql11HelperTypes.js","sourceRoot":"","sources":["../../../lib/sparql11HelperTypes.ts"],"names":[],"mappings":"","sourcesContent":["import type { GeneratorRule, ParserRule, traqulaIndentation } from '@traqula/core';\nimport type { AstFactory } from './astFactory.js';\n\nexport interface SparqlContext {\n /**\n * Data-factoryMixins to be used when constructing rdf primitives.\n */\n astFactory: AstFactory;\n /**\n * Current scoped prefixes. Used for resolving prefixed names.\n */\n prefixes: Record<string, string>;\n /**\n * The base IRI for the query. Used for resolving relative IRIs.\n */\n baseIRI: string | undefined;\n /**\n * Can be used to disable the validation that used variables in a select clause are in scope.\n */\n skipValidation: boolean;\n /**\n * Set of queryModes. Primarily used for note 8, 14.\n */\n parseMode: Set<'canParseVars' | 'canCreateBlankNodes' | 'inAggregate' | 'canParseAggregate' | string>;\n}\n\nexport interface SparqlGeneratorContext {\n astFactory: AstFactory;\n indentInc: number;\n origSource?: string;\n [traqulaIndentation]: number;\n}\n\nexport type SparqlRule<\n /**\n * Name of grammar rule, should be a strict subtype of string like 'myGrammarRule'.\n */\n NameType extends string = string,\n /**\n * Type that will be returned after a correct parse of this rule.\n * This type will be the return type of calling SUBRULE with this grammar rule.\n */\n ReturnType = unknown,\n GenInputType = ReturnType,\n /**\n * Function arguments that can be given to convey the state of the current parse operation.\n */\n ParamType extends any[] = [],\n> = SparqlGrammarRule<NameType, ReturnType, ParamType>\n & SparqlGeneratorRule<NameType, GenInputType, ParamType>;\nexport type SparqlGeneratorRule<\n /**\n * Name of grammar rule, should be a strict subtype of string like 'myGrammarRule'.\n */\n NameType extends string = string,\n /**\n * Type that will be returned after a correct parse of this rule.\n * This type will be the return type of calling SUBRULE with this grammar rule.\n */\n ReturnType = unknown,\n /**\n * Function arguments that can be given to convey the state of the current parse operation.\n */\n ParamType extends any[] = [],\n> = GeneratorRule<SparqlGeneratorContext, NameType, ReturnType, ParamType>;\nexport type SparqlGrammarRule<\n /**\n * Name of grammar rule, should be a strict subtype of string like 'myGrammarRule'.\n */\n NameType extends string = string,\n /**\n * Type that will be returned after a correct parse of this rule.\n * This type will be the return type of calling SUBRULE with this grammar rule.\n */\n ReturnType = unknown,\n /**\n * Function arguments that can be given to convey the state of the current parse operation.\n */\n ParamType extends any[] = [],\n> = ParserRule<SparqlContext, NameType, ReturnType, ParamType>;\n"]}
@@ -1,64 +1,46 @@
1
1
  "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var utils_exports = {};
20
- __export(utils_exports, {
21
- AstTransformer: () => AstTransformer,
22
- CommonIRIs: () => CommonIRIs,
23
- sparqlCodepointEscape: () => sparqlCodepointEscape
24
- });
25
- module.exports = __toCommonJS(utils_exports);
26
- var import_core = require("@traqula/core");
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AstTransformer = exports.CommonIRIs = void 0;
4
+ exports.sparqlCodepointEscape = sparqlCodepointEscape;
5
+ const core_1 = require("@traqula/core");
6
+ /**
7
+ * Transform input in accordance to [19.2](https://www.w3.org/TR/sparql11-query/#codepointEscape)
8
+ * and validate unicode codepoints.
9
+ */
27
10
  function sparqlCodepointEscape(input) {
28
- const sanitizedInput = input.replaceAll(/\\u([0-9a-fA-F]{4})|\\U([0-9a-fA-F]{8})/gu, (_, unicode4, unicode8) => {
29
- if (unicode4) {
30
- const charCode2 = Number.parseInt(unicode4, 16);
31
- return String.fromCodePoint(charCode2);
11
+ const sanitizedInput = input.replaceAll(/\\u([0-9a-fA-F]{4})|\\U([0-9a-fA-F]{8})/gu, (_, unicode4, unicode8) => {
12
+ if (unicode4) {
13
+ const charCode = Number.parseInt(unicode4, 16);
14
+ return String.fromCodePoint(charCode);
15
+ }
16
+ const charCode = Number.parseInt(unicode8, 16);
17
+ if (charCode < 0xFFFF) {
18
+ return String.fromCodePoint(charCode);
19
+ }
20
+ const substractedCharCode = charCode - 0x10000;
21
+ return String.fromCodePoint(0xD800 + (substractedCharCode >> 10), 0xDC00 + (substractedCharCode & 0x3FF));
22
+ });
23
+ // Test for invalid unicode surrogate pairs
24
+ if (/[\uD800-\uDBFF](?:[^\uDC00-\uDFFF]|$)/u.test(sanitizedInput)) {
25
+ throw new Error(`Invalid unicode codepoint of surrogate pair without corresponding codepoint`);
32
26
  }
33
- const charCode = Number.parseInt(unicode8, 16);
34
- if (charCode < 65535) {
35
- return String.fromCodePoint(charCode);
36
- }
37
- const substractedCharCode = charCode - 65536;
38
- return String.fromCodePoint(55296 + (substractedCharCode >> 10), 56320 + (substractedCharCode & 1023));
39
- });
40
- if (/[\uD800-\uDBFF](?:[^\uDC00-\uDFFF]|$)/u.test(sanitizedInput)) {
41
- throw new Error(`Invalid unicode codepoint of surrogate pair without corresponding codepoint`);
42
- }
43
- return sanitizedInput;
27
+ return sanitizedInput;
44
28
  }
45
29
  var CommonIRIs;
46
- (function(CommonIRIs2) {
47
- CommonIRIs2["BOOLEAN"] = "http://www.w3.org/2001/XMLSchema#boolean";
48
- CommonIRIs2["INTEGER"] = "http://www.w3.org/2001/XMLSchema#integer";
49
- CommonIRIs2["DECIMAL"] = "http://www.w3.org/2001/XMLSchema#decimal";
50
- CommonIRIs2["DOUBLE"] = "http://www.w3.org/2001/XMLSchema#double";
51
- CommonIRIs2["STRING"] = "http://www.w3.org/2001/XMLSchema#string";
52
- CommonIRIs2["FIRST"] = "http://www.w3.org/1999/02/22-rdf-syntax-ns#first";
53
- CommonIRIs2["REST"] = "http://www.w3.org/1999/02/22-rdf-syntax-ns#rest";
54
- CommonIRIs2["NIL"] = "http://www.w3.org/1999/02/22-rdf-syntax-ns#nil";
55
- CommonIRIs2["TYPE"] = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type";
56
- })(CommonIRIs || (CommonIRIs = {}));
57
- class AstTransformer extends import_core.TransformerSubTyped {
30
+ (function (CommonIRIs) {
31
+ // XSD
32
+ CommonIRIs["BOOLEAN"] = "http://www.w3.org/2001/XMLSchema#boolean";
33
+ CommonIRIs["INTEGER"] = "http://www.w3.org/2001/XMLSchema#integer";
34
+ CommonIRIs["DECIMAL"] = "http://www.w3.org/2001/XMLSchema#decimal";
35
+ CommonIRIs["DOUBLE"] = "http://www.w3.org/2001/XMLSchema#double";
36
+ CommonIRIs["STRING"] = "http://www.w3.org/2001/XMLSchema#string";
37
+ // RDF
38
+ CommonIRIs["FIRST"] = "http://www.w3.org/1999/02/22-rdf-syntax-ns#first";
39
+ CommonIRIs["REST"] = "http://www.w3.org/1999/02/22-rdf-syntax-ns#rest";
40
+ CommonIRIs["NIL"] = "http://www.w3.org/1999/02/22-rdf-syntax-ns#nil";
41
+ CommonIRIs["TYPE"] = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type";
42
+ })(CommonIRIs || (exports.CommonIRIs = CommonIRIs = {}));
43
+ class AstTransformer extends core_1.TransformerSubTyped {
58
44
  }
59
- // Annotate the CommonJS export names for ESM import in node:
60
- 0 && (module.exports = {
61
- AstTransformer,
62
- CommonIRIs,
63
- sparqlCodepointEscape
64
- });
45
+ exports.AstTransformer = AstTransformer;
46
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../lib/utils.ts"],"names":[],"mappings":";;;AAOA,sDAqBC;AA5BD,wCAAoD;AAGpD;;;GAGG;AACH,SAAgB,qBAAqB,CAAC,KAAa;IACjD,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,CACrC,2CAA2C,EAC3C,CAAC,CAAC,EAAE,QAAgB,EAAE,QAAgB,EAAE,EAAE;QACxC,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC/C,OAAO,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC/C,IAAI,QAAQ,GAAG,MAAM,EAAE,CAAC;YACtB,OAAO,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,mBAAmB,GAAG,QAAQ,GAAG,OAAO,CAAC;QAC/C,OAAO,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,mBAAmB,IAAI,EAAE,CAAC,EAAE,MAAM,GAAG,CAAC,mBAAmB,GAAG,KAAK,CAAC,CAAC,CAAC;IAC5G,CAAC,CACF,CAAC;IACF,2CAA2C;IAC3C,IAAI,wCAAwC,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,IAAY,UAYX;AAZD,WAAY,UAAU;IACpB,MAAM;IACN,kEAAoD,CAAA;IACpD,kEAAoD,CAAA;IACpD,kEAAoD,CAAA;IACpD,gEAAkD,CAAA;IAClD,gEAAkD,CAAA;IAClD,MAAM;IACN,wEAA0D,CAAA;IAC1D,sEAAwD,CAAA;IACxD,oEAAsD,CAAA;IACtD,sEAAwD,CAAA;AAC1D,CAAC,EAZW,UAAU,0BAAV,UAAU,QAYrB;AAED,MAAa,cAAe,SAAQ,0BAAkC;CAAG;AAAzE,wCAAyE","sourcesContent":["import { TransformerSubTyped } from '@traqula/core';\nimport type { Sparql11Nodes } from './Sparql11types.js';\n\n/**\n * Transform input in accordance to [19.2](https://www.w3.org/TR/sparql11-query/#codepointEscape)\n * and validate unicode codepoints.\n */\nexport function sparqlCodepointEscape(input: string): string {\n const sanitizedInput = input.replaceAll(\n /\\\\u([0-9a-fA-F]{4})|\\\\U([0-9a-fA-F]{8})/gu,\n (_, unicode4: string, unicode8: string) => {\n if (unicode4) {\n const charCode = Number.parseInt(unicode4, 16);\n return String.fromCodePoint(charCode);\n }\n const charCode = Number.parseInt(unicode8, 16);\n if (charCode < 0xFFFF) {\n return String.fromCodePoint(charCode);\n }\n const substractedCharCode = charCode - 0x10000;\n return String.fromCodePoint(0xD800 + (substractedCharCode >> 10), 0xDC00 + (substractedCharCode & 0x3FF));\n },\n );\n // Test for invalid unicode surrogate pairs\n if (/[\\uD800-\\uDBFF](?:[^\\uDC00-\\uDFFF]|$)/u.test(sanitizedInput)) {\n throw new Error(`Invalid unicode codepoint of surrogate pair without corresponding codepoint`);\n }\n return sanitizedInput;\n}\n\nexport enum CommonIRIs {\n // XSD\n BOOLEAN = 'http://www.w3.org/2001/XMLSchema#boolean',\n INTEGER = 'http://www.w3.org/2001/XMLSchema#integer',\n DECIMAL = 'http://www.w3.org/2001/XMLSchema#decimal',\n DOUBLE = 'http://www.w3.org/2001/XMLSchema#double',\n STRING = 'http://www.w3.org/2001/XMLSchema#string',\n // RDF\n FIRST = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#first',\n REST = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#rest',\n NIL = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#nil',\n TYPE = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type',\n}\n\nexport class AstTransformer extends TransformerSubTyped<Sparql11Nodes> {}\n"]}
@@ -1,214 +1,225 @@
1
1
  "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var validators_exports = {};
20
- __export(validators_exports, {
21
- checkNote13: () => checkNote13,
22
- findPatternBoundedVars: () => findPatternBoundedVars,
23
- queryIsGood: () => queryIsGood,
24
- updateNoReuseBlankNodeLabels: () => updateNoReuseBlankNodeLabels
25
- });
26
- module.exports = __toCommonJS(validators_exports);
27
- var import_astFactory = require("../astFactory.js");
28
- var import_utils = require("../utils.js");
29
- const F = new import_astFactory.AstFactory();
30
- const transformer = new import_utils.AstTransformer();
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.queryIsGood = queryIsGood;
4
+ exports.findPatternBoundedVars = findPatternBoundedVars;
5
+ exports.checkNote13 = checkNote13;
6
+ exports.updateNoReuseBlankNodeLabels = updateNoReuseBlankNodeLabels;
7
+ const astFactory_js_1 = require("../astFactory.js");
8
+ const utils_js_1 = require("../utils.js");
9
+ const F = new astFactory_js_1.AstFactory();
10
+ const transformer = new utils_js_1.AstTransformer();
11
+ /**
12
+ * Get all 'aggregate' rules from an expression
13
+ */
31
14
  function getAggregatesOfExpression(expression) {
32
- if (F.isExpressionAggregate(expression)) {
33
- return [expression];
34
- }
35
- if (F.isExpressionOperator(expression)) {
36
- const aggregates = [];
37
- for (const arg of expression.args) {
38
- aggregates.push(...getAggregatesOfExpression(arg));
15
+ if (F.isExpressionAggregate(expression)) {
16
+ return [expression];
39
17
  }
40
- return aggregates;
41
- }
42
- return [];
18
+ if (F.isExpressionOperator(expression)) {
19
+ const aggregates = [];
20
+ for (const arg of expression.args) {
21
+ aggregates.push(...getAggregatesOfExpression(arg));
22
+ }
23
+ return aggregates;
24
+ }
25
+ return [];
43
26
  }
27
+ /**
28
+ * Return the variable value id of an expression if bounded
29
+ */
44
30
  function getExpressionId(expression) {
45
- if (F.isTerm(expression) && F.isTermVariable(expression)) {
46
- return expression.value;
47
- }
48
- if (F.isExpression(expression)) {
49
- if (F.isExpressionAggregate(expression) && F.isTermVariable(expression.expression[0])) {
50
- return expression.expression[0].value;
31
+ // Check if grouping
32
+ if (F.isTerm(expression) && F.isTermVariable(expression)) {
33
+ return expression.value;
51
34
  }
52
- return void 0;
53
- }
54
- return expression.variable.value;
35
+ if (F.isExpression(expression)) {
36
+ if (F.isExpressionAggregate(expression) && F.isTermVariable(expression.expression[0])) {
37
+ return expression.expression[0].value;
38
+ }
39
+ return undefined;
40
+ }
41
+ return expression.variable.value;
55
42
  }
43
+ /**
44
+ * Get all variables used in an expression
45
+ */
56
46
  function getVariablesFromExpression(expression, variables) {
57
- if (F.isExpressionOperator(expression)) {
58
- for (const expr of expression.args) {
59
- getVariablesFromExpression(expr, variables);
47
+ if (F.isExpressionOperator(expression)) {
48
+ for (const expr of expression.args) {
49
+ getVariablesFromExpression(expr, variables);
50
+ }
51
+ }
52
+ else if (F.isTerm(expression) && F.isTermVariable(expression)) {
53
+ variables.add(expression.value);
60
54
  }
61
- } else if (F.isTerm(expression) && F.isTermVariable(expression)) {
62
- variables.add(expression.value);
63
- }
64
55
  }
65
56
  function queryIsGood(query) {
66
- if (query.variables.length === 1 && F.isWildcard(query.variables[0])) {
67
- if (query.solutionModifiers.group !== void 0) {
68
- throw new Error("GROUP BY not allowed with wildcard");
69
- }
70
- return;
71
- }
72
- const variables = query.variables;
73
- const hasCountAggregate = variables.flatMap((varVal) => F.isTerm(varVal) ? [] : getAggregatesOfExpression(varVal.expression)).some((agg) => agg.aggregation === "count" && !agg.expression.some((arg) => F.isWildcard(arg)));
74
- const groupBy = query.solutionModifiers.group;
75
- if (hasCountAggregate || groupBy) {
76
- for (const selectVar of variables) {
77
- if (F.isTerm(selectVar)) {
78
- if (!groupBy || !groupBy.groupings.map((groupvar) => getExpressionId(groupvar)).includes(getExpressionId(selectVar))) {
79
- throw new Error("Variable not allowed in projection");
57
+ // NoGroupByOnWildcardSelect
58
+ if (query.variables.length === 1 && F.isWildcard(query.variables[0])) {
59
+ if (query.solutionModifiers.group !== undefined) {
60
+ throw new Error('GROUP BY not allowed with wildcard');
80
61
  }
81
- } else if (getAggregatesOfExpression(selectVar.expression).length === 0) {
82
- const usedvars = /* @__PURE__ */ new Set();
83
- getVariablesFromExpression(selectVar.expression, usedvars);
84
- for (const usedvar of usedvars) {
85
- if (!groupBy || !groupBy.groupings.map((groupVar) => getExpressionId(groupVar)).includes(usedvar)) {
86
- throw new Error(`Use of ungrouped variable in projection of operation (?${usedvar})`);
87
- }
88
- }
89
- }
62
+ return;
90
63
  }
91
- }
92
- const subqueries = query.where.patterns.filter((pattern) => pattern.type === "query");
93
- if (subqueries.length > 0) {
94
- const selectBoundedVars = /* @__PURE__ */ new Set();
95
- for (const variable of variables) {
96
- if ("variable" in variable) {
97
- selectBoundedVars.add(variable.variable.value);
98
- }
64
+ // CannotProjectUngroupedVars - can be skipped if `SELECT *`
65
+ // Check for projection of ungrouped variable
66
+ // Check can be skipped in case of wildcard select.
67
+ const variables = query.variables;
68
+ const hasCountAggregate = variables.flatMap(varVal => F.isTerm(varVal) ? [] : getAggregatesOfExpression(varVal.expression)).some(agg => agg.aggregation === 'count' && !agg.expression.some(arg => F.isWildcard(arg)));
69
+ const groupBy = query.solutionModifiers.group;
70
+ if (hasCountAggregate || groupBy) {
71
+ // We have to check whether
72
+ // 1. Variables used in projection are usable given the group by clause
73
+ // 2. A selectCount will create an implicit group by clause.
74
+ for (const selectVar of variables) {
75
+ if (F.isTerm(selectVar)) {
76
+ if (!groupBy || !groupBy.groupings.map(groupvar => getExpressionId(groupvar))
77
+ .includes((getExpressionId(selectVar)))) {
78
+ throw new Error('Variable not allowed in projection');
79
+ }
80
+ }
81
+ else if (getAggregatesOfExpression(selectVar.expression).length === 0) {
82
+ // Current value binding does not use aggregates
83
+ const usedvars = new Set();
84
+ getVariablesFromExpression(selectVar.expression, usedvars);
85
+ for (const usedvar of usedvars) {
86
+ if (!groupBy || !groupBy.groupings.map(groupVar => getExpressionId(groupVar))
87
+ .includes(usedvar)) {
88
+ throw new Error(`Use of ungrouped variable in projection of operation (?${usedvar})`);
89
+ }
90
+ }
91
+ }
92
+ }
99
93
  }
100
- const vars = subqueries.flatMap((sub) => sub.variables).map((v) => F.isTerm(v) ? v.value : F.isWildcard(v) ? "*" : v.variable.value);
101
- const subqueryIds = new Set(vars);
102
- for (const selectedVarId of selectBoundedVars) {
103
- if (subqueryIds.has(selectedVarId)) {
104
- throw new Error(`Target id of 'AS' (?${selectedVarId}) already used in subquery`);
105
- }
94
+ // NOTE 12: Check if id of each AS-selected column is not yet bound by subquery
95
+ const subqueries = query.where.patterns.filter(pattern => pattern.type === 'query');
96
+ if (subqueries.length > 0) {
97
+ const selectBoundedVars = new Set();
98
+ for (const variable of variables) {
99
+ if ('variable' in variable) {
100
+ selectBoundedVars.add(variable.variable.value);
101
+ }
102
+ }
103
+ // Look at in scope variables
104
+ const vars = subqueries.flatMap(sub => sub.variables)
105
+ .map(v => F.isTerm(v) ? v.value : (F.isWildcard(v) ? '*' : v.variable.value));
106
+ const subqueryIds = new Set(vars);
107
+ for (const selectedVarId of selectBoundedVars) {
108
+ if (subqueryIds.has(selectedVarId)) {
109
+ throw new Error(`Target id of 'AS' (?${selectedVarId}) already used in subquery`);
110
+ }
111
+ }
106
112
  }
107
- }
108
113
  }
109
114
  function notUndefined(some) {
110
- return some !== void 0;
115
+ return some !== undefined;
111
116
  }
112
117
  function findPatternBoundedVars(iter, boundedVars) {
113
- transformer.traverseSubNodes(iter, {
114
- query: (op) => ({ next: [
115
- op.solutionModifiers.group
116
- ].filter(notUndefined) }),
117
- triple: (op) => ({ next: [op.subject, op.predicate, op.object] }),
118
- path: (op) => ({ next: op.items }),
119
- tripleCollection: (op) => ({ next: [op.identifier, ...op.triples] })
120
- }, {
121
- query: {
122
- select: (op) => ({ next: [
123
- ...op.variables.some((x) => F.isWildcard(x)) ? [op.where] : op.variables,
124
- op.solutionModifiers.group,
125
- op.values
126
- ].filter(notUndefined) }),
127
- describe: (op) => ({ next: [
128
- ...op.variables.some((x) => F.isWildcard(x)) ? [op.where] : op.variables,
129
- op.solutionModifiers.group,
130
- op.values
131
- ].filter(notUndefined) })
132
- },
133
- solutionModifier: {
134
- group: (op) => ({
135
- next: op.groupings.filter((g) => "variable" in g).map((x) => x.variable)
136
- }),
137
- having: (op) => ({ next: op.having }),
138
- order: (op) => ({ next: op.orderDefs.map((x) => x.expression) })
139
- },
140
- pattern: {
141
- values: (op) => {
142
- for (const v of Object.keys(op.values.at(0) ?? {})) {
143
- boundedVars.add(v);
144
- }
145
- return {};
146
- },
147
- bgp: (op) => ({ next: op.triples }),
148
- group: (op) => ({ next: op.patterns }),
149
- union: (op) => ({ next: op.patterns }),
150
- optional: (op) => ({ next: op.patterns }),
151
- service: (op) => ({ next: [op.name, ...op.patterns] }),
152
- bind: (op) => ({ next: [op.variable] }),
153
- graph: (op) => ({ next: [op.name, ...op.patterns] })
154
- },
155
- term: {
156
- variable: (op) => {
157
- boundedVars.add(op.value);
158
- return {};
159
- }
160
- }
161
- });
118
+ transformer.traverseSubNodes(iter, {
119
+ query: op => ({ next: [
120
+ op.solutionModifiers.group,
121
+ ].filter(notUndefined) }),
122
+ triple: op => ({ next: [op.subject, op.predicate, op.object] }),
123
+ path: op => ({ next: op.items }),
124
+ tripleCollection: op => ({ next: [op.identifier, ...op.triples] }),
125
+ }, {
126
+ query: {
127
+ select: op => ({ next: [
128
+ ...(op.variables.some(x => F.isWildcard(x)) ? [op.where] : op.variables),
129
+ op.solutionModifiers.group,
130
+ op.values,
131
+ ].filter(notUndefined) }),
132
+ describe: op => ({ next: [
133
+ ...(op.variables.some(x => F.isWildcard(x)) ? [op.where] : op.variables),
134
+ op.solutionModifiers.group,
135
+ op.values,
136
+ ].filter(notUndefined) }),
137
+ },
138
+ solutionModifier: {
139
+ group: op => ({ next: op.groupings.filter(g => 'variable' in g).map(x => x.variable),
140
+ }),
141
+ having: op => ({ next: op.having }),
142
+ order: op => ({ next: op.orderDefs.map(x => x.expression) }),
143
+ },
144
+ pattern: {
145
+ values: (op) => {
146
+ for (const v of Object.keys(op.values.at(0) ?? {})) {
147
+ boundedVars.add(v);
148
+ }
149
+ return {};
150
+ },
151
+ bgp: op => ({ next: op.triples }),
152
+ group: op => ({ next: op.patterns }),
153
+ union: op => ({ next: op.patterns }),
154
+ optional: op => ({ next: op.patterns }),
155
+ service: op => ({ next: [op.name, ...op.patterns] }),
156
+ bind: op => ({ next: [op.variable] }),
157
+ graph: op => ({ next: [op.name, ...op.patterns] }),
158
+ },
159
+ term: {
160
+ variable: (op) => {
161
+ boundedVars.add(op.value);
162
+ return {};
163
+ },
164
+ },
165
+ });
162
166
  }
167
+ /**
168
+ * NOTE 13 and https://www.w3.org/TR/sparql11-query/#variableScope
169
+ * > In BIND (expr AS v) requires that the variable v is not in-scope from the preceeding elements in the
170
+ * group graph pattern in which it is used.
171
+ */
163
172
  function checkNote13(patterns) {
164
- for (const [index, pattern] of patterns.entries()) {
165
- if (F.isPatternBind(pattern) && index > 0 && F.isPatternBgp(patterns[index - 1])) {
166
- const bgp = patterns[index - 1];
167
- const variables = [];
168
- transformer.visitNodeSpecific(bgp, {}, { term: { variable: { visitor: (var_) => {
169
- variables.push(var_);
170
- } } } });
171
- if (variables.some((var_) => var_.value === pattern.variable.value)) {
172
- throw new Error(`Variable used to bind is already bound (?${pattern.variable.value})`);
173
- }
173
+ for (const [index, pattern] of patterns.entries()) {
174
+ if (F.isPatternBind(pattern) && index > 0 && F.isPatternBgp(patterns[index - 1])) {
175
+ const bgp = patterns[index - 1];
176
+ // Find variables used.
177
+ const variables = [];
178
+ // TODO: this is slow! 2.6% self execution
179
+ transformer.visitNodeSpecific(bgp, {}, { term: { variable: { visitor: (var_) => {
180
+ variables.push(var_);
181
+ } } } });
182
+ if (variables.some(var_ => var_.value === pattern.variable.value)) {
183
+ throw new Error(`Variable used to bind is already bound (?${pattern.variable.value})`);
184
+ }
185
+ }
174
186
  }
175
- }
176
- const boundedVars = /* @__PURE__ */ new Set();
177
- for (const pattern of patterns) {
178
- if (F.isPatternBind(pattern)) {
179
- if (boundedVars.has(pattern.variable.value)) {
180
- throw new Error(`Variable used to bind is already bound (?${pattern.variable.value})`);
181
- }
182
- } else {
183
- findPatternBoundedVars(pattern, boundedVars);
187
+ const boundedVars = new Set();
188
+ for (const pattern of patterns) {
189
+ // Element can be bind, in that case, check note 13. If it is not, buildup set of bounded variables.
190
+ if (F.isPatternBind(pattern)) {
191
+ if (boundedVars.has(pattern.variable.value)) {
192
+ throw new Error(`Variable used to bind is already bound (?${pattern.variable.value})`);
193
+ }
194
+ }
195
+ else {
196
+ findPatternBoundedVars(pattern, boundedVars);
197
+ }
184
198
  }
185
- }
186
199
  }
200
+ /**
201
+ * https://www.w3.org/TR/sparql11-query/#grammarBNodes
202
+ * > two INSERT DATA operations within a single SPARQL Update request
203
+ */
187
204
  function updateNoReuseBlankNodeLabels(updateQuery) {
188
- const blankLabelsUsedInInsertData = /* @__PURE__ */ new Set();
189
- for (const update of updateQuery.updates) {
190
- if (!update.operation) {
191
- continue;
192
- }
193
- const operation = update.operation;
194
- if (operation.subType === "insertdata") {
195
- const blankNodesHere = /* @__PURE__ */ new Set();
196
- transformer.visitNodeSpecific(operation, {}, { term: { blankNode: { visitor: (blankNode) => {
197
- blankNodesHere.add(blankNode.label);
198
- if (blankLabelsUsedInInsertData.has(blankNode.label)) {
199
- throw new Error("Detected reuse blank node across different INSERT DATA clauses");
205
+ const blankLabelsUsedInInsertData = new Set();
206
+ for (const update of updateQuery.updates) {
207
+ if (!update.operation) {
208
+ continue;
209
+ }
210
+ const operation = update.operation;
211
+ if (operation.subType === 'insertdata') {
212
+ const blankNodesHere = new Set();
213
+ transformer.visitNodeSpecific(operation, {}, { term: { blankNode: { visitor: (blankNode) => {
214
+ blankNodesHere.add(blankNode.label);
215
+ if (blankLabelsUsedInInsertData.has(blankNode.label)) {
216
+ throw new Error('Detected reuse blank node across different INSERT DATA clauses');
217
+ }
218
+ } } } });
219
+ for (const blankNode of blankNodesHere) {
220
+ blankLabelsUsedInInsertData.add(blankNode);
221
+ }
200
222
  }
201
- } } } });
202
- for (const blankNode of blankNodesHere) {
203
- blankLabelsUsedInInsertData.add(blankNode);
204
- }
205
223
  }
206
- }
207
224
  }
208
- // Annotate the CommonJS export names for ESM import in node:
209
- 0 && (module.exports = {
210
- checkNote13,
211
- findPatternBoundedVars,
212
- queryIsGood,
213
- updateNoReuseBlankNodeLabels
214
- });
225
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../../../lib/validation/validators.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SelectiveTraversalContext } from '@traqula/core';\nimport { AstFactory } from '../astFactory.js';\nimport type {\n Wildcard,\n Expression,\n ExpressionAggregate,\n Pattern,\n QuerySelect,\n TermVariable,\n SolutionModifierGroupBind,\n Update,\n PatternBind,\n TripleCollection,\n Path,\n TripleNesting,\n Term,\n SparqlQuery,\n Sparql11Nodes,\n} from '../Sparql11types.js';\nimport { AstTransformer } from '../utils.js';\n\nconst F = new AstFactory();\nconst transformer = new AstTransformer();\n\n/**\n * Get all 'aggregate' rules from an expression\n */\nfunction getAggregatesOfExpression(expression: Expression): ExpressionAggregate[] {\n if (F.isExpressionAggregate(expression)) {\n return [ expression ];\n }\n if (F.isExpressionOperator(expression)) {\n const aggregates: ExpressionAggregate[] = [];\n for (const arg of expression.args) {\n aggregates.push(...getAggregatesOfExpression(arg));\n }\n return aggregates;\n }\n return [];\n}\n\n/**\n * Return the variable value id of an expression if bounded\n */\nfunction getExpressionId(expression: SolutionModifierGroupBind | Expression | TermVariable): string | undefined {\n // Check if grouping\n if (F.isTerm(expression) && F.isTermVariable(expression)) {\n return expression.value;\n }\n if (F.isExpression(expression)) {\n if (F.isExpressionAggregate(expression) && F.isTermVariable(expression.expression[0])) {\n return expression.expression[0].value;\n }\n return undefined;\n }\n return expression.variable.value;\n}\n\n/**\n * Get all variables used in an expression\n */\nfunction getVariablesFromExpression(expression: Expression, variables: Set<string>): void {\n if (F.isExpressionOperator(expression)) {\n for (const expr of expression.args) {\n getVariablesFromExpression(expr, variables);\n }\n } else if (F.isTerm(expression) && F.isTermVariable(expression)) {\n variables.add(expression.value);\n }\n}\n\nexport function queryIsGood(query: Pick<QuerySelect, 'variables' | 'solutionModifiers' | 'where'>): void {\n // NoGroupByOnWildcardSelect\n if (query.variables.length === 1 && F.isWildcard(query.variables[0])) {\n if (query.solutionModifiers.group !== undefined) {\n throw new Error('GROUP BY not allowed with wildcard');\n }\n return;\n }\n\n // CannotProjectUngroupedVars - can be skipped if `SELECT *`\n // Check for projection of ungrouped variable\n // Check can be skipped in case of wildcard select.\n const variables = <Exclude<typeof query.variables, [Wildcard]>> query.variables;\n const hasCountAggregate = variables.flatMap(\n varVal => F.isTerm(varVal) ? [] : getAggregatesOfExpression(varVal.expression),\n ).some(agg => agg.aggregation === 'count' && !agg.expression.some(arg => F.isWildcard(arg)));\n const groupBy = query.solutionModifiers.group;\n if (hasCountAggregate || groupBy) {\n // We have to check whether\n // 1. Variables used in projection are usable given the group by clause\n // 2. A selectCount will create an implicit group by clause.\n for (const selectVar of variables) {\n if (F.isTerm(selectVar)) {\n if (!groupBy || !groupBy.groupings.map(groupvar => getExpressionId(groupvar))\n .includes((getExpressionId(selectVar)))) {\n throw new Error('Variable not allowed in projection');\n }\n } else if (getAggregatesOfExpression(selectVar.expression).length === 0) {\n // Current value binding does not use aggregates\n const usedvars = new Set<string>();\n getVariablesFromExpression(selectVar.expression, usedvars);\n for (const usedvar of usedvars) {\n if (!groupBy || !groupBy.groupings.map(groupVar => getExpressionId(groupVar))\n .includes(usedvar)) {\n throw new Error(`Use of ungrouped variable in projection of operation (?${usedvar})`);\n }\n }\n }\n }\n }\n\n // NOTE 12: Check if id of each AS-selected column is not yet bound by subquery\n const subqueries = query.where.patterns.filter(pattern => pattern.type === 'query');\n if (subqueries.length > 0) {\n const selectBoundedVars = new Set<string>();\n for (const variable of variables) {\n if ('variable' in variable) {\n selectBoundedVars.add(variable.variable.value);\n }\n }\n\n // Look at in scope variables\n const vars = subqueries.flatMap<TermVariable | PatternBind | Wildcard>(sub => sub.variables)\n .map(v => F.isTerm(v) ? v.value : (F.isWildcard(v) ? '*' : v.variable.value));\n const subqueryIds = new Set(vars);\n for (const selectedVarId of selectBoundedVars) {\n if (subqueryIds.has(selectedVarId)) {\n throw new Error(`Target id of 'AS' (?${selectedVarId}) already used in subquery`);\n }\n }\n }\n}\n\nfunction notUndefined<T>(some: T): some is Exclude<T, undefined> {\n return some !== undefined;\n}\n\nexport function findPatternBoundedVars(\n iter: SparqlQuery | Pattern | TripleNesting | TripleCollection | Path | Term | Wildcard,\n boundedVars: Set<string>,\n): void {\n transformer.traverseSubNodes(iter, {\n query: op => ({ next: [\n op.solutionModifiers.group,\n ].filter(notUndefined) }),\n triple: op => ({ next: [ op.subject, op.predicate, op.object ]}),\n path: op => ({ next: op.items }),\n tripleCollection: op => ({ next: [ op.identifier, ...op.triples ]}),\n }, {\n query: {\n select: op => ({ next: [\n ...(op.variables.some(x => F.isWildcard(x)) ? [ op.where ] : op.variables),\n op.solutionModifiers.group,\n op.values,\n ].filter(notUndefined) } satisfies SelectiveTraversalContext<Sparql11Nodes>),\n describe: op => ({ next: [\n ...(op.variables.some(x => F.isWildcard(x)) ? [ op.where ] : op.variables),\n op.solutionModifiers.group,\n op.values,\n ].filter(notUndefined) }),\n },\n solutionModifier: {\n group: op => ({ next:\n op.groupings.filter(g => 'variable' in g).map(x => x.variable),\n }),\n having: op => ({ next: op.having }),\n order: op => ({ next: op.orderDefs.map(x => x.expression) }),\n },\n pattern: {\n values: (op) => {\n for (const v of Object.keys(op.values.at(0) ?? {})) {\n boundedVars.add(v);\n }\n return {};\n },\n bgp: op => ({ next: op.triples }),\n group: op => ({ next: op.patterns }),\n union: op => ({ next: op.patterns }),\n optional: op => ({ next: op.patterns }),\n service: op => ({ next: [ op.name, ...op.patterns ]}),\n bind: op => ({ next: [ op.variable ]}),\n graph: op => ({ next: [ op.name, ...op.patterns ]}),\n },\n term: {\n variable: (op) => {\n boundedVars.add(op.value);\n return {};\n },\n },\n });\n}\n\n/**\n * NOTE 13 and https://www.w3.org/TR/sparql11-query/#variableScope\n * > In BIND (expr AS v) requires that the variable v is not in-scope from the preceeding elements in the\n * group graph pattern in which it is used.\n */\nexport function checkNote13(patterns: Pattern[]): void {\n for (const [ index, pattern ] of patterns.entries()) {\n if (F.isPatternBind(pattern) && index > 0 && F.isPatternBgp(patterns[index - 1])) {\n const bgp = patterns[index - 1];\n // Find variables used.\n const variables: TermVariable[] = [];\n // TODO: this is slow! 2.6% self execution\n transformer.visitNodeSpecific(bgp, {}, { term: { variable: { visitor: (var_) => {\n variables.push(var_);\n } }}});\n if (variables.some(var_ => var_.value === pattern.variable.value)) {\n throw new Error(`Variable used to bind is already bound (?${pattern.variable.value})`);\n }\n }\n }\n\n const boundedVars = new Set<string>();\n for (const pattern of patterns) {\n // Element can be bind, in that case, check note 13. If it is not, buildup set of bounded variables.\n if (F.isPatternBind(pattern)) {\n if (boundedVars.has(pattern.variable.value)) {\n throw new Error(`Variable used to bind is already bound (?${pattern.variable.value})`);\n }\n } else {\n findPatternBoundedVars(pattern, boundedVars);\n }\n }\n}\n\n/**\n * https://www.w3.org/TR/sparql11-query/#grammarBNodes\n * > two INSERT DATA operations within a single SPARQL Update request\n */\nexport function updateNoReuseBlankNodeLabels(updateQuery: Update): void {\n const blankLabelsUsedInInsertData = new Set<string>();\n for (const update of updateQuery.updates) {\n if (!update.operation) {\n continue;\n }\n const operation = update.operation;\n if (operation.subType === 'insertdata') {\n const blankNodesHere = new Set<string>();\n transformer.visitNodeSpecific(operation, {}, { term: { blankNode: { visitor: (blankNode) => {\n blankNodesHere.add(blankNode.label);\n if (blankLabelsUsedInInsertData.has(blankNode.label)) {\n throw new Error('Detected reuse blank node across different INSERT DATA clauses');\n }\n } }}});\n for (const blankNode of blankNodesHere) {\n blankLabelsUsedInInsertData.add(blankNode);\n }\n }\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ { "type": "commonjs" }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@traqula/rules-sparql-1-1",
3
3
  "type": "module",
4
- "version": "0.0.22",
4
+ "version": "0.0.24",
5
5
  "description": "TRAQULA Lexer and Grammar Rules for sparql 1.1",
6
6
  "lsd:module": true,
7
7
  "license": "MIT",
@@ -27,21 +27,22 @@
27
27
  },
28
28
  "main": "dist/esm/lib/index.js",
29
29
  "files": [
30
- "dist/**/*.d.ts",
31
- "dist/**/*.js",
32
- "dist/**/*.js.map"
30
+ "dist/*/lib/**/*.d.ts",
31
+ "dist/*/lib/**/*.js",
32
+ "dist/*/lib/**/*.js.map",
33
+ "dist/cjs/package.json"
33
34
  ],
34
35
  "engines": {
35
36
  "node": "^20.19.0 || >=22.12.0"
36
37
  },
37
38
  "scripts": {
38
- "build": "yarn build:ts && yarn build:transpile",
39
+ "build": "yarn build:ts && yarn build:cjs",
39
40
  "build:ts": "node \"../../node_modules/typescript/bin/tsc\" -b",
40
- "build:transpile": "esbuild \"dist/esm/**/*.js\" --outdir=dist/cjs/lib --platform=node --format=cjs"
41
+ "build:cjs": "node \"../../node_modules/typescript/bin/tsc\" -b tsconfig.cjs.json"
41
42
  },
42
43
  "dependencies": {
43
- "@traqula/chevrotain": "^0.0.22",
44
- "@traqula/core": "^0.0.22"
44
+ "@traqula/chevrotain": "^0.0.24",
45
+ "@traqula/core": "^0.0.24"
45
46
  },
46
- "gitHead": "e0cf04a50b3558229ebcc5992cf9562b14f9a077"
47
+ "gitHead": "9865fe1fe302819d46e19c6f3250ceef778f434f"
47
48
  }